From 2b271c7bc3d3ab712f8683d2591523b6f27f8d0b Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Sat, 24 Oct 2009 19:48:22 +0000 Subject: [PATCH] MDL-20632 latest zend framework lib import --- lib/thirdpartylibs.xml | 2 +- lib/zend/Zend/Acl/Assert/Interface.php | 64 + lib/zend/Zend/Acl/Exception.php | 36 + lib/zend/Zend/Acl/Resource.php | 65 + lib/zend/Zend/Acl/Resource/Interface.php | 37 + lib/zend/Zend/Acl/Role.php | 65 + lib/zend/Zend/Acl/Role/Interface.php | 37 + lib/zend/Zend/Acl/Role/Registry.php | 271 + lib/zend/Zend/Acl/Role/Registry/Exception.php | 36 + lib/zend/Zend/Amf/Adobe/Auth.php | 133 + lib/zend/Zend/Amf/Adobe/DbInspector.php | 103 + lib/zend/Zend/Amf/Adobe/Introspector.php | 309 + lib/zend/Zend/Amf/Auth/Abstract.php | 42 + lib/zend/Zend/Amf/Constants.php | 12 +- lib/zend/Zend/Amf/Exception.php | 5 +- lib/zend/Zend/Amf/Parse/Amf0/Deserializer.php | 40 +- lib/zend/Zend/Amf/Parse/Amf0/Serializer.php | 155 +- lib/zend/Zend/Amf/Parse/Amf3/Deserializer.php | 831 +-- lib/zend/Zend/Amf/Parse/Amf3/Serializer.php | 247 +- lib/zend/Zend/Amf/Parse/Deserializer.php | 5 +- lib/zend/Zend/Amf/Parse/InputStream.php | 5 +- lib/zend/Zend/Amf/Parse/OutputStream.php | 5 +- .../Zend/Amf/Parse/Resource/MysqlResult.php | 70 + .../Zend/Amf/Parse/Resource/MysqliResult.php | 128 + lib/zend/Zend/Amf/Parse/Resource/Stream.php | 42 + lib/zend/Zend/Amf/Parse/Serializer.php | 5 +- lib/zend/Zend/Amf/Parse/TypeLoader.php | 112 +- lib/zend/Zend/Amf/Request.php | 10 +- lib/zend/Zend/Amf/Request/Http.php | 5 +- lib/zend/Zend/Amf/Response.php | 5 +- lib/zend/Zend/Amf/Response/Http.php | 7 +- lib/zend/Zend/Amf/Server.php | 420 +- lib/zend/Zend/Amf/Server/Exception.php | 20 +- lib/zend/Zend/Amf/Util/BinaryStream.php | 5 +- lib/zend/Zend/Amf/Value/ByteArray.php | 5 +- lib/zend/Zend/Amf/Value/MessageBody.php | 5 +- lib/zend/Zend/Amf/Value/MessageHeader.php | 5 +- .../Amf/Value/Messaging/AbstractMessage.php | 5 +- .../Value/Messaging/AcknowledgeMessage.php | 7 +- .../Amf/Value/Messaging/ArrayCollection.php | 35 + .../Zend/Amf/Value/Messaging/AsyncMessage.php | 5 +- .../Amf/Value/Messaging/CommandMessage.php | 10 +- .../Zend/Amf/Value/Messaging/ErrorMessage.php | 5 +- .../Amf/Value/Messaging/RemotingMessage.php | 5 +- lib/zend/Zend/Amf/Value/TraitsInfo.php | 5 +- .../Zend/Application/Bootstrap/Bootstrap.php | 79 + .../Bootstrap/BootstrapAbstract.php | 764 +++ .../Application/Bootstrap/Bootstrapper.php | 94 + .../Zend/Application/Bootstrap/Exception.php | 38 + .../Bootstrap/ResourceBootstrapper.php | 95 + lib/zend/Zend/Application/Exception.php | 38 + .../Zend/Application/Module/Autoloader.php | 89 + .../Zend/Application/Module/Bootstrap.php | 143 + lib/zend/Zend/Application/Resource/Db.php | 156 + .../Zend/Application/Resource/Exception.php | 35 + .../Application/Resource/Frontcontroller.php | 134 + lib/zend/Zend/Application/Resource/Layout.php | 64 + lib/zend/Zend/Application/Resource/Locale.php | 77 + .../Zend/Application/Resource/Modules.php | 132 + .../Zend/Application/Resource/Navigation.php | 118 + .../Zend/Application/Resource/Resource.php | 80 + .../Application/Resource/ResourceAbstract.php | 159 + lib/zend/Zend/Application/Resource/Router.php | 78 + .../Zend/Application/Resource/Session.php | 112 + .../Zend/Application/Resource/Translate.php | 83 + lib/zend/Zend/Application/Resource/View.php | 67 + lib/zend/Zend/Auth/Adapter/DbTable.php | 484 ++ lib/zend/Zend/Auth/Adapter/Digest.php | 230 + lib/zend/Zend/Auth/Adapter/Exception.php | 38 + lib/zend/Zend/Auth/Adapter/Http.php | 847 +++ .../Auth/Adapter/Http/Resolver/Exception.php | 40 + .../Zend/Auth/Adapter/Http/Resolver/File.php | 167 + .../Auth/Adapter/Http/Resolver/Interface.php | 47 + lib/zend/Zend/Auth/Adapter/InfoCard.php | 261 + lib/zend/Zend/Auth/Adapter/Interface.php | 46 + lib/zend/Zend/Auth/Adapter/Ldap.php | 512 ++ lib/zend/Zend/Auth/Adapter/OpenId.php | 284 + lib/zend/Zend/Auth/Exception.php | 36 + lib/zend/Zend/Auth/Result.php | 148 + lib/zend/Zend/Auth/Storage/Exception.php | 38 + lib/zend/Zend/Auth/Storage/Interface.php | 67 + lib/zend/Zend/Auth/Storage/NonPersistent.php | 96 + lib/zend/Zend/Auth/Storage/Session.php | 150 + lib/zend/Zend/Cache/Backend.php | 272 + lib/zend/Zend/Cache/Backend/Apc.php | 355 + .../Zend/Cache/Backend/ExtendedInterface.php | 126 + lib/zend/Zend/Cache/Backend/File.php | 999 +++ lib/zend/Zend/Cache/Backend/Interface.php | 99 + lib/zend/Zend/Cache/Backend/Memcached.php | 502 ++ lib/zend/Zend/Cache/Backend/Sqlite.php | 679 ++ lib/zend/Zend/Cache/Backend/Test.php | 270 + lib/zend/Zend/Cache/Backend/TwoLevels.php | 506 ++ lib/zend/Zend/Cache/Backend/Xcache.php | 216 + lib/zend/Zend/Cache/Backend/ZendPlatform.php | 317 + lib/zend/Zend/Cache/Backend/ZendServer.php | 207 + .../Zend/Cache/Backend/ZendServer/Disk.php | 100 + .../Zend/Cache/Backend/ZendServer/ShMem.php | 100 + lib/zend/Zend/Cache/Core.php | 683 ++ lib/zend/Zend/Cache/Exception.php | 32 + lib/zend/Zend/Cache/Frontend/Class.php | 243 + lib/zend/Zend/Cache/Frontend/File.php | 209 + lib/zend/Zend/Cache/Frontend/Function.php | 131 + lib/zend/Zend/Cache/Frontend/Output.php | 106 + lib/zend/Zend/Cache/Frontend/Page.php | 402 ++ lib/zend/Zend/Captcha/Adapter.php | 76 + lib/zend/Zend/Captcha/Base.php | 176 + lib/zend/Zend/Captcha/Dumb.php | 52 + lib/zend/Zend/Captcha/Exception.php | 34 + lib/zend/Zend/Captcha/Figlet.php | 85 + lib/zend/Zend/Captcha/Image.php | 600 ++ lib/zend/Zend/Captcha/ReCaptcha.php | 267 + lib/zend/Zend/Captcha/Word.php | 373 ++ lib/zend/Zend/CodeGenerator/Abstract.php | 147 + lib/zend/Zend/CodeGenerator/Exception.php | 35 + lib/zend/Zend/CodeGenerator/Php/Abstract.php | 97 + lib/zend/Zend/CodeGenerator/Php/Body.php | 73 + lib/zend/Zend/CodeGenerator/Php/Class.php | 513 ++ lib/zend/Zend/CodeGenerator/Php/Docblock.php | 220 + .../Zend/CodeGenerator/Php/Docblock/Tag.php | 184 + .../Php/Docblock/Tag/License.php | 98 + .../CodeGenerator/Php/Docblock/Tag/Param.php | 128 + .../CodeGenerator/Php/Docblock/Tag/Return.php | 98 + lib/zend/Zend/CodeGenerator/Php/Exception.php | 37 + lib/zend/Zend/CodeGenerator/Php/File.php | 465 ++ .../CodeGenerator/Php/Member/Abstract.php | 222 + .../CodeGenerator/Php/Member/Container.php | 55 + lib/zend/Zend/CodeGenerator/Php/Method.php | 234 + lib/zend/Zend/CodeGenerator/Php/Parameter.php | 250 + .../Php/Parameter/DefaultValue.php | 60 + lib/zend/Zend/CodeGenerator/Php/Property.php | 179 + .../Php/Property/DefaultValue.php | 323 + lib/zend/Zend/Config/Exception.php | 33 + lib/zend/Zend/Config/Ini.php | 293 + lib/zend/Zend/Config/Writer.php | 101 + lib/zend/Zend/Config/Writer/Array.php | 132 + lib/zend/Zend/Config/Writer/Ini.php | 212 + lib/zend/Zend/Config/Writer/Xml.php | 204 + lib/zend/Zend/Config/Xml.php | 315 + lib/zend/Zend/Console/Getopt.php | 957 +++ lib/zend/Zend/Console/Getopt/Exception.php | 66 + lib/zend/Zend/Controller/Action.php | 688 ++ lib/zend/Zend/Controller/Action/Exception.php | 38 + .../Controller/Action/Helper/Abstract.php | 158 + .../Controller/Action/Helper/ActionStack.php | 138 + .../Controller/Action/Helper/AjaxContext.php | 77 + .../Action/Helper/AutoComplete/Abstract.php | 149 + .../Action/Helper/AutoCompleteDojo.php | 87 + .../Helper/AutoCompleteScriptaculous.php | 82 + .../Action/Helper/ContextSwitch.php | 1394 ++++ .../Action/Helper/FlashMessenger.php | 266 + .../Zend/Controller/Action/Helper/Json.php | 130 + .../Controller/Action/Helper/Redirector.php | 531 ++ .../Zend/Controller/Action/Helper/Url.php | 117 + .../Controller/Action/Helper/ViewRenderer.php | 995 +++ .../Zend/Controller/Action/HelperBroker.php | 381 ++ .../Action/HelperBroker/PriorityStack.php | 280 + lib/zend/Zend/Controller/Action/Interface.php | 69 + .../Zend/Controller/Dispatcher/Abstract.php | 440 ++ .../Zend/Controller/Dispatcher/Exception.php | 37 + .../Zend/Controller/Dispatcher/Interface.php | 206 + .../Zend/Controller/Dispatcher/Standard.php | 492 ++ lib/zend/Zend/Controller/Exception.php | 35 + lib/zend/Zend/Controller/Front.php | 986 +++ lib/zend/Zend/Controller/Plugin/Abstract.php | 151 + .../Zend/Controller/Plugin/ActionStack.php | 280 + lib/zend/Zend/Controller/Plugin/Broker.php | 363 + .../Zend/Controller/Plugin/ErrorHandler.php | 257 + .../Zend/Controller/Plugin/PutHandler.php | 60 + lib/zend/Zend/Controller/Request/Abstract.php | 356 + .../Zend/Controller/Request/Apache404.php | 82 + .../Zend/Controller/Request/Exception.php | 37 + lib/zend/Zend/Controller/Request/Http.php | 1043 +++ .../Zend/Controller/Request/HttpTestCase.php | 276 + lib/zend/Zend/Controller/Request/Simple.php | 55 + .../Zend/Controller/Response/Abstract.php | 755 +++ lib/zend/Zend/Controller/Response/Cli.php | 68 + .../Zend/Controller/Response/Exception.php | 36 + lib/zend/Zend/Controller/Response/Http.php | 38 + .../Zend/Controller/Response/HttpTestCase.php | 130 + lib/zend/Zend/Controller/Router/Abstract.php | 170 + lib/zend/Zend/Controller/Router/Exception.php | 36 + lib/zend/Zend/Controller/Router/Interface.php | 124 + lib/zend/Zend/Controller/Router/Rewrite.php | 484 ++ lib/zend/Zend/Controller/Router/Route.php | 557 ++ .../Zend/Controller/Router/Route/Abstract.php | 117 + .../Zend/Controller/Router/Route/Chain.php | 169 + .../Zend/Controller/Router/Route/Hostname.php | 342 + .../Controller/Router/Route/Interface.php | 37 + .../Zend/Controller/Router/Route/Module.php | 288 + .../Zend/Controller/Router/Route/Regex.php | 262 + .../Zend/Controller/Router/Route/Static.php | 125 + lib/zend/Zend/Crypt/DiffieHellman.php | 380 ++ .../Zend/Crypt/DiffieHellman/Exception.php | 36 + lib/zend/Zend/Crypt/Exception.php | 35 + lib/zend/Zend/Crypt/Hmac.php | 181 + lib/zend/Zend/Crypt/Hmac/Exception.php | 36 + lib/zend/Zend/Crypt/Math.php | 102 + lib/zend/Zend/Crypt/Math/BigInteger.php | 117 + .../Zend/Crypt/Math/BigInteger/Bcmath.php | 203 + .../Zend/Crypt/Math/BigInteger/Exception.php | 36 + lib/zend/Zend/Crypt/Math/BigInteger/Gmp.php | 196 + .../Zend/Crypt/Math/BigInteger/Interface.php | 51 + lib/zend/Zend/Crypt/Math/Exception.php | 36 + lib/zend/Zend/Crypt/Rsa.php | 298 + lib/zend/Zend/Crypt/Rsa/Key.php | 95 + lib/zend/Zend/Crypt/Rsa/Key/Private.php | 75 + lib/zend/Zend/Crypt/Rsa/Key/Public.php | 74 + lib/zend/Zend/Currency/Exception.php | 37 + lib/zend/Zend/Date/Cities.php | 4 +- lib/zend/Zend/Date/DateObject.php | 35 +- lib/zend/Zend/Date/Exception.php | 4 +- lib/zend/Zend/Db/Adapter/Abstract.php | 1252 ++++ lib/zend/Zend/Db/Adapter/Db2.php | 832 +++ lib/zend/Zend/Db/Adapter/Db2/Exception.php | 45 + lib/zend/Zend/Db/Adapter/Exception.php | 58 + lib/zend/Zend/Db/Adapter/Mysqli.php | 549 ++ lib/zend/Zend/Db/Adapter/Mysqli/Exception.php | 40 + lib/zend/Zend/Db/Adapter/Oracle.php | 682 ++ lib/zend/Zend/Db/Adapter/Oracle/Exception.php | 60 + lib/zend/Zend/Db/Adapter/Pdo/Abstract.php | 401 ++ lib/zend/Zend/Db/Adapter/Pdo/Ibm.php | 360 + lib/zend/Zend/Db/Adapter/Pdo/Ibm/Db2.php | 228 + lib/zend/Zend/Db/Adapter/Pdo/Ibm/Ids.php | 301 + lib/zend/Zend/Db/Adapter/Pdo/Mssql.php | 423 ++ lib/zend/Zend/Db/Adapter/Pdo/Mysql.php | 257 + lib/zend/Zend/Db/Adapter/Pdo/Oci.php | 378 ++ lib/zend/Zend/Db/Adapter/Pdo/Pgsql.php | 326 + lib/zend/Zend/Db/Adapter/Pdo/Sqlite.php | 297 + lib/zend/Zend/Db/Adapter/Sqlsrv.php | 661 ++ lib/zend/Zend/Db/Adapter/Sqlsrv/Exception.php | 63 + lib/zend/Zend/Db/Exception.php | 35 + lib/zend/Zend/Db/Expr.php | 77 + lib/zend/Zend/Db/Profiler.php | 460 ++ lib/zend/Zend/Db/Profiler/Exception.php | 40 + lib/zend/Zend/Db/Profiler/Firebug.php | 161 + lib/zend/Zend/Db/Profiler/Query.php | 199 + lib/zend/Zend/Db/Select.php | 1340 ++++ lib/zend/Zend/Db/Select/Exception.php | 39 + lib/zend/Zend/Db/Statement.php | 485 ++ lib/zend/Zend/Db/Statement/Db2.php | 360 + lib/zend/Zend/Db/Statement/Db2/Exception.php | 58 + lib/zend/Zend/Db/Statement/Exception.php | 73 + lib/zend/Zend/Db/Statement/Interface.php | 203 + lib/zend/Zend/Db/Statement/Mysqli.php | 362 + .../Zend/Db/Statement/Mysqli/Exception.php | 38 + lib/zend/Zend/Db/Statement/Oracle.php | 584 ++ .../Zend/Db/Statement/Oracle/Exception.php | 59 + lib/zend/Zend/Db/Statement/Pdo.php | 439 ++ lib/zend/Zend/Db/Statement/Pdo/Ibm.php | 94 + lib/zend/Zend/Db/Statement/Pdo/Oci.php | 69 + lib/zend/Zend/Db/Statement/Sqlsrv.php | 410 ++ .../Zend/Db/Statement/Sqlsrv/Exception.php | 59 + lib/zend/Zend/Db/Table.php | 84 + lib/zend/Zend/Db/Table/Abstract.php | 1514 +++++ lib/zend/Zend/Db/Table/Definition.php | 131 + lib/zend/Zend/Db/Table/Exception.php | 38 + lib/zend/Zend/Db/Table/Row.php | 42 + lib/zend/Zend/Db/Table/Row/Abstract.php | 1197 ++++ lib/zend/Zend/Db/Table/Row/Exception.php | 38 + lib/zend/Zend/Db/Table/Rowset.php | 43 + lib/zend/Zend/Db/Table/Rowset/Abstract.php | 419 ++ lib/zend/Zend/Db/Table/Rowset/Exception.php | 37 + lib/zend/Zend/Db/Table/Select.php | 224 + lib/zend/Zend/Db/Table/Select/Exception.php | 39 + lib/zend/Zend/Dojo/BuildLayer.php | 536 ++ lib/zend/Zend/Dojo/Data.php | 563 ++ lib/zend/Zend/Dojo/Exception.php | 35 + lib/zend/Zend/Dojo/Form.php | 89 + .../Form/Decorator/AccordionContainer.php | 43 + .../Dojo/Form/Decorator/AccordionPane.php | 43 + .../Dojo/Form/Decorator/BorderContainer.php | 43 + .../Zend/Dojo/Form/Decorator/ContentPane.php | 43 + .../Dojo/Form/Decorator/DijitContainer.php | 200 + .../Zend/Dojo/Form/Decorator/DijitElement.php | 195 + .../Zend/Dojo/Form/Decorator/DijitForm.php | 61 + .../Dojo/Form/Decorator/SplitContainer.php | 43 + .../Dojo/Form/Decorator/StackContainer.php | 44 + .../Zend/Dojo/Form/Decorator/TabContainer.php | 43 + lib/zend/Zend/Dojo/Form/DisplayGroup.php | 68 + lib/zend/Zend/Dojo/Form/Element/Button.php | 121 + lib/zend/Zend/Dojo/Form/Element/CheckBox.php | 205 + lib/zend/Zend/Dojo/Form/Element/ComboBox.php | 186 + .../Dojo/Form/Element/CurrencyTextBox.php | 120 + .../Zend/Dojo/Form/Element/DateTextBox.php | 214 + lib/zend/Zend/Dojo/Form/Element/Dijit.php | 189 + .../Zend/Dojo/Form/Element/DijitMulti.php | 304 + lib/zend/Zend/Dojo/Form/Element/Editor.php | 599 ++ .../Dojo/Form/Element/FilteringSelect.php | 48 + .../Dojo/Form/Element/HorizontalSlider.php | 208 + .../Zend/Dojo/Form/Element/NumberSpinner.php | 245 + .../Zend/Dojo/Form/Element/NumberTextBox.php | 173 + .../Dojo/Form/Element/PasswordTextBox.php | 42 + .../Zend/Dojo/Form/Element/RadioButton.php | 42 + .../Zend/Dojo/Form/Element/SimpleTextarea.php | 43 + lib/zend/Zend/Dojo/Form/Element/Slider.php | 199 + .../Zend/Dojo/Form/Element/SubmitButton.php | 42 + lib/zend/Zend/Dojo/Form/Element/TextBox.php | 164 + lib/zend/Zend/Dojo/Form/Element/Textarea.php | 42 + .../Zend/Dojo/Form/Element/TimeTextBox.php | 152 + .../Dojo/Form/Element/ValidationTextBox.php | 218 + .../Zend/Dojo/Form/Element/VerticalSlider.php | 208 + lib/zend/Zend/Dojo/Form/SubForm.php | 94 + lib/zend/Zend/Dojo/View/Exception.php | 37 + .../Dojo/View/Helper/AccordionContainer.php | 66 + .../Zend/Dojo/View/Helper/AccordionPane.php | 66 + .../Zend/Dojo/View/Helper/BorderContainer.php | 79 + lib/zend/Zend/Dojo/View/Helper/Button.php | 68 + lib/zend/Zend/Dojo/View/Helper/CheckBox.php | 100 + lib/zend/Zend/Dojo/View/Helper/ComboBox.php | 158 + .../Zend/Dojo/View/Helper/ContentPane.php | 66 + .../Zend/Dojo/View/Helper/CurrencyTextBox.php | 68 + .../Zend/Dojo/View/Helper/CustomDijit.php | 107 + .../Zend/Dojo/View/Helper/DateTextBox.php | 68 + lib/zend/Zend/Dojo/View/Helper/Dijit.php | 311 + .../Zend/Dojo/View/Helper/DijitContainer.php | 92 + lib/zend/Zend/Dojo/View/Helper/Dojo.php | 176 + .../Zend/Dojo/View/Helper/Dojo/Container.php | 1084 +++ lib/zend/Zend/Dojo/View/Helper/Editor.php | 132 + .../Zend/Dojo/View/Helper/FilteringSelect.php | 63 + lib/zend/Zend/Dojo/View/Helper/Form.php | 96 + .../Dojo/View/Helper/HorizontalSlider.php | 62 + .../Zend/Dojo/View/Helper/NumberSpinner.php | 90 + .../Zend/Dojo/View/Helper/NumberTextBox.php | 68 + .../Zend/Dojo/View/Helper/PasswordTextBox.php | 56 + .../Zend/Dojo/View/Helper/RadioButton.php | 89 + .../Zend/Dojo/View/Helper/SimpleTextarea.php | 78 + lib/zend/Zend/Dojo/View/Helper/Slider.php | 251 + .../Zend/Dojo/View/Helper/SplitContainer.php | 66 + .../Zend/Dojo/View/Helper/StackContainer.php | 66 + .../Zend/Dojo/View/Helper/SubmitButton.php | 67 + .../Zend/Dojo/View/Helper/TabContainer.php | 66 + lib/zend/Zend/Dojo/View/Helper/TextBox.php | 68 + lib/zend/Zend/Dojo/View/Helper/Textarea.php | 80 + .../Zend/Dojo/View/Helper/TimeTextBox.php | 68 + .../Dojo/View/Helper/ValidationTextBox.php | 68 + .../Zend/Dojo/View/Helper/VerticalSlider.php | 62 + lib/zend/Zend/Dom/Exception.php | 35 + lib/zend/Zend/Dom/Query.php | 223 + lib/zend/Zend/Dom/Query/Css2Xpath.php | 141 + lib/zend/Zend/Dom/Query/Result.php | 183 + lib/zend/Zend/Feed/Abstract.php | 259 + lib/zend/Zend/Feed/Atom.php | 390 ++ lib/zend/Zend/Feed/Builder.php | 398 ++ lib/zend/Zend/Feed/Builder/Entry.php | 297 + lib/zend/Zend/Feed/Builder/Exception.php | 40 + lib/zend/Zend/Feed/Builder/Header.php | 423 ++ lib/zend/Zend/Feed/Builder/Header/Itunes.php | 288 + lib/zend/Zend/Feed/Builder/Interface.php | 52 + lib/zend/Zend/Feed/Element.php | 408 ++ lib/zend/Zend/Feed/Entry/Abstract.php | 124 + lib/zend/Zend/Feed/Entry/Atom.php | 280 + lib/zend/Zend/Feed/Entry/Rss.php | 122 + lib/zend/Zend/Feed/Exception.php | 42 + lib/zend/Zend/Feed/Reader.php | 692 ++ lib/zend/Zend/Feed/Reader/Entry/Atom.php | 357 + lib/zend/Zend/Feed/Reader/Entry/Rss.php | 614 ++ lib/zend/Zend/Feed/Reader/EntryAbstract.php | 242 + lib/zend/Zend/Feed/Reader/EntryInterface.php | 136 + .../Zend/Feed/Reader/Extension/Atom/Entry.php | 506 ++ .../Zend/Feed/Reader/Extension/Atom/Feed.php | 441 ++ .../Feed/Reader/Extension/Content/Entry.php | 64 + .../Extension/CreativeCommons/Entry.php | 97 + .../Reader/Extension/CreativeCommons/Feed.php | 89 + .../Reader/Extension/DublinCore/Entry.php | 232 + .../Feed/Reader/Extension/DublinCore/Feed.php | 265 + .../Feed/Reader/Extension/EntryAbstract.php | 197 + .../Feed/Reader/Extension/FeedAbstract.php | 166 + .../Feed/Reader/Extension/Podcast/Entry.php | 202 + .../Feed/Reader/Extension/Podcast/Feed.php | 293 + .../Feed/Reader/Extension/Slash/Entry.php | 144 + .../Reader/Extension/Syndication/Feed.php | 168 + .../Feed/Reader/Extension/Thread/Entry.php | 91 + .../Reader/Extension/WellFormedWeb/Entry.php | 73 + lib/zend/Zend/Feed/Reader/Feed/Atom.php | 329 + lib/zend/Zend/Feed/Reader/Feed/Rss.php | 533 ++ lib/zend/Zend/Feed/Reader/FeedAbstract.php | 304 + lib/zend/Zend/Feed/Reader/FeedInterface.php | 115 + lib/zend/Zend/Feed/Rss.php | 526 ++ lib/zend/Zend/File/Transfer.php | 61 + .../Zend/File/Transfer/Adapter/Abstract.php | 1503 +++++ lib/zend/Zend/File/Transfer/Adapter/Http.php | 453 ++ lib/zend/Zend/File/Transfer/Exception.php | 55 + lib/zend/Zend/Filter/Alnum.php | 136 + lib/zend/Zend/Filter/Alpha.php | 136 + lib/zend/Zend/Filter/BaseName.php | 50 + lib/zend/Zend/Filter/Callback.php | 133 + lib/zend/Zend/Filter/Decrypt.php | 49 + lib/zend/Zend/Filter/Digits.php | 82 + lib/zend/Zend/Filter/Dir.php | 50 + lib/zend/Zend/Filter/Encrypt.php | 134 + lib/zend/Zend/Filter/Encrypt/Interface.php | 47 + lib/zend/Zend/Filter/Encrypt/Mcrypt.php | 282 + lib/zend/Zend/Filter/Encrypt/Openssl.php | 343 + lib/zend/Zend/Filter/Exception.php | 37 + lib/zend/Zend/Filter/File/Decrypt.php | 106 + lib/zend/Zend/Filter/File/Encrypt.php | 106 + lib/zend/Zend/Filter/File/LowerCase.php | 84 + lib/zend/Zend/Filter/File/Rename.php | 305 + lib/zend/Zend/Filter/File/UpperCase.php | 84 + lib/zend/Zend/Filter/HtmlEntities.php | 172 + lib/zend/Zend/Filter/Inflector.php | 506 ++ lib/zend/Zend/Filter/Input.php | 1028 +++ lib/zend/Zend/Filter/Int.php | 50 + lib/zend/Zend/Filter/Interface.php | 40 + .../Zend/Filter/LocalizedToNormalized.php | 108 + .../Zend/Filter/NormalizedToLocalized.php | 107 + lib/zend/Zend/Filter/PregReplace.php | 156 + lib/zend/Zend/Filter/RealPath.php | 134 + lib/zend/Zend/Filter/StringToLower.php | 76 + lib/zend/Zend/Filter/StringToUpper.php | 76 + lib/zend/Zend/Filter/StringTrim.php | 114 + lib/zend/Zend/Filter/StripNewlines.php | 48 + lib/zend/Zend/Filter/StripTags.php | 315 + lib/zend/Zend/Filter/Word/CamelCaseToDash.php | 44 + .../Zend/Filter/Word/CamelCaseToSeparator.php | 49 + .../Filter/Word/CamelCaseToUnderscore.php | 44 + lib/zend/Zend/Filter/Word/DashToCamelCase.php | 44 + lib/zend/Zend/Filter/Word/DashToSeparator.php | 42 + .../Zend/Filter/Word/DashToUnderscore.php | 45 + .../Zend/Filter/Word/Separator/Abstract.php | 76 + .../Zend/Filter/Word/SeparatorToCamelCase.php | 52 + lib/zend/Zend/Filter/Word/SeparatorToDash.php | 46 + .../Zend/Filter/Word/SeparatorToSeparator.php | 129 + .../Filter/Word/UnderscoreToCamelCase.php | 44 + .../Zend/Filter/Word/UnderscoreToDash.php | 45 + .../Filter/Word/UnderscoreToSeparator.php | 45 + lib/zend/Zend/Form/Decorator/Abstract.php | 254 + lib/zend/Zend/Form/Decorator/Callback.php | 128 + lib/zend/Zend/Form/Decorator/Captcha.php | 72 + lib/zend/Zend/Form/Decorator/Captcha/Word.php | 78 + lib/zend/Zend/Form/Decorator/Description.php | 199 + lib/zend/Zend/Form/Decorator/DtDdWrapper.php | 63 + lib/zend/Zend/Form/Decorator/Errors.php | 69 + lib/zend/Zend/Form/Decorator/Exception.php | 37 + lib/zend/Zend/Form/Decorator/Fieldset.php | 155 + lib/zend/Zend/Form/Decorator/File.php | 142 + lib/zend/Zend/Form/Decorator/Form.php | 134 + lib/zend/Zend/Form/Decorator/FormElements.php | 126 + lib/zend/Zend/Form/Decorator/FormErrors.php | 397 ++ lib/zend/Zend/Form/Decorator/HtmlTag.php | 219 + lib/zend/Zend/Form/Decorator/Image.php | 154 + lib/zend/Zend/Form/Decorator/Interface.php | 123 + lib/zend/Zend/Form/Decorator/Label.php | 329 + .../Form/Decorator/Marker/File/Interface.php | 33 + .../Zend/Form/Decorator/PrepareElements.php | 90 + lib/zend/Zend/Form/Decorator/Tooltip.php | 58 + lib/zend/Zend/Form/Decorator/ViewHelper.php | 256 + lib/zend/Zend/Form/Decorator/ViewScript.php | 144 + lib/zend/Zend/Form/DisplayGroup.php | 1126 ++++ lib/zend/Zend/Form/Element.php | 2136 ++++++ lib/zend/Zend/Form/Element/Button.php | 42 + lib/zend/Zend/Form/Element/Captcha.php | 304 + lib/zend/Zend/Form/Element/Checkbox.php | 203 + lib/zend/Zend/Form/Element/Exception.php | 37 + lib/zend/Zend/Form/Element/File.php | 902 +++ lib/zend/Zend/Form/Element/Hash.php | 259 + lib/zend/Zend/Form/Element/Hidden.php | 42 + lib/zend/Zend/Form/Element/Image.php | 131 + lib/zend/Zend/Form/Element/Multi.php | 318 + lib/zend/Zend/Form/Element/MultiCheckbox.php | 52 + lib/zend/Zend/Form/Element/Multiselect.php | 54 + lib/zend/Zend/Form/Element/Password.php | 88 + lib/zend/Zend/Form/Element/Radio.php | 42 + lib/zend/Zend/Form/Element/Reset.php | 42 + lib/zend/Zend/Form/Element/Select.php | 42 + lib/zend/Zend/Form/Element/Submit.php | 122 + lib/zend/Zend/Form/Element/Text.php | 42 + lib/zend/Zend/Form/Element/Textarea.php | 42 + lib/zend/Zend/Form/Element/Xhtml.php | 37 + lib/zend/Zend/Form/Exception.php | 35 + lib/zend/Zend/Form/SubForm.php | 60 + lib/zend/Zend/Gdata/App.php | 601 +- lib/zend/Zend/Gdata/App/AuthException.php | 41 + .../Zend/Gdata/App/BadMethodCallException.php | 42 + lib/zend/Zend/Gdata/App/Base.php | 157 +- lib/zend/Zend/Gdata/App/BaseMediaSource.php | 21 +- .../Gdata/App/CaptchaRequiredException.php | 94 + lib/zend/Zend/Gdata/App/Entry.php | 102 +- lib/zend/Zend/Gdata/App/Exception.php | 43 + lib/zend/Zend/Gdata/App/Extension.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Author.php | 7 +- .../Zend/Gdata/App/Extension/Category.php | 31 +- lib/zend/Zend/Gdata/App/Extension/Content.php | 17 +- .../Zend/Gdata/App/Extension/Contributor.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Control.php | 11 +- lib/zend/Zend/Gdata/App/Extension/Draft.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Edited.php | 49 + lib/zend/Zend/Gdata/App/Extension/Element.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Email.php | 7 +- .../Zend/Gdata/App/Extension/Generator.php | 15 +- lib/zend/Zend/Gdata/App/Extension/Icon.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Id.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Link.php | 47 +- lib/zend/Zend/Gdata/App/Extension/Logo.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Name.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Person.php | 11 +- .../Zend/Gdata/App/Extension/Published.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Rights.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Source.php | 7 +- .../Zend/Gdata/App/Extension/Subtitle.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Summary.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Text.php | 13 +- lib/zend/Zend/Gdata/App/Extension/Title.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Updated.php | 7 +- lib/zend/Zend/Gdata/App/Extension/Uri.php | 7 +- lib/zend/Zend/Gdata/App/Feed.php | 104 +- lib/zend/Zend/Gdata/App/FeedEntryParent.php | 266 +- lib/zend/Zend/Gdata/App/FeedSourceParent.php | 34 +- lib/zend/Zend/Gdata/App/HttpException.php | 121 + lib/zend/Zend/Gdata/App/IOException.php | 43 + .../Gdata/App/InvalidArgumentException.php | 42 + .../App/LoggingHttpClientAdapterSocket.php | 119 + lib/zend/Zend/Gdata/App/MediaEntry.php | 75 +- lib/zend/Zend/Gdata/App/MediaFileSource.php | 7 +- lib/zend/Zend/Gdata/App/MediaSource.php | 7 +- lib/zend/Zend/Gdata/App/Util.php | 112 + lib/zend/Zend/Gdata/App/VersionException.php | 42 + lib/zend/Zend/Gdata/AuthSub.php | 32 +- lib/zend/Zend/Gdata/Books.php | 204 + lib/zend/Zend/Gdata/Books/CollectionEntry.php | 56 + lib/zend/Zend/Gdata/Books/CollectionFeed.php | 62 + .../Gdata/Books/Extension/AnnotationLink.php | 63 + .../Gdata/Books/Extension/BooksCategory.php | 59 + .../Zend/Gdata/Books/Extension/BooksLink.php | 61 + .../Gdata/Books/Extension/Embeddability.php | 122 + .../Zend/Gdata/Books/Extension/InfoLink.php | 59 + .../Gdata/Books/Extension/PreviewLink.php | 60 + .../Zend/Gdata/Books/Extension/Review.php | 152 + .../Gdata/Books/Extension/ThumbnailLink.php | 60 + .../Gdata/Books/Extension/Viewability.php | 123 + lib/zend/Zend/Gdata/Books/VolumeEntry.php | 687 ++ lib/zend/Zend/Gdata/Books/VolumeFeed.php | 62 + lib/zend/Zend/Gdata/Books/VolumeQuery.php | 112 + lib/zend/Zend/Gdata/Calendar.php | 169 + lib/zend/Zend/Gdata/Calendar/EventEntry.php | 164 + lib/zend/Zend/Gdata/Calendar/EventFeed.php | 106 + lib/zend/Zend/Gdata/Calendar/EventQuery.php | 447 ++ .../Gdata/Calendar/Extension/AccessLevel.php | 125 + .../Zend/Gdata/Calendar/Extension/Color.php | 125 + .../Zend/Gdata/Calendar/Extension/Hidden.php | 134 + .../Zend/Gdata/Calendar/Extension/Link.php | 125 + .../Gdata/Calendar/Extension/QuickAdd.php | 132 + .../Gdata/Calendar/Extension/Selected.php | 133 + .../Extension/SendEventNotifications.php | 132 + .../Gdata/Calendar/Extension/Timezone.php | 124 + .../Gdata/Calendar/Extension/WebContent.php | 177 + lib/zend/Zend/Gdata/Calendar/ListEntry.php | 246 + lib/zend/Zend/Gdata/Calendar/ListFeed.php | 106 + lib/zend/Zend/Gdata/ClientLogin.php | 8 +- lib/zend/Zend/Gdata/Docs.php | 10 +- .../Zend/Gdata/Docs/DocumentListEntry.php | 11 +- lib/zend/Zend/Gdata/Docs/DocumentListFeed.php | 11 +- lib/zend/Zend/Gdata/Docs/Query.php | 222 + lib/zend/Zend/Gdata/DublinCore.php | 65 + .../Gdata/DublinCore/Extension/Creator.php | 58 + .../Zend/Gdata/DublinCore/Extension/Date.php | 60 + .../DublinCore/Extension/Description.php | 58 + .../Gdata/DublinCore/Extension/Format.php | 58 + .../Gdata/DublinCore/Extension/Identifier.php | 58 + .../Gdata/DublinCore/Extension/Language.php | 58 + .../Gdata/DublinCore/Extension/Publisher.php | 58 + .../Gdata/DublinCore/Extension/Rights.php | 58 + .../Gdata/DublinCore/Extension/Subject.php | 58 + .../Zend/Gdata/DublinCore/Extension/Title.php | 58 + lib/zend/Zend/Gdata/Entry.php | 96 +- lib/zend/Zend/Gdata/Exif.php | 65 + lib/zend/Zend/Gdata/Exif/Entry.php | 145 + .../Zend/Gdata/Exif/Extension/Distance.php | 61 + .../Zend/Gdata/Exif/Extension/Exposure.php | 61 + lib/zend/Zend/Gdata/Exif/Extension/FStop.php | 61 + lib/zend/Zend/Gdata/Exif/Extension/Flash.php | 61 + .../Zend/Gdata/Exif/Extension/FocalLength.php | 61 + .../Gdata/Exif/Extension/ImageUniqueId.php | 61 + lib/zend/Zend/Gdata/Exif/Extension/Iso.php | 61 + lib/zend/Zend/Gdata/Exif/Extension/Make.php | 61 + lib/zend/Zend/Gdata/Exif/Extension/Model.php | 61 + lib/zend/Zend/Gdata/Exif/Extension/Tags.php | 549 ++ lib/zend/Zend/Gdata/Exif/Extension/Time.php | 61 + lib/zend/Zend/Gdata/Exif/Feed.php | 70 + lib/zend/Zend/Gdata/Extension.php | 18 +- .../Zend/Gdata/Extension/AttendeeStatus.php | 123 + .../Zend/Gdata/Extension/AttendeeType.php | 123 + lib/zend/Zend/Gdata/Extension/Comments.php | 117 + lib/zend/Zend/Gdata/Extension/EntryLink.php | 167 + lib/zend/Zend/Gdata/Extension/EventStatus.php | 101 + .../Zend/Gdata/Extension/ExtendedProperty.php | 106 + lib/zend/Zend/Gdata/Extension/FeedLink.php | 175 + .../Extension/OpenSearchItemsPerPage.php | 7 +- .../Gdata/Extension/OpenSearchStartIndex.php | 7 +- .../Extension/OpenSearchTotalResults.php | 7 +- .../Zend/Gdata/Extension/OriginalEvent.php | 142 + lib/zend/Zend/Gdata/Extension/Rating.php | 240 + lib/zend/Zend/Gdata/Extension/Recurrence.php | 49 + .../Gdata/Extension/RecurrenceException.php | 215 + lib/zend/Zend/Gdata/Extension/Reminder.php | 171 + .../Zend/Gdata/Extension/Transparency.php | 123 + lib/zend/Zend/Gdata/Extension/Visibility.php | 123 + lib/zend/Zend/Gdata/Extension/When.php | 169 + lib/zend/Zend/Gdata/Extension/Where.php | 171 + lib/zend/Zend/Gdata/Extension/Who.php | 299 + lib/zend/Zend/Gdata/Feed.php | 106 +- lib/zend/Zend/Gdata/Gapps.php | 1097 +++ lib/zend/Zend/Gdata/Gapps/EmailListEntry.php | 214 + lib/zend/Zend/Gdata/Gapps/EmailListFeed.php | 53 + lib/zend/Zend/Gdata/Gapps/EmailListQuery.php | 187 + .../Gdata/Gapps/EmailListRecipientEntry.php | 146 + .../Gdata/Gapps/EmailListRecipientFeed.php | 53 + .../Gdata/Gapps/EmailListRecipientQuery.php | 153 + lib/zend/Zend/Gdata/Gapps/Error.php | 233 + .../Zend/Gdata/Gapps/Extension/EmailList.php | 144 + lib/zend/Zend/Gdata/Gapps/Extension/Login.php | 485 ++ lib/zend/Zend/Gdata/Gapps/Extension/Name.php | 181 + .../Zend/Gdata/Gapps/Extension/Nickname.php | 142 + lib/zend/Zend/Gdata/Gapps/Extension/Quota.php | 142 + lib/zend/Zend/Gdata/Gapps/NicknameEntry.php | 189 + lib/zend/Zend/Gdata/Gapps/NicknameFeed.php | 53 + lib/zend/Zend/Gdata/Gapps/NicknameQuery.php | 186 + lib/zend/Zend/Gdata/Gapps/Query.php | 123 + .../Zend/Gdata/Gapps/ServiceException.php | 208 + lib/zend/Zend/Gdata/Gapps/UserEntry.php | 295 + lib/zend/Zend/Gdata/Gapps/UserFeed.php | 53 + lib/zend/Zend/Gdata/Gapps/UserQuery.php | 147 + lib/zend/Zend/Gdata/Gbase.php | 209 + lib/zend/Zend/Gdata/Gbase/Entry.php | 151 + .../Gdata/Gbase/Extension/BaseAttribute.php | 115 + lib/zend/Zend/Gdata/Gbase/Feed.php | 60 + lib/zend/Zend/Gdata/Gbase/ItemEntry.php | 161 + lib/zend/Zend/Gdata/Gbase/ItemFeed.php | 48 + lib/zend/Zend/Gdata/Gbase/ItemQuery.php | 101 + lib/zend/Zend/Gdata/Gbase/Query.php | 268 + lib/zend/Zend/Gdata/Gbase/SnippetEntry.php | 48 + lib/zend/Zend/Gdata/Gbase/SnippetFeed.php | 48 + lib/zend/Zend/Gdata/Gbase/SnippetQuery.php | 74 + lib/zend/Zend/Gdata/Geo.php | 70 + lib/zend/Zend/Gdata/Geo/Entry.php | 97 + .../Zend/Gdata/Geo/Extension/GeoRssWhere.php | 135 + .../Zend/Gdata/Geo/Extension/GmlPoint.php | 136 + lib/zend/Zend/Gdata/Geo/Extension/GmlPos.php | 61 + lib/zend/Zend/Gdata/Geo/Feed.php | 64 + lib/zend/Zend/Gdata/Health.php | 274 + lib/zend/Zend/Gdata/Health/Extension/Ccr.php | 125 + lib/zend/Zend/Gdata/Health/ProfileEntry.php | 135 + lib/zend/Zend/Gdata/Health/ProfileFeed.php | 67 + .../Zend/Gdata/Health/ProfileListEntry.php | 100 + .../Zend/Gdata/Health/ProfileListFeed.php | 53 + lib/zend/Zend/Gdata/Health/Query.php | 285 + .../Zend/Gdata/HttpAdapterStreamingProxy.php | 127 + .../Zend/Gdata/HttpAdapterStreamingSocket.php | 111 + lib/zend/Zend/Gdata/HttpClient.php | 144 +- lib/zend/Zend/Gdata/Kind/EventEntry.php | 428 ++ lib/zend/Zend/Gdata/Media.php | 65 + lib/zend/Zend/Gdata/Media/Entry.php | 134 + .../Gdata/Media/Extension/MediaCategory.php | 148 + .../Gdata/Media/Extension/MediaContent.php | 522 ++ .../Gdata/Media/Extension/MediaCopyright.php | 116 + .../Gdata/Media/Extension/MediaCredit.php | 149 + .../Media/Extension/MediaDescription.php | 116 + .../Zend/Gdata/Media/Extension/MediaGroup.php | 566 ++ .../Zend/Gdata/Media/Extension/MediaHash.php | 115 + .../Gdata/Media/Extension/MediaKeywords.php | 52 + .../Gdata/Media/Extension/MediaPlayer.php | 178 + .../Gdata/Media/Extension/MediaRating.php | 118 + .../Media/Extension/MediaRestriction.php | 149 + .../Zend/Gdata/Media/Extension/MediaText.php | 211 + .../Gdata/Media/Extension/MediaThumbnail.php | 210 + .../Zend/Gdata/Media/Extension/MediaTitle.php | 118 + lib/zend/Zend/Gdata/Media/Feed.php | 70 + lib/zend/Zend/Gdata/MediaMimeStream.php | 190 + lib/zend/Zend/Gdata/MimeBodyString.php | 92 + lib/zend/Zend/Gdata/MimeFile.php | 66 + lib/zend/Zend/Gdata/Photos.php | 576 ++ lib/zend/Zend/Gdata/Photos/AlbumEntry.php | 610 ++ lib/zend/Zend/Gdata/Photos/AlbumFeed.php | 509 ++ lib/zend/Zend/Gdata/Photos/AlbumQuery.php | 149 + lib/zend/Zend/Gdata/Photos/CommentEntry.php | 195 + .../Zend/Gdata/Photos/Extension/Access.php | 63 + .../Zend/Gdata/Photos/Extension/AlbumId.php | 63 + .../Zend/Gdata/Photos/Extension/BytesUsed.php | 62 + .../Zend/Gdata/Photos/Extension/Checksum.php | 63 + .../Zend/Gdata/Photos/Extension/Client.php | 63 + .../Gdata/Photos/Extension/CommentCount.php | 63 + .../Photos/Extension/CommentingEnabled.php | 64 + .../Zend/Gdata/Photos/Extension/Height.php | 62 + lib/zend/Zend/Gdata/Photos/Extension/Id.php | 62 + .../Zend/Gdata/Photos/Extension/Location.php | 62 + .../Photos/Extension/MaxPhotosPerAlbum.php | 63 + lib/zend/Zend/Gdata/Photos/Extension/Name.php | 62 + .../Zend/Gdata/Photos/Extension/Nickname.php | 62 + .../Zend/Gdata/Photos/Extension/NumPhotos.php | 62 + .../Photos/Extension/NumPhotosRemaining.php | 62 + .../Zend/Gdata/Photos/Extension/PhotoId.php | 61 + .../Zend/Gdata/Photos/Extension/Position.php | 62 + .../Gdata/Photos/Extension/QuotaCurrent.php | 62 + .../Gdata/Photos/Extension/QuotaLimit.php | 63 + .../Zend/Gdata/Photos/Extension/Rotation.php | 63 + lib/zend/Zend/Gdata/Photos/Extension/Size.php | 62 + .../Zend/Gdata/Photos/Extension/Thumbnail.php | 62 + .../Zend/Gdata/Photos/Extension/Timestamp.php | 63 + lib/zend/Zend/Gdata/Photos/Extension/User.php | 62 + .../Zend/Gdata/Photos/Extension/Version.php | 63 + .../Zend/Gdata/Photos/Extension/Weight.php | 63 + .../Zend/Gdata/Photos/Extension/Width.php | 62 + lib/zend/Zend/Gdata/Photos/PhotoEntry.php | 691 ++ lib/zend/Zend/Gdata/Photos/PhotoFeed.php | 559 ++ lib/zend/Zend/Gdata/Photos/PhotoQuery.php | 98 + lib/zend/Zend/Gdata/Photos/TagEntry.php | 140 + lib/zend/Zend/Gdata/Photos/UserEntry.php | 366 + lib/zend/Zend/Gdata/Photos/UserFeed.php | 247 + lib/zend/Zend/Gdata/Photos/UserQuery.php | 355 + lib/zend/Zend/Gdata/Query.php | 418 ++ lib/zend/Zend/Gdata/Spreadsheets.php | 445 ++ .../Zend/Gdata/Spreadsheets/CellEntry.php | 103 + lib/zend/Zend/Gdata/Spreadsheets/CellFeed.php | 158 + .../Zend/Gdata/Spreadsheets/CellQuery.php | 417 ++ .../Zend/Gdata/Spreadsheets/DocumentQuery.php | 288 + .../Gdata/Spreadsheets/Extension/Cell.php | 201 + .../Gdata/Spreadsheets/Extension/ColCount.php | 59 + .../Gdata/Spreadsheets/Extension/Custom.php | 100 + .../Gdata/Spreadsheets/Extension/RowCount.php | 60 + .../Zend/Gdata/Spreadsheets/ListEntry.php | 208 + lib/zend/Zend/Gdata/Spreadsheets/ListFeed.php | 64 + .../Zend/Gdata/Spreadsheets/ListQuery.php | 305 + .../Gdata/Spreadsheets/SpreadsheetEntry.php | 64 + .../Gdata/Spreadsheets/SpreadsheetFeed.php | 64 + .../Gdata/Spreadsheets/WorksheetEntry.php | 187 + .../Zend/Gdata/Spreadsheets/WorksheetFeed.php | 64 + lib/zend/Zend/Gdata/YouTube.php | 874 +++ lib/zend/Zend/Gdata/YouTube/ActivityEntry.php | 232 + lib/zend/Zend/Gdata/YouTube/ActivityFeed.php | 66 + lib/zend/Zend/Gdata/YouTube/CommentEntry.php | 59 + lib/zend/Zend/Gdata/YouTube/CommentFeed.php | 66 + lib/zend/Zend/Gdata/YouTube/ContactEntry.php | 136 + lib/zend/Zend/Gdata/YouTube/ContactFeed.php | 68 + .../Zend/Gdata/YouTube/Extension/AboutMe.php | 51 + lib/zend/Zend/Gdata/YouTube/Extension/Age.php | 51 + .../Zend/Gdata/YouTube/Extension/Books.php | 51 + .../Zend/Gdata/YouTube/Extension/Company.php | 51 + .../Zend/Gdata/YouTube/Extension/Control.php | 133 + .../Gdata/YouTube/Extension/CountHint.php | 51 + .../Gdata/YouTube/Extension/Description.php | 51 + .../Zend/Gdata/YouTube/Extension/Duration.php | 126 + .../Gdata/YouTube/Extension/FirstName.php | 51 + .../Zend/Gdata/YouTube/Extension/Gender.php | 51 + .../Zend/Gdata/YouTube/Extension/Hobbies.php | 51 + .../Zend/Gdata/YouTube/Extension/Hometown.php | 51 + .../Zend/Gdata/YouTube/Extension/LastName.php | 51 + .../Zend/Gdata/YouTube/Extension/Link.php | 133 + .../Zend/Gdata/YouTube/Extension/Location.php | 51 + .../Gdata/YouTube/Extension/MediaContent.php | 120 + .../Gdata/YouTube/Extension/MediaCredit.php | 189 + .../Gdata/YouTube/Extension/MediaGroup.php | 336 + .../Gdata/YouTube/Extension/MediaRating.php | 150 + .../Zend/Gdata/YouTube/Extension/Movies.php | 51 + .../Zend/Gdata/YouTube/Extension/Music.php | 51 + .../Zend/Gdata/YouTube/Extension/NoEmbed.php | 54 + .../Gdata/YouTube/Extension/Occupation.php | 51 + .../Gdata/YouTube/Extension/PlaylistId.php | 51 + .../Gdata/YouTube/Extension/PlaylistTitle.php | 51 + .../Zend/Gdata/YouTube/Extension/Position.php | 90 + .../Zend/Gdata/YouTube/Extension/Private.php | 81 + .../Gdata/YouTube/Extension/QueryString.php | 51 + .../Zend/Gdata/YouTube/Extension/Racy.php | 124 + .../Zend/Gdata/YouTube/Extension/Recorded.php | 51 + .../Gdata/YouTube/Extension/Relationship.php | 51 + .../Gdata/YouTube/Extension/ReleaseDate.php | 51 + .../Zend/Gdata/YouTube/Extension/School.php | 51 + .../Zend/Gdata/YouTube/Extension/State.php | 193 + .../Gdata/YouTube/Extension/Statistics.php | 309 + .../Zend/Gdata/YouTube/Extension/Status.php | 51 + .../Zend/Gdata/YouTube/Extension/Token.php | 70 + .../Zend/Gdata/YouTube/Extension/Uploaded.php | 51 + .../Zend/Gdata/YouTube/Extension/Username.php | 51 + .../Zend/Gdata/YouTube/Extension/VideoId.php | 51 + lib/zend/Zend/Gdata/YouTube/InboxEntry.php | 281 + lib/zend/Zend/Gdata/YouTube/InboxFeed.php | 68 + lib/zend/Zend/Gdata/YouTube/MediaEntry.php | 81 + .../Zend/Gdata/YouTube/PlaylistListEntry.php | 300 + .../Zend/Gdata/YouTube/PlaylistListFeed.php | 68 + .../Zend/Gdata/YouTube/PlaylistVideoEntry.php | 132 + .../Zend/Gdata/YouTube/PlaylistVideoFeed.php | 68 + .../Zend/Gdata/YouTube/SubscriptionEntry.php | 446 ++ .../Zend/Gdata/YouTube/SubscriptionFeed.php | 68 + .../Zend/Gdata/YouTube/UserProfileEntry.php | 1041 +++ lib/zend/Zend/Gdata/YouTube/VideoEntry.php | 1095 +++ lib/zend/Zend/Gdata/YouTube/VideoFeed.php | 65 + lib/zend/Zend/Gdata/YouTube/VideoQuery.php | 540 ++ lib/zend/Zend/Http/Client.php | 265 +- lib/zend/Zend/Http/Client/Adapter/Curl.php | 423 ++ .../Zend/Http/Client/Adapter/Exception.php | 11 +- .../Zend/Http/Client/Adapter/Interface.php | 4 +- lib/zend/Zend/Http/Client/Adapter/Proxy.php | 98 +- lib/zend/Zend/Http/Client/Adapter/Socket.php | 221 +- lib/zend/Zend/Http/Client/Adapter/Test.php | 32 +- lib/zend/Zend/Http/Client/Exception.php | 7 +- lib/zend/Zend/Http/Cookie.php | 109 +- lib/zend/Zend/Http/CookieJar.php | 103 +- lib/zend/Zend/Http/Exception.php | 7 +- lib/zend/Zend/Http/Response.php | 66 +- lib/zend/Zend/InfoCard/Adapter/Default.php | 79 + lib/zend/Zend/InfoCard/Adapter/Exception.php | 36 + lib/zend/Zend/InfoCard/Adapter/Interface.php | 63 + lib/zend/Zend/InfoCard/Cipher.php | 99 + lib/zend/Zend/InfoCard/Cipher/Exception.php | 38 + .../InfoCard/Cipher/Pki/Adapter/Abstract.php | 88 + .../Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php | 120 + .../Zend/InfoCard/Cipher/Pki/Interface.php | 33 + .../InfoCard/Cipher/Pki/Rsa/Interface.php | 50 + .../Cipher/Symmetric/Adapter/Abstract.php | 38 + .../Cipher/Symmetric/Adapter/Aes128cbc.php | 40 + .../Cipher/Symmetric/Adapter/Aes256cbc.php | 111 + .../Cipher/Symmetric/Aes128cbc/Interface.php | 38 + .../Cipher/Symmetric/Aes256cbc/Interface.php | 33 + .../InfoCard/Cipher/Symmetric/Interface.php | 32 + lib/zend/Zend/InfoCard/Claims.php | 307 + lib/zend/Zend/InfoCard/Exception.php | 43 + lib/zend/Zend/InfoCard/Xml/Assertion.php | 88 + .../Zend/InfoCard/Xml/Assertion/Interface.php | 69 + lib/zend/Zend/InfoCard/Xml/Assertion/Saml.php | 284 + lib/zend/Zend/InfoCard/Xml/Element.php | 107 + .../Zend/InfoCard/Xml/Element/Interface.php | 44 + lib/zend/Zend/InfoCard/Xml/EncryptedData.php | 75 + .../InfoCard/Xml/EncryptedData/Abstract.php | 92 + .../InfoCard/Xml/EncryptedData/XmlEnc.php | 64 + lib/zend/Zend/InfoCard/Xml/EncryptedKey.php | 174 + lib/zend/Zend/InfoCard/Xml/Exception.php | 37 + lib/zend/Zend/InfoCard/Xml/KeyInfo.php | 90 + .../Zend/InfoCard/Xml/KeyInfo/Abstract.php | 37 + .../Zend/InfoCard/Xml/KeyInfo/Default.php | 64 + .../Zend/InfoCard/Xml/KeyInfo/Interface.php | 38 + .../Zend/InfoCard/Xml/KeyInfo/XmlDSig.php | 76 + lib/zend/Zend/InfoCard/Xml/Security.php | 305 + .../Zend/InfoCard/Xml/Security/Exception.php | 37 + .../Zend/InfoCard/Xml/Security/Transform.php | 116 + .../Security/Transform/EnvelopedSignature.php | 60 + .../Xml/Security/Transform/Exception.php | 37 + .../Xml/Security/Transform/Interface.php | 43 + .../Xml/Security/Transform/XmlExcC14N.php | 59 + .../InfoCard/Xml/SecurityTokenReference.php | 173 + lib/zend/Zend/Json/Decoder.php | 578 ++ lib/zend/Zend/Json/Encoder.php | 574 ++ lib/zend/Zend/Json/Exception.php | 37 + lib/zend/Zend/Json/Expr.php | 80 + lib/zend/Zend/Json/Server.php | 538 ++ lib/zend/Zend/Json/Server/Cache.php | 102 + lib/zend/Zend/Json/Server/Error.php | 198 + lib/zend/Zend/Json/Server/Exception.php | 36 + lib/zend/Zend/Json/Server/Request.php | 289 + lib/zend/Zend/Json/Server/Request/Http.php | 66 + lib/zend/Zend/Json/Server/Response.php | 248 + lib/zend/Zend/Json/Server/Response/Http.php | 81 + lib/zend/Zend/Json/Server/Smd.php | 480 ++ lib/zend/Zend/Json/Server/Smd/Service.php | 473 ++ .../Controller/Action/Helper/Layout.php | 186 + .../Zend/Layout/Controller/Plugin/Layout.php | 155 + lib/zend/Zend/Layout/Exception.php | 35 + lib/zend/Zend/Ldap/Attribute.php | 420 ++ lib/zend/Zend/Ldap/Collection.php | 195 + .../Zend/Ldap/Collection/Iterator/Default.php | 253 + .../Ldap/Collection/Iterator/Interface.php | 46 + lib/zend/Zend/Ldap/Converter.php | 71 + lib/zend/Zend/Ldap/Dn.php | 794 +++ lib/zend/Zend/Ldap/Exception.php | 173 + lib/zend/Zend/Ldap/Filter.php | 265 + lib/zend/Zend/Ldap/Filter/Abstract.php | 157 + lib/zend/Zend/Ldap/Filter/And.php | 48 + .../Result.php => Ldap/Filter/Exception.php} | 43 +- lib/zend/Zend/Ldap/Filter/Logical.php | 107 + lib/zend/Zend/Ldap/Filter/Mask.php | 66 + lib/zend/Zend/Ldap/Filter/Not.php | 75 + lib/zend/Zend/Ldap/Filter/Or.php | 48 + lib/zend/Zend/Ldap/Filter/String.php | 65 + lib/zend/Zend/Ldap/Ldif/Encoder.php | 304 + lib/zend/Zend/Ldap/Node.php | 1098 +++ lib/zend/Zend/Ldap/Node/Abstract.php | 485 ++ lib/zend/Zend/Ldap/Node/ChildrenIterator.php | 209 + lib/zend/Zend/Ldap/Node/Collection.php | 67 + lib/zend/Zend/Ldap/Node/RootDse.php | 158 + .../Ldap/Node/RootDse/ActiveDirectory.php | 247 + lib/zend/Zend/Ldap/Node/RootDse/OpenLdap.php | 102 + .../Zend/Ldap/Node/RootDse/eDirectory.php | 160 + lib/zend/Zend/Ldap/Node/Schema.php | 120 + .../Zend/Ldap/Node/Schema/ActiveDirectory.php | 103 + .../Schema/AttributeType/ActiveDirectory.php | 104 + .../Node/Schema/AttributeType/Interface.php | 75 + .../Node/Schema/AttributeType/OpenLdap.php | 129 + lib/zend/Zend/Ldap/Node/Schema/Item.php | 163 + .../Schema/ObjectClass/ActiveDirectory.php | 115 + .../Node/Schema/ObjectClass/Interface.php | 83 + .../Ldap/Node/Schema/ObjectClass/OpenLdap.php | 175 + lib/zend/Zend/Ldap/Node/Schema/OpenLdap.php | 502 ++ lib/zend/Zend/Loader/Autoloader.php | 584 ++ lib/zend/Zend/Loader/Autoloader/Interface.php | 34 + lib/zend/Zend/Loader/Autoloader/Resource.php | 439 ++ lib/zend/Zend/Loader/Exception.php | 35 + lib/zend/Zend/Loader/PluginLoader.php | 480 ++ .../Zend/Loader/PluginLoader/Exception.php | 39 + .../Zend/Loader/PluginLoader/Interface.php | 75 + lib/zend/Zend/Locale/Data.php | 1476 ++++ lib/zend/Zend/Locale/Data/Translation.php | 96 + lib/zend/Zend/Locale/Data/aa.xml | 221 + lib/zend/Zend/Locale/Data/aa_DJ.xml | 26 + lib/zend/Zend/Locale/Data/aa_ER.xml | 11 + lib/zend/Zend/Locale/Data/aa_ER_SAAHO.xml | 39 + lib/zend/Zend/Locale/Data/aa_ET.xml | 10 + lib/zend/Zend/Locale/Data/af.xml | 822 +++ lib/zend/Zend/Locale/Data/af_NA.xml | 75 + lib/zend/Zend/Locale/Data/af_ZA.xml | 10 + lib/zend/Zend/Locale/Data/ak.xml | 190 + lib/zend/Zend/Locale/Data/ak_GH.xml | 10 + lib/zend/Zend/Locale/Data/am.xml | 1409 ++++ lib/zend/Zend/Locale/Data/am_ET.xml | 10 + lib/zend/Zend/Locale/Data/ar.xml | 3118 +++++++++ lib/zend/Zend/Locale/Data/ar_AE.xml | 15 + lib/zend/Zend/Locale/Data/ar_BH.xml | 15 + lib/zend/Zend/Locale/Data/ar_DZ.xml | 44 + lib/zend/Zend/Locale/Data/ar_EG.xml | 10 + lib/zend/Zend/Locale/Data/ar_IQ.xml | 15 + lib/zend/Zend/Locale/Data/ar_JO.xml | 66 + lib/zend/Zend/Locale/Data/ar_KW.xml | 15 + lib/zend/Zend/Locale/Data/ar_LB.xml | 67 + lib/zend/Zend/Locale/Data/ar_LY.xml | 15 + lib/zend/Zend/Locale/Data/ar_MA.xml | 47 + lib/zend/Zend/Locale/Data/ar_OM.xml | 15 + lib/zend/Zend/Locale/Data/ar_QA.xml | 50 + lib/zend/Zend/Locale/Data/ar_SA.xml | 50 + lib/zend/Zend/Locale/Data/ar_SD.xml | 15 + lib/zend/Zend/Locale/Data/ar_SY.xml | 82 + lib/zend/Zend/Locale/Data/ar_TN.xml | 75 + lib/zend/Zend/Locale/Data/ar_YE.xml | 50 + lib/zend/Zend/Locale/Data/as.xml | 274 + lib/zend/Zend/Locale/Data/as_IN.xml | 10 + lib/zend/Zend/Locale/Data/az.xml | 2716 ++++++++ lib/zend/Zend/Locale/Data/az_AZ.xml | 11 + lib/zend/Zend/Locale/Data/az_Cyrl.xml | 85 + lib/zend/Zend/Locale/Data/az_Cyrl_AZ.xml | 11 + lib/zend/Zend/Locale/Data/az_Latn.xml | 10 + lib/zend/Zend/Locale/Data/az_Latn_AZ.xml | 11 + lib/zend/Zend/Locale/Data/be.xml | 1091 +++ lib/zend/Zend/Locale/Data/be_BY.xml | 10 + lib/zend/Zend/Locale/Data/bg.xml | 3966 +++++++++++ lib/zend/Zend/Locale/Data/bg_BG.xml | 10 + lib/zend/Zend/Locale/Data/bn.xml | 2834 ++++++++ lib/zend/Zend/Locale/Data/bn_BD.xml | 10 + lib/zend/Zend/Locale/Data/bn_IN.xml | 36 + lib/zend/Zend/Locale/Data/bo.xml | 441 ++ lib/zend/Zend/Locale/Data/bo_CN.xml | 10 + lib/zend/Zend/Locale/Data/bo_IN.xml | 10 + lib/zend/Zend/Locale/Data/bs.xml | 330 + lib/zend/Zend/Locale/Data/bs_BA.xml | 10 + lib/zend/Zend/Locale/Data/byn.xml | 502 ++ lib/zend/Zend/Locale/Data/byn_ER.xml | 10 + lib/zend/Zend/Locale/Data/ca.xml | 3253 +++++++++ lib/zend/Zend/Locale/Data/ca_ES.xml | 10 + lib/zend/Zend/Locale/Data/cch.xml | 189 + lib/zend/Zend/Locale/Data/cch_NG.xml | 10 + lib/zend/Zend/Locale/Data/characters.xml | 482 ++ lib/zend/Zend/Locale/Data/cop.xml | 198 + lib/zend/Zend/Locale/Data/cs.xml | 2440 +++++++ lib/zend/Zend/Locale/Data/cs_CZ.xml | 10 + lib/zend/Zend/Locale/Data/cy.xml | 783 +++ lib/zend/Zend/Locale/Data/cy_GB.xml | 10 + lib/zend/Zend/Locale/Data/da.xml | 3130 +++++++++ lib/zend/Zend/Locale/Data/da_DK.xml | 10 + lib/zend/Zend/Locale/Data/de.xml | 2950 ++++++++ lib/zend/Zend/Locale/Data/de_AT.xml | 70 + lib/zend/Zend/Locale/Data/de_BE.xml | 115 + lib/zend/Zend/Locale/Data/de_CH.xml | 61 + lib/zend/Zend/Locale/Data/de_DE.xml | 10 + lib/zend/Zend/Locale/Data/de_LI.xml | 23 + lib/zend/Zend/Locale/Data/de_LU.xml | 19 + lib/zend/Zend/Locale/Data/dv.xml | 226 + lib/zend/Zend/Locale/Data/dv_MV.xml | 10 + lib/zend/Zend/Locale/Data/dz.xml | 407 ++ lib/zend/Zend/Locale/Data/dz_BT.xml | 10 + lib/zend/Zend/Locale/Data/ee.xml | 193 + lib/zend/Zend/Locale/Data/ee_GH.xml | 10 + lib/zend/Zend/Locale/Data/ee_TG.xml | 10 + lib/zend/Zend/Locale/Data/el.xml | 4125 ++++++++++++ lib/zend/Zend/Locale/Data/el_CY.xml | 20 + lib/zend/Zend/Locale/Data/el_GR.xml | 10 + lib/zend/Zend/Locale/Data/el_POLYTON.xml | 542 ++ lib/zend/Zend/Locale/Data/en.xml | 4095 ++++++++++++ lib/zend/Zend/Locale/Data/en_AS.xml | 10 + lib/zend/Zend/Locale/Data/en_AU.xml | 160 + lib/zend/Zend/Locale/Data/en_BE.xml | 158 + lib/zend/Zend/Locale/Data/en_BW.xml | 130 + lib/zend/Zend/Locale/Data/en_BZ.xml | 160 + lib/zend/Zend/Locale/Data/en_CA.xml | 127 + lib/zend/Zend/Locale/Data/en_Dsrt.xml | 1024 +++ lib/zend/Zend/Locale/Data/en_Dsrt_US.xml | 11 + lib/zend/Zend/Locale/Data/en_GB.xml | 169 + lib/zend/Zend/Locale/Data/en_GU.xml | 10 + lib/zend/Zend/Locale/Data/en_HK.xml | 55 + lib/zend/Zend/Locale/Data/en_IE.xml | 157 + lib/zend/Zend/Locale/Data/en_IN.xml | 145 + lib/zend/Zend/Locale/Data/en_JM.xml | 27 + lib/zend/Zend/Locale/Data/en_MH.xml | 10 + lib/zend/Zend/Locale/Data/en_MP.xml | 10 + lib/zend/Zend/Locale/Data/en_MT.xml | 154 + lib/zend/Zend/Locale/Data/en_NA.xml | 27 + lib/zend/Zend/Locale/Data/en_NZ.xml | 157 + lib/zend/Zend/Locale/Data/en_PH.xml | 17 + lib/zend/Zend/Locale/Data/en_PK.xml | 153 + lib/zend/Zend/Locale/Data/en_SG.xml | 48 + lib/zend/Zend/Locale/Data/en_Shaw.xml | 186 + lib/zend/Zend/Locale/Data/en_TT.xml | 27 + lib/zend/Zend/Locale/Data/en_UM.xml | 10 + lib/zend/Zend/Locale/Data/en_US.xml | 10 + lib/zend/Zend/Locale/Data/en_US_POSIX.xml | 45 + lib/zend/Zend/Locale/Data/en_VI.xml | 10 + lib/zend/Zend/Locale/Data/en_ZA.xml | 152 + lib/zend/Zend/Locale/Data/en_ZW.xml | 145 + lib/zend/Zend/Locale/Data/eo.xml | 632 ++ lib/zend/Zend/Locale/Data/es.xml | 3715 ++++++++++ lib/zend/Zend/Locale/Data/es_AR.xml | 129 + lib/zend/Zend/Locale/Data/es_BO.xml | 10 + lib/zend/Zend/Locale/Data/es_CL.xml | 160 + lib/zend/Zend/Locale/Data/es_CO.xml | 128 + lib/zend/Zend/Locale/Data/es_CR.xml | 10 + lib/zend/Zend/Locale/Data/es_DO.xml | 16 + lib/zend/Zend/Locale/Data/es_EC.xml | 123 + lib/zend/Zend/Locale/Data/es_ES.xml | 10 + lib/zend/Zend/Locale/Data/es_GT.xml | 114 + lib/zend/Zend/Locale/Data/es_HN.xml | 114 + lib/zend/Zend/Locale/Data/es_MX.xml | 21 + lib/zend/Zend/Locale/Data/es_NI.xml | 16 + lib/zend/Zend/Locale/Data/es_PA.xml | 110 + lib/zend/Zend/Locale/Data/es_PE.xml | 111 + lib/zend/Zend/Locale/Data/es_PR.xml | 115 + lib/zend/Zend/Locale/Data/es_PY.xml | 19 + lib/zend/Zend/Locale/Data/es_SV.xml | 16 + lib/zend/Zend/Locale/Data/es_US.xml | 147 + lib/zend/Zend/Locale/Data/es_UY.xml | 24 + lib/zend/Zend/Locale/Data/es_VE.xml | 19 + lib/zend/Zend/Locale/Data/et.xml | 1984 ++++++ lib/zend/Zend/Locale/Data/et_EE.xml | 10 + lib/zend/Zend/Locale/Data/eu.xml | 1005 +++ lib/zend/Zend/Locale/Data/eu_ES.xml | 10 + lib/zend/Zend/Locale/Data/fa.xml | 3309 +++++++++ lib/zend/Zend/Locale/Data/fa_AF.xml | 305 + lib/zend/Zend/Locale/Data/fa_IR.xml | 10 + lib/zend/Zend/Locale/Data/fi.xml | 3830 +++++++++++ lib/zend/Zend/Locale/Data/fi_FI.xml | 10 + lib/zend/Zend/Locale/Data/fil.xml | 1010 +++ lib/zend/Zend/Locale/Data/fil_PH.xml | 10 + lib/zend/Zend/Locale/Data/fo.xml | 795 +++ lib/zend/Zend/Locale/Data/fo_FO.xml | 10 + lib/zend/Zend/Locale/Data/fr.xml | 5461 +++++++++++++++ lib/zend/Zend/Locale/Data/fr_BE.xml | 103 + lib/zend/Zend/Locale/Data/fr_CA.xml | 152 + lib/zend/Zend/Locale/Data/fr_CH.xml | 124 + lib/zend/Zend/Locale/Data/fr_FR.xml | 10 + lib/zend/Zend/Locale/Data/fr_LU.xml | 23 + lib/zend/Zend/Locale/Data/fr_MC.xml | 10 + lib/zend/Zend/Locale/Data/fr_SN.xml | 10 + lib/zend/Zend/Locale/Data/fur.xml | 1225 ++++ lib/zend/Zend/Locale/Data/fur_IT.xml | 10 + lib/zend/Zend/Locale/Data/ga.xml | 1504 +++++ lib/zend/Zend/Locale/Data/ga_IE.xml | 10 + lib/zend/Zend/Locale/Data/gaa.xml | 194 + lib/zend/Zend/Locale/Data/gaa_GH.xml | 10 + lib/zend/Zend/Locale/Data/gez.xml | 504 ++ lib/zend/Zend/Locale/Data/gez_ER.xml | 10 + lib/zend/Zend/Locale/Data/gez_ET.xml | 10 + lib/zend/Zend/Locale/Data/gl.xml | 1361 ++++ lib/zend/Zend/Locale/Data/gl_ES.xml | 10 + lib/zend/Zend/Locale/Data/gsw.xml | 2920 ++++++++ lib/zend/Zend/Locale/Data/gsw_CH.xml | 10 + lib/zend/Zend/Locale/Data/gu.xml | 1160 ++++ lib/zend/Zend/Locale/Data/gu_IN.xml | 10 + lib/zend/Zend/Locale/Data/gv.xml | 200 + lib/zend/Zend/Locale/Data/gv_GB.xml | 10 + lib/zend/Zend/Locale/Data/ha.xml | 371 + lib/zend/Zend/Locale/Data/ha_Arab.xml | 95 + lib/zend/Zend/Locale/Data/ha_Arab_NG.xml | 11 + lib/zend/Zend/Locale/Data/ha_Arab_SD.xml | 11 + lib/zend/Zend/Locale/Data/ha_GH.xml | 11 + lib/zend/Zend/Locale/Data/ha_Latn.xml | 10 + lib/zend/Zend/Locale/Data/ha_Latn_GH.xml | 11 + lib/zend/Zend/Locale/Data/ha_Latn_NE.xml | 11 + lib/zend/Zend/Locale/Data/ha_Latn_NG.xml | 11 + lib/zend/Zend/Locale/Data/ha_NE.xml | 11 + lib/zend/Zend/Locale/Data/ha_NG.xml | 11 + lib/zend/Zend/Locale/Data/ha_SD.xml | 11 + lib/zend/Zend/Locale/Data/haw.xml | 218 + lib/zend/Zend/Locale/Data/haw_US.xml | 10 + lib/zend/Zend/Locale/Data/he.xml | 2758 ++++++++ lib/zend/Zend/Locale/Data/he_IL.xml | 10 + lib/zend/Zend/Locale/Data/hi.xml | 3344 +++++++++ lib/zend/Zend/Locale/Data/hi_IN.xml | 10 + lib/zend/Zend/Locale/Data/hr.xml | 3705 ++++++++++ lib/zend/Zend/Locale/Data/hr_HR.xml | 10 + lib/zend/Zend/Locale/Data/hu.xml | 3746 +++++++++++ lib/zend/Zend/Locale/Data/hu_HU.xml | 10 + lib/zend/Zend/Locale/Data/hy.xml | 593 ++ lib/zend/Zend/Locale/Data/hy_AM.xml | 10 + lib/zend/Zend/Locale/Data/hy_AM_REVISED.xml | 40 + lib/zend/Zend/Locale/Data/ia.xml | 553 ++ lib/zend/Zend/Locale/Data/id.xml | 1334 ++++ lib/zend/Zend/Locale/Data/id_ID.xml | 10 + lib/zend/Zend/Locale/Data/ig.xml | 191 + lib/zend/Zend/Locale/Data/ig_NG.xml | 10 + lib/zend/Zend/Locale/Data/ii.xml | 254 + lib/zend/Zend/Locale/Data/ii_CN.xml | 10 + lib/zend/Zend/Locale/Data/in.xml | 10 + lib/zend/Zend/Locale/Data/is.xml | 2180 ++++++ lib/zend/Zend/Locale/Data/is_IS.xml | 10 + lib/zend/Zend/Locale/Data/it.xml | 3008 +++++++++ lib/zend/Zend/Locale/Data/it_CH.xml | 116 + lib/zend/Zend/Locale/Data/it_IT.xml | 10 + lib/zend/Zend/Locale/Data/iu.xml | 182 + lib/zend/Zend/Locale/Data/iw.xml | 10 + lib/zend/Zend/Locale/Data/ja.xml | 3799 +++++++++++ lib/zend/Zend/Locale/Data/ja_JP.xml | 10 + lib/zend/Zend/Locale/Data/ka.xml | 2157 ++++++ lib/zend/Zend/Locale/Data/ka_GE.xml | 10 + lib/zend/Zend/Locale/Data/kaj.xml | 189 + lib/zend/Zend/Locale/Data/kaj_NG.xml | 10 + lib/zend/Zend/Locale/Data/kam.xml | 188 + lib/zend/Zend/Locale/Data/kam_KE.xml | 10 + lib/zend/Zend/Locale/Data/kcg.xml | 189 + lib/zend/Zend/Locale/Data/kcg_NG.xml | 10 + lib/zend/Zend/Locale/Data/kfo.xml | 189 + lib/zend/Zend/Locale/Data/kfo_CI.xml | 10 + lib/zend/Zend/Locale/Data/kk.xml | 388 ++ lib/zend/Zend/Locale/Data/kk_Cyrl.xml | 10 + lib/zend/Zend/Locale/Data/kk_Cyrl_KZ.xml | 11 + lib/zend/Zend/Locale/Data/kk_KZ.xml | 11 + lib/zend/Zend/Locale/Data/kl.xml | 207 + lib/zend/Zend/Locale/Data/kl_GL.xml | 10 + lib/zend/Zend/Locale/Data/km.xml | 668 ++ lib/zend/Zend/Locale/Data/km_KH.xml | 10 + lib/zend/Zend/Locale/Data/kn.xml | 1157 ++++ lib/zend/Zend/Locale/Data/kn_IN.xml | 10 + lib/zend/Zend/Locale/Data/ko.xml | 3853 +++++++++++ lib/zend/Zend/Locale/Data/ko_KR.xml | 10 + lib/zend/Zend/Locale/Data/kok.xml | 363 + lib/zend/Zend/Locale/Data/kok_IN.xml | 10 + lib/zend/Zend/Locale/Data/kpe.xml | 184 + lib/zend/Zend/Locale/Data/kpe_GN.xml | 17 + lib/zend/Zend/Locale/Data/kpe_LR.xml | 10 + lib/zend/Zend/Locale/Data/ku.xml | 159 + lib/zend/Zend/Locale/Data/ku_Arab.xml | 10 + lib/zend/Zend/Locale/Data/ku_Arab_IQ.xml | 11 + lib/zend/Zend/Locale/Data/ku_Arab_IR.xml | 11 + lib/zend/Zend/Locale/Data/ku_Arab_SY.xml | 11 + lib/zend/Zend/Locale/Data/ku_IQ.xml | 11 + lib/zend/Zend/Locale/Data/ku_IR.xml | 11 + lib/zend/Zend/Locale/Data/ku_Latn.xml | 189 + lib/zend/Zend/Locale/Data/ku_Latn_TR.xml | 11 + lib/zend/Zend/Locale/Data/ku_SY.xml | 11 + lib/zend/Zend/Locale/Data/ku_TR.xml | 11 + lib/zend/Zend/Locale/Data/kw.xml | 200 + lib/zend/Zend/Locale/Data/kw_GB.xml | 10 + lib/zend/Zend/Locale/Data/ky.xml | 276 + lib/zend/Zend/Locale/Data/ky_KG.xml | 10 + lib/zend/Zend/Locale/Data/likelySubtags.xml | 463 ++ lib/zend/Zend/Locale/Data/ln.xml | 486 ++ lib/zend/Zend/Locale/Data/ln_CD.xml | 10 + lib/zend/Zend/Locale/Data/ln_CG.xml | 10 + lib/zend/Zend/Locale/Data/lo.xml | 624 ++ lib/zend/Zend/Locale/Data/lo_LA.xml | 10 + lib/zend/Zend/Locale/Data/lt.xml | 3328 +++++++++ lib/zend/Zend/Locale/Data/lt_LT.xml | 10 + lib/zend/Zend/Locale/Data/lv.xml | 2987 +++++++++ lib/zend/Zend/Locale/Data/lv_LV.xml | 10 + lib/zend/Zend/Locale/Data/metazoneInfo.xml | 1404 ++++ lib/zend/Zend/Locale/Data/mk.xml | 2322 +++++++ lib/zend/Zend/Locale/Data/mk_MK.xml | 10 + lib/zend/Zend/Locale/Data/ml.xml | 4424 ++++++++++++ lib/zend/Zend/Locale/Data/ml_IN.xml | 10 + lib/zend/Zend/Locale/Data/mn.xml | 316 + lib/zend/Zend/Locale/Data/mn_CN.xml | 11 + lib/zend/Zend/Locale/Data/mn_Cyrl.xml | 10 + lib/zend/Zend/Locale/Data/mn_Cyrl_MN.xml | 11 + lib/zend/Zend/Locale/Data/mn_MN.xml | 11 + lib/zend/Zend/Locale/Data/mn_Mong.xml | 17 + lib/zend/Zend/Locale/Data/mn_Mong_CN.xml | 11 + lib/zend/Zend/Locale/Data/mo.xml | 10 + lib/zend/Zend/Locale/Data/mr.xml | 1191 ++++ lib/zend/Zend/Locale/Data/mr_IN.xml | 10 + lib/zend/Zend/Locale/Data/ms.xml | 557 ++ lib/zend/Zend/Locale/Data/ms_BN.xml | 134 + lib/zend/Zend/Locale/Data/ms_MY.xml | 10 + lib/zend/Zend/Locale/Data/mt.xml | 1141 ++++ lib/zend/Zend/Locale/Data/mt_MT.xml | 10 + lib/zend/Zend/Locale/Data/my.xml | 1581 +++++ lib/zend/Zend/Locale/Data/my_MM.xml | 10 + lib/zend/Zend/Locale/Data/nb.xml | 3082 +++++++++ lib/zend/Zend/Locale/Data/nb_NO.xml | 10 + lib/zend/Zend/Locale/Data/nds.xml | 1149 ++++ lib/zend/Zend/Locale/Data/nds_DE.xml | 10 + lib/zend/Zend/Locale/Data/ne.xml | 1383 ++++ lib/zend/Zend/Locale/Data/ne_IN.xml | 10 + lib/zend/Zend/Locale/Data/ne_NP.xml | 10 + lib/zend/Zend/Locale/Data/nl.xml | 3798 +++++++++++ lib/zend/Zend/Locale/Data/nl_BE.xml | 80 + lib/zend/Zend/Locale/Data/nl_NL.xml | 10 + lib/zend/Zend/Locale/Data/nn.xml | 2825 ++++++++ lib/zend/Zend/Locale/Data/nn_NO.xml | 10 + lib/zend/Zend/Locale/Data/no.xml | 10 + lib/zend/Zend/Locale/Data/nr.xml | 227 + lib/zend/Zend/Locale/Data/nr_ZA.xml | 10 + lib/zend/Zend/Locale/Data/nso.xml | 229 + lib/zend/Zend/Locale/Data/nso_ZA.xml | 10 + .../Zend/Locale/Data/numberingSystems.xml | 42 + lib/zend/Zend/Locale/Data/ny.xml | 189 + lib/zend/Zend/Locale/Data/ny_MW.xml | 10 + lib/zend/Zend/Locale/Data/oc.xml | 280 + lib/zend/Zend/Locale/Data/oc_FR.xml | 10 + lib/zend/Zend/Locale/Data/om.xml | 328 + lib/zend/Zend/Locale/Data/om_ET.xml | 10 + lib/zend/Zend/Locale/Data/om_KE.xml | 10 + lib/zend/Zend/Locale/Data/or.xml | 1142 ++++ lib/zend/Zend/Locale/Data/or_IN.xml | 10 + lib/zend/Zend/Locale/Data/pa.xml | 310 + lib/zend/Zend/Locale/Data/pa_Arab.xml | 134 + lib/zend/Zend/Locale/Data/pa_Arab_PK.xml | 11 + lib/zend/Zend/Locale/Data/pa_Guru.xml | 10 + lib/zend/Zend/Locale/Data/pa_Guru_IN.xml | 11 + lib/zend/Zend/Locale/Data/pa_IN.xml | 11 + lib/zend/Zend/Locale/Data/pa_PK.xml | 11 + lib/zend/Zend/Locale/Data/pl.xml | 3096 +++++++++ lib/zend/Zend/Locale/Data/pl_PL.xml | 10 + lib/zend/Zend/Locale/Data/postalCodeData.xml | 166 + lib/zend/Zend/Locale/Data/ps.xml | 417 ++ lib/zend/Zend/Locale/Data/ps_AF.xml | 10 + lib/zend/Zend/Locale/Data/pt.xml | 4338 ++++++++++++ lib/zend/Zend/Locale/Data/pt_BR.xml | 10 + lib/zend/Zend/Locale/Data/pt_PT.xml | 1867 ++++++ lib/zend/Zend/Locale/Data/ro.xml | 2479 +++++++ lib/zend/Zend/Locale/Data/ro_MD.xml | 10 + lib/zend/Zend/Locale/Data/ro_RO.xml | 10 + lib/zend/Zend/Locale/Data/root.xml | 3208 +++++++++ lib/zend/Zend/Locale/Data/ru.xml | 3950 +++++++++++ lib/zend/Zend/Locale/Data/ru_RU.xml | 10 + lib/zend/Zend/Locale/Data/ru_UA.xml | 116 + lib/zend/Zend/Locale/Data/rw.xml | 306 + lib/zend/Zend/Locale/Data/rw_RW.xml | 10 + lib/zend/Zend/Locale/Data/sa.xml | 150 + lib/zend/Zend/Locale/Data/sa_IN.xml | 10 + lib/zend/Zend/Locale/Data/se.xml | 741 ++ lib/zend/Zend/Locale/Data/se_FI.xml | 247 + lib/zend/Zend/Locale/Data/se_NO.xml | 10 + lib/zend/Zend/Locale/Data/sh.xml | 10 + lib/zend/Zend/Locale/Data/sh_BA.xml | 11 + lib/zend/Zend/Locale/Data/sh_CS.xml | 11 + lib/zend/Zend/Locale/Data/sh_YU.xml | 11 + lib/zend/Zend/Locale/Data/si.xml | 242 + lib/zend/Zend/Locale/Data/si_LK.xml | 10 + lib/zend/Zend/Locale/Data/sid.xml | 248 + lib/zend/Zend/Locale/Data/sid_ET.xml | 10 + lib/zend/Zend/Locale/Data/sk.xml | 1901 ++++++ lib/zend/Zend/Locale/Data/sk_SK.xml | 10 + lib/zend/Zend/Locale/Data/sl.xml | 2544 +++++++ lib/zend/Zend/Locale/Data/sl_SI.xml | 10 + lib/zend/Zend/Locale/Data/so.xml | 560 ++ lib/zend/Zend/Locale/Data/so_DJ.xml | 10 + lib/zend/Zend/Locale/Data/so_ET.xml | 10 + lib/zend/Zend/Locale/Data/so_KE.xml | 10 + lib/zend/Zend/Locale/Data/so_SO.xml | 10 + lib/zend/Zend/Locale/Data/sq.xml | 656 ++ lib/zend/Zend/Locale/Data/sq_AL.xml | 10 + lib/zend/Zend/Locale/Data/sr.xml | 5950 +++++++++++++++++ lib/zend/Zend/Locale/Data/sr_BA.xml | 11 + lib/zend/Zend/Locale/Data/sr_CS.xml | 11 + lib/zend/Zend/Locale/Data/sr_Cyrl.xml | 10 + lib/zend/Zend/Locale/Data/sr_Cyrl_BA.xml | 103 + lib/zend/Zend/Locale/Data/sr_Cyrl_CS.xml | 12 + lib/zend/Zend/Locale/Data/sr_Cyrl_ME.xml | 11 + lib/zend/Zend/Locale/Data/sr_Cyrl_RS.xml | 11 + lib/zend/Zend/Locale/Data/sr_Cyrl_YU.xml | 12 + lib/zend/Zend/Locale/Data/sr_Latn.xml | 5490 +++++++++++++++ lib/zend/Zend/Locale/Data/sr_Latn_BA.xml | 11 + lib/zend/Zend/Locale/Data/sr_Latn_CS.xml | 12 + lib/zend/Zend/Locale/Data/sr_Latn_ME.xml | 62 + lib/zend/Zend/Locale/Data/sr_Latn_RS.xml | 11 + lib/zend/Zend/Locale/Data/sr_Latn_YU.xml | 12 + lib/zend/Zend/Locale/Data/sr_ME.xml | 11 + lib/zend/Zend/Locale/Data/sr_RS.xml | 11 + lib/zend/Zend/Locale/Data/sr_YU.xml | 11 + lib/zend/Zend/Locale/Data/ss.xml | 231 + lib/zend/Zend/Locale/Data/ss_SZ.xml | 11 + lib/zend/Zend/Locale/Data/ss_ZA.xml | 10 + lib/zend/Zend/Locale/Data/st.xml | 321 + lib/zend/Zend/Locale/Data/st_LS.xml | 17 + lib/zend/Zend/Locale/Data/st_ZA.xml | 10 + .../Zend/Locale/Data/supplementalData.xml | 5364 +++++++++++++++ lib/zend/Zend/Locale/Data/sv.xml | 4723 +++++++++++++ lib/zend/Zend/Locale/Data/sv_FI.xml | 48 + lib/zend/Zend/Locale/Data/sv_SE.xml | 10 + lib/zend/Zend/Locale/Data/sw.xml | 400 ++ lib/zend/Zend/Locale/Data/sw_KE.xml | 19 + lib/zend/Zend/Locale/Data/sw_TZ.xml | 10 + lib/zend/Zend/Locale/Data/syr.xml | 129 + lib/zend/Zend/Locale/Data/syr_SY.xml | 10 + lib/zend/Zend/Locale/Data/ta.xml | 1190 ++++ lib/zend/Zend/Locale/Data/ta_IN.xml | 10 + lib/zend/Zend/Locale/Data/te.xml | 1154 ++++ lib/zend/Zend/Locale/Data/te_IN.xml | 10 + .../Zend/Locale/Data/telephoneCodeData.xml | 747 +++ lib/zend/Zend/Locale/Data/tg.xml | 221 + lib/zend/Zend/Locale/Data/tg_Cyrl.xml | 10 + lib/zend/Zend/Locale/Data/tg_Cyrl_TJ.xml | 11 + lib/zend/Zend/Locale/Data/tg_TJ.xml | 11 + lib/zend/Zend/Locale/Data/th.xml | 4438 ++++++++++++ lib/zend/Zend/Locale/Data/th_TH.xml | 10 + lib/zend/Zend/Locale/Data/ti.xml | 326 + lib/zend/Zend/Locale/Data/ti_ER.xml | 124 + lib/zend/Zend/Locale/Data/ti_ET.xml | 10 + lib/zend/Zend/Locale/Data/tig.xml | 501 ++ lib/zend/Zend/Locale/Data/tig_ER.xml | 10 + lib/zend/Zend/Locale/Data/tl.xml | 10 + lib/zend/Zend/Locale/Data/tn.xml | 308 + lib/zend/Zend/Locale/Data/tn_ZA.xml | 10 + lib/zend/Zend/Locale/Data/to.xml | 611 ++ lib/zend/Zend/Locale/Data/to_TO.xml | 10 + lib/zend/Zend/Locale/Data/tr.xml | 3775 +++++++++++ lib/zend/Zend/Locale/Data/tr_TR.xml | 10 + lib/zend/Zend/Locale/Data/trv.xml | 561 ++ lib/zend/Zend/Locale/Data/trv_TW.xml | 10 + lib/zend/Zend/Locale/Data/ts.xml | 173 + lib/zend/Zend/Locale/Data/ts_ZA.xml | 10 + lib/zend/Zend/Locale/Data/tt.xml | 104 + lib/zend/Zend/Locale/Data/tt_RU.xml | 10 + lib/zend/Zend/Locale/Data/ug.xml | 36 + lib/zend/Zend/Locale/Data/ug_Arab.xml | 10 + lib/zend/Zend/Locale/Data/ug_Arab_CN.xml | 11 + lib/zend/Zend/Locale/Data/ug_CN.xml | 11 + lib/zend/Zend/Locale/Data/uk.xml | 3814 +++++++++++ lib/zend/Zend/Locale/Data/uk_UA.xml | 10 + lib/zend/Zend/Locale/Data/ur.xml | 1020 +++ lib/zend/Zend/Locale/Data/ur_IN.xml | 33 + lib/zend/Zend/Locale/Data/ur_PK.xml | 10 + lib/zend/Zend/Locale/Data/uz.xml | 235 + lib/zend/Zend/Locale/Data/uz_AF.xml | 11 + lib/zend/Zend/Locale/Data/uz_Arab.xml | 167 + lib/zend/Zend/Locale/Data/uz_Arab_AF.xml | 11 + lib/zend/Zend/Locale/Data/uz_Cyrl.xml | 10 + lib/zend/Zend/Locale/Data/uz_Cyrl_UZ.xml | 11 + lib/zend/Zend/Locale/Data/uz_Latn.xml | 172 + lib/zend/Zend/Locale/Data/uz_Latn_UZ.xml | 11 + lib/zend/Zend/Locale/Data/uz_UZ.xml | 11 + lib/zend/Zend/Locale/Data/ve.xml | 194 + lib/zend/Zend/Locale/Data/ve_ZA.xml | 10 + lib/zend/Zend/Locale/Data/vi.xml | 1057 +++ lib/zend/Zend/Locale/Data/vi_VN.xml | 10 + lib/zend/Zend/Locale/Data/wal.xml | 349 + lib/zend/Zend/Locale/Data/wal_ET.xml | 10 + lib/zend/Zend/Locale/Data/wo.xml | 37 + lib/zend/Zend/Locale/Data/wo_Latn.xml | 10 + lib/zend/Zend/Locale/Data/wo_Latn_SN.xml | 11 + lib/zend/Zend/Locale/Data/wo_SN.xml | 10 + lib/zend/Zend/Locale/Data/xh.xml | 261 + lib/zend/Zend/Locale/Data/xh_ZA.xml | 10 + lib/zend/Zend/Locale/Data/yo.xml | 230 + lib/zend/Zend/Locale/Data/yo_NG.xml | 10 + lib/zend/Zend/Locale/Data/zh.xml | 4438 ++++++++++++ lib/zend/Zend/Locale/Data/zh_CN.xml | 11 + lib/zend/Zend/Locale/Data/zh_HK.xml | 11 + lib/zend/Zend/Locale/Data/zh_Hans.xml | 10 + lib/zend/Zend/Locale/Data/zh_Hans_CN.xml | 11 + lib/zend/Zend/Locale/Data/zh_Hans_HK.xml | 18 + lib/zend/Zend/Locale/Data/zh_Hans_MO.xml | 11 + lib/zend/Zend/Locale/Data/zh_Hans_SG.xml | 88 + lib/zend/Zend/Locale/Data/zh_Hant.xml | 3664 ++++++++++ lib/zend/Zend/Locale/Data/zh_Hant_HK.xml | 191 + lib/zend/Zend/Locale/Data/zh_Hant_MO.xml | 117 + lib/zend/Zend/Locale/Data/zh_Hant_TW.xml | 11 + lib/zend/Zend/Locale/Data/zh_MO.xml | 11 + lib/zend/Zend/Locale/Data/zh_SG.xml | 11 + lib/zend/Zend/Locale/Data/zh_TW.xml | 11 + lib/zend/Zend/Locale/Data/zu.xml | 329 + lib/zend/Zend/Locale/Data/zu_ZA.xml | 10 + lib/zend/Zend/Locale/Exception.php | 37 + lib/zend/Zend/Locale/Format.php | 1251 ++++ lib/zend/Zend/Locale/Math.php | 312 + lib/zend/Zend/Locale/Math/Exception.php | 53 + lib/zend/Zend/Locale/Math/PhpMath.php | 247 + lib/zend/Zend/Log/Exception.php | 33 + lib/zend/Zend/Log/Filter/Interface.php | 41 + lib/zend/Zend/Log/Filter/Message.php | 67 + lib/zend/Zend/Log/Filter/Priority.php | 76 + lib/zend/Zend/Log/Filter/Suppress.php | 66 + lib/zend/Zend/Log/Formatter/Firebug.php | 50 + lib/zend/Zend/Log/Formatter/Interface.php | 41 + lib/zend/Zend/Log/Formatter/Simple.php | 85 + lib/zend/Zend/Log/Formatter/Xml.php | 90 + lib/zend/Zend/Log/Writer/Abstract.php | 107 + lib/zend/Zend/Log/Writer/Db.php | 113 + lib/zend/Zend/Log/Writer/Firebug.php | 188 + lib/zend/Zend/Log/Writer/Mail.php | 295 + lib/zend/Zend/Log/Writer/Mock.php | 66 + lib/zend/Zend/Log/Writer/Null.php | 46 + lib/zend/Zend/Log/Writer/Stream.php | 104 + lib/zend/Zend/Log/Writer/Syslog.php | 175 + lib/zend/Zend/Mail/Exception.php | 37 + lib/zend/Zend/Mail/Message.php | 112 + lib/zend/Zend/Mail/Message/File.php | 96 + lib/zend/Zend/Mail/Message/Interface.php | 55 + lib/zend/Zend/Mail/Part.php | 520 ++ lib/zend/Zend/Mail/Part/File.php | 198 + lib/zend/Zend/Mail/Part/Interface.php | 136 + lib/zend/Zend/Mail/Protocol/Abstract.php | 385 ++ lib/zend/Zend/Mail/Protocol/Exception.php | 39 + lib/zend/Zend/Mail/Protocol/Imap.php | 837 +++ lib/zend/Zend/Mail/Protocol/Pop3.php | 471 ++ lib/zend/Zend/Mail/Protocol/Smtp.php | 443 ++ .../Zend/Mail/Protocol/Smtp/Auth/Crammd5.php | 108 + .../Zend/Mail/Protocol/Smtp/Auth/Login.php | 98 + .../Zend/Mail/Protocol/Smtp/Auth/Plain.php | 96 + lib/zend/Zend/Mail/Storage.php | 39 + lib/zend/Zend/Mail/Storage/Abstract.php | 366 + lib/zend/Zend/Mail/Storage/Exception.php | 39 + lib/zend/Zend/Mail/Storage/Folder.php | 236 + .../Zend/Mail/Storage/Folder/Interface.php | 60 + lib/zend/Zend/Mail/Storage/Folder/Maildir.php | 265 + lib/zend/Zend/Mail/Storage/Folder/Mbox.php | 264 + lib/zend/Zend/Mail/Storage/Imap.php | 644 ++ lib/zend/Zend/Mail/Storage/Maildir.php | 475 ++ lib/zend/Zend/Mail/Storage/Mbox.php | 447 ++ lib/zend/Zend/Mail/Storage/Pop3.php | 328 + .../Zend/Mail/Storage/Writable/Interface.php | 108 + .../Zend/Mail/Storage/Writable/Maildir.php | 1049 +++ lib/zend/Zend/Mail/Transport/Abstract.php | 350 + lib/zend/Zend/Mail/Transport/Exception.php | 39 + lib/zend/Zend/Mail/Transport/Sendmail.php | 173 + lib/zend/Zend/Mail/Transport/Smtp.php | 239 + lib/zend/Zend/Measure/Abstract.php | 412 ++ lib/zend/Zend/Measure/Acceleration.php | 91 + lib/zend/Zend/Measure/Angle.php | 78 + lib/zend/Zend/Measure/Area.php | 310 + lib/zend/Zend/Measure/Binary.php | 122 + lib/zend/Zend/Measure/Capacitance.php | 98 + lib/zend/Zend/Measure/Cooking/Volume.php | 190 + lib/zend/Zend/Measure/Cooking/Weight.php | 70 + lib/zend/Zend/Measure/Current.php | 102 + lib/zend/Zend/Measure/Density.php | 206 + lib/zend/Zend/Measure/Energy.php | 252 + lib/zend/Zend/Measure/Exception.php | 37 + lib/zend/Zend/Measure/Flow/Mass.php | 122 + lib/zend/Zend/Measure/Flow/Mole.php | 90 + lib/zend/Zend/Measure/Flow/Volume.php | 402 ++ lib/zend/Zend/Measure/Force.php | 126 + lib/zend/Zend/Measure/Frequency.php | 86 + lib/zend/Zend/Measure/Illumination.php | 72 + lib/zend/Zend/Measure/Length.php | 674 ++ lib/zend/Zend/Measure/Lightness.php | 80 + lib/zend/Zend/Measure/Number.php | 420 ++ lib/zend/Zend/Measure/Power.php | 188 + lib/zend/Zend/Measure/Pressure.php | 250 + lib/zend/Zend/Measure/Speed.php | 190 + lib/zend/Zend/Measure/Temperature.php | 60 + lib/zend/Zend/Measure/Time.php | 117 + lib/zend/Zend/Measure/Torque.php | 82 + lib/zend/Zend/Measure/Viscosity/Dynamic.php | 120 + lib/zend/Zend/Measure/Viscosity/Kinematic.php | 106 + lib/zend/Zend/Measure/Volume.php | 213 + lib/zend/Zend/Measure/Weight.php | 480 ++ lib/zend/Zend/Memory/AccessController.php | 148 + lib/zend/Zend/Memory/Container.php | 34 + lib/zend/Zend/Memory/Container/Interface.php | 65 + lib/zend/Zend/Memory/Container/Locked.php | 112 + lib/zend/Zend/Memory/Container/Movable.php | 296 + lib/zend/Zend/Memory/Exception.php | 34 + lib/zend/Zend/Memory/Manager.php | 462 ++ lib/zend/Zend/Memory/Value.php | 176 + lib/zend/Zend/Mime/Decode.php | 244 + lib/zend/Zend/Mime/Exception.php | 5 +- lib/zend/Zend/Mime/Message.php | 8 +- lib/zend/Zend/Mime/Part.php | 19 +- lib/zend/Zend/Navigation/Container.php | 501 ++ lib/zend/Zend/Navigation/Exception.php | 38 + lib/zend/Zend/Navigation/Page.php | 1119 ++++ lib/zend/Zend/Navigation/Page/Mvc.php | 440 ++ lib/zend/Zend/Navigation/Page/Uri.php | 100 + lib/zend/Zend/OpenId/Consumer.php | 958 +++ lib/zend/Zend/OpenId/Consumer/Storage.php | 132 + .../Zend/OpenId/Consumer/Storage/File.php | 460 ++ lib/zend/Zend/OpenId/Exception.php | 58 + lib/zend/Zend/OpenId/Extension.php | 137 + lib/zend/Zend/OpenId/Extension/Sreg.php | 300 + lib/zend/Zend/OpenId/Provider.php | 781 +++ lib/zend/Zend/OpenId/Provider/Storage.php | 106 + .../Zend/OpenId/Provider/Storage/File.php | 397 ++ lib/zend/Zend/OpenId/Provider/User.php | 57 + .../Zend/OpenId/Provider/User/Session.php | 104 + lib/zend/Zend/Paginator/Adapter/Array.php | 81 + lib/zend/Zend/Paginator/Adapter/DbSelect.php | 262 + .../Zend/Paginator/Adapter/DbTableSelect.php | 48 + lib/zend/Zend/Paginator/Adapter/Interface.php | 47 + lib/zend/Zend/Paginator/Adapter/Iterator.php | 95 + lib/zend/Zend/Paginator/Adapter/Null.php | 73 + lib/zend/Zend/Paginator/AdapterAggregate.php | 40 + lib/zend/Zend/Paginator/Exception.php | 35 + .../Zend/Paginator/ScrollingStyle/All.php | 50 + .../Zend/Paginator/ScrollingStyle/Elastic.php | 61 + .../Paginator/ScrollingStyle/Interface.php | 38 + .../Zend/Paginator/ScrollingStyle/Jumping.php | 63 + .../Zend/Paginator/ScrollingStyle/Sliding.php | 78 + lib/zend/Zend/Pdf/Action.php | 398 ++ lib/zend/Zend/Pdf/Action/GoTo.php | 114 + lib/zend/Zend/Pdf/Action/GoTo3DView.php | 39 + lib/zend/Zend/Pdf/Action/GoToE.php | 38 + lib/zend/Zend/Pdf/Action/GoToR.php | 38 + lib/zend/Zend/Pdf/Action/Hide.php | 39 + lib/zend/Zend/Pdf/Action/ImportData.php | 39 + lib/zend/Zend/Pdf/Action/JavaScript.php | 39 + lib/zend/Zend/Pdf/Action/Launch.php | 38 + lib/zend/Zend/Pdf/Action/Movie.php | 38 + lib/zend/Zend/Pdf/Action/Named.php | 39 + lib/zend/Zend/Pdf/Action/Rendition.php | 39 + lib/zend/Zend/Pdf/Action/ResetForm.php | 39 + lib/zend/Zend/Pdf/Action/SetOCGState.php | 39 + lib/zend/Zend/Pdf/Action/Sound.php | 39 + lib/zend/Zend/Pdf/Action/SubmitForm.php | 39 + lib/zend/Zend/Pdf/Action/Thread.php | 38 + lib/zend/Zend/Pdf/Action/Trans.php | 39 + lib/zend/Zend/Pdf/Action/URI.php | 37 + lib/zend/Zend/Pdf/Action/Unknown.php | 38 + lib/zend/Zend/Pdf/Annotation.php | 230 + .../Zend/Pdf/Annotation/FileAttachment.php | 93 + lib/zend/Zend/Pdf/Annotation/Link.php | 156 + lib/zend/Zend/Pdf/Annotation/Text.php | 87 + lib/zend/Zend/Pdf/Cmap.php | 343 + lib/zend/Zend/Pdf/Cmap/ByteEncoding.php | 444 ++ .../Zend/Pdf/Cmap/ByteEncoding/Static.php | 61 + lib/zend/Zend/Pdf/Cmap/SegmentToDelta.php | 403 ++ lib/zend/Zend/Pdf/Cmap/TrimmedTable.php | 226 + lib/zend/Zend/Pdf/Color.php | 53 + lib/zend/Zend/Pdf/Color/Cmyk.php | 125 + lib/zend/Zend/Pdf/Color/GrayScale.php | 82 + lib/zend/Zend/Pdf/Color/Html.php | 414 ++ lib/zend/Zend/Pdf/Color/Rgb.php | 112 + lib/zend/Zend/Pdf/Destination.php | 113 + lib/zend/Zend/Pdf/Destination/Explicit.php | 121 + lib/zend/Zend/Pdf/Destination/Fit.php | 69 + .../Zend/Pdf/Destination/FitBoundingBox.php | 69 + .../FitBoundingBoxHorizontally.php | 92 + .../Destination/FitBoundingBoxVertically.php | 93 + .../Zend/Pdf/Destination/FitHorizontally.php | 92 + .../Zend/Pdf/Destination/FitRectangle.php | 165 + .../Zend/Pdf/Destination/FitVertically.php | 92 + lib/zend/Zend/Pdf/Destination/Named.php | 97 + lib/zend/Zend/Pdf/Destination/Unknown.php | 37 + lib/zend/Zend/Pdf/Destination/Zoom.php | 171 + lib/zend/Zend/Pdf/Element.php | 158 + lib/zend/Zend/Pdf/Element/Array.php | 146 + lib/zend/Zend/Pdf/Element/Boolean.php | 82 + lib/zend/Zend/Pdf/Element/Dictionary.php | 182 + lib/zend/Zend/Pdf/Element/Name.php | 160 + lib/zend/Zend/Pdf/Element/Null.php | 75 + lib/zend/Zend/Pdf/Element/Numeric.php | 95 + lib/zend/Zend/Pdf/Element/Object.php | 250 + lib/zend/Zend/Pdf/Element/Object/Stream.php | 410 ++ lib/zend/Zend/Pdf/Element/Reference.php | 280 + .../Zend/Pdf/Element/Reference/Context.php | 90 + lib/zend/Zend/Pdf/Element/Reference/Table.php | 194 + lib/zend/Zend/Pdf/Element/Stream.php | 125 + lib/zend/Zend/Pdf/Element/String.php | 247 + lib/zend/Zend/Pdf/Element/String/Binary.php | 111 + lib/zend/Zend/Pdf/ElementFactory.php | 475 ++ .../Zend/Pdf/ElementFactory/Interface.php | 152 + lib/zend/Zend/Pdf/ElementFactory/Proxy.php | 226 + lib/zend/Zend/Pdf/Exception.php | 343 + lib/zend/Zend/Pdf/FileParser.php | 485 ++ lib/zend/Zend/Pdf/FileParser/Font.php | 213 + .../Zend/Pdf/FileParser/Font/OpenType.php | 1111 +++ .../Pdf/FileParser/Font/OpenType/TrueType.php | 89 + lib/zend/Zend/Pdf/FileParser/Image.php | 59 + lib/zend/Zend/Pdf/FileParser/Image/Png.php | 326 + lib/zend/Zend/Pdf/FileParserDataSource.php | 204 + .../Zend/Pdf/FileParserDataSource/File.php | 190 + .../Zend/Pdf/FileParserDataSource/String.php | 128 + lib/zend/Zend/Pdf/Filter/Ascii85.php | 61 + lib/zend/Zend/Pdf/Filter/AsciiHex.php | 134 + lib/zend/Zend/Pdf/Filter/Compression.php | 382 ++ .../Zend/Pdf/Filter/Compression/Flate.php | 99 + lib/zend/Zend/Pdf/Filter/Compression/Lzw.php | 93 + lib/zend/Zend/Pdf/Filter/Interface.php | 50 + lib/zend/Zend/Pdf/Font.php | 777 +++ lib/zend/Zend/Pdf/Image.php | 246 + lib/zend/Zend/Pdf/NameTree.php | 154 + lib/zend/Zend/Pdf/Outline.php | 376 ++ lib/zend/Zend/Pdf/Outline/Created.php | 317 + lib/zend/Zend/Pdf/Outline/Loaded.php | 462 ++ lib/zend/Zend/Pdf/Page.php | 1646 +++++ lib/zend/Zend/Pdf/Parser.php | 483 ++ .../RecursivelyIteratableObjectsContainer.php | 45 + lib/zend/Zend/Pdf/Resource.php | 110 + lib/zend/Zend/Pdf/Resource/Font.php | 522 ++ lib/zend/Zend/Pdf/Resource/Font/CidFont.php | 484 ++ .../Pdf/Resource/Font/CidFont/TrueType.php | 83 + lib/zend/Zend/Pdf/Resource/Font/Extracted.php | 262 + .../Zend/Pdf/Resource/Font/FontDescriptor.php | 201 + lib/zend/Zend/Pdf/Resource/Font/Simple.php | 283 + .../Zend/Pdf/Resource/Font/Simple/Parsed.php | 103 + .../Resource/Font/Simple/Parsed/TrueType.php | 64 + .../Pdf/Resource/Font/Simple/Standard.php | 79 + .../Resource/Font/Simple/Standard/Courier.php | 291 + .../Font/Simple/Standard/CourierBold.php | 292 + .../Simple/Standard/CourierBoldOblique.php | 293 + .../Font/Simple/Standard/CourierOblique.php | 293 + .../Font/Simple/Standard/Helvetica.php | 301 + .../Font/Simple/Standard/HelveticaBold.php | 302 + .../Simple/Standard/HelveticaBoldOblique.php | 304 + .../Font/Simple/Standard/HelveticaOblique.php | 303 + .../Resource/Font/Simple/Standard/Symbol.php | 461 ++ .../Font/Simple/Standard/TimesBold.php | 300 + .../Font/Simple/Standard/TimesBoldItalic.php | 301 + .../Font/Simple/Standard/TimesItalic.php | 301 + .../Font/Simple/Standard/TimesRoman.php | 301 + .../Font/Simple/Standard/ZapfDingbats.php | 487 ++ lib/zend/Zend/Pdf/Resource/Font/Type0.php | 258 + lib/zend/Zend/Pdf/Resource/Image.php | 80 + lib/zend/Zend/Pdf/Resource/Image/Jpeg.php | 142 + lib/zend/Zend/Pdf/Resource/Image/Png.php | 365 + lib/zend/Zend/Pdf/Resource/Image/Tiff.php | 442 ++ lib/zend/Zend/Pdf/Resource/ImageFactory.php | 70 + lib/zend/Zend/Pdf/StringParser.php | 722 ++ lib/zend/Zend/Pdf/Style.php | 304 + lib/zend/Zend/Pdf/Target.php | 76 + lib/zend/Zend/Pdf/Trailer.php | 129 + lib/zend/Zend/Pdf/Trailer/Generator.php | 76 + lib/zend/Zend/Pdf/Trailer/Keeper.php | 147 + lib/zend/Zend/Pdf/UpdateInfoContainer.php | 139 + lib/zend/Zend/ProgressBar/Adapter.php | 113 + lib/zend/Zend/ProgressBar/Adapter/Console.php | 534 ++ .../Zend/ProgressBar/Adapter/Exception.php | 38 + lib/zend/Zend/ProgressBar/Adapter/JsPull.php | 117 + lib/zend/Zend/ProgressBar/Adapter/JsPush.php | 148 + lib/zend/Zend/ProgressBar/Exception.php | 38 + lib/zend/Zend/Queue/Adapter/Activemq.php | 333 + .../Zend/Queue/Adapter/AdapterAbstract.php | 191 + .../Zend/Queue/Adapter/AdapterInterface.php | 174 + lib/zend/Zend/Queue/Adapter/Array.php | 350 + lib/zend/Zend/Queue/Adapter/Db.php | 481 ++ lib/zend/Zend/Queue/Adapter/Db/Message.php | 51 + lib/zend/Zend/Queue/Adapter/Db/Queue.php | 51 + lib/zend/Zend/Queue/Adapter/Db/queue.sql | 75 + lib/zend/Zend/Queue/Adapter/Memcacheq.php | 405 ++ lib/zend/Zend/Queue/Adapter/Null.php | 174 + .../Zend/Queue/Adapter/PlatformJobQueue.php | 343 + lib/zend/Zend/Queue/Exception.php | 35 + lib/zend/Zend/Queue/Message.php | 230 + lib/zend/Zend/Queue/Message/Iterator.php | 285 + lib/zend/Zend/Queue/Message/PlatformJob.php | 194 + lib/zend/Zend/Queue/Stomp/Client.php | 173 + .../Zend/Queue/Stomp/Client/Connection.php | 280 + .../Stomp/Client/ConnectionInterface.php | 103 + lib/zend/Zend/Queue/Stomp/Frame.php | 363 + lib/zend/Zend/Queue/Stomp/FrameInterface.php | 154 + lib/zend/Zend/Reflection/Class.php | 247 + lib/zend/Zend/Reflection/Docblock.php | 282 + lib/zend/Zend/Reflection/Docblock/Tag.php | 142 + .../Zend/Reflection/Docblock/Tag/Param.php | 93 + .../Zend/Reflection/Docblock/Tag/Return.php | 72 + lib/zend/Zend/Reflection/Exception.php | 36 + lib/zend/Zend/Reflection/Extension.php | 85 + lib/zend/Zend/Reflection/File.php | 411 ++ lib/zend/Zend/Reflection/Function.php | 129 + lib/zend/Zend/Reflection/Method.php | 168 + lib/zend/Zend/Reflection/Parameter.php | 123 + lib/zend/Zend/Reflection/Property.php | 68 + lib/zend/Zend/Rest/Client.php | 9 +- lib/zend/Zend/Rest/Client/Exception.php | 5 +- lib/zend/Zend/Rest/Client/Result.php | 5 +- .../Zend/Rest/Client/Result/Exception.php | 13 +- lib/zend/Zend/Rest/Controller.php | 68 + lib/zend/Zend/Rest/Exception.php | 5 +- lib/zend/Zend/Rest/Route.php | 368 + lib/zend/Zend/Rest/Server.php | 34 +- lib/zend/Zend/Rest/Server/Exception.php | 6 +- lib/zend/Zend/Search/Exception.php | 37 + lib/zend/Zend/Search/Lucene.php | 1520 +++++ .../Zend/Search/Lucene/Analysis/Analyzer.php | 177 + .../Lucene/Analysis/Analyzer/Common.php | 81 + .../Lucene/Analysis/Analyzer/Common/Text.php | 96 + .../Analyzer/Common/Text/CaseInsensitive.php | 47 + .../Analysis/Analyzer/Common/TextNum.php | 95 + .../Common/TextNum/CaseInsensitive.php | 47 + .../Lucene/Analysis/Analyzer/Common/Utf8.php | 126 + .../Analyzer/Common/Utf8/CaseInsensitive.php | 49 + .../Analysis/Analyzer/Common/Utf8Num.php | 126 + .../Common/Utf8Num/CaseInsensitive.php | 49 + .../Zend/Search/Lucene/Analysis/Token.php | 154 + .../Search/Lucene/Analysis/TokenFilter.php | 48 + .../Lucene/Analysis/TokenFilter/LowerCase.php | 58 + .../Analysis/TokenFilter/LowerCaseUtf8.php | 70 + .../Analysis/TokenFilter/ShortWords.php | 69 + .../Lucene/Analysis/TokenFilter/StopWords.php | 101 + lib/zend/Zend/Search/Lucene/Document.php | 131 + lib/zend/Zend/Search/Lucene/Document/Docx.php | 144 + .../Zend/Search/Lucene/Document/Exception.php | 37 + lib/zend/Zend/Search/Lucene/Document/Html.php | 454 ++ .../Zend/Search/Lucene/Document/OpenXml.php | 132 + lib/zend/Zend/Search/Lucene/Document/Pptx.php | 193 + lib/zend/Zend/Search/Lucene/Document/Xlsx.php | 256 + lib/zend/Zend/Search/Lucene/Exception.php | 37 + lib/zend/Zend/Search/Lucene/FSM.php | 443 ++ lib/zend/Zend/Search/Lucene/FSMAction.php | 66 + lib/zend/Zend/Search/Lucene/Field.php | 226 + .../Search/Lucene/Index/DictionaryLoader.php | 268 + .../Zend/Search/Lucene/Index/DocsFilter.php | 59 + .../Zend/Search/Lucene/Index/FieldInfo.php | 50 + .../Zend/Search/Lucene/Index/SegmentInfo.php | 2117 ++++++ .../Search/Lucene/Index/SegmentMerger.php | 271 + .../Search/Lucene/Index/SegmentWriter.php | 627 ++ .../Index/SegmentWriter/DocumentWriter.php | 214 + .../Index/SegmentWriter/StreamWriter.php | 94 + lib/zend/Zend/Search/Lucene/Index/Term.php | 144 + .../Zend/Search/Lucene/Index/TermInfo.php | 80 + .../Lucene/Index/TermsPriorityQueue.php | 49 + .../Lucene/Index/TermsStream/Interface.php | 66 + lib/zend/Zend/Search/Lucene/Index/Writer.php | 842 +++ lib/zend/Zend/Search/Lucene/Interface.php | 404 ++ lib/zend/Zend/Search/Lucene/LockManager.php | 236 + lib/zend/Zend/Search/Lucene/MultiSearcher.php | 963 +++ lib/zend/Zend/Search/Lucene/PriorityQueue.php | 171 + lib/zend/Zend/Search/Lucene/Proxy.php | 612 ++ .../Search/BooleanExpressionRecognizer.php | 278 + .../Lucene/Search/Highlighter/Default.php | 94 + .../Lucene/Search/Highlighter/Interface.php | 53 + lib/zend/Zend/Search/Lucene/Search/Query.php | 234 + .../Search/Lucene/Search/Query/Boolean.php | 806 +++ .../Zend/Search/Lucene/Search/Query/Empty.php | 140 + .../Zend/Search/Lucene/Search/Query/Fuzzy.php | 488 ++ .../Lucene/Search/Query/Insignificant.php | 141 + .../Search/Lucene/Search/Query/MultiTerm.php | 661 ++ .../Search/Lucene/Search/Query/Phrase.php | 571 ++ .../Lucene/Search/Query/Preprocessing.php | 134 + .../Search/Query/Preprocessing/Fuzzy.php | 287 + .../Search/Query/Preprocessing/Phrase.php | 274 + .../Search/Query/Preprocessing/Term.php | 335 + .../Zend/Search/Lucene/Search/Query/Range.php | 374 ++ .../Zend/Search/Lucene/Search/Query/Term.php | 227 + .../Search/Lucene/Search/Query/Wildcard.php | 351 + .../Zend/Search/Lucene/Search/QueryEntry.php | 79 + .../Lucene/Search/QueryEntry/Phrase.php | 120 + .../Lucene/Search/QueryEntry/Subquery.php | 80 + .../Search/Lucene/Search/QueryEntry/Term.php | 130 + .../Zend/Search/Lucene/Search/QueryHit.php | 109 + .../Zend/Search/Lucene/Search/QueryLexer.php | 510 ++ .../Zend/Search/Lucene/Search/QueryParser.php | 636 ++ .../Lucene/Search/QueryParserContext.php | 418 ++ .../Lucene/Search/QueryParserException.php | 41 + .../Zend/Search/Lucene/Search/QueryToken.php | 225 + .../Zend/Search/Lucene/Search/Similarity.php | 554 ++ .../Lucene/Search/Similarity/Default.php | 110 + lib/zend/Zend/Search/Lucene/Search/Weight.php | 85 + .../Search/Lucene/Search/Weight/Boolean.php | 137 + .../Search/Lucene/Search/Weight/Empty.php | 57 + .../Search/Lucene/Search/Weight/MultiTerm.php | 138 + .../Search/Lucene/Search/Weight/Phrase.php | 108 + .../Zend/Search/Lucene/Search/Weight/Term.php | 125 + .../Zend/Search/Lucene/Storage/Directory.php | 136 + .../Lucene/Storage/Directory/Filesystem.php | 363 + lib/zend/Zend/Search/Lucene/Storage/File.php | 473 ++ .../Search/Lucene/Storage/File/Filesystem.php | 220 + .../Search/Lucene/Storage/File/Memory.php | 601 ++ .../Lucene/TermStreamsPriorityQueue.php | 176 + lib/zend/Zend/Server/Abstract.php | 6 +- lib/zend/Zend/Server/Cache.php | 4 +- lib/zend/Zend/Server/Definition.php | 4 +- lib/zend/Zend/Server/Exception.php | 2 +- lib/zend/Zend/Server/Interface.php | 4 +- lib/zend/Zend/Server/Method/Callback.php | 4 +- lib/zend/Zend/Server/Method/Definition.php | 4 +- lib/zend/Zend/Server/Method/Parameter.php | 4 +- lib/zend/Zend/Server/Method/Prototype.php | 4 +- lib/zend/Zend/Server/Reflection.php | 13 +- lib/zend/Zend/Server/Reflection/Class.php | 11 +- lib/zend/Zend/Server/Reflection/Exception.php | 10 +- lib/zend/Zend/Server/Reflection/Function.php | 4 +- .../Server/Reflection/Function/Abstract.php | 16 +- lib/zend/Zend/Server/Reflection/Method.php | 4 +- lib/zend/Zend/Server/Reflection/Node.php | 4 +- lib/zend/Zend/Server/Reflection/Parameter.php | 12 +- lib/zend/Zend/Server/Reflection/Prototype.php | 11 +- .../Zend/Server/Reflection/ReturnValue.php | 11 +- lib/zend/Zend/Service/Abstract.php | 4 +- lib/zend/Zend/Service/Akismet.php | 387 ++ lib/zend/Zend/Service/Amazon.php | 323 + lib/zend/Zend/Service/Amazon/Abstract.php | 167 + lib/zend/Zend/Service/Amazon/Accessories.php | 58 + .../Zend/Service/Amazon/CustomerReview.php | 86 + lib/zend/Zend/Service/Amazon/Ec2.php | 87 + lib/zend/Zend/Service/Amazon/Ec2/Abstract.php | 200 + .../Service/Amazon/Ec2/Availabilityzones.php | 73 + .../Zend/Service/Amazon/Ec2/CloudWatch.php | 350 + lib/zend/Zend/Service/Amazon/Ec2/Ebs.php | 340 + .../Zend/Service/Amazon/Ec2/Elasticip.php | 155 + .../Zend/Service/Amazon/Ec2/Exception.php | 48 + lib/zend/Zend/Service/Amazon/Ec2/Image.php | 330 + lib/zend/Zend/Service/Amazon/Ec2/Instance.php | 526 ++ .../Service/Amazon/Ec2/Instance/Reserved.php | 140 + .../Service/Amazon/Ec2/Instance/Windows.php | 192 + lib/zend/Zend/Service/Amazon/Ec2/Keypair.php | 134 + lib/zend/Zend/Service/Amazon/Ec2/Region.php | 73 + lib/zend/Zend/Service/Amazon/Ec2/Response.php | 160 + .../Service/Amazon/Ec2/Securitygroups.php | 298 + .../Zend/Service/Amazon/EditorialReview.php | 58 + lib/zend/Zend/Service/Amazon/Exception.php | 35 + lib/zend/Zend/Service/Amazon/Image.php | 69 + lib/zend/Zend/Service/Amazon/Item.php | 261 + .../Zend/Service/Amazon/ListmaniaList.php | 58 + lib/zend/Zend/Service/Amazon/Offer.php | 99 + lib/zend/Zend/Service/Amazon/OfferSet.php | 118 + lib/zend/Zend/Service/Amazon/Query.php | 98 + lib/zend/Zend/Service/Amazon/ResultSet.php | 170 + lib/zend/Zend/Service/Amazon/S3.php | 824 +++ lib/zend/Zend/Service/Amazon/S3/Exception.php | 37 + lib/zend/Zend/Service/Amazon/S3/Stream.php | 497 ++ .../Zend/Service/Amazon/SimilarProduct.php | 61 + lib/zend/Zend/Service/Amazon/Sqs.php | 436 ++ .../Zend/Service/Amazon/Sqs/Exception.php | 38 + lib/zend/Zend/Service/Audioscrobbler.php | 681 ++ lib/zend/Zend/Service/Delicious.php | 616 ++ lib/zend/Zend/Service/Delicious/Exception.php | 39 + lib/zend/Zend/Service/Delicious/Post.php | 292 + lib/zend/Zend/Service/Delicious/PostList.php | 300 + .../Zend/Service/Delicious/SimplePost.php | 123 + lib/zend/Zend/Service/Exception.php | 37 + lib/zend/Zend/Service/Flickr.php | 627 ++ lib/zend/Zend/Service/Flickr/Image.php | 76 + lib/zend/Zend/Service/Flickr/Result.php | 195 + lib/zend/Zend/Service/Flickr/ResultSet.php | 188 + lib/zend/Zend/Service/Nirvanix.php | 107 + lib/zend/Zend/Service/Nirvanix/Exception.php | 36 + .../Zend/Service/Nirvanix/Namespace/Base.php | 172 + .../Zend/Service/Nirvanix/Namespace/Imfs.php | 105 + lib/zend/Zend/Service/Nirvanix/Response.php | 123 + lib/zend/Zend/Service/ReCaptcha.php | 506 ++ lib/zend/Zend/Service/ReCaptcha/Exception.php | 36 + lib/zend/Zend/Service/ReCaptcha/MailHide.php | 300 + .../Service/ReCaptcha/MailHide/Exception.php | 36 + lib/zend/Zend/Service/ReCaptcha/Response.php | 159 + lib/zend/Zend/Service/Simpy.php | 435 ++ lib/zend/Zend/Service/Simpy/Link.php | 215 + lib/zend/Zend/Service/Simpy/LinkQuery.php | 200 + lib/zend/Zend/Service/Simpy/LinkSet.php | 83 + lib/zend/Zend/Service/Simpy/Note.php | 215 + lib/zend/Zend/Service/Simpy/NoteSet.php | 83 + lib/zend/Zend/Service/Simpy/Tag.php | 81 + lib/zend/Zend/Service/Simpy/TagSet.php | 83 + lib/zend/Zend/Service/Simpy/Watchlist.php | 191 + .../Zend/Service/Simpy/WatchlistFilter.php | 81 + .../Zend/Service/Simpy/WatchlistFilterSet.php | 77 + lib/zend/Zend/Service/Simpy/WatchlistSet.php | 82 + lib/zend/Zend/Service/SlideShare.php | 619 ++ .../Zend/Service/SlideShare/Exception.php | 38 + .../Zend/Service/SlideShare/SlideShow.php | 437 ++ lib/zend/Zend/Service/StrikeIron.php | 92 + lib/zend/Zend/Service/StrikeIron/Base.php | 274 + .../Zend/Service/StrikeIron/Decorator.php | 143 + .../Zend/Service/StrikeIron/Exception.php | 36 + .../Service/StrikeIron/SalesUseTaxBasic.php | 45 + .../StrikeIron/USAddressVerification.php | 45 + .../Zend/Service/StrikeIron/ZipCodeInfo.php | 45 + lib/zend/Zend/Service/Technorati.php | 1028 +++ lib/zend/Zend/Service/Technorati/Author.php | 242 + .../Service/Technorati/BlogInfoResult.php | 161 + .../Zend/Service/Technorati/CosmosResult.php | 152 + .../Service/Technorati/CosmosResultSet.php | 176 + .../Service/Technorati/DailyCountsResult.php | 93 + .../Technorati/DailyCountsResultSet.php | 125 + .../Zend/Service/Technorati/Exception.php | 39 + .../Zend/Service/Technorati/GetInfoResult.php | 103 + .../Zend/Service/Technorati/KeyInfoResult.php | 118 + lib/zend/Zend/Service/Technorati/Result.php | 121 + .../Zend/Service/Technorati/ResultSet.php | 290 + .../Zend/Service/Technorati/SearchResult.php | 150 + .../Service/Technorati/SearchResultSet.php | 79 + .../Zend/Service/Technorati/TagResult.php | 171 + .../Zend/Service/Technorati/TagResultSet.php | 110 + .../Zend/Service/Technorati/TagsResult.php | 93 + .../Zend/Service/Technorati/TagsResultSet.php | 67 + lib/zend/Zend/Service/Technorati/Utils.php | 136 + lib/zend/Zend/Service/Technorati/Weblog.php | 486 ++ lib/zend/Zend/Service/Twitter.php | 979 +++ lib/zend/Zend/Service/Twitter/Exception.php | 37 + lib/zend/Zend/Service/Twitter/Search.php | 180 + lib/zend/Zend/Service/Yahoo.php | 954 +++ lib/zend/Zend/Service/Yahoo/Image.php | 71 + lib/zend/Zend/Service/Yahoo/ImageResult.php | 111 + .../Zend/Service/Yahoo/ImageResultSet.php | 63 + .../Zend/Service/Yahoo/InlinkDataResult.php | 58 + .../Service/Yahoo/InlinkDataResultSet.php | 62 + lib/zend/Zend/Service/Yahoo/LocalResult.php | 124 + .../Zend/Service/Yahoo/LocalResultSet.php | 84 + lib/zend/Zend/Service/Yahoo/NewsResult.php | 112 + lib/zend/Zend/Service/Yahoo/NewsResultSet.php | 63 + .../Zend/Service/Yahoo/PageDataResult.php | 58 + .../Zend/Service/Yahoo/PageDataResultSet.php | 62 + lib/zend/Zend/Service/Yahoo/Result.php | 126 + lib/zend/Zend/Service/Yahoo/ResultSet.php | 195 + lib/zend/Zend/Service/Yahoo/VideoResult.php | 132 + .../Zend/Service/Yahoo/VideoResultSet.php | 63 + lib/zend/Zend/Service/Yahoo/WebResult.php | 109 + lib/zend/Zend/Service/Yahoo/WebResultSet.php | 63 + lib/zend/Zend/Session/Abstract.php | 185 + lib/zend/Zend/Session/Exception.php | 74 + lib/zend/Zend/Session/Namespace.php | 517 ++ lib/zend/Zend/Session/SaveHandler/DbTable.php | 591 ++ .../Zend/Session/SaveHandler/Exception.php | 37 + .../Zend/Session/SaveHandler/Interface.php | 81 + lib/zend/Zend/Session/Validator/Abstract.php | 69 + .../Zend/Session/Validator/HttpUserAgent.php | 66 + lib/zend/Zend/Session/Validator/Interface.php | 52 + lib/zend/Zend/Soap/AutoDiscover.php | 287 +- lib/zend/Zend/Soap/AutoDiscover/Exception.php | 12 +- lib/zend/Zend/Soap/Client.php | 255 +- lib/zend/Zend/Soap/Client/Common.php | 5 +- lib/zend/Zend/Soap/Client/DotNet.php | 23 +- lib/zend/Zend/Soap/Client/Exception.php | 6 +- lib/zend/Zend/Soap/Client/Local.php | 10 +- lib/zend/Zend/Soap/Server.php | 119 +- lib/zend/Zend/Soap/Server/Exception.php | 6 +- lib/zend/Zend/Soap/Wsdl.php | 107 +- lib/zend/Zend/Soap/Wsdl/CodeGenerator.php | 127 - lib/zend/Zend/Soap/Wsdl/Exception.php | 2 +- lib/zend/Zend/Soap/Wsdl/Parser.php | 173 - lib/zend/Zend/Soap/Wsdl/Strategy/Abstract.php | 36 + lib/zend/Zend/Soap/Wsdl/Strategy/AnyType.php | 4 +- .../Soap/Wsdl/Strategy/ArrayOfTypeComplex.php | 11 +- .../Wsdl/Strategy/ArrayOfTypeSequence.php | 29 +- .../Zend/Soap/Wsdl/Strategy/Composite.php | 176 + .../Soap/Wsdl/Strategy/DefaultComplexType.php | 6 +- .../Zend/Soap/Wsdl/Strategy/Interface.php | 7 +- lib/zend/Zend/Tag/Cloud.php | 410 ++ lib/zend/Zend/Tag/Cloud/Decorator/Cloud.php | 88 + .../Zend/Tag/Cloud/Decorator/Exception.php | 39 + .../Zend/Tag/Cloud/Decorator/HtmlCloud.php | 127 + lib/zend/Zend/Tag/Cloud/Decorator/HtmlTag.php | 278 + lib/zend/Zend/Tag/Cloud/Decorator/Tag.php | 88 + lib/zend/Zend/Tag/Cloud/Exception.php | 38 + lib/zend/Zend/Tag/Exception.php | 38 + lib/zend/Zend/Tag/Item.php | 220 + lib/zend/Zend/Tag/ItemList.php | 238 + lib/zend/Zend/Tag/Taggable.php | 60 + lib/zend/Zend/Test/DbAdapter.php | 333 + lib/zend/Zend/Test/DbStatement.php | 401 ++ .../Zend/Test/PHPUnit/Constraint/DomQuery.php | 403 ++ .../Test/PHPUnit/Constraint/Exception.php | 36 + .../Zend/Test/PHPUnit/Constraint/Redirect.php | 280 + .../PHPUnit/Constraint/ResponseHeader.php | 398 ++ .../Zend/Test/PHPUnit/ControllerTestCase.php | 1143 ++++ .../Zend/Test/PHPUnit/DatabaseTestCase.php | 151 + lib/zend/Zend/Test/PHPUnit/Db/Connection.php | 149 + .../Zend/Test/PHPUnit/Db/DataSet/DbRowset.php | 75 + .../Zend/Test/PHPUnit/Db/DataSet/DbTable.php | 123 + .../PHPUnit/Db/DataSet/DbTableDataSet.php | 103 + .../Test/PHPUnit/Db/DataSet/QueryDataSet.php | 86 + .../Test/PHPUnit/Db/DataSet/QueryTable.php | 86 + lib/zend/Zend/Test/PHPUnit/Db/Exception.php | 41 + .../Zend/Test/PHPUnit/Db/Metadata/Generic.php | 164 + .../Test/PHPUnit/Db/Operation/DeleteAll.php | 69 + .../Zend/Test/PHPUnit/Db/Operation/Insert.php | 92 + .../Test/PHPUnit/Db/Operation/Truncate.php | 114 + .../Zend/Test/PHPUnit/Db/SimpleTester.php | 95 + lib/zend/Zend/Text/Exception.php | 38 + lib/zend/Zend/Text/Figlet.php | 1232 ++++ lib/zend/Zend/Text/Figlet/Exception.php | 38 + lib/zend/Zend/Text/Figlet/zend-framework.flf | 753 +++ lib/zend/Zend/Text/MultiByte.php | 153 + lib/zend/Zend/Text/Table.php | 532 ++ lib/zend/Zend/Text/Table/Column.php | 243 + lib/zend/Zend/Text/Table/Decorator/Ascii.php | 147 + .../Zend/Text/Table/Decorator/Interface.php | 108 + .../Zend/Text/Table/Decorator/Unicode.php | 176 + lib/zend/Zend/Text/Table/Exception.php | 38 + lib/zend/Zend/Text/Table/Row.php | 215 + lib/zend/Zend/TimeSync/Exception.php | 64 + lib/zend/Zend/TimeSync/Ntp.php | 400 ++ lib/zend/Zend/TimeSync/Protocol.php | 148 + lib/zend/Zend/TimeSync/Sntp.php | 119 + lib/zend/Zend/Tool/Framework/Action/Base.php | 95 + .../Zend/Tool/Framework/Action/Exception.php | 37 + .../Zend/Tool/Framework/Action/Interface.php | 32 + .../Zend/Tool/Framework/Action/Repository.php | 135 + .../Zend/Tool/Framework/Client/Abstract.php | 317 + .../Zend/Tool/Framework/Client/Config.php | 105 + .../Zend/Tool/Framework/Client/Console.php | 294 + .../Client/Console/ArgumentParser.php | 503 ++ .../Framework/Client/Console/HelpSystem.php | 375 ++ .../Framework/Client/Console/Manifest.php | 209 + .../Console/ResponseDecorator/Colorizer.php | 92 + .../Zend/Tool/Framework/Client/Exception.php | 36 + .../Client/Interactive/InputHandler.php | 74 + .../Client/Interactive/InputInterface.php | 41 + .../Client/Interactive/InputRequest.php | 54 + .../Client/Interactive/InputResponse.php | 52 + .../Client/Interactive/OutputInterface.php | 33 + .../Zend/Tool/Framework/Client/Request.php | 299 + .../Zend/Tool/Framework/Client/Response.php | 223 + .../Response/ContentDecorator/Interface.php | 35 + .../Response/ContentDecorator/Separator.php | 93 + .../Zend/Tool/Framework/Client/Storage.php | 117 + .../Client/Storage/AdapterInterface.php | 42 + .../Framework/Client/Storage/Directory.php | 73 + lib/zend/Zend/Tool/Framework/Exception.php | 36 + .../Zend/Tool/Framework/Loader/Abstract.php | 146 + .../Framework/Loader/IncludePathLoader.php | 115 + .../RecursiveFilterIterator.php | 91 + .../Framework/Manifest/ActionManifestable.php | 47 + .../Tool/Framework/Manifest/Exception.php | 37 + .../Tool/Framework/Manifest/Indexable.php | 42 + .../Tool/Framework/Manifest/Interface.php | 82 + .../Manifest/MetadataManifestable.php | 47 + .../Manifest/ProviderManifestable.php | 47 + .../Tool/Framework/Manifest/Repository.php | 300 + .../Zend/Tool/Framework/Metadata/Basic.php | 221 + .../Zend/Tool/Framework/Metadata/Dynamic.php | 154 + .../Tool/Framework/Metadata/Interface.php | 52 + .../Zend/Tool/Framework/Metadata/Tool.php | 218 + .../Zend/Tool/Framework/Provider/Abstract.php | 68 + .../Provider/DocblockManifestable.php | 30 + .../Tool/Framework/Provider/Exception.php | 37 + .../Tool/Framework/Provider/Interactable.php | 30 + .../Tool/Framework/Provider/Interface.php | 31 + .../Tool/Framework/Provider/Pretendable.php | 31 + .../Tool/Framework/Provider/Repository.php | 265 + .../Tool/Framework/Provider/Signature.php | 390 ++ lib/zend/Zend/Tool/Framework/Registry.php | 419 ++ .../Framework/Registry/EnabledInterface.php | 40 + .../Tool/Framework/Registry/Exception.php | 33 + .../Tool/Framework/Registry/Interface.php | 137 + .../Tool/Framework/System/Action/Create.php | 44 + .../Tool/Framework/System/Action/Delete.php | 44 + .../Zend/Tool/Framework/System/Manifest.php | 61 + .../Framework/System/Provider/Manifest.php | 114 + .../Framework/System/Provider/Phpinfo.php | 38 + .../Framework/System/Provider/Version.php | 111 + .../Tool/Project/Context/Content/Engine.php | 106 + .../Context/Content/Engine/CodeGenerator.php | 98 + .../Project/Context/Content/Engine/Phtml.php | 89 + .../Zend/Tool/Project/Context/Exception.php | 33 + .../Project/Context/Filesystem/Abstract.php | 165 + .../Project/Context/Filesystem/Directory.php | 77 + .../Tool/Project/Context/Filesystem/File.php | 112 + .../Zend/Tool/Project/Context/Interface.php | 38 + .../Zend/Tool/Project/Context/Repository.php | 185 + .../Tool/Project/Context/System/Interface.php | 37 + .../Context/System/NotOverwritable.php | 37 + .../Context/System/ProjectDirectory.php | 128 + .../Context/System/ProjectProfileFile.php | 118 + .../System/ProjectProvidersDirectory.php | 97 + .../Context/System/TopLevelRestrictable.php | 37 + .../Tool/Project/Context/Zf/ActionMethod.php | 224 + .../Tool/Project/Context/Zf/ApisDirectory.php | 57 + .../Context/Zf/ApplicationConfigFile.php | 108 + .../Context/Zf/ApplicationDirectory.php | 49 + .../Tool/Project/Context/Zf/BootstrapFile.php | 103 + .../Project/Context/Zf/CacheDirectory.php | 57 + .../Tool/Project/Context/Zf/ConfigFile.php | 67 + .../Project/Context/Zf/ConfigsDirectory.php | 57 + .../Project/Context/Zf/ControllerFile.php | 206 + .../Context/Zf/ControllersDirectory.php | 57 + .../Tool/Project/Context/Zf/DataDirectory.php | 57 + .../Project/Context/Zf/DbTableDirectory.php | 57 + .../Tool/Project/Context/Zf/DbTableFile.php | 72 + .../Zend/Tool/Project/Context/Zf/FormFile.php | 52 + .../Project/Context/Zf/FormsDirectory.php | 57 + .../Tool/Project/Context/Zf/HtaccessFile.php | 78 + .../Project/Context/Zf/LayoutsDirectory.php | 57 + .../Project/Context/Zf/LibraryDirectory.php | 57 + .../Project/Context/Zf/LocalesDirectory.php | 57 + .../Tool/Project/Context/Zf/LogsDirectory.php | 57 + .../Tool/Project/Context/Zf/ModelFile.php | 52 + .../Project/Context/Zf/ModelsDirectory.php | 57 + .../Project/Context/Zf/ModuleDirectory.php | 97 + .../Project/Context/Zf/ModulesDirectory.php | 57 + .../Context/Zf/ProjectProviderFile.php | 152 + .../Project/Context/Zf/PublicDirectory.php | 57 + .../Context/Zf/PublicImagesDirectory.php | 57 + .../Project/Context/Zf/PublicIndexFile.php | 95 + .../Context/Zf/PublicScriptsDirectory.php | 57 + .../Context/Zf/PublicStylesheetsDirectory.php | 57 + .../Context/Zf/SearchIndexesDirectory.php | 57 + .../Project/Context/Zf/SessionsDirectory.php | 57 + .../Project/Context/Zf/TemporaryDirectory.php | 57 + .../Zf/TestApplicationBootstrapFile.php | 57 + .../Zf/TestApplicationControllerDirectory.php | 57 + .../Zf/TestApplicationControllerFile.php | 107 + .../Context/Zf/TestApplicationDirectory.php | 57 + .../Context/Zf/TestLibraryBootstrapFile.php | 57 + .../Context/Zf/TestLibraryDirectory.php | 57 + .../Project/Context/Zf/TestLibraryFile.php | 107 + .../Zf/TestLibraryNamespaceDirectory.php | 88 + .../Context/Zf/TestPHPUnitConfigFile.php | 57 + .../Project/Context/Zf/TestsDirectory.php | 57 + .../Project/Context/Zf/UploadsDirectory.php | 57 + .../Zf/ViewControllerScriptsDirectory.php | 87 + .../Context/Zf/ViewFiltersDirectory.php | 57 + .../Context/Zf/ViewHelpersDirectory.php | 57 + .../Project/Context/Zf/ViewScriptFile.php | 204 + .../Context/Zf/ViewScriptsDirectory.php | 57 + .../Project/Context/Zf/ViewsDirectory.php | 57 + .../Context/Zf/ZfStandardLibraryDirectory.php | 104 + lib/zend/Zend/Tool/Project/Exception.php | 37 + lib/zend/Zend/Tool/Project/Profile.php | 242 + .../Zend/Tool/Project/Profile/Exception.php | 37 + .../Project/Profile/FileParser/Interface.php | 54 + .../Tool/Project/Profile/FileParser/Xml.php | 223 + .../Profile/Iterator/ContextFilter.php | 203 + .../Iterator/EnabledResourceFilter.php | 43 + .../Zend/Tool/Project/Profile/Resource.php | 262 + .../Project/Profile/Resource/Container.php | 405 ++ .../Profile/Resource/SearchConstraints.php | 117 + .../Zend/Tool/Project/Provider/Abstract.php | 238 + .../Zend/Tool/Project/Provider/Action.php | 168 + .../Zend/Tool/Project/Provider/Controller.php | 199 + .../Zend/Tool/Project/Provider/Exception.php | 37 + lib/zend/Zend/Tool/Project/Provider/Form.php | 38 + .../Zend/Tool/Project/Provider/Manifest.php | 90 + lib/zend/Zend/Tool/Project/Provider/Model.php | 43 + .../Zend/Tool/Project/Provider/Module.php | 165 + .../Zend/Tool/Project/Provider/Profile.php | 54 + .../Zend/Tool/Project/Provider/Project.php | 180 + .../Tool/Project/Provider/ProjectProvider.php | 97 + lib/zend/Zend/Tool/Project/Provider/Test.php | 174 + lib/zend/Zend/Tool/Project/Provider/View.php | 118 + lib/zend/Zend/Translate/Adapter.php | 761 +++ lib/zend/Zend/Translate/Adapter/Array.php | 94 + lib/zend/Zend/Translate/Adapter/Csv.php | 104 + lib/zend/Zend/Translate/Adapter/Gettext.php | 178 + lib/zend/Zend/Translate/Adapter/Ini.php | 87 + lib/zend/Zend/Translate/Adapter/Qt.php | 175 + lib/zend/Zend/Translate/Adapter/Tbx.php | 179 + lib/zend/Zend/Translate/Adapter/Tmx.php | 181 + lib/zend/Zend/Translate/Adapter/Xliff.php | 220 + lib/zend/Zend/Translate/Adapter/XmlTm.php | 154 + lib/zend/Zend/Translate/Exception.php | 37 + lib/zend/Zend/Translate/Plural.php | 177 + lib/zend/Zend/Uri/Exception.php | 37 + lib/zend/Zend/Uri/Http.php | 57 +- lib/zend/Zend/Validate/Abstract.php | 130 +- lib/zend/Zend/Validate/Alnum.php | 138 + lib/zend/Zend/Validate/Alpha.php | 138 + lib/zend/Zend/Validate/Barcode.php | 95 + lib/zend/Zend/Validate/Barcode/Ean13.php | 110 + lib/zend/Zend/Validate/Barcode/UpcA.php | 103 + lib/zend/Zend/Validate/Between.php | 200 + lib/zend/Zend/Validate/Ccnum.php | 111 + lib/zend/Zend/Validate/Date.php | 238 + lib/zend/Zend/Validate/Db/Abstract.php | 148 + lib/zend/Zend/Validate/Db/NoRecordExists.php | 52 + lib/zend/Zend/Validate/Db/RecordExists.php | 53 + lib/zend/Zend/Validate/Digits.php | 95 + lib/zend/Zend/Validate/EmailAddress.php | 264 + lib/zend/Zend/Validate/Exception.php | 37 + lib/zend/Zend/Validate/File/Count.php | 275 + lib/zend/Zend/Validate/File/Crc32.php | 179 + .../Zend/Validate/File/ExcludeExtension.php | 94 + .../Zend/Validate/File/ExcludeMimeType.php | 109 + lib/zend/Zend/Validate/File/Exists.php | 203 + lib/zend/Zend/Validate/File/Extension.php | 234 + lib/zend/Zend/Validate/File/FilesSize.php | 163 + lib/zend/Zend/Validate/File/Hash.php | 196 + lib/zend/Zend/Validate/File/ImageSize.php | 366 + lib/zend/Zend/Validate/File/IsCompressed.php | 86 + lib/zend/Zend/Validate/File/IsImage.php | 90 + lib/zend/Zend/Validate/File/Md5.php | 183 + lib/zend/Zend/Validate/File/MimeType.php | 350 + lib/zend/Zend/Validate/File/NotExists.php | 84 + lib/zend/Zend/Validate/File/Sha1.php | 181 + lib/zend/Zend/Validate/File/Size.php | 405 ++ lib/zend/Zend/Validate/File/Upload.php | 245 + lib/zend/Zend/Validate/File/WordCount.php | 101 + lib/zend/Zend/Validate/Float.php | 126 + lib/zend/Zend/Validate/GreaterThan.php | 114 + lib/zend/Zend/Validate/Hex.php | 75 + lib/zend/Zend/Validate/Hostname.php | 454 +- lib/zend/Zend/Validate/Hostname/Biz.php | 2917 ++++++++ lib/zend/Zend/Validate/Hostname/Cn.php | 2199 ++++++ lib/zend/Zend/Validate/Hostname/Com.php | 198 + lib/zend/Zend/Validate/Hostname/Jp.php | 739 ++ lib/zend/Zend/Validate/Iban.php | 202 + lib/zend/Zend/Validate/Identical.php | 125 + lib/zend/Zend/Validate/InArray.php | 138 + lib/zend/Zend/Validate/Int.php | 126 + lib/zend/Zend/Validate/Interface.php | 4 +- lib/zend/Zend/Validate/Ip.php | 28 +- lib/zend/Zend/Validate/LessThan.php | 113 + lib/zend/Zend/Validate/NotEmpty.php | 79 + lib/zend/Zend/Validate/Regex.php | 126 + lib/zend/Zend/Validate/Sitemap/Changefreq.php | 89 + lib/zend/Zend/Validate/Sitemap/Lastmod.php | 81 + lib/zend/Zend/Validate/Sitemap/Loc.php | 79 + lib/zend/Zend/Validate/Sitemap/Priority.php | 75 + lib/zend/Zend/Validate/StringLength.php | 229 + lib/zend/Zend/View/Abstract.php | 1136 ++++ lib/zend/Zend/View/Exception.php | 51 + lib/zend/Zend/View/Helper/Abstract.php | 64 + lib/zend/Zend/View/Helper/Action.php | 160 + lib/zend/Zend/View/Helper/BaseUrl.php | 116 + lib/zend/Zend/View/Helper/Cycle.php | 226 + lib/zend/Zend/View/Helper/DeclareVars.php | 95 + lib/zend/Zend/View/Helper/Doctype.php | 195 + lib/zend/Zend/View/Helper/Fieldset.php | 79 + lib/zend/Zend/View/Helper/Form.php | 71 + lib/zend/Zend/View/Helper/FormButton.php | 105 + lib/zend/Zend/View/Helper/FormCheckbox.php | 163 + lib/zend/Zend/View/Helper/FormElement.php | 202 + lib/zend/Zend/View/Helper/FormErrors.php | 157 + lib/zend/Zend/View/Helper/FormFile.php | 81 + lib/zend/Zend/View/Helper/FormHidden.php | 66 + lib/zend/Zend/View/Helper/FormImage.php | 101 + lib/zend/Zend/View/Helper/FormLabel.php | 66 + .../Zend/View/Helper/FormMultiCheckbox.php | 74 + lib/zend/Zend/View/Helper/FormNote.php | 61 + lib/zend/Zend/View/Helper/FormPassword.php | 95 + lib/zend/Zend/View/Helper/FormRadio.php | 183 + lib/zend/Zend/View/Helper/FormReset.php | 88 + lib/zend/Zend/View/Helper/FormSelect.php | 178 + lib/zend/Zend/View/Helper/FormSubmit.php | 84 + lib/zend/Zend/View/Helper/FormText.php | 84 + lib/zend/Zend/View/Helper/FormTextarea.php | 104 + lib/zend/Zend/View/Helper/HeadLink.php | 425 ++ lib/zend/Zend/View/Helper/HeadMeta.php | 363 + lib/zend/Zend/View/Helper/HeadScript.php | 479 ++ lib/zend/Zend/View/Helper/HeadStyle.php | 400 ++ lib/zend/Zend/View/Helper/HeadTitle.php | 178 + lib/zend/Zend/View/Helper/HtmlElement.php | 141 + lib/zend/Zend/View/Helper/HtmlFlash.php | 60 + lib/zend/Zend/View/Helper/HtmlList.php | 88 + lib/zend/Zend/View/Helper/HtmlObject.php | 80 + lib/zend/Zend/View/Helper/HtmlPage.php | 75 + lib/zend/Zend/View/Helper/HtmlQuicktime.php | 82 + lib/zend/Zend/View/Helper/InlineScript.php | 61 + lib/zend/Zend/View/Helper/Interface.php | 46 + lib/zend/Zend/View/Helper/Json.php | 80 + lib/zend/Zend/View/Helper/Layout.php | 81 + lib/zend/Zend/View/Helper/Navigation.php | 336 + .../View/Helper/Navigation/Breadcrumbs.php | 325 + .../Zend/View/Helper/Navigation/Helper.php | 212 + .../View/Helper/Navigation/HelperAbstract.php | 851 +++ .../Zend/View/Helper/Navigation/Links.php | 779 +++ lib/zend/Zend/View/Helper/Navigation/Menu.php | 641 ++ .../Zend/View/Helper/Navigation/Sitemap.php | 470 ++ .../Zend/View/Helper/PaginationControl.php | 141 + lib/zend/Zend/View/Helper/Partial.php | 147 + .../Zend/View/Helper/Partial/Exception.php | 39 + lib/zend/Zend/View/Helper/PartialLoop.php | 96 + lib/zend/Zend/View/Helper/Placeholder.php | 87 + .../View/Helper/Placeholder/Container.php | 36 + .../Helper/Placeholder/Container/Abstract.php | 376 ++ .../Placeholder/Container/Exception.php | 39 + .../Placeholder/Container/Standalone.php | 319 + .../Zend/View/Helper/Placeholder/Registry.php | 186 + .../Helper/Placeholder/Registry/Exception.php | 39 + .../Zend/View/Helper/RenderToPlaceholder.php | 53 + lib/zend/Zend/View/Helper/ServerUrl.php | 144 + lib/zend/Zend/View/Helper/Translate.php | 178 + lib/zend/Zend/View/Helper/Url.php | 51 + lib/zend/Zend/View/Interface.php | 137 + lib/zend/Zend/View/Stream.php | 183 + .../Zend/Wildfire/Channel/HttpHeaders.php | 336 + lib/zend/Zend/Wildfire/Channel/Interface.php | 38 + lib/zend/Zend/Wildfire/Exception.php | 35 + lib/zend/Zend/Wildfire/Plugin/FirePhp.php | 800 +++ .../Zend/Wildfire/Plugin/FirePhp/Message.php | 246 + .../Wildfire/Plugin/FirePhp/TableMessage.php | 165 + lib/zend/Zend/Wildfire/Plugin/Interface.php | 48 + .../Zend/Wildfire/Protocol/JsonStream.php | 235 + lib/zend/Zend/XmlRpc/Client.php | 64 +- lib/zend/Zend/XmlRpc/Client/Exception.php | 5 +- .../Zend/XmlRpc/Client/FaultException.php | 5 +- lib/zend/Zend/XmlRpc/Client/HttpException.php | 5 +- .../XmlRpc/Client/IntrospectException.php | 5 +- .../XmlRpc/Client/ServerIntrospection.php | 13 +- lib/zend/Zend/XmlRpc/Client/ServerProxy.php | 5 +- lib/zend/Zend/XmlRpc/Exception.php | 5 +- lib/zend/Zend/XmlRpc/Fault.php | 15 +- lib/zend/Zend/XmlRpc/Request.php | 13 +- lib/zend/Zend/XmlRpc/Request/Http.php | 17 +- lib/zend/Zend/XmlRpc/Request/Stdin.php | 4 +- lib/zend/Zend/XmlRpc/Response.php | 4 +- lib/zend/Zend/XmlRpc/Response/Http.php | 4 +- lib/zend/Zend/XmlRpc/Server.php | 91 +- lib/zend/Zend/XmlRpc/Server/Cache.php | 4 +- lib/zend/Zend/XmlRpc/Server/Exception.php | 4 +- lib/zend/Zend/XmlRpc/Server/Fault.php | 4 +- lib/zend/Zend/XmlRpc/Server/System.php | 27 +- lib/zend/Zend/XmlRpc/Value.php | 213 +- lib/zend/Zend/XmlRpc/Value/Array.php | 4 +- lib/zend/Zend/XmlRpc/Value/Base64.php | 6 +- lib/zend/Zend/XmlRpc/Value/BigInteger.php | 65 + lib/zend/Zend/XmlRpc/Value/Boolean.php | 4 +- lib/zend/Zend/XmlRpc/Value/Collection.php | 10 +- lib/zend/Zend/XmlRpc/Value/DateTime.php | 22 +- lib/zend/Zend/XmlRpc/Value/Double.php | 10 +- lib/zend/Zend/XmlRpc/Value/Exception.php | 4 +- lib/zend/Zend/XmlRpc/Value/Integer.php | 11 +- lib/zend/Zend/XmlRpc/Value/Nil.php | 23 +- lib/zend/Zend/XmlRpc/Value/Scalar.php | 5 +- lib/zend/Zend/XmlRpc/Value/String.php | 20 +- lib/zend/Zend/XmlRpc/Value/Struct.php | 6 +- 2298 files changed, 556392 insertions(+), 2385 deletions(-) create mode 100644 lib/zend/Zend/Acl/Assert/Interface.php create mode 100644 lib/zend/Zend/Acl/Exception.php create mode 100644 lib/zend/Zend/Acl/Resource.php create mode 100644 lib/zend/Zend/Acl/Resource/Interface.php create mode 100644 lib/zend/Zend/Acl/Role.php create mode 100644 lib/zend/Zend/Acl/Role/Interface.php create mode 100644 lib/zend/Zend/Acl/Role/Registry.php create mode 100644 lib/zend/Zend/Acl/Role/Registry/Exception.php create mode 100755 lib/zend/Zend/Amf/Adobe/Auth.php create mode 100755 lib/zend/Zend/Amf/Adobe/DbInspector.php create mode 100755 lib/zend/Zend/Amf/Adobe/Introspector.php create mode 100755 lib/zend/Zend/Amf/Auth/Abstract.php create mode 100755 lib/zend/Zend/Amf/Parse/Resource/MysqlResult.php create mode 100644 lib/zend/Zend/Amf/Parse/Resource/MysqliResult.php create mode 100755 lib/zend/Zend/Amf/Parse/Resource/Stream.php create mode 100755 lib/zend/Zend/Amf/Value/Messaging/ArrayCollection.php create mode 100644 lib/zend/Zend/Application/Bootstrap/Bootstrap.php create mode 100644 lib/zend/Zend/Application/Bootstrap/BootstrapAbstract.php create mode 100644 lib/zend/Zend/Application/Bootstrap/Bootstrapper.php create mode 100644 lib/zend/Zend/Application/Bootstrap/Exception.php create mode 100644 lib/zend/Zend/Application/Bootstrap/ResourceBootstrapper.php create mode 100644 lib/zend/Zend/Application/Exception.php create mode 100644 lib/zend/Zend/Application/Module/Autoloader.php create mode 100644 lib/zend/Zend/Application/Module/Bootstrap.php create mode 100644 lib/zend/Zend/Application/Resource/Db.php create mode 100644 lib/zend/Zend/Application/Resource/Exception.php create mode 100644 lib/zend/Zend/Application/Resource/Frontcontroller.php create mode 100644 lib/zend/Zend/Application/Resource/Layout.php create mode 100644 lib/zend/Zend/Application/Resource/Locale.php create mode 100644 lib/zend/Zend/Application/Resource/Modules.php create mode 100644 lib/zend/Zend/Application/Resource/Navigation.php create mode 100644 lib/zend/Zend/Application/Resource/Resource.php create mode 100644 lib/zend/Zend/Application/Resource/ResourceAbstract.php create mode 100644 lib/zend/Zend/Application/Resource/Router.php create mode 100644 lib/zend/Zend/Application/Resource/Session.php create mode 100644 lib/zend/Zend/Application/Resource/Translate.php create mode 100644 lib/zend/Zend/Application/Resource/View.php create mode 100644 lib/zend/Zend/Auth/Adapter/DbTable.php create mode 100644 lib/zend/Zend/Auth/Adapter/Digest.php create mode 100644 lib/zend/Zend/Auth/Adapter/Exception.php create mode 100644 lib/zend/Zend/Auth/Adapter/Http.php create mode 100644 lib/zend/Zend/Auth/Adapter/Http/Resolver/Exception.php create mode 100644 lib/zend/Zend/Auth/Adapter/Http/Resolver/File.php create mode 100644 lib/zend/Zend/Auth/Adapter/Http/Resolver/Interface.php create mode 100644 lib/zend/Zend/Auth/Adapter/InfoCard.php create mode 100644 lib/zend/Zend/Auth/Adapter/Interface.php create mode 100644 lib/zend/Zend/Auth/Adapter/Ldap.php create mode 100644 lib/zend/Zend/Auth/Adapter/OpenId.php create mode 100644 lib/zend/Zend/Auth/Exception.php create mode 100644 lib/zend/Zend/Auth/Result.php create mode 100644 lib/zend/Zend/Auth/Storage/Exception.php create mode 100644 lib/zend/Zend/Auth/Storage/Interface.php create mode 100644 lib/zend/Zend/Auth/Storage/NonPersistent.php create mode 100644 lib/zend/Zend/Auth/Storage/Session.php create mode 100644 lib/zend/Zend/Cache/Backend.php create mode 100644 lib/zend/Zend/Cache/Backend/Apc.php create mode 100644 lib/zend/Zend/Cache/Backend/ExtendedInterface.php create mode 100644 lib/zend/Zend/Cache/Backend/File.php create mode 100644 lib/zend/Zend/Cache/Backend/Interface.php create mode 100644 lib/zend/Zend/Cache/Backend/Memcached.php create mode 100644 lib/zend/Zend/Cache/Backend/Sqlite.php create mode 100644 lib/zend/Zend/Cache/Backend/Test.php create mode 100644 lib/zend/Zend/Cache/Backend/TwoLevels.php create mode 100644 lib/zend/Zend/Cache/Backend/Xcache.php create mode 100644 lib/zend/Zend/Cache/Backend/ZendPlatform.php create mode 100755 lib/zend/Zend/Cache/Backend/ZendServer.php create mode 100755 lib/zend/Zend/Cache/Backend/ZendServer/Disk.php create mode 100755 lib/zend/Zend/Cache/Backend/ZendServer/ShMem.php create mode 100644 lib/zend/Zend/Cache/Core.php create mode 100644 lib/zend/Zend/Cache/Exception.php create mode 100644 lib/zend/Zend/Cache/Frontend/Class.php create mode 100644 lib/zend/Zend/Cache/Frontend/File.php create mode 100644 lib/zend/Zend/Cache/Frontend/Function.php create mode 100644 lib/zend/Zend/Cache/Frontend/Output.php create mode 100644 lib/zend/Zend/Cache/Frontend/Page.php create mode 100644 lib/zend/Zend/Captcha/Adapter.php create mode 100644 lib/zend/Zend/Captcha/Base.php create mode 100644 lib/zend/Zend/Captcha/Dumb.php create mode 100755 lib/zend/Zend/Captcha/Exception.php create mode 100644 lib/zend/Zend/Captcha/Figlet.php create mode 100644 lib/zend/Zend/Captcha/Image.php create mode 100644 lib/zend/Zend/Captcha/ReCaptcha.php create mode 100644 lib/zend/Zend/Captcha/Word.php create mode 100644 lib/zend/Zend/CodeGenerator/Abstract.php create mode 100644 lib/zend/Zend/CodeGenerator/Exception.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Abstract.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Body.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Class.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Docblock.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Docblock/Tag.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/License.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/Param.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/Return.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Exception.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/File.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Member/Abstract.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Member/Container.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Method.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Parameter.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Parameter/DefaultValue.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Property.php create mode 100644 lib/zend/Zend/CodeGenerator/Php/Property/DefaultValue.php create mode 100644 lib/zend/Zend/Config/Exception.php create mode 100644 lib/zend/Zend/Config/Ini.php create mode 100644 lib/zend/Zend/Config/Writer.php create mode 100644 lib/zend/Zend/Config/Writer/Array.php create mode 100644 lib/zend/Zend/Config/Writer/Ini.php create mode 100644 lib/zend/Zend/Config/Writer/Xml.php create mode 100644 lib/zend/Zend/Config/Xml.php create mode 100644 lib/zend/Zend/Console/Getopt.php create mode 100644 lib/zend/Zend/Console/Getopt/Exception.php create mode 100644 lib/zend/Zend/Controller/Action.php create mode 100644 lib/zend/Zend/Controller/Action/Exception.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/Abstract.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/ActionStack.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/AjaxContext.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/AutoComplete/Abstract.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/AutoCompleteDojo.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/ContextSwitch.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/FlashMessenger.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/Json.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/Redirector.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/Url.php create mode 100644 lib/zend/Zend/Controller/Action/Helper/ViewRenderer.php create mode 100644 lib/zend/Zend/Controller/Action/HelperBroker.php create mode 100644 lib/zend/Zend/Controller/Action/HelperBroker/PriorityStack.php create mode 100644 lib/zend/Zend/Controller/Action/Interface.php create mode 100644 lib/zend/Zend/Controller/Dispatcher/Abstract.php create mode 100644 lib/zend/Zend/Controller/Dispatcher/Exception.php create mode 100644 lib/zend/Zend/Controller/Dispatcher/Interface.php create mode 100644 lib/zend/Zend/Controller/Dispatcher/Standard.php create mode 100644 lib/zend/Zend/Controller/Exception.php create mode 100644 lib/zend/Zend/Controller/Front.php create mode 100644 lib/zend/Zend/Controller/Plugin/Abstract.php create mode 100644 lib/zend/Zend/Controller/Plugin/ActionStack.php create mode 100644 lib/zend/Zend/Controller/Plugin/Broker.php create mode 100644 lib/zend/Zend/Controller/Plugin/ErrorHandler.php create mode 100644 lib/zend/Zend/Controller/Plugin/PutHandler.php create mode 100644 lib/zend/Zend/Controller/Request/Abstract.php create mode 100644 lib/zend/Zend/Controller/Request/Apache404.php create mode 100644 lib/zend/Zend/Controller/Request/Exception.php create mode 100644 lib/zend/Zend/Controller/Request/Http.php create mode 100644 lib/zend/Zend/Controller/Request/HttpTestCase.php create mode 100644 lib/zend/Zend/Controller/Request/Simple.php create mode 100644 lib/zend/Zend/Controller/Response/Abstract.php create mode 100644 lib/zend/Zend/Controller/Response/Cli.php create mode 100644 lib/zend/Zend/Controller/Response/Exception.php create mode 100644 lib/zend/Zend/Controller/Response/Http.php create mode 100644 lib/zend/Zend/Controller/Response/HttpTestCase.php create mode 100644 lib/zend/Zend/Controller/Router/Abstract.php create mode 100644 lib/zend/Zend/Controller/Router/Exception.php create mode 100644 lib/zend/Zend/Controller/Router/Interface.php create mode 100644 lib/zend/Zend/Controller/Router/Rewrite.php create mode 100644 lib/zend/Zend/Controller/Router/Route.php create mode 100644 lib/zend/Zend/Controller/Router/Route/Abstract.php create mode 100644 lib/zend/Zend/Controller/Router/Route/Chain.php create mode 100644 lib/zend/Zend/Controller/Router/Route/Hostname.php create mode 100644 lib/zend/Zend/Controller/Router/Route/Interface.php create mode 100644 lib/zend/Zend/Controller/Router/Route/Module.php create mode 100644 lib/zend/Zend/Controller/Router/Route/Regex.php create mode 100644 lib/zend/Zend/Controller/Router/Route/Static.php create mode 100644 lib/zend/Zend/Crypt/DiffieHellman.php create mode 100644 lib/zend/Zend/Crypt/DiffieHellman/Exception.php create mode 100644 lib/zend/Zend/Crypt/Exception.php create mode 100644 lib/zend/Zend/Crypt/Hmac.php create mode 100644 lib/zend/Zend/Crypt/Hmac/Exception.php create mode 100644 lib/zend/Zend/Crypt/Math.php create mode 100644 lib/zend/Zend/Crypt/Math/BigInteger.php create mode 100644 lib/zend/Zend/Crypt/Math/BigInteger/Bcmath.php create mode 100644 lib/zend/Zend/Crypt/Math/BigInteger/Exception.php create mode 100644 lib/zend/Zend/Crypt/Math/BigInteger/Gmp.php create mode 100644 lib/zend/Zend/Crypt/Math/BigInteger/Interface.php create mode 100644 lib/zend/Zend/Crypt/Math/Exception.php create mode 100644 lib/zend/Zend/Crypt/Rsa.php create mode 100644 lib/zend/Zend/Crypt/Rsa/Key.php create mode 100644 lib/zend/Zend/Crypt/Rsa/Key/Private.php create mode 100644 lib/zend/Zend/Crypt/Rsa/Key/Public.php create mode 100644 lib/zend/Zend/Currency/Exception.php create mode 100644 lib/zend/Zend/Db/Adapter/Abstract.php create mode 100644 lib/zend/Zend/Db/Adapter/Db2.php create mode 100644 lib/zend/Zend/Db/Adapter/Db2/Exception.php create mode 100644 lib/zend/Zend/Db/Adapter/Exception.php create mode 100644 lib/zend/Zend/Db/Adapter/Mysqli.php create mode 100644 lib/zend/Zend/Db/Adapter/Mysqli/Exception.php create mode 100644 lib/zend/Zend/Db/Adapter/Oracle.php create mode 100644 lib/zend/Zend/Db/Adapter/Oracle/Exception.php create mode 100644 lib/zend/Zend/Db/Adapter/Pdo/Abstract.php create mode 100644 lib/zend/Zend/Db/Adapter/Pdo/Ibm.php create mode 100644 lib/zend/Zend/Db/Adapter/Pdo/Ibm/Db2.php create mode 100644 lib/zend/Zend/Db/Adapter/Pdo/Ibm/Ids.php create mode 100644 lib/zend/Zend/Db/Adapter/Pdo/Mssql.php create mode 100644 lib/zend/Zend/Db/Adapter/Pdo/Mysql.php create mode 100644 lib/zend/Zend/Db/Adapter/Pdo/Oci.php create mode 100644 lib/zend/Zend/Db/Adapter/Pdo/Pgsql.php create mode 100644 lib/zend/Zend/Db/Adapter/Pdo/Sqlite.php create mode 100644 lib/zend/Zend/Db/Adapter/Sqlsrv.php create mode 100644 lib/zend/Zend/Db/Adapter/Sqlsrv/Exception.php create mode 100644 lib/zend/Zend/Db/Exception.php create mode 100644 lib/zend/Zend/Db/Expr.php create mode 100644 lib/zend/Zend/Db/Profiler.php create mode 100644 lib/zend/Zend/Db/Profiler/Exception.php create mode 100644 lib/zend/Zend/Db/Profiler/Firebug.php create mode 100644 lib/zend/Zend/Db/Profiler/Query.php create mode 100644 lib/zend/Zend/Db/Select.php create mode 100644 lib/zend/Zend/Db/Select/Exception.php create mode 100644 lib/zend/Zend/Db/Statement.php create mode 100644 lib/zend/Zend/Db/Statement/Db2.php create mode 100644 lib/zend/Zend/Db/Statement/Db2/Exception.php create mode 100644 lib/zend/Zend/Db/Statement/Exception.php create mode 100644 lib/zend/Zend/Db/Statement/Interface.php create mode 100644 lib/zend/Zend/Db/Statement/Mysqli.php create mode 100644 lib/zend/Zend/Db/Statement/Mysqli/Exception.php create mode 100644 lib/zend/Zend/Db/Statement/Oracle.php create mode 100644 lib/zend/Zend/Db/Statement/Oracle/Exception.php create mode 100644 lib/zend/Zend/Db/Statement/Pdo.php create mode 100644 lib/zend/Zend/Db/Statement/Pdo/Ibm.php create mode 100644 lib/zend/Zend/Db/Statement/Pdo/Oci.php create mode 100644 lib/zend/Zend/Db/Statement/Sqlsrv.php create mode 100644 lib/zend/Zend/Db/Statement/Sqlsrv/Exception.php create mode 100644 lib/zend/Zend/Db/Table.php create mode 100644 lib/zend/Zend/Db/Table/Abstract.php create mode 100644 lib/zend/Zend/Db/Table/Definition.php create mode 100644 lib/zend/Zend/Db/Table/Exception.php create mode 100644 lib/zend/Zend/Db/Table/Row.php create mode 100644 lib/zend/Zend/Db/Table/Row/Abstract.php create mode 100644 lib/zend/Zend/Db/Table/Row/Exception.php create mode 100644 lib/zend/Zend/Db/Table/Rowset.php create mode 100644 lib/zend/Zend/Db/Table/Rowset/Abstract.php create mode 100644 lib/zend/Zend/Db/Table/Rowset/Exception.php create mode 100644 lib/zend/Zend/Db/Table/Select.php create mode 100644 lib/zend/Zend/Db/Table/Select/Exception.php create mode 100644 lib/zend/Zend/Dojo/BuildLayer.php create mode 100644 lib/zend/Zend/Dojo/Data.php create mode 100644 lib/zend/Zend/Dojo/Exception.php create mode 100644 lib/zend/Zend/Dojo/Form.php create mode 100644 lib/zend/Zend/Dojo/Form/Decorator/AccordionContainer.php create mode 100644 lib/zend/Zend/Dojo/Form/Decorator/AccordionPane.php create mode 100644 lib/zend/Zend/Dojo/Form/Decorator/BorderContainer.php create mode 100644 lib/zend/Zend/Dojo/Form/Decorator/ContentPane.php create mode 100644 lib/zend/Zend/Dojo/Form/Decorator/DijitContainer.php create mode 100644 lib/zend/Zend/Dojo/Form/Decorator/DijitElement.php create mode 100644 lib/zend/Zend/Dojo/Form/Decorator/DijitForm.php create mode 100644 lib/zend/Zend/Dojo/Form/Decorator/SplitContainer.php create mode 100644 lib/zend/Zend/Dojo/Form/Decorator/StackContainer.php create mode 100644 lib/zend/Zend/Dojo/Form/Decorator/TabContainer.php create mode 100644 lib/zend/Zend/Dojo/Form/DisplayGroup.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/Button.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/CheckBox.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/ComboBox.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/CurrencyTextBox.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/DateTextBox.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/Dijit.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/DijitMulti.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/Editor.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/FilteringSelect.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/HorizontalSlider.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/NumberSpinner.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/NumberTextBox.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/PasswordTextBox.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/RadioButton.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/SimpleTextarea.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/Slider.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/SubmitButton.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/TextBox.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/Textarea.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/TimeTextBox.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/ValidationTextBox.php create mode 100644 lib/zend/Zend/Dojo/Form/Element/VerticalSlider.php create mode 100644 lib/zend/Zend/Dojo/Form/SubForm.php create mode 100644 lib/zend/Zend/Dojo/View/Exception.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/AccordionContainer.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/AccordionPane.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/BorderContainer.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/Button.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/CheckBox.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/ComboBox.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/ContentPane.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/CurrencyTextBox.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/CustomDijit.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/DateTextBox.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/Dijit.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/DijitContainer.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/Dojo.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/Dojo/Container.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/Editor.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/FilteringSelect.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/Form.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/HorizontalSlider.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/NumberSpinner.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/NumberTextBox.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/PasswordTextBox.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/RadioButton.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/SimpleTextarea.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/Slider.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/SplitContainer.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/StackContainer.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/SubmitButton.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/TabContainer.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/TextBox.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/Textarea.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/TimeTextBox.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/ValidationTextBox.php create mode 100644 lib/zend/Zend/Dojo/View/Helper/VerticalSlider.php create mode 100644 lib/zend/Zend/Dom/Exception.php create mode 100644 lib/zend/Zend/Dom/Query.php create mode 100644 lib/zend/Zend/Dom/Query/Css2Xpath.php create mode 100644 lib/zend/Zend/Dom/Query/Result.php create mode 100644 lib/zend/Zend/Feed/Abstract.php create mode 100644 lib/zend/Zend/Feed/Atom.php create mode 100644 lib/zend/Zend/Feed/Builder.php create mode 100644 lib/zend/Zend/Feed/Builder/Entry.php create mode 100644 lib/zend/Zend/Feed/Builder/Exception.php create mode 100644 lib/zend/Zend/Feed/Builder/Header.php create mode 100644 lib/zend/Zend/Feed/Builder/Header/Itunes.php create mode 100644 lib/zend/Zend/Feed/Builder/Interface.php create mode 100644 lib/zend/Zend/Feed/Element.php create mode 100644 lib/zend/Zend/Feed/Entry/Abstract.php create mode 100644 lib/zend/Zend/Feed/Entry/Atom.php create mode 100644 lib/zend/Zend/Feed/Entry/Rss.php create mode 100644 lib/zend/Zend/Feed/Exception.php create mode 100644 lib/zend/Zend/Feed/Reader.php create mode 100644 lib/zend/Zend/Feed/Reader/Entry/Atom.php create mode 100644 lib/zend/Zend/Feed/Reader/Entry/Rss.php create mode 100644 lib/zend/Zend/Feed/Reader/EntryAbstract.php create mode 100644 lib/zend/Zend/Feed/Reader/EntryInterface.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/Atom/Entry.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/Atom/Feed.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/Content/Entry.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/DublinCore/Entry.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/DublinCore/Feed.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/EntryAbstract.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/FeedAbstract.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/Podcast/Entry.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/Podcast/Feed.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/Slash/Entry.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/Syndication/Feed.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/Thread/Entry.php create mode 100644 lib/zend/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php create mode 100644 lib/zend/Zend/Feed/Reader/Feed/Atom.php create mode 100644 lib/zend/Zend/Feed/Reader/Feed/Rss.php create mode 100644 lib/zend/Zend/Feed/Reader/FeedAbstract.php create mode 100644 lib/zend/Zend/Feed/Reader/FeedInterface.php create mode 100644 lib/zend/Zend/Feed/Rss.php create mode 100644 lib/zend/Zend/File/Transfer.php create mode 100644 lib/zend/Zend/File/Transfer/Adapter/Abstract.php create mode 100644 lib/zend/Zend/File/Transfer/Adapter/Http.php create mode 100644 lib/zend/Zend/File/Transfer/Exception.php create mode 100644 lib/zend/Zend/Filter/Alnum.php create mode 100644 lib/zend/Zend/Filter/Alpha.php create mode 100644 lib/zend/Zend/Filter/BaseName.php create mode 100644 lib/zend/Zend/Filter/Callback.php create mode 100644 lib/zend/Zend/Filter/Decrypt.php create mode 100644 lib/zend/Zend/Filter/Digits.php create mode 100644 lib/zend/Zend/Filter/Dir.php create mode 100644 lib/zend/Zend/Filter/Encrypt.php create mode 100644 lib/zend/Zend/Filter/Encrypt/Interface.php create mode 100644 lib/zend/Zend/Filter/Encrypt/Mcrypt.php create mode 100644 lib/zend/Zend/Filter/Encrypt/Openssl.php create mode 100644 lib/zend/Zend/Filter/Exception.php create mode 100644 lib/zend/Zend/Filter/File/Decrypt.php create mode 100644 lib/zend/Zend/Filter/File/Encrypt.php create mode 100644 lib/zend/Zend/Filter/File/LowerCase.php create mode 100644 lib/zend/Zend/Filter/File/Rename.php create mode 100644 lib/zend/Zend/Filter/File/UpperCase.php create mode 100644 lib/zend/Zend/Filter/HtmlEntities.php create mode 100644 lib/zend/Zend/Filter/Inflector.php create mode 100644 lib/zend/Zend/Filter/Input.php create mode 100644 lib/zend/Zend/Filter/Int.php create mode 100644 lib/zend/Zend/Filter/Interface.php create mode 100644 lib/zend/Zend/Filter/LocalizedToNormalized.php create mode 100644 lib/zend/Zend/Filter/NormalizedToLocalized.php create mode 100644 lib/zend/Zend/Filter/PregReplace.php create mode 100644 lib/zend/Zend/Filter/RealPath.php create mode 100644 lib/zend/Zend/Filter/StringToLower.php create mode 100644 lib/zend/Zend/Filter/StringToUpper.php create mode 100644 lib/zend/Zend/Filter/StringTrim.php create mode 100644 lib/zend/Zend/Filter/StripNewlines.php create mode 100644 lib/zend/Zend/Filter/StripTags.php create mode 100644 lib/zend/Zend/Filter/Word/CamelCaseToDash.php create mode 100644 lib/zend/Zend/Filter/Word/CamelCaseToSeparator.php create mode 100644 lib/zend/Zend/Filter/Word/CamelCaseToUnderscore.php create mode 100644 lib/zend/Zend/Filter/Word/DashToCamelCase.php create mode 100644 lib/zend/Zend/Filter/Word/DashToSeparator.php create mode 100644 lib/zend/Zend/Filter/Word/DashToUnderscore.php create mode 100644 lib/zend/Zend/Filter/Word/Separator/Abstract.php create mode 100644 lib/zend/Zend/Filter/Word/SeparatorToCamelCase.php create mode 100644 lib/zend/Zend/Filter/Word/SeparatorToDash.php create mode 100644 lib/zend/Zend/Filter/Word/SeparatorToSeparator.php create mode 100644 lib/zend/Zend/Filter/Word/UnderscoreToCamelCase.php create mode 100644 lib/zend/Zend/Filter/Word/UnderscoreToDash.php create mode 100644 lib/zend/Zend/Filter/Word/UnderscoreToSeparator.php create mode 100644 lib/zend/Zend/Form/Decorator/Abstract.php create mode 100644 lib/zend/Zend/Form/Decorator/Callback.php create mode 100644 lib/zend/Zend/Form/Decorator/Captcha.php create mode 100644 lib/zend/Zend/Form/Decorator/Captcha/Word.php create mode 100644 lib/zend/Zend/Form/Decorator/Description.php create mode 100644 lib/zend/Zend/Form/Decorator/DtDdWrapper.php create mode 100644 lib/zend/Zend/Form/Decorator/Errors.php create mode 100644 lib/zend/Zend/Form/Decorator/Exception.php create mode 100644 lib/zend/Zend/Form/Decorator/Fieldset.php create mode 100644 lib/zend/Zend/Form/Decorator/File.php create mode 100644 lib/zend/Zend/Form/Decorator/Form.php create mode 100644 lib/zend/Zend/Form/Decorator/FormElements.php create mode 100644 lib/zend/Zend/Form/Decorator/FormErrors.php create mode 100644 lib/zend/Zend/Form/Decorator/HtmlTag.php create mode 100644 lib/zend/Zend/Form/Decorator/Image.php create mode 100644 lib/zend/Zend/Form/Decorator/Interface.php create mode 100644 lib/zend/Zend/Form/Decorator/Label.php create mode 100644 lib/zend/Zend/Form/Decorator/Marker/File/Interface.php create mode 100644 lib/zend/Zend/Form/Decorator/PrepareElements.php create mode 100644 lib/zend/Zend/Form/Decorator/Tooltip.php create mode 100644 lib/zend/Zend/Form/Decorator/ViewHelper.php create mode 100644 lib/zend/Zend/Form/Decorator/ViewScript.php create mode 100644 lib/zend/Zend/Form/DisplayGroup.php create mode 100644 lib/zend/Zend/Form/Element.php create mode 100644 lib/zend/Zend/Form/Element/Button.php create mode 100644 lib/zend/Zend/Form/Element/Captcha.php create mode 100644 lib/zend/Zend/Form/Element/Checkbox.php create mode 100644 lib/zend/Zend/Form/Element/Exception.php create mode 100644 lib/zend/Zend/Form/Element/File.php create mode 100644 lib/zend/Zend/Form/Element/Hash.php create mode 100644 lib/zend/Zend/Form/Element/Hidden.php create mode 100644 lib/zend/Zend/Form/Element/Image.php create mode 100644 lib/zend/Zend/Form/Element/Multi.php create mode 100644 lib/zend/Zend/Form/Element/MultiCheckbox.php create mode 100644 lib/zend/Zend/Form/Element/Multiselect.php create mode 100644 lib/zend/Zend/Form/Element/Password.php create mode 100644 lib/zend/Zend/Form/Element/Radio.php create mode 100644 lib/zend/Zend/Form/Element/Reset.php create mode 100644 lib/zend/Zend/Form/Element/Select.php create mode 100644 lib/zend/Zend/Form/Element/Submit.php create mode 100644 lib/zend/Zend/Form/Element/Text.php create mode 100644 lib/zend/Zend/Form/Element/Textarea.php create mode 100644 lib/zend/Zend/Form/Element/Xhtml.php create mode 100644 lib/zend/Zend/Form/Exception.php create mode 100644 lib/zend/Zend/Form/SubForm.php create mode 100644 lib/zend/Zend/Gdata/App/AuthException.php create mode 100644 lib/zend/Zend/Gdata/App/BadMethodCallException.php create mode 100644 lib/zend/Zend/Gdata/App/CaptchaRequiredException.php create mode 100644 lib/zend/Zend/Gdata/App/Exception.php create mode 100644 lib/zend/Zend/Gdata/App/Extension/Edited.php create mode 100644 lib/zend/Zend/Gdata/App/HttpException.php create mode 100644 lib/zend/Zend/Gdata/App/IOException.php create mode 100644 lib/zend/Zend/Gdata/App/InvalidArgumentException.php create mode 100644 lib/zend/Zend/Gdata/App/LoggingHttpClientAdapterSocket.php create mode 100644 lib/zend/Zend/Gdata/App/Util.php create mode 100644 lib/zend/Zend/Gdata/App/VersionException.php create mode 100755 lib/zend/Zend/Gdata/Books.php create mode 100644 lib/zend/Zend/Gdata/Books/CollectionEntry.php create mode 100644 lib/zend/Zend/Gdata/Books/CollectionFeed.php create mode 100644 lib/zend/Zend/Gdata/Books/Extension/AnnotationLink.php create mode 100644 lib/zend/Zend/Gdata/Books/Extension/BooksCategory.php create mode 100644 lib/zend/Zend/Gdata/Books/Extension/BooksLink.php create mode 100644 lib/zend/Zend/Gdata/Books/Extension/Embeddability.php create mode 100644 lib/zend/Zend/Gdata/Books/Extension/InfoLink.php create mode 100644 lib/zend/Zend/Gdata/Books/Extension/PreviewLink.php create mode 100644 lib/zend/Zend/Gdata/Books/Extension/Review.php create mode 100644 lib/zend/Zend/Gdata/Books/Extension/ThumbnailLink.php create mode 100644 lib/zend/Zend/Gdata/Books/Extension/Viewability.php create mode 100644 lib/zend/Zend/Gdata/Books/VolumeEntry.php create mode 100644 lib/zend/Zend/Gdata/Books/VolumeFeed.php create mode 100755 lib/zend/Zend/Gdata/Books/VolumeQuery.php create mode 100644 lib/zend/Zend/Gdata/Calendar.php create mode 100644 lib/zend/Zend/Gdata/Calendar/EventEntry.php create mode 100644 lib/zend/Zend/Gdata/Calendar/EventFeed.php create mode 100644 lib/zend/Zend/Gdata/Calendar/EventQuery.php create mode 100644 lib/zend/Zend/Gdata/Calendar/Extension/AccessLevel.php create mode 100644 lib/zend/Zend/Gdata/Calendar/Extension/Color.php create mode 100644 lib/zend/Zend/Gdata/Calendar/Extension/Hidden.php create mode 100644 lib/zend/Zend/Gdata/Calendar/Extension/Link.php create mode 100644 lib/zend/Zend/Gdata/Calendar/Extension/QuickAdd.php create mode 100644 lib/zend/Zend/Gdata/Calendar/Extension/Selected.php create mode 100644 lib/zend/Zend/Gdata/Calendar/Extension/SendEventNotifications.php create mode 100644 lib/zend/Zend/Gdata/Calendar/Extension/Timezone.php create mode 100644 lib/zend/Zend/Gdata/Calendar/Extension/WebContent.php create mode 100644 lib/zend/Zend/Gdata/Calendar/ListEntry.php create mode 100644 lib/zend/Zend/Gdata/Calendar/ListFeed.php create mode 100755 lib/zend/Zend/Gdata/Docs/Query.php create mode 100755 lib/zend/Zend/Gdata/DublinCore.php create mode 100644 lib/zend/Zend/Gdata/DublinCore/Extension/Creator.php create mode 100644 lib/zend/Zend/Gdata/DublinCore/Extension/Date.php create mode 100644 lib/zend/Zend/Gdata/DublinCore/Extension/Description.php create mode 100644 lib/zend/Zend/Gdata/DublinCore/Extension/Format.php create mode 100644 lib/zend/Zend/Gdata/DublinCore/Extension/Identifier.php create mode 100644 lib/zend/Zend/Gdata/DublinCore/Extension/Language.php create mode 100644 lib/zend/Zend/Gdata/DublinCore/Extension/Publisher.php create mode 100644 lib/zend/Zend/Gdata/DublinCore/Extension/Rights.php create mode 100644 lib/zend/Zend/Gdata/DublinCore/Extension/Subject.php create mode 100644 lib/zend/Zend/Gdata/DublinCore/Extension/Title.php create mode 100755 lib/zend/Zend/Gdata/Exif.php create mode 100755 lib/zend/Zend/Gdata/Exif/Entry.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/Distance.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/Exposure.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/FStop.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/Flash.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/FocalLength.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/ImageUniqueId.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/Iso.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/Make.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/Model.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/Tags.php create mode 100755 lib/zend/Zend/Gdata/Exif/Extension/Time.php create mode 100755 lib/zend/Zend/Gdata/Exif/Feed.php create mode 100644 lib/zend/Zend/Gdata/Extension/AttendeeStatus.php create mode 100644 lib/zend/Zend/Gdata/Extension/AttendeeType.php create mode 100644 lib/zend/Zend/Gdata/Extension/Comments.php create mode 100644 lib/zend/Zend/Gdata/Extension/EntryLink.php create mode 100644 lib/zend/Zend/Gdata/Extension/EventStatus.php create mode 100644 lib/zend/Zend/Gdata/Extension/ExtendedProperty.php create mode 100644 lib/zend/Zend/Gdata/Extension/FeedLink.php create mode 100644 lib/zend/Zend/Gdata/Extension/OriginalEvent.php create mode 100644 lib/zend/Zend/Gdata/Extension/Rating.php create mode 100644 lib/zend/Zend/Gdata/Extension/Recurrence.php create mode 100644 lib/zend/Zend/Gdata/Extension/RecurrenceException.php create mode 100644 lib/zend/Zend/Gdata/Extension/Reminder.php create mode 100644 lib/zend/Zend/Gdata/Extension/Transparency.php create mode 100644 lib/zend/Zend/Gdata/Extension/Visibility.php create mode 100644 lib/zend/Zend/Gdata/Extension/When.php create mode 100644 lib/zend/Zend/Gdata/Extension/Where.php create mode 100644 lib/zend/Zend/Gdata/Extension/Who.php create mode 100644 lib/zend/Zend/Gdata/Gapps.php create mode 100644 lib/zend/Zend/Gdata/Gapps/EmailListEntry.php create mode 100644 lib/zend/Zend/Gdata/Gapps/EmailListFeed.php create mode 100644 lib/zend/Zend/Gdata/Gapps/EmailListQuery.php create mode 100644 lib/zend/Zend/Gdata/Gapps/EmailListRecipientEntry.php create mode 100644 lib/zend/Zend/Gdata/Gapps/EmailListRecipientFeed.php create mode 100644 lib/zend/Zend/Gdata/Gapps/EmailListRecipientQuery.php create mode 100644 lib/zend/Zend/Gdata/Gapps/Error.php create mode 100644 lib/zend/Zend/Gdata/Gapps/Extension/EmailList.php create mode 100644 lib/zend/Zend/Gdata/Gapps/Extension/Login.php create mode 100644 lib/zend/Zend/Gdata/Gapps/Extension/Name.php create mode 100644 lib/zend/Zend/Gdata/Gapps/Extension/Nickname.php create mode 100644 lib/zend/Zend/Gdata/Gapps/Extension/Quota.php create mode 100644 lib/zend/Zend/Gdata/Gapps/NicknameEntry.php create mode 100644 lib/zend/Zend/Gdata/Gapps/NicknameFeed.php create mode 100644 lib/zend/Zend/Gdata/Gapps/NicknameQuery.php create mode 100644 lib/zend/Zend/Gdata/Gapps/Query.php create mode 100644 lib/zend/Zend/Gdata/Gapps/ServiceException.php create mode 100644 lib/zend/Zend/Gdata/Gapps/UserEntry.php create mode 100644 lib/zend/Zend/Gdata/Gapps/UserFeed.php create mode 100644 lib/zend/Zend/Gdata/Gapps/UserQuery.php create mode 100644 lib/zend/Zend/Gdata/Gbase.php create mode 100644 lib/zend/Zend/Gdata/Gbase/Entry.php create mode 100644 lib/zend/Zend/Gdata/Gbase/Extension/BaseAttribute.php create mode 100644 lib/zend/Zend/Gdata/Gbase/Feed.php create mode 100644 lib/zend/Zend/Gdata/Gbase/ItemEntry.php create mode 100644 lib/zend/Zend/Gdata/Gbase/ItemFeed.php create mode 100644 lib/zend/Zend/Gdata/Gbase/ItemQuery.php create mode 100644 lib/zend/Zend/Gdata/Gbase/Query.php create mode 100644 lib/zend/Zend/Gdata/Gbase/SnippetEntry.php create mode 100644 lib/zend/Zend/Gdata/Gbase/SnippetFeed.php create mode 100644 lib/zend/Zend/Gdata/Gbase/SnippetQuery.php create mode 100755 lib/zend/Zend/Gdata/Geo.php create mode 100755 lib/zend/Zend/Gdata/Geo/Entry.php create mode 100755 lib/zend/Zend/Gdata/Geo/Extension/GeoRssWhere.php create mode 100755 lib/zend/Zend/Gdata/Geo/Extension/GmlPoint.php create mode 100755 lib/zend/Zend/Gdata/Geo/Extension/GmlPos.php create mode 100755 lib/zend/Zend/Gdata/Geo/Feed.php create mode 100755 lib/zend/Zend/Gdata/Health.php create mode 100755 lib/zend/Zend/Gdata/Health/Extension/Ccr.php create mode 100755 lib/zend/Zend/Gdata/Health/ProfileEntry.php create mode 100755 lib/zend/Zend/Gdata/Health/ProfileFeed.php create mode 100755 lib/zend/Zend/Gdata/Health/ProfileListEntry.php create mode 100755 lib/zend/Zend/Gdata/Health/ProfileListFeed.php create mode 100755 lib/zend/Zend/Gdata/Health/Query.php create mode 100644 lib/zend/Zend/Gdata/HttpAdapterStreamingProxy.php create mode 100644 lib/zend/Zend/Gdata/HttpAdapterStreamingSocket.php create mode 100644 lib/zend/Zend/Gdata/Kind/EventEntry.php create mode 100755 lib/zend/Zend/Gdata/Media.php create mode 100755 lib/zend/Zend/Gdata/Media/Entry.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaCategory.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaContent.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaCopyright.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaCredit.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaDescription.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaGroup.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaHash.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaKeywords.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaPlayer.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaRating.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaRestriction.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaText.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaThumbnail.php create mode 100755 lib/zend/Zend/Gdata/Media/Extension/MediaTitle.php create mode 100755 lib/zend/Zend/Gdata/Media/Feed.php create mode 100644 lib/zend/Zend/Gdata/MediaMimeStream.php create mode 100644 lib/zend/Zend/Gdata/MimeBodyString.php create mode 100644 lib/zend/Zend/Gdata/MimeFile.php create mode 100755 lib/zend/Zend/Gdata/Photos.php create mode 100755 lib/zend/Zend/Gdata/Photos/AlbumEntry.php create mode 100755 lib/zend/Zend/Gdata/Photos/AlbumFeed.php create mode 100755 lib/zend/Zend/Gdata/Photos/AlbumQuery.php create mode 100755 lib/zend/Zend/Gdata/Photos/CommentEntry.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Access.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/AlbumId.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/BytesUsed.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Checksum.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Client.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/CommentCount.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/CommentingEnabled.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Height.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Id.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Location.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/MaxPhotosPerAlbum.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Name.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Nickname.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/NumPhotos.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/NumPhotosRemaining.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/PhotoId.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Position.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/QuotaCurrent.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/QuotaLimit.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Rotation.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Size.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Thumbnail.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Timestamp.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/User.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Version.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Weight.php create mode 100755 lib/zend/Zend/Gdata/Photos/Extension/Width.php create mode 100755 lib/zend/Zend/Gdata/Photos/PhotoEntry.php create mode 100755 lib/zend/Zend/Gdata/Photos/PhotoFeed.php create mode 100755 lib/zend/Zend/Gdata/Photos/PhotoQuery.php create mode 100755 lib/zend/Zend/Gdata/Photos/TagEntry.php create mode 100755 lib/zend/Zend/Gdata/Photos/UserEntry.php create mode 100755 lib/zend/Zend/Gdata/Photos/UserFeed.php create mode 100755 lib/zend/Zend/Gdata/Photos/UserQuery.php create mode 100644 lib/zend/Zend/Gdata/Query.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/CellEntry.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/CellFeed.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/CellQuery.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/DocumentQuery.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/Extension/Cell.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/Extension/ColCount.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/Extension/Custom.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/Extension/RowCount.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/ListEntry.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/ListFeed.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/ListQuery.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/SpreadsheetEntry.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/SpreadsheetFeed.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/WorksheetEntry.php create mode 100644 lib/zend/Zend/Gdata/Spreadsheets/WorksheetFeed.php create mode 100644 lib/zend/Zend/Gdata/YouTube.php create mode 100644 lib/zend/Zend/Gdata/YouTube/ActivityEntry.php create mode 100644 lib/zend/Zend/Gdata/YouTube/ActivityFeed.php create mode 100644 lib/zend/Zend/Gdata/YouTube/CommentEntry.php create mode 100644 lib/zend/Zend/Gdata/YouTube/CommentFeed.php create mode 100644 lib/zend/Zend/Gdata/YouTube/ContactEntry.php create mode 100644 lib/zend/Zend/Gdata/YouTube/ContactFeed.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/AboutMe.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Age.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Books.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Company.php create mode 100755 lib/zend/Zend/Gdata/YouTube/Extension/Control.php create mode 100755 lib/zend/Zend/Gdata/YouTube/Extension/CountHint.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Description.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Duration.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/FirstName.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Gender.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Hobbies.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Hometown.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/LastName.php create mode 100755 lib/zend/Zend/Gdata/YouTube/Extension/Link.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Location.php create mode 100755 lib/zend/Zend/Gdata/YouTube/Extension/MediaContent.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/MediaCredit.php create mode 100755 lib/zend/Zend/Gdata/YouTube/Extension/MediaGroup.php create mode 100755 lib/zend/Zend/Gdata/YouTube/Extension/MediaRating.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Movies.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Music.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/NoEmbed.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Occupation.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/PlaylistId.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/PlaylistTitle.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Position.php create mode 100755 lib/zend/Zend/Gdata/YouTube/Extension/Private.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/QueryString.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Racy.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Recorded.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Relationship.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/ReleaseDate.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/School.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/State.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Statistics.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Status.php create mode 100755 lib/zend/Zend/Gdata/YouTube/Extension/Token.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Uploaded.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/Username.php create mode 100644 lib/zend/Zend/Gdata/YouTube/Extension/VideoId.php create mode 100644 lib/zend/Zend/Gdata/YouTube/InboxEntry.php create mode 100644 lib/zend/Zend/Gdata/YouTube/InboxFeed.php create mode 100755 lib/zend/Zend/Gdata/YouTube/MediaEntry.php create mode 100644 lib/zend/Zend/Gdata/YouTube/PlaylistListEntry.php create mode 100644 lib/zend/Zend/Gdata/YouTube/PlaylistListFeed.php create mode 100644 lib/zend/Zend/Gdata/YouTube/PlaylistVideoEntry.php create mode 100644 lib/zend/Zend/Gdata/YouTube/PlaylistVideoFeed.php create mode 100644 lib/zend/Zend/Gdata/YouTube/SubscriptionEntry.php create mode 100644 lib/zend/Zend/Gdata/YouTube/SubscriptionFeed.php create mode 100644 lib/zend/Zend/Gdata/YouTube/UserProfileEntry.php create mode 100644 lib/zend/Zend/Gdata/YouTube/VideoEntry.php create mode 100644 lib/zend/Zend/Gdata/YouTube/VideoFeed.php create mode 100644 lib/zend/Zend/Gdata/YouTube/VideoQuery.php create mode 100644 lib/zend/Zend/Http/Client/Adapter/Curl.php create mode 100644 lib/zend/Zend/InfoCard/Adapter/Default.php create mode 100644 lib/zend/Zend/InfoCard/Adapter/Exception.php create mode 100644 lib/zend/Zend/InfoCard/Adapter/Interface.php create mode 100644 lib/zend/Zend/InfoCard/Cipher.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Exception.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Pki/Adapter/Abstract.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Pki/Interface.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Pki/Rsa/Interface.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Symmetric/Adapter/Abstract.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Symmetric/Adapter/Aes128cbc.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Symmetric/Adapter/Aes256cbc.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Symmetric/Aes256cbc/Interface.php create mode 100644 lib/zend/Zend/InfoCard/Cipher/Symmetric/Interface.php create mode 100644 lib/zend/Zend/InfoCard/Claims.php create mode 100644 lib/zend/Zend/InfoCard/Exception.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Assertion.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Assertion/Interface.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Assertion/Saml.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Element.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Element/Interface.php create mode 100644 lib/zend/Zend/InfoCard/Xml/EncryptedData.php create mode 100644 lib/zend/Zend/InfoCard/Xml/EncryptedData/Abstract.php create mode 100644 lib/zend/Zend/InfoCard/Xml/EncryptedData/XmlEnc.php create mode 100644 lib/zend/Zend/InfoCard/Xml/EncryptedKey.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Exception.php create mode 100644 lib/zend/Zend/InfoCard/Xml/KeyInfo.php create mode 100644 lib/zend/Zend/InfoCard/Xml/KeyInfo/Abstract.php create mode 100644 lib/zend/Zend/InfoCard/Xml/KeyInfo/Default.php create mode 100644 lib/zend/Zend/InfoCard/Xml/KeyInfo/Interface.php create mode 100644 lib/zend/Zend/InfoCard/Xml/KeyInfo/XmlDSig.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Security.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Security/Exception.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Security/Transform.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Security/Transform/EnvelopedSignature.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Security/Transform/Exception.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Security/Transform/Interface.php create mode 100644 lib/zend/Zend/InfoCard/Xml/Security/Transform/XmlExcC14N.php create mode 100644 lib/zend/Zend/InfoCard/Xml/SecurityTokenReference.php create mode 100644 lib/zend/Zend/Json/Decoder.php create mode 100644 lib/zend/Zend/Json/Encoder.php create mode 100644 lib/zend/Zend/Json/Exception.php create mode 100644 lib/zend/Zend/Json/Expr.php create mode 100644 lib/zend/Zend/Json/Server.php create mode 100644 lib/zend/Zend/Json/Server/Cache.php create mode 100644 lib/zend/Zend/Json/Server/Error.php create mode 100644 lib/zend/Zend/Json/Server/Exception.php create mode 100644 lib/zend/Zend/Json/Server/Request.php create mode 100644 lib/zend/Zend/Json/Server/Request/Http.php create mode 100644 lib/zend/Zend/Json/Server/Response.php create mode 100644 lib/zend/Zend/Json/Server/Response/Http.php create mode 100644 lib/zend/Zend/Json/Server/Smd.php create mode 100644 lib/zend/Zend/Json/Server/Smd/Service.php create mode 100644 lib/zend/Zend/Layout/Controller/Action/Helper/Layout.php create mode 100644 lib/zend/Zend/Layout/Controller/Plugin/Layout.php create mode 100644 lib/zend/Zend/Layout/Exception.php create mode 100644 lib/zend/Zend/Ldap/Attribute.php create mode 100644 lib/zend/Zend/Ldap/Collection.php create mode 100644 lib/zend/Zend/Ldap/Collection/Iterator/Default.php create mode 100644 lib/zend/Zend/Ldap/Collection/Iterator/Interface.php create mode 100644 lib/zend/Zend/Ldap/Converter.php create mode 100644 lib/zend/Zend/Ldap/Dn.php create mode 100644 lib/zend/Zend/Ldap/Exception.php create mode 100644 lib/zend/Zend/Ldap/Filter.php create mode 100644 lib/zend/Zend/Ldap/Filter/Abstract.php create mode 100644 lib/zend/Zend/Ldap/Filter/And.php rename lib/zend/Zend/{Soap/Wsdl/Parser/Result.php => Ldap/Filter/Exception.php} (61%) create mode 100644 lib/zend/Zend/Ldap/Filter/Logical.php create mode 100644 lib/zend/Zend/Ldap/Filter/Mask.php create mode 100644 lib/zend/Zend/Ldap/Filter/Not.php create mode 100644 lib/zend/Zend/Ldap/Filter/Or.php create mode 100644 lib/zend/Zend/Ldap/Filter/String.php create mode 100644 lib/zend/Zend/Ldap/Ldif/Encoder.php create mode 100644 lib/zend/Zend/Ldap/Node.php create mode 100644 lib/zend/Zend/Ldap/Node/Abstract.php create mode 100644 lib/zend/Zend/Ldap/Node/ChildrenIterator.php create mode 100644 lib/zend/Zend/Ldap/Node/Collection.php create mode 100644 lib/zend/Zend/Ldap/Node/RootDse.php create mode 100644 lib/zend/Zend/Ldap/Node/RootDse/ActiveDirectory.php create mode 100644 lib/zend/Zend/Ldap/Node/RootDse/OpenLdap.php create mode 100644 lib/zend/Zend/Ldap/Node/RootDse/eDirectory.php create mode 100644 lib/zend/Zend/Ldap/Node/Schema.php create mode 100644 lib/zend/Zend/Ldap/Node/Schema/ActiveDirectory.php create mode 100644 lib/zend/Zend/Ldap/Node/Schema/AttributeType/ActiveDirectory.php create mode 100644 lib/zend/Zend/Ldap/Node/Schema/AttributeType/Interface.php create mode 100644 lib/zend/Zend/Ldap/Node/Schema/AttributeType/OpenLdap.php create mode 100644 lib/zend/Zend/Ldap/Node/Schema/Item.php create mode 100644 lib/zend/Zend/Ldap/Node/Schema/ObjectClass/ActiveDirectory.php create mode 100644 lib/zend/Zend/Ldap/Node/Schema/ObjectClass/Interface.php create mode 100644 lib/zend/Zend/Ldap/Node/Schema/ObjectClass/OpenLdap.php create mode 100644 lib/zend/Zend/Ldap/Node/Schema/OpenLdap.php create mode 100644 lib/zend/Zend/Loader/Autoloader.php create mode 100644 lib/zend/Zend/Loader/Autoloader/Interface.php create mode 100644 lib/zend/Zend/Loader/Autoloader/Resource.php create mode 100644 lib/zend/Zend/Loader/Exception.php create mode 100644 lib/zend/Zend/Loader/PluginLoader.php create mode 100644 lib/zend/Zend/Loader/PluginLoader/Exception.php create mode 100644 lib/zend/Zend/Loader/PluginLoader/Interface.php create mode 100644 lib/zend/Zend/Locale/Data.php create mode 100644 lib/zend/Zend/Locale/Data/Translation.php create mode 100644 lib/zend/Zend/Locale/Data/aa.xml create mode 100644 lib/zend/Zend/Locale/Data/aa_DJ.xml create mode 100644 lib/zend/Zend/Locale/Data/aa_ER.xml create mode 100644 lib/zend/Zend/Locale/Data/aa_ER_SAAHO.xml create mode 100644 lib/zend/Zend/Locale/Data/aa_ET.xml create mode 100644 lib/zend/Zend/Locale/Data/af.xml create mode 100644 lib/zend/Zend/Locale/Data/af_NA.xml create mode 100644 lib/zend/Zend/Locale/Data/af_ZA.xml create mode 100644 lib/zend/Zend/Locale/Data/ak.xml create mode 100644 lib/zend/Zend/Locale/Data/ak_GH.xml create mode 100644 lib/zend/Zend/Locale/Data/am.xml create mode 100644 lib/zend/Zend/Locale/Data/am_ET.xml create mode 100644 lib/zend/Zend/Locale/Data/ar.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_AE.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_BH.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_DZ.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_EG.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_IQ.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_JO.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_KW.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_LB.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_LY.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_MA.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_OM.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_QA.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_SA.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_SD.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_SY.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_TN.xml create mode 100644 lib/zend/Zend/Locale/Data/ar_YE.xml create mode 100644 lib/zend/Zend/Locale/Data/as.xml create mode 100644 lib/zend/Zend/Locale/Data/as_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/az.xml create mode 100644 lib/zend/Zend/Locale/Data/az_AZ.xml create mode 100644 lib/zend/Zend/Locale/Data/az_Cyrl.xml create mode 100644 lib/zend/Zend/Locale/Data/az_Cyrl_AZ.xml create mode 100644 lib/zend/Zend/Locale/Data/az_Latn.xml create mode 100644 lib/zend/Zend/Locale/Data/az_Latn_AZ.xml create mode 100644 lib/zend/Zend/Locale/Data/be.xml create mode 100644 lib/zend/Zend/Locale/Data/be_BY.xml create mode 100644 lib/zend/Zend/Locale/Data/bg.xml create mode 100644 lib/zend/Zend/Locale/Data/bg_BG.xml create mode 100644 lib/zend/Zend/Locale/Data/bn.xml create mode 100644 lib/zend/Zend/Locale/Data/bn_BD.xml create mode 100644 lib/zend/Zend/Locale/Data/bn_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/bo.xml create mode 100644 lib/zend/Zend/Locale/Data/bo_CN.xml create mode 100644 lib/zend/Zend/Locale/Data/bo_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/bs.xml create mode 100644 lib/zend/Zend/Locale/Data/bs_BA.xml create mode 100644 lib/zend/Zend/Locale/Data/byn.xml create mode 100644 lib/zend/Zend/Locale/Data/byn_ER.xml create mode 100644 lib/zend/Zend/Locale/Data/ca.xml create mode 100644 lib/zend/Zend/Locale/Data/ca_ES.xml create mode 100644 lib/zend/Zend/Locale/Data/cch.xml create mode 100644 lib/zend/Zend/Locale/Data/cch_NG.xml create mode 100644 lib/zend/Zend/Locale/Data/characters.xml create mode 100644 lib/zend/Zend/Locale/Data/cop.xml create mode 100644 lib/zend/Zend/Locale/Data/cs.xml create mode 100644 lib/zend/Zend/Locale/Data/cs_CZ.xml create mode 100644 lib/zend/Zend/Locale/Data/cy.xml create mode 100644 lib/zend/Zend/Locale/Data/cy_GB.xml create mode 100644 lib/zend/Zend/Locale/Data/da.xml create mode 100644 lib/zend/Zend/Locale/Data/da_DK.xml create mode 100644 lib/zend/Zend/Locale/Data/de.xml create mode 100644 lib/zend/Zend/Locale/Data/de_AT.xml create mode 100644 lib/zend/Zend/Locale/Data/de_BE.xml create mode 100644 lib/zend/Zend/Locale/Data/de_CH.xml create mode 100644 lib/zend/Zend/Locale/Data/de_DE.xml create mode 100644 lib/zend/Zend/Locale/Data/de_LI.xml create mode 100644 lib/zend/Zend/Locale/Data/de_LU.xml create mode 100644 lib/zend/Zend/Locale/Data/dv.xml create mode 100644 lib/zend/Zend/Locale/Data/dv_MV.xml create mode 100644 lib/zend/Zend/Locale/Data/dz.xml create mode 100644 lib/zend/Zend/Locale/Data/dz_BT.xml create mode 100644 lib/zend/Zend/Locale/Data/ee.xml create mode 100644 lib/zend/Zend/Locale/Data/ee_GH.xml create mode 100644 lib/zend/Zend/Locale/Data/ee_TG.xml create mode 100644 lib/zend/Zend/Locale/Data/el.xml create mode 100644 lib/zend/Zend/Locale/Data/el_CY.xml create mode 100644 lib/zend/Zend/Locale/Data/el_GR.xml create mode 100644 lib/zend/Zend/Locale/Data/el_POLYTON.xml create mode 100644 lib/zend/Zend/Locale/Data/en.xml create mode 100644 lib/zend/Zend/Locale/Data/en_AS.xml create mode 100644 lib/zend/Zend/Locale/Data/en_AU.xml create mode 100644 lib/zend/Zend/Locale/Data/en_BE.xml create mode 100644 lib/zend/Zend/Locale/Data/en_BW.xml create mode 100644 lib/zend/Zend/Locale/Data/en_BZ.xml create mode 100644 lib/zend/Zend/Locale/Data/en_CA.xml create mode 100644 lib/zend/Zend/Locale/Data/en_Dsrt.xml create mode 100644 lib/zend/Zend/Locale/Data/en_Dsrt_US.xml create mode 100644 lib/zend/Zend/Locale/Data/en_GB.xml create mode 100644 lib/zend/Zend/Locale/Data/en_GU.xml create mode 100644 lib/zend/Zend/Locale/Data/en_HK.xml create mode 100644 lib/zend/Zend/Locale/Data/en_IE.xml create mode 100644 lib/zend/Zend/Locale/Data/en_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/en_JM.xml create mode 100644 lib/zend/Zend/Locale/Data/en_MH.xml create mode 100644 lib/zend/Zend/Locale/Data/en_MP.xml create mode 100644 lib/zend/Zend/Locale/Data/en_MT.xml create mode 100644 lib/zend/Zend/Locale/Data/en_NA.xml create mode 100644 lib/zend/Zend/Locale/Data/en_NZ.xml create mode 100644 lib/zend/Zend/Locale/Data/en_PH.xml create mode 100644 lib/zend/Zend/Locale/Data/en_PK.xml create mode 100644 lib/zend/Zend/Locale/Data/en_SG.xml create mode 100644 lib/zend/Zend/Locale/Data/en_Shaw.xml create mode 100644 lib/zend/Zend/Locale/Data/en_TT.xml create mode 100644 lib/zend/Zend/Locale/Data/en_UM.xml create mode 100644 lib/zend/Zend/Locale/Data/en_US.xml create mode 100644 lib/zend/Zend/Locale/Data/en_US_POSIX.xml create mode 100644 lib/zend/Zend/Locale/Data/en_VI.xml create mode 100644 lib/zend/Zend/Locale/Data/en_ZA.xml create mode 100644 lib/zend/Zend/Locale/Data/en_ZW.xml create mode 100644 lib/zend/Zend/Locale/Data/eo.xml create mode 100644 lib/zend/Zend/Locale/Data/es.xml create mode 100644 lib/zend/Zend/Locale/Data/es_AR.xml create mode 100644 lib/zend/Zend/Locale/Data/es_BO.xml create mode 100644 lib/zend/Zend/Locale/Data/es_CL.xml create mode 100644 lib/zend/Zend/Locale/Data/es_CO.xml create mode 100644 lib/zend/Zend/Locale/Data/es_CR.xml create mode 100644 lib/zend/Zend/Locale/Data/es_DO.xml create mode 100644 lib/zend/Zend/Locale/Data/es_EC.xml create mode 100644 lib/zend/Zend/Locale/Data/es_ES.xml create mode 100644 lib/zend/Zend/Locale/Data/es_GT.xml create mode 100644 lib/zend/Zend/Locale/Data/es_HN.xml create mode 100644 lib/zend/Zend/Locale/Data/es_MX.xml create mode 100644 lib/zend/Zend/Locale/Data/es_NI.xml create mode 100644 lib/zend/Zend/Locale/Data/es_PA.xml create mode 100644 lib/zend/Zend/Locale/Data/es_PE.xml create mode 100644 lib/zend/Zend/Locale/Data/es_PR.xml create mode 100644 lib/zend/Zend/Locale/Data/es_PY.xml create mode 100644 lib/zend/Zend/Locale/Data/es_SV.xml create mode 100644 lib/zend/Zend/Locale/Data/es_US.xml create mode 100644 lib/zend/Zend/Locale/Data/es_UY.xml create mode 100644 lib/zend/Zend/Locale/Data/es_VE.xml create mode 100644 lib/zend/Zend/Locale/Data/et.xml create mode 100644 lib/zend/Zend/Locale/Data/et_EE.xml create mode 100644 lib/zend/Zend/Locale/Data/eu.xml create mode 100644 lib/zend/Zend/Locale/Data/eu_ES.xml create mode 100644 lib/zend/Zend/Locale/Data/fa.xml create mode 100644 lib/zend/Zend/Locale/Data/fa_AF.xml create mode 100644 lib/zend/Zend/Locale/Data/fa_IR.xml create mode 100644 lib/zend/Zend/Locale/Data/fi.xml create mode 100644 lib/zend/Zend/Locale/Data/fi_FI.xml create mode 100644 lib/zend/Zend/Locale/Data/fil.xml create mode 100644 lib/zend/Zend/Locale/Data/fil_PH.xml create mode 100644 lib/zend/Zend/Locale/Data/fo.xml create mode 100644 lib/zend/Zend/Locale/Data/fo_FO.xml create mode 100644 lib/zend/Zend/Locale/Data/fr.xml create mode 100644 lib/zend/Zend/Locale/Data/fr_BE.xml create mode 100644 lib/zend/Zend/Locale/Data/fr_CA.xml create mode 100644 lib/zend/Zend/Locale/Data/fr_CH.xml create mode 100644 lib/zend/Zend/Locale/Data/fr_FR.xml create mode 100644 lib/zend/Zend/Locale/Data/fr_LU.xml create mode 100644 lib/zend/Zend/Locale/Data/fr_MC.xml create mode 100644 lib/zend/Zend/Locale/Data/fr_SN.xml create mode 100644 lib/zend/Zend/Locale/Data/fur.xml create mode 100644 lib/zend/Zend/Locale/Data/fur_IT.xml create mode 100644 lib/zend/Zend/Locale/Data/ga.xml create mode 100644 lib/zend/Zend/Locale/Data/ga_IE.xml create mode 100644 lib/zend/Zend/Locale/Data/gaa.xml create mode 100644 lib/zend/Zend/Locale/Data/gaa_GH.xml create mode 100644 lib/zend/Zend/Locale/Data/gez.xml create mode 100644 lib/zend/Zend/Locale/Data/gez_ER.xml create mode 100644 lib/zend/Zend/Locale/Data/gez_ET.xml create mode 100644 lib/zend/Zend/Locale/Data/gl.xml create mode 100644 lib/zend/Zend/Locale/Data/gl_ES.xml create mode 100644 lib/zend/Zend/Locale/Data/gsw.xml create mode 100644 lib/zend/Zend/Locale/Data/gsw_CH.xml create mode 100644 lib/zend/Zend/Locale/Data/gu.xml create mode 100644 lib/zend/Zend/Locale/Data/gu_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/gv.xml create mode 100644 lib/zend/Zend/Locale/Data/gv_GB.xml create mode 100644 lib/zend/Zend/Locale/Data/ha.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_Arab.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_Arab_NG.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_Arab_SD.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_GH.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_Latn.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_Latn_GH.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_Latn_NE.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_Latn_NG.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_NE.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_NG.xml create mode 100644 lib/zend/Zend/Locale/Data/ha_SD.xml create mode 100644 lib/zend/Zend/Locale/Data/haw.xml create mode 100644 lib/zend/Zend/Locale/Data/haw_US.xml create mode 100644 lib/zend/Zend/Locale/Data/he.xml create mode 100644 lib/zend/Zend/Locale/Data/he_IL.xml create mode 100644 lib/zend/Zend/Locale/Data/hi.xml create mode 100644 lib/zend/Zend/Locale/Data/hi_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/hr.xml create mode 100644 lib/zend/Zend/Locale/Data/hr_HR.xml create mode 100644 lib/zend/Zend/Locale/Data/hu.xml create mode 100644 lib/zend/Zend/Locale/Data/hu_HU.xml create mode 100644 lib/zend/Zend/Locale/Data/hy.xml create mode 100644 lib/zend/Zend/Locale/Data/hy_AM.xml create mode 100644 lib/zend/Zend/Locale/Data/hy_AM_REVISED.xml create mode 100644 lib/zend/Zend/Locale/Data/ia.xml create mode 100644 lib/zend/Zend/Locale/Data/id.xml create mode 100644 lib/zend/Zend/Locale/Data/id_ID.xml create mode 100644 lib/zend/Zend/Locale/Data/ig.xml create mode 100644 lib/zend/Zend/Locale/Data/ig_NG.xml create mode 100644 lib/zend/Zend/Locale/Data/ii.xml create mode 100644 lib/zend/Zend/Locale/Data/ii_CN.xml create mode 100644 lib/zend/Zend/Locale/Data/in.xml create mode 100644 lib/zend/Zend/Locale/Data/is.xml create mode 100644 lib/zend/Zend/Locale/Data/is_IS.xml create mode 100644 lib/zend/Zend/Locale/Data/it.xml create mode 100644 lib/zend/Zend/Locale/Data/it_CH.xml create mode 100644 lib/zend/Zend/Locale/Data/it_IT.xml create mode 100644 lib/zend/Zend/Locale/Data/iu.xml create mode 100644 lib/zend/Zend/Locale/Data/iw.xml create mode 100644 lib/zend/Zend/Locale/Data/ja.xml create mode 100644 lib/zend/Zend/Locale/Data/ja_JP.xml create mode 100644 lib/zend/Zend/Locale/Data/ka.xml create mode 100644 lib/zend/Zend/Locale/Data/ka_GE.xml create mode 100644 lib/zend/Zend/Locale/Data/kaj.xml create mode 100644 lib/zend/Zend/Locale/Data/kaj_NG.xml create mode 100644 lib/zend/Zend/Locale/Data/kam.xml create mode 100644 lib/zend/Zend/Locale/Data/kam_KE.xml create mode 100644 lib/zend/Zend/Locale/Data/kcg.xml create mode 100644 lib/zend/Zend/Locale/Data/kcg_NG.xml create mode 100644 lib/zend/Zend/Locale/Data/kfo.xml create mode 100644 lib/zend/Zend/Locale/Data/kfo_CI.xml create mode 100644 lib/zend/Zend/Locale/Data/kk.xml create mode 100644 lib/zend/Zend/Locale/Data/kk_Cyrl.xml create mode 100644 lib/zend/Zend/Locale/Data/kk_Cyrl_KZ.xml create mode 100644 lib/zend/Zend/Locale/Data/kk_KZ.xml create mode 100644 lib/zend/Zend/Locale/Data/kl.xml create mode 100644 lib/zend/Zend/Locale/Data/kl_GL.xml create mode 100644 lib/zend/Zend/Locale/Data/km.xml create mode 100644 lib/zend/Zend/Locale/Data/km_KH.xml create mode 100644 lib/zend/Zend/Locale/Data/kn.xml create mode 100644 lib/zend/Zend/Locale/Data/kn_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/ko.xml create mode 100644 lib/zend/Zend/Locale/Data/ko_KR.xml create mode 100644 lib/zend/Zend/Locale/Data/kok.xml create mode 100644 lib/zend/Zend/Locale/Data/kok_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/kpe.xml create mode 100644 lib/zend/Zend/Locale/Data/kpe_GN.xml create mode 100644 lib/zend/Zend/Locale/Data/kpe_LR.xml create mode 100644 lib/zend/Zend/Locale/Data/ku.xml create mode 100644 lib/zend/Zend/Locale/Data/ku_Arab.xml create mode 100644 lib/zend/Zend/Locale/Data/ku_Arab_IQ.xml create mode 100644 lib/zend/Zend/Locale/Data/ku_Arab_IR.xml create mode 100644 lib/zend/Zend/Locale/Data/ku_Arab_SY.xml create mode 100644 lib/zend/Zend/Locale/Data/ku_IQ.xml create mode 100644 lib/zend/Zend/Locale/Data/ku_IR.xml create mode 100644 lib/zend/Zend/Locale/Data/ku_Latn.xml create mode 100644 lib/zend/Zend/Locale/Data/ku_Latn_TR.xml create mode 100644 lib/zend/Zend/Locale/Data/ku_SY.xml create mode 100644 lib/zend/Zend/Locale/Data/ku_TR.xml create mode 100644 lib/zend/Zend/Locale/Data/kw.xml create mode 100644 lib/zend/Zend/Locale/Data/kw_GB.xml create mode 100644 lib/zend/Zend/Locale/Data/ky.xml create mode 100644 lib/zend/Zend/Locale/Data/ky_KG.xml create mode 100644 lib/zend/Zend/Locale/Data/likelySubtags.xml create mode 100644 lib/zend/Zend/Locale/Data/ln.xml create mode 100644 lib/zend/Zend/Locale/Data/ln_CD.xml create mode 100644 lib/zend/Zend/Locale/Data/ln_CG.xml create mode 100644 lib/zend/Zend/Locale/Data/lo.xml create mode 100644 lib/zend/Zend/Locale/Data/lo_LA.xml create mode 100644 lib/zend/Zend/Locale/Data/lt.xml create mode 100644 lib/zend/Zend/Locale/Data/lt_LT.xml create mode 100644 lib/zend/Zend/Locale/Data/lv.xml create mode 100644 lib/zend/Zend/Locale/Data/lv_LV.xml create mode 100644 lib/zend/Zend/Locale/Data/metazoneInfo.xml create mode 100644 lib/zend/Zend/Locale/Data/mk.xml create mode 100644 lib/zend/Zend/Locale/Data/mk_MK.xml create mode 100644 lib/zend/Zend/Locale/Data/ml.xml create mode 100644 lib/zend/Zend/Locale/Data/ml_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/mn.xml create mode 100644 lib/zend/Zend/Locale/Data/mn_CN.xml create mode 100644 lib/zend/Zend/Locale/Data/mn_Cyrl.xml create mode 100644 lib/zend/Zend/Locale/Data/mn_Cyrl_MN.xml create mode 100644 lib/zend/Zend/Locale/Data/mn_MN.xml create mode 100644 lib/zend/Zend/Locale/Data/mn_Mong.xml create mode 100644 lib/zend/Zend/Locale/Data/mn_Mong_CN.xml create mode 100644 lib/zend/Zend/Locale/Data/mo.xml create mode 100644 lib/zend/Zend/Locale/Data/mr.xml create mode 100644 lib/zend/Zend/Locale/Data/mr_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/ms.xml create mode 100644 lib/zend/Zend/Locale/Data/ms_BN.xml create mode 100644 lib/zend/Zend/Locale/Data/ms_MY.xml create mode 100644 lib/zend/Zend/Locale/Data/mt.xml create mode 100644 lib/zend/Zend/Locale/Data/mt_MT.xml create mode 100644 lib/zend/Zend/Locale/Data/my.xml create mode 100644 lib/zend/Zend/Locale/Data/my_MM.xml create mode 100644 lib/zend/Zend/Locale/Data/nb.xml create mode 100644 lib/zend/Zend/Locale/Data/nb_NO.xml create mode 100644 lib/zend/Zend/Locale/Data/nds.xml create mode 100644 lib/zend/Zend/Locale/Data/nds_DE.xml create mode 100644 lib/zend/Zend/Locale/Data/ne.xml create mode 100644 lib/zend/Zend/Locale/Data/ne_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/ne_NP.xml create mode 100644 lib/zend/Zend/Locale/Data/nl.xml create mode 100644 lib/zend/Zend/Locale/Data/nl_BE.xml create mode 100644 lib/zend/Zend/Locale/Data/nl_NL.xml create mode 100644 lib/zend/Zend/Locale/Data/nn.xml create mode 100644 lib/zend/Zend/Locale/Data/nn_NO.xml create mode 100644 lib/zend/Zend/Locale/Data/no.xml create mode 100644 lib/zend/Zend/Locale/Data/nr.xml create mode 100644 lib/zend/Zend/Locale/Data/nr_ZA.xml create mode 100644 lib/zend/Zend/Locale/Data/nso.xml create mode 100644 lib/zend/Zend/Locale/Data/nso_ZA.xml create mode 100644 lib/zend/Zend/Locale/Data/numberingSystems.xml create mode 100644 lib/zend/Zend/Locale/Data/ny.xml create mode 100644 lib/zend/Zend/Locale/Data/ny_MW.xml create mode 100644 lib/zend/Zend/Locale/Data/oc.xml create mode 100644 lib/zend/Zend/Locale/Data/oc_FR.xml create mode 100644 lib/zend/Zend/Locale/Data/om.xml create mode 100644 lib/zend/Zend/Locale/Data/om_ET.xml create mode 100644 lib/zend/Zend/Locale/Data/om_KE.xml create mode 100644 lib/zend/Zend/Locale/Data/or.xml create mode 100644 lib/zend/Zend/Locale/Data/or_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/pa.xml create mode 100644 lib/zend/Zend/Locale/Data/pa_Arab.xml create mode 100644 lib/zend/Zend/Locale/Data/pa_Arab_PK.xml create mode 100644 lib/zend/Zend/Locale/Data/pa_Guru.xml create mode 100644 lib/zend/Zend/Locale/Data/pa_Guru_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/pa_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/pa_PK.xml create mode 100644 lib/zend/Zend/Locale/Data/pl.xml create mode 100644 lib/zend/Zend/Locale/Data/pl_PL.xml create mode 100644 lib/zend/Zend/Locale/Data/postalCodeData.xml create mode 100644 lib/zend/Zend/Locale/Data/ps.xml create mode 100644 lib/zend/Zend/Locale/Data/ps_AF.xml create mode 100644 lib/zend/Zend/Locale/Data/pt.xml create mode 100644 lib/zend/Zend/Locale/Data/pt_BR.xml create mode 100644 lib/zend/Zend/Locale/Data/pt_PT.xml create mode 100644 lib/zend/Zend/Locale/Data/ro.xml create mode 100644 lib/zend/Zend/Locale/Data/ro_MD.xml create mode 100644 lib/zend/Zend/Locale/Data/ro_RO.xml create mode 100644 lib/zend/Zend/Locale/Data/root.xml create mode 100644 lib/zend/Zend/Locale/Data/ru.xml create mode 100644 lib/zend/Zend/Locale/Data/ru_RU.xml create mode 100644 lib/zend/Zend/Locale/Data/ru_UA.xml create mode 100644 lib/zend/Zend/Locale/Data/rw.xml create mode 100644 lib/zend/Zend/Locale/Data/rw_RW.xml create mode 100644 lib/zend/Zend/Locale/Data/sa.xml create mode 100644 lib/zend/Zend/Locale/Data/sa_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/se.xml create mode 100644 lib/zend/Zend/Locale/Data/se_FI.xml create mode 100644 lib/zend/Zend/Locale/Data/se_NO.xml create mode 100644 lib/zend/Zend/Locale/Data/sh.xml create mode 100644 lib/zend/Zend/Locale/Data/sh_BA.xml create mode 100644 lib/zend/Zend/Locale/Data/sh_CS.xml create mode 100644 lib/zend/Zend/Locale/Data/sh_YU.xml create mode 100644 lib/zend/Zend/Locale/Data/si.xml create mode 100644 lib/zend/Zend/Locale/Data/si_LK.xml create mode 100644 lib/zend/Zend/Locale/Data/sid.xml create mode 100644 lib/zend/Zend/Locale/Data/sid_ET.xml create mode 100644 lib/zend/Zend/Locale/Data/sk.xml create mode 100644 lib/zend/Zend/Locale/Data/sk_SK.xml create mode 100644 lib/zend/Zend/Locale/Data/sl.xml create mode 100644 lib/zend/Zend/Locale/Data/sl_SI.xml create mode 100644 lib/zend/Zend/Locale/Data/so.xml create mode 100644 lib/zend/Zend/Locale/Data/so_DJ.xml create mode 100644 lib/zend/Zend/Locale/Data/so_ET.xml create mode 100644 lib/zend/Zend/Locale/Data/so_KE.xml create mode 100644 lib/zend/Zend/Locale/Data/so_SO.xml create mode 100644 lib/zend/Zend/Locale/Data/sq.xml create mode 100644 lib/zend/Zend/Locale/Data/sq_AL.xml create mode 100644 lib/zend/Zend/Locale/Data/sr.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_BA.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_CS.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Cyrl.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Cyrl_BA.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Cyrl_CS.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Cyrl_ME.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Cyrl_RS.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Cyrl_YU.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Latn.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Latn_BA.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Latn_CS.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Latn_ME.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Latn_RS.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_Latn_YU.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_ME.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_RS.xml create mode 100644 lib/zend/Zend/Locale/Data/sr_YU.xml create mode 100644 lib/zend/Zend/Locale/Data/ss.xml create mode 100644 lib/zend/Zend/Locale/Data/ss_SZ.xml create mode 100644 lib/zend/Zend/Locale/Data/ss_ZA.xml create mode 100644 lib/zend/Zend/Locale/Data/st.xml create mode 100644 lib/zend/Zend/Locale/Data/st_LS.xml create mode 100644 lib/zend/Zend/Locale/Data/st_ZA.xml create mode 100644 lib/zend/Zend/Locale/Data/supplementalData.xml create mode 100644 lib/zend/Zend/Locale/Data/sv.xml create mode 100644 lib/zend/Zend/Locale/Data/sv_FI.xml create mode 100644 lib/zend/Zend/Locale/Data/sv_SE.xml create mode 100644 lib/zend/Zend/Locale/Data/sw.xml create mode 100644 lib/zend/Zend/Locale/Data/sw_KE.xml create mode 100644 lib/zend/Zend/Locale/Data/sw_TZ.xml create mode 100644 lib/zend/Zend/Locale/Data/syr.xml create mode 100644 lib/zend/Zend/Locale/Data/syr_SY.xml create mode 100644 lib/zend/Zend/Locale/Data/ta.xml create mode 100644 lib/zend/Zend/Locale/Data/ta_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/te.xml create mode 100644 lib/zend/Zend/Locale/Data/te_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/telephoneCodeData.xml create mode 100644 lib/zend/Zend/Locale/Data/tg.xml create mode 100644 lib/zend/Zend/Locale/Data/tg_Cyrl.xml create mode 100644 lib/zend/Zend/Locale/Data/tg_Cyrl_TJ.xml create mode 100644 lib/zend/Zend/Locale/Data/tg_TJ.xml create mode 100644 lib/zend/Zend/Locale/Data/th.xml create mode 100644 lib/zend/Zend/Locale/Data/th_TH.xml create mode 100644 lib/zend/Zend/Locale/Data/ti.xml create mode 100644 lib/zend/Zend/Locale/Data/ti_ER.xml create mode 100644 lib/zend/Zend/Locale/Data/ti_ET.xml create mode 100644 lib/zend/Zend/Locale/Data/tig.xml create mode 100644 lib/zend/Zend/Locale/Data/tig_ER.xml create mode 100644 lib/zend/Zend/Locale/Data/tl.xml create mode 100644 lib/zend/Zend/Locale/Data/tn.xml create mode 100644 lib/zend/Zend/Locale/Data/tn_ZA.xml create mode 100644 lib/zend/Zend/Locale/Data/to.xml create mode 100644 lib/zend/Zend/Locale/Data/to_TO.xml create mode 100644 lib/zend/Zend/Locale/Data/tr.xml create mode 100644 lib/zend/Zend/Locale/Data/tr_TR.xml create mode 100644 lib/zend/Zend/Locale/Data/trv.xml create mode 100644 lib/zend/Zend/Locale/Data/trv_TW.xml create mode 100644 lib/zend/Zend/Locale/Data/ts.xml create mode 100644 lib/zend/Zend/Locale/Data/ts_ZA.xml create mode 100644 lib/zend/Zend/Locale/Data/tt.xml create mode 100644 lib/zend/Zend/Locale/Data/tt_RU.xml create mode 100644 lib/zend/Zend/Locale/Data/ug.xml create mode 100644 lib/zend/Zend/Locale/Data/ug_Arab.xml create mode 100644 lib/zend/Zend/Locale/Data/ug_Arab_CN.xml create mode 100644 lib/zend/Zend/Locale/Data/ug_CN.xml create mode 100644 lib/zend/Zend/Locale/Data/uk.xml create mode 100644 lib/zend/Zend/Locale/Data/uk_UA.xml create mode 100644 lib/zend/Zend/Locale/Data/ur.xml create mode 100644 lib/zend/Zend/Locale/Data/ur_IN.xml create mode 100644 lib/zend/Zend/Locale/Data/ur_PK.xml create mode 100644 lib/zend/Zend/Locale/Data/uz.xml create mode 100644 lib/zend/Zend/Locale/Data/uz_AF.xml create mode 100644 lib/zend/Zend/Locale/Data/uz_Arab.xml create mode 100644 lib/zend/Zend/Locale/Data/uz_Arab_AF.xml create mode 100644 lib/zend/Zend/Locale/Data/uz_Cyrl.xml create mode 100644 lib/zend/Zend/Locale/Data/uz_Cyrl_UZ.xml create mode 100644 lib/zend/Zend/Locale/Data/uz_Latn.xml create mode 100644 lib/zend/Zend/Locale/Data/uz_Latn_UZ.xml create mode 100644 lib/zend/Zend/Locale/Data/uz_UZ.xml create mode 100644 lib/zend/Zend/Locale/Data/ve.xml create mode 100644 lib/zend/Zend/Locale/Data/ve_ZA.xml create mode 100644 lib/zend/Zend/Locale/Data/vi.xml create mode 100644 lib/zend/Zend/Locale/Data/vi_VN.xml create mode 100644 lib/zend/Zend/Locale/Data/wal.xml create mode 100644 lib/zend/Zend/Locale/Data/wal_ET.xml create mode 100644 lib/zend/Zend/Locale/Data/wo.xml create mode 100644 lib/zend/Zend/Locale/Data/wo_Latn.xml create mode 100644 lib/zend/Zend/Locale/Data/wo_Latn_SN.xml create mode 100644 lib/zend/Zend/Locale/Data/wo_SN.xml create mode 100644 lib/zend/Zend/Locale/Data/xh.xml create mode 100644 lib/zend/Zend/Locale/Data/xh_ZA.xml create mode 100644 lib/zend/Zend/Locale/Data/yo.xml create mode 100644 lib/zend/Zend/Locale/Data/yo_NG.xml create mode 100644 lib/zend/Zend/Locale/Data/zh.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_CN.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_HK.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_Hans.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_Hans_CN.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_Hans_HK.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_Hans_MO.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_Hans_SG.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_Hant.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_Hant_HK.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_Hant_MO.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_Hant_TW.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_MO.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_SG.xml create mode 100644 lib/zend/Zend/Locale/Data/zh_TW.xml create mode 100644 lib/zend/Zend/Locale/Data/zu.xml create mode 100644 lib/zend/Zend/Locale/Data/zu_ZA.xml create mode 100644 lib/zend/Zend/Locale/Exception.php create mode 100644 lib/zend/Zend/Locale/Format.php create mode 100644 lib/zend/Zend/Locale/Math.php create mode 100644 lib/zend/Zend/Locale/Math/Exception.php create mode 100644 lib/zend/Zend/Locale/Math/PhpMath.php create mode 100644 lib/zend/Zend/Log/Exception.php create mode 100644 lib/zend/Zend/Log/Filter/Interface.php create mode 100644 lib/zend/Zend/Log/Filter/Message.php create mode 100644 lib/zend/Zend/Log/Filter/Priority.php create mode 100644 lib/zend/Zend/Log/Filter/Suppress.php create mode 100644 lib/zend/Zend/Log/Formatter/Firebug.php create mode 100644 lib/zend/Zend/Log/Formatter/Interface.php create mode 100644 lib/zend/Zend/Log/Formatter/Simple.php create mode 100644 lib/zend/Zend/Log/Formatter/Xml.php create mode 100644 lib/zend/Zend/Log/Writer/Abstract.php create mode 100644 lib/zend/Zend/Log/Writer/Db.php create mode 100644 lib/zend/Zend/Log/Writer/Firebug.php create mode 100644 lib/zend/Zend/Log/Writer/Mail.php create mode 100644 lib/zend/Zend/Log/Writer/Mock.php create mode 100644 lib/zend/Zend/Log/Writer/Null.php create mode 100644 lib/zend/Zend/Log/Writer/Stream.php create mode 100644 lib/zend/Zend/Log/Writer/Syslog.php create mode 100644 lib/zend/Zend/Mail/Exception.php create mode 100644 lib/zend/Zend/Mail/Message.php create mode 100644 lib/zend/Zend/Mail/Message/File.php create mode 100644 lib/zend/Zend/Mail/Message/Interface.php create mode 100644 lib/zend/Zend/Mail/Part.php create mode 100644 lib/zend/Zend/Mail/Part/File.php create mode 100644 lib/zend/Zend/Mail/Part/Interface.php create mode 100644 lib/zend/Zend/Mail/Protocol/Abstract.php create mode 100644 lib/zend/Zend/Mail/Protocol/Exception.php create mode 100644 lib/zend/Zend/Mail/Protocol/Imap.php create mode 100644 lib/zend/Zend/Mail/Protocol/Pop3.php create mode 100644 lib/zend/Zend/Mail/Protocol/Smtp.php create mode 100644 lib/zend/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php create mode 100644 lib/zend/Zend/Mail/Protocol/Smtp/Auth/Login.php create mode 100644 lib/zend/Zend/Mail/Protocol/Smtp/Auth/Plain.php create mode 100644 lib/zend/Zend/Mail/Storage.php create mode 100644 lib/zend/Zend/Mail/Storage/Abstract.php create mode 100644 lib/zend/Zend/Mail/Storage/Exception.php create mode 100644 lib/zend/Zend/Mail/Storage/Folder.php create mode 100644 lib/zend/Zend/Mail/Storage/Folder/Interface.php create mode 100644 lib/zend/Zend/Mail/Storage/Folder/Maildir.php create mode 100644 lib/zend/Zend/Mail/Storage/Folder/Mbox.php create mode 100644 lib/zend/Zend/Mail/Storage/Imap.php create mode 100644 lib/zend/Zend/Mail/Storage/Maildir.php create mode 100644 lib/zend/Zend/Mail/Storage/Mbox.php create mode 100644 lib/zend/Zend/Mail/Storage/Pop3.php create mode 100644 lib/zend/Zend/Mail/Storage/Writable/Interface.php create mode 100644 lib/zend/Zend/Mail/Storage/Writable/Maildir.php create mode 100644 lib/zend/Zend/Mail/Transport/Abstract.php create mode 100644 lib/zend/Zend/Mail/Transport/Exception.php create mode 100644 lib/zend/Zend/Mail/Transport/Sendmail.php create mode 100644 lib/zend/Zend/Mail/Transport/Smtp.php create mode 100644 lib/zend/Zend/Measure/Abstract.php create mode 100644 lib/zend/Zend/Measure/Acceleration.php create mode 100644 lib/zend/Zend/Measure/Angle.php create mode 100644 lib/zend/Zend/Measure/Area.php create mode 100644 lib/zend/Zend/Measure/Binary.php create mode 100644 lib/zend/Zend/Measure/Capacitance.php create mode 100644 lib/zend/Zend/Measure/Cooking/Volume.php create mode 100644 lib/zend/Zend/Measure/Cooking/Weight.php create mode 100644 lib/zend/Zend/Measure/Current.php create mode 100644 lib/zend/Zend/Measure/Density.php create mode 100644 lib/zend/Zend/Measure/Energy.php create mode 100644 lib/zend/Zend/Measure/Exception.php create mode 100644 lib/zend/Zend/Measure/Flow/Mass.php create mode 100644 lib/zend/Zend/Measure/Flow/Mole.php create mode 100644 lib/zend/Zend/Measure/Flow/Volume.php create mode 100644 lib/zend/Zend/Measure/Force.php create mode 100644 lib/zend/Zend/Measure/Frequency.php create mode 100644 lib/zend/Zend/Measure/Illumination.php create mode 100644 lib/zend/Zend/Measure/Length.php create mode 100644 lib/zend/Zend/Measure/Lightness.php create mode 100644 lib/zend/Zend/Measure/Number.php create mode 100644 lib/zend/Zend/Measure/Power.php create mode 100644 lib/zend/Zend/Measure/Pressure.php create mode 100644 lib/zend/Zend/Measure/Speed.php create mode 100644 lib/zend/Zend/Measure/Temperature.php create mode 100644 lib/zend/Zend/Measure/Time.php create mode 100644 lib/zend/Zend/Measure/Torque.php create mode 100644 lib/zend/Zend/Measure/Viscosity/Dynamic.php create mode 100644 lib/zend/Zend/Measure/Viscosity/Kinematic.php create mode 100644 lib/zend/Zend/Measure/Volume.php create mode 100644 lib/zend/Zend/Measure/Weight.php create mode 100644 lib/zend/Zend/Memory/AccessController.php create mode 100644 lib/zend/Zend/Memory/Container.php create mode 100644 lib/zend/Zend/Memory/Container/Interface.php create mode 100644 lib/zend/Zend/Memory/Container/Locked.php create mode 100644 lib/zend/Zend/Memory/Container/Movable.php create mode 100644 lib/zend/Zend/Memory/Exception.php create mode 100644 lib/zend/Zend/Memory/Manager.php create mode 100644 lib/zend/Zend/Memory/Value.php create mode 100644 lib/zend/Zend/Mime/Decode.php create mode 100644 lib/zend/Zend/Navigation/Container.php create mode 100644 lib/zend/Zend/Navigation/Exception.php create mode 100644 lib/zend/Zend/Navigation/Page.php create mode 100644 lib/zend/Zend/Navigation/Page/Mvc.php create mode 100644 lib/zend/Zend/Navigation/Page/Uri.php create mode 100644 lib/zend/Zend/OpenId/Consumer.php create mode 100644 lib/zend/Zend/OpenId/Consumer/Storage.php create mode 100644 lib/zend/Zend/OpenId/Consumer/Storage/File.php create mode 100644 lib/zend/Zend/OpenId/Exception.php create mode 100644 lib/zend/Zend/OpenId/Extension.php create mode 100644 lib/zend/Zend/OpenId/Extension/Sreg.php create mode 100644 lib/zend/Zend/OpenId/Provider.php create mode 100644 lib/zend/Zend/OpenId/Provider/Storage.php create mode 100644 lib/zend/Zend/OpenId/Provider/Storage/File.php create mode 100644 lib/zend/Zend/OpenId/Provider/User.php create mode 100644 lib/zend/Zend/OpenId/Provider/User/Session.php create mode 100644 lib/zend/Zend/Paginator/Adapter/Array.php create mode 100644 lib/zend/Zend/Paginator/Adapter/DbSelect.php create mode 100644 lib/zend/Zend/Paginator/Adapter/DbTableSelect.php create mode 100644 lib/zend/Zend/Paginator/Adapter/Interface.php create mode 100644 lib/zend/Zend/Paginator/Adapter/Iterator.php create mode 100644 lib/zend/Zend/Paginator/Adapter/Null.php create mode 100644 lib/zend/Zend/Paginator/AdapterAggregate.php create mode 100644 lib/zend/Zend/Paginator/Exception.php create mode 100644 lib/zend/Zend/Paginator/ScrollingStyle/All.php create mode 100644 lib/zend/Zend/Paginator/ScrollingStyle/Elastic.php create mode 100644 lib/zend/Zend/Paginator/ScrollingStyle/Interface.php create mode 100644 lib/zend/Zend/Paginator/ScrollingStyle/Jumping.php create mode 100644 lib/zend/Zend/Paginator/ScrollingStyle/Sliding.php create mode 100644 lib/zend/Zend/Pdf/Action.php create mode 100644 lib/zend/Zend/Pdf/Action/GoTo.php create mode 100644 lib/zend/Zend/Pdf/Action/GoTo3DView.php create mode 100644 lib/zend/Zend/Pdf/Action/GoToE.php create mode 100644 lib/zend/Zend/Pdf/Action/GoToR.php create mode 100644 lib/zend/Zend/Pdf/Action/Hide.php create mode 100644 lib/zend/Zend/Pdf/Action/ImportData.php create mode 100644 lib/zend/Zend/Pdf/Action/JavaScript.php create mode 100644 lib/zend/Zend/Pdf/Action/Launch.php create mode 100644 lib/zend/Zend/Pdf/Action/Movie.php create mode 100644 lib/zend/Zend/Pdf/Action/Named.php create mode 100644 lib/zend/Zend/Pdf/Action/Rendition.php create mode 100644 lib/zend/Zend/Pdf/Action/ResetForm.php create mode 100644 lib/zend/Zend/Pdf/Action/SetOCGState.php create mode 100644 lib/zend/Zend/Pdf/Action/Sound.php create mode 100644 lib/zend/Zend/Pdf/Action/SubmitForm.php create mode 100644 lib/zend/Zend/Pdf/Action/Thread.php create mode 100644 lib/zend/Zend/Pdf/Action/Trans.php create mode 100644 lib/zend/Zend/Pdf/Action/URI.php create mode 100644 lib/zend/Zend/Pdf/Action/Unknown.php create mode 100644 lib/zend/Zend/Pdf/Annotation.php create mode 100644 lib/zend/Zend/Pdf/Annotation/FileAttachment.php create mode 100644 lib/zend/Zend/Pdf/Annotation/Link.php create mode 100644 lib/zend/Zend/Pdf/Annotation/Text.php create mode 100644 lib/zend/Zend/Pdf/Cmap.php create mode 100644 lib/zend/Zend/Pdf/Cmap/ByteEncoding.php create mode 100644 lib/zend/Zend/Pdf/Cmap/ByteEncoding/Static.php create mode 100644 lib/zend/Zend/Pdf/Cmap/SegmentToDelta.php create mode 100644 lib/zend/Zend/Pdf/Cmap/TrimmedTable.php create mode 100644 lib/zend/Zend/Pdf/Color.php create mode 100644 lib/zend/Zend/Pdf/Color/Cmyk.php create mode 100644 lib/zend/Zend/Pdf/Color/GrayScale.php create mode 100644 lib/zend/Zend/Pdf/Color/Html.php create mode 100644 lib/zend/Zend/Pdf/Color/Rgb.php create mode 100644 lib/zend/Zend/Pdf/Destination.php create mode 100644 lib/zend/Zend/Pdf/Destination/Explicit.php create mode 100644 lib/zend/Zend/Pdf/Destination/Fit.php create mode 100644 lib/zend/Zend/Pdf/Destination/FitBoundingBox.php create mode 100644 lib/zend/Zend/Pdf/Destination/FitBoundingBoxHorizontally.php create mode 100644 lib/zend/Zend/Pdf/Destination/FitBoundingBoxVertically.php create mode 100644 lib/zend/Zend/Pdf/Destination/FitHorizontally.php create mode 100644 lib/zend/Zend/Pdf/Destination/FitRectangle.php create mode 100644 lib/zend/Zend/Pdf/Destination/FitVertically.php create mode 100644 lib/zend/Zend/Pdf/Destination/Named.php create mode 100644 lib/zend/Zend/Pdf/Destination/Unknown.php create mode 100644 lib/zend/Zend/Pdf/Destination/Zoom.php create mode 100644 lib/zend/Zend/Pdf/Element.php create mode 100644 lib/zend/Zend/Pdf/Element/Array.php create mode 100644 lib/zend/Zend/Pdf/Element/Boolean.php create mode 100644 lib/zend/Zend/Pdf/Element/Dictionary.php create mode 100644 lib/zend/Zend/Pdf/Element/Name.php create mode 100644 lib/zend/Zend/Pdf/Element/Null.php create mode 100644 lib/zend/Zend/Pdf/Element/Numeric.php create mode 100644 lib/zend/Zend/Pdf/Element/Object.php create mode 100644 lib/zend/Zend/Pdf/Element/Object/Stream.php create mode 100644 lib/zend/Zend/Pdf/Element/Reference.php create mode 100644 lib/zend/Zend/Pdf/Element/Reference/Context.php create mode 100644 lib/zend/Zend/Pdf/Element/Reference/Table.php create mode 100644 lib/zend/Zend/Pdf/Element/Stream.php create mode 100644 lib/zend/Zend/Pdf/Element/String.php create mode 100644 lib/zend/Zend/Pdf/Element/String/Binary.php create mode 100644 lib/zend/Zend/Pdf/ElementFactory.php create mode 100644 lib/zend/Zend/Pdf/ElementFactory/Interface.php create mode 100644 lib/zend/Zend/Pdf/ElementFactory/Proxy.php create mode 100644 lib/zend/Zend/Pdf/Exception.php create mode 100644 lib/zend/Zend/Pdf/FileParser.php create mode 100644 lib/zend/Zend/Pdf/FileParser/Font.php create mode 100644 lib/zend/Zend/Pdf/FileParser/Font/OpenType.php create mode 100644 lib/zend/Zend/Pdf/FileParser/Font/OpenType/TrueType.php create mode 100644 lib/zend/Zend/Pdf/FileParser/Image.php create mode 100644 lib/zend/Zend/Pdf/FileParser/Image/Png.php create mode 100644 lib/zend/Zend/Pdf/FileParserDataSource.php create mode 100644 lib/zend/Zend/Pdf/FileParserDataSource/File.php create mode 100644 lib/zend/Zend/Pdf/FileParserDataSource/String.php create mode 100644 lib/zend/Zend/Pdf/Filter/Ascii85.php create mode 100644 lib/zend/Zend/Pdf/Filter/AsciiHex.php create mode 100644 lib/zend/Zend/Pdf/Filter/Compression.php create mode 100644 lib/zend/Zend/Pdf/Filter/Compression/Flate.php create mode 100644 lib/zend/Zend/Pdf/Filter/Compression/Lzw.php create mode 100644 lib/zend/Zend/Pdf/Filter/Interface.php create mode 100644 lib/zend/Zend/Pdf/Font.php create mode 100644 lib/zend/Zend/Pdf/Image.php create mode 100644 lib/zend/Zend/Pdf/NameTree.php create mode 100644 lib/zend/Zend/Pdf/Outline.php create mode 100644 lib/zend/Zend/Pdf/Outline/Created.php create mode 100644 lib/zend/Zend/Pdf/Outline/Loaded.php create mode 100644 lib/zend/Zend/Pdf/Page.php create mode 100644 lib/zend/Zend/Pdf/Parser.php create mode 100644 lib/zend/Zend/Pdf/RecursivelyIteratableObjectsContainer.php create mode 100644 lib/zend/Zend/Pdf/Resource.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/CidFont.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/CidFont/TrueType.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Extracted.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/FontDescriptor.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Parsed.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Parsed/TrueType.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/Courier.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/CourierBold.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/CourierBoldOblique.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/CourierOblique.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/Helvetica.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBold.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBoldOblique.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaOblique.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/Symbol.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/TimesBold.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/TimesBoldItalic.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/TimesItalic.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/TimesRoman.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Simple/Standard/ZapfDingbats.php create mode 100644 lib/zend/Zend/Pdf/Resource/Font/Type0.php create mode 100644 lib/zend/Zend/Pdf/Resource/Image.php create mode 100644 lib/zend/Zend/Pdf/Resource/Image/Jpeg.php create mode 100644 lib/zend/Zend/Pdf/Resource/Image/Png.php create mode 100644 lib/zend/Zend/Pdf/Resource/Image/Tiff.php create mode 100644 lib/zend/Zend/Pdf/Resource/ImageFactory.php create mode 100644 lib/zend/Zend/Pdf/StringParser.php create mode 100644 lib/zend/Zend/Pdf/Style.php create mode 100644 lib/zend/Zend/Pdf/Target.php create mode 100644 lib/zend/Zend/Pdf/Trailer.php create mode 100644 lib/zend/Zend/Pdf/Trailer/Generator.php create mode 100644 lib/zend/Zend/Pdf/Trailer/Keeper.php create mode 100644 lib/zend/Zend/Pdf/UpdateInfoContainer.php create mode 100644 lib/zend/Zend/ProgressBar/Adapter.php create mode 100644 lib/zend/Zend/ProgressBar/Adapter/Console.php create mode 100644 lib/zend/Zend/ProgressBar/Adapter/Exception.php create mode 100644 lib/zend/Zend/ProgressBar/Adapter/JsPull.php create mode 100644 lib/zend/Zend/ProgressBar/Adapter/JsPush.php create mode 100644 lib/zend/Zend/ProgressBar/Exception.php create mode 100644 lib/zend/Zend/Queue/Adapter/Activemq.php create mode 100644 lib/zend/Zend/Queue/Adapter/AdapterAbstract.php create mode 100644 lib/zend/Zend/Queue/Adapter/AdapterInterface.php create mode 100644 lib/zend/Zend/Queue/Adapter/Array.php create mode 100644 lib/zend/Zend/Queue/Adapter/Db.php create mode 100644 lib/zend/Zend/Queue/Adapter/Db/Message.php create mode 100644 lib/zend/Zend/Queue/Adapter/Db/Queue.php create mode 100644 lib/zend/Zend/Queue/Adapter/Db/queue.sql create mode 100644 lib/zend/Zend/Queue/Adapter/Memcacheq.php create mode 100644 lib/zend/Zend/Queue/Adapter/Null.php create mode 100644 lib/zend/Zend/Queue/Adapter/PlatformJobQueue.php create mode 100644 lib/zend/Zend/Queue/Exception.php create mode 100644 lib/zend/Zend/Queue/Message.php create mode 100644 lib/zend/Zend/Queue/Message/Iterator.php create mode 100644 lib/zend/Zend/Queue/Message/PlatformJob.php create mode 100644 lib/zend/Zend/Queue/Stomp/Client.php create mode 100644 lib/zend/Zend/Queue/Stomp/Client/Connection.php create mode 100644 lib/zend/Zend/Queue/Stomp/Client/ConnectionInterface.php create mode 100644 lib/zend/Zend/Queue/Stomp/Frame.php create mode 100644 lib/zend/Zend/Queue/Stomp/FrameInterface.php create mode 100644 lib/zend/Zend/Reflection/Class.php create mode 100644 lib/zend/Zend/Reflection/Docblock.php create mode 100644 lib/zend/Zend/Reflection/Docblock/Tag.php create mode 100644 lib/zend/Zend/Reflection/Docblock/Tag/Param.php create mode 100644 lib/zend/Zend/Reflection/Docblock/Tag/Return.php create mode 100644 lib/zend/Zend/Reflection/Exception.php create mode 100644 lib/zend/Zend/Reflection/Extension.php create mode 100644 lib/zend/Zend/Reflection/File.php create mode 100644 lib/zend/Zend/Reflection/Function.php create mode 100644 lib/zend/Zend/Reflection/Method.php create mode 100644 lib/zend/Zend/Reflection/Parameter.php create mode 100644 lib/zend/Zend/Reflection/Property.php create mode 100644 lib/zend/Zend/Rest/Controller.php create mode 100644 lib/zend/Zend/Rest/Route.php create mode 100644 lib/zend/Zend/Search/Exception.php create mode 100644 lib/zend/Zend/Search/Lucene.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Analyzer.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Analyzer/Common.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Analyzer/Common/Text.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum/CaseInsensitive.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num/CaseInsensitive.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/Token.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/TokenFilter.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/TokenFilter/LowerCase.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/TokenFilter/LowerCaseUtf8.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/TokenFilter/ShortWords.php create mode 100644 lib/zend/Zend/Search/Lucene/Analysis/TokenFilter/StopWords.php create mode 100644 lib/zend/Zend/Search/Lucene/Document.php create mode 100644 lib/zend/Zend/Search/Lucene/Document/Docx.php create mode 100644 lib/zend/Zend/Search/Lucene/Document/Exception.php create mode 100644 lib/zend/Zend/Search/Lucene/Document/Html.php create mode 100644 lib/zend/Zend/Search/Lucene/Document/OpenXml.php create mode 100644 lib/zend/Zend/Search/Lucene/Document/Pptx.php create mode 100644 lib/zend/Zend/Search/Lucene/Document/Xlsx.php create mode 100644 lib/zend/Zend/Search/Lucene/Exception.php create mode 100644 lib/zend/Zend/Search/Lucene/FSM.php create mode 100644 lib/zend/Zend/Search/Lucene/FSMAction.php create mode 100644 lib/zend/Zend/Search/Lucene/Field.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/DictionaryLoader.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/DocsFilter.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/FieldInfo.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/SegmentInfo.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/SegmentMerger.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/SegmentWriter.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/SegmentWriter/DocumentWriter.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/Term.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/TermInfo.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/TermsPriorityQueue.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/TermsStream/Interface.php create mode 100644 lib/zend/Zend/Search/Lucene/Index/Writer.php create mode 100644 lib/zend/Zend/Search/Lucene/Interface.php create mode 100644 lib/zend/Zend/Search/Lucene/LockManager.php create mode 100644 lib/zend/Zend/Search/Lucene/MultiSearcher.php create mode 100644 lib/zend/Zend/Search/Lucene/PriorityQueue.php create mode 100644 lib/zend/Zend/Search/Lucene/Proxy.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Highlighter/Default.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Highlighter/Interface.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Boolean.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Empty.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Fuzzy.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Insignificant.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/MultiTerm.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Phrase.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Preprocessing.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Preprocessing/Fuzzy.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Preprocessing/Phrase.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Preprocessing/Term.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Range.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Term.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Query/Wildcard.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/QueryEntry.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/QueryEntry/Phrase.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/QueryEntry/Subquery.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/QueryEntry/Term.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/QueryHit.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/QueryLexer.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/QueryParser.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/QueryParserContext.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/QueryParserException.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/QueryToken.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Similarity.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Similarity/Default.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Weight.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Weight/Boolean.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Weight/Empty.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Weight/MultiTerm.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Weight/Phrase.php create mode 100644 lib/zend/Zend/Search/Lucene/Search/Weight/Term.php create mode 100644 lib/zend/Zend/Search/Lucene/Storage/Directory.php create mode 100644 lib/zend/Zend/Search/Lucene/Storage/Directory/Filesystem.php create mode 100644 lib/zend/Zend/Search/Lucene/Storage/File.php create mode 100644 lib/zend/Zend/Search/Lucene/Storage/File/Filesystem.php create mode 100644 lib/zend/Zend/Search/Lucene/Storage/File/Memory.php create mode 100644 lib/zend/Zend/Search/Lucene/TermStreamsPriorityQueue.php create mode 100644 lib/zend/Zend/Service/Akismet.php create mode 100644 lib/zend/Zend/Service/Amazon.php create mode 100644 lib/zend/Zend/Service/Amazon/Abstract.php create mode 100644 lib/zend/Zend/Service/Amazon/Accessories.php create mode 100644 lib/zend/Zend/Service/Amazon/CustomerReview.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Abstract.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Availabilityzones.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/CloudWatch.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Ebs.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Elasticip.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Exception.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Image.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Instance.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Instance/Reserved.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Instance/Windows.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Keypair.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Region.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Response.php create mode 100644 lib/zend/Zend/Service/Amazon/Ec2/Securitygroups.php create mode 100644 lib/zend/Zend/Service/Amazon/EditorialReview.php create mode 100755 lib/zend/Zend/Service/Amazon/Exception.php create mode 100644 lib/zend/Zend/Service/Amazon/Image.php create mode 100644 lib/zend/Zend/Service/Amazon/Item.php create mode 100644 lib/zend/Zend/Service/Amazon/ListmaniaList.php create mode 100644 lib/zend/Zend/Service/Amazon/Offer.php create mode 100644 lib/zend/Zend/Service/Amazon/OfferSet.php create mode 100644 lib/zend/Zend/Service/Amazon/Query.php create mode 100644 lib/zend/Zend/Service/Amazon/ResultSet.php create mode 100755 lib/zend/Zend/Service/Amazon/S3.php create mode 100755 lib/zend/Zend/Service/Amazon/S3/Exception.php create mode 100755 lib/zend/Zend/Service/Amazon/S3/Stream.php create mode 100644 lib/zend/Zend/Service/Amazon/SimilarProduct.php create mode 100644 lib/zend/Zend/Service/Amazon/Sqs.php create mode 100644 lib/zend/Zend/Service/Amazon/Sqs/Exception.php create mode 100644 lib/zend/Zend/Service/Audioscrobbler.php create mode 100644 lib/zend/Zend/Service/Delicious.php create mode 100644 lib/zend/Zend/Service/Delicious/Exception.php create mode 100644 lib/zend/Zend/Service/Delicious/Post.php create mode 100644 lib/zend/Zend/Service/Delicious/PostList.php create mode 100644 lib/zend/Zend/Service/Delicious/SimplePost.php create mode 100644 lib/zend/Zend/Service/Exception.php create mode 100644 lib/zend/Zend/Service/Flickr.php create mode 100644 lib/zend/Zend/Service/Flickr/Image.php create mode 100644 lib/zend/Zend/Service/Flickr/Result.php create mode 100644 lib/zend/Zend/Service/Flickr/ResultSet.php create mode 100644 lib/zend/Zend/Service/Nirvanix.php create mode 100644 lib/zend/Zend/Service/Nirvanix/Exception.php create mode 100644 lib/zend/Zend/Service/Nirvanix/Namespace/Base.php create mode 100644 lib/zend/Zend/Service/Nirvanix/Namespace/Imfs.php create mode 100644 lib/zend/Zend/Service/Nirvanix/Response.php create mode 100644 lib/zend/Zend/Service/ReCaptcha.php create mode 100644 lib/zend/Zend/Service/ReCaptcha/Exception.php create mode 100644 lib/zend/Zend/Service/ReCaptcha/MailHide.php create mode 100644 lib/zend/Zend/Service/ReCaptcha/MailHide/Exception.php create mode 100644 lib/zend/Zend/Service/ReCaptcha/Response.php create mode 100644 lib/zend/Zend/Service/Simpy.php create mode 100644 lib/zend/Zend/Service/Simpy/Link.php create mode 100644 lib/zend/Zend/Service/Simpy/LinkQuery.php create mode 100644 lib/zend/Zend/Service/Simpy/LinkSet.php create mode 100644 lib/zend/Zend/Service/Simpy/Note.php create mode 100644 lib/zend/Zend/Service/Simpy/NoteSet.php create mode 100644 lib/zend/Zend/Service/Simpy/Tag.php create mode 100644 lib/zend/Zend/Service/Simpy/TagSet.php create mode 100644 lib/zend/Zend/Service/Simpy/Watchlist.php create mode 100644 lib/zend/Zend/Service/Simpy/WatchlistFilter.php create mode 100644 lib/zend/Zend/Service/Simpy/WatchlistFilterSet.php create mode 100644 lib/zend/Zend/Service/Simpy/WatchlistSet.php create mode 100644 lib/zend/Zend/Service/SlideShare.php create mode 100644 lib/zend/Zend/Service/SlideShare/Exception.php create mode 100644 lib/zend/Zend/Service/SlideShare/SlideShow.php create mode 100644 lib/zend/Zend/Service/StrikeIron.php create mode 100644 lib/zend/Zend/Service/StrikeIron/Base.php create mode 100644 lib/zend/Zend/Service/StrikeIron/Decorator.php create mode 100644 lib/zend/Zend/Service/StrikeIron/Exception.php create mode 100644 lib/zend/Zend/Service/StrikeIron/SalesUseTaxBasic.php create mode 100644 lib/zend/Zend/Service/StrikeIron/USAddressVerification.php create mode 100644 lib/zend/Zend/Service/StrikeIron/ZipCodeInfo.php create mode 100644 lib/zend/Zend/Service/Technorati.php create mode 100644 lib/zend/Zend/Service/Technorati/Author.php create mode 100644 lib/zend/Zend/Service/Technorati/BlogInfoResult.php create mode 100644 lib/zend/Zend/Service/Technorati/CosmosResult.php create mode 100644 lib/zend/Zend/Service/Technorati/CosmosResultSet.php create mode 100644 lib/zend/Zend/Service/Technorati/DailyCountsResult.php create mode 100644 lib/zend/Zend/Service/Technorati/DailyCountsResultSet.php create mode 100644 lib/zend/Zend/Service/Technorati/Exception.php create mode 100644 lib/zend/Zend/Service/Technorati/GetInfoResult.php create mode 100644 lib/zend/Zend/Service/Technorati/KeyInfoResult.php create mode 100644 lib/zend/Zend/Service/Technorati/Result.php create mode 100644 lib/zend/Zend/Service/Technorati/ResultSet.php create mode 100644 lib/zend/Zend/Service/Technorati/SearchResult.php create mode 100644 lib/zend/Zend/Service/Technorati/SearchResultSet.php create mode 100644 lib/zend/Zend/Service/Technorati/TagResult.php create mode 100644 lib/zend/Zend/Service/Technorati/TagResultSet.php create mode 100644 lib/zend/Zend/Service/Technorati/TagsResult.php create mode 100644 lib/zend/Zend/Service/Technorati/TagsResultSet.php create mode 100644 lib/zend/Zend/Service/Technorati/Utils.php create mode 100644 lib/zend/Zend/Service/Technorati/Weblog.php create mode 100755 lib/zend/Zend/Service/Twitter.php create mode 100755 lib/zend/Zend/Service/Twitter/Exception.php create mode 100644 lib/zend/Zend/Service/Twitter/Search.php create mode 100644 lib/zend/Zend/Service/Yahoo.php create mode 100644 lib/zend/Zend/Service/Yahoo/Image.php create mode 100644 lib/zend/Zend/Service/Yahoo/ImageResult.php create mode 100644 lib/zend/Zend/Service/Yahoo/ImageResultSet.php create mode 100644 lib/zend/Zend/Service/Yahoo/InlinkDataResult.php create mode 100644 lib/zend/Zend/Service/Yahoo/InlinkDataResultSet.php create mode 100644 lib/zend/Zend/Service/Yahoo/LocalResult.php create mode 100644 lib/zend/Zend/Service/Yahoo/LocalResultSet.php create mode 100644 lib/zend/Zend/Service/Yahoo/NewsResult.php create mode 100644 lib/zend/Zend/Service/Yahoo/NewsResultSet.php create mode 100644 lib/zend/Zend/Service/Yahoo/PageDataResult.php create mode 100644 lib/zend/Zend/Service/Yahoo/PageDataResultSet.php create mode 100644 lib/zend/Zend/Service/Yahoo/Result.php create mode 100644 lib/zend/Zend/Service/Yahoo/ResultSet.php create mode 100644 lib/zend/Zend/Service/Yahoo/VideoResult.php create mode 100644 lib/zend/Zend/Service/Yahoo/VideoResultSet.php create mode 100644 lib/zend/Zend/Service/Yahoo/WebResult.php create mode 100644 lib/zend/Zend/Service/Yahoo/WebResultSet.php create mode 100644 lib/zend/Zend/Session/Abstract.php create mode 100644 lib/zend/Zend/Session/Exception.php create mode 100644 lib/zend/Zend/Session/Namespace.php create mode 100644 lib/zend/Zend/Session/SaveHandler/DbTable.php create mode 100644 lib/zend/Zend/Session/SaveHandler/Exception.php create mode 100644 lib/zend/Zend/Session/SaveHandler/Interface.php create mode 100644 lib/zend/Zend/Session/Validator/Abstract.php create mode 100644 lib/zend/Zend/Session/Validator/HttpUserAgent.php create mode 100644 lib/zend/Zend/Session/Validator/Interface.php delete mode 100644 lib/zend/Zend/Soap/Wsdl/CodeGenerator.php delete mode 100644 lib/zend/Zend/Soap/Wsdl/Parser.php create mode 100644 lib/zend/Zend/Soap/Wsdl/Strategy/Composite.php create mode 100644 lib/zend/Zend/Tag/Cloud.php create mode 100644 lib/zend/Zend/Tag/Cloud/Decorator/Cloud.php create mode 100644 lib/zend/Zend/Tag/Cloud/Decorator/Exception.php create mode 100644 lib/zend/Zend/Tag/Cloud/Decorator/HtmlCloud.php create mode 100644 lib/zend/Zend/Tag/Cloud/Decorator/HtmlTag.php create mode 100644 lib/zend/Zend/Tag/Cloud/Decorator/Tag.php create mode 100644 lib/zend/Zend/Tag/Cloud/Exception.php create mode 100644 lib/zend/Zend/Tag/Exception.php create mode 100644 lib/zend/Zend/Tag/Item.php create mode 100644 lib/zend/Zend/Tag/ItemList.php create mode 100644 lib/zend/Zend/Tag/Taggable.php create mode 100644 lib/zend/Zend/Test/DbAdapter.php create mode 100644 lib/zend/Zend/Test/DbStatement.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Constraint/DomQuery.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Constraint/Exception.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Constraint/Redirect.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Constraint/ResponseHeader.php create mode 100644 lib/zend/Zend/Test/PHPUnit/ControllerTestCase.php create mode 100644 lib/zend/Zend/Test/PHPUnit/DatabaseTestCase.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/Connection.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbTable.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSet.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/DataSet/QueryDataSet.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/DataSet/QueryTable.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/Exception.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/Metadata/Generic.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/Operation/DeleteAll.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/Operation/Insert.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/Operation/Truncate.php create mode 100644 lib/zend/Zend/Test/PHPUnit/Db/SimpleTester.php create mode 100644 lib/zend/Zend/Text/Exception.php create mode 100644 lib/zend/Zend/Text/Figlet.php create mode 100644 lib/zend/Zend/Text/Figlet/Exception.php create mode 100644 lib/zend/Zend/Text/Figlet/zend-framework.flf create mode 100644 lib/zend/Zend/Text/MultiByte.php create mode 100644 lib/zend/Zend/Text/Table.php create mode 100644 lib/zend/Zend/Text/Table/Column.php create mode 100644 lib/zend/Zend/Text/Table/Decorator/Ascii.php create mode 100644 lib/zend/Zend/Text/Table/Decorator/Interface.php create mode 100644 lib/zend/Zend/Text/Table/Decorator/Unicode.php create mode 100644 lib/zend/Zend/Text/Table/Exception.php create mode 100644 lib/zend/Zend/Text/Table/Row.php create mode 100644 lib/zend/Zend/TimeSync/Exception.php create mode 100644 lib/zend/Zend/TimeSync/Ntp.php create mode 100644 lib/zend/Zend/TimeSync/Protocol.php create mode 100644 lib/zend/Zend/TimeSync/Sntp.php create mode 100644 lib/zend/Zend/Tool/Framework/Action/Base.php create mode 100644 lib/zend/Zend/Tool/Framework/Action/Exception.php create mode 100644 lib/zend/Zend/Tool/Framework/Action/Interface.php create mode 100644 lib/zend/Zend/Tool/Framework/Action/Repository.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Abstract.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Config.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Console.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Console/ArgumentParser.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Console/HelpSystem.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Console/Manifest.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Console/ResponseDecorator/Colorizer.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Exception.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Interactive/InputHandler.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Interactive/InputInterface.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Interactive/InputRequest.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Interactive/InputResponse.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Interactive/OutputInterface.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Request.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Response.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Response/ContentDecorator/Interface.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Response/ContentDecorator/Separator.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Storage.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Storage/AdapterInterface.php create mode 100644 lib/zend/Zend/Tool/Framework/Client/Storage/Directory.php create mode 100644 lib/zend/Zend/Tool/Framework/Exception.php create mode 100644 lib/zend/Zend/Tool/Framework/Loader/Abstract.php create mode 100644 lib/zend/Zend/Tool/Framework/Loader/IncludePathLoader.php create mode 100644 lib/zend/Zend/Tool/Framework/Loader/IncludePathLoader/RecursiveFilterIterator.php create mode 100644 lib/zend/Zend/Tool/Framework/Manifest/ActionManifestable.php create mode 100644 lib/zend/Zend/Tool/Framework/Manifest/Exception.php create mode 100644 lib/zend/Zend/Tool/Framework/Manifest/Indexable.php create mode 100644 lib/zend/Zend/Tool/Framework/Manifest/Interface.php create mode 100644 lib/zend/Zend/Tool/Framework/Manifest/MetadataManifestable.php create mode 100644 lib/zend/Zend/Tool/Framework/Manifest/ProviderManifestable.php create mode 100644 lib/zend/Zend/Tool/Framework/Manifest/Repository.php create mode 100644 lib/zend/Zend/Tool/Framework/Metadata/Basic.php create mode 100644 lib/zend/Zend/Tool/Framework/Metadata/Dynamic.php create mode 100644 lib/zend/Zend/Tool/Framework/Metadata/Interface.php create mode 100644 lib/zend/Zend/Tool/Framework/Metadata/Tool.php create mode 100644 lib/zend/Zend/Tool/Framework/Provider/Abstract.php create mode 100644 lib/zend/Zend/Tool/Framework/Provider/DocblockManifestable.php create mode 100644 lib/zend/Zend/Tool/Framework/Provider/Exception.php create mode 100644 lib/zend/Zend/Tool/Framework/Provider/Interactable.php create mode 100644 lib/zend/Zend/Tool/Framework/Provider/Interface.php create mode 100644 lib/zend/Zend/Tool/Framework/Provider/Pretendable.php create mode 100644 lib/zend/Zend/Tool/Framework/Provider/Repository.php create mode 100644 lib/zend/Zend/Tool/Framework/Provider/Signature.php create mode 100644 lib/zend/Zend/Tool/Framework/Registry.php create mode 100644 lib/zend/Zend/Tool/Framework/Registry/EnabledInterface.php create mode 100644 lib/zend/Zend/Tool/Framework/Registry/Exception.php create mode 100644 lib/zend/Zend/Tool/Framework/Registry/Interface.php create mode 100644 lib/zend/Zend/Tool/Framework/System/Action/Create.php create mode 100644 lib/zend/Zend/Tool/Framework/System/Action/Delete.php create mode 100644 lib/zend/Zend/Tool/Framework/System/Manifest.php create mode 100644 lib/zend/Zend/Tool/Framework/System/Provider/Manifest.php create mode 100644 lib/zend/Zend/Tool/Framework/System/Provider/Phpinfo.php create mode 100644 lib/zend/Zend/Tool/Framework/System/Provider/Version.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Content/Engine.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Content/Engine/CodeGenerator.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Content/Engine/Phtml.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Exception.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Filesystem/Abstract.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Filesystem/Directory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Filesystem/File.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Interface.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Repository.php create mode 100644 lib/zend/Zend/Tool/Project/Context/System/Interface.php create mode 100644 lib/zend/Zend/Tool/Project/Context/System/NotOverwritable.php create mode 100644 lib/zend/Zend/Tool/Project/Context/System/ProjectDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/System/ProjectProfileFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/System/ProjectProvidersDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/System/TopLevelRestrictable.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ActionMethod.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ApisDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ApplicationConfigFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ApplicationDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/BootstrapFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/CacheDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ConfigFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ConfigsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ControllerFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ControllersDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/DataDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/DbTableDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/DbTableFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/FormFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/FormsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/HtaccessFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/LayoutsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/LibraryDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/LocalesDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/LogsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ModelFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ModelsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ModuleDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ModulesDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ProjectProviderFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/PublicDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/PublicImagesDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/PublicIndexFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/PublicScriptsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/PublicStylesheetsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/SearchIndexesDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/SessionsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TemporaryDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TestApplicationBootstrapFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TestApplicationControllerDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TestApplicationControllerFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TestApplicationDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TestLibraryBootstrapFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TestLibraryDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TestLibraryFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TestLibraryNamespaceDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TestPHPUnitConfigFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/TestsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/UploadsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ViewControllerScriptsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ViewFiltersDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ViewHelpersDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ViewScriptFile.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ViewScriptsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ViewsDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Context/Zf/ZfStandardLibraryDirectory.php create mode 100644 lib/zend/Zend/Tool/Project/Exception.php create mode 100644 lib/zend/Zend/Tool/Project/Profile.php create mode 100644 lib/zend/Zend/Tool/Project/Profile/Exception.php create mode 100644 lib/zend/Zend/Tool/Project/Profile/FileParser/Interface.php create mode 100644 lib/zend/Zend/Tool/Project/Profile/FileParser/Xml.php create mode 100644 lib/zend/Zend/Tool/Project/Profile/Iterator/ContextFilter.php create mode 100644 lib/zend/Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php create mode 100644 lib/zend/Zend/Tool/Project/Profile/Resource.php create mode 100644 lib/zend/Zend/Tool/Project/Profile/Resource/Container.php create mode 100644 lib/zend/Zend/Tool/Project/Profile/Resource/SearchConstraints.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Abstract.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Action.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Controller.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Exception.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Form.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Manifest.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Model.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Module.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Profile.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Project.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/ProjectProvider.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/Test.php create mode 100644 lib/zend/Zend/Tool/Project/Provider/View.php create mode 100644 lib/zend/Zend/Translate/Adapter.php create mode 100644 lib/zend/Zend/Translate/Adapter/Array.php create mode 100644 lib/zend/Zend/Translate/Adapter/Csv.php create mode 100644 lib/zend/Zend/Translate/Adapter/Gettext.php create mode 100644 lib/zend/Zend/Translate/Adapter/Ini.php create mode 100644 lib/zend/Zend/Translate/Adapter/Qt.php create mode 100644 lib/zend/Zend/Translate/Adapter/Tbx.php create mode 100644 lib/zend/Zend/Translate/Adapter/Tmx.php create mode 100644 lib/zend/Zend/Translate/Adapter/Xliff.php create mode 100644 lib/zend/Zend/Translate/Adapter/XmlTm.php create mode 100644 lib/zend/Zend/Translate/Exception.php create mode 100644 lib/zend/Zend/Translate/Plural.php create mode 100644 lib/zend/Zend/Uri/Exception.php create mode 100644 lib/zend/Zend/Validate/Alnum.php create mode 100644 lib/zend/Zend/Validate/Alpha.php create mode 100644 lib/zend/Zend/Validate/Barcode.php create mode 100644 lib/zend/Zend/Validate/Barcode/Ean13.php create mode 100644 lib/zend/Zend/Validate/Barcode/UpcA.php create mode 100644 lib/zend/Zend/Validate/Between.php create mode 100644 lib/zend/Zend/Validate/Ccnum.php create mode 100644 lib/zend/Zend/Validate/Date.php create mode 100644 lib/zend/Zend/Validate/Db/Abstract.php create mode 100644 lib/zend/Zend/Validate/Db/NoRecordExists.php create mode 100644 lib/zend/Zend/Validate/Db/RecordExists.php create mode 100644 lib/zend/Zend/Validate/Digits.php create mode 100644 lib/zend/Zend/Validate/EmailAddress.php create mode 100644 lib/zend/Zend/Validate/Exception.php create mode 100644 lib/zend/Zend/Validate/File/Count.php create mode 100644 lib/zend/Zend/Validate/File/Crc32.php create mode 100644 lib/zend/Zend/Validate/File/ExcludeExtension.php create mode 100644 lib/zend/Zend/Validate/File/ExcludeMimeType.php create mode 100644 lib/zend/Zend/Validate/File/Exists.php create mode 100644 lib/zend/Zend/Validate/File/Extension.php create mode 100644 lib/zend/Zend/Validate/File/FilesSize.php create mode 100644 lib/zend/Zend/Validate/File/Hash.php create mode 100644 lib/zend/Zend/Validate/File/ImageSize.php create mode 100644 lib/zend/Zend/Validate/File/IsCompressed.php create mode 100644 lib/zend/Zend/Validate/File/IsImage.php create mode 100644 lib/zend/Zend/Validate/File/Md5.php create mode 100644 lib/zend/Zend/Validate/File/MimeType.php create mode 100644 lib/zend/Zend/Validate/File/NotExists.php create mode 100644 lib/zend/Zend/Validate/File/Sha1.php create mode 100644 lib/zend/Zend/Validate/File/Size.php create mode 100644 lib/zend/Zend/Validate/File/Upload.php create mode 100644 lib/zend/Zend/Validate/File/WordCount.php create mode 100644 lib/zend/Zend/Validate/Float.php create mode 100644 lib/zend/Zend/Validate/GreaterThan.php create mode 100644 lib/zend/Zend/Validate/Hex.php create mode 100644 lib/zend/Zend/Validate/Hostname/Biz.php create mode 100644 lib/zend/Zend/Validate/Hostname/Cn.php create mode 100644 lib/zend/Zend/Validate/Hostname/Com.php create mode 100644 lib/zend/Zend/Validate/Hostname/Jp.php create mode 100644 lib/zend/Zend/Validate/Iban.php create mode 100644 lib/zend/Zend/Validate/Identical.php create mode 100644 lib/zend/Zend/Validate/InArray.php create mode 100644 lib/zend/Zend/Validate/Int.php create mode 100644 lib/zend/Zend/Validate/LessThan.php create mode 100644 lib/zend/Zend/Validate/NotEmpty.php create mode 100644 lib/zend/Zend/Validate/Regex.php create mode 100644 lib/zend/Zend/Validate/Sitemap/Changefreq.php create mode 100644 lib/zend/Zend/Validate/Sitemap/Lastmod.php create mode 100644 lib/zend/Zend/Validate/Sitemap/Loc.php create mode 100644 lib/zend/Zend/Validate/Sitemap/Priority.php create mode 100644 lib/zend/Zend/Validate/StringLength.php create mode 100644 lib/zend/Zend/View/Abstract.php create mode 100644 lib/zend/Zend/View/Exception.php create mode 100644 lib/zend/Zend/View/Helper/Abstract.php create mode 100644 lib/zend/Zend/View/Helper/Action.php create mode 100644 lib/zend/Zend/View/Helper/BaseUrl.php create mode 100644 lib/zend/Zend/View/Helper/Cycle.php create mode 100644 lib/zend/Zend/View/Helper/DeclareVars.php create mode 100644 lib/zend/Zend/View/Helper/Doctype.php create mode 100644 lib/zend/Zend/View/Helper/Fieldset.php create mode 100644 lib/zend/Zend/View/Helper/Form.php create mode 100644 lib/zend/Zend/View/Helper/FormButton.php create mode 100644 lib/zend/Zend/View/Helper/FormCheckbox.php create mode 100644 lib/zend/Zend/View/Helper/FormElement.php create mode 100644 lib/zend/Zend/View/Helper/FormErrors.php create mode 100644 lib/zend/Zend/View/Helper/FormFile.php create mode 100644 lib/zend/Zend/View/Helper/FormHidden.php create mode 100644 lib/zend/Zend/View/Helper/FormImage.php create mode 100644 lib/zend/Zend/View/Helper/FormLabel.php create mode 100644 lib/zend/Zend/View/Helper/FormMultiCheckbox.php create mode 100644 lib/zend/Zend/View/Helper/FormNote.php create mode 100644 lib/zend/Zend/View/Helper/FormPassword.php create mode 100644 lib/zend/Zend/View/Helper/FormRadio.php create mode 100644 lib/zend/Zend/View/Helper/FormReset.php create mode 100644 lib/zend/Zend/View/Helper/FormSelect.php create mode 100644 lib/zend/Zend/View/Helper/FormSubmit.php create mode 100644 lib/zend/Zend/View/Helper/FormText.php create mode 100644 lib/zend/Zend/View/Helper/FormTextarea.php create mode 100644 lib/zend/Zend/View/Helper/HeadLink.php create mode 100644 lib/zend/Zend/View/Helper/HeadMeta.php create mode 100644 lib/zend/Zend/View/Helper/HeadScript.php create mode 100644 lib/zend/Zend/View/Helper/HeadStyle.php create mode 100644 lib/zend/Zend/View/Helper/HeadTitle.php create mode 100644 lib/zend/Zend/View/Helper/HtmlElement.php create mode 100644 lib/zend/Zend/View/Helper/HtmlFlash.php create mode 100644 lib/zend/Zend/View/Helper/HtmlList.php create mode 100644 lib/zend/Zend/View/Helper/HtmlObject.php create mode 100644 lib/zend/Zend/View/Helper/HtmlPage.php create mode 100644 lib/zend/Zend/View/Helper/HtmlQuicktime.php create mode 100644 lib/zend/Zend/View/Helper/InlineScript.php create mode 100644 lib/zend/Zend/View/Helper/Interface.php create mode 100644 lib/zend/Zend/View/Helper/Json.php create mode 100644 lib/zend/Zend/View/Helper/Layout.php create mode 100644 lib/zend/Zend/View/Helper/Navigation.php create mode 100644 lib/zend/Zend/View/Helper/Navigation/Breadcrumbs.php create mode 100644 lib/zend/Zend/View/Helper/Navigation/Helper.php create mode 100644 lib/zend/Zend/View/Helper/Navigation/HelperAbstract.php create mode 100644 lib/zend/Zend/View/Helper/Navigation/Links.php create mode 100644 lib/zend/Zend/View/Helper/Navigation/Menu.php create mode 100644 lib/zend/Zend/View/Helper/Navigation/Sitemap.php create mode 100644 lib/zend/Zend/View/Helper/PaginationControl.php create mode 100644 lib/zend/Zend/View/Helper/Partial.php create mode 100644 lib/zend/Zend/View/Helper/Partial/Exception.php create mode 100644 lib/zend/Zend/View/Helper/PartialLoop.php create mode 100644 lib/zend/Zend/View/Helper/Placeholder.php create mode 100644 lib/zend/Zend/View/Helper/Placeholder/Container.php create mode 100644 lib/zend/Zend/View/Helper/Placeholder/Container/Abstract.php create mode 100644 lib/zend/Zend/View/Helper/Placeholder/Container/Exception.php create mode 100644 lib/zend/Zend/View/Helper/Placeholder/Container/Standalone.php create mode 100644 lib/zend/Zend/View/Helper/Placeholder/Registry.php create mode 100644 lib/zend/Zend/View/Helper/Placeholder/Registry/Exception.php create mode 100644 lib/zend/Zend/View/Helper/RenderToPlaceholder.php create mode 100644 lib/zend/Zend/View/Helper/ServerUrl.php create mode 100644 lib/zend/Zend/View/Helper/Translate.php create mode 100644 lib/zend/Zend/View/Helper/Url.php create mode 100644 lib/zend/Zend/View/Interface.php create mode 100644 lib/zend/Zend/View/Stream.php create mode 100644 lib/zend/Zend/Wildfire/Channel/HttpHeaders.php create mode 100644 lib/zend/Zend/Wildfire/Channel/Interface.php create mode 100644 lib/zend/Zend/Wildfire/Exception.php create mode 100644 lib/zend/Zend/Wildfire/Plugin/FirePhp.php create mode 100644 lib/zend/Zend/Wildfire/Plugin/FirePhp/Message.php create mode 100644 lib/zend/Zend/Wildfire/Plugin/FirePhp/TableMessage.php create mode 100644 lib/zend/Zend/Wildfire/Plugin/Interface.php create mode 100644 lib/zend/Zend/Wildfire/Protocol/JsonStream.php create mode 100644 lib/zend/Zend/XmlRpc/Value/BigInteger.php diff --git a/lib/thirdpartylibs.xml b/lib/thirdpartylibs.xml index 7678a762a9..6594c811f4 100644 --- a/lib/thirdpartylibs.xml +++ b/lib/thirdpartylibs.xml @@ -256,7 +256,7 @@ zend Zend Framework new BSD - 1.7.3 + 1.9.4 diff --git a/lib/zend/Zend/Acl/Assert/Interface.php b/lib/zend/Zend/Acl/Assert/Interface.php new file mode 100644 index 0000000000..091602938a --- /dev/null +++ b/lib/zend/Zend/Acl/Assert/Interface.php @@ -0,0 +1,64 @@ +_resourceId = (string) $resourceId; + } + + /** + * Defined by Zend_Acl_Resource_Interface; returns the Resource identifier + * + * @return string + */ + public function getResourceId() + { + return $this->_resourceId; + } + +} diff --git a/lib/zend/Zend/Acl/Resource/Interface.php b/lib/zend/Zend/Acl/Resource/Interface.php new file mode 100644 index 0000000000..0ac82c5581 --- /dev/null +++ b/lib/zend/Zend/Acl/Resource/Interface.php @@ -0,0 +1,37 @@ +_roleId = (string) $roleId; + } + + /** + * Defined by Zend_Acl_Role_Interface; returns the Role identifier + * + * @return string + */ + public function getRoleId() + { + return $this->_roleId; + } + +} diff --git a/lib/zend/Zend/Acl/Role/Interface.php b/lib/zend/Zend/Acl/Role/Interface.php new file mode 100644 index 0000000000..6ddb42e827 --- /dev/null +++ b/lib/zend/Zend/Acl/Role/Interface.php @@ -0,0 +1,37 @@ +getRoleId(); + + if ($this->has($roleId)) { + /** + * @see Zend_Acl_Role_Registry_Exception + */ + require_once 'Zend/Acl/Role/Registry/Exception.php'; + throw new Zend_Acl_Role_Registry_Exception("Role id '$roleId' already exists in the registry"); + } + + $roleParents = array(); + + if (null !== $parents) { + if (!is_array($parents)) { + $parents = array($parents); + } + /** + * @see Zend_Acl_Role_Registry_Exception + */ + require_once 'Zend/Acl/Role/Registry/Exception.php'; + foreach ($parents as $parent) { + try { + if ($parent instanceof Zend_Acl_Role_Interface) { + $roleParentId = $parent->getRoleId(); + } else { + $roleParentId = $parent; + } + $roleParent = $this->get($roleParentId); + } catch (Zend_Acl_Role_Registry_Exception $e) { + throw new Zend_Acl_Role_Registry_Exception("Parent Role id '$roleParentId' does not exist"); + } + $roleParents[$roleParentId] = $roleParent; + $this->_roles[$roleParentId]['children'][$roleId] = $role; + } + } + + $this->_roles[$roleId] = array( + 'instance' => $role, + 'parents' => $roleParents, + 'children' => array() + ); + + return $this; + } + + /** + * Returns the identified Role + * + * The $role parameter can either be a Role or a Role identifier. + * + * @param Zend_Acl_Role_Interface|string $role + * @throws Zend_Acl_Role_Registry_Exception + * @return Zend_Acl_Role_Interface + */ + public function get($role) + { + if ($role instanceof Zend_Acl_Role_Interface) { + $roleId = $role->getRoleId(); + } else { + $roleId = (string) $role; + } + + if (!$this->has($role)) { + /** + * @see Zend_Acl_Role_Registry_Exception + */ + require_once 'Zend/Acl/Role/Registry/Exception.php'; + throw new Zend_Acl_Role_Registry_Exception("Role '$roleId' not found"); + } + + return $this->_roles[$roleId]['instance']; + } + + /** + * Returns true if and only if the Role exists in the registry + * + * The $role parameter can either be a Role or a Role identifier. + * + * @param Zend_Acl_Role_Interface|string $role + * @return boolean + */ + public function has($role) + { + if ($role instanceof Zend_Acl_Role_Interface) { + $roleId = $role->getRoleId(); + } else { + $roleId = (string) $role; + } + + return isset($this->_roles[$roleId]); + } + + /** + * Returns an array of an existing Role's parents + * + * The array keys are the identifiers of the parent Roles, and the values are + * the parent Role instances. The parent Roles are ordered in this array by + * ascending priority. The highest priority parent Role, last in the array, + * corresponds with the parent Role most recently added. + * + * If the Role does not have any parents, then an empty array is returned. + * + * @param Zend_Acl_Role_Interface|string $role + * @uses Zend_Acl_Role_Registry::get() + * @return array + */ + public function getParents($role) + { + $roleId = $this->get($role)->getRoleId(); + + return $this->_roles[$roleId]['parents']; + } + + /** + * Returns true if and only if $role inherits from $inherit + * + * Both parameters may be either a Role or a Role identifier. If + * $onlyParents is true, then $role must inherit directly from + * $inherit in order to return true. By default, this method looks + * through the entire inheritance DAG to determine whether $role + * inherits from $inherit through its ancestor Roles. + * + * @param Zend_Acl_Role_Interface|string $role + * @param Zend_Acl_Role_Interface|string $inherit + * @param boolean $onlyParents + * @throws Zend_Acl_Role_Registry_Exception + * @return boolean + */ + public function inherits($role, $inherit, $onlyParents = false) + { + /** + * @see Zend_Acl_Role_Registry_Exception + */ + require_once 'Zend/Acl/Role/Registry/Exception.php'; + try { + $roleId = $this->get($role)->getRoleId(); + $inheritId = $this->get($inherit)->getRoleId(); + } catch (Zend_Acl_Role_Registry_Exception $e) { + throw $e; + } + + $inherits = isset($this->_roles[$roleId]['parents'][$inheritId]); + + if ($inherits || $onlyParents) { + return $inherits; + } + + foreach ($this->_roles[$roleId]['parents'] as $parentId => $parent) { + if ($this->inherits($parentId, $inheritId)) { + return true; + } + } + + return false; + } + + /** + * Removes the Role from the registry + * + * The $role parameter can either be a Role or a Role identifier. + * + * @param Zend_Acl_Role_Interface|string $role + * @throws Zend_Acl_Role_Registry_Exception + * @return Zend_Acl_Role_Registry Provides a fluent interface + */ + public function remove($role) + { + /** + * @see Zend_Acl_Role_Registry_Exception + */ + require_once 'Zend/Acl/Role/Registry/Exception.php'; + try { + $roleId = $this->get($role)->getRoleId(); + } catch (Zend_Acl_Role_Registry_Exception $e) { + throw $e; + } + + foreach ($this->_roles[$roleId]['children'] as $childId => $child) { + unset($this->_roles[$childId]['parents'][$roleId]); + } + foreach ($this->_roles[$roleId]['parents'] as $parentId => $parent) { + unset($this->_roles[$parentId]['children'][$roleId]); + } + + unset($this->_roles[$roleId]); + + return $this; + } + + /** + * Removes all Roles from the registry + * + * @return Zend_Acl_Role_Registry Provides a fluent interface + */ + public function removeAll() + { + $this->_roles = array(); + + return $this; + } + + public function getRoles() + { + return $this->_roles; + } + +} diff --git a/lib/zend/Zend/Acl/Role/Registry/Exception.php b/lib/zend/Zend/Acl/Role/Registry/Exception.php new file mode 100644 index 0000000000..cfa1ef7d44 --- /dev/null +++ b/lib/zend/Zend/Acl/Role/Registry/Exception.php @@ -0,0 +1,36 @@ +_acl = new Zend_Acl(); + $xml = simplexml_load_file($rolefile); +/* +Roles file format: + + + + + + + + +*/ + foreach($xml->role as $role) { + $this->_acl->addRole(new Zend_Acl_Role((string)$role["id"])); + foreach($role->user as $user) { + $this->_users[(string)$user["name"]] = array("password" => (string)$user["password"], + "role" => (string)$role["id"]); + } + } + } + + /** + * Get ACL with roles from XML file + * + * @return Zend_Acl + */ + public function getAcl() + { + return $this->_acl; + } + + /** + * Perform authentication + * + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result + * @see Zend_Auth_Adapter_Interface#authenticate() + */ + public function authenticate() + { + if (empty($this->_username) || + empty($this->_password)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Username/password should be set'); + } + + if(!isset($this->_users[$this->_username])) { + return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, + null, + array('Username not found') + ); + } + + $user = $this->_users[$this->_username]; + if($user["password"] != $this->_password) { + return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, + null, + array('Authentication failed') + ); + } + + $id = new stdClass(); + $id->role = $user["role"]; + $id->name = $this->_username; + return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $id); + } +} diff --git a/lib/zend/Zend/Amf/Adobe/DbInspector.php b/lib/zend/Zend/Amf/Adobe/DbInspector.php new file mode 100755 index 0000000000..9a0b474311 --- /dev/null +++ b/lib/zend/Zend/Amf/Adobe/DbInspector.php @@ -0,0 +1,103 @@ +describeTable('Pdo_Mysql', + * array( + * 'host' => '127.0.0.1', + * 'username' => 'webuser', + * 'password' => 'xxxxxxxx', + * 'dbname' => 'test' + * ), + * 'mytable' + * ); + * + * @param string $dbType Database adapter type for Zend_Db + * @param array|object $dbDescription Adapter-specific connection settings + * @param string $tableName Table name + * @return array Table description + * @see Zend_Db::describeTable() + * @see Zend_Db::factory() + */ + public function describeTable($dbType, $dbDescription, $tableName) + { + $db = $this->_connect($dbType, $dbDescription); + return $db->describeTable($tableName); + } + + /** + * Test database connection + * + * @param string $dbType Database adapter type for Zend_Db + * @param array|object $dbDescription Adapter-specific connection settings + * @return bool + * @see Zend_Db::factory() + */ + public function connect($dbType, $dbDescription) + { + $db = $this->_connect($dbType, $dbDescription); + $db->listTables(); + return true; + } + + /** + * Get the list of database tables + * + * @param string $dbType Database adapter type for Zend_Db + * @param array|object $dbDescription Adapter-specific connection settings + * @return array List of the tables + */ + public function getTables($dbType, $dbDescription) + { + $db = $this->_connect($dbType, $dbDescription); + return $db->listTables(); + } +} diff --git a/lib/zend/Zend/Amf/Adobe/Introspector.php b/lib/zend/Zend/Amf/Adobe/Introspector.php new file mode 100755 index 0000000000..988c5576f6 --- /dev/null +++ b/lib/zend/Zend/Amf/Adobe/Introspector.php @@ -0,0 +1,309 @@ +_xml = new DOMDocument('1.0', 'utf-8'); + } + + /** + * Create XML definition on an AMF service class + * + * @param string $serviceClass Service class name + * @param array $options invocation options + * @return string XML with service class introspection + */ + public function introspect($serviceClass, $options = array()) + { + $this->_options = $options; + + if (strpbrk($serviceClass, '\\/<>')) { + return $this->_returnError('Invalid service name'); + } + + // Transform com.foo.Bar into com_foo_Bar + $serviceClass = str_replace('.' , '_', $serviceClass); + + // Introspect! + if (!class_exists($serviceClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($serviceClass, $this->_getServicePath()); + } + + $serv = $this->_xml->createElement('service-description'); + $serv->setAttribute('xmlns', 'http://ns.adobe.com/flex/service-description/2008'); + + $this->_types = $this->_xml->createElement('types'); + $this->_ops = $this->_xml->createElement('operations'); + + $r = Zend_Server_Reflection::reflectClass($serviceClass); + $this->_addService($r, $this->_ops); + + $serv->appendChild($this->_types); + $serv->appendChild($this->_ops); + $this->_xml->appendChild($serv); + + return $this->_xml->saveXML(); + } + + /** + * Authentication handler + * + * @param Zend_Acl $acl + * @return unknown_type + */ + public function initAcl(Zend_Acl $acl) + { + return false; // we do not need auth for this class + } + + /** + * Generate map of public class attributes + * + * @param string $typename type name + * @param DOMElement $typexml target XML element + * @return void + */ + protected function _addClassAttributes($typename, DOMElement $typexml) + { + // Do not try to autoload here because _phpTypeToAS should + // have already attempted to load this class + if (!class_exists($typename, false)) { + return; + } + + $rc = new Zend_Reflection_Class($typename); + foreach ($rc->getProperties() as $prop) { + if (!$prop->isPublic()) { + continue; + } + + $propxml = $this->_xml->createElement('property'); + $propxml->setAttribute('name', $prop->getName()); + + $type = $this->_registerType($this->_getPropertyType($prop)); + $propxml->setAttribute('type', $type); + + $typexml->appendChild($propxml); + } + } + + /** + * Build XML service description from reflection class + * + * @param Zend_Server_Reflection_Class $refclass + * @param DOMElement $target target XML element + * @return void + */ + protected function _addService(Zend_Server_Reflection_Class $refclass, DOMElement $target) + { + foreach ($refclass->getMethods() as $method) { + if (!$method->isPublic() + || $method->isConstructor() + || ('__' == substr($method->name, 0, 2)) + ) { + continue; + } + + foreach ($method->getPrototypes() as $proto) { + $op = $this->_xml->createElement('operation'); + $op->setAttribute('name', $method->getName()); + + $rettype = $this->_registerType($proto->getReturnType()); + $op->setAttribute('returnType', $rettype); + + foreach ($proto->getParameters() as $param) { + $arg = $this->_xml->createElement('argument'); + $arg->setAttribute('name', $param->getName()); + + $type = $param->getType(); + if ($type == 'mixed' && ($pclass = $param->getClass())) { + $type = $pclass->getName(); + } + + $ptype = $this->_registerType($type); + $arg->setAttribute('type', $ptype); + + $op->appendChild($arg); + } + + $target->appendChild($op); + } + } + } + + /** + * Extract type of the property from DocBlock + * + * @param Zend_Reflection_Property $prop reflection property object + * @return string Property type + */ + protected function _getPropertyType(Zend_Reflection_Property $prop) + { + $docBlock = $prop->getDocComment(); + + if (!$docBlock) { + return 'Unknown'; + } + + if (!$docBlock->hasTag('var')) { + return 'Unknown'; + } + + $tag = $docBlock->getTag('var'); + return trim($tag->getDescription()); + } + + /** + * Get the array of service directories + * + * @return array Service class directories + */ + protected function _getServicePath() + { + if (isset($this->_options['server'])) { + return $this->_options['server']->getDirectory(); + } + + if (isset($this->_options['directories'])) { + return $this->_options['directories']; + } + + return array(); + } + + /** + * Map from PHP type name to AS type name + * + * @param string $typename PHP type name + * @return string AS type name + */ + protected function _phpTypeToAS($typename) + { + if (class_exists($typename)) { + $vars = get_class_vars($typename); + + if (isset($vars['_explicitType'])) { + return $vars['_explicitType']; + } + } + + if (false !== ($asname = Zend_Amf_Parse_TypeLoader::getMappedClassName($typename))) { + return $asname; + } + + return $typename; + } + + /** + * Register new type on the system + * + * @param string $typename type name + * @return string New type name + */ + protected function _registerType($typename) + { + // Known type - return its AS name + if (isset($this->_typesMap[$typename])) { + return $this->_typesMap[$typename]; + } + + // Standard types + if (in_array($typename, array('void', 'null', 'mixed', 'unknown_type'))) { + return 'Unknown'; + } + + if (in_array($typename, array('int', 'integer', 'bool', 'boolean', 'float', 'string', 'object', 'Unknown', 'stdClass', 'array'))) { + return $typename; + } + + // Resolve and store AS name + $asTypeName = $this->_phpTypeToAS($typename); + $this->_typesMap[$typename] = $asTypeName; + + // Create element for the name + $typeEl = $this->_xml->createElement('type'); + $typeEl->setAttribute('name', $asTypeName); + $this->_addClassAttributes($typename, $typeEl); + $this->_types->appendChild($typeEl); + + return $asTypeName; + } + + /** + * Return error with error message + * + * @param string $msg Error message + * @return string + */ + protected function _returnError($msg) + { + return 'ERROR: $msg'; + } +} diff --git a/lib/zend/Zend/Amf/Auth/Abstract.php b/lib/zend/Zend/Amf/Auth/Abstract.php new file mode 100755 index 0000000000..7bc5744824 --- /dev/null +++ b/lib/zend/Zend/Amf/Auth/Abstract.php @@ -0,0 +1,42 @@ +_username = $username; + $this->_password = $password; + } +} diff --git a/lib/zend/Zend/Amf/Constants.php b/lib/zend/Zend/Amf/Constants.php index 5817d90c06..c4087f6dc3 100644 --- a/lib/zend/Zend/Amf/Constants.php +++ b/lib/zend/Zend/Amf/Constants.php @@ -14,8 +14,9 @@ * * @category Zend * @package Zend_Amf - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -23,7 +24,7 @@ * deserialization to detect the AMF marker and encoding types. * * @package Zend_Amf - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ final class Zend_Amf_Constants @@ -67,6 +68,8 @@ final class Zend_Amf_Constants const ET_EXTERNAL = 0x01; const ET_DYNAMIC = 0x02; const ET_PROXY = 0x03; + + const FMS_OBJECT_ENCODING = 0x01; /** * Special content length value that indicates "unknown" content length @@ -76,4 +79,9 @@ final class Zend_Amf_Constants const URL_APPEND_HEADER = 'AppendToGatewayUrl'; const RESULT_METHOD = '/onResult'; const STATUS_METHOD = '/onStatus'; + const CREDENTIALS_HEADER = 'Credentials'; + const PERSISTENT_HEADER = 'RequestPersistentHeader'; + const DESCRIBE_HEADER = 'DescribeService'; + + const GUEST_ROLE = 'anonymous'; } diff --git a/lib/zend/Zend/Amf/Exception.php b/lib/zend/Zend/Amf/Exception.php index b900bc71f9..2b359a4634 100644 --- a/lib/zend/Zend/Amf/Exception.php +++ b/lib/zend/Zend/Amf/Exception.php @@ -14,8 +14,9 @@ * * @category Zend * @package Zend_Amf - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -25,7 +26,7 @@ require_once 'Zend/Exception.php'; /** * @package Zend_Amf - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Exception extends Zend_Exception diff --git a/lib/zend/Zend/Amf/Parse/Amf0/Deserializer.php b/lib/zend/Zend/Amf/Parse/Amf0/Deserializer.php index 21287bc5e4..157e73b2cd 100644 --- a/lib/zend/Zend/Amf/Parse/Amf0/Deserializer.php +++ b/lib/zend/Zend/Amf/Parse/Amf0/Deserializer.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Parse_Amf0 - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Parse_Deserializer */ @@ -29,7 +30,7 @@ require_once 'Zend/Amf/Parse/Deserializer.php'; * @todo Class could be implmented as Factory Class with each data type it's own class * @package Zend_Amf * @subpackage Parse_Amf0 - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer @@ -47,13 +48,6 @@ class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer */ protected $_objectEncoding = Zend_Amf_Constants::AMF0_OBJECT_ENCODING; - /** - * refrence to AMF3 deserializer - * - * @var Zend_Amf_Parse_Amf3_Deserializer - */ - protected $_deserializer = null; - /** * Read AMF markers and dispatch for deserialization * @@ -63,12 +57,11 @@ class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer * * @param integer $typeMarker * @return mixed whatever the data type is of the marker in php - * @return mixed * @throws Zend_Amf_Exception for invalid type */ public function readTypeMarker($typeMarker = null) { - if (is_null($typeMarker)) { + if ($typeMarker === null) { $typeMarker = $this->_stream->readByte(); } @@ -152,7 +145,7 @@ class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer */ public function readObject($object = null) { - if (is_null($object)) { + if ($object === null) { $object = array(); } @@ -261,7 +254,7 @@ class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer * Commonly used for Value Objects on the server * * @todo implement Typed Class mapping - * @return object + * @return object|array * @throws Zend_Amf_Exception if unable to load type */ public function readTypedObject() @@ -277,7 +270,9 @@ class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer $returnObject->$key = $value; } } - + if($returnObject instanceof Zend_Amf_Value_Messaging_ArrayCollection) { + $returnObject = get_object_vars($returnObject); + } return $returnObject; } @@ -289,7 +284,8 @@ class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer */ public function readAmf3TypeMarker() { - $deserializer = $this->getDeserializer(); + require_once 'Zend/Amf/Parse/Amf3/Deserializer.php'; + $deserializer = new Zend_Amf_Parse_Amf3_Deserializer($this->_stream); $this->_objectEncoding = Zend_Amf_Constants::AMF3_OBJECT_ENCODING; return $deserializer->readTypeMarker(); } @@ -304,18 +300,4 @@ class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer { return $this->_objectEncoding; } - - /** - * Get deserializer - * - * @return Zend_Amf_Parse_Amf3_Deserializer - */ - public function getDeserializer() - { - if (null === $this->_deserializer) { - require_once 'Zend/Amf/Parse/Amf3/Deserializer.php'; - $this->_deserializer = new Zend_Amf_Parse_Amf3_Deserializer($this->_stream); - } - return $this->_deserializer; - } } diff --git a/lib/zend/Zend/Amf/Parse/Amf0/Serializer.php b/lib/zend/Zend/Amf/Parse/Amf0/Serializer.php index 9d2fa5fdb0..859dfab64b 100644 --- a/lib/zend/Zend/Amf/Parse/Amf0/Serializer.php +++ b/lib/zend/Zend/Amf/Parse/Amf0/Serializer.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Parse_Amf0 - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Parse_Serializer */ @@ -28,7 +29,7 @@ require_once 'Zend/Amf/Parse/Serializer.php'; * @uses Zend_Amf_Parse_Serializer * @package Zend_Amf * @subpackage Parse_Amf0 - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer @@ -37,6 +38,12 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer * @var string Name of the class to be returned */ protected $_className = ''; + + /** + * An array of reference objects + * @var array + */ + protected $_referenceObjects = array(); /** * Determine type and serialize accordingly @@ -53,50 +60,60 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer public function writeTypeMarker($data, $markerType = null) { if (null !== $markerType) { - // Write the Type Marker to denote the following action script data type - $this->_stream->writeByte($markerType); - switch($markerType) { - case Zend_Amf_Constants::AMF0_NUMBER: - $this->_stream->writeDouble($data); - break; - case Zend_Amf_Constants::AMF0_BOOLEAN: - $this->_stream->writeByte($data); - break; - case Zend_Amf_Constants::AMF0_STRING: - $this->_stream->writeUTF($data); - break; - case Zend_Amf_Constants::AMF0_OBJECT: - $this->writeObject($data); - break; - case Zend_Amf_Constants::AMF0_NULL: - break; - case Zend_Amf_Constants::AMF0_MIXEDARRAY: - // Write length of numeric keys as zero. - $this->_stream->writeLong(0); - $this->writeObject($data); - break; - case Zend_Amf_Constants::AMF0_ARRAY: - $this->writeArray($data); - break; - case Zend_Amf_Constants::AMF0_DATE: - $this->writeDate($data); - break; - case Zend_Amf_Constants::AMF0_LONGSTRING: - $this->_stream->writeLongUTF($data); - break; - case Zend_Amf_Constants::AMF0_TYPEDOBJECT: - $this->writeTypedObject($data); - break; - case Zend_Amf_Constants::AMF0_AMF3: - $this->writeAmf3TypeMarker($data); - break; - default: - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception("Unknown Type Marker: " . $markerType); + //try to refrence the given object + if( !$this->writeObjectReference($data, $markerType) ) { + + // Write the Type Marker to denote the following action script data type + $this->_stream->writeByte($markerType); + switch($markerType) { + case Zend_Amf_Constants::AMF0_NUMBER: + $this->_stream->writeDouble($data); + break; + case Zend_Amf_Constants::AMF0_BOOLEAN: + $this->_stream->writeByte($data); + break; + case Zend_Amf_Constants::AMF0_STRING: + $this->_stream->writeUTF($data); + break; + case Zend_Amf_Constants::AMF0_OBJECT: + $this->writeObject($data); + break; + case Zend_Amf_Constants::AMF0_NULL: + break; + case Zend_Amf_Constants::AMF0_REFERENCE: + $this->_stream->writeInt($data); + break; + case Zend_Amf_Constants::AMF0_MIXEDARRAY: + // Write length of numeric keys as zero. + $this->_stream->writeLong(0); + $this->writeObject($data); + break; + case Zend_Amf_Constants::AMF0_ARRAY: + $this->writeArray($data); + break; + case Zend_Amf_Constants::AMF0_DATE: + $this->writeDate($data); + break; + case Zend_Amf_Constants::AMF0_LONGSTRING: + $this->_stream->writeLongUTF($data); + break; + case Zend_Amf_Constants::AMF0_TYPEDOBJECT: + $this->writeTypedObject($data); + break; + case Zend_Amf_Constants::AMF0_AMF3: + $this->writeAmf3TypeMarker($data); + break; + default: + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception("Unknown Type Marker: " . $markerType); + } } } else { + if(is_resource($data)) { + $data = Zend_Amf_Parse_TypeLoader::handleResource($data); + } switch (true) { - case (is_int($data) || is_float($data)): + case (is_int($data) || is_float($data)): $markerType = Zend_Amf_Constants::AMF0_NUMBER; break; case (is_bool($data)): @@ -128,12 +145,19 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer $markerType = Zend_Amf_Constants::AMF0_NULL; break; case (is_array($data)): - // check if it is a mixed typed array + // check if it is an associative array + $i = 0; foreach (array_keys($data) as $key) { - if (!is_numeric($key)) { - $markerType = Zend_Amf_Constants::AMF0_MIXEDARRAY; - break; - } + // check if it contains non-integer keys + if (!is_numeric($key) || intval($key) != $key) { + $markerType = Zend_Amf_Constants::AMF0_OBJECT; + break; + // check if it is a sparse indexed array + } else if ($key != $i) { + $markerType = Zend_Amf_Constants::AMF0_MIXEDARRAY; + break; + } + $i++; } // Dealing with a standard numeric array if(!$markerType){ @@ -150,6 +174,33 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer } return $this; } + + /** + * Check if the given object is in the reference table, write the reference if it exists, + * otherwise add the object to the reference table + * + * @param mixed $object object to check for reference + * @param $markerType AMF type of the object to write + * @return Boolean true, if the reference was written, false otherwise + */ + protected function writeObjectReference($object, $markerType){ + if( $markerType == Zend_Amf_Constants::AMF0_OBJECT || + $markerType == Zend_Amf_Constants::AMF0_MIXEDARRAY || + $markerType == Zend_Amf_Constants::AMF0_ARRAY || + $markerType == Zend_Amf_Constants::AMF0_TYPEDOBJECT ) { + + $ref = array_search($object, $this->_referenceObjects,true); + //handle object reference + if($ref !== false){ + $this->writeTypeMarker($ref,Zend_Amf_Constants::AMF0_REFERENCE); + return true; + } + + $this->_referenceObjects[] = $object; + } + + return false; + } /** * Write a php array with string or mixed keys. @@ -161,6 +212,8 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer { // Loop each element and write the name of the property. foreach ($object as $key => $value) { + // skip variables starting with an _ provate transient + if( $key[0] == "_") continue; $this->_stream->writeUTF($key); $this->writeTypeMarker($value); } @@ -270,14 +323,18 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer // Check to see if the user has defined an explicit Action Script type. case isset($object->_explicitType): $className = $object->_explicitType; - unset($object->_explicitType); break; // Check if user has defined a method for accessing the Action Script type case method_exists($object, 'getASClassName'): $className = $object->getASClassName(); break; // No return class name is set make it a generic object + case ($object instanceof stdClass): + $className = ''; + break; + // By default, use object's class name default: + $className = get_class($object); break; } if(!$className == '') { diff --git a/lib/zend/Zend/Amf/Parse/Amf3/Deserializer.php b/lib/zend/Zend/Amf/Parse/Amf3/Deserializer.php index 93d2a013fc..108fc818cf 100644 --- a/lib/zend/Zend/Amf/Parse/Amf3/Deserializer.php +++ b/lib/zend/Zend/Amf/Parse/Amf3/Deserializer.php @@ -1,410 +1,421 @@ -_stream->readByte(); - } - - switch($typeMarker) { - case Zend_Amf_Constants::AMF3_UNDEFINED: - return null; - case Zend_Amf_Constants::AMF3_NULL: - return null; - case Zend_Amf_Constants::AMF3_BOOLEAN_FALSE: - return false; - case Zend_Amf_Constants::AMF3_BOOLEAN_TRUE: - return true; - case Zend_Amf_Constants::AMF3_INTEGER: - return $this->readInteger(); - case Zend_Amf_Constants::AMF3_NUMBER: - return $this->_stream->readDouble(); - case Zend_Amf_Constants::AMF3_STRING: - return $this->readString(); - case Zend_Amf_Constants::AMF3_DATE: - return $this->readDate(); - case Zend_Amf_Constants::AMF3_ARRAY: - return $this->readArray(); - case Zend_Amf_Constants::AMF3_OBJECT: - return $this->readObject(); - case Zend_Amf_Constants::AMF3_XML: - case Zend_Amf_Constants::AMF3_XMLSTRING: - return $this->readXmlString(); - case Zend_Amf_Constants::AMF3_BYTEARRAY: - return $this->readString(); - default: - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception('Unsupported type marker: ' . $typeMarker); - } - } - - /** - * Read and deserialize an integer - * - * AMF 3 represents smaller integers with fewer bytes using the most - * significant bit of each byte. The worst case uses 32-bits - * to represent a 29-bit number, which is what we would have - * done with no compression. - * - 0x00000000 - 0x0000007F : 0xxxxxxx - * - 0x00000080 - 0x00003FFF : 1xxxxxxx 0xxxxxxx - * - 0x00004000 - 0x001FFFFF : 1xxxxxxx 1xxxxxxx 0xxxxxxx - * - 0x00200000 - 0x3FFFFFFF : 1xxxxxxx 1xxxxxxx 1xxxxxxx xxxxxxxx - * - 0x40000000 - 0xFFFFFFFF : throw range exception - * - * - * 0x04 -> integer type code, followed by up to 4 bytes of data. - * - * @see: Parsing integers on OSFlash {http://osflash.org/amf3/parsing_integers>} for the AMF3 integer data format. - * @return int|float - */ - public function readInteger() - { - $count = 1; - $intReference = $this->_stream->readByte(); - $result = 0; - while ((($intReference & 0x80) != 0) && $count < 4) { - $result <<= 7; - $result |= ($intReference & 0x7f); - $intReference = $this->_stream->readByte(); - $count++; - } - if ($count < 4) { - $result <<= 7; - $result |= $intReference; - } else { - // Use all 8 bits from the 4th byte - $result <<= 8; - $result |= $intReference; - - // Check if the integer should be negative - if (($result & 0x10000000) != 0) { - //and extend the sign bit - $result |= 0xe0000000; - } - } - return $result; - } - - /** - * Read and deserialize a string - * - * Strings can be sent as a reference to a previously - * occurring String by using an index to the implicit string reference table. - * Strings are encoding using UTF-8 - however the header may either - * describe a string literal or a string reference. - * - * - string = 0x06 string-data - * - string-data = integer-data [ modified-utf-8 ] - * - modified-utf-8 = *OCTET - * - * @return String - */ - public function readString() - { - $stringReference = $this->readInteger(); - - //Check if this is a reference string - if (($stringReference & 0x01) == 0) { - // reference string - $stringReference = $stringReference >> 1; - if ($stringReference >= count($this->_referenceStrings)) { - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception('Undefined string reference: ' . $stringReference); - } - // reference string found - return $this->_referenceStrings[$stringReference]; - } - - $length = $stringReference >> 1; - if ($length) { - $string = $this->_stream->readBytes($length); - $this->_referenceStrings[] = $string; - } else { - $string = ""; - } - return $string; - } - - /** - * Read and deserialize a date - * - * Data is the number of milliseconds elapsed since the epoch - * of midnight, 1st Jan 1970 in the UTC time zone. - * Local time zone information is not sent to flash. - * - * - date = 0x08 integer-data [ number-data ] - * - * @return Zend_Date - */ - public function readDate() - { - $dateReference = $this->readInteger(); - if (($dateReference & 0x01) == 0) { - $dateReference = $dateReference >> 1; - if ($dateReference>=count($this->_referenceObjects)) { - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception('Undefined date reference: ' . $dateReference); - } - return $this->_referenceObjects[$dateReference]; - } - - $timestamp = floor($this->_stream->readDouble() / 1000); - - require_once 'Zend/Date.php'; - $dateTime = new Zend_Date((int) $timestamp); - $this->_referenceObjects[] = $dateTime; - return $dateTime; - } - - /** - * Read amf array to PHP array - * - * - array = 0x09 integer-data ( [ 1OCTET *amf3-data ] | [OCTET *amf3-data 1] | [ OCTET *amf-data ] ) - * - * @return array - */ - public function readArray() - { - $arrayReference = $this->readInteger(); - if (($arrayReference & 0x01)==0){ - $arrayReference = $arrayReference >> 1; - if ($arrayReference>=count($this->_referenceObjects)) { - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception('Unknow array reference: ' . $arrayReference); - } - return $this->_referenceObjects[$arrayReference]; - } - - // Create a holder for the array in the reference list - $data = array(); - $this->_referenceObjects[] &= $data; - $key = $this->readString(); - - // Iterating for string based keys. - while ($key != '') { - $data[$key] = $this->readTypeMarker(); - $key = $this->readString(); - } - - $arrayReference = $arrayReference >>1; - - //We have a dense array - for ($i=0; $i < $arrayReference; $i++) { - $data[] = $this->readTypeMarker(); - } - - return $data; - } - - /** - * Read an object from the AMF stream and convert it into a PHP object - * - * @todo Rather than using an array of traitsInfo create Zend_Amf_Value_TraitsInfo - * @return object - */ - public function readObject() - { - $traitsInfo = $this->readInteger(); - $storedObject = ($traitsInfo & 0x01)==0; - $traitsInfo = $traitsInfo >> 1; - - // Check if the Object is in the stored Objects reference table - if ($storedObject) { - $ref = $traitsInfo; - if (!isset($this->_referenceObjects[$ref])) { - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception('Unknown Object reference: ' . $ref); - } - $returnObject = $this->_referenceObjects[$ref]; - } else { - // Check if the Object is in the stored Definistions reference table - $storedClass = ($traitsInfo & 0x01) == 0; - $traitsInfo = $traitsInfo >> 1; - if ($storedClass) { - $ref = $traitsInfo; - if (!isset($this->_referenceDefinitions[$ref])) { - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception('Unknows Definition reference: '. $ref); - } - // Populate the reference attributes - $className = $this->_referenceDefinitions[$ref]['className']; - $encoding = $this->_referenceDefinitions[$ref]['encoding']; - $propertyNames = $this->_referenceDefinitions[$ref]['propertyNames']; - } else { - // The class was not in the reference tables. Start reading rawdata to build traits. - // Create a traits table. Zend_Amf_Value_TraitsInfo would be ideal - $className = $this->readString(); - $encoding = $traitsInfo & 0x03; - $propertyNames = array(); - $traitsInfo = $traitsInfo >> 2; - } - - // We now have the object traits defined in variables. Time to go to work: - if (!$className) { - // No class name generic object - $returnObject = new stdClass(); - } else { - // Defined object - // Typed object lookup agsinst registered classname maps - if ($loader = Zend_Amf_Parse_TypeLoader::loadType($className)) { - $returnObject = new $loader(); - } else { - //user defined typed object - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception('Typed object not found: '. $className . ' '); - } - } - - // Add the Object ot the reference table - $this->_referenceObjects[] = $returnObject; - - // Check encoding types for additional processing. - switch ($encoding) { - case (Zend_Amf_Constants::ET_EXTERNAL): - // Externalizable object such as {ArrayCollection} and {ObjectProxy} - if (!$storedClass) { - $this->_referenceDefinitions[] = array( - 'className' => $className, - 'encoding' => $encoding, - 'propertyNames' => $propertyNames, - ); - } - $returnObject->externalizedData = $this->readTypeMarker(); - break; - case (Zend_Amf_Constants::ET_DYNAMIC): - // used for Name-value encoding - if (!$storedClass) { - $this->_referenceDefinitions[] = array( - 'className' => $className, - 'encoding' => $encoding, - 'propertyNames' => $propertyNames, - ); - } - // not a refrence object read name value properties from byte stream - $properties = array(); // clear value - do { - $property = $this->readString(); - if ($property != "") { - $propertyNames[] = $property; - $properties[$property] = $this->readTypeMarker(); - } - } while ($property !=""); - break; - default: - // basic property list object. - if (!$storedClass) { - $count = $traitsInfo; // Number of properties in the list - for($i=0; $i< $count; $i++) { - $propertyNames[] = $this->readString(); - } - // Add a refrence to the class. - $this->_referenceDefinitions[] = array( - 'className' => $className, - 'encoding' => $encoding, - 'propertyNames' => $propertyNames, - ); - } - $properties = array(); // clear value - foreach ($propertyNames as $property) { - $properties[$property] = $this->readTypeMarker(); - } - break; - } - - // Add properties back to the return object. - foreach($properties as $key=>$value) { - if($key) { - $returnObject->$key = $value; - } - } - } - return $returnObject; - } - - /** - * Convert XML to SimpleXml - * If user wants DomDocument they can use dom_import_simplexml - * - * @return SimpleXml Object - */ - public function readXmlString() - { - $xmlReference = $this->readInteger(); - $length = $xmlReference >> 1; - $string = $this->_stream->readBytes($length); - return simplexml_load_string($string); - } -} +_stream->readByte(); + } + + switch($typeMarker) { + case Zend_Amf_Constants::AMF3_UNDEFINED: + return null; + case Zend_Amf_Constants::AMF3_NULL: + return null; + case Zend_Amf_Constants::AMF3_BOOLEAN_FALSE: + return false; + case Zend_Amf_Constants::AMF3_BOOLEAN_TRUE: + return true; + case Zend_Amf_Constants::AMF3_INTEGER: + return $this->readInteger(); + case Zend_Amf_Constants::AMF3_NUMBER: + return $this->_stream->readDouble(); + case Zend_Amf_Constants::AMF3_STRING: + return $this->readString(); + case Zend_Amf_Constants::AMF3_DATE: + return $this->readDate(); + case Zend_Amf_Constants::AMF3_ARRAY: + return $this->readArray(); + case Zend_Amf_Constants::AMF3_OBJECT: + return $this->readObject(); + case Zend_Amf_Constants::AMF3_XML: + case Zend_Amf_Constants::AMF3_XMLSTRING: + return $this->readXmlString(); + case Zend_Amf_Constants::AMF3_BYTEARRAY: + return $this->readString(); + default: + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unsupported type marker: ' . $typeMarker); + } + } + + /** + * Read and deserialize an integer + * + * AMF 3 represents smaller integers with fewer bytes using the most + * significant bit of each byte. The worst case uses 32-bits + * to represent a 29-bit number, which is what we would have + * done with no compression. + * - 0x00000000 - 0x0000007F : 0xxxxxxx + * - 0x00000080 - 0x00003FFF : 1xxxxxxx 0xxxxxxx + * - 0x00004000 - 0x001FFFFF : 1xxxxxxx 1xxxxxxx 0xxxxxxx + * - 0x00200000 - 0x3FFFFFFF : 1xxxxxxx 1xxxxxxx 1xxxxxxx xxxxxxxx + * - 0x40000000 - 0xFFFFFFFF : throw range exception + * + * 0x04 -> integer type code, followed by up to 4 bytes of data. + * + * Parsing integers on OSFlash for the AMF3 integer data format: + * @link http://osflash.org/amf3/parsing_integers + * @return int|float + */ + public function readInteger() + { + $count = 1; + $intReference = $this->_stream->readByte(); + $result = 0; + while ((($intReference & 0x80) != 0) && $count < 4) { + $result <<= 7; + $result |= ($intReference & 0x7f); + $intReference = $this->_stream->readByte(); + $count++; + } + if ($count < 4) { + $result <<= 7; + $result |= $intReference; + } else { + // Use all 8 bits from the 4th byte + $result <<= 8; + $result |= $intReference; + + // Check if the integer should be negative + if (($result & 0x10000000) != 0) { + //and extend the sign bit + $result |= ~0xFFFFFFF; + } + } + return $result; + } + + /** + * Read and deserialize a string + * + * Strings can be sent as a reference to a previously + * occurring String by using an index to the implicit string reference table. + * Strings are encoding using UTF-8 - however the header may either + * describe a string literal or a string reference. + * + * - string = 0x06 string-data + * - string-data = integer-data [ modified-utf-8 ] + * - modified-utf-8 = *OCTET + * + * @return String + */ + public function readString() + { + $stringReference = $this->readInteger(); + + //Check if this is a reference string + if (($stringReference & 0x01) == 0) { + // reference string + $stringReference = $stringReference >> 1; + if ($stringReference >= count($this->_referenceStrings)) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Undefined string reference: ' . $stringReference); + } + // reference string found + return $this->_referenceStrings[$stringReference]; + } + + $length = $stringReference >> 1; + if ($length) { + $string = $this->_stream->readBytes($length); + $this->_referenceStrings[] = $string; + } else { + $string = ""; + } + return $string; + } + + /** + * Read and deserialize a date + * + * Data is the number of milliseconds elapsed since the epoch + * of midnight, 1st Jan 1970 in the UTC time zone. + * Local time zone information is not sent to flash. + * + * - date = 0x08 integer-data [ number-data ] + * + * @return Zend_Date + */ + public function readDate() + { + $dateReference = $this->readInteger(); + if (($dateReference & 0x01) == 0) { + $dateReference = $dateReference >> 1; + if ($dateReference>=count($this->_referenceObjects)) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Undefined date reference: ' . $dateReference); + } + return $this->_referenceObjects[$dateReference]; + } + + $timestamp = floor($this->_stream->readDouble() / 1000); + + require_once 'Zend/Date.php'; + $dateTime = new Zend_Date((int) $timestamp); + $this->_referenceObjects[] = $dateTime; + return $dateTime; + } + + /** + * Read amf array to PHP array + * + * - array = 0x09 integer-data ( [ 1OCTET *amf3-data ] | [OCTET *amf3-data 1] | [ OCTET *amf-data ] ) + * + * @return array + */ + public function readArray() + { + $arrayReference = $this->readInteger(); + if (($arrayReference & 0x01)==0){ + $arrayReference = $arrayReference >> 1; + if ($arrayReference>=count($this->_referenceObjects)) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unknow array reference: ' . $arrayReference); + } + return $this->_referenceObjects[$arrayReference]; + } + + // Create a holder for the array in the reference list + $data = array(); + $this->_referenceObjects[] =& $data; + $key = $this->readString(); + + // Iterating for string based keys. + while ($key != '') { + $data[$key] = $this->readTypeMarker(); + $key = $this->readString(); + } + + $arrayReference = $arrayReference >>1; + + //We have a dense array + for ($i=0; $i < $arrayReference; $i++) { + $data[] = $this->readTypeMarker(); + } + + return $data; + } + + /** + * Read an object from the AMF stream and convert it into a PHP object + * + * @todo Rather than using an array of traitsInfo create Zend_Amf_Value_TraitsInfo + * @return object|array + */ + public function readObject() + { + $traitsInfo = $this->readInteger(); + $storedObject = ($traitsInfo & 0x01)==0; + $traitsInfo = $traitsInfo >> 1; + + // Check if the Object is in the stored Objects reference table + if ($storedObject) { + $ref = $traitsInfo; + if (!isset($this->_referenceObjects[$ref])) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unknown Object reference: ' . $ref); + } + $returnObject = $this->_referenceObjects[$ref]; + } else { + // Check if the Object is in the stored Definistions reference table + $storedClass = ($traitsInfo & 0x01) == 0; + $traitsInfo = $traitsInfo >> 1; + if ($storedClass) { + $ref = $traitsInfo; + if (!isset($this->_referenceDefinitions[$ref])) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unknows Definition reference: '. $ref); + } + // Populate the reference attributes + $className = $this->_referenceDefinitions[$ref]['className']; + $encoding = $this->_referenceDefinitions[$ref]['encoding']; + $propertyNames = $this->_referenceDefinitions[$ref]['propertyNames']; + } else { + // The class was not in the reference tables. Start reading rawdata to build traits. + // Create a traits table. Zend_Amf_Value_TraitsInfo would be ideal + $className = $this->readString(); + $encoding = $traitsInfo & 0x03; + $propertyNames = array(); + $traitsInfo = $traitsInfo >> 2; + } + + // We now have the object traits defined in variables. Time to go to work: + if (!$className) { + // No class name generic object + $returnObject = new stdClass(); + } else { + // Defined object + // Typed object lookup agsinst registered classname maps + if ($loader = Zend_Amf_Parse_TypeLoader::loadType($className)) { + $returnObject = new $loader(); + } else { + //user defined typed object + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Typed object not found: '. $className . ' '); + } + } + + // Add the Object ot the reference table + $this->_referenceObjects[] = $returnObject; + + $properties = array(); // clear value + // Check encoding types for additional processing. + switch ($encoding) { + case (Zend_Amf_Constants::ET_EXTERNAL): + // Externalizable object such as {ArrayCollection} and {ObjectProxy} + if (!$storedClass) { + $this->_referenceDefinitions[] = array( + 'className' => $className, + 'encoding' => $encoding, + 'propertyNames' => $propertyNames, + ); + } + $returnObject->externalizedData = $this->readTypeMarker(); + break; + case (Zend_Amf_Constants::ET_DYNAMIC): + // used for Name-value encoding + if (!$storedClass) { + $this->_referenceDefinitions[] = array( + 'className' => $className, + 'encoding' => $encoding, + 'propertyNames' => $propertyNames, + ); + } + // not a refrence object read name value properties from byte stream + do { + $property = $this->readString(); + if ($property != "") { + $propertyNames[] = $property; + $properties[$property] = $this->readTypeMarker(); + } + } while ($property !=""); + break; + default: + // basic property list object. + if (!$storedClass) { + $count = $traitsInfo; // Number of properties in the list + for($i=0; $i< $count; $i++) { + $propertyNames[] = $this->readString(); + } + // Add a refrence to the class. + $this->_referenceDefinitions[] = array( + 'className' => $className, + 'encoding' => $encoding, + 'propertyNames' => $propertyNames, + ); + } + foreach ($propertyNames as $property) { + $properties[$property] = $this->readTypeMarker(); + } + break; + } + + // Add properties back to the return object. + foreach($properties as $key=>$value) { + if($key) { + $returnObject->$key = $value; + } + } + + + } + + if($returnObject instanceof Zend_Amf_Value_Messaging_ArrayCollection) { + if(isset($returnObject->externalizedData)) { + $returnObject = $returnObject->externalizedData; + } else { + $returnObject = get_object_vars($returnObject); + } + } + + return $returnObject; + } + + /** + * Convert XML to SimpleXml + * If user wants DomDocument they can use dom_import_simplexml + * + * @return SimpleXml Object + */ + public function readXmlString() + { + $xmlReference = $this->readInteger(); + $length = $xmlReference >> 1; + $string = $this->_stream->readBytes($length); + return simplexml_load_string($string); + } +} diff --git a/lib/zend/Zend/Amf/Parse/Amf3/Serializer.php b/lib/zend/Zend/Amf/Parse/Amf3/Serializer.php index a64cc8515f..8dfc478d2c 100644 --- a/lib/zend/Zend/Amf/Parse/Amf3/Serializer.php +++ b/lib/zend/Zend/Amf/Parse/Amf3/Serializer.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Parse_Amf3 - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Parse_Serializer */ @@ -30,11 +31,29 @@ require_once 'Zend/Amf/Parse/TypeLoader.php'; * * @package Zend_Amf * @subpackage Parse_Amf3 - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer { + /** + * An array of reference objects per amf body + * @var array + */ + protected $_referenceObjects = array(); + + /** + * An array of reference strings per amf body + * @var array + */ + protected $_referenceStrings = array(); + + /** + * An array of reference class definitions, indexed by classname + * @var array + */ + protected $_referenceDefinitions = array(); + /** * Serialize PHP types to AMF3 and write to stream * @@ -78,7 +97,10 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $this->writeObject($data); break; case Zend_Amf_Constants::AMF3_BYTEARRAY: - $this->writeString($data); + $this->writeByteArray($data); + break; + case Zend_Amf_Constants::AMF3_XMLSTRING; + $this->writeXml($data); break; default: require_once 'Zend/Amf/Exception.php'; @@ -86,8 +108,11 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer } } else { // Detect Type Marker + if(is_resource($data)) { + $data = Zend_Amf_Parse_TypeLoader::handleResource($data); + } switch (true) { - case (null === $data): + case (null === $data): $markerType = Zend_Amf_Constants::AMF3_NULL; break; case (is_bool($data)): @@ -119,6 +144,8 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $markerType = Zend_Amf_Constants::AMF3_DATE; } else if ($data instanceof Zend_Amf_Value_ByteArray) { $markerType = Zend_Amf_Constants::AMF3_BYTEARRAY; + } else if (($data instanceof DOMDocument) || ($data instanceof SimpleXMLElement)) { + $markerType = Zend_Amf_Constants::AMF3_XMLSTRING; } else { $markerType = Zend_Amf_Constants::AMF3_OBJECT; } @@ -163,6 +190,21 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $this->_stream->writeByte($int & 0xff); return $this; } + + /** + * Send string to output stream, without trying to reference it. + * The string is prepended with strlen($string) << 1 | 0x01 + * + * @param string $string + * @return Zend_Amf_Parse_Amf3_Serializer + */ + protected function writeBinaryString($string){ + $ref = strlen($string) << 1 | 0x01; + $this->writeInteger($ref); + $this->_stream->writeBytes($string); + + return $this; + } /** * Send string to output stream @@ -172,9 +214,74 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer */ public function writeString($string) { - $ref = strlen($string) << 1 | 0x01; - $this->writeInteger($ref); - $this->_stream->writeBytes($string); + $len = strlen($string); + if(!$len){ + $this->writeInteger(0x01); + return $this; + } + + $ref = array_search($string, $this->_referenceStrings, true); + if($ref === false){ + $this->_referenceStrings[] = $string; + $this->writeBinaryString($string); + } else { + $ref <<= 1; + $this->writeInteger($ref); + } + + return $this; + } + + /** + * Send ByteArray to output stream + * + * @param string|Zend_Amf_Value_ByteArray $data + * @return Zend_Amf_Parse_Amf3_Serializer + */ + public function writeByteArray($data){ + if($this->writeObjectReference($data)){ + return $this; + } + + if(is_string($data)) { + //nothing to do + } else if ($data instanceof Zend_Amf_Value_ByteArray) { + $data = $data->getData(); + } else { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Invalid ByteArray specified; must be a string or Zend_Amf_Value_ByteArray'); + } + + $this->writeBinaryString($data); + + return $this; + } + + /** + * Send xml to output stream + * + * @param DOMDocument|SimpleXMLElement $xml + * @return Zend_Amf_Parse_Amf3_Serializer + */ + public function writeXml($xml) + { + if($this->writeObjectReference($xml)){ + return $this; + } + + if(is_string($xml)) { + //nothing to do + } else if ($xml instanceof DOMDocument) { + $xml = $xml->saveXml(); + } else if ($xml instanceof SimpleXMLElement) { + $xml = $xml->asXML(); + } else { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Invalid xml specified; must be a DOMDocument or SimpleXMLElement'); + } + + $this->writeBinaryString($xml); + return $this; } @@ -186,6 +293,10 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer */ public function writeDate($date) { + if($this->writeObjectReference($date)){ + return $this; + } + if ($date instanceof DateTime) { $dateString = $date->format('U') * 1000; } elseif ($date instanceof Zend_Date) { @@ -209,6 +320,10 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer */ public function writeArray(array $array) { + if($this->writeObjectReference($array)){ + return $this; + } + // have to seperate mixed from numberic keys. $numeric = array(); $string = array(); @@ -238,6 +353,25 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer } return $this; } + + /** + * Check if the given object is in the reference table, write the reference if it exists, + * otherwise add the object to the reference table + * + * @param mixed $object object to check for reference + * @return Boolean true, if the reference was written, false otherwise + */ + protected function writeObjectReference($object){ + $ref = array_search($object, $this->_referenceObjects,true); + //quickly handle object references + if($ref !== false){ + $ref <<= 1; + $this->writeInteger($ref); + return true; + } + $this->_referenceObjects[] = $object; + return false; + } /** * Write object to ouput stream @@ -247,7 +381,10 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer */ public function writeObject($object) { - $encoding = Zend_Amf_Constants::ET_PROPLIST; + if($this->writeObjectReference($object)){ + return $this; + } + $className = ''; //Check to see if the object is a typed object and we need to change @@ -259,7 +396,6 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer // Check to see if the user has defined an explicit Action Script type. case isset($object->_explicitType): $className = $object->_explicitType; - unset($object->_explicitType); break; // Check if user has defined a method for accessing the Action Script type @@ -268,36 +404,87 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer break; // No return class name is set make it a generic object + case ($object instanceof stdClass): + $className = ''; + break; + + // By default, use object's class name default: + $className = get_class($object); break; } - - $traitsInfo = Zend_Amf_Constants::AMF3_OBJECT_ENCODING; - $traitsInfo |= $encoding << 2; + + $writeTraits = true; + + //check to see, if we have a corresponding definition + if(array_key_exists($className, $this->_referenceDefinitions)){ + $traitsInfo = $this->_referenceDefinitions[$className]['id']; + $encoding = $this->_referenceDefinitions[$className]['encoding']; + $propertyNames = $this->_referenceDefinitions[$className]['propertyNames']; + + $traitsInfo = ($traitsInfo << 2) | 0x01; + + $writeTraits = false; + } else { + $propertyNames = array(); + + if($className == ''){ + //if there is no className, we interpret the class as dynamic without any sealed members + $encoding = Zend_Amf_Constants::ET_DYNAMIC; + } else { + $encoding = Zend_Amf_Constants::ET_PROPLIST; + + foreach($object as $key => $value) { + if( $key[0] != "_") { + $propertyNames[] = $key; + } + } + } + + $this->_referenceDefinitions[$className] = array( + 'id' => count($this->_referenceDefinitions), + 'encoding' => $encoding, + 'propertyNames' => $propertyNames, + ); + + $traitsInfo = Zend_Amf_Constants::AMF3_OBJECT_ENCODING; + $traitsInfo |= $encoding << 2; + $traitsInfo |= (count($propertyNames) << 4); + } + + $this->writeInteger($traitsInfo); + + if($writeTraits){ + $this->writeString($className); + foreach ($propertyNames as $value) { + $this->writeString($value); + } + } + try { switch($encoding) { case Zend_Amf_Constants::ET_PROPLIST: - $count = 0; - foreach($object as $key => $value) { - $count++; + //Write the sealed values to the output stream. + foreach ($propertyNames as $key) { + $this->writeTypeMarker($object->$key); } - $traitsInfo |= ($count << 4); - - // Write the object ID - $this->writeInteger($traitsInfo); - - // Write the classname - $this->writeString($className); - - // Write the object Key's to the output stream - foreach ($object as $key => $value) { - $this->writeString($key); + break; + case Zend_Amf_Constants::ET_DYNAMIC: + //Write the sealed values to the output stream. + foreach ($propertyNames as $key) { + $this->writeTypeMarker($object->$key); } - - //Write the object values to the output stream. - foreach ($object as $key => $value) { - $this->writeTypeMarker($value); + + //Write remaining properties + foreach($object as $key => $value){ + if(!in_array($key,$propertyNames) && $key[0] != "_"){ + $this->writeString($key); + $this->writeTypeMarker($value); + } } + + //Write an empty string to end the dynamic part + $this->writeString(''); break; case Zend_Amf_Constants::ET_EXTERNAL: require_once 'Zend/Amf/Exception.php'; diff --git a/lib/zend/Zend/Amf/Parse/Deserializer.php b/lib/zend/Zend/Amf/Parse/Deserializer.php index 38ba5000b6..ca4d0b7dbb 100644 --- a/lib/zend/Zend/Amf/Parse/Deserializer.php +++ b/lib/zend/Zend/Amf/Parse/Deserializer.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Parse - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +30,7 @@ * @see http://opensource.adobe.com/svn/opensource/blazeds/trunk/modules/core/src/java/flex/messaging/io/amf/ * @package Zend_Amf * @subpackage Parse - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_Amf_Parse_Deserializer diff --git a/lib/zend/Zend/Amf/Parse/InputStream.php b/lib/zend/Zend/Amf/Parse/InputStream.php index d3883bdfd6..ef86d08526 100644 --- a/lib/zend/Zend/Amf/Parse/InputStream.php +++ b/lib/zend/Zend/Amf/Parse/InputStream.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Parse - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Util_BinaryStream */ @@ -30,7 +31,7 @@ require_once 'Zend/Amf/Util/BinaryStream.php'; * * @package Zend_Amf * @subpackage Parse - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Parse_InputStream extends Zend_Amf_Util_BinaryStream diff --git a/lib/zend/Zend/Amf/Parse/OutputStream.php b/lib/zend/Zend/Amf/Parse/OutputStream.php index 87ccdc58a1..0f7eac0bb1 100644 --- a/lib/zend/Zend/Amf/Parse/OutputStream.php +++ b/lib/zend/Zend/Amf/Parse/OutputStream.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Parse - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Util_BinaryStream */ @@ -31,7 +32,7 @@ require_once 'Zend/Amf/Util/BinaryStream.php'; * @uses Zend_Amf_Util_BinaryStream * @package Zend_Amf * @subpackage Parse - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Parse_OutputStream extends Zend_Amf_Util_BinaryStream diff --git a/lib/zend/Zend/Amf/Parse/Resource/MysqlResult.php b/lib/zend/Zend/Amf/Parse/Resource/MysqlResult.php new file mode 100755 index 0000000000..ed4656f110 --- /dev/null +++ b/lib/zend/Zend/Amf/Parse/Resource/MysqlResult.php @@ -0,0 +1,70 @@ + Value is Mysql type (exact string) => PHP type + */ + static public $fieldTypes = array( + "int" => "int", + "timestamp" => "int", + "year" => "int", + "real" => "float", + ); + /** + * Parse resource into array + * + * @param resource $resource + * @return array + */ + public function parse($resource) { + $result = array(); + $fieldcnt = mysql_num_fields($resource); + $fields_transform = array(); + for($i=0;$i<$fieldcnt;$i++) { + $type = mysql_field_type($resource, $i); + if(isset(self::$fieldTypes[$type])) { + $fields_transform[mysql_field_name($resource, $i)] = self::$fieldTypes[$type]; + } + } + + while($row = mysql_fetch_object($resource)) { + foreach($fields_transform as $fieldname => $fieldtype) { + settype($row->$fieldname, $fieldtype); + } + $result[] = $row; + } + return $result; + } +} diff --git a/lib/zend/Zend/Amf/Parse/Resource/MysqliResult.php b/lib/zend/Zend/Amf/Parse/Resource/MysqliResult.php new file mode 100644 index 0000000000..1d2d3d6b57 --- /dev/null +++ b/lib/zend/Zend/Amf/Parse/Resource/MysqliResult.php @@ -0,0 +1,128 @@ + "MYSQLI_TYPE_DECIMAL", + 1 => "MYSQLI_TYPE_TINYINT", + 2 => "MYSQLI_TYPE_SMALLINT", + 3 => "MYSQLI_TYPE_INTEGER", + 4 => "MYSQLI_TYPE_FLOAT", + 5 => "MYSQLI_TYPE_DOUBLE", + 7 => "MYSQLI_TYPE_TIMESTAMP", + 8 => "MYSQLI_TYPE_BIGINT", + 9 => "MYSQLI_TYPE_MEDIUMINT", + 10 => "MYSQLI_TYPE_DATE", + 11 => "MYSQLI_TYPE_TIME", + 12 => "MYSQLI_TYPE_DATETIME", + 13 => "MYSQLI_TYPE_YEAR", + 14 => "MYSQLI_TYPE_DATE", + 16 => "MYSQLI_TYPE_BIT", + 246 => "MYSQLI_TYPE_DECIMAL", + 247 => "MYSQLI_TYPE_ENUM", + 248 => "MYSQLI_TYPE_SET", + 249 => "MYSQLI_TYPE_TINYBLOB", + 250 => "MYSQLI_TYPE_MEDIUMBLOB", + 251 => "MYSQLI_TYPE_LONGBLOB", + 252 => "MYSQLI_TYPE_BLOB", + 253 => "MYSQLI_TYPE_VARCHAR", + 254 => "MYSQLI_TYPE_CHAR", + 255 => "MYSQLI_TYPE_GEOMETRY", + ); + + // Build an associative array for a type look up + static $mysqli_to_php = array( + "MYSQLI_TYPE_DECIMAL" => 'float', + "MYSQLI_TYPE_NEWDECIMAL" => 'float', + "MYSQLI_TYPE_BIT" => 'integer', + "MYSQLI_TYPE_TINYINT" => 'integer', + "MYSQLI_TYPE_SMALLINT" => 'integer', + "MYSQLI_TYPE_MEDIUMINT" => 'integer', + "MYSQLI_TYPE_BIGINT" => 'integer', + "MYSQLI_TYPE_INTEGER" => 'integer', + "MYSQLI_TYPE_FLOAT" => 'float', + "MYSQLI_TYPE_DOUBLE" => 'float', + "MYSQLI_TYPE_NULL" => 'null', + "MYSQLI_TYPE_TIMESTAMP" => 'string', + "MYSQLI_TYPE_INT24" => 'integer', + "MYSQLI_TYPE_DATE" => 'string', + "MYSQLI_TYPE_TIME" => 'string', + "MYSQLI_TYPE_DATETIME" => 'string', + "MYSQLI_TYPE_YEAR" => 'string', + "MYSQLI_TYPE_NEWDATE" => 'string', + "MYSQLI_TYPE_ENUM" => 'string', + "MYSQLI_TYPE_SET" => 'string', + "MYSQLI_TYPE_TINYBLOB" => 'object', + "MYSQLI_TYPE_MEDIUMBLOB" => 'object', + "MYSQLI_TYPE_LONGBLOB" => 'object', + "MYSQLI_TYPE_BLOB" => 'object', + "MYSQLI_TYPE_CHAR" => 'string', + "MYSQLI_TYPE_VARCHAR" => 'string', + "MYSQLI_TYPE_GEOMETRY" => 'object', + "MYSQLI_TYPE_BIT" => 'integer', + ); + + /** + * Parse resource into array + * + * @param resource $resource + * @return array + */ + public function parse($resource) { + + $result = array(); + $fieldcnt = mysqli_num_fields($resource); + + + $fields_transform = array(); + + for($i=0;$i<$fieldcnt;$i++) { + $finfo = mysqli_fetch_field_direct($resource, $i); + + if(isset(self::$mysqli_type[$finfo->type])) { + $fields_transform[$finfo->name] = self::$mysqli_to_php[self::$mysqli_type[$finfo->type]]; + } + } + + while($row = mysqli_fetch_assoc($resource)) { + foreach($fields_transform as $fieldname => $fieldtype) { + settype($row[$fieldname], $fieldtype); + } + $result[] = $row; + } + return $result; + } +} diff --git a/lib/zend/Zend/Amf/Parse/Resource/Stream.php b/lib/zend/Zend/Amf/Parse/Resource/Stream.php new file mode 100755 index 0000000000..9f269603b8 --- /dev/null +++ b/lib/zend/Zend/Amf/Parse/Resource/Stream.php @@ -0,0 +1,42 @@ + 'Zend_Amf_Value_Messaging_CommandMessage', 'flex.messaging.messages.ErrorMessage' => 'Zend_Amf_Value_Messaging_ErrorMessage', 'flex.messaging.messages.RemotingMessage' => 'Zend_Amf_Value_Messaging_RemotingMessage', + 'flex.messaging.io.ArrayCollection' => 'Zend_Amf_Value_Messaging_ArrayCollection', ); /** @@ -61,7 +78,14 @@ final class Zend_Amf_Parse_TypeLoader 'flex.messaging.messages.CommandMessage' => 'Zend_Amf_Value_Messaging_CommandMessage', 'flex.messaging.messages.ErrorMessage' => 'Zend_Amf_Value_Messaging_ErrorMessage', 'flex.messaging.messages.RemotingMessage' => 'Zend_Amf_Value_Messaging_RemotingMessage', + 'flex.messaging.io.ArrayCollection' => 'Zend_Amf_Value_Messaging_ArrayCollection', ); + + /** + * @var Zend_Loader_PluginLoader_Interface + */ + protected static $_resourceLoader = null; + /** * Load the mapped class type into a callback. @@ -71,14 +95,13 @@ final class Zend_Amf_Parse_TypeLoader */ public static function loadType($className) { - $class = false; - $callBack = false; $class = self::getMappedClassName($className); + if(!$class) { + $class = str_replace('.', '_', $className); + } if (!class_exists($class)) { - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception($className .' mapped class '. $class . ' is not defined'); + return "stdClass"; } - return $class; } @@ -130,4 +153,79 @@ final class Zend_Amf_Parse_TypeLoader { self::$classMap = self::$_defaultClassMap; } + + /** + * Set loader for resource type handlers + * + * @param Zend_Loader_PluginLoader_Interface $loader + */ + public static function setResourceLoader(Zend_Loader_PluginLoader_Interface $loader) + { + self::$_resourceLoader = $loader; + } + + /** + * Add directory to the list of places where to look for resource handlers + * + * @param string $prefix + * @param string $dir + */ + public static function addResourceDirectory($prefix, $dir) + { + if(self::$_resourceLoader) { + self::$_resourceLoader->addPrefixPath($prefix, $dir); + } + } + + /** + * Get plugin class that handles this resource + * + * @param resource $resource Resource type + * @return string Class name + */ + public static function getResourceParser($resource) + { + if(self::$_resourceLoader) { + $type = preg_replace("/[^A-Za-z0-9_]/", " ", get_resource_type($resource)); + $type = str_replace(" ","", ucwords($type)); + return self::$_resourceLoader->load($type); + } + return false; + } + + /** + * Convert resource to a serializable object + * + * @param resource $resource + * @return mixed + */ + public static function handleResource($resource) + { + if(!self::$_resourceLoader) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unable to handle resources - resource plugin loader not set'); + } + try { + while(is_resource($resource)) { + $resclass = self::getResourceParser($resource); + if(!$resclass) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Can not serialize resource type: '. get_resource_type($resource)); + } + $parser = new $resclass(); + if(is_callable(array($parser, 'parse'))) { + $resource = $parser->parse($resource); + } else { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception("Could not call parse() method on class $resclass"); + } + } + return $resource; + } catch(Zend_Amf_Exception $e) { + throw $e; + } catch(Exception $e) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Can not serialize resource type: '. get_resource_type($resource)); + } + } } diff --git a/lib/zend/Zend/Amf/Request.php b/lib/zend/Zend/Amf/Request.php index dd126be736..b9ded882aa 100644 --- a/lib/zend/Zend/Amf/Request.php +++ b/lib/zend/Zend/Amf/Request.php @@ -14,8 +14,9 @@ * * @category Zend * @package Zend_Amf - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Parse_InputStream */ @@ -39,7 +40,7 @@ require_once 'Zend/Amf/Value/MessageBody.php'; * * @todo Currently not checking if the object needs to be Type Mapped to a server object. * @package Zend_Amf - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Request @@ -89,7 +90,7 @@ class Zend_Amf_Request public function initialize($request) { $this->_inputStream = new Zend_Amf_Parse_InputStream($request); - $this->_deserializer = new Zend_Amf_Parse_AMF0_Deserializer($this->_inputStream); + $this->_deserializer = new Zend_Amf_Parse_Amf0_Deserializer($this->_inputStream); $this->readMessage($this->_inputStream); return $this; } @@ -105,6 +106,7 @@ class Zend_Amf_Request $clientVersion = $stream->readUnsignedShort(); if (($clientVersion != Zend_Amf_Constants::AMF0_OBJECT_ENCODING) && ($clientVersion != Zend_Amf_Constants::AMF3_OBJECT_ENCODING) + && ($clientVersion != Zend_Amf_Constants::FMS_OBJECT_ENCODING) ) { require_once 'Zend/Amf/Exception.php'; throw new Zend_Amf_Exception('Unknown Player Version ' . $clientVersion); @@ -181,7 +183,7 @@ class Zend_Amf_Request * an AMF0 array called Content. The following code gets the object * out of the content array and sets it as the message data. */ - if(is_array($data) && is_object($data[0])){ + if(is_array($data) && $data[0] instanceof Zend_Amf_Value_Messaging_AbstractMessage){ $data = $data[0]; } diff --git a/lib/zend/Zend/Amf/Request/Http.php b/lib/zend/Zend/Amf/Request/Http.php index a87e271db5..0174ce6c2f 100644 --- a/lib/zend/Zend/Amf/Request/Http.php +++ b/lib/zend/Zend/Amf/Request/Http.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Request - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Request */ @@ -31,7 +32,7 @@ require_once 'Zend/Amf/Request.php'; * * @package Zend_Amf * @subpackage Request - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Request_Http extends Zend_Amf_Request diff --git a/lib/zend/Zend/Amf/Response.php b/lib/zend/Zend/Amf/Response.php index 29a9cd4594..52f224be7f 100644 --- a/lib/zend/Zend/Amf/Response.php +++ b/lib/zend/Zend/Amf/Response.php @@ -14,8 +14,9 @@ * * @category Zend * @package Zend_Amf - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Constants */ @@ -31,7 +32,7 @@ require_once 'Zend/Amf/Parse/Amf0/Serializer.php'; * Handles converting the PHP object ready for response back into AMF * * @package Zend_Amf - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Response diff --git a/lib/zend/Zend/Amf/Response/Http.php b/lib/zend/Zend/Amf/Response/Http.php index 5003c2d62c..59d412d7bc 100644 --- a/lib/zend/Zend/Amf/Response/Http.php +++ b/lib/zend/Zend/Amf/Response/Http.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Response - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Response */ @@ -27,7 +28,7 @@ require_once 'Zend/Amf/Response.php'; * * @package Zend_Amf * @subpackage Response - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Response_Http extends Zend_Amf_Response @@ -40,6 +41,8 @@ class Zend_Amf_Response_Http extends Zend_Amf_Response public function getResponse() { if (!headers_sent()) { + header('Cache-Control: cache, must-revalidate'); + header('Pragma: public'); header('Content-Type: application/x-amf'); } return parent::getResponse(); diff --git a/lib/zend/Zend/Amf/Server.php b/lib/zend/Zend/Amf/Server.php index 9e058a0a19..d01e7ce6f3 100644 --- a/lib/zend/Zend/Amf/Server.php +++ b/lib/zend/Zend/Amf/Server.php @@ -14,8 +14,9 @@ * * @category Zend * @package Zend_Amf - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Server_Interface */ @@ -30,17 +31,28 @@ require_once 'Zend/Amf/Constants.php'; /** Zend_Amf_Value_MessageBody */ require_once 'Zend/Amf/Value/MessageBody.php'; +/** Zend_Amf_Value_MessageHeader */ +require_once 'Zend/Amf/Value/MessageHeader.php'; + /** Zend_Amf_Value_Messaging_CommandMessage */ require_once 'Zend/Amf/Value/Messaging/CommandMessage.php'; +/** Zend_Loader_PluginLoader */ +require_once 'Zend/Loader/PluginLoader.php'; + +/** Zend_Amf_Parse_TypeLoader */ +require_once 'Zend/Amf/Parse/TypeLoader.php'; + +/** Zend_Auth */ +require_once 'Zend/Auth.php'; /** * An AMF gateway server implementation to allow the connection of the Adobe Flash Player to - * the Zend Framework + * Zend Framework * * @todo Make the relection methods cache and autoload. * @package Zend_Amf * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Server implements Zend_Server_Interface @@ -50,12 +62,21 @@ class Zend_Amf_Server implements Zend_Server_Interface * @var array */ protected $_methods = array(); - + /** - * Array of directories to search for loading classes dynamically + * Array of classes that can be called without being explicitly loaded + * + * Keys are class names. + * * @var array */ - protected $_directories = array(); + protected $_classAllowed = array(); + + /** + * Loader for classes in added directories + * @var Zend_Loader_PluginLoader + */ + protected $_loader; /** * @var bool Production flag; whether or not to return exception messages @@ -80,6 +101,86 @@ class Zend_Amf_Server implements Zend_Server_Interface */ protected $_table = array(); + /** + * + * @var bool session flag; whether or not to add a session to each response. + */ + protected $_session = false; + + /** + * Namespace allows all AMF calls to not clobber other php session variables + * @var Zend_Session_NameSpace default session namespace zend_amf + */ + protected $_sesionNamespace = 'zend_amf'; + + /** + * Set the default session.name if php_ + * @var string + */ + protected $_sessionName = 'PHPSESSID'; + + /** + * Authentication handler object + * + * @var Zend_Amf_Auth_Abstract + */ + protected $_auth; + /** + * ACL handler object + * + * @var Zend_Acl + */ + protected $_acl; + /** + * The server constructor + */ + public function __construct() + { + Zend_Amf_Parse_TypeLoader::setResourceLoader(new Zend_Loader_PluginLoader(array("Zend_Amf_Parse_Resource" => "Zend/Amf/Parse/Resource"))); + } + + /** + * Set authentication adapter + * + * @param Zend_Amf_Auth_Abstract $auth + * @return Zend_Amf_Server + */ + public function setAuth(Zend_Amf_Auth_Abstract $auth) + { + $this->_auth = $auth; + return $this; + } + /** + * Get authentication adapter + * + * @return Zend_Amf_Auth_Abstract + */ + public function getAuth() + { + return $this->_auth; + } + + /** + * Set ACL adapter + * + * @param Zend_Acl $acl + * @return Zend_Amf_Server + */ + public function setAcl(Zend_Acl $acl) + { + $this->_acl = $acl; + return $this; + } + /** + * Get ACL adapter + * + * @return Zend_Acl + */ + public function getAcl() + { + return $this->_acl; + } + /** * Set production flag * @@ -102,7 +203,87 @@ class Zend_Amf_Server implements Zend_Server_Interface return $this->_production; } + /** + * @param namespace of all incoming sessions defaults to Zend_Amf + * @return Zend_Amf_Server + */ + public function setSession($namespace = 'Zend_Amf') + { + require_once 'Zend/Session.php'; + $this->_session = true; + $this->_sesionNamespace = new Zend_Session_Namespace($namespace); + return $this; + } + /** + * Whether of not the server is using sessions + * @return bool + */ + public function isSession() + { + return $this->_session; + } + + /** + * Check if the ACL allows accessing the function or method + * + * @param string|object $object Object or class being accessed + * @param string $function Function or method being acessed + * @return unknown_type + */ + protected function _checkAcl($object, $function) + { + if(!$this->_acl) { + return true; + } + if($object) { + $class = is_object($object)?get_class($object):$object; + if(!$this->_acl->has($class)) { + require_once 'Zend/Acl/Resource.php'; + $this->_acl->add(new Zend_Acl_Resource($class)); + } + $call = array($object, "initAcl"); + if(is_callable($call) && !call_user_func($call, $this->_acl)) { + // if initAcl returns false, no ACL check + return true; + } + } else { + $class = null; + } + + $auth = Zend_Auth::getInstance(); + if($auth->hasIdentity()) { + $role = $auth->getIdentity()->role; + } else { + if($this->_acl->hasRole(Zend_Amf_Constants::GUEST_ROLE)) { + $role = Zend_Amf_Constants::GUEST_ROLE; + } else { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception("Unauthenticated access not allowed"); + } + } + if($this->_acl->isAllowed($role, $class, $function)) { + return true; + } else { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception("Access not allowed"); + } + } + + /** + * Get PluginLoader for the Server + * + * @return Zend_Loader_PluginLoader + */ + protected function getLoader() + { + if(empty($this->_loader)) { + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loader = new Zend_Loader_PluginLoader(); + } + return $this->_loader; + } + /** * Loads a remote class or method and executes the function and returns * the result @@ -114,42 +295,45 @@ class Zend_Amf_Server implements Zend_Server_Interface */ protected function _dispatch($method, $params = null, $source = null) { - if (!isset($this->_table[$method])) { + if($source) { + if(($mapped = Zend_Amf_Parse_TypeLoader::getMappedClassName($source)) !== false) { + $source = $mapped; + } + } + $qualifiedName = empty($source) ? $method : $source.".".$method; + + if (!isset($this->_table[$qualifiedName])) { // if source is null a method that was not defined was called. if ($source) { - $classPath = array(); - $path = explode('.', $source); - $className = array_pop($path); - $uriclasspath = implode('/', $path); - - // Take the user supplied directories and add the unique service path to the end. - foreach ($this->_directories as $dir) { - $classPath[] = $dir . $uriclasspath; - } - - require_once('Zend/Loader.php'); + $className = str_replace(".", "_", $source); + if(class_exists($className, false) && !isset($this->_classAllowed[$className])) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Can not call "' . $className . '" - use setClass()'); + } try { - Zend_Loader::loadClass($className, $classPath); + $this->getLoader()->load($className); } catch (Exception $e) { require_once 'Zend/Amf/Server/Exception.php'; - throw new Zend_Amf_Server_Exception('Class "' . $className . '" does not exist'); + throw new Zend_Amf_Server_Exception('Class "' . $className . '" does not exist: '.$e->getMessage()); } // Add the new loaded class to the server. - $this->setClass($className); + $this->setClass($className, $source); } else { require_once 'Zend/Amf/Server/Exception.php'; throw new Zend_Amf_Server_Exception('Method "' . $method . '" does not exist'); } } - $info = $this->_table[$method]; + $info = $this->_table[$qualifiedName]; $argv = $info->getInvokeArguments(); + if (0 < count($argv)) { $params = array_merge($params, $argv); } if ($info instanceof Zend_Server_Reflection_Function) { $func = $info->getName(); + $this->_checkAcl(null, $func); $return = call_user_func_array($func, $params); } elseif ($info instanceof Zend_Server_Reflection_Method) { // Get class @@ -158,6 +342,7 @@ class Zend_Amf_Server implements Zend_Server_Interface // for some reason, invokeArgs() does not work the same as // invoke(), and expects the first argument to be an object. // So, using a callback if the method is static. + $this->_checkAcl($class, $info->getName()); $return = call_user_func_array(array($class, $info->getName()), $params); } else { // Object methods @@ -165,8 +350,9 @@ class Zend_Amf_Server implements Zend_Server_Interface $object = $info->getDeclaringClass()->newInstance(); } catch (Exception $e) { require_once 'Zend/Amf/Server/Exception.php'; - throw new Zend_Amf_Server_Exception('Error instantiating class ' . $class . ' to invoke method ' . $info->getName(), 621); + throw new Zend_Amf_Server_Exception('Error instantiating class ' . $class . ' to invoke method ' . $info->getName() . ': '.$e->getMessage(), 621); } + $this->_checkAcl($object, $info->getName()); $return = $info->invokeArgs($object, $params); } } else { @@ -188,9 +374,30 @@ class Zend_Amf_Server implements Zend_Server_Interface */ protected function _loadCommandMessage(Zend_Amf_Value_Messaging_CommandMessage $message) { + require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php'; switch($message->operation) { - case Zend_Amf_Value_Messaging_CommandMessage::CLIENT_PING_OPERATION : - require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php'; + case Zend_Amf_Value_Messaging_CommandMessage::DISCONNECT_OPERATION : + case Zend_Amf_Value_Messaging_CommandMessage::CLIENT_PING_OPERATION : + $return = new Zend_Amf_Value_Messaging_AcknowledgeMessage($message); + break; + case Zend_Amf_Value_Messaging_CommandMessage::LOGIN_OPERATION : + $data = explode(':', base64_decode($message->body)); + $userid = $data[0]; + $password = isset($data[1])?$data[1]:""; + if(empty($userid)) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Login failed: username not supplied'); + } + if(!$this->_handleAuth($userid, $password)) { + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception('Authentication failed'); + } + $return = new Zend_Amf_Value_Messaging_AcknowledgeMessage($message); + break; + case Zend_Amf_Value_Messaging_CommandMessage::LOGOUT_OPERATION : + if($this->_auth) { + Zend_Auth::getInstance()->clearIdentity(); + } $return = new Zend_Amf_Value_Messaging_AcknowledgeMessage($message); break; default : @@ -201,11 +408,74 @@ class Zend_Amf_Server implements Zend_Server_Interface return $return; } + /** + * Create appropriate error message + * + * @param int $objectEncoding Current AMF encoding + * @param string $message Message that was being processed when error happened + * @param string $description Error description + * @param mixed $detail Detailed data about the error + * @param int $code Error code + * @param int $line Error line + * @return Zend_Amf_Value_Messaging_ErrorMessage|array + */ + protected function _errorMessage($objectEncoding, $message, $description, $detail, $code, $line) + { + $return = null; + switch ($objectEncoding) { + case Zend_Amf_Constants::AMF0_OBJECT_ENCODING : + return array ( + 'description' => ($this->isProduction ()) ? '' : $description, + 'detail' => ($this->isProduction ()) ? '' : $detail, + 'line' => ($this->isProduction ()) ? 0 : $line, + 'code' => $code + ); + case Zend_Amf_Constants::AMF3_OBJECT_ENCODING : + require_once 'Zend/Amf/Value/Messaging/ErrorMessage.php'; + $return = new Zend_Amf_Value_Messaging_ErrorMessage ( $message ); + $return->faultString = $this->isProduction () ? '' : $description; + $return->faultCode = $code; + $return->faultDetail = $this->isProduction () ? '' : $detail; + break; + } + return $return; + } + + /** + * Handle AMF authenticaton + * + * @param string $userid + * @param string $password + * @return boolean + */ + protected function _handleAuth( $userid, $password) + { + if (!$this->_auth) { + return true; + } + $this->_auth->setCredentials($userid, $password); + $auth = Zend_Auth::getInstance(); + $result = $auth->authenticate($this->_auth); + if ($result->isValid()) { + if (!$this->isSession()) { + $this->setSession(); + } + return true; + } else { + // authentication failed, good bye + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception( + "Authentication failed: " . join("\n", + $result->getMessages()), $result->getCode()); + } + + } + /** * Takes the deserialized AMF request and performs any operations. * * @todo should implement and SPL observer pattern for custom AMF headers - * @todo implement AMF header authentication + * @todo DescribeService support * @param Zend_Amf_Request $request * @return Zend_Amf_Response * @throws Zend_Amf_server_Exception|Exception @@ -220,16 +490,42 @@ class Zend_Amf_Server implements Zend_Server_Interface // set reponse encoding $response->setObjectEncoding($objectEncoding); - + $responseBody = $request->getAmfBodies(); + $handleAuth = false; + if ($this->_auth) { + $headers = $request->getAmfHeaders(); + if (isset($headers[Zend_Amf_Constants::CREDENTIALS_HEADER]) && + isset($headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->userid)) { + $handleAuth = true; + } + } + // Iterate through each of the service calls in the AMF request foreach($responseBody as $body) { try { + if ($handleAuth) { + if ($this->_handleAuth( + $headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->userid, + $headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->password)) { + // use RequestPersistentHeader to clear credentials + $response->addAmfHeader( + new Zend_Amf_Value_MessageHeader( + Zend_Amf_Constants::PERSISTENT_HEADER, + false, + new Zend_Amf_Value_MessageHeader( + Zend_Amf_Constants::CREDENTIALS_HEADER, + false, null))); + $handleAuth = false; + } + } + if ($objectEncoding == Zend_Amf_Constants::AMF0_OBJECT_ENCODING) { // AMF0 Object Encoding $targetURI = $body->getTargetURI(); + $message = ''; // Split the target string into its values. $source = substr($targetURI, 0, strrpos($targetURI, '.')); @@ -262,7 +558,7 @@ class Zend_Amf_Server implements Zend_Server_Interface if ($source) { // Break off method name from namespace into source $method = substr(strrchr($targetURI, '.'), 1); - $return = $this->_dispatch($method, array($body->getData()), $source); + $return = $this->_dispatch($method, $body->getData(), $source); } else { // Just have a method name. $return = $this->_dispatch($targetURI, $body->getData()); @@ -271,23 +567,8 @@ class Zend_Amf_Server implements Zend_Server_Interface } $responseType = Zend_AMF_Constants::RESULT_METHOD; } catch (Exception $e) { - switch ($objectEncoding) { - case Zend_Amf_Constants::AMF0_OBJECT_ENCODING : - $return = array( - 'description' => ($this->isProduction()) ? '' : $e->getMessage(), - 'detail' => ($this->isProduction()) ? '' : $e->getTraceAsString(), - 'line' => ($this->isProduction()) ? 0 : $e->getLine(), - 'code' => $e->getCode(), - ); - break; - case Zend_Amf_Constants::AMF3_OBJECT_ENCODING : - require_once 'Zend/Amf/Value/Messaging/ErrorMessage.php'; - $return = new Zend_Amf_Value_Messaging_ErrorMessage($message); - $return->faultString = $this->isProduction() ? '' : $e->getMessage(); - $return->faultCode = $e->getCode(); - $return->faultDetail = $this->isProduction() ? '' : $e->getTraceAsString(); - break; - } + $return = $this->_errorMessage($objectEncoding, $message, + $e->getMessage(), $e->getTraceAsString(),$e->getCode(), $e->getLine()); $responseType = Zend_AMF_Constants::STATUS_METHOD; } @@ -295,6 +576,23 @@ class Zend_Amf_Server implements Zend_Server_Interface $newBody = new Zend_Amf_Value_MessageBody($responseURI, null, $return); $response->addAmfBody($newBody); } + // Add a session header to the body if session is requested. + if($this->isSession()) { + $currentID = session_id(); + $joint = "?"; + if(isset($_SERVER['QUERY_STRING'])) { + if(!strpos($_SERVER['QUERY_STRING'], $currentID) !== FALSE) { + if(strrpos($_SERVER['QUERY_STRING'], "?") !== FALSE) { + $joint = "&"; + } + } + } + + // create a new AMF message header with the session id as a variable. + $sessionValue = $joint . $this->_sessionName . "=" . $currentID; + $sessionHeader = new Zend_Amf_Value_MessageHeader(Zend_Amf_Constants::URL_APPEND_HEADER, false, $sessionValue); + $response->addAmfHeader($sessionHeader); + } // serialize the response and return serialized body. $response->finalize(); @@ -314,6 +612,12 @@ class Zend_Amf_Server implements Zend_Server_Interface } else { $this->setRequest($request); } + if ($this->isSession()) { + // Check if a session is being sent from the amf call + if (isset($_COOKIE[$this->_sessionName])) { + session_id($_COOKIE[$this->_sessionName]); + } + } // Check for errors that may have happend in deserialization of Request. try { @@ -404,15 +708,6 @@ class Zend_Amf_Server implements Zend_Server_Interface return $this->_response; } - /** - * Add a file system path to a directory of services. - * @param string|array $path - */ - public function setClassPath($path) - { - - } - /** * Attach a class or object to the server * @@ -443,6 +738,14 @@ class Zend_Amf_Server implements Zend_Server_Interface $argv = array_slice(func_get_args(), 2); } + // Use the class name as the name space by default. + + if ($namespace == '') { + $namespace = is_object($class) ? get_class($class) : $class; + } + + $this->_classAllowed[is_object($class) ? get_class($class) : $class] = true; + $this->_methods[] = Zend_Server_Reflection::reflectClass($class, $argv, $namespace); $this->_buildDispatchTable(); @@ -489,12 +792,13 @@ class Zend_Amf_Server implements Zend_Server_Interface /** * Creates an array of directories in which services can reside. - * + * TODO: add support for prefixes? + * * @param string $dir */ public function addDirectory($dir) { - $this->_directories[] = $dir; + $this->getLoader()->addPrefixPath("", $dir); } /** @@ -504,7 +808,7 @@ class Zend_Amf_Server implements Zend_Server_Interface */ public function getDirectory() { - return $_directory; + return $this->getLoader()->getPaths(""); } /** @@ -550,6 +854,8 @@ class Zend_Amf_Server implements Zend_Server_Interface $this->_table = $table; } + + /** * Raise a server fault * diff --git a/lib/zend/Zend/Amf/Server/Exception.php b/lib/zend/Zend/Amf/Server/Exception.php index 57e0f54b9c..572ed74fe0 100644 --- a/lib/zend/Zend/Amf/Server/Exception.php +++ b/lib/zend/Zend/Amf/Server/Exception.php @@ -4,18 +4,20 @@ * * LICENSE * - * This source file is subject to version 1.0 of the Zend Framework - * license, that is bundled with this package in the file LICENSE.txt, and - * is available through the world-wide-web at the following URL: - * http://framework.zend.com/license/new-bsd. If you did not receive - * a copy of the Zend Framework license and are unable to obtain it - * through the world-wide-web, please send a note to license@zend.com - * so we can mail you a copy immediately. + * This source file is subject to the new BSD license that is bundled + * with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://framework.zend.com/license/new-bsd + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@zend.com so we can send you a copy immediately. * + * @category Zend * @package Zend_Amf * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Exception */ @@ -27,7 +29,7 @@ require_once 'Zend/Amf/Exception.php'; * @category Zend * @package Zend_Amf * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Server_Exception extends Zend_Amf_Exception diff --git a/lib/zend/Zend/Amf/Util/BinaryStream.php b/lib/zend/Zend/Amf/Util/BinaryStream.php index 2bafbeb1b4..6f2135b358 100644 --- a/lib/zend/Zend/Amf/Util/BinaryStream.php +++ b/lib/zend/Zend/Amf/Util/BinaryStream.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Util - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -24,7 +25,7 @@ * * @package Zend_Amf * @subpackage Util - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Util_BinaryStream diff --git a/lib/zend/Zend/Amf/Value/ByteArray.php b/lib/zend/Zend/Amf/Value/ByteArray.php index 7f25e29fab..24218807e8 100644 --- a/lib/zend/Zend/Amf/Value/ByteArray.php +++ b/lib/zend/Zend/Amf/Value/ByteArray.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -24,7 +25,7 @@ * * @package Zend_Amf * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Value_ByteArray diff --git a/lib/zend/Zend/Amf/Value/MessageBody.php b/lib/zend/Zend/Amf/Value/MessageBody.php index b92bcb3a51..fd2fb925a9 100644 --- a/lib/zend/Zend/Amf/Value/MessageBody.php +++ b/lib/zend/Zend/Amf/Value/MessageBody.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -32,7 +33,7 @@ * * @package Zend_Amf * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Value_MessageBody diff --git a/lib/zend/Zend/Amf/Value/MessageHeader.php b/lib/zend/Zend/Amf/Value/MessageHeader.php index 2b95a68c1e..1bc04370ff 100644 --- a/lib/zend/Zend/Amf/Value/MessageHeader.php +++ b/lib/zend/Zend/Amf/Value/MessageHeader.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -27,7 +28,7 @@ * * @package Zend_Amf * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Value_MessageHeader diff --git a/lib/zend/Zend/Amf/Value/Messaging/AbstractMessage.php b/lib/zend/Zend/Amf/Value/Messaging/AbstractMessage.php index 69a3e28caa..797f195ba4 100644 --- a/lib/zend/Zend/Amf/Value/Messaging/AbstractMessage.php +++ b/lib/zend/Zend/Amf/Value/Messaging/AbstractMessage.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -25,7 +26,7 @@ * * @package Zend_Amf * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Value_Messaging_AbstractMessage diff --git a/lib/zend/Zend/Amf/Value/Messaging/AcknowledgeMessage.php b/lib/zend/Zend/Amf/Value/Messaging/AcknowledgeMessage.php index 6aac86d921..757feb3f4f 100644 --- a/lib/zend/Zend/Amf/Value/Messaging/AcknowledgeMessage.php +++ b/lib/zend/Zend/Amf/Value/Messaging/AcknowledgeMessage.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_Amf * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** Zend_Amf_Value_Messaging_AsyncMessage */ @@ -31,7 +32,7 @@ require_once 'Zend/Amf/Value/Messaging/AsyncMessage.php'; * * @package Zend_Amf * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Amf_Value_Messaging_AcknowledgeMessage extends Zend_Amf_Value_Messaging_AsyncMessage @@ -52,7 +53,7 @@ class Zend_Amf_Value_Messaging_AcknowledgeMessage extends Zend_Amf_Value_Messagi $this->body = null; // correleate the two messages - if ($message) { + if ($message && isset($message->messageId)) { $this->correlationId = $message->messageId; } } diff --git a/lib/zend/Zend/Amf/Value/Messaging/ArrayCollection.php b/lib/zend/Zend/Amf/Value/Messaging/ArrayCollection.php new file mode 100755 index 0000000000..0e39193af0 --- /dev/null +++ b/lib/zend/Zend/Amf/Value/Messaging/ArrayCollection.php @@ -0,0 +1,35 @@ +hasPluginResource('FrontController')) { + $this->registerPluginResource('FrontController'); + } + } + + /** + * Run the application + * + * Checks to see that we have a default controller directory. If not, an + * exception is thrown. + * + * If so, it registers the bootstrap with the 'bootstrap' parameter of + * the front controller, and dispatches the front controller. + * + * @return void + * @throws Zend_Application_Bootstrap_Exception + */ + public function run() + { + $front = $this->getResource('FrontController'); + $default = $front->getDefaultModule(); + if (null === $front->getControllerDirectory($default)) { + throw new Zend_Application_Bootstrap_Exception( + 'No default controller directory registered with front controller' + ); + } + + $front->setParam('bootstrap', $this); + $front->dispatch(); + } +} diff --git a/lib/zend/Zend/Application/Bootstrap/BootstrapAbstract.php b/lib/zend/Zend/Application/Bootstrap/BootstrapAbstract.php new file mode 100644 index 0000000000..04b0bfcb23 --- /dev/null +++ b/lib/zend/Zend/Application/Bootstrap/BootstrapAbstract.php @@ -0,0 +1,764 @@ +setApplication($application); + $options = $application->getOptions(); + $this->setOptions($options); + } + + /** + * Set class state + * + * @param array $options + * @return Zend_Application_Bootstrap_BootstrapAbstract + */ + public function setOptions(array $options) + { + $this->_options = $this->mergeOptions($this->_options, $options); + + $options = array_change_key_case($options, CASE_LOWER); + $this->_optionKeys = array_merge($this->_optionKeys, array_keys($options)); + + $methods = get_class_methods($this); + foreach ($methods as $key => $method) { + $methods[$key] = strtolower($method); + } + + if (array_key_exists('pluginpaths', $options)) { + $pluginLoader = $this->getPluginLoader(); + + foreach ($options['pluginpaths'] as $prefix => $path) { + $pluginLoader->addPrefixPath($prefix, $path); + } + unset($options['pluginpaths']); + } + + foreach ($options as $key => $value) { + $method = 'set' . strtolower($key); + + if (in_array($method, $methods)) { + $this->$method($value); + } elseif ('resources' == $key) { + foreach ($value as $resource => $resourceOptions) { + $this->registerPluginResource($resource, $resourceOptions); + } + } + } + return $this; + } + + /** + * Get current options from bootstrap + * + * @return array + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Is an option present? + * + * @param string $key + * @return bool + */ + public function hasOption($key) + { + return in_array($key, $this->_optionKeys); + } + + /** + * Retrieve a single option + * + * @param string $key + * @return mixed + */ + public function getOption($key) + { + if ($this->hasOption($key)) { + $options = $this->getOptions(); + $options = array_change_key_case($options, CASE_LOWER); + return $options[strtolower($key)]; + } + return null; + } + + /** + * Merge options recursively + * + * @param array $array1 + * @param mixed $array2 + * @return array + */ + public function mergeOptions(array $array1, $array2 = null) + { + if (is_array($array2)) { + foreach ($array2 as $key => $val) { + if (is_array($array2[$key])) { + $array1[$key] = (array_key_exists($key, $array1) && is_array($array1[$key])) + ? $this->mergeOptions($array1[$key], $array2[$key]) + : $array2[$key]; + } else { + $array1[$key] = $val; + } + } + } + return $array1; + } + + /** + * Get class resources (as resource/method pairs) + * + * Uses get_class_methods() by default, reflection on prior to 5.2.6, + * as a bug prevents the usage of get_class_methods() there. + * + * @return array + */ + public function getClassResources() + { + if (null === $this->_classResources) { + if (version_compare(PHP_VERSION, '5.2.6') === -1) { + $class = new ReflectionObject($this); + $classMethods = $class->getMethods(); + $methodNames = array(); + + foreach ($classMethods as $method) { + $methodNames[] = $method->getName(); + } + } else { + $methodNames = get_class_methods($this); + } + + $this->_classResources = array(); + foreach ($methodNames as $method) { + if (5 < strlen($method) && '_init' === substr($method, 0, 5)) { + $this->_classResources[strtolower(substr($method, 5))] = $method; + } + } + } + + return $this->_classResources; + } + + /** + * Get class resource names + * + * @return array + */ + public function getClassResourceNames() + { + $resources = $this->getClassResources(); + return array_keys($resources); + } + + /** + * Register a new resource plugin + * + * @param string|Zend_Application_Resource_Resource $resource + * @param mixed $options + * @return Zend_Application_Bootstrap_BootstrapAbstract + * @throws Zend_Application_Bootstrap_Exception When invalid resource is provided + */ + public function registerPluginResource($resource, $options = null) + { + if ($resource instanceof Zend_Application_Resource_Resource) { + $resource->setBootstrap($this); + $pluginName = $this->_resolvePluginResourceName($resource); + $this->_pluginResources[$pluginName] = $resource; + return $this; + } + + if (!is_string($resource)) { + throw new Zend_Application_Bootstrap_Exception('Invalid resource provided to ' . __METHOD__); + } + + $this->_pluginResources[$resource] = $options; + return $this; + } + + /** + * Unregister a resource from the bootstrap + * + * @param string|Zend_Application_Resource_Resource $resource + * @return Zend_Application_Bootstrap_BootstrapAbstract + * @throws Zend_Application_Bootstrap_Exception When unknown resource type is provided + */ + public function unregisterPluginResource($resource) + { + if ($resource instanceof Zend_Application_Resource_Resource) { + if ($index = array_search($resource, $this->_pluginResources, true)) { + unset($this->_pluginResources[$index]); + } + return $this; + } + + if (!is_string($resource)) { + throw new Zend_Application_Bootstrap_Exception('Unknown resource type provided to ' . __METHOD__); + } + + $resource = strtolower($resource); + if (array_key_exists($resource, $this->_pluginResources)) { + unset($this->_pluginResources[$resource]); + } + + return $this; + } + + /** + * Is the requested plugin resource registered? + * + * @param string $resource + * @return bool + */ + public function hasPluginResource($resource) + { + return (null !== $this->getPluginResource($resource)); + } + + /** + * Get a registered plugin resource + * + * @param string $resourceName + * @return Zend_Application_Resource_Resource + */ + public function getPluginResource($resource) + { + if (array_key_exists(strtolower($resource), $this->_pluginResources)) { + $resource = strtolower($resource); + if (!$this->_pluginResources[$resource] instanceof Zend_Application_Resource_Resource) { + $resourceName = $this->_loadPluginResource($resource, $this->_pluginResources[$resource]); + if (!$resourceName) { + throw new Zend_Application_Bootstrap_Exception(sprintf('Unable to resolve plugin "%s"; no corresponding plugin with that name', $resource)); + } + $resource = $resourceName; + } + return $this->_pluginResources[$resource]; + } + + foreach ($this->_pluginResources as $plugin => $spec) { + if ($spec instanceof Zend_Application_Resource_Resource) { + $pluginName = $this->_resolvePluginResourceName($spec); + if (0 === strcasecmp($resource, $pluginName)) { + unset($this->_pluginResources[$plugin]); + $this->_pluginResources[$pluginName] = $spec; + return $spec; + } + continue; + } + + if (false !== $pluginName = $this->_loadPluginResource($plugin, $spec)) { + if (0 === strcasecmp($resource, $pluginName)) { + return $this->_pluginResources[$pluginName]; + } + } + + if (class_exists($plugin)) { + $spec = (array) $spec; + $spec['bootstrap'] = $this; + $instance = new $plugin($spec); + $pluginName = $this->_resolvePluginResourceName($instance); + unset($this->_pluginResources[$plugin]); + $this->_pluginResources[$pluginName] = $instance; + + if (0 === strcasecmp($resource, $pluginName)) { + return $instance; + } + } + } + + return null; + } + + /** + * Retrieve all plugin resources + * + * @return array + */ + public function getPluginResources() + { + foreach (array_keys($this->_pluginResources) as $resource) { + $this->getPluginResource($resource); + } + return $this->_pluginResources; + } + + /** + * Retrieve plugin resource names + * + * @return array + */ + public function getPluginResourceNames() + { + $this->getPluginResources(); + return array_keys($this->_pluginResources); + } + + /** + * Set plugin loader for loading resources + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @return Zend_Application_Bootstrap_BootstrapAbstract + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader) + { + $this->_pluginLoader = $loader; + return $this; + } + + /** + * Get the plugin loader for resources + * + * @return Zend_Loader_PluginLoader_Interface + */ + public function getPluginLoader() + { + if ($this->_pluginLoader === null) { + $options = array( + 'Zend_Application_Resource' => 'Zend/Application/Resource' + ); + + $this->_pluginLoader = new Zend_Loader_PluginLoader($options); + } + + return $this->_pluginLoader; + } + + /** + * Set application/parent bootstrap + * + * @param Zend_Application|Zend_Application_Bootstrap_Bootstrapper $application + * @return Zend_Application_Bootstrap_BootstrapAbstract + */ + public function setApplication($application) + { + if (($application instanceof Zend_Application) + || ($application instanceof Zend_Application_Bootstrap_Bootstrapper) + ) { + $this->_application = $application; + } else { + throw new Zend_Application_Bootstrap_Exception('Invalid application provided to bootstrap constructor (received "' . get_class($application) . '" instance)'); + } + return $this; + } + + /** + * Retrieve parent application instance + * + * @return Zend_Application|Zend_Application_Bootstrap_Bootstrapper + */ + public function getApplication() + { + return $this->_application; + } + + /** + * Retrieve application environment + * + * @return string + */ + public function getEnvironment() + { + if (null === $this->_environment) { + $this->_environment = $this->getApplication()->getEnvironment(); + } + return $this->_environment; + } + + /** + * Set resource container + * + * By default, if a resource callback has a non-null return value, this + * value will be stored in a container using the resource name as the + * key. + * + * Containers must be objects, and must allow setting public properties. + * + * @param object $container + * @return Zend_Application_Bootstrap_BootstrapAbstract + */ + public function setContainer($container) + { + if (!is_object($container)) { + throw new Zend_Application_Bootstrap_Exception('Resource containers must be objects'); + } + $this->_container = $container; + return $this; + } + + /** + * Retrieve resource container + * + * @return object + */ + public function getContainer() + { + if (null === $this->_container) { + $this->setContainer(new Zend_Registry()); + } + return $this->_container; + } + + /** + * Determine if a resource has been stored in the container + * + * During bootstrap resource initialization, you may return a value. If + * you do, it will be stored in the {@link setContainer() container}. + * You can use this method to determine if a value was stored. + * + * @param string $name + * @return bool + */ + public function hasResource($name) + { + $resource = strtolower($name); + $container = $this->getContainer(); + return isset($container->{$resource}); + } + + /** + * Retrieve a resource from the container + * + * During bootstrap resource initialization, you may return a value. If + * you do, it will be stored in the {@link setContainer() container}. + * You can use this method to retrieve that value. + * + * If no value was returned, this will return a null value. + * + * @param string $name + * @return null|mixed + */ + public function getResource($name) + { + $resource = strtolower($name); + $container = $this->getContainer(); + if ($this->hasResource($resource)) { + return $container->{$resource}; + } + return null; + } + + /** + * Implement PHP's magic to retrieve a ressource + * in the bootstrap + * + * @param string $prop + * @return null|mixed + */ + public function __get($prop) + { + return $this->getResource($prop); + } + + /** + * Implement PHP's magic to ask for the + * existence of a ressource in the bootstrap + * + * @param string $prop + * @return bool + */ + public function __isset($prop) + { + return $this->hasResource($prop); + } + + /** + * Bootstrap individual, all, or multiple resources + * + * Marked as final to prevent issues when subclassing and naming the + * child class 'Bootstrap' (in which case, overriding this method + * would result in it being treated as a constructor). + * + * If you need to override this functionality, override the + * {@link _bootstrap()} method. + * + * @param null|string|array $resource + * @return Zend_Application_Bootstrap_BootstrapAbstract + * @throws Zend_Application_Bootstrap_Exception When invalid argument was passed + */ + final public function bootstrap($resource = null) + { + $this->_bootstrap($resource); + return $this; + } + + /** + * Overloading: intercept calls to bootstrap() methods + * + * @param string $method + * @param array $args + * @return void + * @throws Zend_Application_Bootstrap_Exception On invalid method name + */ + public function __call($method, $args) + { + if (9 < strlen($method) && 'bootstrap' === substr($method, 0, 9)) { + $resource = substr($method, 9); + return $this->bootstrap($resource); + } + + throw new Zend_Application_Bootstrap_Exception('Invalid method "' . $method . '"'); + } + + /** + * Bootstrap implementation + * + * This method may be overridden to provide custom bootstrapping logic. + * It is the sole method called by {@link bootstrap()}. + * + * @param null|string|array $resource + * @return void + * @throws Zend_Application_Bootstrap_Exception When invalid argument was passed + */ + protected function _bootstrap($resource = null) + { + if (null === $resource) { + foreach ($this->getClassResourceNames() as $resource) { + $this->_executeResource($resource); + } + + foreach ($this->getPluginResourceNames() as $resource) { + $this->_executeResource($resource); + } + } elseif (is_string($resource)) { + $this->_executeResource($resource); + } elseif (is_array($resource)) { + foreach ($resource as $r) { + $this->_executeResource($r); + } + } else { + throw new Zend_Application_Bootstrap_Exception('Invalid argument passed to ' . __METHOD__); + } + } + + /** + * Execute a resource + * + * Checks to see if the resource has already been run. If not, it searches + * first to see if a local method matches the resource, and executes that. + * If not, it checks to see if a plugin resource matches, and executes that + * if found. + * + * Finally, if not found, it throws an exception. + * + * @param string $resource + * @return void + * @throws Zend_Application_Bootstrap_Exception When resource not found + */ + protected function _executeResource($resource) + { + $resourceName = strtolower($resource); + + if (in_array($resourceName, $this->_run)) { + return; + } + + if (isset($this->_started[$resourceName]) && $this->_started[$resourceName]) { + throw new Zend_Application_Bootstrap_Exception('Circular resource dependency detected'); + } + + $classResources = $this->getClassResources(); + if (array_key_exists($resourceName, $classResources)) { + $this->_started[$resourceName] = true; + $method = $classResources[$resourceName]; + $return = $this->$method(); + unset($this->_started[$resourceName]); + $this->_markRun($resourceName); + + if (null !== $return) { + $this->getContainer()->{$resourceName} = $return; + } + + return; + } + + if ($this->hasPluginResource($resource)) { + $this->_started[$resourceName] = true; + $plugin = $this->getPluginResource($resource); + $return = $plugin->init(); + unset($this->_started[$resourceName]); + $this->_markRun($resourceName); + + if (null !== $return) { + $this->getContainer()->{$resourceName} = $return; + } + + return; + } + + throw new Zend_Application_Bootstrap_Exception('Resource matching "' . $resource . '" not found'); + } + + /** + * Load a plugin resource + * + * @param string $resource + * @param array|object|null $options + * @return string|false + */ + protected function _loadPluginResource($resource, $options) + { + $options = (array) $options; + $options['bootstrap'] = $this; + $className = $this->getPluginLoader()->load(strtolower($resource), false); + + if (!$className) { + return false; + } + + $instance = new $className($options); + + unset($this->_pluginResources[$resource]); + + if (isset($instance->_explicitType)) { + $resource = $instance->_explicitType; + } + $resource = strtolower($resource); + $this->_pluginResources[$resource] = $instance; + + return $resource; + } + + /** + * Mark a resource as having run + * + * @param string $resource + * @return void + */ + protected function _markRun($resource) + { + if (!in_array($resource, $this->_run)) { + $this->_run[] = $resource; + } + } + + /** + * Resolve a plugin resource name + * + * Uses, in order of preference + * - $_explicitType property of resource + * - Short name of resource (if a matching prefix path is found) + * - class name (if none of the above are true) + * + * The name is then cast to lowercase. + * + * @param Zend_Application_Resource_Resource $resource + * @return string + */ + protected function _resolvePluginResourceName($resource) + { + if (isset($resource->_explicitType)) { + $pluginName = $resource->_explicitType; + } else { + $className = get_class($resource); + $pluginName = $className; + $loader = $this->getPluginLoader(); + foreach ($loader->getPaths() as $prefix => $paths) { + if (0 === strpos($className, $prefix)) { + $pluginName = substr($className, strlen($prefix)); + $pluginName = trim($pluginName, '_'); + } + } + } + $pluginName = strtolower($pluginName); + return $pluginName; + } +} diff --git a/lib/zend/Zend/Application/Bootstrap/Bootstrapper.php b/lib/zend/Zend/Application/Bootstrap/Bootstrapper.php new file mode 100644 index 0000000000..56c422081b --- /dev/null +++ b/lib/zend/Zend/Application/Bootstrap/Bootstrapper.php @@ -0,0 +1,94 @@ +initDefaultResourceTypes(); + } + + /** + * Initialize default resource types for module resource classes + * + * @return void + */ + public function initDefaultResourceTypes() + { + $basePath = $this->getBasePath(); + $this->addResourceTypes(array( + 'dbtable' => array( + 'namespace' => 'Model_DbTable', + 'path' => 'models/DbTable', + ), + 'form' => array( + 'namespace' => 'Form', + 'path' => 'forms', + ), + 'model' => array( + 'namespace' => 'Model', + 'path' => 'models', + ), + 'plugin' => array( + 'namespace' => 'Plugin', + 'path' => 'plugins', + ), + 'service' => array( + 'namespace' => 'Service', + 'path' => 'services', + ), + 'viewhelper' => array( + 'namespace' => 'View_Helper', + 'path' => 'views/helpers', + ), + 'viewfilter' => array( + 'namespace' => 'View_Filter', + 'path' => 'views/filters', + ), + )); + $this->setDefaultResourceType('model'); + } +} diff --git a/lib/zend/Zend/Application/Module/Bootstrap.php b/lib/zend/Zend/Application/Module/Bootstrap.php new file mode 100644 index 0000000000..2ac27b950b --- /dev/null +++ b/lib/zend/Zend/Application/Module/Bootstrap.php @@ -0,0 +1,143 @@ +setApplication($application); + + // Use same plugin loader as parent bootstrap + if ($application instanceof Zend_Application_Bootstrap_ResourceBootstrapper) { + $this->setPluginLoader($application->getPluginLoader()); + } + + $key = strtolower($this->getModuleName()); + if ($application->hasOption($key)) { + // Don't run via setOptions() to prevent duplicate initialization + $this->setOptions($application->getOption($key)); + } + + if ($application->hasOption('resourceloader')) { + $this->setOptions(array( + 'resourceloader' => $application->getOption('resourceloader') + )); + } + $this->initResourceLoader(); + + // ZF-6545: ensure front controller resource is loaded + if (!$this->hasPluginResource('FrontController')) { + $this->registerPluginResource('FrontController'); + } + + // ZF-6545: prevent recursive registration of modules + if ($this->hasPluginResource('modules')) { + $this->unregisterPluginResource('modules'); + } + } + + /** + * Set module resource loader + * + * @param Zend_Loader_Autoloader_Resource $loader + * @return Zend_Application_Module_Bootstrap + */ + public function setResourceLoader(Zend_Loader_Autoloader_Resource $loader) + { + $this->_resourceLoader = $loader; + return $this; + } + + /** + * Retrieve module resource loader + * + * @return Zend_Loader_Autoloader_Resource + */ + public function getResourceLoader() + { + if (null === $this->_resourceLoader) { + $r = new ReflectionClass($this); + $path = $r->getFileName(); + $this->setResourceLoader(new Zend_Application_Module_Autoloader(array( + 'namespace' => $this->getModuleName(), + 'basePath' => dirname($path), + ))); + } + return $this->_resourceLoader; + } + + /** + * Ensure resource loader is loaded + * + * @return void + */ + public function initResourceLoader() + { + $this->getResourceLoader(); + } + + /** + * Retrieve module name + * + * @return string + */ + public function getModuleName() + { + if (empty($this->_moduleName)) { + $class = get_class($this); + if (preg_match('/^([a-z][a-z0-9]*)_/i', $class, $matches)) { + $prefix = $matches[1]; + } else { + $prefix = $class; + } + $this->_moduleName = $prefix; + } + return $this->_moduleName; + } +} diff --git a/lib/zend/Zend/Application/Resource/Db.php b/lib/zend/Zend/Application/Resource/Db.php new file mode 100644 index 0000000000..9009a1a0e5 --- /dev/null +++ b/lib/zend/Zend/Application/Resource/Db.php @@ -0,0 +1,156 @@ +_adapter = $adapter; + return $this; + } + + /** + * Adapter type to use + * + * @return string + */ + public function getAdapter() + { + return $this->_adapter; + } + + /** + * Set the adapter params + * + * @param $adapter string + * @return Zend_Application_Resource_Db + */ + public function setParams(array $params) + { + $this->_params = $params; + return $this; + } + + /** + * Adapter parameters + * + * @return array + */ + public function getParams() + { + return $this->_params; + } + + /** + * Set whether to use this as default table adapter + * + * @param boolean $defaultTableAdapter + * @return Zend_Application_Resource_Db + */ + public function setIsDefaultTableAdapter($isDefaultTableAdapter) + { + $this->_isDefaultTableAdapter = $isDefaultTableAdapter; + return $this; + } + + /** + * Is this adapter the default table adapter? + * + * @return void + */ + public function isDefaultTableAdapter() + { + return $this->_isDefaultTableAdapter; + } + + /** + * Retrieve initialized DB connection + * + * @return null|Zend_Db_Adapter_Interface + */ + public function getDbAdapter() + { + if ((null === $this->_db) + && (null !== ($adapter = $this->getAdapter())) + ) { + $this->_db = Zend_Db::factory($adapter, $this->getParams()); + } + return $this->_db; + } + + /** + * Defined by Zend_Application_Resource_Resource + * + * @return Zend_Db_Adapter_Abstract|null + */ + public function init() + { + if (null !== ($db = $this->getDbAdapter())) { + if ($this->isDefaultTableAdapter()) { + Zend_Db_Table::setDefaultAdapter($db); + } + return $db; + } + } +} diff --git a/lib/zend/Zend/Application/Resource/Exception.php b/lib/zend/Zend/Application/Resource/Exception.php new file mode 100644 index 0000000000..ca07290a77 --- /dev/null +++ b/lib/zend/Zend/Application/Resource/Exception.php @@ -0,0 +1,35 @@ +getFrontController(); + + foreach ($this->getOptions() as $key => $value) { + switch (strtolower($key)) { + case 'controllerdirectory': + if (is_string($value)) { + $front->setControllerDirectory($value); + } elseif (is_array($value)) { + foreach ($value as $module => $directory) { + $front->addControllerDirectory($directory, $module); + } + } + break; + + case 'modulecontrollerdirectoryname': + $front->setModuleControllerDirectoryName($value); + break; + + case 'moduledirectory': + $front->addModuleDirectory($value); + break; + + case 'defaultcontrollername': + $front->setDefaultControllerName($value); + break; + + case 'defaultaction': + $front->setDefaultAction($value); + break; + + case 'defaultmodule': + $front->setDefaultModule($value); + break; + + case 'baseurl': + if (!empty($value)) { + $front->setBaseUrl($value); + } + break; + + case 'params': + $front->setParams($value); + break; + + case 'plugins': + foreach ((array) $value as $pluginClass) { + $plugin = new $pluginClass(); + $front->registerPlugin($plugin); + } + break; + + case 'throwexceptions': + $front->throwExceptions((bool) $value); + break; + + case 'actionhelperpaths': + if (is_array($value)) { + foreach ($value as $helperPrefix => $helperPath) { + Zend_Controller_Action_HelperBroker::addPath($helperPath, $helperPrefix); + } + } + break; + + default: + $front->setParam($key, $value); + break; + } + } + + if (null !== ($bootstrap = $this->getBootstrap())) { + $this->getBootstrap()->frontController = $front; + } + + return $front; + } + + /** + * Retrieve front controller instance + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + if (null === $this->_front) { + $this->_front = Zend_Controller_Front::getInstance(); + } + return $this->_front; + } +} diff --git a/lib/zend/Zend/Application/Resource/Layout.php b/lib/zend/Zend/Application/Resource/Layout.php new file mode 100644 index 0000000000..ce5ff10129 --- /dev/null +++ b/lib/zend/Zend/Application/Resource/Layout.php @@ -0,0 +1,64 @@ +getBootstrap()->bootstrap('FrontController'); + return $this->getLayout(); + } + + /** + * Retrieve layout object + * + * @return Zend_Layout + */ + public function getLayout() + { + if (null === $this->_layout) { + $this->_layout = Zend_Layout::startMvc($this->getOptions()); + } + return $this->_layout; + } +} diff --git a/lib/zend/Zend/Application/Resource/Locale.php b/lib/zend/Zend/Application/Resource/Locale.php new file mode 100644 index 0000000000..1f6679eb00 --- /dev/null +++ b/lib/zend/Zend/Application/Resource/Locale.php @@ -0,0 +1,77 @@ +getLocale(); + } + + + /** + * Retrieve locale object + * + * @return Zend_Locale + */ + public function getLocale() + { + if (null === $this->_locale) { + $options = $this->getOptions(); + if (!isset($options['default'])) { + $this->_locale = new Zend_Locale(); + } else { + Zend_Locale::setDefault($options['default']); + $this->_locale = new Zend_Locale($options['default']); + } + + $key = (isset($options['registry_key']) && !is_numeric($options['registry_key'])) + ? $options['registry_key'] + : self::DEFAULT_REGISTRY_KEY; + Zend_Registry::set($key, $this->_locale); + } + return $this->_locale; + } +} diff --git a/lib/zend/Zend/Application/Resource/Modules.php b/lib/zend/Zend/Application/Resource/Modules.php new file mode 100644 index 0000000000..f6e4b9426d --- /dev/null +++ b/lib/zend/Zend/Application/Resource/Modules.php @@ -0,0 +1,132 @@ +_bootstraps = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS); + parent::__construct($options); + } + + /** + * Initialize modules + * + * @return array + * @throws Zend_Application_Resource_Exception When bootstrap class was not found + */ + public function init() + { + $bootstrap = $this->getBootstrap(); + $bootstrap->bootstrap('FrontController'); + $front = $bootstrap->getResource('FrontController'); + + $modules = $front->getControllerDirectory(); + $default = $front->getDefaultModule(); + $curBootstrapClass = get_class($bootstrap); + foreach ($modules as $module => $moduleDirectory) { + $bootstrapClass = $this->_formatModuleName($module) . '_Bootstrap'; + if (!class_exists($bootstrapClass, false)) { + $bootstrapPath = dirname($moduleDirectory) . '/Bootstrap.php'; + if (file_exists($bootstrapPath)) { + $eMsgTpl = 'Bootstrap file found for module "%s" but bootstrap class "%s" not found'; + include_once $bootstrapPath; + if (($default != $module) + && !class_exists($bootstrapClass, false) + ) { + throw new Zend_Application_Resource_Exception(sprintf( + $eMsgTpl, $module, $bootstrapClass + )); + } elseif ($default == $module) { + if (!class_exists($bootstrapClass, false)) { + $bootstrapClass = 'Bootstrap'; + if (!class_exists($bootstrapClass, false)) { + throw new Zend_Application_Resource_Exception(sprintf( + $eMsgTpl, $module, $bootstrapClass + )); + } + } + } + } else { + continue; + } + } + + if ($bootstrapClass == $curBootstrapClass) { + // If the found bootstrap class matches the one calling this + // resource, don't re-execute. + continue; + } + + $moduleBootstrap = new $bootstrapClass($bootstrap); + $moduleBootstrap->bootstrap(); + $this->_bootstraps[$module] = $moduleBootstrap; + } + + return $this->_bootstraps; + } + + /** + * Get bootstraps that have been run + * + * @return ArrayObject + */ + public function getExecutedBootstraps() + { + return $this->_bootstraps; + } + + /** + * Format a module name to the module class prefix + * + * @param string $name + * @return string + */ + protected function _formatModuleName($name) + { + $name = strtolower($name); + $name = str_replace(array('-', '.'), ' ', $name); + $name = ucwords($name); + $name = str_replace(' ', '', $name); + return $name; + } +} diff --git a/lib/zend/Zend/Application/Resource/Navigation.php b/lib/zend/Zend/Application/Resource/Navigation.php new file mode 100644 index 0000000000..8213b34169 --- /dev/null +++ b/lib/zend/Zend/Application/Resource/Navigation.php @@ -0,0 +1,118 @@ +_container) { + $options = $this->getOptions(); + $pages = isset($options['pages']) ? $options['pages'] : array(); + $this->_container = new Zend_Navigation($pages); + } + + $this->store(); + return $this->_container; + } + + /** + * Stores navigation container in registry or Navigation view helper + * + * @return void + */ + public function store() + { + $options = $this->getOptions(); + if (isset($options['storage']['registry']) && + $options['storage']['registry'] == true) { + $this->_storeRegistry(); + } else { + $this->_storeHelper(); + } + } + + /** + * Stores navigation container in the registry + * + * @return void + */ + protected function _storeRegistry() + { + $options = $this->getOptions(); + if(isset($options['storage']) && + isset($options['storage']['registry']) && + isset($options['storage']['registry']['key'])) + { + $key = $options['storage']['registry']['key']; + } else { + $key = self::DEFAULT_REGISTRY_KEY; + } + + Zend_Registry::set($key,$this->getContainer()); + } + + /** + * Stores navigation container in the Navigation helper + * + * @return void + */ + protected function _storeHelper() + { + $this->getBootstrap()->bootstrap('view'); + $view = $this->getBootstrap()->view; + $view->getHelper('navigation')->navigation($this->getContainer()); + } + + /** + * Returns navigation container + * + * @return Zend_Navigation + */ + public function getContainer() + { + return $this->_container; + } +} diff --git a/lib/zend/Zend/Application/Resource/Resource.php b/lib/zend/Zend/Application/Resource/Resource.php new file mode 100644 index 0000000000..cc6bab566b --- /dev/null +++ b/lib/zend/Zend/Application/Resource/Resource.php @@ -0,0 +1,80 @@ +setOptions($options); + } else if ($options instanceof Zend_Config) { + $this->setOptions($options->toArray()); + } + } + + /** + * Set options from array + * + * @param array $options Configuration for resource + * @return Zend_Application_Resource_ResourceAbstract + */ + public function setOptions(array $options) + { + foreach ($options as $key => $value) { + if (in_array(strtolower($key), $this->_skipOptions)) { + continue; + } + + $method = 'set' . strtolower($key); + if (method_exists($this, $method)) { + $this->$method($value); + } + if ('bootstrap' == $key) { + unset($options[$key]); + } + } + + $this->_options = $this->mergeOptions($this->_options, $options); + + return $this; + } + + /** + * Retrieve resource options + * + * @return array + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Merge options recursively + * + * @param array $array1 + * @param mixed $array2 + * @return array + */ + public function mergeOptions(array $array1, $array2 = null) + { + if (is_array($array2)) { + foreach ($array2 as $key => $val) { + if (is_array($array2[$key])) { + $array1[$key] = (array_key_exists($key, $array1) && is_array($array1[$key])) + ? $this->mergeOptions($array1[$key], $array2[$key]) + : $array2[$key]; + } else { + $array1[$key] = $val; + } + } + } + return $array1; + } + + /** + * Set the bootstrap to which the resource is attached + * + * @param Zend_Application_Bootstrap_Bootstrapper $bootstrap + * @return Zend_Application_Resource_Resource + */ + public function setBootstrap(Zend_Application_Bootstrap_Bootstrapper $bootstrap) + { + $this->_bootstrap = $bootstrap; + return $this; + } + + /** + * Retrieve the bootstrap to which the resource is attached + * + * @return null|Zend_Application_Bootstrap_Bootstrapper + */ + public function getBootstrap() + { + return $this->_bootstrap; + } +} diff --git a/lib/zend/Zend/Application/Resource/Router.php b/lib/zend/Zend/Application/Resource/Router.php new file mode 100644 index 0000000000..5887ee8915 --- /dev/null +++ b/lib/zend/Zend/Application/Resource/Router.php @@ -0,0 +1,78 @@ +getRouter(); + } + + /** + * Retrieve router object + * + * @return Zend_Controller_Router_Rewrite + */ + public function getRouter() + { + if (null === $this->_router) { + $bootstrap = $this->getBootstrap(); + $bootstrap->bootstrap('FrontController'); + $this->_router = $bootstrap->getContainer()->frontcontroller->getRouter(); + + $options = $this->getOptions(); + if (!isset($options['routes'])) { + $options['routes'] = array(); + } + + + if (isset($options['chainNameSeparator'])) { + $this->_router->setChainNameSeparator($options['chainNameSeparator']); + } + + + $this->_router->addConfig(new Zend_Config($options['routes'])); + } + return $this->_router; + } +} diff --git a/lib/zend/Zend/Application/Resource/Session.php b/lib/zend/Zend/Application/Resource/Session.php new file mode 100644 index 0000000000..89fbcdc74d --- /dev/null +++ b/lib/zend/Zend/Application/Resource/Session.php @@ -0,0 +1,112 @@ +_saveHandler = $saveHandler; + return $this; + } + + /** + * Get session save handler + * + * @return Zend_Session_SaveHandler_Interface + */ + public function getSaveHandler() + { + if (!$this->_saveHandler instanceof Zend_Session_SaveHandler_Interface) { + if (is_array($this->_saveHandler)) { + if (!array_key_exists('class', $this->_saveHandler)) { + throw new Zend_Application_Resource_Exception('Session save handler class not provided in options'); + } + $options = array(); + if (array_key_exists('options', $this->_saveHandler)) { + $options = $this->_saveHandler['options']; + } + $this->_saveHandler = $this->_saveHandler['class']; + $this->_saveHandler = new $this->_saveHandler($options); + } elseif (is_string($this->_saveHandler)) { + $this->_saveHandler = new $this->_saveHandler(); + } + + if (!$this->_saveHandler instanceof Zend_Session_SaveHandler_Interface) { + throw new Zend_Application_Resource_Exception('Invalid session save handler'); + } + } + return $this->_saveHandler; + } + + /** + * @return bool + */ + protected function _hasSaveHandler() + { + return ($this->_saveHandler !== null); + } + + /** + * Defined by Zend_Application_Resource_Resource + * + * @return void + */ + public function init() + { + $options = array_change_key_case($this->getOptions(), CASE_LOWER); + if (isset($options['savehandler'])) { + unset($options['savehandler']); + } + + if (count($options) > 0) { + Zend_Session::setOptions($options); + } + + if ($this->_hasSaveHandler()) { + Zend_Session::setSaveHandler($this->getSaveHandler()); + } + } +} diff --git a/lib/zend/Zend/Application/Resource/Translate.php b/lib/zend/Zend/Application/Resource/Translate.php new file mode 100644 index 0000000000..ec42d04bdd --- /dev/null +++ b/lib/zend/Zend/Application/Resource/Translate.php @@ -0,0 +1,83 @@ +getTranslate(); + } + + /** + * Retrieve translate object + * + * @return Zend_Translate + */ + public function getTranslate() + { + if (null === $this->_translate) { + $options = $this->getOptions(); + + if (!isset($options['data'])) { + throw new Zend_Application_Resource_Exception('No translation source data provided.'); + } + + $adapter = isset($options['adapter']) ? $options['adapter'] : Zend_Translate::AN_ARRAY; + $locale = isset($options['locale']) ? $options['locale'] : null; + $translateOptions = isset($options['options']) ? $options['options'] : array(); + + $this->_translate = new Zend_Translate( + $adapter, $options['data'], $locale, $translateOptions + ); + + $key = (isset($options['registry_key']) && !is_numeric($options['registry_key'])) + ? $options['registry_key'] + : self::DEFAULT_REGISTRY_KEY; + + Zend_Registry::set($key, $this->_translate); + } + + return $this->_translate; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Application/Resource/View.php b/lib/zend/Zend/Application/Resource/View.php new file mode 100644 index 0000000000..367ab8a485 --- /dev/null +++ b/lib/zend/Zend/Application/Resource/View.php @@ -0,0 +1,67 @@ +getView(); + + $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer(); + $viewRenderer->setView($view); + Zend_Controller_Action_HelperBroker::addHelper($viewRenderer); + return $view; + } + + /** + * Retrieve view object + * + * @return Zend_View + */ + public function getView() + { + if (null === $this->_view) { + $this->_view = new Zend_View($this->getOptions()); + } + return $this->_view; + } +} diff --git a/lib/zend/Zend/Auth/Adapter/DbTable.php b/lib/zend/Zend/Auth/Adapter/DbTable.php new file mode 100644 index 0000000000..e50bdd0e4b --- /dev/null +++ b/lib/zend/Zend/Auth/Adapter/DbTable.php @@ -0,0 +1,484 @@ +_zendDb = $zendDb; + + if (null !== $tableName) { + $this->setTableName($tableName); + } + + if (null !== $identityColumn) { + $this->setIdentityColumn($identityColumn); + } + + if (null !== $credentialColumn) { + $this->setCredentialColumn($credentialColumn); + } + + if (null !== $credentialTreatment) { + $this->setCredentialTreatment($credentialTreatment); + } + } + + /** + * setTableName() - set the table name to be used in the select query + * + * @param string $tableName + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setTableName($tableName) + { + $this->_tableName = $tableName; + return $this; + } + + /** + * setIdentityColumn() - set the column name to be used as the identity column + * + * @param string $identityColumn + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setIdentityColumn($identityColumn) + { + $this->_identityColumn = $identityColumn; + return $this; + } + + /** + * setCredentialColumn() - set the column name to be used as the credential column + * + * @param string $credentialColumn + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setCredentialColumn($credentialColumn) + { + $this->_credentialColumn = $credentialColumn; + return $this; + } + + /** + * setCredentialTreatment() - allows the developer to pass a parameterized string that is + * used to transform or treat the input credential data + * + * In many cases, passwords and other sensitive data are encrypted, hashed, encoded, + * obscured, or otherwise treated through some function or algorithm. By specifying a + * parameterized treatment string with this method, a developer may apply arbitrary SQL + * upon input credential data. + * + * Examples: + * + * 'PASSWORD(?)' + * 'MD5(?)' + * + * @param string $treatment + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setCredentialTreatment($treatment) + { + $this->_credentialTreatment = $treatment; + return $this; + } + + /** + * setIdentity() - set the value to be used as the identity + * + * @param string $value + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setIdentity($value) + { + $this->_identity = $value; + return $this; + } + + /** + * setCredential() - set the credential value to be used, optionally can specify a treatment + * to be used, should be supplied in parameterized form, such as 'MD5(?)' or 'PASSWORD(?)' + * + * @param string $credential + * @return Zend_Auth_Adapter_DbTable Provides a fluent interface + */ + public function setCredential($credential) + { + $this->_credential = $credential; + return $this; + } + + /** + * getDbSelect() - Return the preauthentication Db Select object for userland select query modification + * + * @return Zend_Db_Select + */ + public function getDbSelect() + { + if ($this->_dbSelect == null) { + $this->_dbSelect = $this->_zendDb->select(); + } + + return $this->_dbSelect; + } + + /** + * getResultRowObject() - Returns the result row as a stdClass object + * + * @param string|array $returnColumns + * @param string|array $omitColumns + * @return stdClass|boolean + */ + public function getResultRowObject($returnColumns = null, $omitColumns = null) + { + if (!$this->_resultRow) { + return false; + } + + $returnObject = new stdClass(); + + if (null !== $returnColumns) { + + $availableColumns = array_keys($this->_resultRow); + foreach ( (array) $returnColumns as $returnColumn) { + if (in_array($returnColumn, $availableColumns)) { + $returnObject->{$returnColumn} = $this->_resultRow[$returnColumn]; + } + } + return $returnObject; + + } elseif (null !== $omitColumns) { + + $omitColumns = (array) $omitColumns; + foreach ($this->_resultRow as $resultColumn => $resultValue) { + if (!in_array($resultColumn, $omitColumns)) { + $returnObject->{$resultColumn} = $resultValue; + } + } + return $returnObject; + + } else { + + foreach ($this->_resultRow as $resultColumn => $resultValue) { + $returnObject->{$resultColumn} = $resultValue; + } + return $returnObject; + + } + } + + /** + * authenticate() - defined by Zend_Auth_Adapter_Interface. This method is called to + * attempt an authenication. Previous to this call, this adapter would have already + * been configured with all nessissary information to successfully connect to a database + * table and attempt to find a record matching the provided identity. + * + * @throws Zend_Auth_Adapter_Exception if answering the authentication query is impossible + * @return Zend_Auth_Result + */ + public function authenticate() + { + $this->_authenticateSetup(); + $dbSelect = $this->_authenticateCreateSelect(); + $resultIdentities = $this->_authenticateQuerySelect($dbSelect); + + if ( ($authResult = $this->_authenticateValidateResultset($resultIdentities)) instanceof Zend_Auth_Result) { + return $authResult; + } + + $authResult = $this->_authenticateValidateResult(array_shift($resultIdentities)); + return $authResult; + } + + /** + * _authenticateSetup() - This method abstracts the steps involved with making sure + * that this adapter was indeed setup properly with all required peices of information. + * + * @throws Zend_Auth_Adapter_Exception - in the event that setup was not done properly + * @return true + */ + protected function _authenticateSetup() + { + $exception = null; + + if ($this->_tableName == '') { + $exception = 'A table must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'; + } elseif ($this->_identityColumn == '') { + $exception = 'An identity column must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'; + } elseif ($this->_credentialColumn == '') { + $exception = 'A credential column must be supplied for the Zend_Auth_Adapter_DbTable authentication adapter.'; + } elseif ($this->_identity == '') { + $exception = 'A value for the identity was not provided prior to authentication with Zend_Auth_Adapter_DbTable.'; + } elseif ($this->_credential === null) { + $exception = 'A credential value was not provided prior to authentication with Zend_Auth_Adapter_DbTable.'; + } + + if (null !== $exception) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception($exception); + } + + $this->_authenticateResultInfo = array( + 'code' => Zend_Auth_Result::FAILURE, + 'identity' => $this->_identity, + 'messages' => array() + ); + + return true; + } + + /** + * _authenticateCreateSelect() - This method creates a Zend_Db_Select object that + * is completely configured to be queried against the database. + * + * @return Zend_Db_Select + */ + protected function _authenticateCreateSelect() + { + // build credential expression + if (empty($this->_credentialTreatment) || (strpos($this->_credentialTreatment, '?') === false)) { + $this->_credentialTreatment = '?'; + } + + $credentialExpression = new Zend_Db_Expr( + '(CASE WHEN ' . + $this->_zendDb->quoteInto( + $this->_zendDb->quoteIdentifier($this->_credentialColumn, true) + . ' = ' . $this->_credentialTreatment, $this->_credential + ) + . ' THEN 1 ELSE 0 END) AS ' + . $this->_zendDb->quoteIdentifier( + $this->_zendDb->foldCase('zend_auth_credential_match') + ) + ); + + // get select + $dbSelect = clone $this->getDbSelect(); + $dbSelect->from($this->_tableName, array('*', $credentialExpression)) + ->where($this->_zendDb->quoteIdentifier($this->_identityColumn, true) . ' = ?', $this->_identity); + + return $dbSelect; + } + + /** + * _authenticateQuerySelect() - This method accepts a Zend_Db_Select object and + * performs a query against the database with that object. + * + * @param Zend_Db_Select $dbSelect + * @throws Zend_Auth_Adapter_Exception - when a invalid select object is encoutered + * @return array + */ + protected function _authenticateQuerySelect(Zend_Db_Select $dbSelect) + { + try { + if ($this->_zendDb->getFetchMode() != Zend_DB::FETCH_ASSOC) { + $origDbFetchMode = $this->_zendDb->getFetchMode(); + $this->_zendDb->setFetchMode(Zend_DB::FETCH_ASSOC); + } + $resultIdentities = $this->_zendDb->fetchAll($dbSelect->__toString()); + if (isset($origDbFetchMode)) { + $this->_zendDb->setFetchMode($origDbFetchMode); + unset($origDbFetchMode); + } + } catch (Exception $e) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('The supplied parameters to Zend_Auth_Adapter_DbTable failed to ' + . 'produce a valid sql statement, please check table and column names ' + . 'for validity.'); + } + return $resultIdentities; + } + + /** + * _authenticateValidateResultSet() - This method attempts to make certian that only one + * record was returned in the result set + * + * @param array $resultIdentities + * @return true|Zend_Auth_Result + */ + protected function _authenticateValidateResultSet(array $resultIdentities) + { + + if (count($resultIdentities) < 1) { + $this->_authenticateResultInfo['code'] = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; + $this->_authenticateResultInfo['messages'][] = 'A record with the supplied identity could not be found.'; + return $this->_authenticateCreateAuthResult(); + } elseif (count($resultIdentities) > 1) { + $this->_authenticateResultInfo['code'] = Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS; + $this->_authenticateResultInfo['messages'][] = 'More than one record matches the supplied identity.'; + return $this->_authenticateCreateAuthResult(); + } + + return true; + } + + /** + * _authenticateValidateResult() - This method attempts to validate that the record in the + * result set is indeed a record that matched the identity provided to this adapter. + * + * @param array $resultIdentity + * @return Zend_Auth_Result + */ + protected function _authenticateValidateResult($resultIdentity) + { + $zendAuthCredentialMatchColumn = $this->_zendDb->foldCase('zend_auth_credential_match'); + + if ($resultIdentity[$zendAuthCredentialMatchColumn] != '1') { + $this->_authenticateResultInfo['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; + $this->_authenticateResultInfo['messages'][] = 'Supplied credential is invalid.'; + return $this->_authenticateCreateAuthResult(); + } + + unset($resultIdentity[$zendAuthCredentialMatchColumn]); + $this->_resultRow = $resultIdentity; + + $this->_authenticateResultInfo['code'] = Zend_Auth_Result::SUCCESS; + $this->_authenticateResultInfo['messages'][] = 'Authentication successful.'; + return $this->_authenticateCreateAuthResult(); + } + + /** + * _authenticateCreateAuthResult() - This method creates a Zend_Auth_Result object + * from the information that has been collected during the authenticate() attempt. + * + * @return Zend_Auth_Result + */ + protected function _authenticateCreateAuthResult() + { + return new Zend_Auth_Result( + $this->_authenticateResultInfo['code'], + $this->_authenticateResultInfo['identity'], + $this->_authenticateResultInfo['messages'] + ); + } + +} diff --git a/lib/zend/Zend/Auth/Adapter/Digest.php b/lib/zend/Zend/Auth/Adapter/Digest.php new file mode 100644 index 0000000000..3d3859b235 --- /dev/null +++ b/lib/zend/Zend/Auth/Adapter/Digest.php @@ -0,0 +1,230 @@ +$methodName($$option); + } + } + } + + /** + * Returns the filename option value or null if it has not yet been set + * + * @return string|null + */ + public function getFilename() + { + return $this->_filename; + } + + /** + * Sets the filename option value + * + * @param mixed $filename + * @return Zend_Auth_Adapter_Digest Provides a fluent interface + */ + public function setFilename($filename) + { + $this->_filename = (string) $filename; + return $this; + } + + /** + * Returns the realm option value or null if it has not yet been set + * + * @return string|null + */ + public function getRealm() + { + return $this->_realm; + } + + /** + * Sets the realm option value + * + * @param mixed $realm + * @return Zend_Auth_Adapter_Digest Provides a fluent interface + */ + public function setRealm($realm) + { + $this->_realm = (string) $realm; + return $this; + } + + /** + * Returns the username option value or null if it has not yet been set + * + * @return string|null + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Sets the username option value + * + * @param mixed $username + * @return Zend_Auth_Adapter_Digest Provides a fluent interface + */ + public function setUsername($username) + { + $this->_username = (string) $username; + return $this; + } + + /** + * Returns the password option value or null if it has not yet been set + * + * @return string|null + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Sets the password option value + * + * @param mixed $password + * @return Zend_Auth_Adapter_Digest Provides a fluent interface + */ + public function setPassword($password) + { + $this->_password = (string) $password; + return $this; + } + + /** + * Defined by Zend_Auth_Adapter_Interface + * + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result + */ + public function authenticate() + { + $optionsRequired = array('filename', 'realm', 'username', 'password'); + foreach ($optionsRequired as $optionRequired) { + if (null === $this->{"_$optionRequired"}) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception("Option '$optionRequired' must be set before authentication"); + } + } + + if (false === ($fileHandle = @fopen($this->_filename, 'r'))) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception("Cannot open '$this->_filename' for reading"); + } + + $id = "$this->_username:$this->_realm"; + $idLength = strlen($id); + + $result = array( + 'code' => Zend_Auth_Result::FAILURE, + 'identity' => array( + 'realm' => $this->_realm, + 'username' => $this->_username, + ), + 'messages' => array() + ); + + while ($line = trim(fgets($fileHandle))) { + if (substr($line, 0, $idLength) === $id) { + if (substr($line, -32) === md5("$this->_username:$this->_realm:$this->_password")) { + $result['code'] = Zend_Auth_Result::SUCCESS; + } else { + $result['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; + $result['messages'][] = 'Password incorrect'; + } + return new Zend_Auth_Result($result['code'], $result['identity'], $result['messages']); + } + } + + $result['code'] = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; + $result['messages'][] = "Username '$this->_username' and realm '$this->_realm' combination not found"; + return new Zend_Auth_Result($result['code'], $result['identity'], $result['messages']); + } +} diff --git a/lib/zend/Zend/Auth/Adapter/Exception.php b/lib/zend/Zend/Auth/Adapter/Exception.php new file mode 100644 index 0000000000..aa002a6203 --- /dev/null +++ b/lib/zend/Zend/Auth/Adapter/Exception.php @@ -0,0 +1,38 @@ + 'basic'|'digest'|'basic digest' + * 'realm' => + * 'digest_domains' => Space-delimited list of URIs + * 'nonce_timeout' => + * 'use_opaque' => Whether to send the opaque value in the header + * 'alogrithm' => See $_supportedAlgos. Default: MD5 + * 'proxy_auth' => Whether to do authentication as a Proxy + * @throws Zend_Auth_Adapter_Exception + * @return void + */ + public function __construct(array $config) + { + if (!extension_loaded('hash')) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception(__CLASS__ . ' requires the \'hash\' extension'); + } + + $this->_request = null; + $this->_response = null; + $this->_ieNoOpaque = false; + + + if (empty($config['accept_schemes'])) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Config key \'accept_schemes\' is required'); + } + + $schemes = explode(' ', $config['accept_schemes']); + $this->_acceptSchemes = array_intersect($schemes, $this->_supportedSchemes); + if (empty($this->_acceptSchemes)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('No supported schemes given in \'accept_schemes\'. Valid values: ' + . implode(', ', $this->_supportedSchemes)); + } + + // Double-quotes are used to delimit the realm string in the HTTP header, + // and colons are field delimiters in the password file. + if (empty($config['realm']) || + !ctype_print($config['realm']) || + strpos($config['realm'], ':') !== false || + strpos($config['realm'], '"') !== false) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Config key \'realm\' is required, and must contain only printable ' + . 'characters, excluding quotation marks and colons'); + } else { + $this->_realm = $config['realm']; + } + + if (in_array('digest', $this->_acceptSchemes)) { + if (empty($config['digest_domains']) || + !ctype_print($config['digest_domains']) || + strpos($config['digest_domains'], '"') !== false) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Config key \'digest_domains\' is required, and must contain ' + . 'only printable characters, excluding quotation marks'); + } else { + $this->_domains = $config['digest_domains']; + } + + if (empty($config['nonce_timeout']) || + !is_numeric($config['nonce_timeout'])) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Config key \'nonce_timeout\' is required, and must be an ' + . 'integer'); + } else { + $this->_nonceTimeout = (int) $config['nonce_timeout']; + } + + // We use the opaque value unless explicitly told not to + if (isset($config['use_opaque']) && false == (bool) $config['use_opaque']) { + $this->_useOpaque = false; + } else { + $this->_useOpaque = true; + } + + if (isset($config['algorithm']) && in_array($config['algorithm'], $this->_supportedAlgos)) { + $this->_algo = $config['algorithm']; + } else { + $this->_algo = 'MD5'; + } + } + + // Don't be a proxy unless explicitly told to do so + if (isset($config['proxy_auth']) && true == (bool) $config['proxy_auth']) { + $this->_imaProxy = true; // I'm a Proxy + } else { + $this->_imaProxy = false; + } + } + + /** + * Setter for the _basicResolver property + * + * @param Zend_Auth_Adapter_Http_Resolver_Interface $resolver + * @return Zend_Auth_Adapter_Http Provides a fluent interface + */ + public function setBasicResolver(Zend_Auth_Adapter_Http_Resolver_Interface $resolver) + { + $this->_basicResolver = $resolver; + + return $this; + } + + /** + * Getter for the _basicResolver property + * + * @return Zend_Auth_Adapter_Http_Resolver_Interface + */ + public function getBasicResolver() + { + return $this->_basicResolver; + } + + /** + * Setter for the _digestResolver property + * + * @param Zend_Auth_Adapter_Http_Resolver_Interface $resolver + * @return Zend_Auth_Adapter_Http Provides a fluent interface + */ + public function setDigestResolver(Zend_Auth_Adapter_Http_Resolver_Interface $resolver) + { + $this->_digestResolver = $resolver; + + return $this; + } + + /** + * Getter for the _digestResolver property + * + * @return Zend_Auth_Adapter_Http_Resolver_Interface + */ + public function getDigestResolver() + { + return $this->_digestResolver; + } + + /** + * Setter for the Request object + * + * @param Zend_Controller_Request_Http $request + * @return Zend_Auth_Adapter_Http Provides a fluent interface + */ + public function setRequest(Zend_Controller_Request_Http $request) + { + $this->_request = $request; + + return $this; + } + + /** + * Getter for the Request object + * + * @return Zend_Controller_Request_Http + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Setter for the Response object + * + * @param Zend_Controller_Response_Http $response + * @return Zend_Auth_Adapter_Http Provides a fluent interface + */ + public function setResponse(Zend_Controller_Response_Http $response) + { + $this->_response = $response; + + return $this; + } + + /** + * Getter for the Response object + * + * @return Zend_Controller_Response_Http + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Authenticate + * + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result + */ + public function authenticate() + { + if (empty($this->_request) || + empty($this->_response)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Request and Response objects must be set before calling ' + . 'authenticate()'); + } + + if ($this->_imaProxy) { + $getHeader = 'Proxy-Authorization'; + } else { + $getHeader = 'Authorization'; + } + + $authHeader = $this->_request->getHeader($getHeader); + if (!$authHeader) { + return $this->_challengeClient(); + } + + list($clientScheme) = explode(' ', $authHeader); + $clientScheme = strtolower($clientScheme); + + // The server can issue multiple challenges, but the client should + // answer with only the selected auth scheme. + if (!in_array($clientScheme, $this->_supportedSchemes)) { + $this->_response->setHttpResponseCode(400); + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE_UNCATEGORIZED, + array(), + array('Client requested an incorrect or unsupported authentication scheme') + ); + } + + // client sent a scheme that is not the one required + if (!in_array($clientScheme, $this->_acceptSchemes)) { + // challenge again the client + return $this->_challengeClient(); + } + + switch ($clientScheme) { + case 'basic': + $result = $this->_basicAuth($authHeader); + break; + case 'digest': + $result = $this->_digestAuth($authHeader); + break; + default: + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Unsupported authentication scheme'); + } + + return $result; + } + + /** + * Challenge Client + * + * Sets a 401 or 407 Unauthorized response code, and creates the + * appropriate Authenticate header(s) to prompt for credentials. + * + * @return Zend_Auth_Result Always returns a non-identity Auth result + */ + protected function _challengeClient() + { + if ($this->_imaProxy) { + $statusCode = 407; + $headerName = 'Proxy-Authenticate'; + } else { + $statusCode = 401; + $headerName = 'WWW-Authenticate'; + } + + $this->_response->setHttpResponseCode($statusCode); + + // Send a challenge in each acceptable authentication scheme + if (in_array('basic', $this->_acceptSchemes)) { + $this->_response->setHeader($headerName, $this->_basicHeader()); + } + if (in_array('digest', $this->_acceptSchemes)) { + $this->_response->setHeader($headerName, $this->_digestHeader()); + } + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, + array(), + array('Invalid or absent credentials; challenging client') + ); + } + + /** + * Basic Header + * + * Generates a Proxy- or WWW-Authenticate header value in the Basic + * authentication scheme. + * + * @return string Authenticate header value + */ + protected function _basicHeader() + { + return 'Basic realm="' . $this->_realm . '"'; + } + + /** + * Digest Header + * + * Generates a Proxy- or WWW-Authenticate header value in the Digest + * authentication scheme. + * + * @return string Authenticate header value + */ + protected function _digestHeader() + { + $wwwauth = 'Digest realm="' . $this->_realm . '", ' + . 'domain="' . $this->_domains . '", ' + . 'nonce="' . $this->_calcNonce() . '", ' + . ($this->_useOpaque ? 'opaque="' . $this->_calcOpaque() . '", ' : '') + . 'algorithm="' . $this->_algo . '", ' + . 'qop="' . implode(',', $this->_supportedQops) . '"'; + + return $wwwauth; + } + + /** + * Basic Authentication + * + * @param string $header Client's Authorization header + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result + */ + protected function _basicAuth($header) + { + if (empty($header)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('The value of the client Authorization header is required'); + } + if (empty($this->_basicResolver)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('A basicResolver object must be set before doing Basic ' + . 'authentication'); + } + + // Decode the Authorization header + $auth = substr($header, strlen('Basic ')); + $auth = base64_decode($auth); + if (!$auth) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Unable to base64_decode Authorization header value'); + } + + // See ZF-1253. Validate the credentials the same way the digest + // implementation does. If invalid credentials are detected, + // re-challenge the client. + if (!ctype_print($auth)) { + return $this->_challengeClient(); + } + // Fix for ZF-1515: Now re-challenges on empty username or password + $creds = array_filter(explode(':', $auth)); + if (count($creds) != 2) { + return $this->_challengeClient(); + } + + $password = $this->_basicResolver->resolve($creds[0], $this->_realm); + if ($password && $password == $creds[1]) { + $identity = array('username'=>$creds[0], 'realm'=>$this->_realm); + return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity); + } else { + return $this->_challengeClient(); + } + } + + /** + * Digest Authentication + * + * @param string $header Client's Authorization header + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result Valid auth result only on successful auth + */ + protected function _digestAuth($header) + { + if (empty($header)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('The value of the client Authorization header is required'); + } + if (empty($this->_digestResolver)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('A digestResolver object must be set before doing Digest authentication'); + } + + $data = $this->_parseDigestAuth($header); + if ($data === false) { + $this->_response->setHttpResponseCode(400); + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE_UNCATEGORIZED, + array(), + array('Invalid Authorization header format') + ); + } + + // See ZF-1052. This code was a bit too unforgiving of invalid + // usernames. Now, if the username is bad, we re-challenge the client. + if ('::invalid::' == $data['username']) { + return $this->_challengeClient(); + } + + // Verify that the client sent back the same nonce + if ($this->_calcNonce() != $data['nonce']) { + return $this->_challengeClient(); + } + // The opaque value is also required to match, but of course IE doesn't + // play ball. + if (!$this->_ieNoOpaque && $this->_calcOpaque() != $data['opaque']) { + return $this->_challengeClient(); + } + + // Look up the user's password hash. If not found, deny access. + // This makes no assumptions about how the password hash was + // constructed beyond that it must have been built in such a way as + // to be recreatable with the current settings of this object. + $ha1 = $this->_digestResolver->resolve($data['username'], $data['realm']); + if ($ha1 === false) { + return $this->_challengeClient(); + } + + // If MD5-sess is used, a1 value is made of the user's password + // hash with the server and client nonce appended, separated by + // colons. + if ($this->_algo == 'MD5-sess') { + $ha1 = hash('md5', $ha1 . ':' . $data['nonce'] . ':' . $data['cnonce']); + } + + // Calculate h(a2). The value of this hash depends on the qop + // option selected by the client and the supported hash functions + switch ($data['qop']) { + case 'auth': + $a2 = $this->_request->getMethod() . ':' . $data['uri']; + break; + case 'auth-int': + // Should be REQUEST_METHOD . ':' . uri . ':' . hash(entity-body), + // but this isn't supported yet, so fall through to default case + default: + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Client requested an unsupported qop option'); + } + // Using hash() should make parameterizing the hash algorithm + // easier + $ha2 = hash('md5', $a2); + + + // Calculate the server's version of the request-digest. This must + // match $data['response']. See RFC 2617, section 3.2.2.1 + $message = $data['nonce'] . ':' . $data['nc'] . ':' . $data['cnonce'] . ':' . $data['qop'] . ':' . $ha2; + $digest = hash('md5', $ha1 . ':' . $message); + + // If our digest matches the client's let them in, otherwise return + // a 401 code and exit to prevent access to the protected resource. + if ($digest == $data['response']) { + $identity = array('username'=>$data['username'], 'realm'=>$data['realm']); + return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity); + } else { + return $this->_challengeClient(); + } + } + + /** + * Calculate Nonce + * + * @return string The nonce value + */ + protected function _calcNonce() + { + // Once subtle consequence of this timeout calculation is that it + // actually divides all of time into _nonceTimeout-sized sections, such + // that the value of timeout is the point in time of the next + // approaching "boundary" of a section. This allows the server to + // consistently generate the same timeout (and hence the same nonce + // value) across requests, but only as long as one of those + // "boundaries" is not crossed between requests. If that happens, the + // nonce will change on its own, and effectively log the user out. This + // would be surprising if the user just logged in. + $timeout = ceil(time() / $this->_nonceTimeout) * $this->_nonceTimeout; + + $nonce = hash('md5', $timeout . ':' . $this->_request->getServer('HTTP_USER_AGENT') . ':' . __CLASS__); + return $nonce; + } + + /** + * Calculate Opaque + * + * The opaque string can be anything; the client must return it exactly as + * it was sent. It may be useful to store data in this string in some + * applications. Ideally, a new value for this would be generated each time + * a WWW-Authenticate header is sent (in order to reduce predictability), + * but we would have to be able to create the same exact value across at + * least two separate requests from the same client. + * + * @return string The opaque value + */ + protected function _calcOpaque() + { + return hash('md5', 'Opaque Data:' . __CLASS__); + } + + /** + * Parse Digest Authorization header + * + * @param string $header Client's Authorization: HTTP header + * @return array|false Data elements from header, or false if any part of + * the header is invalid + */ + protected function _parseDigestAuth($header) + { + $temp = null; + $data = array(); + + // See ZF-1052. Detect invalid usernames instead of just returning a + // 400 code. + $ret = preg_match('/username="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1]) + || !ctype_print($temp[1]) + || strpos($temp[1], ':') !== false) { + $data['username'] = '::invalid::'; + } else { + $data['username'] = $temp[1]; + } + $temp = null; + + $ret = preg_match('/realm="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (!ctype_print($temp[1]) || strpos($temp[1], ':') !== false) { + return false; + } else { + $data['realm'] = $temp[1]; + } + $temp = null; + + $ret = preg_match('/nonce="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (!ctype_xdigit($temp[1])) { + return false; + } else { + $data['nonce'] = $temp[1]; + } + $temp = null; + + $ret = preg_match('/uri="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + // Section 3.2.2.5 in RFC 2617 says the authenticating server must + // verify that the URI field in the Authorization header is for the + // same resource requested in the Request Line. + $rUri = @parse_url($this->_request->getRequestUri()); + $cUri = @parse_url($temp[1]); + if (false === $rUri || false === $cUri) { + return false; + } else { + // Make sure the path portion of both URIs is the same + if ($rUri['path'] != $cUri['path']) { + return false; + } + // Section 3.2.2.5 seems to suggest that the value of the URI + // Authorization field should be made into an absolute URI if the + // Request URI is absolute, but it's vague, and that's a bunch of + // code I don't want to write right now. + $data['uri'] = $temp[1]; + } + $temp = null; + + $ret = preg_match('/response="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (32 != strlen($temp[1]) || !ctype_xdigit($temp[1])) { + return false; + } else { + $data['response'] = $temp[1]; + } + $temp = null; + + // The spec says this should default to MD5 if omitted. OK, so how does + // that square with the algo we send out in the WWW-Authenticate header, + // if it can easily be overridden by the client? + $ret = preg_match('/algorithm="?(' . $this->_algo . ')"?/', $header, $temp); + if ($ret && !empty($temp[1]) + && in_array($temp[1], $this->_supportedAlgos)) { + $data['algorithm'] = $temp[1]; + } else { + $data['algorithm'] = 'MD5'; // = $this->_algo; ? + } + $temp = null; + + // Not optional in this implementation + $ret = preg_match('/cnonce="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (!ctype_print($temp[1])) { + return false; + } else { + $data['cnonce'] = $temp[1]; + } + $temp = null; + + // If the server sent an opaque value, the client must send it back + if ($this->_useOpaque) { + $ret = preg_match('/opaque="([^"]+)"/', $header, $temp); + if (!$ret || empty($temp[1])) { + + // Big surprise: IE isn't RFC 2617-compliant. + if (false !== strpos($this->_request->getHeader('User-Agent'), 'MSIE')) { + $temp[1] = ''; + $this->_ieNoOpaque = true; + } else { + return false; + } + } + // This implementation only sends MD5 hex strings in the opaque value + if (!$this->_ieNoOpaque && + (32 != strlen($temp[1]) || !ctype_xdigit($temp[1]))) { + return false; + } else { + $data['opaque'] = $temp[1]; + } + $temp = null; + } + + // Not optional in this implementation, but must be one of the supported + // qop types + $ret = preg_match('/qop="?(' . implode('|', $this->_supportedQops) . ')"?/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (!in_array($temp[1], $this->_supportedQops)) { + return false; + } else { + $data['qop'] = $temp[1]; + } + $temp = null; + + // Not optional in this implementation. The spec says this value + // shouldn't be a quoted string, but apparently some implementations + // quote it anyway. See ZF-1544. + $ret = preg_match('/nc="?([0-9A-Fa-f]{8})"?/', $header, $temp); + if (!$ret || empty($temp[1])) { + return false; + } + if (8 != strlen($temp[1]) || !ctype_xdigit($temp[1])) { + return false; + } else { + $data['nc'] = $temp[1]; + } + $temp = null; + + return $data; + } +} diff --git a/lib/zend/Zend/Auth/Adapter/Http/Resolver/Exception.php b/lib/zend/Zend/Auth/Adapter/Http/Resolver/Exception.php new file mode 100644 index 0000000000..da8b5a7f7f --- /dev/null +++ b/lib/zend/Zend/Auth/Adapter/Http/Resolver/Exception.php @@ -0,0 +1,40 @@ +setFile($path); + } + } + + /** + * Set the path to the credentials file + * + * @param string $path + * @throws Zend_Auth_Adapter_Http_Resolver_Exception + * @return Zend_Auth_Adapter_Http_Resolver_File Provides a fluent interface + */ + public function setFile($path) + { + if (empty($path) || !is_readable($path)) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Path not readable: ' . $path); + } + $this->_file = $path; + + return $this; + } + + /** + * Returns the path to the credentials file + * + * @return string + */ + public function getFile() + { + return $this->_file; + } + + /** + * Resolve credentials + * + * Only the first matching username/realm combination in the file is + * returned. If the file contains credentials for Digest authentication, + * the returned string is the password hash, or h(a1) from RFC 2617. The + * returned string is the plain-text password for Basic authentication. + * + * The expected format of the file is: + * username:realm:sharedSecret + * + * That is, each line consists of the user's username, the applicable + * authentication realm, and the password or hash, each delimited by + * colons. + * + * @param string $username Username + * @param string $realm Authentication Realm + * @throws Zend_Auth_Adapter_Http_Resolver_Exception + * @return string|false User's shared secret, if the user is found in the + * realm, false otherwise. + */ + public function resolve($username, $realm) + { + if (empty($username)) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Username is required'); + } else if (!ctype_print($username) || strpos($username, ':') !== false) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Username must consist only of printable characters, ' + . 'excluding the colon'); + } + if (empty($realm)) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Realm is required'); + } else if (!ctype_print($realm) || strpos($realm, ':') !== false) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Realm must consist only of printable characters, ' + . 'excluding the colon.'); + } + + // Open file, read through looking for matching credentials + $fp = @fopen($this->_file, 'r'); + if (!$fp) { + /** + * @see Zend_Auth_Adapter_Http_Resolver_Exception + */ + require_once 'Zend/Auth/Adapter/Http/Resolver/Exception.php'; + throw new Zend_Auth_Adapter_Http_Resolver_Exception('Unable to open password file: ' . $this->_file); + } + + // No real validation is done on the contents of the password file. The + // assumption is that we trust the administrators to keep it secure. + while (($line = fgetcsv($fp, 512, ':')) !== false) { + if ($line[0] == $username && $line[1] == $realm) { + $password = $line[2]; + fclose($fp); + return $password; + } + } + + fclose($fp); + return false; + } +} diff --git a/lib/zend/Zend/Auth/Adapter/Http/Resolver/Interface.php b/lib/zend/Zend/Auth/Adapter/Http/Resolver/Interface.php new file mode 100644 index 0000000000..fa573ddb82 --- /dev/null +++ b/lib/zend/Zend/Auth/Adapter/Http/Resolver/Interface.php @@ -0,0 +1,47 @@ +_xmlToken = $strXmlDocument; + $this->_infoCard = new Zend_InfoCard(); + } + + /** + * Sets the InfoCard component Adapter to use + * + * @param Zend_InfoCard_Adapter_Interface $a + * @return Zend_Auth_Adapter_InfoCard Provides a fluent interface + */ + public function setAdapter(Zend_InfoCard_Adapter_Interface $a) + { + $this->_infoCard->setAdapter($a); + return $this; + } + + /** + * Retrieves the InfoCard component adapter being used + * + * @return Zend_InfoCard_Adapter_Interface + */ + public function getAdapter() + { + return $this->_infoCard->getAdapter(); + } + + /** + * Retrieves the InfoCard public key cipher object being used + * + * @return Zend_InfoCard_Cipher_PKI_Interface + */ + public function getPKCipherObject() + { + return $this->_infoCard->getPKCipherObject(); + } + + /** + * Sets the InfoCard public key cipher object to use + * + * @param Zend_InfoCard_Cipher_PKI_Interface $cipherObj + * @return Zend_Auth_Adapter_InfoCard Provides a fluent interface + */ + public function setPKICipherObject(Zend_InfoCard_Cipher_PKI_Interface $cipherObj) + { + $this->_infoCard->setPKICipherObject($cipherObj); + return $this; + } + + /** + * Retrieves the Symmetric cipher object being used + * + * @return Zend_InfoCard_Cipher_Symmetric_Interface + */ + public function getSymCipherObject() + { + return $this->_infoCard->getSymCipherObject(); + } + + /** + * Sets the InfoCard symmetric cipher object to use + * + * @param Zend_InfoCard_Cipher_Symmetric_Interface $cipherObj + * @return Zend_Auth_Adapter_InfoCard Provides a fluent interface + */ + public function setSymCipherObject(Zend_InfoCard_Cipher_Symmetric_Interface $cipherObj) + { + $this->_infoCard->setSymCipherObject($cipherObj); + return $this; + } + + /** + * Remove a Certificate Pair by Key ID from the search list + * + * @param string $key_id The Certificate Key ID returned from adding the certificate pair + * @throws Zend_InfoCard_Exception + * @return Zend_Auth_Adapter_InfoCard Provides a fluent interface + */ + public function removeCertificatePair($key_id) + { + $this->_infoCard->removeCertificatePair($key_id); + return $this; + } + + /** + * Add a Certificate Pair to the list of certificates searched by the component + * + * @param string $private_key_file The path to the private key file for the pair + * @param string $public_key_file The path to the certificate / public key for the pair + * @param string $type (optional) The URI for the type of key pair this is (default RSA with OAEP padding) + * @param string $password (optional) The password for the private key file if necessary + * @throws Zend_InfoCard_Exception + * @return string A key ID representing this key pair in the component + */ + public function addCertificatePair($private_key_file, $public_key_file, $type = Zend_InfoCard_Cipher::ENC_RSA_OAEP_MGF1P, $password = null) + { + return $this->_infoCard->addCertificatePair($private_key_file, $public_key_file, $type, $password); + } + + /** + * Return a Certificate Pair from a key ID + * + * @param string $key_id The Key ID of the certificate pair in the component + * @throws Zend_InfoCard_Exception + * @return array An array containing the path to the private/public key files, + * the type URI and the password if provided + */ + public function getCertificatePair($key_id) + { + return $this->_infoCard->getCertificatePair($key_id); + } + + /** + * Set the XML Token to be processed + * + * @param string $strXmlToken The XML token to process + * @return Zend_Auth_Adapter_InfoCard Provides a fluent interface + */ + public function setXmlToken($strXmlToken) + { + $this->_xmlToken = $strXmlToken; + return $this; + } + + /** + * Get the XML Token being processed + * + * @return string The XML token to be processed + */ + public function getXmlToken() + { + return $this->_xmlToken; + } + + /** + * Authenticates the XML token + * + * @return Zend_Auth_Result The result of the authentication + */ + public function authenticate() + { + try { + $claims = $this->_infoCard->process($this->getXmlToken()); + } catch(Exception $e) { + return new Zend_Auth_Result(Zend_Auth_Result::FAILURE , null, array('Exception Thrown', + $e->getMessage(), + $e->getTraceAsString(), + serialize($e))); + } + + if(!$claims->isValid()) { + switch($claims->getCode()) { + case Zend_infoCard_Claims::RESULT_PROCESSING_FAILURE: + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE, + $claims, + array( + 'Processing Failure', + $claims->getErrorMsg() + ) + ); + break; + case Zend_InfoCard_Claims::RESULT_VALIDATION_FAILURE: + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, + $claims, + array( + 'Validation Failure', + $claims->getErrorMsg() + ) + ); + break; + default: + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE, + $claims, + array( + 'Unknown Failure', + $claims->getErrorMsg() + ) + ); + break; + } + } + + return new Zend_Auth_Result( + Zend_Auth_Result::SUCCESS, + $claims + ); + } +} diff --git a/lib/zend/Zend/Auth/Adapter/Interface.php b/lib/zend/Zend/Auth/Adapter/Interface.php new file mode 100644 index 0000000000..db7c42e660 --- /dev/null +++ b/lib/zend/Zend/Auth/Adapter/Interface.php @@ -0,0 +1,46 @@ +setOptions($options); + if ($username !== null) { + $this->setUsername($username); + } + if ($password !== null) { + $this->setPassword($password); + } + } + + /** + * Returns the array of arrays of Zend_Ldap options of this adapter. + * + * @return array|null + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Sets the array of arrays of Zend_Ldap options to be used by + * this adapter. + * + * @param array $options The array of arrays of Zend_Ldap options + * @return Zend_Auth_Adapter_Ldap Provides a fluent interface + */ + public function setOptions($options) + { + $this->_options = is_array($options) ? $options : array(); + return $this; + } + + /** + * Returns the username of the account being authenticated, or + * NULL if none is set. + * + * @return string|null + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Sets the username for binding + * + * @param string $username The username for binding + * @return Zend_Auth_Adapter_Ldap Provides a fluent interface + */ + public function setUsername($username) + { + $this->_username = (string) $username; + return $this; + } + + /** + * Returns the password of the account being authenticated, or + * NULL if none is set. + * + * @return string|null + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Sets the passwort for the account + * + * @param string $password The password of the account being authenticated + * @return Zend_Auth_Adapter_Ldap Provides a fluent interface + */ + public function setPassword($password) + { + $this->_password = (string) $password; + return $this; + } + + /** + * setIdentity() - set the identity (username) to be used + * + * Proxies to {@see setPassword()} + * + * Closes ZF-6813 + * + * @param string $identity + * @return Zend_Auth_Adapter_Ldap Provides a fluent interface + */ + public function setIdentity($identity) + { + return $this->setUsername($identity); + } + + /** + * setCredential() - set the credential (password) value to be used + * + * Proxies to {@see setPassword()} + * + * Closes ZF-6813 + * + * @param string $credential + * @return Zend_Auth_Adapter_Ldap Provides a fluent interface + */ + public function setCredential($credential) + { + return $this->setPassword($credential); + } + + /** + * Returns the LDAP Object + * + * @return Zend_Ldap The Zend_Ldap object used to authenticate the credentials + */ + public function getLdap() + { + if ($this->_ldap === null) { + /** + * @see Zend_Ldap + */ + require_once 'Zend/Ldap.php'; + $this->_ldap = new Zend_Ldap(); + } + + return $this->_ldap; + } + + /** + * Set an Ldap connection + * + * @param Zend_Ldap $ldap An existing Ldap object + * @return Zend_Auth_Adapter_Ldap Provides a fluent interface + */ + public function setLdap(Zend_Ldap $ldap) + { + $this->_ldap = $ldap; + + $this->setOptions(array($ldap->getOptions())); + + return $this; + } + + /** + * Returns a domain name for the current LDAP options. This is used + * for skipping redundant operations (e.g. authentications). + * + * @return string + */ + protected function _getAuthorityName() + { + $options = $this->getLdap()->getOptions(); + $name = $options['accountDomainName']; + if (!$name) + $name = $options['accountDomainNameShort']; + return $name ? $name : ''; + } + + /** + * Authenticate the user + * + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result + */ + public function authenticate() + { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + + $messages = array(); + $messages[0] = ''; // reserved + $messages[1] = ''; // reserved + + $username = $this->_username; + $password = $this->_password; + + if (!$username) { + $code = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; + $messages[0] = 'A username is required'; + return new Zend_Auth_Result($code, '', $messages); + } + if (!$password) { + /* A password is required because some servers will + * treat an empty password as an anonymous bind. + */ + $code = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; + $messages[0] = 'A password is required'; + return new Zend_Auth_Result($code, '', $messages); + } + + $ldap = $this->getLdap(); + + $code = Zend_Auth_Result::FAILURE; + $messages[0] = "Authority not found: $username"; + $failedAuthorities = array(); + + /* Iterate through each server and try to authenticate the supplied + * credentials against it. + */ + foreach ($this->_options as $name => $options) { + + if (!is_array($options)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Adapter options array not in array'); + } + $adapterOptions = $this->_prepareOptions($ldap, $options); + $dname = ''; + + try { + if ($messages[1]) + $messages[] = $messages[1]; + $messages[1] = ''; + $messages[] = $this->_optionsToString($options); + + $dname = $this->_getAuthorityName(); + if (isset($failedAuthorities[$dname])) { + /* If multiple sets of server options for the same domain + * are supplied, we want to skip redundant authentications + * where the identity or credentials where found to be + * invalid with another server for the same domain. The + * $failedAuthorities array tracks this condition (and also + * serves to supply the original error message). + * This fixes issue ZF-4093. + */ + $messages[1] = $failedAuthorities[$dname]; + $messages[] = "Skipping previously failed authority: $dname"; + continue; + } + + $canonicalName = $ldap->getCanonicalAccountName($username); + $ldap->bind($canonicalName, $password); + $dn = $ldap->getCanonicalAccountName($canonicalName, Zend_Ldap::ACCTNAME_FORM_DN); + + $groupResult = $this->_checkGroupMembership($ldap, $canonicalName, $dn, $adapterOptions); + if ($groupResult === true) { + $this->_authenticatedDn = $dn; + $messages[0] = ''; + $messages[1] = ''; + $messages[] = "$canonicalName authentication successful"; + return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $canonicalName, $messages); + } else { + $messages[0] = 'Account is not a member of the specified group'; + $messages[1] = $groupResult; + $failedAuthorities[$dname] = $groupResult; + } + } catch (Zend_Ldap_Exception $zle) { + + /* LDAP based authentication is notoriously difficult to diagnose. Therefore + * we bend over backwards to capture and record every possible bit of + * information when something goes wrong. + */ + + $err = $zle->getCode(); + + if ($err == Zend_Ldap_Exception::LDAP_X_DOMAIN_MISMATCH) { + /* This error indicates that the domain supplied in the + * username did not match the domains in the server options + * and therefore we should just skip to the next set of + * server options. + */ + continue; + } else if ($err == Zend_Ldap_Exception::LDAP_NO_SUCH_OBJECT) { + $code = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; + $messages[0] = "Account not found: $username"; + $failedAuthorities[$dname] = $zle->getMessage(); + } else if ($err == Zend_Ldap_Exception::LDAP_INVALID_CREDENTIALS) { + $code = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; + $messages[0] = 'Invalid credentials'; + $failedAuthorities[$dname] = $zle->getMessage(); + } else { + $line = $zle->getLine(); + $messages[] = $zle->getFile() . "($line): " . $zle->getMessage(); + $messages[] = str_replace($password, '*****', $zle->getTraceAsString()); + $messages[0] = 'An unexpected failure occurred'; + } + $messages[1] = $zle->getMessage(); + } + } + + $msg = isset($messages[1]) ? $messages[1] : $messages[0]; + $messages[] = "$username authentication failed: $msg"; + + return new Zend_Auth_Result($code, $username, $messages); + } + + /** + * Sets the LDAP specific options on the Zend_Ldap instance + * + * @param Zend_Ldap $ldap + * @param array $options + * @return array of auth-adapter specific options + */ + protected function _prepareOptions(Zend_Ldap $ldap, array $options) + { + $adapterOptions = array( + 'group' => null, + 'groupDn' => $ldap->getBaseDn(), + 'groupScope' => Zend_Ldap::SEARCH_SCOPE_SUB, + 'groupAttr' => 'cn', + 'groupFilter' => 'objectClass=groupOfUniqueNames', + 'memberAttr' => 'uniqueMember', + 'memberIsDn' => true + ); + foreach ($adapterOptions as $key => $value) { + if (array_key_exists($key, $options)) { + $value = $options[$key]; + unset($options[$key]); + switch ($key) { + case 'groupScope': + $value = (int)$value; + if (in_array($value, array(Zend_Ldap::SEARCH_SCOPE_BASE, + Zend_Ldap::SEARCH_SCOPE_ONE, Zend_Ldap::SEARCH_SCOPE_SUB), true)) { + $adapterOptions[$key] = $value; + } + break; + case 'memberIsDn': + $adapterOptions[$key] = ($value === true || + $value === '1' || strcasecmp($value, 'true') == 0); + break; + default: + $adapterOptions[$key] = trim($value); + break; + } + } + } + + $ldap->setOptions($options); + return $adapterOptions; + } + + /** + * Checks the group membership of the bound user + * + * @param Zend_Ldap $ldap + * @param string $canonicalName + * @param string $dn + * @param array $adapterOptions + * @return string|true + */ + protected function _checkGroupMembership(Zend_Ldap $ldap, $canonicalName, $dn, array $adapterOptions) + { + if ($adapterOptions['group'] === null) { + return true; + } + + if ($adapterOptions['memberIsDn'] === false) { + $user = $canonicalName; + } else { + $user = $dn; + } + + /** + * @see Zend_Ldap_Filter + */ + require_once 'Zend/Ldap/Filter.php'; + $groupName = Zend_Ldap_Filter::equals($adapterOptions['groupAttr'], $adapterOptions['group']); + $membership = Zend_Ldap_Filter::equals($adapterOptions['memberAttr'], $user); + $group = Zend_Ldap_Filter::andFilter($groupName, $membership); + $groupFilter = $adapterOptions['groupFilter']; + if (!empty($groupFilter)) { + $group = $group->addAnd($groupFilter); + } + + /* + * Fixes problem when authenticated user is not allowed to retrieve + * group-membership information. + * This requires that the user specified with "username" and "password" + * in the Zend_Ldap options is able to retrieve the required information. + */ + $ldap->bind(); + + $result = $ldap->count($group, $adapterOptions['groupDn'], $adapterOptions['groupScope']); + + if ($result === 1) { + return true; + } else { + return 'Failed to verify group membership with ' . $group->toString(); + } + } + + /** + * getAccountObject() - Returns the result entry as a stdClass object + * + * This ressembles the feature {@see Zend_Auth_Adapter_DbTable::getResultRowObject()}. + * Closes ZF-6813 + * + * @param array $returnAttribs + * @return stdClass|boolean + */ + public function getAccountObject(array $returnAttribs = array()) + { + if (!$this->_authenticatedDn) { + return false; + } + + $returnObject = new stdClass(); + + $entry = $this->getLdap()->getEntry($this->_authenticatedDn, $returnAttribs, true); + foreach ($entry as $attr => $value) { + if (is_array($value)) { + $returnObject->$attr = (count($value) > 1) ? $value : $value[0]; + } else { + $returnObject->$attr = $value; + } + } + return $returnObject; + } + + /** + * Converts options to string + * + * @param array $options + * @return string + */ + private function _optionsToString(array $options) + { + $str = ''; + foreach ($options as $key => $val) { + if ($key === 'password') + $val = '*****'; + if ($str) + $str .= ','; + $str .= $key . '=' . $val; + } + return $str; + } +} diff --git a/lib/zend/Zend/Auth/Adapter/OpenId.php b/lib/zend/Zend/Auth/Adapter/OpenId.php new file mode 100644 index 0000000000..6c99758625 --- /dev/null +++ b/lib/zend/Zend/Auth/Adapter/OpenId.php @@ -0,0 +1,284 @@ +_id = $id; + $this->_storage = $storage; + $this->_returnTo = $returnTo; + $this->_root = $root; + $this->_extensions = $extensions; + $this->_response = $response; + } + + /** + * Sets the value to be used as the identity + * + * @param string $id the identity value + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setIdentity($id) + { + $this->_id = $id; + return $this; + } + + /** + * Sets the storage implementation which will be use by OpenId + * + * @param Zend_OpenId_Consumer_Storage $storage + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setStorage(Zend_OpenId_Consumer_Storage $storage) + { + $this->_storage = $storage; + return $this; + } + + /** + * Sets the HTTP URL to redirect response from server to + * + * @param string $returnTo + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setReturnTo($returnTo) + { + $this->_returnTo = $returnTo; + return $this; + } + + /** + * Sets HTTP URL to identify consumer on server + * + * @param string $root + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setRoot($root) + { + $this->_root = $root; + return $this; + } + + /** + * Sets OpenID extension(s) + * + * @param mixed $extensions + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setExtensions($extensions) + { + $this->_extensions = $extensions; + return $this; + } + + /** + * Sets an optional response object to perform HTTP or HTML form redirection + * + * @param string $root + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setResponse($response) + { + $this->_response = $response; + return $this; + } + + /** + * Enables or disables interaction with user during authentication on + * OpenID provider. + * + * @param bool $check_immediate + * @return Zend_Auth_Adapter_OpenId Provides a fluent interface + */ + public function setCheckImmediate($check_immediate) + { + $this->_check_immediate = $check_immediate; + return $this; + } + + /** + * Sets HTTP client object to make HTTP requests + * + * @param Zend_Http_Client $client HTTP client object to be used + */ + public function setHttpClient($client) { + $this->_httpClient = $client; + } + + /** + * Authenticates the given OpenId identity. + * Defined by Zend_Auth_Adapter_Interface. + * + * @throws Zend_Auth_Adapter_Exception If answering the authentication query is impossible + * @return Zend_Auth_Result + */ + public function authenticate() { + $id = $this->_id; + if (!empty($id)) { + $consumer = new Zend_OpenId_Consumer($this->_storage); + $consumer->setHttpClient($this->_httpClient); + /* login() is never returns on success */ + if (!$this->_check_immediate) { + if (!$consumer->login($id, + $this->_returnTo, + $this->_root, + $this->_extensions, + $this->_response)) { + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE, + $id, + array("Authentication failed", $consumer->getError())); + } + } else { + if (!$consumer->check($id, + $this->_returnTo, + $this->_root, + $this->_extensions, + $this->_response)) { + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE, + $id, + array("Authentication failed", $consumer->getError())); + } + } + } else { + $params = (isset($_SERVER['REQUEST_METHOD']) && + $_SERVER['REQUEST_METHOD']=='POST') ? $_POST: $_GET; + $consumer = new Zend_OpenId_Consumer($this->_storage); + $consumer->setHttpClient($this->_httpClient); + if ($consumer->verify( + $params, + $id, + $this->_extensions)) { + return new Zend_Auth_Result( + Zend_Auth_Result::SUCCESS, + $id, + array("Authentication successful")); + } else { + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE, + $id, + array("Authentication failed", $consumer->getError())); + } + } + } + +} diff --git a/lib/zend/Zend/Auth/Exception.php b/lib/zend/Zend/Auth/Exception.php new file mode 100644 index 0000000000..c705df2b40 --- /dev/null +++ b/lib/zend/Zend/Auth/Exception.php @@ -0,0 +1,36 @@ + self::SUCCESS ) { + $code = 1; + } + + $this->_code = $code; + $this->_identity = $identity; + $this->_messages = $messages; + } + + /** + * Returns whether the result represents a successful authentication attempt + * + * @return boolean + */ + public function isValid() + { + return ($this->_code > 0) ? true : false; + } + + /** + * getCode() - Get the result code for this authentication attempt + * + * @return int + */ + public function getCode() + { + return $this->_code; + } + + /** + * Returns the identity used in the authentication attempt + * + * @return mixed + */ + public function getIdentity() + { + return $this->_identity; + } + + /** + * Returns an array of string reasons why the authentication attempt was unsuccessful + * + * If authentication was successful, this method returns an empty array. + * + * @return array + */ + public function getMessages() + { + return $this->_messages; + } +} diff --git a/lib/zend/Zend/Auth/Storage/Exception.php b/lib/zend/Zend/Auth/Storage/Exception.php new file mode 100644 index 0000000000..68a506468b --- /dev/null +++ b/lib/zend/Zend/Auth/Storage/Exception.php @@ -0,0 +1,38 @@ +_data); + } + + /** + * Returns the contents of storage + * Behavior is undefined when storage is empty. + * + * @throws Zend_Auth_Storage_Exception If reading contents from storage is impossible + * @return mixed + */ + public function read() + { + return $this->_data; + } + + /** + * Writes $contents to storage + * + * @param mixed $contents + * @throws Zend_Auth_Storage_Exception If writing $contents to storage is impossible + * @return void + */ + public function write($contents) + { + $this->_data = $contents; + } + + /** + * Clears contents from storage + * + * @throws Zend_Auth_Storage_Exception If clearing contents from storage is impossible + * @return void + */ + public function clear() + { + $this->_data = null; + } +} diff --git a/lib/zend/Zend/Auth/Storage/Session.php b/lib/zend/Zend/Auth/Storage/Session.php new file mode 100644 index 0000000000..713fd48618 --- /dev/null +++ b/lib/zend/Zend/Auth/Storage/Session.php @@ -0,0 +1,150 @@ +_namespace = $namespace; + $this->_member = $member; + $this->_session = new Zend_Session_Namespace($this->_namespace); + } + + /** + * Returns the session namespace + * + * @return string + */ + public function getNamespace() + { + return $this->_namespace; + } + + /** + * Returns the name of the session object member + * + * @return string + */ + public function getMember() + { + return $this->_member; + } + + /** + * Defined by Zend_Auth_Storage_Interface + * + * @return boolean + */ + public function isEmpty() + { + return !isset($this->_session->{$this->_member}); + } + + /** + * Defined by Zend_Auth_Storage_Interface + * + * @return mixed + */ + public function read() + { + return $this->_session->{$this->_member}; + } + + /** + * Defined by Zend_Auth_Storage_Interface + * + * @param mixed $contents + * @return void + */ + public function write($contents) + { + $this->_session->{$this->_member} = $contents; + } + + /** + * Defined by Zend_Auth_Storage_Interface + * + * @return void + */ + public function clear() + { + unset($this->_session->{$this->_member}); + } +} diff --git a/lib/zend/Zend/Cache/Backend.php b/lib/zend/Zend/Cache/Backend.php new file mode 100644 index 0000000000..cf74e2585b --- /dev/null +++ b/lib/zend/Zend/Cache/Backend.php @@ -0,0 +1,272 @@ + (int) lifetime : + * - Cache lifetime (in seconds) + * - If null, the cache is valid forever + * + * =====> (int) logging : + * - if set to true, a logging is activated throw Zend_Log + * + * @var array directives + */ + protected $_directives = array( + 'lifetime' => 3600, + 'logging' => false, + 'logger' => null + ); + + /** + * Available options + * + * @var array available options + */ + protected $_options = array(); + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + } + + /** + * Set the frontend directives + * + * @param array $directives Assoc of directives + * @throws Zend_Cache_Exception + * @return void + */ + public function setDirectives($directives) + { + if (!is_array($directives)) Zend_Cache::throwException('Directives parameter must be an array'); + while (list($name, $value) = each($directives)) { + if (!is_string($name)) { + Zend_Cache::throwException("Incorrect option name : $name"); + } + $name = strtolower($name); + if (array_key_exists($name, $this->_directives)) { + $this->_directives[$name] = $value; + } + + } + + $this->_loggerSanity(); + } + + /** + * Set an option + * + * @param string $name + * @param mixed $value + * @throws Zend_Cache_Exception + * @return void + */ + public function setOption($name, $value) + { + if (!is_string($name)) { + Zend_Cache::throwException("Incorrect option name : $name"); + } + $name = strtolower($name); + if (array_key_exists($name, $this->_options)) { + $this->_options[$name] = $value; + } + } + + /** + * Get the life time + * + * if $specificLifetime is not false, the given specific life time is used + * else, the global lifetime is used + * + * @param int $specificLifetime + * @return int Cache life time + */ + public function getLifetime($specificLifetime) + { + if ($specificLifetime === false) { + return $this->_directives['lifetime']; + } + return $specificLifetime; + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * DEPRECATED : use getCapabilities() instead + * + * @deprecated + * @return boolean + */ + public function isAutomaticCleaningAvailable() + { + return true; + } + + /** + * Determine system TMP directory and detect if we have read access + * + * inspired from Zend_File_Transfer_Adapter_Abstract + * + * @return string + * @throws Zend_Cache_Exception if unable to determine directory + */ + public function getTmpDir() + { + $tmpdir = array(); + foreach (array($_ENV, $_SERVER) as $tab) { + foreach (array('TMPDIR', 'TEMP', 'TMP', 'windir', 'SystemRoot') as $key) { + if (isset($tab[$key])) { + if (($key == 'windir') or ($key == 'SystemRoot')) { + $dir = realpath($tab[$key] . '\\temp'); + } else { + $dir = realpath($tab[$key]); + } + if ($this->_isGoodTmpDir($dir)) { + return $dir; + } + } + } + } + $upload = ini_get('upload_tmp_dir'); + if ($upload) { + $dir = realpath($upload); + if ($this->_isGoodTmpDir($dir)) { + return $dir; + } + } + if (function_exists('sys_get_temp_dir')) { + $dir = sys_get_temp_dir(); + if ($this->_isGoodTmpDir($dir)) { + return $dir; + } + } + // Attemp to detect by creating a temporary file + $tempFile = tempnam(md5(uniqid(rand(), TRUE)), ''); + if ($tempFile) { + $dir = realpath(dirname($tempFile)); + unlink($tempFile); + if ($this->_isGoodTmpDir($dir)) { + return $dir; + } + } + if ($this->_isGoodTmpDir('/tmp')) { + return '/tmp'; + } + if ($this->_isGoodTmpDir('\\temp')) { + return '\\temp'; + } + Zend_Cache::throwException('Could not determine temp directory, please specify a cache_dir manually'); + } + + /** + * Verify if the given temporary directory is readable and writable + * + * @param $dir temporary directory + * @return boolean true if the directory is ok + */ + protected function _isGoodTmpDir($dir) + { + if (is_readable($dir)) { + if (is_writable($dir)) { + return true; + } + } + return false; + } + + /** + * Make sure if we enable logging that the Zend_Log class + * is available. + * Create a default log object if none is set. + * + * @throws Zend_Cache_Exception + * @return void + */ + protected function _loggerSanity() + { + if (!isset($this->_directives['logging']) || !$this->_directives['logging']) { + return; + } + try { + /** + * @see Zend_Log + */ + require_once 'Zend/Log.php'; + } catch (Zend_Exception $e) { + Zend_Cache::throwException('Logging feature is enabled but the Zend_Log class is not available'); + } + if (isset($this->_directives['logger'])) { + if ($this->_directives['logger'] instanceof Zend_Log) { + return; + } else { + Zend_Cache::throwException('Logger object is not an instance of Zend_Log class.'); + } + } + // Create a default logger to the standard output stream + require_once 'Zend/Log/Writer/Stream.php'; + $logger = new Zend_Log(new Zend_Log_Writer_Stream('php://output')); + $this->_directives['logger'] = $logger; + } + + /** + * Log a message at the WARN (4) priority. + * + * @param string $message + * @throws Zend_Cache_Exception + * @return void + */ + protected function _log($message, $priority = 4) + { + if (!$this->_directives['logging']) { + return; + } + + if (!isset($this->_directives['logger'])) { + Zend_Cache::throwException('Logging is enabled but logger is not set.'); + } + $logger = $this->_directives['logger']; + if (!$logger instanceof Zend_Log) { + Zend_Cache::throwException('Logger object is not an instance of Zend_Log class.'); + } + $logger->log($message, $priority); + } +} diff --git a/lib/zend/Zend/Cache/Backend/Apc.php b/lib/zend/Zend/Cache/Backend/Apc.php new file mode 100644 index 0000000000..01a86bd903 --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/Apc.php @@ -0,0 +1,355 @@ + infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $lifetime = $this->getLifetime($specificLifetime); + $result = apc_store($id, array($data, time(), $lifetime), $lifetime); + if (count($tags) > 0) { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); + } + return $result; + } + + /** + * Remove a cache record + * + * @param string $id cache id + * @return boolean true if no problem + */ + public function remove($id) + { + return apc_delete($id); + } + + /** + * Clean some cache records + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => unsupported + * 'matchingTag' => unsupported + * 'notMatchingTag' => unsupported + * 'matchingAnyTag' => unsupported + * + * @param string $mode clean mode + * @param array $tags array of tags + * @throws Zend_Cache_Exception + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + return apc_clear_cache('user'); + break; + case Zend_Cache::CLEANING_MODE_OLD: + $this->_log("Zend_Cache_Backend_Apc::clean() : CLEANING_MODE_OLD is unsupported by the Apc backend"); + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_APC_BACKEND); + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * DEPRECATED : use getCapabilities() instead + * + * @deprecated + * @return boolean + */ + public function isAutomaticCleaningAvailable() + { + return false; + } + + /** + * Return the filling percentage of the backend storage + * + * @throws Zend_Cache_Exception + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + $mem = apc_sma_info(true); + $memSize = $mem['num_seg'] * $mem['seg_size']; + $memAvailable= $mem['avail_mem']; + $memUsed = $memSize - $memAvailable; + if ($memSize == 0) { + Zend_Cache::throwException('can\'t get apc memory size'); + } + if ($memUsed > $memSize) { + return 100; + } + return ((int) (100. * ($memUsed / $memSize))); + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); + return array(); + } + + /** + * Return an array of stored cache ids which match given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); + return array(); + } + + /** + * Return an array of stored cache ids which don't match given tags + * + * In case of multiple tags, a logical OR is made between tags + * + * @param array $tags array of tags + * @return array array of not matching cache ids (string) + */ + public function getIdsNotMatchingTags($tags = array()) + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); + return array(); + } + + /** + * Return an array of stored cache ids which match any given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of any matching cache ids (string) + */ + public function getIdsMatchingAnyTags($tags = array()) + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); + return array(); + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + $res = array(); + $array = apc_cache_info('user', false); + $records = $array['cache_list']; + foreach ($records as $record) { + $res[] = $record['info']; + } + return $res; + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - expire : the expire timestamp + * - tags : a string array of tags + * - mtime : timestamp of last modification time + * + * @param string $id cache id + * @return array array of metadatas (false if the cache id is not found) + */ + public function getMetadatas($id) + { + $tmp = apc_fetch($id); + if (is_array($tmp)) { + $data = $tmp[0]; + $mtime = $tmp[1]; + if (!isset($tmp[2])) { + // because this record is only with 1.7 release + // if old cache records are still there... + return false; + } + $lifetime = $tmp[2]; + return array( + 'expire' => $mtime + $lifetime, + 'tags' => array(), + 'mtime' => $mtime + ); + } + return false; + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + $tmp = apc_fetch($id); + if (is_array($tmp)) { + $data = $tmp[0]; + $mtime = $tmp[1]; + if (!isset($tmp[2])) { + // because this record is only with 1.7 release + // if old cache records are still there... + return false; + } + $lifetime = $tmp[2]; + $newLifetime = $lifetime - (time() - $mtime) + $extraLifetime; + if ($newLifetime <=0) { + return false; + } + apc_store($id, array($data, time(), $newLifetime), $newLifetime); + return true; + } + return false; + } + + /** + * Return an associative array of capabilities (booleans) of the backend + * + * The array must include these keys : + * - automatic_cleaning (is automating cleaning necessary) + * - tags (are tags supported) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - priority does the backend deal with priority when saving + * - infinite_lifetime (is infinite lifetime can work with this backend) + * - get_list (is it possible to get the list of cache ids and the complete list of tags) + * + * @return array associative of with capabilities + */ + public function getCapabilities() + { + return array( + 'automatic_cleaning' => false, + 'tags' => false, + 'expired_read' => false, + 'priority' => false, + 'infinite_lifetime' => false, + 'get_list' => true + ); + } + +} diff --git a/lib/zend/Zend/Cache/Backend/ExtendedInterface.php b/lib/zend/Zend/Cache/Backend/ExtendedInterface.php new file mode 100644 index 0000000000..cae8f504fa --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/ExtendedInterface.php @@ -0,0 +1,126 @@ + (string) cache_dir : + * - Directory where to put the cache files + * + * =====> (boolean) file_locking : + * - Enable / disable file_locking + * - Can avoid cache corruption under bad circumstances but it doesn't work on multithread + * webservers and on NFS filesystems for example + * + * =====> (boolean) read_control : + * - Enable / disable read control + * - If enabled, a control key is embeded in cache file and this key is compared with the one + * calculated after the reading. + * + * =====> (string) read_control_type : + * - Type of read control (only if read control is enabled). Available values are : + * 'md5' for a md5 hash control (best but slowest) + * 'crc32' for a crc32 hash control (lightly less safe but faster, better choice) + * 'adler32' for an adler32 hash control (excellent choice too, faster than crc32) + * 'strlen' for a length only test (fastest) + * + * =====> (int) hashed_directory_level : + * - Hashed directory level + * - Set the hashed directory structure level. 0 means "no hashed directory + * structure", 1 means "one level of directory", 2 means "two levels"... + * This option can speed up the cache only when you have many thousands of + * cache file. Only specific benchs can help you to choose the perfect value + * for you. Maybe, 1 or 2 is a good start. + * + * =====> (int) hashed_directory_umask : + * - Umask for hashed directory structure + * + * =====> (string) file_name_prefix : + * - prefix for cache files + * - be really carefull with this option because a too generic value in a system cache dir + * (like /tmp) can cause disasters when cleaning the cache + * + * =====> (int) cache_file_umask : + * - Umask for cache files + * + * =====> (int) metatadatas_array_max_size : + * - max size for the metadatas array (don't change this value unless you + * know what you are doing) + * + * @var array available options + */ + protected $_options = array( + 'cache_dir' => null, + 'file_locking' => true, + 'read_control' => true, + 'read_control_type' => 'crc32', + 'hashed_directory_level' => 0, + 'hashed_directory_umask' => 0700, + 'file_name_prefix' => 'zend_cache', + 'cache_file_umask' => 0600, + 'metadatas_array_max_size' => 100 + ); + + /** + * Array of metadatas (each item is an associative array) + * + * @var array + */ + protected $_metadatasArray = array(); + + + /** + * Constructor + * + * @param array $options associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + parent::__construct($options); + if ($this->_options['cache_dir'] !== null) { // particular case for this option + $this->setCacheDir($this->_options['cache_dir']); + } else { + $this->setCacheDir(self::getTmpDir() . DIRECTORY_SEPARATOR, false); + } + if (isset($this->_options['file_name_prefix'])) { // particular case for this option + if (!preg_match('~^[\w]+$~', $this->_options['file_name_prefix'])) { + Zend_Cache::throwException('Invalid file_name_prefix : must use only [a-zA-A0-9_]'); + } + } + if ($this->_options['metadatas_array_max_size'] < 10) { + Zend_Cache::throwException('Invalid metadatas_array_max_size, must be > 10'); + } + if (isset($options['hashed_directory_umask']) && is_string($options['hashed_directory_umask'])) { + // See #ZF-4422 + $this->_options['hashed_directory_umask'] = octdec($this->_options['hashed_directory_umask']); + } + if (isset($options['cache_file_umask']) && is_string($options['cache_file_umask'])) { + // See #ZF-4422 + $this->_options['cache_file_umask'] = octdec($this->_options['cache_file_umask']); + } + } + + /** + * Set the cache_dir (particular case of setOption() method) + * + * @param string $value + * @param boolean $trailingSeparator If true, add a trailing separator is necessary + * @throws Zend_Cache_Exception + * @return void + */ + public function setCacheDir($value, $trailingSeparator = true) + { + if (!is_dir($value)) { + Zend_Cache::throwException('cache_dir must be a directory'); + } + if (!is_writable($value)) { + Zend_Cache::throwException('cache_dir is not writable'); + } + if ($trailingSeparator) { + // add a trailing DIRECTORY_SEPARATOR if necessary + $value = rtrim(realpath($value), '\\/') . DIRECTORY_SEPARATOR; + } + $this->_options['cache_dir'] = $value; + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id cache id + * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested + * @return string|false cached datas + */ + public function load($id, $doNotTestCacheValidity = false) + { + if (!($this->_test($id, $doNotTestCacheValidity))) { + // The cache is not hit ! + return false; + } + $metadatas = $this->_getMetadatas($id); + $file = $this->_file($id); + $data = $this->_fileGetContents($file); + if ($this->_options['read_control']) { + $hashData = $this->_hash($data, $this->_options['read_control_type']); + $hashControl = $metadatas['hash']; + if ($hashData != $hashControl) { + // Problem detected by the read control ! + $this->_log('Zend_Cache_Backend_File::load() / read_control : stored hash and computed hash do not match'); + $this->remove($id); + return false; + } + } + return $data; + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id cache id + * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + clearstatcache(); + return $this->_test($id, false); + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data Datas to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + clearstatcache(); + $file = $this->_file($id); + $path = $this->_path($id); + if ($this->_options['hashed_directory_level'] > 0) { + if (!is_writable($path)) { + // maybe, we just have to build the directory structure + $this->_recursiveMkdirAndChmod($id); + } + if (!is_writable($path)) { + return false; + } + } + if ($this->_options['read_control']) { + $hash = $this->_hash($data, $this->_options['read_control_type']); + } else { + $hash = ''; + } + $metadatas = array( + 'hash' => $hash, + 'mtime' => time(), + 'expire' => $this->_expireTime($this->getLifetime($specificLifetime)), + 'tags' => $tags + ); + $res = $this->_setMetadatas($id, $metadatas); + if (!$res) { + $this->_log('Zend_Cache_Backend_File::save() / error on saving metadata'); + return false; + } + $res = $this->_filePutContents($file, $data); + return $res; + } + + /** + * Remove a cache record + * + * @param string $id cache id + * @return boolean true if no problem + */ + public function remove($id) + { + $file = $this->_file($id); + $boolRemove = $this->_remove($file); + $boolMetadata = $this->_delMetadatas($id); + return $boolMetadata && $boolRemove; + } + + /** + * Clean some cache records + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => remove too old cache entries ($tags is not used) + * 'matchingTag' => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * 'notMatchingTag' => remove cache entries not matching one of the given tags + * ($tags can be an array of strings or a single string) + * 'matchingAnyTag' => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode clean mode + * @param tags array $tags array of tags + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + // We use this protected method to hide the recursive stuff + clearstatcache(); + return $this->_clean($this->_options['cache_dir'], $mode, $tags); + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + return $this->_get($this->_options['cache_dir'], 'ids', array()); + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + return $this->_get($this->_options['cache_dir'], 'tags', array()); + } + + /** + * Return an array of stored cache ids which match given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + return $this->_get($this->_options['cache_dir'], 'matching', $tags); + } + + /** + * Return an array of stored cache ids which don't match given tags + * + * In case of multiple tags, a logical OR is made between tags + * + * @param array $tags array of tags + * @return array array of not matching cache ids (string) + */ + public function getIdsNotMatchingTags($tags = array()) + { + return $this->_get($this->_options['cache_dir'], 'notMatching', $tags); + } + + /** + * Return an array of stored cache ids which match any given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of any matching cache ids (string) + */ + public function getIdsMatchingAnyTags($tags = array()) + { + return $this->_get($this->_options['cache_dir'], 'matchingAny', $tags); + } + + /** + * Return the filling percentage of the backend storage + * + * @throws Zend_Cache_Exception + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + $free = disk_free_space($this->_options['cache_dir']); + $total = disk_total_space($this->_options['cache_dir']); + if ($total == 0) { + Zend_Cache::throwException('can\'t get disk_total_space'); + } else { + if ($free >= $total) { + return 100; + } + return ((int) (100. * ($total - $free) / $total)); + } + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - expire : the expire timestamp + * - tags : a string array of tags + * - mtime : timestamp of last modification time + * + * @param string $id cache id + * @return array array of metadatas (false if the cache id is not found) + */ + public function getMetadatas($id) + { + $metadatas = $this->_getMetadatas($id); + if (!$metadatas) { + return false; + } + if (time() > $metadatas['expire']) { + return false; + } + return array( + 'expire' => $metadatas['expire'], + 'tags' => $metadatas['tags'], + 'mtime' => $metadatas['mtime'] + ); + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + $metadatas = $this->_getMetadatas($id); + if (!$metadatas) { + return false; + } + if (time() > $metadatas['expire']) { + return false; + } + $newMetadatas = array( + 'hash' => $metadatas['hash'], + 'mtime' => time(), + 'expire' => $metadatas['expire'] + $extraLifetime, + 'tags' => $metadatas['tags'] + ); + $res = $this->_setMetadatas($id, $newMetadatas); + if (!$res) { + return false; + } + return true; + } + + /** + * Return an associative array of capabilities (booleans) of the backend + * + * The array must include these keys : + * - automatic_cleaning (is automating cleaning necessary) + * - tags (are tags supported) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - priority does the backend deal with priority when saving + * - infinite_lifetime (is infinite lifetime can work with this backend) + * - get_list (is it possible to get the list of cache ids and the complete list of tags) + * + * @return array associative of with capabilities + */ + public function getCapabilities() + { + return array( + 'automatic_cleaning' => true, + 'tags' => true, + 'expired_read' => true, + 'priority' => false, + 'infinite_lifetime' => true, + 'get_list' => true + ); + } + + /** + * PUBLIC METHOD FOR UNIT TESTING ONLY ! + * + * Force a cache record to expire + * + * @param string $id cache id + */ + public function ___expire($id) + { + $metadatas = $this->_getMetadatas($id); + if ($metadatas) { + $metadatas['expire'] = 1; + $this->_setMetadatas($id, $metadatas); + } + } + + /** + * Get a metadatas record + * + * @param string $id Cache id + * @return array|false Associative array of metadatas + */ + protected function _getMetadatas($id) + { + if (isset($this->_metadatasArray[$id])) { + return $this->_metadatasArray[$id]; + } else { + $metadatas = $this->_loadMetadatas($id); + if (!$metadatas) { + return false; + } + $this->_setMetadatas($id, $metadatas, false); + return $metadatas; + } + } + + /** + * Set a metadatas record + * + * @param string $id Cache id + * @param array $metadatas Associative array of metadatas + * @param boolean $save optional pass false to disable saving to file + * @return boolean True if no problem + */ + protected function _setMetadatas($id, $metadatas, $save = true) + { + if (count($this->_metadatasArray) >= $this->_options['metadatas_array_max_size']) { + $n = (int) ($this->_options['metadatas_array_max_size'] / 10); + $this->_metadatasArray = array_slice($this->_metadatasArray, $n); + } + if ($save) { + $result = $this->_saveMetadatas($id, $metadatas); + if (!$result) { + return false; + } + } + $this->_metadatasArray[$id] = $metadatas; + return true; + } + + /** + * Drop a metadata record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + protected function _delMetadatas($id) + { + if (isset($this->_metadatasArray[$id])) { + unset($this->_metadatasArray[$id]); + } + $file = $this->_metadatasFile($id); + return $this->_remove($file); + } + + /** + * Clear the metadatas array + * + * @return void + */ + protected function _cleanMetadatas() + { + $this->_metadatasArray = array(); + } + + /** + * Load metadatas from disk + * + * @param string $id Cache id + * @return array|false Metadatas associative array + */ + protected function _loadMetadatas($id) + { + $file = $this->_metadatasFile($id); + $result = $this->_fileGetContents($file); + if (!$result) { + return false; + } + $tmp = @unserialize($result); + return $tmp; + } + + /** + * Save metadatas to disk + * + * @param string $id Cache id + * @param array $metadatas Associative array + * @return boolean True if no problem + */ + protected function _saveMetadatas($id, $metadatas) + { + $file = $this->_metadatasFile($id); + $result = $this->_filePutContents($file, serialize($metadatas)); + if (!$result) { + return false; + } + return true; + } + + /** + * Make and return a file name (with path) for metadatas + * + * @param string $id Cache id + * @return string Metadatas file name (with path) + */ + protected function _metadatasFile($id) + { + $path = $this->_path($id); + $fileName = $this->_idToFileName('internal-metadatas---' . $id); + return $path . $fileName; + } + + /** + * Check if the given filename is a metadatas one + * + * @param string $fileName File name + * @return boolean True if it's a metadatas one + */ + protected function _isMetadatasFile($fileName) + { + $id = $this->_fileNameToId($fileName); + if (substr($id, 0, 21) == 'internal-metadatas---') { + return true; + } else { + return false; + } + } + + /** + * Remove a file + * + * If we can't remove the file (because of locks or any problem), we will touch + * the file to invalidate it + * + * @param string $file Complete file path + * @return boolean True if ok + */ + protected function _remove($file) + { + if (!is_file($file)) { + return false; + } + if (!@unlink($file)) { + # we can't remove the file (because of locks or any problem) + $this->_log("Zend_Cache_Backend_File::_remove() : we can't remove $file"); + return false; + } + return true; + } + + /** + * Clean some cache records (protected method used for recursive stuff) + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $dir Directory to clean + * @param string $mode Clean mode + * @param array $tags Array of tags + * @throws Zend_Cache_Exception + * @return boolean True if no problem + */ + protected function _clean($dir, $mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + if (!is_dir($dir)) { + return false; + } + $result = true; + $prefix = $this->_options['file_name_prefix']; + $glob = @glob($dir . $prefix . '--*'); + if ($glob === false) { + return true; + } + foreach ($glob as $file) { + if (is_file($file)) { + $fileName = basename($file); + if ($this->_isMetadatasFile($fileName)) { + // in CLEANING_MODE_ALL, we drop anything, even remainings old metadatas files + if ($mode != Zend_Cache::CLEANING_MODE_ALL) { + continue; + } + } + $id = $this->_fileNameToId($fileName); + $metadatas = $this->_getMetadatas($id); + if ($metadatas === FALSE) { + $metadatas = array('expire' => 1, 'tags' => array()); + } + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + $res = $this->remove($id); + if (!$res) { + // in this case only, we accept a problem with the metadatas file drop + $res = $this->_remove($file); + } + $result = $result && $res; + break; + case Zend_Cache::CLEANING_MODE_OLD: + if (time() > $metadatas['expire']) { + $result = $this->remove($id) && $result; + } + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + $matching = true; + foreach ($tags as $tag) { + if (!in_array($tag, $metadatas['tags'])) { + $matching = false; + break; + } + } + if ($matching) { + $result = $this->remove($id) && $result; + } + break; + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + $matching = false; + foreach ($tags as $tag) { + if (in_array($tag, $metadatas['tags'])) { + $matching = true; + break; + } + } + if (!$matching) { + $result = $this->remove($id) && $result; + } + break; + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $matching = false; + foreach ($tags as $tag) { + if (in_array($tag, $metadatas['tags'])) { + $matching = true; + break; + } + } + if ($matching) { + $result = $this->remove($id) && $result; + } + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + if ((is_dir($file)) and ($this->_options['hashed_directory_level']>0)) { + // Recursive call + $result = $this->_clean($file . DIRECTORY_SEPARATOR, $mode, $tags) && $result; + if ($mode=='all') { + // if mode=='all', we try to drop the structure too + @rmdir($file); + } + } + } + return $result; + } + + protected function _get($dir, $mode, $tags = array()) + { + if (!is_dir($dir)) { + return false; + } + $result = array(); + $prefix = $this->_options['file_name_prefix']; + $glob = @glob($dir . $prefix . '--*'); + if ($glob === false) { + return true; + } + foreach ($glob as $file) { + if (is_file($file)) { + $fileName = basename($file); + $id = $this->_fileNameToId($fileName); + $metadatas = $this->_getMetadatas($id); + if ($metadatas === FALSE) { + continue; + } + if (time() > $metadatas['expire']) { + continue; + } + switch ($mode) { + case 'ids': + $result[] = $id; + break; + case 'tags': + $result = array_unique(array_merge($result, $metadatas['tags'])); + break; + case 'matching': + $matching = true; + foreach ($tags as $tag) { + if (!in_array($tag, $metadatas['tags'])) { + $matching = false; + break; + } + } + if ($matching) { + $result[] = $id; + } + break; + case 'notMatching': + $matching = false; + foreach ($tags as $tag) { + if (in_array($tag, $metadatas['tags'])) { + $matching = true; + break; + } + } + if (!$matching) { + $result[] = $id; + } + break; + case 'matchingAny': + $matching = false; + foreach ($tags as $tag) { + if (in_array($tag, $metadatas['tags'])) { + $matching = true; + break; + } + } + if ($matching) { + $result[] = $id; + } + break; + default: + Zend_Cache::throwException('Invalid mode for _get() method'); + break; + } + } + if ((is_dir($file)) and ($this->_options['hashed_directory_level']>0)) { + // Recursive call + $result = array_unique(array_merge($result, $this->_get($file . DIRECTORY_SEPARATOR, $mode, $tags))); + } + } + return array_unique($result); + } + + /** + * Compute & return the expire time + * + * @return int expire time (unix timestamp) + */ + protected function _expireTime($lifetime) + { + if ($lifetime === null) { + return 9999999999; + } + return time() + $lifetime; + } + + /** + * Make a control key with the string containing datas + * + * @param string $data Data + * @param string $controlType Type of control 'md5', 'crc32' or 'strlen' + * @throws Zend_Cache_Exception + * @return string Control key + */ + protected function _hash($data, $controlType) + { + switch ($controlType) { + case 'md5': + return md5($data); + case 'crc32': + return crc32($data); + case 'strlen': + return strlen($data); + case 'adler32': + return hash('adler32', $data); + default: + Zend_Cache::throwException("Incorrect hash function : $controlType"); + } + } + + /** + * Transform a cache id into a file name and return it + * + * @param string $id Cache id + * @return string File name + */ + protected function _idToFileName($id) + { + $prefix = $this->_options['file_name_prefix']; + $result = $prefix . '---' . $id; + return $result; + } + + /** + * Make and return a file name (with path) + * + * @param string $id Cache id + * @return string File name (with path) + */ + protected function _file($id) + { + $path = $this->_path($id); + $fileName = $this->_idToFileName($id); + return $path . $fileName; + } + + /** + * Return the complete directory path of a filename (including hashedDirectoryStructure) + * + * @param string $id Cache id + * @param boolean $parts if true, returns array of directory parts instead of single string + * @return string Complete directory path + */ + protected function _path($id, $parts = false) + { + $partsArray = array(); + $root = $this->_options['cache_dir']; + $prefix = $this->_options['file_name_prefix']; + if ($this->_options['hashed_directory_level']>0) { + $hash = hash('adler32', $id); + for ($i=0 ; $i < $this->_options['hashed_directory_level'] ; $i++) { + $root = $root . $prefix . '--' . substr($hash, 0, $i + 1) . DIRECTORY_SEPARATOR; + $partsArray[] = $root; + } + } + if ($parts) { + return $partsArray; + } else { + return $root; + } + } + + /** + * Make the directory strucuture for the given id + * + * @param string $id cache id + * @return boolean true + */ + protected function _recursiveMkdirAndChmod($id) + { + if ($this->_options['hashed_directory_level'] <=0) { + return true; + } + $partsArray = $this->_path($id, true); + foreach ($partsArray as $part) { + if (!is_dir($part)) { + @mkdir($part, $this->_options['hashed_directory_umask']); + @chmod($part, $this->_options['hashed_directory_umask']); // see #ZF-320 (this line is required in some configurations) + } + } + return true; + } + + /** + * Test if the given cache id is available (and still valid as a cache record) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @return boolean|mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + protected function _test($id, $doNotTestCacheValidity) + { + $metadatas = $this->_getMetadatas($id); + if (!$metadatas) { + return false; + } + if ($doNotTestCacheValidity || (time() <= $metadatas['expire'])) { + return $metadatas['mtime']; + } + return false; + } + + /** + * Return the file content of the given file + * + * @param string $file File complete path + * @return string File content (or false if problem) + */ + protected function _fileGetContents($file) + { + $result = false; + if (!is_file($file)) { + return false; + } + $f = @fopen($file, 'rb'); + if ($f) { + if ($this->_options['file_locking']) @flock($f, LOCK_SH); + $result = stream_get_contents($f); + if ($this->_options['file_locking']) @flock($f, LOCK_UN); + @fclose($f); + } + return $result; + } + + /** + * Put the given string into the given file + * + * @param string $file File complete path + * @param string $string String to put in file + * @return boolean true if no problem + */ + protected function _filePutContents($file, $string) + { + $result = false; + $f = @fopen($file, 'ab+'); + if ($f) { + if ($this->_options['file_locking']) @flock($f, LOCK_EX); + fseek($f, 0); + ftruncate($f, 0); + $tmp = @fwrite($f, $string); + if (!($tmp === FALSE)) { + $result = true; + } + @fclose($f); + } + @chmod($file, $this->_options['cache_file_umask']); + return $result; + } + + /** + * Transform a file name into cache id and return it + * + * @param string $fileName File name + * @return string Cache id + */ + protected function _fileNameToId($fileName) + { + $prefix = $this->_options['file_name_prefix']; + return preg_replace('~^' . $prefix . '---(.*)$~', '$1', $fileName); + } + +} diff --git a/lib/zend/Zend/Cache/Backend/Interface.php b/lib/zend/Zend/Cache/Backend/Interface.php new file mode 100644 index 0000000000..99d15fa227 --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/Interface.php @@ -0,0 +1,99 @@ + infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false); + + /** + * Remove a cache record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id); + + /** + * Clean some cache records + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()); + +} diff --git a/lib/zend/Zend/Cache/Backend/Memcached.php b/lib/zend/Zend/Cache/Backend/Memcached.php new file mode 100644 index 0000000000..bc899292ae --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/Memcached.php @@ -0,0 +1,502 @@ + (array) servers : + * an array of memcached server ; each memcached server is described by an associative array : + * 'host' => (string) : the name of the memcached server + * 'port' => (int) : the port of the memcached server + * 'persistent' => (bool) : use or not persistent connections to this memcached server + * 'weight' => (int) : number of buckets to create for this server which in turn control its + * probability of it being selected. The probability is relative to the total + * weight of all servers. + * 'timeout' => (int) : value in seconds which will be used for connecting to the daemon. Think twice + * before changing the default value of 1 second - you can lose all the + * advantages of caching if your connection is too slow. + * 'retry_interval' => (int) : controls how often a failed server will be retried, the default value + * is 15 seconds. Setting this parameter to -1 disables automatic retry. + * 'status' => (bool) : controls if the server should be flagged as online. + * 'failure_callback' => (callback) : Allows the user to specify a callback function to run upon + * encountering an error. The callback is run before failover + * is attempted. The function takes two parameters, the hostname + * and port of the failed server. + * + * =====> (boolean) compression : + * true if you want to use on-the-fly compression + * + * =====> (boolean) compatibility : + * true if you use old memcache server or extension + * + * @var array available options + */ + protected $_options = array( + 'servers' => array(array( + 'host' => self::DEFAULT_HOST, + 'port' => self::DEFAULT_PORT, + 'persistent' => self::DEFAULT_PERSISTENT, + 'weight' => self::DEFAULT_WEIGHT, + 'timeout' => self::DEFAULT_TIMEOUT, + 'retry_interval' => self::DEFAULT_RETRY_INTERVAL, + 'status' => self::DEFAULT_STATUS, + 'failure_callback' => self::DEFAULT_FAILURE_CALLBACK + )), + 'compression' => false, + 'compatibility' => false, + ); + + /** + * Memcache object + * + * @var mixed memcache object + */ + protected $_memcache = null; + + /** + * Constructor + * + * @param array $options associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + if (!extension_loaded('memcache')) { + Zend_Cache::throwException('The memcache extension must be loaded for using this backend !'); + } + parent::__construct($options); + if (isset($this->_options['servers'])) { + $value= $this->_options['servers']; + if (isset($value['host'])) { + // in this case, $value seems to be a simple associative array (one server only) + $value = array(0 => $value); // let's transform it into a classical array of associative arrays + } + $this->setOption('servers', $value); + } + $this->_memcache = new Memcache; + foreach ($this->_options['servers'] as $server) { + if (!array_key_exists('port', $server)) { + $server['port'] = self::DEFAULT_PORT; + } + if (!array_key_exists('persistent', $server)) { + $server['persistent'] = self::DEFAULT_PERSISTENT; + } + if (!array_key_exists('weight', $server)) { + $server['weight'] = self::DEFAULT_WEIGHT; + } + if (!array_key_exists('timeout', $server)) { + $server['timeout'] = self::DEFAULT_TIMEOUT; + } + if (!array_key_exists('retry_interval', $server)) { + $server['retry_interval'] = self::DEFAULT_RETRY_INTERVAL; + } + if (!array_key_exists('status', $server)) { + $server['status'] = self::DEFAULT_STATUS; + } + if (!array_key_exists('failure_callback', $server)) { + $server['failure_callback'] = self::DEFAULT_FAILURE_CALLBACK; + } + if ($this->_options['compatibility']) { + // No status for compatibility mode (#ZF-5887) + $this->_memcache->addServer($server['host'], $server['port'], $server['persistent'], + $server['weight'], $server['timeout'], + $server['retry_interval']); + } else { + $this->_memcache->addServer($server['host'], $server['port'], $server['persistent'], + $server['weight'], $server['timeout'], + $server['retry_interval'], + $server['status'], $server['failure_callback']); + } + } + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @return string|false cached datas + */ + public function load($id, $doNotTestCacheValidity = false) + { + $tmp = $this->_memcache->get($id); + if (is_array($tmp)) { + return $tmp[0]; + } + return false; + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id Cache id + * @return mixed|false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $tmp = $this->_memcache->get($id); + if (is_array($tmp)) { + return $tmp[1]; + } + return false; + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data Datas to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean True if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $lifetime = $this->getLifetime($specificLifetime); + if ($this->_options['compression']) { + $flag = MEMCACHE_COMPRESSED; + } else { + $flag = 0; + } + // #ZF-5702 : we try add() first becase set() seems to be slower + if (!($result = $this->_memcache->add($id, array($data, time(), $lifetime), $flag, $lifetime))) { + $result = $this->_memcache->set($id, array($data, time(), $lifetime), $flag, $lifetime); + } + if (count($tags) > 0) { + $this->_log("Zend_Cache_Backend_Memcached::save() : tags are unsupported by the Memcached backend"); + } + return $result; + } + + /** + * Remove a cache record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id) + { + return $this->_memcache->delete($id); + } + + /** + * Clean some cache records + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => unsupported + * 'matchingTag' => unsupported + * 'notMatchingTag' => unsupported + * 'matchingAnyTag' => unsupported + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @throws Zend_Cache_Exception + * @return boolean True if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + return $this->_memcache->flush(); + break; + case Zend_Cache::CLEANING_MODE_OLD: + $this->_log("Zend_Cache_Backend_Memcached::clean() : CLEANING_MODE_OLD is unsupported by the Memcached backend"); + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_MEMCACHED_BACKEND); + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * @return boolean + */ + public function isAutomaticCleaningAvailable() + { + return false; + } + + /** + * Set the frontend directives + * + * @param array $directives Assoc of directives + * @throws Zend_Cache_Exception + * @return void + */ + public function setDirectives($directives) + { + parent::setDirectives($directives); + $lifetime = $this->getLifetime(false); + if ($lifetime > 2592000) { + // #ZF-3490 : For the memcached backend, there is a lifetime limit of 30 days (2592000 seconds) + $this->_log('memcached backend has a limit of 30 days (2592000 seconds) for the lifetime'); + } + if ($lifetime === null) { + // #ZF-4614 : we tranform null to zero to get the maximal lifetime + parent::setDirectives(array('lifetime' => 0)); + } + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + $this->_log("Zend_Cache_Backend_Memcached::save() : getting the list of cache ids is unsupported by the Memcache backend"); + return array(); + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND); + return array(); + } + + /** + * Return an array of stored cache ids which match given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND); + return array(); + } + + /** + * Return an array of stored cache ids which don't match given tags + * + * In case of multiple tags, a logical OR is made between tags + * + * @param array $tags array of tags + * @return array array of not matching cache ids (string) + */ + public function getIdsNotMatchingTags($tags = array()) + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND); + return array(); + } + + /** + * Return an array of stored cache ids which match any given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of any matching cache ids (string) + */ + public function getIdsMatchingAnyTags($tags = array()) + { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND); + return array(); + } + + /** + * Return the filling percentage of the backend storage + * + * @throws Zend_Cache_Exception + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + $mems = $this->_memcache->getExtendedStats(); + + $memSize = 0; + $memUsed = 0; + foreach ($mems as $key => $mem) { + if ($mem === false) { + Zend_Cache::throwException('can\'t get stat from ' . $key); + } else { + $eachSize = $mem['limit_maxbytes']; + if ($eachSize == 0) { + Zend_Cache::throwException('can\'t get memory size from ' . $key); + } + + $eachUsed = $mem['bytes']; + if ($eachUsed > $eachSize) { + $eachUsed = $eachSize; + } + + $memSize += $eachSize; + $memUsed += $eachUsed; + } + } + + return ((int) (100. * ($memUsed / $memSize))); + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - expire : the expire timestamp + * - tags : a string array of tags + * - mtime : timestamp of last modification time + * + * @param string $id cache id + * @return array array of metadatas (false if the cache id is not found) + */ + public function getMetadatas($id) + { + $tmp = $this->_memcache->get($id); + if (is_array($tmp)) { + $data = $tmp[0]; + $mtime = $tmp[1]; + if (!isset($tmp[2])) { + // because this record is only with 1.7 release + // if old cache records are still there... + return false; + } + $lifetime = $tmp[2]; + return array( + 'expire' => $mtime + $lifetime, + 'tags' => array(), + 'mtime' => $mtime + ); + } + return false; + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + if ($this->_options['compression']) { + $flag = MEMCACHE_COMPRESSED; + } else { + $flag = 0; + } + $tmp = $this->_memcache->get($id); + if (is_array($tmp)) { + $data = $tmp[0]; + $mtime = $tmp[1]; + if (!isset($tmp[2])) { + // because this record is only with 1.7 release + // if old cache records are still there... + return false; + } + $lifetime = $tmp[2]; + $newLifetime = $lifetime - (time() - $mtime) + $extraLifetime; + if ($newLifetime <=0) { + return false; + } + // #ZF-5702 : we try replace() first becase set() seems to be slower + if (!($result = $this->_memcache->replace($id, array($data, time(), $newLifetime), $flag, $newLifetime))) { + $result = $this->_memcache->set($id, array($data, time(), $newLifetime), $flag, $newLifetime); + } + return $result; + } + return false; + } + + /** + * Return an associative array of capabilities (booleans) of the backend + * + * The array must include these keys : + * - automatic_cleaning (is automating cleaning necessary) + * - tags (are tags supported) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - priority does the backend deal with priority when saving + * - infinite_lifetime (is infinite lifetime can work with this backend) + * - get_list (is it possible to get the list of cache ids and the complete list of tags) + * + * @return array associative of with capabilities + */ + public function getCapabilities() + { + return array( + 'automatic_cleaning' => false, + 'tags' => false, + 'expired_read' => false, + 'priority' => false, + 'infinite_lifetime' => false, + 'get_list' => false + ); + } + +} diff --git a/lib/zend/Zend/Cache/Backend/Sqlite.php b/lib/zend/Zend/Cache/Backend/Sqlite.php new file mode 100644 index 0000000000..286fbfc951 --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/Sqlite.php @@ -0,0 +1,679 @@ + (string) cache_db_complete_path : + * - the complete path (filename included) of the SQLITE database + * + * ====> (int) automatic_vacuum_factor : + * - Disable / Tune the automatic vacuum process + * - The automatic vacuum process defragment the database file (and make it smaller) + * when a clean() or delete() is called + * 0 => no automatic vacuum + * 1 => systematic vacuum (when delete() or clean() methods are called) + * x (integer) > 1 => automatic vacuum randomly 1 times on x clean() or delete() + * + * @var array Available options + */ + protected $_options = array( + 'cache_db_complete_path' => null, + 'automatic_vacuum_factor' => 10 + ); + + /** + * DB ressource + * + * @var mixed $_db + */ + private $_db = null; + + /** + * Boolean to store if the structure has benn checked or not + * + * @var boolean $_structureChecked + */ + private $_structureChecked = false; + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + parent::__construct($options); + if ($this->_options['cache_db_complete_path'] === null) { + Zend_Cache::throwException('cache_db_complete_path option has to set'); + } + if (!extension_loaded('sqlite')) { + Zend_Cache::throwException("Cannot use SQLite storage because the 'sqlite' extension is not loaded in the current PHP environment"); + } + $this->_getConnection(); + } + + /** + * Destructor + * + * @return void + */ + public function __destruct() + { + @sqlite_close($this->_getConnection()); + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @return string|false Cached datas + */ + public function load($id, $doNotTestCacheValidity = false) + { + $this->_checkAndBuildStructure(); + $sql = "SELECT content FROM cache WHERE id='$id'"; + if (!$doNotTestCacheValidity) { + $sql = $sql . " AND (expire=0 OR expire>" . time() . ')'; + } + $result = $this->_query($sql); + $row = @sqlite_fetch_array($result); + if ($row) { + return $row['content']; + } + return false; + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id Cache id + * @return mixed|false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $this->_checkAndBuildStructure(); + $sql = "SELECT lastModified FROM cache WHERE id='$id' AND (expire=0 OR expire>" . time() . ')'; + $result = $this->_query($sql); + $row = @sqlite_fetch_array($result); + if ($row) { + return ((int) $row['lastModified']); + } + return false; + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data Datas to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @throws Zend_Cache_Exception + * @return boolean True if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $this->_checkAndBuildStructure(); + $lifetime = $this->getLifetime($specificLifetime); + $data = @sqlite_escape_string($data); + $mktime = time(); + if ($lifetime === null) { + $expire = 0; + } else { + $expire = $mktime + $lifetime; + } + $this->_query("DELETE FROM cache WHERE id='$id'"); + $sql = "INSERT INTO cache (id, content, lastModified, expire) VALUES ('$id', '$data', $mktime, $expire)"; + $res = $this->_query($sql); + if (!$res) { + $this->_log("Zend_Cache_Backend_Sqlite::save() : impossible to store the cache id=$id"); + return false; + } + $res = true; + foreach ($tags as $tag) { + $res = $this->_registerTag($id, $tag) && $res; + } + return $res; + } + + /** + * Remove a cache record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id) + { + $this->_checkAndBuildStructure(); + $res = $this->_query("SELECT COUNT(*) AS nbr FROM cache WHERE id='$id'"); + $result1 = @sqlite_fetch_single($res); + $result2 = $this->_query("DELETE FROM cache WHERE id='$id'"); + $result3 = $this->_query("DELETE FROM tag WHERE id='$id'"); + $this->_automaticVacuum(); + return ($result1 && $result2 && $result3); + } + + /** + * Clean some cache records + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @return boolean True if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + $this->_checkAndBuildStructure(); + $return = $this->_clean($mode, $tags); + $this->_automaticVacuum(); + return $return; + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + $this->_checkAndBuildStructure(); + $res = $this->_query("SELECT id FROM cache WHERE (expire=0 OR expire>" . time() . ")"); + $result = array(); + while ($id = @sqlite_fetch_single($res)) { + $result[] = $id; + } + return $result; + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + $this->_checkAndBuildStructure(); + $res = $this->_query("SELECT DISTINCT(name) AS name FROM tag"); + $result = array(); + while ($id = @sqlite_fetch_single($res)) { + $result[] = $id; + } + return $result; + } + + /** + * Return an array of stored cache ids which match given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + $first = true; + $ids = array(); + foreach ($tags as $tag) { + $res = $this->_query("SELECT DISTINCT(id) AS id FROM tag WHERE name='$tag'"); + if (!$res) { + return array(); + } + $rows = @sqlite_fetch_all($res, SQLITE_ASSOC); + $ids2 = array(); + foreach ($rows as $row) { + $ids2[] = $row['id']; + } + if ($first) { + $ids = $ids2; + $first = false; + } else { + $ids = array_intersect($ids, $ids2); + } + } + $result = array(); + foreach ($ids as $id) { + $result[] = $id; + } + return $result; + } + + /** + * Return an array of stored cache ids which don't match given tags + * + * In case of multiple tags, a logical OR is made between tags + * + * @param array $tags array of tags + * @return array array of not matching cache ids (string) + */ + public function getIdsNotMatchingTags($tags = array()) + { + $res = $this->_query("SELECT id FROM cache"); + $rows = @sqlite_fetch_all($res, SQLITE_ASSOC); + $result = array(); + foreach ($rows as $row) { + $id = $row['id']; + $matching = false; + foreach ($tags as $tag) { + $res = $this->_query("SELECT COUNT(*) AS nbr FROM tag WHERE name='$tag' AND id='$id'"); + if (!$res) { + return array(); + } + $nbr = (int) @sqlite_fetch_single($res); + if ($nbr > 0) { + $matching = true; + } + } + if (!$matching) { + $result[] = $id; + } + } + return $result; + } + + /** + * Return an array of stored cache ids which match any given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of any matching cache ids (string) + */ + public function getIdsMatchingAnyTags($tags = array()) + { + $first = true; + $ids = array(); + foreach ($tags as $tag) { + $res = $this->_query("SELECT DISTINCT(id) AS id FROM tag WHERE name='$tag'"); + if (!$res) { + return array(); + } + $rows = @sqlite_fetch_all($res, SQLITE_ASSOC); + $ids2 = array(); + foreach ($rows as $row) { + $ids2[] = $row['id']; + } + if ($first) { + $ids = $ids2; + $first = false; + } else { + $ids = array_merge($ids, $ids2); + } + } + $result = array(); + foreach ($ids as $id) { + $result[] = $id; + } + return $result; + } + + /** + * Return the filling percentage of the backend storage + * + * @throws Zend_Cache_Exception + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + $dir = dirname($this->_options['cache_db_complete_path']); + $free = disk_free_space($dir); + $total = disk_total_space($dir); + if ($total == 0) { + Zend_Cache::throwException('can\'t get disk_total_space'); + } else { + if ($free >= $total) { + return 100; + } + return ((int) (100. * ($total - $free) / $total)); + } + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - expire : the expire timestamp + * - tags : a string array of tags + * - mtime : timestamp of last modification time + * + * @param string $id cache id + * @return array array of metadatas (false if the cache id is not found) + */ + public function getMetadatas($id) + { + $tags = array(); + $res = $this->_query("SELECT name FROM tag WHERE id='$id'"); + if ($res) { + $rows = @sqlite_fetch_all($res, SQLITE_ASSOC); + foreach ($rows as $row) { + $tags[] = $row['name']; + } + } + $this->_query('CREATE TABLE cache (id TEXT PRIMARY KEY, content BLOB, lastModified INTEGER, expire INTEGER)'); + $res = $this->_query("SELECT lastModified,expire FROM cache WHERE id='$id'"); + if (!$res) { + return false; + } + $row = @sqlite_fetch_array($res, SQLITE_ASSOC); + return array( + 'tags' => $tags, + 'mtime' => $row['lastModified'], + 'expire' => $row['expire'] + ); + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + $sql = "SELECT expire FROM cache WHERE id='$id' AND (expire=0 OR expire>" . time() . ')'; + $res = $this->_query($sql); + if (!$res) { + return false; + } + $expire = @sqlite_fetch_single($res); + $newExpire = $expire + $extraLifetime; + $res = $this->_query("UPDATE cache SET lastModified=" . time() . ", expire=$newExpire WHERE id='$id'"); + if ($res) { + return true; + } else { + return false; + } + } + + /** + * Return an associative array of capabilities (booleans) of the backend + * + * The array must include these keys : + * - automatic_cleaning (is automating cleaning necessary) + * - tags (are tags supported) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - priority does the backend deal with priority when saving + * - infinite_lifetime (is infinite lifetime can work with this backend) + * - get_list (is it possible to get the list of cache ids and the complete list of tags) + * + * @return array associative of with capabilities + */ + public function getCapabilities() + { + return array( + 'automatic_cleaning' => true, + 'tags' => true, + 'expired_read' => true, + 'priority' => false, + 'infinite_lifetime' => true, + 'get_list' => true + ); + } + + /** + * PUBLIC METHOD FOR UNIT TESTING ONLY ! + * + * Force a cache record to expire + * + * @param string $id Cache id + */ + public function ___expire($id) + { + $time = time() - 1; + $this->_query("UPDATE cache SET lastModified=$time, expire=$time WHERE id='$id'"); + } + + /** + * Return the connection resource + * + * If we are not connected, the connection is made + * + * @throws Zend_Cache_Exception + * @return resource Connection resource + */ + private function _getConnection() + { + if (is_resource($this->_db)) { + return $this->_db; + } else { + $this->_db = @sqlite_open($this->_options['cache_db_complete_path']); + if (!(is_resource($this->_db))) { + Zend_Cache::throwException("Impossible to open " . $this->_options['cache_db_complete_path'] . " cache DB file"); + } + return $this->_db; + } + } + + /** + * Execute an SQL query silently + * + * @param string $query SQL query + * @return mixed|false query results + */ + private function _query($query) + { + $db = $this->_getConnection(); + if (is_resource($db)) { + $res = @sqlite_query($db, $query); + if ($res === false) { + return false; + } else { + return $res; + } + } + return false; + } + + /** + * Deal with the automatic vacuum process + * + * @return void + */ + private function _automaticVacuum() + { + if ($this->_options['automatic_vacuum_factor'] > 0) { + $rand = rand(1, $this->_options['automatic_vacuum_factor']); + if ($rand == 1) { + $this->_query('VACUUM'); + @sqlite_close($this->_getConnection()); + } + } + } + + /** + * Register a cache id with the given tag + * + * @param string $id Cache id + * @param string $tag Tag + * @return boolean True if no problem + */ + private function _registerTag($id, $tag) { + $res = $this->_query("DELETE FROM TAG WHERE name='$tag' AND id='$id'"); + $res = $this->_query("INSERT INTO tag (name, id) VALUES ('$tag', '$id')"); + if (!$res) { + $this->_log("Zend_Cache_Backend_Sqlite::_registerTag() : impossible to register tag=$tag on id=$id"); + return false; + } + return true; + } + + /** + * Build the database structure + * + * @return false + */ + private function _buildStructure() + { + $this->_query('DROP INDEX tag_id_index'); + $this->_query('DROP INDEX tag_name_index'); + $this->_query('DROP INDEX cache_id_expire_index'); + $this->_query('DROP TABLE version'); + $this->_query('DROP TABLE cache'); + $this->_query('DROP TABLE tag'); + $this->_query('CREATE TABLE version (num INTEGER PRIMARY KEY)'); + $this->_query('CREATE TABLE cache (id TEXT PRIMARY KEY, content BLOB, lastModified INTEGER, expire INTEGER)'); + $this->_query('CREATE TABLE tag (name TEXT, id TEXT)'); + $this->_query('CREATE INDEX tag_id_index ON tag(id)'); + $this->_query('CREATE INDEX tag_name_index ON tag(name)'); + $this->_query('CREATE INDEX cache_id_expire_index ON cache(id, expire)'); + $this->_query('INSERT INTO version (num) VALUES (1)'); + } + + /** + * Check if the database structure is ok (with the good version) + * + * @return boolean True if ok + */ + private function _checkStructureVersion() + { + $result = $this->_query("SELECT num FROM version"); + if (!$result) return false; + $row = @sqlite_fetch_array($result); + if (!$row) { + return false; + } + if (((int) $row['num']) != 1) { + // old cache structure + $this->_log('Zend_Cache_Backend_Sqlite::_checkStructureVersion() : old cache structure version detected => the cache is going to be dropped'); + return false; + } + return true; + } + + /** + * Clean some cache records + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @return boolean True if no problem + */ + private function _clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + $res1 = $this->_query('DELETE FROM cache'); + $res2 = $this->_query('DELETE FROM tag'); + return $res1 && $res2; + break; + case Zend_Cache::CLEANING_MODE_OLD: + $mktime = time(); + $res1 = $this->_query("DELETE FROM tag WHERE id IN (SELECT id FROM cache WHERE expire>0 AND expire<=$mktime)"); + $res2 = $this->_query("DELETE FROM cache WHERE expire>0 AND expire<=$mktime"); + return $res1 && $res2; + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + $ids = $this->getIdsMatchingTags($tags); + $result = true; + foreach ($ids as $id) { + $result = $this->remove($id) && $result; + } + return $result; + break; + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + $ids = $this->getIdsNotMatchingTags($tags); + $result = true; + foreach ($ids as $id) { + $result = $this->remove($id) && $result; + } + return $result; + break; + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $ids = $this->getIdsMatchingAnyTags($tags); + $result = true; + foreach ($ids as $id) { + $result = $this->remove($id) && $result; + } + return $result; + break; + default: + break; + } + return false; + } + + /** + * Check if the database structure is ok (with the good version), if no : build it + * + * @throws Zend_Cache_Exception + * @return boolean True if ok + */ + private function _checkAndBuildStructure() + { + if (!($this->_structureChecked)) { + if (!$this->_checkStructureVersion()) { + $this->_buildStructure(); + if (!$this->_checkStructureVersion()) { + Zend_Cache::throwException("Impossible to build cache structure in " . $this->_options['cache_db_complete_path']); + } + } + $this->_structureChecked = true; + } + return true; + } + +} diff --git a/lib/zend/Zend/Cache/Backend/Test.php b/lib/zend/Zend/Cache/Backend/Test.php new file mode 100644 index 0000000000..49cfd44231 --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/Test.php @@ -0,0 +1,270 @@ +_addLog('construct', array($options)); + } + + /** + * Set the frontend directives + * + * @param array $directives assoc of directives + * @return void + */ + public function setDirectives($directives) + { + $this->_addLog('setDirectives', array($directives)); + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * For this test backend only, if $id == 'false', then the method will return false + * if $id == 'serialized', the method will return a serialized array + * ('foo' else) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @return string Cached datas (or false) + */ + public function load($id, $doNotTestCacheValidity = false) + { + $this->_addLog('get', array($id, $doNotTestCacheValidity)); + if ($id=='false') { + return false; + } + if ($id=='serialized') { + return serialize(array('foo')); + } + if ($id=='serialized2') { + return serialize(array('headers' => array(), 'data' => 'foo')); + } + if (($id=='71769f39054f75894288e397df04e445') or ($id=='615d222619fb20b527168340cebd0578')) { + return serialize(array('foo', 'bar')); + } + if (($id=='8a02d218a5165c467e7a5747cc6bd4b6') or ($id=='648aca1366211d17cbf48e65dc570bee')) { + return serialize(array('foo', 'bar')); + } + return 'foo'; + } + + /** + * Test if a cache is available or not (for the given id) + * + * For this test backend only, if $id == 'false', then the method will return false + * (123456 else) + * + * @param string $id Cache id + * @return mixed|false false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $this->_addLog('test', array($id)); + if ($id=='false') { + return false; + } + if (($id=='d8523b3ee441006261eeffa5c3d3a0a7') or ($id=='3c439c922209e2cb0b54d6deffccd75a')) { + return false; + } + if (($id=='40f649b94977c0a6e76902e2a0b43587') or ($id=='e83249ea22178277d5befc2c5e2e9ace')) { + return false; + } + return 123456; + } + + /** + * Save some string datas into a cache record + * + * For this test backend only, if $id == 'false', then the method will return false + * (true else) + * + * @param string $data Datas to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean True if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $this->_addLog('save', array($data, $id, $tags)); + if ($id=='false') { + return false; + } + return true; + } + + /** + * Remove a cache record + * + * For this test backend only, if $id == 'false', then the method will return false + * (true else) + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id) + { + $this->_addLog('remove', array($id)); + if ($id=='false') { + return false; + } + return true; + } + + /** + * Clean some cache records + * + * For this test backend only, if $mode == 'false', then the method will return false + * (true else) + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @return boolean True if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + $this->_addLog('clean', array($mode, $tags)); + if ($mode=='false') { + return false; + } + return true; + } + + /** + * Get the last log + * + * @return string The last log + */ + public function getLastLog() + { + return $this->_log[$this->_index - 1]; + } + + /** + * Get the log index + * + * @return int Log index + */ + public function getLogIndex() + { + return $this->_index; + } + + /** + * Get the complete log array + * + * @return array Complete log array + */ + public function getAllLogs() + { + return $this->_log; + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * @return boolean + */ + public function isAutomaticCleaningAvailable() + { + return true; + } + + /** + * Add an event to the log array + * + * @param string $methodName MethodName + * @param array $args Arguments + * @return void + */ + private function _addLog($methodName, $args) + { + $this->_log[$this->_index] = array( + 'methodName' => $methodName, + 'args' => $args + ); + $this->_index = $this->_index + 1; + } + +} diff --git a/lib/zend/Zend/Cache/Backend/TwoLevels.php b/lib/zend/Zend/Cache/Backend/TwoLevels.php new file mode 100644 index 0000000000..f21ef05e80 --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/TwoLevels.php @@ -0,0 +1,506 @@ + (string) slow_backend : + * - Slow backend name + * - Must implement the Zend_Cache_Backend_ExtendedInterface + * - Should provide a big storage + * + * =====> (string) fast_backend : + * - Flow backend name + * - Must implement the Zend_Cache_Backend_ExtendedInterface + * - Must be much faster than slow_backend + * + * =====> (array) slow_backend_options : + * - Slow backend options (see corresponding backend) + * + * =====> (array) fast_backend_options : + * - Fast backend options (see corresponding backend) + * + * =====> (int) stats_update_factor : + * - Disable / Tune the computation of the fast backend filling percentage + * - When saving a record into cache : + * 1 => systematic computation of the fast backend filling percentage + * x (integer) > 1 => computation of the fast backend filling percentage randomly 1 times on x cache write + * + * =====> (boolean) slow_backend_custom_naming : + * =====> (boolean) fast_backend_custom_naming : + * =====> (boolean) slow_backend_autoload : + * =====> (boolean) fast_backend_autoload : + * - See Zend_Cache::factory() method + * + * =====> (boolean) auto_refresh_fast_cache + * - If true, auto refresh the fast cache when a cache record is hit + * + * @var array available options + */ + protected $_options = array( + 'slow_backend' => 'File', + 'fast_backend' => 'Apc', + 'slow_backend_options' => array(), + 'fast_backend_options' => array(), + 'stats_update_factor' => 10, + 'slow_backend_custom_naming' => false, + 'fast_backend_custom_naming' => false, + 'slow_backend_autoload' => false, + 'fast_backend_autoload' => false, + 'auto_refresh_fast_cache' => true + ); + + /** + * Slow Backend + * + * @var Zend_Cache_Backend + */ + private $_slowBackend; + + /** + * Fast Backend + * + * @var Zend_Cache_Backend + */ + private $_fastBackend; + + /** + * Cache for the fast backend filling percentage + * + * @var int + */ + private $_fastBackendFillingPercentage = null; + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + parent::__construct($options); + if ($this->_options['slow_backend'] === null) { + Zend_Cache::throwException('slow_backend option has to set'); + } + if ($this->_options['fast_backend'] === null) { + Zend_Cache::throwException('fast_backend option has to set'); + } + $this->_slowBackend = Zend_Cache::_makeBackend($this->_options['slow_backend'], $this->_options['slow_backend_options'], $this->_options['slow_backend_custom_naming'], $this->_options['slow_backend_autoload']); + $this->_fastBackend = Zend_Cache::_makeBackend($this->_options['fast_backend'], $this->_options['fast_backend_options'], $this->_options['fast_backend_custom_naming'], $this->_options['fast_backend_autoload']); + if (!in_array('Zend_Cache_Backend_ExtendedInterface', class_implements($this->_slowBackend))) { + Zend_Cache::throwException('slow_backend must implement the Zend_Cache_Backend_ExtendedInterface interface'); + } + if (!in_array('Zend_Cache_Backend_ExtendedInterface', class_implements($this->_fastBackend))) { + Zend_Cache::throwException('fast_backend must implement the Zend_Cache_Backend_ExtendedInterface interface'); + } + $this->_slowBackend->setDirectives($this->_directives); + $this->_fastBackend->setDirectives($this->_directives); + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id cache id + * @return mixed|false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $fastTest = $this->_fastBackend->test($id); + if ($fastTest) { + return $fastTest; + } else { + return $this->_slowBackend->test($id); + } + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data Datas to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @param int $priority integer between 0 (very low priority) and 10 (maximum priority) used by some particular backends + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false, $priority = 8) + { + $usage = $this->_getFastFillingPercentage('saving'); + $boolFast = true; + $lifetime = $this->getLifetime($specificLifetime); + $preparedData = $this->_prepareData($data, $lifetime, $priority); + if (($priority > 0) && (10 * $priority >= $usage)) { + $fastLifetime = $this->_getFastLifetime($lifetime, $priority); + $boolFast = $this->_fastBackend->save($preparedData, $id, array(), $fastLifetime); + } + $boolSlow = $this->_slowBackend->save($preparedData, $id, $tags, $lifetime); + return ($boolFast && $boolSlow); + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * Note : return value is always "string" (unserialization is done by the core not by the backend) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @return string|false cached datas + */ + public function load($id, $doNotTestCacheValidity = false) + { + $res = $this->_fastBackend->load($id, $doNotTestCacheValidity); + if ($res === false) { + $res = $this->_slowBackend->load($id, $doNotTestCacheValidity); + if ($res === false) { + // there is no cache at all for this id + return false; + } + } + $array = unserialize($res); + // maybe, we have to refresh the fast cache ? + if ($this->_options['auto_refresh_fast_cache']) { + if ($array['priority'] == 10) { + // no need to refresh the fast cache with priority = 10 + return $array['data']; + } + $newFastLifetime = $this->_getFastLifetime($array['lifetime'], $array['priority'], time() - $array['expire']); + // we have the time to refresh the fast cache + $usage = $this->_getFastFillingPercentage('loading'); + if (($array['priority'] > 0) && (10 * $array['priority'] >= $usage)) { + // we can refresh the fast cache + $preparedData = $this->_prepareData($array['data'], $array['lifetime'], $array['priority']); + $this->_fastBackend->save($preparedData, $id, array(), $newFastLifetime); + } + } + return $array['data']; + } + + /** + * Remove a cache record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id) + { + $boolFast = $this->_fastBackend->remove($id); + $boolSlow = $this->_slowBackend->remove($id); + return $boolFast && $boolSlow; + } + + /** + * Clean some cache records + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => remove cache entries not {matching one of the given tags} + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @throws Zend_Cache_Exception + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + $boolFast = $this->_fastBackend->clean(Zend_Cache::CLEANING_MODE_ALL); + $boolSlow = $this->_slowBackend->clean(Zend_Cache::CLEANING_MODE_ALL); + return $boolFast && $boolSlow; + break; + case Zend_Cache::CLEANING_MODE_OLD: + return $this->_slowBackend->clean(Zend_Cache::CLEANING_MODE_OLD); + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + $ids = $this->_slowBackend->getIdsMatchingTags($tags); + $res = true; + foreach ($ids as $id) { + $bool = $this->remove($id); + $res = $res && $bool; + } + return $res; + break; + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + $ids = $this->_slowBackend->getIdsNotMatchingTags($tags); + $res = true; + foreach ($ids as $id) { + $bool = $this->remove($id); + $res = $res && $bool; + } + return $res; + break; + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $ids = $this->_slowBackend->getIdsMatchingAnyTags($tags); + $res = true; + foreach ($ids as $id) { + $bool = $this->remove($id); + $res = $res && $bool; + } + return $res; + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + return $this->_slowBackend->getIds(); + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + return $this->_slowBackend->getTags(); + } + + /** + * Return an array of stored cache ids which match given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + return $this->_slowBackend->getIdsMatchingTags($tags); + } + + /** + * Return an array of stored cache ids which don't match given tags + * + * In case of multiple tags, a logical OR is made between tags + * + * @param array $tags array of tags + * @return array array of not matching cache ids (string) + */ + public function getIdsNotMatchingTags($tags = array()) + { + return $this->_slowBackend->getIdsNotMatchingTags($tags); + } + + /** + * Return an array of stored cache ids which match any given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of any matching cache ids (string) + */ + public function getIdsMatchingAnyTags($tags = array()) + { + return $this->_slowBackend->getIdsMatchingAnyTags($tags); + } + + + /** + * Return the filling percentage of the backend storage + * + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + return $this->_slowBackend->getFillingPercentage(); + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - expire : the expire timestamp + * - tags : a string array of tags + * - mtime : timestamp of last modification time + * + * @param string $id cache id + * @return array array of metadatas (false if the cache id is not found) + */ + public function getMetadatas($id) + { + return $this->_slowBackend->getMetadatas($id); + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + return $this->_slowBackend->touch($id, $extraLifetime); + } + + /** + * Return an associative array of capabilities (booleans) of the backend + * + * The array must include these keys : + * - automatic_cleaning (is automating cleaning necessary) + * - tags (are tags supported) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - priority does the backend deal with priority when saving + * - infinite_lifetime (is infinite lifetime can work with this backend) + * - get_list (is it possible to get the list of cache ids and the complete list of tags) + * + * @return array associative of with capabilities + */ + public function getCapabilities() + { + $slowBackendCapabilities = $this->_slowBackend->getCapabilities(); + return array( + 'automatic_cleaning' => $slowBackendCapabilities['automatic_cleaning'], + 'tags' => $slowBackendCapabilities['tags'], + 'expired_read' => $slowBackendCapabilities['expired_read'], + 'priority' => $slowBackendCapabilities['priority'], + 'infinite_lifetime' => $slowBackendCapabilities['infinite_lifetime'], + 'get_list' => $slowBackendCapabilities['get_list'] + ); + } + + /** + * Prepare a serialized array to store datas and metadatas informations + * + * @param string $data data to store + * @param int $lifetime original lifetime + * @param int $priority priority + * @return string serialize array to store into cache + */ + private function _prepareData($data, $lifetime, $priority) + { + $lt = $lifetime; + if ($lt === null) { + $lt = 9999999999; + } + return serialize(array( + 'data' => $data, + 'lifetime' => $lifetime, + 'expire' => time() + $lt, + 'priority' => $priority + )); + } + + /** + * Compute and return the lifetime for the fast backend + * + * @param int $lifetime original lifetime + * @param int $priority priority + * @param int $maxLifetime maximum lifetime + * @return int lifetime for the fast backend + */ + private function _getFastLifetime($lifetime, $priority, $maxLifetime = null) + { + if ($lifetime === null) { + // if lifetime is null, we have an infinite lifetime + // we need to use arbitrary lifetimes + $fastLifetime = (int) (2592000 / (11 - $priority)); + } else { + $fastLifetime = (int) ($lifetime / (11 - $priority)); + } + if (($maxLifetime !== null) && ($maxLifetime >= 0)) { + if ($fastLifetime > $maxLifetime) { + return $maxLifetime; + } + } + return $fastLifetime; + } + + /** + * PUBLIC METHOD FOR UNIT TESTING ONLY ! + * + * Force a cache record to expire + * + * @param string $id cache id + */ + public function ___expire($id) + { + $this->_fastBackend->remove($id); + $this->_slowBackend->___expire($id); + } + + private function _getFastFillingPercentage($mode) + { + + if ($mode == 'saving') { + // mode saving + if ($this->_fastBackendFillingPercentage === null) { + $this->_fastBackendFillingPercentage = $this->_fastBackend->getFillingPercentage(); + } else { + $rand = rand(1, $this->_options['stats_update_factor']); + if ($rand == 1) { + // we force a refresh + $this->_fastBackendFillingPercentage = $this->_fastBackend->getFillingPercentage(); + } + } + } else { + // mode loading + // we compute the percentage only if it's not available in cache + if ($this->_fastBackendFillingPercentage === null) { + $this->_fastBackendFillingPercentage = $this->_fastBackend->getFillingPercentage(); + } + } + return $this->_fastBackendFillingPercentage; + } + +} diff --git a/lib/zend/Zend/Cache/Backend/Xcache.php b/lib/zend/Zend/Cache/Backend/Xcache.php new file mode 100644 index 0000000000..4cdabff172 --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/Xcache.php @@ -0,0 +1,216 @@ + (string) user : + * xcache.admin.user (necessary for the clean() method) + * + * =====> (string) password : + * xcache.admin.pass (clear, not MD5) (necessary for the clean() method) + * + * @var array available options + */ + protected $_options = array( + 'user' => null, + 'password' => null + ); + + /** + * Constructor + * + * @param array $options associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + if (!extension_loaded('xcache')) { + Zend_Cache::throwException('The xcache extension must be loaded for using this backend !'); + } + parent::__construct($options); + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * WARNING $doNotTestCacheValidity=true is unsupported by the Xcache backend + * + * @param string $id cache id + * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested + * @return string cached datas (or false) + */ + public function load($id, $doNotTestCacheValidity = false) + { + if ($doNotTestCacheValidity) { + $this->_log("Zend_Cache_Backend_Xcache::load() : \$doNotTestCacheValidity=true is unsupported by the Xcache backend"); + } + $tmp = xcache_get($id); + if (is_array($tmp)) { + return $tmp[0]; + } + return false; + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id cache id + * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + if (xcache_isset($id)) { + $tmp = xcache_get($id); + if (is_array($tmp)) { + return $tmp[1]; + } + } + return false; + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data datas to cache + * @param string $id cache id + * @param array $tags array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $lifetime = $this->getLifetime($specificLifetime); + $result = xcache_set($id, array($data, time()), $lifetime); + if (count($tags) > 0) { + $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_XCACHE_BACKEND); + } + return $result; + } + + /** + * Remove a cache record + * + * @param string $id cache id + * @return boolean true if no problem + */ + public function remove($id) + { + return xcache_unset($id); + } + + /** + * Clean some cache records + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => unsupported + * 'matchingTag' => unsupported + * 'notMatchingTag' => unsupported + * 'matchingAnyTag' => unsupported + * + * @param string $mode clean mode + * @param array $tags array of tags + * @throws Zend_Cache_Exception + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + // Necessary because xcache_clear_cache() need basic authentification + $backup = array(); + if (isset($_SERVER['PHP_AUTH_USER'])) { + $backup['PHP_AUTH_USER'] = $_SERVER['PHP_AUTH_USER']; + } + if (isset($_SERVER['PHP_AUTH_PW'])) { + $backup['PHP_AUTH_PW'] = $_SERVER['PHP_AUTH_PW']; + } + if ($this->_options['user']) { + $_SERVER['PHP_AUTH_USER'] = $this->_options['user']; + } + if ($this->_options['password']) { + $_SERVER['PHP_AUTH_PW'] = $this->_options['password']; + } + xcache_clear_cache(XC_TYPE_VAR, 0); + if (isset($backup['PHP_AUTH_USER'])) { + $_SERVER['PHP_AUTH_USER'] = $backup['PHP_AUTH_USER']; + $_SERVER['PHP_AUTH_PW'] = $backup['PHP_AUTH_PW']; + } + return true; + break; + case Zend_Cache::CLEANING_MODE_OLD: + $this->_log("Zend_Cache_Backend_Xcache::clean() : CLEANING_MODE_OLD is unsupported by the Xcache backend"); + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_XCACHE_BACKEND); + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + + /** + * Return true if the automatic cleaning is available for the backend + * + * @return boolean + */ + public function isAutomaticCleaningAvailable() + { + return false; + } + +} diff --git a/lib/zend/Zend/Cache/Backend/ZendPlatform.php b/lib/zend/Zend/Cache/Backend/ZendPlatform.php new file mode 100644 index 0000000000..4e55bda6a0 --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/ZendPlatform.php @@ -0,0 +1,317 @@ +_directives['lifetime']; + } + $res = output_cache_get($id, $lifetime); + if($res) { + return $res[0]; + } else { + return false; + } + } + + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id Cache id + * @return mixed|false false (a cache is not available) or "last modified" timestamp (int) of the available cache record + */ + public function test($id) + { + $result = output_cache_get($id, $this->_directives['lifetime']); + if ($result) { + return $result[1]; + } + return false; + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data Data to cache + * @param string $id Cache id + * @param array $tags Array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + if (!($specificLifetime === false)) { + $this->_log("Zend_Cache_Backend_ZendPlatform::save() : non false specifc lifetime is unsuported for this backend"); + } + + $lifetime = $this->_directives['lifetime']; + $result1 = output_cache_put($id, array($data, time())); + $result2 = (count($tags) == 0); + + foreach ($tags as $tag) { + $tagid = self::TAGS_PREFIX.$tag; + $old_tags = output_cache_get($tagid, $lifetime); + if ($old_tags === false) { + $old_tags = array(); + } + $old_tags[$id] = $id; + output_cache_remove_key($tagid); + $result2 = output_cache_put($tagid, $old_tags); + } + + return $result1 && $result2; + } + + + /** + * Remove a cache record + * + * @param string $id Cache id + * @return boolean True if no problem + */ + public function remove($id) + { + return output_cache_remove_key($id); + } + + + /** + * Clean some cache records + * + * Available modes are : + * Zend_Cache::CLEANING_MODE_ALL (default) => remove all cache entries ($tags is not used) + * Zend_Cache::CLEANING_MODE_OLD => remove too old cache entries ($tags is not used) + * This mode is not supported in this backend + * Zend_Cache::CLEANING_MODE_MATCHING_TAG => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG => unsupported + * Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode Clean mode + * @param array $tags Array of tags + * @throws Zend_Cache_Exception + * @return boolean True if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + case Zend_Cache::CLEANING_MODE_OLD: + $cache_dir = ini_get('zend_accelerator.output_cache_dir'); + if (!$cache_dir) { + return false; + } + $cache_dir .= '/.php_cache_api/'; + return $this->_clean($cache_dir, $mode); + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + $idlist = null; + foreach ($tags as $tag) { + $next_idlist = output_cache_get(self::TAGS_PREFIX.$tag, $this->_directives['lifetime']); + if ($idlist) { + $idlist = array_intersect_assoc($idlist, $next_idlist); + } else { + $idlist = $next_idlist; + } + if (count($idlist) == 0) { + // if ID list is already empty - we may skip checking other IDs + $idlist = null; + break; + } + } + if ($idlist) { + foreach ($idlist as $id) { + output_cache_remove_key($id); + } + } + return true; + break; + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + $this->_log("Zend_Cache_Backend_ZendPlatform::clean() : CLEANING_MODE_NOT_MATCHING_TAG is not supported by the Zend Platform backend"); + return false; + break; + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $idlist = null; + foreach ($tags as $tag) { + $next_idlist = output_cache_get(self::TAGS_PREFIX.$tag, $this->_directives['lifetime']); + if ($idlist) { + $idlist = array_merge_recursive($idlist, $next_idlist); + } else { + $idlist = $next_idlist; + } + if (count($idlist) == 0) { + // if ID list is already empty - we may skip checking other IDs + $idlist = null; + break; + } + } + if ($idlist) { + foreach ($idlist as $id) { + output_cache_remove_key($id); + } + } + return true; + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } + + /** + * Clean a directory and recursivly go over it's subdirectories + * + * Remove all the cached files that need to be cleaned (according to mode and files mtime) + * + * @param string $dir Path of directory ot clean + * @param string $mode The same parameter as in Zend_Cache_Backend_ZendPlatform::clean() + * @return boolean True if ok + */ + private function _clean($dir, $mode) + { + $d = @dir($dir); + if (!$d) { + return false; + } + $result = true; + while (false !== ($file = $d->read())) { + if ($file == '.' || $file == '..') { + continue; + } + $file = $d->path . $file; + if (is_dir($file)) { + $result = ($this->_clean($file .'/', $mode)) && ($result); + } else { + if ($mode == Zend_Cache::CLEANING_MODE_ALL) { + $result = ($this->_remove($file)) && ($result); + } else if ($mode == Zend_Cache::CLEANING_MODE_OLD) { + // Files older than lifetime get deleted from cache + if ($this->_directives['lifetime'] !== null) { + if ((time() - @filemtime($file)) > $this->_directives['lifetime']) { + $result = ($this->_remove($file)) && ($result); + } + } + } + } + } + $d->close(); + return $result; + } + + /** + * Remove a file + * + * If we can't remove the file (because of locks or any problem), we will touch + * the file to invalidate it + * + * @param string $file Complete file path + * @return boolean True if ok + */ + private function _remove($file) + { + if (!@unlink($file)) { + # If we can't remove the file (because of locks or any problem), we will touch + # the file to invalidate it + $this->_log("Zend_Cache_Backend_ZendPlatform::_remove() : we can't remove $file => we are going to try to invalidate it"); + if ($this->_directives['lifetime'] === null) { + return false; + } + if (!file_exists($file)) { + return false; + } + return @touch($file, time() - 2*abs($this->_directives['lifetime'])); + } + return true; + } + +} diff --git a/lib/zend/Zend/Cache/Backend/ZendServer.php b/lib/zend/Zend/Cache/Backend/ZendServer.php new file mode 100755 index 0000000000..808fd42383 --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/ZendServer.php @@ -0,0 +1,207 @@ + (string) namespace : + * Namespace to be used for chaching operations + * + * @var array available options + */ + protected $_options = array( + 'namespace' => 'zendframework' + ); + + /** + * Store data + * + * @param mixed $data Object to store + * @param string $id Cache id + * @param int $timeToLive Time to live in seconds + * @throws Zend_Cache_Exception + */ + abstract protected function _store($data, $id, $timeToLive); + + /** + * Fetch data + * + * @param string $id Cache id + * @throws Zend_Cache_Exception + */ + abstract protected function _fetch($id); + + /** + * Unset data + * + * @param string $id Cache id + */ + abstract protected function _unset($id); + + /** + * Clear cache + */ + abstract protected function _clear(); + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id cache id + * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested + * @return string cached datas (or false) + */ + public function load($id, $doNotTestCacheValidity = false) + { + $tmp = $this->_fetch($id); + if ($tmp !== null) { + return $tmp; + } + return false; + } + + /** + * Test if a cache is available or not (for the given id) + * + * @param string $id cache id + * @return mixed false (a cache is not available) or "last modified" timestamp (int) of the available cache record + * @throws Zend_Cache_Exception + */ + public function test($id) + { + $tmp = $this->_fetch('internal-metadatas---' . $id); + if ($tmp !== false) { + if (!is_array($tmp) || !isset($tmp['mtime'])) { + Zend_Cache::throwException('Cache metadata for \'' . $id . '\' id is corrupted' ); + } + return $tmp['mtime']; + } + return false; + } + + /** + * Compute & return the expire time + * + * @return int expire time (unix timestamp) + */ + private function _expireTime($lifetime) + { + if ($lifetime === null) { + return 9999999999; + } + return time() + $lifetime; + } + + /** + * Save some string datas into a cache record + * + * Note : $data is always "string" (serialization is done by the + * core not by the backend) + * + * @param string $data datas to cache + * @param string $id cache id + * @param array $tags array of strings, the cache record will be tagged by each string entry + * @param int $specificLifetime if != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @return boolean true if no problem + */ + public function save($data, $id, $tags = array(), $specificLifetime = false) + { + $lifetime = $this->getLifetime($specificLifetime); + $metadatas = array( + 'mtime' => time(), + 'expire' => $this->_expireTime($lifetime), + ); + + if (count($tags) > 0) { + $this->_log('Zend_Cache_Backend_ZendServer::save() : tags are unsupported by the ZendServer backends'); + } + + return $this->_store($data, $id, $lifetime) && + $this->_store($metadatas, 'internal-metadatas---' . $id, $lifetime); + } + + /** + * Remove a cache record + * + * @param string $id cache id + * @return boolean true if no problem + */ + public function remove($id) + { + $result1 = $this->_unset($id); + $result2 = $this->_unset('internal-metadatas---' . $id); + + return $result1 && $result2; + } + + /** + * Clean some cache records + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => unsupported + * 'matchingTag' => unsupported + * 'notMatchingTag' => unsupported + * 'matchingAnyTag' => unsupported + * + * @param string $mode clean mode + * @param array $tags array of tags + * @throws Zend_Cache_Exception + * @return boolean true if no problem + */ + public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) + { + switch ($mode) { + case Zend_Cache::CLEANING_MODE_ALL: + $this->_clear(); + return true; + break; + case Zend_Cache::CLEANING_MODE_OLD: + $this->_log("Zend_Cache_Backend_ZendServer::clean() : CLEANING_MODE_OLD is unsupported by the Zend Server backends."); + break; + case Zend_Cache::CLEANING_MODE_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: + case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: + $this->_clear(); + $this->_log('Zend_Cache_Backend_ZendServer::clean() : tags are unsupported by the Zend Server backends.'); + break; + default: + Zend_Cache::throwException('Invalid mode for clean() method'); + break; + } + } +} diff --git a/lib/zend/Zend/Cache/Backend/ZendServer/Disk.php b/lib/zend/Zend/Cache/Backend/ZendServer/Disk.php new file mode 100755 index 0000000000..30f5e06e78 --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/ZendServer/Disk.php @@ -0,0 +1,100 @@ +_options['namespace'] . '::' . $id, + $data, + $timeToLive) === false) { + $this->_log('Store operation failed.'); + return false; + } + return true; + } + + /** + * Fetch data + * + * @param string $id Cache id + */ + protected function _fetch($id) + { + return zend_disk_cache_fetch($this->_options['namespace'] . '::' . $id); + } + + /** + * Unset data + * + * @param string $id Cache id + * @return boolean true if no problem + */ + protected function _unset($id) + { + return zend_disk_cache_delete($this->_options['namespace'] . '::' . $id); + } + + /** + * Clear cache + */ + protected function _clear() + { + zend_disk_cache_clear($this->_options['namespace']); + } +} diff --git a/lib/zend/Zend/Cache/Backend/ZendServer/ShMem.php b/lib/zend/Zend/Cache/Backend/ZendServer/ShMem.php new file mode 100755 index 0000000000..8cfc0344bf --- /dev/null +++ b/lib/zend/Zend/Cache/Backend/ZendServer/ShMem.php @@ -0,0 +1,100 @@ +_options['namespace'] . '::' . $id, + $data, + $timeToLive) === false) { + $this->_log('Store operation failed.'); + return false; + } + return true; + } + + /** + * Fetch data + * + * @param string $id Cache id + */ + protected function _fetch($id) + { + return zend_shm_cache_fetch($this->_options['namespace'] . '::' . $id); + } + + /** + * Unset data + * + * @param string $id Cache id + * @return boolean true if no problem + */ + protected function _unset($id) + { + return zend_shm_cache_delete($this->_options['namespace'] . '::' . $id); + } + + /** + * Clear cache + */ + protected function _clear() + { + zend_shm_cache_clear($this->_options['namespace']); + } +} diff --git a/lib/zend/Zend/Cache/Core.php b/lib/zend/Zend/Cache/Core.php new file mode 100644 index 0000000000..84b77733de --- /dev/null +++ b/lib/zend/Zend/Cache/Core.php @@ -0,0 +1,683 @@ + (boolean) write_control : + * - Enable / disable write control (the cache is read just after writing to detect corrupt entries) + * - Enable write control will lightly slow the cache writing but not the cache reading + * Write control can detect some corrupt cache files but maybe it's not a perfect control + * + * ====> (boolean) caching : + * - Enable / disable caching + * (can be very useful for the debug of cached scripts) + * + * =====> (string) cache_id_prefix : + * - prefix for cache ids (namespace) + * + * ====> (boolean) automatic_serialization : + * - Enable / disable automatic serialization + * - It can be used to save directly datas which aren't strings (but it's slower) + * + * ====> (int) automatic_cleaning_factor : + * - Disable / Tune the automatic cleaning process + * - The automatic cleaning process destroy too old (for the given life time) + * cache files when a new cache file is written : + * 0 => no automatic cache cleaning + * 1 => systematic cache cleaning + * x (integer) > 1 => automatic cleaning randomly 1 times on x cache write + * + * ====> (int) lifetime : + * - Cache lifetime (in seconds) + * - If null, the cache is valid forever. + * + * ====> (boolean) logging : + * - If set to true, logging is activated (but the system is slower) + * + * ====> (boolean) ignore_user_abort + * - If set to true, the core will set the ignore_user_abort PHP flag inside the + * save() method to avoid cache corruptions in some cases (default false) + * + * @var array $_options available options + */ + protected $_options = array( + 'write_control' => true, + 'caching' => true, + 'cache_id_prefix' => null, + 'automatic_serialization' => false, + 'automatic_cleaning_factor' => 10, + 'lifetime' => 3600, + 'logging' => false, + 'logger' => null, + 'ignore_user_abort' => false + ); + + /** + * Array of options which have to be transfered to backend + * + * @var array $_directivesList + */ + protected static $_directivesList = array('lifetime', 'logging', 'logger'); + + /** + * Not used for the core, just a sort a hint to get a common setOption() method (for the core and for frontends) + * + * @var array $_specificOptions + */ + protected $_specificOptions = array(); + + /** + * Last used cache id + * + * @var string $_lastId + */ + private $_lastId = null; + + /** + * True if the backend implements Zend_Cache_Backend_ExtendedInterface + * + * @var boolean $_extendedBackend + */ + protected $_extendedBackend = false; + + /** + * Array of capabilities of the backend (only if it implements Zend_Cache_Backend_ExtendedInterface) + * + * @var array + */ + protected $_backendCapabilities = array(); + + /** + * Constructor + * + * @param array|Zend_Config $options Associative array of options or Zend_Config instance + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct($options = array()) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + if (!is_array($options)) { + Zend_Cache::throwException("Options passed were not an array" + . " or Zend_Config instance."); + } + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + $this->_loggerSanity(); + } + + /** + * Set options using an instance of type Zend_Config + * + * @param Zend_Config $config + * @return Zend_Cache_Core + */ + public function setConfig(Zend_Config $config) + { + $options = $config->toArray(); + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + return $this; + } + + /** + * Set the backend + * + * @param object $backendObject + * @throws Zend_Cache_Exception + * @return void + */ + public function setBackend(Zend_Cache_Backend $backendObject) + { + $this->_backend= $backendObject; + // some options (listed in $_directivesList) have to be given + // to the backend too (even if they are not "backend specific") + $directives = array(); + foreach (Zend_Cache_Core::$_directivesList as $directive) { + $directives[$directive] = $this->_options[$directive]; + } + $this->_backend->setDirectives($directives); + if (in_array('Zend_Cache_Backend_ExtendedInterface', class_implements($this->_backend))) { + $this->_extendedBackend = true; + $this->_backendCapabilities = $this->_backend->getCapabilities(); + } + + } + + /** + * Returns the backend + * + * @return object backend object + */ + public function getBackend() + { + return $this->_backend; + } + + /** + * Public frontend to set an option + * + * There is an additional validation (relatively to the protected _setOption method) + * + * @param string $name Name of the option + * @param mixed $value Value of the option + * @throws Zend_Cache_Exception + * @return void + */ + public function setOption($name, $value) + { + if (!is_string($name)) { + Zend_Cache::throwException("Incorrect option name : $name"); + } + $name = strtolower($name); + if (array_key_exists($name, $this->_options)) { + // This is a Core option + $this->_setOption($name, $value); + return; + } + if (array_key_exists($name, $this->_specificOptions)) { + // This a specic option of this frontend + $this->_specificOptions[$name] = $value; + return; + } + } + + /** + * Public frontend to get an option value + * + * @param string $name Name of the option + * @throws Zend_Cache_Exception + * @return mixed option value + */ + public function getOption($name) + { + if (is_string($name)) { + $name = strtolower($name); + if (array_key_exists($name, $this->_options)) { + // This is a Core option + return $this->_options[$name]; + } + if (array_key_exists($name, $this->_specificOptions)) { + // This a specic option of this frontend + return $this->_specificOptions[$name]; + } + } + Zend_Cache::throwException("Incorrect option name : $name"); + } + + /** + * Set an option + * + * @param string $name Name of the option + * @param mixed $value Value of the option + * @throws Zend_Cache_Exception + * @return void + */ + private function _setOption($name, $value) + { + if (!is_string($name) || !array_key_exists($name, $this->_options)) { + Zend_Cache::throwException("Incorrect option name : $name"); + } + $this->_options[$name] = $value; + } + + /** + * Force a new lifetime + * + * The new value is set for the core/frontend but for the backend too (directive) + * + * @param int $newLifetime New lifetime (in seconds) + * @return void + */ + public function setLifetime($newLifetime) + { + $this->_options['lifetime'] = $newLifetime; + $this->_backend->setDirectives(array( + 'lifetime' => $newLifetime + )); + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @param boolean $doNotUnserialize Do not serialize (even if automatic_serialization is true) => for internal use + * @return mixed|false Cached datas + */ + public function load($id, $doNotTestCacheValidity = false, $doNotUnserialize = false) + { + if (!$this->_options['caching']) { + return false; + } + $id = $this->_id($id); // cache id may need prefix + $this->_lastId = $id; + self::_validateIdOrTag($id); + $data = $this->_backend->load($id, $doNotTestCacheValidity); + if ($data===false) { + // no cache available + return false; + } + if ((!$doNotUnserialize) && $this->_options['automatic_serialization']) { + // we need to unserialize before sending the result + return unserialize($data); + } + return $data; + } + + /** + * Test if a cache is available for the given id + * + * @param string $id Cache id + * @return boolean True is a cache is available, false else + */ + public function test($id) + { + if (!$this->_options['caching']) { + return false; + } + $id = $this->_id($id); // cache id may need prefix + self::_validateIdOrTag($id); + $this->_lastId = $id; + return $this->_backend->test($id); + } + + /** + * Save some data in a cache + * + * @param mixed $data Data to put in cache (can be another type than string if automatic_serialization is on) + * @param string $id Cache id (if not set, the last cache id will be used) + * @param array $tags Cache tags + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @param int $priority integer between 0 (very low priority) and 10 (maximum priority) used by some particular backends + * @throws Zend_Cache_Exception + * @return boolean True if no problem + */ + public function save($data, $id = null, $tags = array(), $specificLifetime = false, $priority = 8) + { + if (!$this->_options['caching']) { + return true; + } + if ($id === null) { + $id = $this->_lastId; + } else { + $id = $this->_id($id); + } + self::_validateIdOrTag($id); + self::_validateTagsArray($tags); + if ($this->_options['automatic_serialization']) { + // we need to serialize datas before storing them + $data = serialize($data); + } else { + if (!is_string($data)) { + Zend_Cache::throwException("Datas must be string or set automatic_serialization = true"); + } + } + // automatic cleaning + if ($this->_options['automatic_cleaning_factor'] > 0) { + $rand = rand(1, $this->_options['automatic_cleaning_factor']); + if ($rand==1) { + if ($this->_extendedBackend) { + // New way + if ($this->_backendCapabilities['automatic_cleaning']) { + $this->clean(Zend_Cache::CLEANING_MODE_OLD); + } else { + $this->_log('Zend_Cache_Core::save() / automatic cleaning is not available/necessary with this backend'); + } + } else { + // Deprecated way (will be removed in next major version) + if (method_exists($this->_backend, 'isAutomaticCleaningAvailable') && ($this->_backend->isAutomaticCleaningAvailable())) { + $this->clean(Zend_Cache::CLEANING_MODE_OLD); + } else { + $this->_log('Zend_Cache_Core::save() / automatic cleaning is not available/necessary with this backend'); + } + } + } + } + if ($this->_options['ignore_user_abort']) { + $abort = ignore_user_abort(true); + } + if (($this->_extendedBackend) && ($this->_backendCapabilities['priority'])) { + $result = $this->_backend->save($data, $id, $tags, $specificLifetime, $priority); + } else { + $result = $this->_backend->save($data, $id, $tags, $specificLifetime); + } + if ($this->_options['ignore_user_abort']) { + ignore_user_abort($abort); + } + if (!$result) { + // maybe the cache is corrupted, so we remove it ! + if ($this->_options['logging']) { + $this->_log("Zend_Cache_Core::save() : impossible to save cache (id=$id)"); + } + $this->remove($id); + return false; + } + if ($this->_options['write_control']) { + $data2 = $this->_backend->load($id, true); + if ($data!=$data2) { + $this->_log('Zend_Cache_Core::save() / write_control : written and read data do not match'); + $this->_backend->remove($id); + return false; + } + } + return true; + } + + /** + * Remove a cache + * + * @param string $id Cache id to remove + * @return boolean True if ok + */ + public function remove($id) + { + if (!$this->_options['caching']) { + return true; + } + $id = $this->_id($id); // cache id may need prefix + self::_validateIdOrTag($id); + return $this->_backend->remove($id); + } + + /** + * Clean cache entries + * + * Available modes are : + * 'all' (default) => remove all cache entries ($tags is not used) + * 'old' => remove too old cache entries ($tags is not used) + * 'matchingTag' => remove cache entries matching all given tags + * ($tags can be an array of strings or a single string) + * 'notMatchingTag' => remove cache entries not matching one of the given tags + * ($tags can be an array of strings or a single string) + * 'matchingAnyTag' => remove cache entries matching any given tags + * ($tags can be an array of strings or a single string) + * + * @param string $mode + * @param array|string $tags + * @throws Zend_Cache_Exception + * @return boolean True if ok + */ + public function clean($mode = 'all', $tags = array()) + { + if (!$this->_options['caching']) { + return true; + } + if (!in_array($mode, array(Zend_Cache::CLEANING_MODE_ALL, + Zend_Cache::CLEANING_MODE_OLD, + Zend_Cache::CLEANING_MODE_MATCHING_TAG, + Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, + Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG))) { + Zend_Cache::throwException('Invalid cleaning mode'); + } + self::_validateTagsArray($tags); + return $this->_backend->clean($mode, $tags); + } + + /** + * Return an array of stored cache ids which match given tags + * + * In case of multiple tags, a logical AND is made between tags + * + * @param array $tags array of tags + * @return array array of matching cache ids (string) + */ + public function getIdsMatchingTags($tags = array()) + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + if (!($this->_backendCapabilities['tags'])) { + Zend_Cache::throwException('tags are not supported by the current backend'); + } + return $this->_backend->getIdsMatchingTags($tags); + } + + /** + * Return an array of stored cache ids which don't match given tags + * + * In case of multiple tags, a logical OR is made between tags + * + * @param array $tags array of tags + * @return array array of not matching cache ids (string) + */ + public function getIdsNotMatchingTags($tags = array()) + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + if (!($this->_backendCapabilities['tags'])) { + Zend_Cache::throwException('tags are not supported by the current backend'); + } + return $this->_backend->getIdsNotMatchingTags($tags); + } + + /** + * Return an array of stored cache ids + * + * @return array array of stored cache ids (string) + */ + public function getIds() + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + $array = $this->_backend->getIds(); + if ((!isset($this->_options['cache_id_prefix'])) || ($this->_options['cache_id_prefix'] == '')) return $array; + // we need to remove cache_id_prefix from ids (see #ZF-6178) + $res = array(); + while (list(,$id) = each($array)) { + if (strpos($id, $this->_options['cache_id_prefix']) === 0) { + $res[] = preg_replace("~^{$this->_options['cache_id_prefix']}~", '', $id); + } else { + $res[] = $id; + } + } + return $res; + } + + /** + * Return an array of stored tags + * + * @return array array of stored tags (string) + */ + public function getTags() + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + if (!($this->_backendCapabilities['tags'])) { + Zend_Cache::throwException('tags are not supported by the current backend'); + } + return $this->_backend->getTags(); + } + + /** + * Return the filling percentage of the backend storage + * + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + return $this->_backend->getFillingPercentage(); + } + + /** + * Return an array of metadatas for the given cache id + * + * The array will include these keys : + * - expire : the expire timestamp + * - tags : a string array of tags + * - mtime : timestamp of last modification time + * + * @param string $id cache id + * @return array array of metadatas (false if the cache id is not found) + */ + public function getMetadatas($id) + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + $id = $this->_id($id); // cache id may need prefix + return $this->_backend->getMetadatas($id); + } + + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $id cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($id, $extraLifetime) + { + if (!$this->_extendedBackend) { + Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); + } + $id = $this->_id($id); // cache id may need prefix + return $this->_backend->touch($id, $extraLifetime); + } + + /** + * Validate a cache id or a tag (security, reliable filenames, reserved prefixes...) + * + * Throw an exception if a problem is found + * + * @param string $string Cache id or tag + * @throws Zend_Cache_Exception + * @return void + */ + protected static function _validateIdOrTag($string) + { + if (!is_string($string)) { + Zend_Cache::throwException('Invalid id or tag : must be a string'); + } + if (substr($string, 0, 9) == 'internal-') { + Zend_Cache::throwException('"internal-*" ids or tags are reserved'); + } + if (!preg_match('~^[\w]+$~D', $string)) { + Zend_Cache::throwException("Invalid id or tag '$string' : must use only [a-zA-Z0-9_]"); + } + } + + /** + * Validate a tags array (security, reliable filenames, reserved prefixes...) + * + * Throw an exception if a problem is found + * + * @param array $tags Array of tags + * @throws Zend_Cache_Exception + * @return void + */ + protected static function _validateTagsArray($tags) + { + if (!is_array($tags)) { + Zend_Cache::throwException('Invalid tags array : must be an array'); + } + foreach($tags as $tag) { + self::_validateIdOrTag($tag); + } + reset($tags); + } + + /** + * Make sure if we enable logging that the Zend_Log class + * is available. + * Create a default log object if none is set. + * + * @throws Zend_Cache_Exception + * @return void + */ + protected function _loggerSanity() + { + if (!isset($this->_options['logging']) || !$this->_options['logging']) { + return; + } + + if (isset($this->_options['logger']) && $this->_options['logger'] instanceof Zend_Log) { + return; + } + + // Create a default logger to the standard output stream + require_once 'Zend/Log/Writer/Stream.php'; + $logger = new Zend_Log(new Zend_Log_Writer_Stream('php://output')); + $this->_options['logger'] = $logger; + } + + /** + * Log a message at the WARN (4) priority. + * + * @param string $message + * @throws Zend_Cache_Exception + * @return void + */ + protected function _log($message, $priority = 4) + { + if (!$this->_options['logging']) { + return; + } + if (!(isset($this->_options['logger']) || $this->_options['logger'] instanceof Zend_Log)) { + Zend_Cache::throwException('Logging is enabled but logger is not set'); + } + $logger = $this->_options['logger']; + $logger->log($message, $priority); + } + + /** + * Make and return a cache id + * + * Checks 'cache_id_prefix' and returns new id with prefix or simply the id if null + * + * @param string $id Cache id + * @return string Cache id (with or without prefix) + */ + protected function _id($id) + { + if (($id !== null) && isset($this->_options['cache_id_prefix'])) { + return $this->_options['cache_id_prefix'] . $id; // return with prefix + } + return $id; // no prefix, just return the $id passed + } + +} diff --git a/lib/zend/Zend/Cache/Exception.php b/lib/zend/Zend/Cache/Exception.php new file mode 100644 index 0000000000..7c2d56f61d --- /dev/null +++ b/lib/zend/Zend/Cache/Exception.php @@ -0,0 +1,32 @@ + (mixed) cached_entity : + * - if set to a class name, we will cache an abstract class and will use only static calls + * - if set to an object, we will cache this object methods + * + * ====> (boolean) cache_by_default : + * - if true, method calls will be cached by default + * + * ====> (array) cached_methods : + * - an array of method names which will be cached (even if cache_by_default = false) + * + * ====> (array) non_cached_methods : + * - an array of method names which won't be cached (even if cache_by_default = true) + * + * @var array available options + */ + protected $_specificOptions = array( + 'cached_entity' => null, + 'cache_by_default' => true, + 'cached_methods' => array(), + 'non_cached_methods' => array() + ); + + /** + * Tags array + * + * @var array + */ + private $_tags = array(); + + /** + * SpecificLifetime value + * + * false => no specific life time + * + * @var int + */ + private $_specificLifetime = false; + + /** + * The cached object or the name of the cached abstract class + * + * @var mixed + */ + private $_cachedEntity = null; + + /** + * The class name of the cached object or cached abstract class + * + * Used to differentiate between different classes with the same method calls. + * + * @var string + */ + private $_cachedEntityLabel = ''; + + /** + * Priority (used by some particular backends) + * + * @var int + */ + private $_priority = 8; + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + if ($this->_specificOptions['cached_entity'] === null) { + Zend_Cache::throwException('cached_entity must be set !'); + } + $this->setCachedEntity($this->_specificOptions['cached_entity']); + $this->setOption('automatic_serialization', true); + } + + /** + * Set a specific life time + * + * @param int $specificLifetime + * @return void + */ + public function setSpecificLifetime($specificLifetime = false) + { + $this->_specificLifetime = $specificLifetime; + } + + /** + * Set the priority (used by some particular backends) + * + * @param int $priority integer between 0 (very low priority) and 10 (maximum priority) + */ + public function setPriority($priority) + { + $this->_priority = $priority; + } + + /** + * Public frontend to set an option + * + * Just a wrapper to get a specific behaviour for cached_entity + * + * @param string $name Name of the option + * @param mixed $value Value of the option + * @throws Zend_Cache_Exception + * @return void + */ + public function setOption($name, $value) + { + if ($name == 'cached_entity') { + $this->setCachedEntity($value); + } else { + parent::setOption($name, $value); + } + } + + /** + * Specific method to set the cachedEntity + * + * if set to a class name, we will cache an abstract class and will use only static calls + * if set to an object, we will cache this object methods + * + * @param mixed $cachedEntity + */ + public function setCachedEntity($cachedEntity) + { + if (!is_string($cachedEntity) && !is_object($cachedEntity)) { + Zend_Cache::throwException('cached_entity must be an object or a class name'); + } + $this->_cachedEntity = $cachedEntity; + $this->_specificOptions['cached_entity'] = $cachedEntity; + if (is_string($this->_cachedEntity)){ + $this->_cachedEntityLabel = $this->_cachedEntity; + } else { + $ro = new ReflectionObject($this->_cachedEntity); + $this->_cachedEntityLabel = $ro->getName(); + } + } + + /** + * Set the cache array + * + * @param array $tags + * @return void + */ + public function setTagsArray($tags = array()) + { + $this->_tags = $tags; + } + + /** + * Main method : call the specified method or get the result from cache + * + * @param string $name Method name + * @param array $parameters Method parameters + * @return mixed Result + */ + public function __call($name, $parameters) + { + $cacheBool1 = $this->_specificOptions['cache_by_default']; + $cacheBool2 = in_array($name, $this->_specificOptions['cached_methods']); + $cacheBool3 = in_array($name, $this->_specificOptions['non_cached_methods']); + $cache = (($cacheBool1 || $cacheBool2) && (!$cacheBool3)); + if (!$cache) { + // We do not have not cache + return call_user_func_array(array($this->_cachedEntity, $name), $parameters); + } + $id = $this->_makeId($name, $parameters); + if ($this->test($id)) { + // A cache is available + $result = $this->load($id); + $output = $result[0]; + $return = $result[1]; + } else { + // A cache is not available + ob_start(); + ob_implicit_flush(false); + $return = call_user_func_array(array($this->_cachedEntity, $name), $parameters); + $output = ob_get_contents(); + ob_end_clean(); + $data = array($output, $return); + $this->save($data, $id, $this->_tags, $this->_specificLifetime, $this->_priority); + } + echo $output; + return $return; + } + + /** + * Make a cache id from the method name and parameters + * + * @param string $name Method name + * @param array $parameters Method parameters + * @return string Cache id + */ + private function _makeId($name, $parameters) + { + return md5($this->_cachedEntityLabel . '__' . $name . '__' . serialize($parameters)); + } + +} diff --git a/lib/zend/Zend/Cache/Frontend/File.php b/lib/zend/Zend/Cache/Frontend/File.php new file mode 100644 index 0000000000..84fa84dd6b --- /dev/null +++ b/lib/zend/Zend/Cache/Frontend/File.php @@ -0,0 +1,209 @@ + (string) master_file : + * - a complete path of the master file + * - deprecated (see master_files) + * + * ====> (array) master_files : + * - an array of complete path of master files + * - this option has to be set ! + * + * ====> (string) master_files_mode : + * - Zend_Cache_Frontend_File::MODE_AND or Zend_Cache_Frontend_File::MODE_OR + * - if MODE_AND, then all master files have to be touched to get a cache invalidation + * - if MODE_OR (default), then a single touched master file is enough to get a cache invalidation + * + * ====> (boolean) ignore_missing_master_files + * - if set to true, missing master files are ignored silently + * - if set to false (default), an exception is thrown if there is a missing master file + * @var array available options + */ + protected $_specificOptions = array( + 'master_file' => null, + 'master_files' => null, + 'master_files_mode' => 'OR', + 'ignore_missing_master_files' => false + ); + + /** + * Master file mtimes + * + * Array of int + * + * @var array + */ + private $_masterFile_mtimes = null; + + /** + * Constructor + * + * @param array $options Associative array of options + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + if (!isset($this->_specificOptions['master_files'])) { + Zend_Cache::throwException('master_files option must be set'); + } + } + + /** + * Change the master_file option + * + * @param string $masterFile the complete path and name of the master file + */ + public function setMasterFiles($masterFiles) + { + clearstatcache(); + $this->_specificOptions['master_file'] = $masterFiles[0]; // to keep a compatibility + $this->_specificOptions['master_files'] = $masterFiles; + $this->_masterFile_mtimes = array(); + $i = 0; + foreach ($masterFiles as $masterFile) { + $this->_masterFile_mtimes[$i] = @filemtime($masterFile); + if ((!($this->_specificOptions['ignore_missing_master_files'])) && (!($this->_masterFile_mtimes[$i]))) { + Zend_Cache::throwException('Unable to read master_file : '.$masterFile); + } + $i++; + } + } + + /** + * Change the master_file option + * + * To keep the compatibility + * + * @deprecated + * @param string $masterFile the complete path and name of the master file + */ + public function setMasterFile($masterFile) + { + $this->setMasterFiles(array(0 => $masterFile)); + } + + /** + * Public frontend to set an option + * + * Just a wrapper to get a specific behaviour for master_file + * + * @param string $name Name of the option + * @param mixed $value Value of the option + * @throws Zend_Cache_Exception + * @return void + */ + public function setOption($name, $value) + { + if ($name == 'master_file') { + $this->setMasterFile($value); + } else if ($name == 'master_files') { + $this->setMasterFiles($value); + } else { + parent::setOption($name, $value); + } + } + + /** + * Test if a cache is available for the given id and (if yes) return it (false else) + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @param boolean $doNotUnserialize Do not serialize (even if automatic_serialization is true) => for internal use + * @return mixed|false Cached datas + */ + public function load($id, $doNotTestCacheValidity = false, $doNotUnserialize = false) + { + if (!$doNotTestCacheValidity) { + if ($this->test($id)) { + return parent::load($id, true, $doNotUnserialize); + } + return false; + } + return parent::load($id, true, $doNotUnserialize); + } + + /** + * Test if a cache is available for the given id + * + * @param string $id Cache id + * @return boolean True is a cache is available, false else + */ + public function test($id) + { + $lastModified = parent::test($id); + if ($lastModified) { + if ($this->_specificOptions['master_files_mode'] == self::MODE_AND) { + // MODE_AND + foreach($this->_masterFile_mtimes as $masterFileMTime) { + if ($masterFileMTime) { + if ($lastModified > $masterFileMTime) { + return $lastModified; + } + } + } + } else { + // MODE_OR + $res = true; + foreach($this->_masterFile_mtimes as $masterFileMTime) { + if ($masterFileMTime) { + if ($lastModified <= $masterFileMTime) { + return false; + } + } + } + return $lastModified; + } + } + return false; + } + +} + diff --git a/lib/zend/Zend/Cache/Frontend/Function.php b/lib/zend/Zend/Cache/Frontend/Function.php new file mode 100644 index 0000000000..36a8d93e85 --- /dev/null +++ b/lib/zend/Zend/Cache/Frontend/Function.php @@ -0,0 +1,131 @@ + (boolean) cache_by_default : + * - if true, function calls will be cached by default + * + * ====> (array) cached_functions : + * - an array of function names which will be cached (even if cache_by_default = false) + * + * ====> (array) non_cached_functions : + * - an array of function names which won't be cached (even if cache_by_default = true) + * + * @var array options + */ + protected $_specificOptions = array( + 'cache_by_default' => true, + 'cached_functions' => array(), + 'non_cached_functions' => array() + ); + + /** + * Constructor + * + * @param array $options Associative array of options + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + $this->setOption('automatic_serialization', true); + } + + /** + * Main method : call the specified function or get the result from cache + * + * @param string $name Function name + * @param array $parameters Function parameters + * @param array $tags Cache tags + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @param int $priority integer between 0 (very low priority) and 10 (maximum priority) used by some particular backends + * @return mixed Result + */ + public function call($name, $parameters = array(), $tags = array(), $specificLifetime = false, $priority = 8) + { + $cacheBool1 = $this->_specificOptions['cache_by_default']; + $cacheBool2 = in_array($name, $this->_specificOptions['cached_functions']); + $cacheBool3 = in_array($name, $this->_specificOptions['non_cached_functions']); + $cache = (($cacheBool1 || $cacheBool2) && (!$cacheBool3)); + if (!$cache) { + // We do not have not cache + return call_user_func_array($name, $parameters); + } + $id = $this->_makeId($name, $parameters); + if ($this->test($id)) { + // A cache is available + $result = $this->load($id); + $output = $result[0]; + $return = $result[1]; + } else { + // A cache is not available + ob_start(); + ob_implicit_flush(false); + $return = call_user_func_array($name, $parameters); + $output = ob_get_contents(); + ob_end_clean(); + $data = array($output, $return); + $this->save($data, $id, $tags, $specificLifetime, $priority); + } + echo $output; + return $return; + } + + /** + * Make a cache id from the function name and parameters + * + * @param string $name Function name + * @param array $parameters Function parameters + * @throws Zend_Cache_Exception + * @return string Cache id + */ + private function _makeId($name, $parameters) + { + if (!is_string($name)) { + Zend_Cache::throwException('Incorrect function name'); + } + if (!is_array($parameters)) { + Zend_Cache::throwException('parameters argument must be an array'); + } + return md5($name . serialize($parameters)); + } + +} diff --git a/lib/zend/Zend/Cache/Frontend/Output.php b/lib/zend/Zend/Cache/Frontend/Output.php new file mode 100644 index 0000000000..8b5d925c45 --- /dev/null +++ b/lib/zend/Zend/Cache/Frontend/Output.php @@ -0,0 +1,106 @@ +_idStack = array(); + } + + /** + * Start the cache + * + * @param string $id Cache id + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @param boolean $echoData If set to true, datas are sent to the browser if the cache is hit (simpy returned else) + * @return mixed True if the cache is hit (false else) with $echoData=true (default) ; string else (datas) + */ + public function start($id, $doNotTestCacheValidity = false, $echoData = true) + { + $data = $this->load($id, $doNotTestCacheValidity); + if ($data !== false) { + if ( $echoData ) { + echo($data); + return true; + } else { + return $data; + } + } + ob_start(); + ob_implicit_flush(false); + $this->_idStack[] = $id; + return false; + } + + /** + * Stop the cache + * + * @param array $tags Tags array + * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) + * @param string $forcedDatas If not null, force written datas with this + * @param boolean $echoData If set to true, datas are sent to the browser + * @param int $priority integer between 0 (very low priority) and 10 (maximum priority) used by some particular backends + * @return void + */ + public function end($tags = array(), $specificLifetime = false, $forcedDatas = null, $echoData = true, $priority = 8) + { + if ($forcedDatas === null) { + $data = ob_get_contents(); + ob_end_clean(); + } else { + $data =& $forcedDatas; + } + $id = array_pop($this->_idStack); + if ($id === null) { + Zend_Cache::throwException('use of end() without a start()'); + } + $this->save($data, $id, $tags, $specificLifetime, $priority); + if ($echoData) { + echo($data); + } + } + +} diff --git a/lib/zend/Zend/Cache/Frontend/Page.php b/lib/zend/Zend/Cache/Frontend/Page.php new file mode 100644 index 0000000000..da68855edd --- /dev/null +++ b/lib/zend/Zend/Cache/Frontend/Page.php @@ -0,0 +1,402 @@ + (boolean) http_conditional : + * - if true, http conditional mode is on + * WARNING : http_conditional OPTION IS NOT IMPLEMENTED FOR THE MOMENT (TODO) + * + * ====> (boolean) debug_header : + * - if true, a debug text is added before each cached pages + * + * ====> (boolean) content_type_memorization : + * - deprecated => use memorize_headers instead + * - if the Content-Type header is sent after the cache was started, the + * corresponding value can be memorized and replayed when the cache is hit + * (if false (default), the frontend doesn't take care of Content-Type header) + * + * ====> (array) memorize_headers : + * - an array of strings corresponding to some HTTP headers name. Listed headers + * will be stored with cache datas and "replayed" when the cache is hit + * + * ====> (array) default_options : + * - an associative array of default options : + * - (boolean) cache : cache is on by default if true + * - (boolean) cacheWithXXXVariables (XXXX = 'Get', 'Post', 'Session', 'Files' or 'Cookie') : + * if true, cache is still on even if there are some variables in this superglobal array + * if false, cache is off if there are some variables in this superglobal array + * - (boolean) makeIdWithXXXVariables (XXXX = 'Get', 'Post', 'Session', 'Files' or 'Cookie') : + * if true, we have to use the content of this superglobal array to make a cache id + * if false, the cache id won't be dependent of the content of this superglobal array + * - (int) specific_lifetime : cache specific lifetime + * (false => global lifetime is used, null => infinite lifetime, + * integer => this lifetime is used), this "lifetime" is probably only + * usefull when used with "regexps" array + * - (array) tags : array of tags (strings) + * - (int) priority : integer between 0 (very low priority) and 10 (maximum priority) used by + * some particular backends + * + * ====> (array) regexps : + * - an associative array to set options only for some REQUEST_URI + * - keys are (pcre) regexps + * - values are associative array with specific options to set if the regexp matchs on $_SERVER['REQUEST_URI'] + * (see default_options for the list of available options) + * - if several regexps match the $_SERVER['REQUEST_URI'], only the last one will be used + * + * @var array options + */ + protected $_specificOptions = array( + 'http_conditional' => false, + 'debug_header' => false, + 'content_type_memorization' => false, + 'memorize_headers' => array(), + 'default_options' => array( + 'cache_with_get_variables' => false, + 'cache_with_post_variables' => false, + 'cache_with_session_variables' => false, + 'cache_with_files_variables' => false, + 'cache_with_cookie_variables' => false, + 'make_id_with_get_variables' => true, + 'make_id_with_post_variables' => true, + 'make_id_with_session_variables' => true, + 'make_id_with_files_variables' => true, + 'make_id_with_cookie_variables' => true, + 'cache' => true, + 'specific_lifetime' => false, + 'tags' => array(), + 'priority' => null + ), + 'regexps' => array() + ); + + /** + * Internal array to store some options + * + * @var array associative array of options + */ + protected $_activeOptions = array(); + + /** + * If true, the page won't be cached + * + * @var boolean + */ + protected $_cancel = false; + + /** + * Constructor + * + * @param array $options Associative array of options + * @param boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested + * @throws Zend_Cache_Exception + * @return void + */ + public function __construct(array $options = array()) + { + while (list($name, $value) = each($options)) { + $name = strtolower($name); + switch ($name) { + case 'regexps': + $this->_setRegexps($value); + break; + case 'default_options': + $this->_setDefaultOptions($value); + break; + case 'content_type_memorization': + $this->_setContentTypeMemorization($value); + break; + default: + $this->setOption($name, $value); + } + } + if (isset($this->_specificOptions['http_conditional'])) { + if ($this->_specificOptions['http_conditional']) { + Zend_Cache::throwException('http_conditional is not implemented for the moment !'); + } + } + $this->setOption('automatic_serialization', true); + } + + /** + * Specific setter for the 'default_options' option (with some additional tests) + * + * @param array $options Associative array + * @throws Zend_Cache_Exception + * @return void + */ + protected function _setDefaultOptions($options) + { + if (!is_array($options)) { + Zend_Cache::throwException('default_options must be an array !'); + } + foreach ($options as $key=>$value) { + if (!is_string($key)) { + Zend_Cache::throwException("invalid option [$key] !"); + } + $key = strtolower($key); + if (isset($this->_specificOptions['default_options'][$key])) { + $this->_specificOptions['default_options'][$key] = $value; + } + } + } + + /** + * Set the deprecated contentTypeMemorization option + * + * @param boolean $value value + * @return void + * @deprecated + */ + protected function _setContentTypeMemorization($value) + { + $found = null; + foreach ($this->_specificOptions['memorize_headers'] as $key => $value) { + if (strtolower($value) == 'content-type') { + $found = $key; + } + } + if ($value) { + if (!$found) { + $this->_specificOptions['memorize_headers'][] = 'Content-Type'; + } + } else { + if ($found) { + unset($this->_specificOptions['memorize_headers'][$found]); + } + } + } + + /** + * Specific setter for the 'regexps' option (with some additional tests) + * + * @param array $options Associative array + * @throws Zend_Cache_Exception + * @return void + */ + protected function _setRegexps($regexps) + { + if (!is_array($regexps)) { + Zend_Cache::throwException('regexps option must be an array !'); + } + foreach ($regexps as $regexp=>$conf) { + if (!is_array($conf)) { + Zend_Cache::throwException('regexps option must be an array of arrays !'); + } + $validKeys = array_keys($this->_specificOptions['default_options']); + foreach ($conf as $key=>$value) { + if (!is_string($key)) { + Zend_Cache::throwException("unknown option [$key] !"); + } + $key = strtolower($key); + if (!in_array($key, $validKeys)) { + unset($regexps[$regexp][$key]); + } + } + } + $this->setOption('regexps', $regexps); + } + + /** + * Start the cache + * + * @param string $id (optional) A cache id (if you set a value here, maybe you have to use Output frontend instead) + * @param boolean $doNotDie For unit testing only ! + * @return boolean True if the cache is hit (false else) + */ + public function start($id = false, $doNotDie = false) + { + $this->_cancel = false; + $lastMatchingRegexp = null; + foreach ($this->_specificOptions['regexps'] as $regexp => $conf) { + if (preg_match("`$regexp`", $_SERVER['REQUEST_URI'])) { + $lastMatchingRegexp = $regexp; + } + } + $this->_activeOptions = $this->_specificOptions['default_options']; + if ($lastMatchingRegexp !== null) { + $conf = $this->_specificOptions['regexps'][$lastMatchingRegexp]; + foreach ($conf as $key=>$value) { + $this->_activeOptions[$key] = $value; + } + } + if (!($this->_activeOptions['cache'])) { + return false; + } + if (!$id) { + $id = $this->_makeId(); + if (!$id) { + return false; + } + } + $array = $this->load($id); + if ($array !== false) { + $data = $array['data']; + $headers = $array['headers']; + if (!headers_sent()) { + foreach ($headers as $key=>$headerCouple) { + $name = $headerCouple[0]; + $value = $headerCouple[1]; + header("$name: $value"); + } + } + if ($this->_specificOptions['debug_header']) { + echo 'DEBUG HEADER : This is a cached page !'; + } + echo $data; + if ($doNotDie) { + return true; + } + die(); + } + ob_start(array($this, '_flush')); + ob_implicit_flush(false); + return false; + } + + /** + * Cancel the current caching process + */ + public function cancel() + { + $this->_cancel = true; + } + + /** + * callback for output buffering + * (shouldn't really be called manually) + * + * @param string $data Buffered output + * @return string Data to send to browser + */ + public function _flush($data) + { + if ($this->_cancel) { + return $data; + } + $contentType = null; + $storedHeaders = array(); + $headersList = headers_list(); + foreach($this->_specificOptions['memorize_headers'] as $key=>$headerName) { + foreach ($headersList as $headerSent) { + $tmp = explode(':', $headerSent); + $headerSentName = trim(array_shift($tmp)); + if (strtolower($headerName) == strtolower($headerSentName)) { + $headerSentValue = trim(implode(':', $tmp)); + $storedHeaders[] = array($headerSentName, $headerSentValue); + } + } + } + $array = array( + 'data' => $data, + 'headers' => $storedHeaders + ); + $this->save($array, null, $this->_activeOptions['tags'], $this->_activeOptions['specific_lifetime'], $this->_activeOptions['priority']); + return $data; + } + + /** + * Make an id depending on REQUEST_URI and superglobal arrays (depending on options) + * + * @return mixed|false a cache id (string), false if the cache should have not to be used + */ + protected function _makeId() + { + $tmp = $_SERVER['REQUEST_URI']; + $array = explode('?', $tmp, 2); + $tmp = $array[0]; + foreach (array('Get', 'Post', 'Session', 'Files', 'Cookie') as $arrayName) { + $tmp2 = $this->_makePartialId($arrayName, $this->_activeOptions['cache_with_' . strtolower($arrayName) . '_variables'], $this->_activeOptions['make_id_with_' . strtolower($arrayName) . '_variables']); + if ($tmp2===false) { + return false; + } + $tmp = $tmp . $tmp2; + } + return md5($tmp); + } + + /** + * Make a partial id depending on options + * + * @param string $arrayName Superglobal array name + * @param bool $bool1 If true, cache is still on even if there are some variables in the superglobal array + * @param bool $bool2 If true, we have to use the content of the superglobal array to make a partial id + * @return mixed|false Partial id (string) or false if the cache should have not to be used + */ + protected function _makePartialId($arrayName, $bool1, $bool2) + { + switch ($arrayName) { + case 'Get': + $var = $_GET; + break; + case 'Post': + $var = $_POST; + break; + case 'Session': + if (isset($_SESSION)) { + $var = $_SESSION; + } else { + $var = null; + } + break; + case 'Cookie': + if (isset($_COOKIE)) { + $var = $_COOKIE; + } else { + $var = null; + } + break; + case 'Files': + $var = $_FILES; + break; + default: + return false; + } + if ($bool1) { + if ($bool2) { + return serialize($var); + } + return ''; + } + if (count($var) > 0) { + return false; + } + return ''; + } + +} diff --git a/lib/zend/Zend/Captcha/Adapter.php b/lib/zend/Zend/Captcha/Adapter.php new file mode 100644 index 0000000000..f7a6b62fee --- /dev/null +++ b/lib/zend/Zend/Captcha/Adapter.php @@ -0,0 +1,76 @@ +_name; + } + + /** + * Set name + * + * @param string $name + */ + public function setName($name) + { + $this->_name = $name; + return $this; + } + + /** + * Constructor + * + * @param array|Zend_Config $options + * @return void + */ + public function __construct($options = null) + { + // Set options + if (is_array($options)) { + $this->setOptions($options); + } else if ($options instanceof Zend_Config) { + $this->setConfig($options); + } + } + + /** + * Set single option for the object + * + * @param string $key + * @param string $value + * @return Zend_Form_Element + */ + public function setOption($key, $value) + { + if (in_array(strtolower($key), $this->_skipOptions)) { + return $this; + } + + $method = 'set' . ucfirst ($key); + if (method_exists ($this, $method)) { + // Setter exists; use it + $this->$method ($value); + $this->_options[$key] = $value; + } elseif (property_exists($this, $key)) { + // Assume it's metadata + $this->$key = $value; + $this->_options[$key] = $value; + } + return $this; + } + + /** + * Set object state from options array + * + * @param array $options + * @return Zend_Form_Element + */ + public function setOptions($options = null) + { + foreach ($options as $key => $value) { + $this->setOption($key, $value); + } + return $this; + } + + /** + * Retrieve options representing object state + * + * @return array + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Set object state from config object + * + * @param Zend_Config $config + * @return Zend_Captcha_Base + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Get optional decorator + * + * By default, return null, indicating no extra decorator needed. + * + * @return null + */ + public function getDecorator() + { + return null; + } +} diff --git a/lib/zend/Zend/Captcha/Dumb.php b/lib/zend/Zend/Captcha/Dumb.php new file mode 100644 index 0000000000..6db34c4bba --- /dev/null +++ b/lib/zend/Zend/Captcha/Dumb.php @@ -0,0 +1,52 @@ +' + . strrev($this->getWord()) + . ''; + } +} diff --git a/lib/zend/Zend/Captcha/Exception.php b/lib/zend/Zend/Captcha/Exception.php new file mode 100755 index 0000000000..fc2d88cb7d --- /dev/null +++ b/lib/zend/Zend/Captcha/Exception.php @@ -0,0 +1,34 @@ +_figlet = new Zend_Text_Figlet($options); + } + + /** + * Generate new captcha + * + * @return string + */ + public function generate() + { + $this->_useNumbers = false; + return parent::generate(); + } + + /** + * Display the captcha + * + * @param Zend_View_Interface $view + * @param mixed $element + * @return string + */ + public function render(Zend_View_Interface $view = null, $element = null) + { + return '
'
+             . $this->_figlet->render($this->getWord())
+             . "
\n"; + } +} diff --git a/lib/zend/Zend/Captcha/Image.php b/lib/zend/Zend/Captcha/Image.php new file mode 100644 index 0000000000..8f10837129 --- /dev/null +++ b/lib/zend/Zend/Captcha/Image.php @@ -0,0 +1,600 @@ +_imgAlt; + } + /** + * @return string + */ + public function getStartImage () + { + return $this->_startImage; + } + /** + * @return int + */ + public function getDotNoiseLevel () + { + return $this->_dotNoiseLevel; + } + /** + * @return int + */ + public function getLineNoiseLevel () + { + return $this->_lineNoiseLevel; + } + /** + * Get captcha expiration + * + * @return int + */ + public function getExpiration() + { + return $this->_expiration; + } + + /** + * Get garbage collection frequency + * + * @return int + */ + public function getGcFreq() + { + return $this->_gcFreq; + } + /** + * Get font to use when generating captcha + * + * @return string + */ + public function getFont() + { + return $this->_font; + } + + /** + * Get font size + * + * @return int + */ + public function getFontSize() + { + return $this->_fsize; + } + + /** + * Get captcha image height + * + * @return int + */ + public function getHeight() + { + return $this->_height; + } + + /** + * Get captcha image directory + * + * @return string + */ + public function getImgDir() + { + return $this->_imgDir; + } + /** + * Get captcha image base URL + * + * @return string + */ + public function getImgUrl() + { + return $this->_imgUrl; + } + /** + * Get captcha image file suffix + * + * @return string + */ + public function getSuffix() + { + return $this->_suffix; + } + /** + * Get captcha image width + * + * @return int + */ + public function getWidth() + { + return $this->_width; + } + /** + * @param string $startImage + */ + public function setStartImage ($startImage) + { + $this->_startImage = $startImage; + return $this; + } + /** + * @param int $dotNoiseLevel + */ + public function setDotNoiseLevel ($dotNoiseLevel) + { + $this->_dotNoiseLevel = $dotNoiseLevel; + return $this; + } + /** + * @param int $lineNoiseLevel + */ + public function setLineNoiseLevel ($lineNoiseLevel) + { + $this->_lineNoiseLevel = $lineNoiseLevel; + return $this; + } + + /** + * Set captcha expiration + * + * @param int $expiration + * @return Zend_Captcha_Image + */ + public function setExpiration($expiration) + { + $this->_expiration = $expiration; + return $this; + } + + /** + * Set garbage collection frequency + * + * @param int $gcFreq + * @return Zend_Captcha_Image + */ + public function setGcFreq($gcFreq) + { + $this->_gcFreq = $gcFreq; + return $this; + } + + /** + * Set captcha font + * + * @param string $font + * @return Zend_Captcha_Image + */ + public function setFont($font) + { + $this->_font = $font; + return $this; + } + + /** + * Set captcha font size + * + * @param int $fsize + * @return Zend_Captcha_Image + */ + public function setFontSize($fsize) + { + $this->_fsize = $fsize; + return $this; + } + + /** + * Set captcha image height + * + * @param int $height + * @return Zend_Captcha_Image + */ + public function setHeight($height) + { + $this->_height = $height; + return $this; + } + + /** + * Set captcha image storage directory + * + * @param string $imgDir + * @return Zend_Captcha_Image + */ + public function setImgDir($imgDir) + { + $this->_imgDir = rtrim($imgDir, "/\\") . '/'; + return $this; + } + + /** + * Set captcha image base URL + * + * @param string $imgUrl + * @return Zend_Captcha_Image + */ + public function setImgUrl($imgUrl) + { + $this->_imgUrl = rtrim($imgUrl, "/\\") . '/'; + return $this; + } + /** + * @param string $imgAlt + */ + public function setImgAlt ($imgAlt) + { + $this->_imgAlt = $imgAlt; + return $this; + } + + /** + * Set captch image filename suffix + * + * @param string $suffix + * @return Zend_Captcha_Image + */ + public function setSuffix($suffix) + { + $this->_suffix = $suffix; + return $this; + } + + /** + * Set captcha image width + * + * @param int $width + * @return Zend_Captcha_Image + */ + public function setWidth($width) + { + $this->_width = $width; + return $this; + } + + /** + * Generate random frequency + * + * @return float + */ + protected function _randomFreq() + { + return mt_rand(700000, 1000000) / 15000000; + } + + /** + * Generate random phase + * + * @return float + */ + protected function _randomPhase() + { + // random phase from 0 to pi + return mt_rand(0, 3141592) / 1000000; + } + + /** + * Generate random character size + * + * @return int + */ + protected function _randomSize() + { + return mt_rand(300, 700) / 100; + } + + /** + * Generate captcha + * + * @return string captcha ID + */ + public function generate() + { + $id = parent::generate(); + $tries = 5; + // If there's already such file, try creating a new ID + while($tries-- && file_exists($this->getImgDir() . $id . $this->getSuffix())) { + $id = $this->_generateRandomId(); + $this->_setId($id); + } + $this->_generateImage($id, $this->getWord()); + + if (mt_rand(1, $this->getGcFreq()) == 1) { + $this->_gc(); + } + return $id; + } + + /** + * Generate image captcha + * + * Override this function if you want different image generator + * Wave transform from http://www.captcha.ru/captchas/multiwave/ + * + * @param string $id Captcha ID + * @param string $word Captcha word + */ + protected function _generateImage($id, $word) + { + if (!extension_loaded("gd")) { + require_once 'Zend/Captcha/Exception.php'; + throw new Zend_Captcha_Exception("Image CAPTCHA requires GD extension"); + } + + if (!function_exists("imagepng")) { + require_once 'Zend/Captcha/Exception.php'; + throw new Zend_Captcha_Exception("Image CAPTCHA requires PNG support"); + } + + if (!function_exists("imageftbbox")) { + require_once 'Zend/Captcha/Exception.php'; + throw new Zend_Captcha_Exception("Image CAPTCHA requires FT fonts support"); + } + + $font = $this->getFont(); + + if (empty($font)) { + require_once 'Zend/Captcha/Exception.php'; + throw new Zend_Captcha_Exception("Image CAPTCHA requires font"); + } + + $w = $this->getWidth(); + $h = $this->getHeight(); + $fsize = $this->getFontSize(); + + $img_file = $this->getImgDir() . $id . $this->getSuffix(); + if(empty($this->_startImage)) { + $img = imagecreatetruecolor($w, $h); + } else { + $img = imagecreatefrompng($this->_startImage); + if(!$img) { + require_once 'Zend/Captcha/Exception.php'; + throw new Zend_Captcha_Exception("Can not load start image"); + } + $w = imagesx($img); + $h = imagesy($img); + } + $text_color = imagecolorallocate($img, 0, 0, 0); + $bg_color = imagecolorallocate($img, 255, 255, 255); + imagefilledrectangle($img, 0, 0, $w-1, $h-1, $bg_color); + $textbox = imageftbbox($fsize, 0, $font, $word); + $x = ($w - ($textbox[2] - $textbox[0])) / 2; + $y = ($h - ($textbox[7] - $textbox[1])) / 2; + imagefttext($img, $fsize, 0, $x, $y, $text_color, $font, $word); + + // generate noise + for ($i=0; $i<$this->_dotNoiseLevel; $i++) { + imagefilledellipse($img, mt_rand(0,$w), mt_rand(0,$h), 2, 2, $text_color); + } + for($i=0; $i<$this->_lineNoiseLevel; $i++) { + imageline($img, mt_rand(0,$w), mt_rand(0,$h), mt_rand(0,$w), mt_rand(0,$h), $text_color); + } + + // transformed image + $img2 = imagecreatetruecolor($w, $h); + $bg_color = imagecolorallocate($img2, 255, 255, 255); + imagefilledrectangle($img2, 0, 0, $w-1, $h-1, $bg_color); + // apply wave transforms + $freq1 = $this->_randomFreq(); + $freq2 = $this->_randomFreq(); + $freq3 = $this->_randomFreq(); + $freq4 = $this->_randomFreq(); + + $ph1 = $this->_randomPhase(); + $ph2 = $this->_randomPhase(); + $ph3 = $this->_randomPhase(); + $ph4 = $this->_randomPhase(); + + $szx = $this->_randomSize(); + $szy = $this->_randomSize(); + + for ($x = 0; $x < $w; $x++) { + for ($y = 0; $y < $h; $y++) { + $sx = $x + (sin($x*$freq1 + $ph1) + sin($y*$freq3 + $ph3)) * $szx; + $sy = $y + (sin($x*$freq2 + $ph2) + sin($y*$freq4 + $ph4)) * $szy; + + if ($sx < 0 || $sy < 0 || $sx >= $w - 1 || $sy >= $h - 1) { + continue; + } else { + $color = (imagecolorat($img, $sx, $sy) >> 16) & 0xFF; + $color_x = (imagecolorat($img, $sx + 1, $sy) >> 16) & 0xFF; + $color_y = (imagecolorat($img, $sx, $sy + 1) >> 16) & 0xFF; + $color_xy = (imagecolorat($img, $sx + 1, $sy + 1) >> 16) & 0xFF; + } + if ($color == 255 && $color_x == 255 && $color_y == 255 && $color_xy == 255) { + // ignore background + continue; + } elseif ($color == 0 && $color_x == 0 && $color_y == 0 && $color_xy == 0) { + // transfer inside of the image as-is + $newcolor = 0; + } else { + // do antialiasing for border items + $frac_x = $sx-floor($sx); + $frac_y = $sy-floor($sy); + $frac_x1 = 1-$frac_x; + $frac_y1 = 1-$frac_y; + + $newcolor = $color * $frac_x1 * $frac_y1 + + $color_x * $frac_x * $frac_y1 + + $color_y * $frac_x1 * $frac_y + + $color_xy * $frac_x * $frac_y; + } + imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newcolor, $newcolor, $newcolor)); + } + } + + // generate noise + for ($i=0; $i<$this->_dotNoiseLevel; $i++) { + imagefilledellipse($img2, mt_rand(0,$w), mt_rand(0,$h), 2, 2, $text_color); + } + for ($i=0; $i<$this->_lineNoiseLevel; $i++) { + imageline($img2, mt_rand(0,$w), mt_rand(0,$h), mt_rand(0,$w), mt_rand(0,$h), $text_color); + } + + imagepng($img2, $img_file); + imagedestroy($img); + imagedestroy($img2); + } + + /** + * Remove old files from image directory + * + */ + protected function _gc() + { + $expire = time() - $this->getExpiration(); + $imgdir = $this->getImgDir(); + if(!$imgdir || strlen($imgdir) < 2) { + // safety guard + return; + } + foreach (new DirectoryIterator($imgdir) as $file) { + if (!$file->isDot() && !$file->isDir()) { + if ($file->getMTime() < $expire) { + unlink($file->getPathname()); + } + } + } + } + + /** + * Display the captcha + * + * @param Zend_View_Interface $view + * @param mixed $element + * @return string + */ + public function render(Zend_View_Interface $view = null, $element = null) + { + return ''.$this->getImgAlt().'
'; + } +} diff --git a/lib/zend/Zend/Captcha/ReCaptcha.php b/lib/zend/Zend/Captcha/ReCaptcha.php new file mode 100644 index 0000000000..95c02ff35e --- /dev/null +++ b/lib/zend/Zend/Captcha/ReCaptcha.php @@ -0,0 +1,267 @@ + 'Missing captcha fields', + self::ERR_CAPTCHA => 'Failed to validate captcha', + self::BAD_CAPTCHA => 'Captcha value is wrong: %value%', + ); + + /** + * Retrieve ReCaptcha Private key + * + * @return string + */ + public function getPrivkey() + { + return $this->getService()->getPrivateKey(); + } + + /** + * Retrieve ReCaptcha Public key + * + * @return string + */ + public function getPubkey() + { + return $this->getService()->getPublicKey(); + } + + /** + * Set ReCaptcha Private key + * + * @param string $privkey + * @return Zend_Captcha_ReCaptcha + */ + public function setPrivkey($privkey) + { + $this->getService()->setPrivateKey($privkey); + return $this; + } + + /** + * Set ReCaptcha public key + * + * @param string $pubkey + * @return Zend_Captcha_ReCaptcha + */ + public function setPubkey($pubkey) + { + $this->getService()->setPublicKey($pubkey); + return $this; + } + + /** + * Constructor + * + * @param array|Zend_Config $options + * @return void + */ + public function __construct($options = null) + { + $this->setService(new Zend_Service_ReCaptcha()); + $this->_serviceParams = $this->getService()->getParams(); + $this->_serviceOptions = $this->getService()->getOptions(); + + parent::__construct($options); + + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + if (!empty($options)) { + $this->setOptions($options); + } + } + + /** + * Set service object + * + * @param Zend_Service_ReCaptcha $service + * @return Zend_Captcha_ReCaptcha + */ + public function setService(Zend_Service_ReCaptcha $service) + { + $this->_service = $service; + return $this; + } + + /** + * Retrieve ReCaptcha service object + * + * @return Zend_Service_ReCaptcha + */ + public function getService() + { + return $this->_service; + } + + /** + * Set option + * + * If option is a service parameter, proxies to the service. The same + * goes for any service options (distinct from service params) + * + * @param string $key + * @param mixed $value + * @return Zend_Captcha_ReCaptcha + */ + public function setOption($key, $value) + { + $service = $this->getService(); + if (isset($this->_serviceParams[$key])) { + $service->setParam($key, $value); + return $this; + } + if (isset($this->_serviceOptions[$key])) { + $service->setOption($key, $value); + return $this; + } + return parent::setOption($key, $value); + } + + /** + * Generate captcha + * + * @see Zend_Form_Captcha_Adapter::generate() + * @return string + */ + public function generate() + { + return ""; + } + + /** + * Validate captcha + * + * @see Zend_Validate_Interface::isValid() + * @param mixed $value + * @return boolean + */ + public function isValid($value, $context = null) + { + if (!is_array($value) && !is_array($context)) { + $this->_error(self::MISSING_VALUE); + return false; + } + + if (!is_array($value) && is_array($context)) { + $value = $context; + } + + if (empty($value[$this->_CHALLENGE]) || empty($value[$this->_RESPONSE])) { + $this->_error(self::MISSING_VALUE); + return false; + } + + $service = $this->getService(); + + $res = $service->verify($value[$this->_CHALLENGE], $value[$this->_RESPONSE]); + + if (!$res) { + $this->_error(self::ERR_CAPTCHA); + return false; + } + + if (!$res->isValid()) { + $this->_error(self::BAD_CAPTCHA, $res->getErrorCode()); + $service->setParam('error', $res->getErrorCode()); + return false; + } + + return true; + } + + /** + * Render captcha + * + * @param Zend_View_Interface $view + * @param mixed $element + * @return string + */ + public function render(Zend_View_Interface $view = null, $element = null) + { + return $this->getService()->getHTML(); + } +} diff --git a/lib/zend/Zend/Captcha/Word.php b/lib/zend/Zend/Captcha/Word.php new file mode 100644 index 0000000000..0c1d1f579d --- /dev/null +++ b/lib/zend/Zend/Captcha/Word.php @@ -0,0 +1,373 @@ + 'Empty captcha value', + self::MISSING_ID => 'Captcha ID field is missing', + self::BAD_CAPTCHA => 'Captcha value is wrong', + ); + + /** + * Length of the word to generate + * + * @var integer + */ + protected $_wordlen = 8; + + /** + * Retrieve session class to utilize + * + * @return string + */ + public function getSessionClass() + { + return $this->_sessionClass; + } + + /** + * Set session class for persistence + * + * @param string $_sessionClass + * @return Zend_Captcha_Word + */ + public function setSessionClass($_sessionClass) + { + $this->_sessionClass = $_sessionClass; + return $this; + } + + /** + * Retrieve word length to use when genrating captcha + * + * @return integer + */ + public function getWordlen() + { + return $this->_wordlen; + } + + /** + * Set word length of captcha + * + * @param integer $wordlen + * @return Zend_Captcha_Word + */ + public function setWordlen($wordlen) + { + $this->_wordlen = $wordlen; + return $this; + } + + /** + * Retrieve captcha ID + * + * @return string + */ + public function getId () + { + if (null === $this->_id) { + $this->_setId($this->_generateRandomId()); + } + return $this->_id; + } + + /** + * Set captcha identifier + * + * @param string $id + * return Zend_Captcha_Word + */ + protected function _setId ($id) + { + $this->_id = $id; + return $this; + } + + /** + * Set timeout for session token + * + * @param int $ttl + * @return Zend_Captcha_Word + */ + public function setTimeout($ttl) + { + $this->_timeout = (int) $ttl; + return $this; + } + + /** + * Get session token timeout + * + * @return int + */ + public function getTimeout() + { + return $this->_timeout; + } + + /** + * Get session object + * + * @return Zend_Session_Namespace + */ + public function getSession() + { + if (!isset($this->_session) || (null === $this->_session)) { + $id = $this->getId(); + if (!class_exists($this->_sessionClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($this->_sessionClass); + } + $this->_session = new $this->_sessionClass('Zend_Form_Captcha_' . $id); + $this->_session->setExpirationHops(1, null, true); + $this->_session->setExpirationSeconds($this->getTimeout()); + } + return $this->_session; + } + + /** + * Set session namespace object + * + * @param Zend_Session_Namespace $session + * @return Zend_Captcha_Word + */ + public function setSession(Zend_Session_Namespace $session) + { + $this->_session = $session; + return $this; + } + + /** + * Get captcha word + * + * @return string + */ + public function getWord() + { + if (empty($this->_word)) { + $session = $this->getSession(); + $this->_word = $session->word; + } + return $this->_word; + } + + /** + * Set captcha word + * + * @param string $word + * @return Zend_Captcha_Word + */ + protected function _setWord($word) + { + $session = $this->getSession(); + $session->word = $word; + $this->_word = $word; + return $this; + } + + /** + * Generate new random word + * + * @return string + */ + protected function _generateWord() + { + $word = ''; + $wordLen = $this->getWordLen(); + $vowels = $this->_useNumbers ? self::$VN : self::$V; + $consonants = $this->_useNumbers ? self::$CN : self::$C; + + for ($i=0; $i < $wordLen; $i = $i + 2) { + // generate word with mix of vowels and consonants + $consonant = $consonants[array_rand($consonants)]; + $vowel = $vowels[array_rand($vowels)]; + $word .= $consonant . $vowel; + } + + if (strlen($word) > $wordLen) { + $word = substr($word, 0, $wordLen); + } + + return $word; + } + + /** + * Generate new session ID and new word + * + * @return string session ID + */ + public function generate() + { + $this->_session = null; + $id = $this->_generateRandomId(); + $this->_setId($id); + $word = $this->_generateWord(); + $this->_setWord($word); + return $id; + } + + protected function _generateRandomId() + { + return md5(mt_rand(0, 1000) . microtime(true)); + } + + /** + * Validate the word + * + * @see Zend_Validate_Interface::isValid() + * @param mixed $value + * @return boolean + */ + public function isValid($value, $context = null) + { + if (!is_array($value) && !is_array($context)) { + $this->_error(self::MISSING_VALUE); + return false; + } + if (!is_array($value) && is_array($context)) { + $value = $context; + } + + $name = $this->getName(); + + if (isset($value[$name])) { + $value = $value[$name]; + } + + if (!isset($value['input'])) { + $this->_error(self::MISSING_VALUE); + return false; + } + $input = strtolower($value['input']); + $this->_setValue($input); + + if (!isset($value['id'])) { + $this->_error(self::MISSING_ID); + return false; + } + + $this->_id = $value['id']; + if ($input !== $this->getWord()) { + $this->_error(self::BAD_CAPTCHA); + return false; + } + + return true; + } + + /** + * Get captcha decorator + * + * @return string + */ + public function getDecorator() + { + return "Captcha_Word"; + } +} diff --git a/lib/zend/Zend/CodeGenerator/Abstract.php b/lib/zend/Zend/CodeGenerator/Abstract.php new file mode 100644 index 0000000000..55fba869f0 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Abstract.php @@ -0,0 +1,147 @@ +_init(); + if ($options != null) { + // use Zend_Config objects if provided + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + // pass arrays to setOptions + if (is_array($options)) { + $this->setOptions($options); + } + } + $this->_prepare(); + } + + /** + * setConfig() + * + * @param Zend_Config $config + * @return Zend_CodeGenerator_Abstract + */ + public function setConfig(Zend_Config $config) + { + $this->setOptions($config->toArray()); + return $this; + } + + /** + * setOptions() + * + * @param array $options + * @return Zend_CodeGenerator_Abstract + */ + public function setOptions(Array $options) + { + foreach ($options as $optionName => $optionValue) { + $methodName = 'set' . $optionName; + if (method_exists($this, $methodName)) { + $this->{$methodName}($optionValue); + } + } + return $this; + } + + /** + * setSourceContent() + * + * @param string $sourceContent + */ + public function setSourceContent($sourceContent) + { + $this->_sourceContent = $sourceContent; + return; + } + + /** + * getSourceContent() + * + * @return string + */ + public function getSourceContent() + { + return $this->_sourceContent; + } + + /** + * _init() - this is called before the constuctor + * + */ + protected function _init() + { + + } + + /** + * _prepare() - this is called at construction completion + * + */ + protected function _prepare() + { + + } + + /** + * generate() - must be implemented by the child + * + */ + abstract public function generate(); + + /** + * __toString() - casting to a string will in turn call generate() + * + * @return string + */ + final public function __toString() + { + return $this->generate(); + } + +} diff --git a/lib/zend/Zend/CodeGenerator/Exception.php b/lib/zend/Zend/CodeGenerator/Exception.php new file mode 100644 index 0000000000..8d0ae7fc21 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Exception.php @@ -0,0 +1,35 @@ +_isSourceDirty = ($isSourceDirty) ? true : false; + return $this; + } + + /** + * isSourceDirty() + * + * @return bool + */ + public function isSourceDirty() + { + return $this->_isSourceDirty; + } + + /** + * setIndentation() + * + * @param string|int $indentation + * @return Zend_CodeGenerator_Php_Abstract + */ + public function setIndentation($indentation) + { + $this->_indentation = $indentation; + return $this; + } + + /** + * getIndentation() + * + * @return string|int + */ + public function getIndentation() + { + return $this->_indentation; + } + +} diff --git a/lib/zend/Zend/CodeGenerator/Php/Body.php b/lib/zend/Zend/CodeGenerator/Php/Body.php new file mode 100644 index 0000000000..e7d4f3c5e1 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Body.php @@ -0,0 +1,73 @@ +_content = $content; + return $this; + } + + /** + * getContent() + * + * @return string + */ + public function getContent() + { + return (string) $this->_content; + } + + /** + * generate() + * + * @return string + */ + public function generate() + { + return $this->getContent(); + } +} diff --git a/lib/zend/Zend/CodeGenerator/Php/Class.php b/lib/zend/Zend/CodeGenerator/Php/Class.php new file mode 100644 index 0000000000..70a5797af2 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Class.php @@ -0,0 +1,513 @@ +setSourceContent($class->getSourceContent()); + $class->setSourceDirty(false); + + if ($reflectionClass->getDocComment() != '') { + $class->setDocblock(Zend_CodeGenerator_Php_Docblock::fromReflection($reflectionClass->getDocblock())); + } + + $class->setAbstract($reflectionClass->isAbstract()); + $class->setName($reflectionClass->getName()); + + if ($parentClass = $reflectionClass->getParentClass()) { + $class->setExtendedClass($parentClass->getName()); + $interfaces = array_diff($reflectionClass->getInterfaces(), $parentClass->getInterfaces()); + } else { + $interfaces = $reflectionClass->getInterfaces(); + } + + $interfaceNames = array(); + foreach($interfaces AS $interface) { + $interfaceNames[] = $interface->getName(); + } + + $class->setImplementedInterfaces($interfaceNames); + + $properties = array(); + foreach ($reflectionClass->getProperties() as $reflectionProperty) { + if ($reflectionProperty->getDeclaringClass()->getName() == $class->getName()) { + $properties[] = Zend_CodeGenerator_Php_Property::fromReflection($reflectionProperty); + } + } + $class->setProperties($properties); + + $methods = array(); + foreach ($reflectionClass->getMethods() as $reflectionMethod) { + if ($reflectionMethod->getDeclaringClass()->getName() == $class->getName()) { + $methods[] = Zend_CodeGenerator_Php_Method::fromReflection($reflectionMethod); + } + } + $class->setMethods($methods); + + return $class; + } + + /** + * setDocblock() Set the docblock + * + * @param Zend_CodeGenerator_Php_Docblock|array|string $docblock + * @return Zend_CodeGenerator_Php_File + */ + public function setDocblock($docblock) + { + if (is_string($docblock)) { + $docblock = array('shortDescription' => $docblock); + } + + if (is_array($docblock)) { + $docblock = new Zend_CodeGenerator_Php_Docblock($docblock); + } elseif (!$docblock instanceof Zend_CodeGenerator_Php_Docblock) { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('setDocblock() is expecting either a string, array or an instance of Zend_CodeGenerator_Php_Docblock'); + } + + $this->_docblock = $docblock; + return $this; + } + + /** + * getDocblock() + * + * @return Zend_CodeGenerator_Php_Docblock + */ + public function getDocblock() + { + return $this->_docblock; + } + + /** + * setName() + * + * @param string $name + * @return Zend_CodeGenerator_Php_Class + */ + public function setName($name) + { + $this->_name = $name; + return $this; + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * setAbstract() + * + * @param bool $isAbstract + * @return Zend_CodeGenerator_Php_Class + */ + public function setAbstract($isAbstract) + { + $this->_isAbstract = ($isAbstract) ? true : false; + return $this; + } + + /** + * isAbstract() + * + * @return bool + */ + public function isAbstract() + { + return $this->_isAbstract; + } + + /** + * setExtendedClass() + * + * @param string $extendedClass + * @return Zend_CodeGenerator_Php_Class + */ + public function setExtendedClass($extendedClass) + { + $this->_extendedClass = $extendedClass; + return $this; + } + + /** + * getExtendedClass() + * + * @return string + */ + public function getExtendedClass() + { + return $this->_extendedClass; + } + + /** + * setImplementedInterfaces() + * + * @param array $implementedInterfaces + * @return Zend_CodeGenerator_Php_Class + */ + public function setImplementedInterfaces(Array $implementedInterfaces) + { + $this->_implementedInterfaces = $implementedInterfaces; + return $this; + } + + /** + * getImplementedInterfaces + * + * @return array + */ + public function getImplementedInterfaces() + { + return $this->_implementedInterfaces; + } + + /** + * setProperties() + * + * @param array $properties + * @return Zend_CodeGenerator_Php_Class + */ + public function setProperties(Array $properties) + { + foreach ($properties as $property) { + $this->setProperty($property); + } + + return $this; + } + + /** + * setProperty() + * + * @param array|Zend_CodeGenerator_Php_Property $property + * @return Zend_CodeGenerator_Php_Class + */ + public function setProperty($property) + { + if (is_array($property)) { + $property = new Zend_CodeGenerator_Php_Property($property); + $propertyName = $property->getName(); + } elseif ($property instanceof Zend_CodeGenerator_Php_Property) { + $propertyName = $property->getName(); + } else { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('setProperty() expects either an array of property options or an instance of Zend_CodeGenerator_Php_Property'); + } + + if (isset($this->_properties[$propertyName])) { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('A property by name ' . $propertyName . ' already exists in this class.'); + } + + $this->_properties[$propertyName] = $property; + return $this; + } + + /** + * getProperties() + * + * @return array + */ + public function getProperties() + { + return $this->_properties; + } + + /** + * getProperty() + * + * @param string $propertyName + * @return Zend_CodeGenerator_Php_Property + */ + public function getProperty($propertyName) + { + foreach ($this->_properties as $property) { + if ($property->getName() == $propertyName) { + return $property; + } + } + return false; + } + + /** + * hasProperty() + * + * @param string $propertyName + * @return bool + */ + public function hasProperty($propertyName) + { + return isset($this->_properties[$propertyName]); + } + + /** + * setMethods() + * + * @param array $methods + * @return Zend_CodeGenerator_Php_Class + */ + public function setMethods(Array $methods) + { + foreach ($methods as $method) { + $this->setMethod($method); + } + return $this; + } + + /** + * setMethod() + * + * @param array|Zend_CodeGenerator_Php_Method $method + * @return Zend_CodeGenerator_Php_Class + */ + public function setMethod($method) + { + if (is_array($method)) { + $method = new Zend_CodeGenerator_Php_Method($method); + $methodName = $method->getName(); + } elseif ($method instanceof Zend_CodeGenerator_Php_Method) { + $methodName = $method->getName(); + } else { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('setMethod() expects either an array of method options or an instance of Zend_CodeGenerator_Php_Method'); + } + + if (isset($this->_methods[$methodName])) { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('A method by name ' . $methodName . ' already exists in this class.'); + } + + $this->_methods[$methodName] = $method; + return $this; + } + + /** + * getMethods() + * + * @return array + */ + public function getMethods() + { + return $this->_methods; + } + + /** + * getMethod() + * + * @param string $methodName + * @return Zend_CodeGenerator_Php_Method + */ + public function getMethod($methodName) + { + foreach ($this->_methods as $method) { + if ($method->getName() == $methodName) { + return $method; + } + } + return false; + } + + /** + * hasMethod() + * + * @param string $methodName + * @return bool + */ + public function hasMethod($methodName) + { + return isset($this->_methods[$methodName]); + } + + /** + * isSourceDirty() + * + * @return bool + */ + public function isSourceDirty() + { + if (($docblock = $this->getDocblock()) && $docblock->isSourceDirty()) { + return true; + } + + foreach ($this->_properties as $property) { + if ($property->isSourceDirty()) { + return true; + } + } + + foreach ($this->_methods as $method) { + if ($method->isSourceDirty()) { + return true; + } + } + + return parent::isSourceDirty(); + } + + /** + * generate() + * + * @return string + */ + public function generate() + { + if (!$this->isSourceDirty()) { + return $this->getSourceContent(); + } + + $output = ''; + + if (null !== ($docblock = $this->getDocblock())) { + $docblock->setIndentation(''); + $output .= $docblock->generate(); + } + + if ($this->isAbstract()) { + $output .= 'abstract '; + } + + $output .= 'class ' . $this->getName(); + + if (null !== ($ec = $this->_extendedClass)) { + $output .= ' extends ' . $ec; + } + + $implemented = $this->getImplementedInterfaces(); + if (!empty($implemented)) { + $output .= ' implements ' . implode(', ', $implemented); + } + + $output .= self::LINE_FEED . '{' . self::LINE_FEED . self::LINE_FEED; + + $properties = $this->getProperties(); + if (!empty($properties)) { + foreach ($properties as $property) { + $output .= $property->generate() . self::LINE_FEED . self::LINE_FEED; + } + } + + $methods = $this->getMethods(); + if (!empty($methods)) { + foreach ($methods as $method) { + $output .= $method->generate() . self::LINE_FEED; + } + } + + $output .= self::LINE_FEED . '}' . self::LINE_FEED; + + return $output; + } + + /** + * _init() - is called at construction time + * + */ + protected function _init() + { + $this->_properties = new Zend_CodeGenerator_Php_Member_Container(Zend_CodeGenerator_Php_Member_Container::TYPE_PROPERTY); + $this->_methods = new Zend_CodeGenerator_Php_Member_Container(Zend_CodeGenerator_Php_Member_Container::TYPE_METHOD); + } + +} diff --git a/lib/zend/Zend/CodeGenerator/Php/Docblock.php b/lib/zend/Zend/CodeGenerator/Php/Docblock.php new file mode 100644 index 0000000000..d10a5d9e91 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Docblock.php @@ -0,0 +1,220 @@ +setSourceContent($reflectionDocblock->getContents()); + $docblock->setSourceDirty(false); + + $docblock->setShortDescription($reflectionDocblock->getShortDescription()); + $docblock->setLongDescription($reflectionDocblock->getLongDescription()); + + foreach ($reflectionDocblock->getTags() as $tag) { + $docblock->setTag(Zend_CodeGenerator_Php_Docblock_Tag::fromReflection($tag)); + } + + return $docblock; + } + + /** + * setShortDescription() + * + * @param string $shortDescription + * @return Zend_CodeGenerator_Php_Docblock + */ + public function setShortDescription($shortDescription) + { + $this->_shortDescription = $shortDescription; + return $this; + } + + /** + * getShortDescription() + * + * @return string + */ + public function getShortDescription() + { + return $this->_shortDescription; + } + + /** + * setLongDescription() + * + * @param string $longDescription + * @return Zend_CodeGenerator_Php_Docblock + */ + public function setLongDescription($longDescription) + { + $this->_longDescription = $longDescription; + return $this; + } + + /** + * getLongDescription() + * + * @return string + */ + public function getLongDescription() + { + return $this->_longDescription; + } + + /** + * setTags() + * + * @param array $tags + * @return Zend_CodeGenerator_Php_Docblock + */ + public function setTags(Array $tags) + { + foreach ($tags as $tag) { + $this->setTag($tag); + } + + return $this; + } + + /** + * setTag() + * + * @param array|Zend_CodeGenerator_Php_Docblock_Tag $tag + * @return Zend_CodeGenerator_Php_Docblock + */ + public function setTag($tag) + { + if (is_array($tag)) { + $tag = new Zend_CodeGenerator_Php_Docblock_Tag($tag); + } elseif (!$tag instanceof Zend_CodeGenerator_Php_Docblock_Tag) { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception( + 'setTag() expects either an array of method options or an ' + . 'instance of Zend_CodeGenerator_Php_Docblock_Tag' + ); + } + + $this->_tags[] = $tag; + return $this; + } + + /** + * getTags + * + * @return array Array of Zend_CodeGenerator_Php_Docblock_Tag + */ + public function getTags() + { + return $this->_tags; + } + + /** + * generate() + * + * @return string + */ + public function generate() + { + if (!$this->isSourceDirty()) { + return $this->_docCommentize($this->getSourceContent()); + } + + $output = ''; + if (null !== ($sd = $this->getShortDescription())) { + $output .= $sd . self::LINE_FEED . self::LINE_FEED; + } + if (null !== ($ld = $this->getLongDescription())) { + $output .= $ld . self::LINE_FEED . self::LINE_FEED; + } + + foreach ($this->getTags() as $tag) { + $output .= $tag->generate() . self::LINE_FEED; + } + + return $this->_docCommentize(trim($output)); + } + + /** + * _docCommentize() + * + * @param string $content + * @return string + */ + protected function _docCommentize($content) + { + $indent = $this->getIndentation(); + $output = $indent . '/**' . self::LINE_FEED; + $content = wordwrap($content, 80, self::LINE_FEED); + $lines = explode(self::LINE_FEED, $content); + foreach ($lines as $line) { + $output .= $indent . ' * ' . $line . self::LINE_FEED; + } + $output .= $indent . ' */' . self::LINE_FEED; + return $output; + } + +} diff --git a/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag.php b/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag.php new file mode 100644 index 0000000000..b277b3ece2 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag.php @@ -0,0 +1,184 @@ +getName(); + + $codeGenDocblockTag = self::factory($tagName); + + // transport any properties via accessors and mutators from reflection to codegen object + $reflectionClass = new ReflectionClass($reflectionTag); + foreach ($reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { + if (substr($method->getName(), 0, 3) == 'get') { + $propertyName = substr($method->getName(), 3); + if (method_exists($codeGenDocblockTag, 'set' . $propertyName)) { + $codeGenDocblockTag->{'set' . $propertyName}($reflectionTag->{'get' . $propertyName}()); + } + } + } + + return $codeGenDocblockTag; + } + + /** + * setPluginLoader() + * + * @param Zend_Loader_PluginLoader $pluginLoader + */ + public static function setPluginLoader(Zend_Loader_PluginLoader $pluginLoader) + { + self::$_pluginLoader = $pluginLoader; + return; + } + + /** + * getPluginLoader() + * + * @return Zend_Loader_PluginLoader + */ + public static function getPluginLoader() + { + if (self::$_pluginLoader == null) { + require_once 'Zend/Loader/PluginLoader.php'; + self::setPluginLoader(new Zend_Loader_PluginLoader(array( + 'Zend_CodeGenerator_Php_Docblock_Tag' => dirname(__FILE__) . '/Tag/')) + ); + } + + return self::$_pluginLoader; + } + + public static function factory($tagName) + { + $pluginLoader = self::getPluginLoader(); + + try { + $tagClass = $pluginLoader->load($tagName); + } catch (Zend_Loader_Exception $exception) { + $tagClass = 'Zend_CodeGenerator_Php_Docblock_Tag'; + } + + $tag = new $tagClass(array('name' => $tagName)); + return $tag; + } + + /** + * setName() + * + * @param string $name + * @return Zend_CodeGenerator_Php_Docblock_Tag + */ + public function setName($name) + { + $this->_name = ltrim($name, '@'); + return $this; + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * setDescription() + * + * @param string $description + * @return Zend_CodeGenerator_Php_Docblock_Tag + */ + public function setDescription($description) + { + $this->_description = $description; + return $this; + } + + /** + * getDescription() + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * generate() + * + * @return string + */ + public function generate() + { + return '@' . $this->_name . ' ' . $this->_description; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/License.php b/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/License.php new file mode 100644 index 0000000000..4a69410f43 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/License.php @@ -0,0 +1,98 @@ +setName('license'); + $returnTag->setUrl($reflectionTagLicense->getUrl()); + $returnTag->setDescription($reflectionTagLicense->getDescription()); + + return $returnTag; + } + + /** + * setUrl() + * + * @param string $url + * @return Zend_CodeGenerator_Php_Docblock_Tag_License + */ + public function setUrl($url) + { + $this->_url = $url; + return $this; + } + + /** + * getUrl() + * + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + + /** + * generate() + * + * @return string + */ + public function generate() + { + $output = '@license ' . $this->_url . ' ' . $this->_description . self::LINE_FEED; + return $output; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/Param.php b/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/Param.php new file mode 100644 index 0000000000..5f7b8268aa --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/Param.php @@ -0,0 +1,128 @@ +setName('param'); + $paramTag->setDatatype($reflectionTagParam->getType()); // @todo rename + $paramTag->setParamName($reflectionTagParam->getVariableName()); + $paramTag->setDescription($reflectionTagParam->getDescription()); + + return $paramTag; + } + + /** + * setDatatype() + * + * @param string $datatype + * @return Zend_CodeGenerator_Php_Docblock_Tag_Param + */ + public function setDatatype($datatype) + { + $this->_datatype = $datatype; + return $this; + } + + /** + * getDatatype + * + * @return string + */ + public function getDatatype() + { + return $this->_datatype; + } + + /** + * setParamName() + * + * @param string $paramName + * @return Zend_CodeGenerator_Php_Docblock_Tag_Param + */ + public function setParamName($paramName) + { + $this->_paramName = $paramName; + return $this; + } + + /** + * getParamName() + * + * @return string + */ + public function getParamName() + { + return $this->_paramName; + } + + /** + * generate() + * + * @return string + */ + public function generate() + { + $output = '@param ' + . (($this->_datatype != null) ? $this->_datatype : 'unknown') + . (($this->_paramName != null) ? ' $' . $this->_paramName : '') + . (($this->_description != null) ? ' ' . $this->_description : ''); + return $output; + } + +} diff --git a/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/Return.php b/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/Return.php new file mode 100644 index 0000000000..a04f689488 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Docblock/Tag/Return.php @@ -0,0 +1,98 @@ +setName('return'); + $returnTag->setDatatype($reflectionTagReturn->getType()); // @todo rename + $returnTag->setDescription($reflectionTagReturn->getDescription()); + + return $returnTag; + } + + /** + * setDatatype() + * + * @param string $datatype + * @return Zend_CodeGenerator_Php_Docblock_Tag_Return + */ + public function setDatatype($datatype) + { + $this->_datatype = $datatype; + return $this; + } + + /** + * getDatatype() + * + * @return string + */ + public function getDatatype() + { + return $this->_datatype; + } + + + /** + * generate() + * + * @return string + */ + public function generate() + { + $output = '@return ' . $this->_datatype . ' ' . $this->_description; + return $output; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/CodeGenerator/Php/Exception.php b/lib/zend/Zend/CodeGenerator/Php/Exception.php new file mode 100644 index 0000000000..913bd7415f --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Exception.php @@ -0,0 +1,37 @@ +getFilename(); + } + + if ($fileName == '') { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('FileName does not exist.'); + } + + // cannot use realpath since the file might not exist, but we do need to have the index + // in the same DIRECTORY_SEPARATOR that realpath would use: + $fileName = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $fileName); + + self::$_fileCodeGenerators[$fileName] = $fileCodeGenerator; + + } + + /** + * fromReflectedFilePath() - use this if you intend on generating code generation objects based on the same file. + * This will keep previous changes to the file in tact during the same PHP process + * + * @param string $filePath + * @param bool $usePreviousCodeGeneratorIfItExists + * @param bool $includeIfNotAlreadyIncluded + * @return Zend_CodeGenerator_Php_File + */ + public static function fromReflectedFileName($filePath, $usePreviousCodeGeneratorIfItExists = true, $includeIfNotAlreadyIncluded = true) + { + $realpath = realpath($filePath); + + if ($realpath === false) { + if ( ($realpath = Zend_Reflection_file::findRealpathInIncludePath($filePath)) === false) { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('No file for ' . $realpath . ' was found.'); + } + } + + if ($usePreviousCodeGeneratorIfItExists && isset(self::$_fileCodeGenerators[$realpath])) { + return self::$_fileCodeGenerators[$realpath]; + } + + if ($includeIfNotAlreadyIncluded && !in_array($realpath, get_included_files())) { + include $realpath; + } + + $codeGenerator = self::fromReflection(($fileReflector = new Zend_Reflection_File($realpath))); + + if (!isset(self::$_fileCodeGenerators[$fileReflector->getFileName()])) { + self::$_fileCodeGenerators[$fileReflector->getFileName()] = $codeGenerator; + } + + return $codeGenerator; + } + + /** + * fromReflection() + * + * @param Zend_Reflection_File $reflectionFile + * @return Zend_CodeGenerator_Php_File + */ + public static function fromReflection(Zend_Reflection_File $reflectionFile) + { + $file = new self(); + + $file->setSourceContent($reflectionFile->getContents()); + $file->setSourceDirty(false); + + $body = $reflectionFile->getContents(); + + // @todo this whole area needs to be reworked with respect to how body lines are processed + foreach ($reflectionFile->getClasses() as $class) { + $file->setClass(Zend_CodeGenerator_Php_Class::fromReflection($class)); + $classStartLine = $class->getStartLine(true); + $classEndLine = $class->getEndLine(); + + $bodyLines = explode("\n", $body); + $bodyReturn = array(); + for ($lineNum = 1; $lineNum <= count($bodyLines); $lineNum++) { + if ($lineNum == $classStartLine) { + $bodyReturn[] = str_replace('?', $class->getName(), self::$_markerClass); //'/* Zend_CodeGenerator_Php_File-ClassMarker: {' . $class->getName() . '} */'; + $lineNum = $classEndLine; + } else { + $bodyReturn[] = $bodyLines[$lineNum - 1]; // adjust for index -> line conversion + } + } + $body = implode("\n", $bodyReturn); + unset($bodyLines, $bodyReturn, $classStartLine, $classEndLine); + } + + if (($reflectionFile->getDocComment() != '')) { + $docblock = $reflectionFile->getDocblock(); + $file->setDocblock(Zend_CodeGenerator_Php_Docblock::fromReflection($docblock)); + + $bodyLines = explode("\n", $body); + $bodyReturn = array(); + for ($lineNum = 1; $lineNum <= count($bodyLines); $lineNum++) { + if ($lineNum == $docblock->getStartLine()) { + $bodyReturn[] = str_replace('?', $class->getName(), self::$_markerDocblock); //'/* Zend_CodeGenerator_Php_File-ClassMarker: {' . $class->getName() . '} */'; + $lineNum = $docblock->getEndLine(); + } else { + $bodyReturn[] = $bodyLines[$lineNum - 1]; // adjust for index -> line conversion + } + } + $body = implode("\n", $bodyReturn); + unset($bodyLines, $bodyReturn, $classStartLine, $classEndLine); + } + + $file->setBody($body); + + return $file; + } + + /** + * setDocblock() Set the docblock + * + * @param Zend_CodeGenerator_Php_Docblock|array|string $docblock + * @return Zend_CodeGenerator_Php_File + */ + public function setDocblock($docblock) + { + if (is_string($docblock)) { + $docblock = array('shortDescription' => $docblock); + } + + if (is_array($docblock)) { + $docblock = new Zend_CodeGenerator_Php_Docblock($docblock); + } elseif (!$docblock instanceof Zend_CodeGenerator_Php_Docblock) { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('setDocblock() is expecting either a string, array or an instance of Zend_CodeGenerator_Php_Docblock'); + } + + $this->_docblock = $docblock; + return $this; + } + + /** + * Get docblock + * + * @return Zend_CodeGenerator_Php_Docblock + */ + public function getDocblock() + { + return $this->_docblock; + } + + /** + * setRequiredFiles + * + * @param array $requiredFiles + * @return Zend_CodeGenerator_Php_File + */ + public function setRequiredFiles($requiredFiles) + { + $this->_requiredFiles = $requiredFiles; + return $this; + } + + /** + * getRequiredFiles() + * + * @return array + */ + public function getRequiredFiles() + { + return $this->_requiredFiles; + } + + /** + * setClasses() + * + * @param array $classes + * @return Zend_CodeGenerator_Php_File + */ + public function setClasses(Array $classes) + { + foreach ($classes as $class) { + $this->setClass($class); + } + return $this; + } + + /** + * getClass() + * + * @param string $name + * @return Zend_CodeGenerator_Php_Class + */ + public function getClass($name = null) + { + if ($name == null) { + reset($this->_classes); + return current($this->_classes); + } + + return $this->_classes[$name]; + } + + /** + * setClass() + * + * @param Zend_CodeGenerator_Php_Class|array $class + * @return Zend_CodeGenerator_Php_File + */ + public function setClass($class) + { + if (is_array($class)) { + $class = new Zend_CodeGenerator_Php_Class($class); + $className = $class->getName(); + } elseif ($class instanceof Zend_CodeGenerator_Php_Class) { + $className = $class->getName(); + } else { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('Expecting either an array or an instance of Zend_CodeGenerator_Php_Class'); + } + + // @todo check for dup here + + $this->_classes[$className] = $class; + return $this; + } + + /** + * setFilename() + * + * @param string $filename + * @return Zend_CodeGenerator_Php_File + */ + public function setFilename($filename) + { + $this->_filename = $filename; + return $this; + } + + /** + * getFilename() + * + * @return string + */ + public function getFilename() + { + return $this->_filename; + } + + /** + * getClasses() + * + * @return array Array of Zend_CodeGenerator_Php_Class + */ + public function getClasses() + { + return $this->_classes; + } + + /** + * setBody() + * + * @param string $body + * @return Zend_CodeGenerator_Php_File + */ + public function setBody($body) + { + $this->_body = $body; + return $this; + } + + /** + * getBody() + * + * @return string + */ + public function getBody() + { + return $this->_body; + } + + /** + * isSourceDirty() + * + * @return bool + */ + public function isSourceDirty() + { + if (($docblock = $this->getDocblock()) && $docblock->isSourceDirty()) { + return true; + } + + foreach ($this->_classes as $class) { + if ($class->isSourceDirty()) { + return true; + } + } + + return parent::isSourceDirty(); + } + + /** + * generate() + * + * @return string + */ + public function generate() + { + if ($this->isSourceDirty() === false) { + return $this->_sourceContent; + } + + $output = ''; + + // start with the body (if there), or open tag + if (preg_match('#(?:\s*)<\?php#', $this->getBody()) == false) { + $output = 'getBody(); + if (preg_match('#/\* Zend_CodeGenerator_Php_File-(.*?)Marker:#', $body)) { + $output .= $body; + $body = ''; + } + + // Add file docblock, if any + if (null !== ($docblock = $this->getDocblock())) { + $docblock->setIndentation(''); + $regex = preg_quote(self::$_markerDocblock, '#'); + if (preg_match('#'.$regex.'#', $output)) { + $output = preg_replace('#'.$regex.'#', $docblock->generate(), $output, 1); + } else { + $output .= $docblock->generate() . self::LINE_FEED; + } + } + + // newline + $output .= self::LINE_FEED; + + // process required files + // @todo marker replacement for required files + $requiredFiles = $this->getRequiredFiles(); + if (!empty($requiredFiles)) { + foreach ($requiredFiles as $requiredFile) { + $output .= 'require_once \'' . $requiredFile . '\';' . self::LINE_FEED; + } + + $output .= self::LINE_FEED; + } + + // process classes + $classes = $this->getClasses(); + if (!empty($classes)) { + foreach ($classes as $class) { + $regex = str_replace('?', $class->getName(), self::$_markerClass); + $regex = preg_quote($regex, '#'); + if (preg_match('#'.$regex.'#', $output)) { + $output = preg_replace('#'.$regex.'#', $class->generate(), $output, 1); + } else { + $output .= $class->generate() . self::LINE_FEED; + } + } + + } + + if (!empty($body)) { + + // add an extra space betwee clsses and + if (!empty($classes)) { + $output .= self::LINE_FEED; + } + + $output .= $body; + } + + return $output; + } + + public function write() + { + if ($this->_filename == '' || !is_writable(dirname($this->_filename))) { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('This code generator object is not writable.'); + } + file_put_contents($this->_filename, $this->generate()); + return $this; + } + +} diff --git a/lib/zend/Zend/CodeGenerator/Php/Member/Abstract.php b/lib/zend/Zend/CodeGenerator/Php/Member/Abstract.php new file mode 100644 index 0000000000..da707a3546 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Member/Abstract.php @@ -0,0 +1,222 @@ + $docblock); + } + + if (is_array($docblock)) { + $docblock = new Zend_CodeGenerator_Php_Docblock($docblock); + } elseif (!$docblock instanceof Zend_CodeGenerator_Php_Docblock) { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('setDocblock() is expecting either a string, array or an instance of Zend_CodeGenerator_Php_Docblock'); + } + + $this->_docblock = $docblock; + return $this; + } + + /** + * getDocblock() + * + * @return Zend_CodeGenerator_Php_Docblock + */ + public function getDocblock() + { + return $this->_docblock; + } + + /** + * setAbstract() + * + * @param bool $isAbstract + * @return Zend_CodeGenerator_Php_Member_Abstract + */ + public function setAbstract($isAbstract) + { + $this->_isAbstract = ($isAbstract) ? true : false; + return $this; + } + + /** + * isAbstract() + * + * @return bool + */ + public function isAbstract() + { + return $this->_isAbstract; + } + + /** + * setFinal() + * + * @param bool $isFinal + * @return Zend_CodeGenerator_Php_Member_Abstract + */ + public function setFinal($isFinal) + { + $this->_isFinal = ($isFinal) ? true : false; + return $this; + } + + /** + * isFinal() + * + * @return bool + */ + public function isFinal() + { + return $this->_isFinal; + } + + /** + * setStatic() + * + * @param bool $isStatic + * @return Zend_CodeGenerator_Php_Member_Abstract + */ + public function setStatic($isStatic) + { + $this->_isStatic = ($isStatic) ? true : false; + return $this; + } + + /** + * isStatic() + * + * @return bool + */ + public function isStatic() + { + return $this->_isStatic; + } + + /** + * setVisitibility() + * + * @param const $visibility + * @return Zend_CodeGenerator_Php_Member_Abstract + */ + public function setVisibility($visibility) + { + $this->_visibility = $visibility; + return $this; + } + + /** + * getVisibility() + * + * @return const + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * setName() + * + * @param string $name + * @return Zend_CodeGenerator_Php_Member_Abstract + */ + public function setName($name) + { + $this->_name = $name; + return $this; + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return $this->_name; + } +} diff --git a/lib/zend/Zend/CodeGenerator/Php/Member/Container.php b/lib/zend/Zend/CodeGenerator/Php/Member/Container.php new file mode 100644 index 0000000000..75565b8f9b --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Member/Container.php @@ -0,0 +1,55 @@ +_type = $type; + parent::__construct(array(), self::ARRAY_AS_PROPS); + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/CodeGenerator/Php/Method.php b/lib/zend/Zend/CodeGenerator/Php/Method.php new file mode 100644 index 0000000000..3b50060517 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Method.php @@ -0,0 +1,234 @@ +setSourceContent($reflectionMethod->getContents(false)); + $method->setSourceDirty(false); + + if ($reflectionMethod->getDocComment() != '') { + $method->setDocblock(Zend_CodeGenerator_Php_Docblock::fromReflection($reflectionMethod->getDocblock())); + } + + $method->setFinal($reflectionMethod->isFinal()); + + if ($reflectionMethod->isPrivate()) { + $method->setVisibility(self::VISIBILITY_PRIVATE); + } elseif ($reflectionMethod->isProtected()) { + $method->setVisibility(self::VISIBILITY_PROTECTED); + } else { + $method->setVisibility(self::VISIBILITY_PUBLIC); + } + + $method->setStatic($reflectionMethod->isStatic()); + + $method->setName($reflectionMethod->getName()); + + foreach ($reflectionMethod->getParameters() as $reflectionParameter) { + $method->setParameter(Zend_CodeGenerator_Php_Parameter::fromReflection($reflectionParameter)); + } + + $method->setBody($reflectionMethod->getBody()); + + return $method; + } + + /** + * setFinal() + * + * @param bool $isFinal + */ + public function setFinal($isFinal) + { + $this->_isFinal = ($isFinal) ? true : false; + } + + /** + * setParameters() + * + * @param array $parameters + * @return Zend_CodeGenerator_Php_Method + */ + public function setParameters(Array $parameters) + { + foreach ($parameters as $parameter) { + $this->setParameter($parameter); + } + return $this; + } + + /** + * setParameter() + * + * @param Zend_CodeGenerator_Php_Parameter|array $parameter + * @return Zend_CodeGenerator_Php_Method + */ + public function setParameter($parameter) + { + if (is_array($parameter)) { + $parameter = new Zend_CodeGenerator_Php_Parameter($parameter); + $parameterName = $parameter->getName(); + } elseif ($parameter instanceof Zend_CodeGenerator_Php_Parameter) { + $parameterName = $parameter->getName(); + } else { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('setParameter() expects either an array of method options or an instance of Zend_CodeGenerator_Php_Parameter'); + } + + $this->_parameters[$parameterName] = $parameter; + return $this; + } + + /** + * getParameters() + * + * @return array Array of Zend_CodeGenerator_Php_Parameter + */ + public function getParameters() + { + return $this->_parameters; + } + + /** + * setBody() + * + * @param string $body + * @return Zend_CodeGenerator_Php_Method + */ + public function setBody($body) + { + $this->_body = $body; + return $this; + } + + /** + * getBody() + * + * @return string + */ + public function getBody() + { + return $this->_body; + } + + /** + * generate() + * + * @return string + */ + public function generate() + { + $output = ''; + + $indent = $this->getIndentation(); + + if (($docblock = $this->getDocblock()) !== null) { + $docblock->setIndentation($indent); + $output .= $docblock->generate(); + } + + $output .= $indent; + + if ($this->isAbstract()) { + $output .= 'abstract '; + } else { + $output .= (($this->isFinal()) ? 'final ' : ''); + } + + $output .= $this->getVisibility() + . (($this->isStatic()) ? ' static' : '') + . ' function ' . $this->getName() . '('; + + $parameters = $this->getParameters(); + if (!empty($parameters)) { + foreach ($parameters as $parameter) { + $parameterOuput[] = $parameter->generate(); + } + + $output .= implode(', ', $parameterOuput); + } + + $output .= ')' . self::LINE_FEED . $indent . '{' . self::LINE_FEED; + + if ($this->_body) { + $output .= ' ' + . str_replace(self::LINE_FEED, self::LINE_FEED . $indent . $indent, trim($this->_body)) + . self::LINE_FEED; + } + + $output .= $indent . '}' . self::LINE_FEED; + + return $output; + } + +} diff --git a/lib/zend/Zend/CodeGenerator/Php/Parameter.php b/lib/zend/Zend/CodeGenerator/Php/Parameter.php new file mode 100644 index 0000000000..693432866f --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Parameter.php @@ -0,0 +1,250 @@ +setName($reflectionParameter->getName()); + + if($reflectionParameter->isArray()) { + $param->setType('array'); + } else { + $typeClass = $reflectionParameter->getClass(); + if($typeClass !== null) { + $param->setType($typeClass->getName()); + } + } + + $param->setPosition($reflectionParameter->getPosition()); + + if($reflectionParameter->isOptional()) { + $param->setDefaultValue($reflectionParameter->getDefaultValue()); + } + $param->setPassedByReference($reflectionParameter->isPassedByReference()); + + return $param; + } + + /** + * setType() + * + * @param string $type + * @return Zend_CodeGenerator_Php_Parameter + */ + public function setType($type) + { + $this->_type = $type; + return $this; + } + + /** + * getType() + * + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * setName() + * + * @param string $name + * @return Zend_CodeGenerator_Php_Parameter + */ + public function setName($name) + { + $this->_name = $name; + return $this; + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Set the default value of the parameter. + * + * Certain variables are difficult to expres + * + * @param null|bool|string|int|float|Zend_CodeGenerator_Php_Parameter_DefaultValue $defaultValue + * @return Zend_CodeGenerator_Php_Parameter + */ + public function setDefaultValue($defaultValue) + { + if($defaultValue === null) { + $this->_defaultValue = new Zend_CodeGenerator_Php_Parameter_DefaultValue("null"); + } else if(is_array($defaultValue)) { + $defaultValue = str_replace(array("\r", "\n"), "", var_export($defaultValue, true)); + $this->_defaultValue = new Zend_CodeGenerator_Php_Parameter_DefaultValue($defaultValue); + } else if(is_bool($defaultValue)) { + if($defaultValue == true) { + $this->_defaultValue = new Zend_CodeGenerator_Php_Parameter_DefaultValue("true"); + } else { + $this->_defaultValue = new Zend_CodeGenerator_Php_Parameter_DefaultValue("false"); + } + } else { + $this->_defaultValue = $defaultValue; + } + return $this; + } + + /** + * getDefaultValue() + * + * @return string + */ + public function getDefaultValue() + { + return $this->_defaultValue; + } + + /** + * setPosition() + * + * @param int $position + * @return Zend_CodeGenerator_Php_Parameter + */ + public function setPosition($position) + { + $this->_position = $position; + return $this; + } + + /** + * getPosition() + * + * @return int + */ + public function getPosition() + { + return $this->_position; + } + + /** + * @return bool + */ + public function getPassedByReference() + { + return $this->_passedByReference; + } + + /** + * @param bool $passedByReference + * @return Zend_CodeGenerator_Php_Parameter + */ + public function setPassedByReference($passedByReference) + { + $this->_passedByReference = $passedByReference; + return $this; + } + + /** + * generate() + * + * @return string + */ + public function generate() + { + $output = ''; + + if ($this->_type) { + $output .= $this->_type . ' '; + } + + if($this->_passedByReference === true) { + $output .= '&'; + } + + $output .= '$' . $this->_name; + + if ($this->_defaultValue !== null) { + $output .= ' = '; + if (is_string($this->_defaultValue)) { + $output .= '\'' . $this->_defaultValue . '\''; + } else if($this->_defaultValue instanceof Zend_CodeGenerator_Php_ParameterDefaultValue) { + $output .= (string)$this->_defaultValue; + } else { + $output .= $this->_defaultValue; + } + } + + return $output; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/CodeGenerator/Php/Parameter/DefaultValue.php b/lib/zend/Zend/CodeGenerator/Php/Parameter/DefaultValue.php new file mode 100644 index 0000000000..1104696e9e --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Parameter/DefaultValue.php @@ -0,0 +1,60 @@ +_defaultValue = $defaultValue; + } + + public function __toString() + { + return $this->_defaultValue; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/CodeGenerator/Php/Property.php b/lib/zend/Zend/CodeGenerator/Php/Property.php new file mode 100644 index 0000000000..7ae9a4371e --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Property.php @@ -0,0 +1,179 @@ +setName($reflectionProperty->getName()); + + $allDefaultProperties = $reflectionProperty->getDeclaringClass()->getDefaultProperties(); + + $property->setDefaultValue($allDefaultProperties[$reflectionProperty->getName()]); + + if ($reflectionProperty->getDocComment() != '') { + $property->setDocblock(Zend_CodeGenerator_Php_Docblock::fromReflection($reflectionProperty->getDocComment())); + } + + if ($reflectionProperty->isStatic()) { + $property->setStatic(true); + } + + if ($reflectionProperty->isPrivate()) { + $property->setVisibility(self::VISIBILITY_PRIVATE); + } elseif ($reflectionProperty->isProtected()) { + $property->setVisibility(self::VISIBILITY_PROTECTED); + } else { + $property->setVisibility(self::VISIBILITY_PUBLIC); + } + + $property->setSourceDirty(false); + + return $property; + } + + /** + * setConst() + * + * @param bool $const + * @return Zend_CodeGenerator_Php_Property + */ + public function setConst($const) + { + $this->_isConst = $const; + return $this; + } + + /** + * isConst() + * + * @return bool + */ + public function isConst() + { + return ($this->_isConst) ? true : false; + } + + /** + * setDefaultValue() + * + * @param Zend_CodeGenerator_Php_Property_DefaultValue|string|array $defaultValue + * @return Zend_CodeGenerator_Php_Property + */ + public function setDefaultValue($defaultValue) + { + // if it looks like + if (is_array($defaultValue) + && array_key_exists('value', $defaultValue) + && array_key_exists('type', $defaultValue)) { + $defaultValue = new Zend_CodeGenerator_Php_Property_DefaultValue($defaultValue); + } + + if (!($defaultValue instanceof Zend_CodeGenerator_Php_Property_DefaultValue)) { + $defaultValue = new Zend_CodeGenerator_Php_Property_DefaultValue(array('value' => $defaultValue)); + } + + $this->_defaultValue = $defaultValue; + return $this; + } + + /** + * getDefaultValue() + * + * @return Zend_CodeGenerator_Php_Property_DefaultValue + */ + public function getDefaultValue() + { + return $this->_defaultValue; + } + + /** + * generate() + * + * @return string + */ + public function generate() + { + $name = $this->getName(); + $defaultValue = $this->getDefaultValue(); + + $output = ''; + + if (($docblock = $this->getDocblock()) !== null) { + $docblock->setIndentation(' '); + $output .= $docblock->generate(); + } + + if ($this->isConst()) { + if ($defaultValue != null && !$defaultValue->isValidConstantType()) { + require_once 'Zend/CodeGenerator/Php/Exception.php'; + throw new Zend_CodeGenerator_Php_Exception('The property ' . $this->_name . ' is said to be ' + . 'constant but does not have a valid constant value.'); + } + $output .= $this->_indentation . 'const ' . $name . ' = ' + . (($defaultValue !== null) ? $defaultValue->generate() : 'null;'); + } else { + $output .= $this->_indentation + . $this->getVisibility() + . (($this->isStatic()) ? ' static' : '') + . ' $' . $name . ' = ' + . (($defaultValue !== null) ? $defaultValue->generate() : 'null;'); + } + return $output; + } + +} diff --git a/lib/zend/Zend/CodeGenerator/Php/Property/DefaultValue.php b/lib/zend/Zend/CodeGenerator/Php/Property/DefaultValue.php new file mode 100644 index 0000000000..e230e6e203 --- /dev/null +++ b/lib/zend/Zend/CodeGenerator/Php/Property/DefaultValue.php @@ -0,0 +1,323 @@ +getConstants(); + unset($reflect); + } + } + + /** + * isValidConstantType() + * + * @return bool + */ + public function isValidConstantType() + { + if ($this->_type == self::TYPE_AUTO) { + $type = $this->_getAutoDeterminedType($this->_value); + } + + // valid types for constants + $scalarTypes = array( + self::TYPE_BOOLEAN, + self::TYPE_BOOL, + self::TYPE_NUMBER, + self::TYPE_INTEGER, + self::TYPE_INT, + self::TYPE_FLOAT, + self::TYPE_DOUBLE, + self::TYPE_STRING, + self::TYPE_CONSTANT, + self::TYPE_NULL + ); + + return in_array($type, $scalarTypes); + } + + /** + * setValue() + * + * @param mixed $value + * @return Zend_CodeGenerator_Php_Property_DefaultValue + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * getValue() + * + * @return mixed + */ + public function getValue() + { + return $this->_value; + } + + /** + * setType() + * + * @param string $type + * @return Zend_CodeGenerator_Php_Property_DefaultValue + */ + public function setType($type) + { + $this->_type = $type; + return $this; + } + + /** + * getType() + * + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * setArrayDepth() + * + * @param int $arrayDepth + * @return Zend_CodeGenerator_Php_Property_DefaultValue + */ + public function setArrayDepth($arrayDepth) + { + $this->_arrayDepth = $arrayDepth; + return $this; + } + + /** + * getArrayDepth() + * + * @return int + */ + public function getArrayDepth() + { + return $this->_arrayDepth; + } + + /** + * _getValidatedType() + * + * @param string $type + * @return string + */ + protected function _getValidatedType($type) + { + if (($constName = array_search($type, self::$_constants)) !== false) { + return $type; + } + + return self::TYPE_AUTO; + } + + /** + * _getAutoDeterminedType() + * + * @param mixed $value + * @return string + */ + public function _getAutoDeterminedType($value) + { + switch (gettype($value)) { + case 'boolean': + return self::TYPE_BOOLEAN; + case 'integer': + return self::TYPE_INT; + case 'string': + return self::TYPE_STRING; + case 'double': + case 'float': + case 'integer': + return self::TYPE_NUMBER; + case 'array': + return self::TYPE_ARRAY; + case 'NULL': + return self::TYPE_NULL; + case 'object': + case 'resource': + case 'unknown type': + default: + return self::TYPE_OTHER; + } + } + + /** + * generate() + * + * @return string + */ + public function generate() + { + $type = $this->_type; + + if ($type != self::TYPE_AUTO) { + $type = $this->_getValidatedType($type); + } + + $value = $this->_value; + + if ($type == self::TYPE_AUTO) { + $type = $this->_getAutoDeterminedType($value); + + if ($type == self::TYPE_ARRAY) { + $rii = new RecursiveIteratorIterator( + $it = new RecursiveArrayIterator($value), + RecursiveIteratorIterator::SELF_FIRST + ); + foreach ($rii as $curKey => $curValue) { + if (!$curValue instanceof Zend_CodeGenerator_Php_Property_DefaultValue) { + $curValue = new self(array('value' => $curValue)); + $rii->getSubIterator()->offsetSet($curKey, $curValue); + } + $curValue->setArrayDepth($rii->getDepth()); + } + $value = $rii->getSubIterator()->getArrayCopy(); + } + + } + + $output = ''; + + switch ($type) { + case self::TYPE_BOOLEAN: + case self::TYPE_BOOL: + $output .= ( $value ? 'true' : 'false' ); + break; + case self::TYPE_STRING: + $output .= "'" . addcslashes($value, "'") . "'"; + break; + case self::TYPE_NULL: + $output .= 'null'; + break; + case self::TYPE_NUMBER: + case self::TYPE_INTEGER: + case self::TYPE_INT: + case self::TYPE_FLOAT: + case self::TYPE_DOUBLE: + case self::TYPE_CONSTANT: + $output .= $value; + break; + case self::TYPE_ARRAY: + $output .= 'array('; + $curArrayMultiblock = false; + if (count($value) > 1) { + $curArrayMultiblock = true; + $output .= PHP_EOL . str_repeat($this->_indentation, $this->_arrayDepth+1); + } + $outputParts = array(); + $noKeyIndex = 0; + foreach ($value as $n => $v) { + $v->setArrayDepth($this->_arrayDepth + 1); + $partV = $v->generate(); + $partV = substr($partV, 0, strlen($partV)-1); + if ($n === $noKeyIndex) { + $outputParts[] = $partV; + $noKeyIndex++; + } else { + $outputParts[] = (is_int($n) ? $n : "'" . addcslashes($n, "'") . "'") . ' => ' . $partV; + } + + } + $output .= implode(',' . PHP_EOL . str_repeat($this->_indentation, $this->_arrayDepth+1), $outputParts); + if ($curArrayMultiblock == true) { + $output .= PHP_EOL . str_repeat($this->_indentation, $this->_arrayDepth+1); + } + $output .= ')'; + break; + case self::TYPE_OTHER: + default: + require_once "Zend/CodeGenerator/Php/Exception.php"; + throw new Zend_CodeGenerator_Php_Exception( + "Type '".get_class($value)."' is unknown or cannot be used as property default value." + ); + } + + $output .= ';'; + + return $output; + } +} diff --git a/lib/zend/Zend/Config/Exception.php b/lib/zend/Zend/Config/Exception.php new file mode 100644 index 0000000000..10961e210c --- /dev/null +++ b/lib/zend/Zend/Config/Exception.php @@ -0,0 +1,33 @@ +hostname === "staging" + * $data->db->connection === "database" + * + * The $options parameter may be provided as either a boolean or an array. + * If provided as a boolean, this sets the $allowModifications option of + * Zend_Config. If provided as an array, there are two configuration + * directives that may be set. For example: + * + * $options = array( + * 'allowModifications' => false, + * 'nestSeparator' => '->' + * ); + * + * @param string $filename + * @param string|null $section + * @param boolean|array $options + * @throws Zend_Config_Exception + * @return void + */ + public function __construct($filename, $section = null, $options = false) + { + if (empty($filename)) { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('Filename is not set'); + } + + $allowModifications = false; + if (is_bool($options)) { + $allowModifications = $options; + } elseif (is_array($options)) { + if (isset($options['allowModifications'])) { + $allowModifications = (bool) $options['allowModifications']; + } + if (isset($options['nestSeparator'])) { + $this->_nestSeparator = (string) $options['nestSeparator']; + } + if (isset($options['skipExtends'])) { + $this->_skipExtends = (bool) $options['skipExtends']; + } + } + + $iniArray = $this->_loadIniFile($filename); + + if (null === $section) { + // Load entire file + $dataArray = array(); + foreach ($iniArray as $sectionName => $sectionData) { + if(!is_array($sectionData)) { + $dataArray = array_merge_recursive($dataArray, $this->_processKey(array(), $sectionName, $sectionData)); + } else { + $dataArray[$sectionName] = $this->_processSection($iniArray, $sectionName); + } + } + parent::__construct($dataArray, $allowModifications); + } else { + // Load one or more sections + if (!is_array($section)) { + $section = array($section); + } + $dataArray = array(); + foreach ($section as $sectionName) { + if (!isset($iniArray[$sectionName])) { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$sectionName' cannot be found in $filename"); + } + $dataArray = array_merge($this->_processSection($iniArray, $sectionName), $dataArray); + + } + parent::__construct($dataArray, $allowModifications); + } + + $this->_loadedSection = $section; + } + + /** + * Load the ini file and preprocess the section separator (':' in the + * section name (that is used for section extension) so that the resultant + * array has the correct section names and the extension information is + * stored in a sub-key called ';extends'. We use ';extends' as this can + * never be a valid key name in an INI file that has been loaded using + * parse_ini_file(). + * + * @param string $filename + * @throws Zend_Config_Exception + * @return array + */ + protected function _loadIniFile($filename) + { + set_error_handler(array($this, '_loadFileErrorHandler')); + $loaded = parse_ini_file($filename, true); // Warnings and errors are suppressed + restore_error_handler(); + // Check if there was a error while loading file + if ($this->_loadFileErrorStr !== null) { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception($this->_loadFileErrorStr); + } + + $iniArray = array(); + foreach ($loaded as $key => $data) + { + $pieces = explode($this->_sectionSeparator, $key); + $thisSection = trim($pieces[0]); + switch (count($pieces)) { + case 1: + $iniArray[$thisSection] = $data; + break; + + case 2: + $extendedSection = trim($pieces[1]); + $iniArray[$thisSection] = array_merge(array(';extends'=>$extendedSection), $data); + break; + + default: + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$thisSection' may not extend multiple sections in $filename"); + } + } + + return $iniArray; + } + + /** + * Process each element in the section and handle the ";extends" inheritance + * key. Passes control to _processKey() to handle the nest separator + * sub-property syntax that may be used within the key name. + * + * @param array $iniArray + * @param string $section + * @param array $config + * @throws Zend_Config_Exception + * @return array + */ + protected function _processSection($iniArray, $section, $config = array()) + { + $thisSection = $iniArray[$section]; + + foreach ($thisSection as $key => $value) { + if (strtolower($key) == ';extends') { + if (isset($iniArray[$value])) { + $this->_assertValidExtend($section, $value); + + if (!$this->_skipExtends) { + $config = $this->_processSection($iniArray, $value, $config); + } + } else { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Parent section '$section' cannot be found"); + } + } else { + $config = $this->_processKey($config, $key, $value); + } + } + return $config; + } + + /** + * Assign the key's value to the property list. Handles the + * nest separator for sub-properties. + * + * @param array $config + * @param string $key + * @param string $value + * @throws Zend_Config_Exception + * @return array + */ + protected function _processKey($config, $key, $value) + { + if (strpos($key, $this->_nestSeparator) !== false) { + $pieces = explode($this->_nestSeparator, $key, 2); + if (strlen($pieces[0]) && strlen($pieces[1])) { + if (!isset($config[$pieces[0]])) { + if ($pieces[0] === '0' && !empty($config)) { + // convert the current values in $config into an array + $config = array($pieces[0] => $config); + } else { + $config[$pieces[0]] = array(); + } + } elseif (!is_array($config[$pieces[0]])) { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Cannot create sub-key for '{$pieces[0]}' as key already exists"); + } + $config[$pieces[0]] = $this->_processKey($config[$pieces[0]], $pieces[1], $value); + } else { + /** + * @see Zend_Config_Exception + */ + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Invalid key '$key'"); + } + } else { + $config[$key] = $value; + } + return $config; + } +} diff --git a/lib/zend/Zend/Config/Writer.php b/lib/zend/Zend/Config/Writer.php new file mode 100644 index 0000000000..475e507b7f --- /dev/null +++ b/lib/zend/Zend/Config/Writer.php @@ -0,0 +1,101 @@ +setOptions($options); + } + } + + /** + * Set options via a Zend_Config instance + * + * @param Zend_Config $config + * @return Zend_Config_Writer + */ + public function setConfig(Zend_Config $config) + { + $this->_config = $config; + + return $this; + } + + /** + * Set options via an array + * + * @param array $options + * @return Zend_Config_Writer + */ + public function setOptions(array $options) + { + foreach ($options as $key => $value) { + if (in_array(strtolower($key), $this->_skipOptions)) { + continue; + } + + $method = 'set' . ucfirst($key); + if (method_exists($this, $method)) { + $this->$method($value); + } + } + + return $this; + } + + /** + * Write a Zend_Config object to it's target + * + * @return void + */ + abstract public function write(); +} diff --git a/lib/zend/Zend/Config/Writer/Array.php b/lib/zend/Zend/Config/Writer/Array.php new file mode 100644 index 0000000000..4671814bd6 --- /dev/null +++ b/lib/zend/Zend/Config/Writer/Array.php @@ -0,0 +1,132 @@ +_filename = $filename; + + return $this; + } + + /** + * Set wether to exclusively lock the file or not + * + * @param boolean $exclusiveLock + * @return Zend_Config_Writer_Array + */ + public function setExclusiveLock($exclusiveLock) + { + $this->_exclusiveLock = $exclusiveLock; + + return $this; + } + + /** + * Defined by Zend_Config_Writer + * + * @param string $filename + * @param Zend_Config $config + * @param boolean $exclusiveLock + * @throws Zend_Config_Exception When filename was not set + * @throws Zend_Config_Exception When filename is not writable + * @return void + */ + public function write($filename = null, Zend_Config $config = null, $exclusiveLock = null) + { + if ($filename !== null) { + $this->setFilename($filename); + } + + if ($config !== null) { + $this->setConfig($config); + } + + if ($exclusiveLock !== null) { + $this->setExclusiveLock($exclusiveLock); + } + + if ($this->_filename === null) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('No filename was set'); + } + + if ($this->_config === null) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('No config was set'); + } + + $data = $this->_config->toArray(); + $sectionName = $this->_config->getSectionName(); + + if (is_string($sectionName)) { + $data = array($sectionName => $data); + } + + $arrayString = "_exclusiveLock) { + $flags |= LOCK_EX; + } + + $result = @file_put_contents($this->_filename, $arrayString, $flags); + + if ($result === false) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('Could not write to file "' . $this->_filename . '"'); + } + } +} diff --git a/lib/zend/Zend/Config/Writer/Ini.php b/lib/zend/Zend/Config/Writer/Ini.php new file mode 100644 index 0000000000..7069f43e99 --- /dev/null +++ b/lib/zend/Zend/Config/Writer/Ini.php @@ -0,0 +1,212 @@ +_filename = $filename; + + return $this; + } + + /** + * Set wether to exclusively lock the file or not + * + * @param boolean $exclusiveLock + * @return Zend_Config_Writer_Array + */ + public function setExclusiveLock($exclusiveLock) + { + $this->_exclusiveLock = $exclusiveLock; + + return $this; + } + + /** + * Set the nest separator + * + * @param string $filename + * @return Zend_Config_Writer_Ini + */ + public function setNestSeparator($separator) + { + $this->_nestSeparator = $separator; + + return $this; + } + + /** + * Defined by Zend_Config_Writer + * + * @param string $filename + * @param Zend_Config $config + * @param boolean $exclusiveLock + * @throws Zend_Config_Exception When filename was not set + * @throws Zend_Config_Exception When filename is not writable + * @return void + */ + public function write($filename = null, Zend_Config $config = null, $exclusiveLock = null) + { + if ($filename !== null) { + $this->setFilename($filename); + } + + if ($config !== null) { + $this->setConfig($config); + } + + if ($exclusiveLock !== null) { + $this->setExclusiveLock($exclusiveLock); + } + + if ($this->_filename === null) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('No filename was set'); + } + + if ($this->_config === null) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('No config was set'); + } + + $iniString = ''; + $extends = $this->_config->getExtends(); + $sectionName = $this->_config->getSectionName(); + + if (is_string($sectionName)) { + $iniString .= '[' . $sectionName . ']' . "\n" + . $this->_addBranch($this->_config) + . "\n"; + } else { + foreach ($this->_config as $sectionName => $data) { + if (!($data instanceof Zend_Config)) { + $iniString .= $sectionName + . ' = ' + . $this->_prepareValue($data) + . "\n"; + } else { + if (isset($extends[$sectionName])) { + $sectionName .= ' : ' . $extends[$sectionName]; + } + + $iniString .= '[' . $sectionName . ']' . "\n" + . $this->_addBranch($data) + . "\n"; + } + } + } + + $flags = 0; + + if ($this->_exclusiveLock) { + $flags |= LOCK_EX; + } + + $result = @file_put_contents($this->_filename, $iniString, $flags); + + if ($result === false) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('Could not write to file "' . $this->_filename . '"'); + } + } + + /** + * Add a branch to an INI string recursively + * + * @param Zend_Config $config + * @return void + */ + protected function _addBranch(Zend_Config $config, $parents = array()) + { + $iniString = ''; + + foreach ($config as $key => $value) { + $group = array_merge($parents, array($key)); + + if ($value instanceof Zend_Config) { + $iniString .= $this->_addBranch($value, $group); + } else { + $iniString .= implode($this->_nestSeparator, $group) + . ' = ' + . $this->_prepareValue($value) + . "\n"; + } + } + + return $iniString; + } + + /** + * Prepare a value for INI + * + * @param mixed $value + * @return string + */ + protected function _prepareValue($value) + { + if (is_integer($value) || is_float($value)) { + return $value; + } elseif (is_bool($value)) { + return ($value ? 'true' : 'false'); + } else { + return '"' . addslashes($value) . '"'; + } + } +} diff --git a/lib/zend/Zend/Config/Writer/Xml.php b/lib/zend/Zend/Config/Writer/Xml.php new file mode 100644 index 0000000000..09758c6157 --- /dev/null +++ b/lib/zend/Zend/Config/Writer/Xml.php @@ -0,0 +1,204 @@ +_filename = $filename; + + return $this; + } + + /** + * Set wether to exclusively lock the file or not + * + * @param boolean $exclusiveLock + * @return Zend_Config_Writer_Array + */ + public function setExclusiveLock($exclusiveLock) + { + $this->_exclusiveLock = $exclusiveLock; + + return $this; + } + + /** + * Defined by Zend_Config_Writer + * + * @param string $filename + * @param Zend_Config $config + * @param boolean $exclusiveLock + * @throws Zend_Config_Exception When filename was not set + * @throws Zend_Config_Exception When filename is not writable + * @return void + */ + public function write($filename = null, Zend_Config $config = null, $exclusiveLock = null) + { + if ($filename !== null) { + $this->setFilename($filename); + } + + if ($config !== null) { + $this->setConfig($config); + } + + if ($exclusiveLock !== null) { + $this->setExclusiveLock($exclusiveLock); + } + + if ($this->_filename === null) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('No filename was set'); + } + + if ($this->_config === null) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('No config was set'); + } + + $xml = new SimpleXMLElement(''); + $extends = $this->_config->getExtends(); + $sectionName = $this->_config->getSectionName(); + + if (is_string($sectionName)) { + $child = $xml->addChild($sectionName); + + $this->_addBranch($this->_config, $child, $xml); + } else { + foreach ($this->_config as $sectionName => $data) { + if (!($data instanceof Zend_Config)) { + $xml->addChild($sectionName, (string) $data); + } else { + $child = $xml->addChild($sectionName); + + if (isset($extends[$sectionName])) { + $child->addAttribute('zf:extends', $extends[$sectionName], Zend_Config_Xml::XML_NAMESPACE); + } + + $this->_addBranch($data, $child, $xml); + } + } + } + + $dom = dom_import_simplexml($xml)->ownerDocument; + $dom->formatOutput = true; + + $xmlString = $dom->saveXML(); + + $flags = 0; + + if ($this->_exclusiveLock) { + $flags |= LOCK_EX; + } + + $result = @file_put_contents($this->_filename, $xmlString, $flags); + + if ($result === false) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('Could not write to file "' . $this->_filename . '"'); + } + } + + /** + * Add a branch to an XML object recursively + * + * @param Zend_Config $config + * @param SimpleXMLElement $xml + * @param SimpleXMLElement $parent + * @return void + */ + protected function _addBranch(Zend_Config $config, SimpleXMLElement $xml, SimpleXMLElement $parent) + { + $branchType = null; + + foreach ($config as $key => $value) { + if ($branchType === null) { + if (is_numeric($key)) { + $branchType = 'numeric'; + $branchName = $xml->getName(); + $xml = $parent; + + unset($parent->{$branchName}); + } else { + $branchType = 'string'; + } + } else if ($branchType !== (is_numeric($key) ? 'numeric' : 'string')) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception('Mixing of string and numeric keys is not allowed'); + } + + if ($branchType === 'numeric') { + if ($value instanceof Zend_Config) { + $child = $parent->addChild($branchName, (string) $value); + + $this->_addBranch($value, $child, $parent); + } else { + $parent->addChild($branchName, (string) $value); + } + } else { + if ($value instanceof Zend_Config) { + $child = $xml->addChild($key); + + $this->_addBranch($value, $child, $xml); + } else { + $xml->addChild($key, (string) $value); + } + } + } + } +} diff --git a/lib/zend/Zend/Config/Xml.php b/lib/zend/Zend/Config/Xml.php new file mode 100644 index 0000000000..80785636a6 --- /dev/null +++ b/lib/zend/Zend/Config/Xml.php @@ -0,0 +1,315 @@ +_skipExtends = (bool) $options['skipExtends']; + } + } + + set_error_handler(array($this, '_loadFileErrorHandler')); // Warnings and errors are suppressed + if (strstr($xml, '_loadFileErrorStr !== null) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception($this->_loadFileErrorStr); + } + + if ($section === null) { + $dataArray = array(); + foreach ($config as $sectionName => $sectionData) { + $dataArray[$sectionName] = $this->_processExtends($config, $sectionName); + } + + parent::__construct($dataArray, $allowModifications); + } else if (is_array($section)) { + $dataArray = array(); + foreach ($section as $sectionName) { + if (!isset($config->$sectionName)) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$sectionName' cannot be found in $xml"); + } + + $dataArray = array_merge($this->_processExtends($config, $sectionName), $dataArray); + } + + parent::__construct($dataArray, $allowModifications); + } else { + if (!isset($config->$section)) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$section' cannot be found in $xml"); + } + + $dataArray = $this->_processExtends($config, $section); + if (!is_array($dataArray)) { + // Section in the XML file contains just one top level string + $dataArray = array($section => $dataArray); + } + + parent::__construct($dataArray, $allowModifications); + } + + $this->_loadedSection = $section; + } + + /** + * Helper function to process each element in the section and handle + * the "extends" inheritance attribute. + * + * @param SimpleXMLElement $element XML Element to process + * @param string $section Section to process + * @param array $config Configuration which was parsed yet + * @throws Zend_Config_Exception When $section cannot be found + * @return array + */ + protected function _processExtends(SimpleXMLElement $element, $section, array $config = array()) + { + if (!isset($element->$section)) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Section '$section' cannot be found"); + } + + $thisSection = $element->$section; + $nsAttributes = $thisSection->attributes(self::XML_NAMESPACE); + + if (isset($thisSection['extends']) || isset($nsAttributes['extends'])) { + $extendedSection = (string) (isset($nsAttributes['extends']) ? $nsAttributes['extends'] : $thisSection['extends']); + $this->_assertValidExtend($section, $extendedSection); + + if (!$this->_skipExtends) { + $config = $this->_processExtends($element, $extendedSection, $config); + } + } + + $config = $this->_arrayMergeRecursive($config, $this->_toArray($thisSection)); + + return $config; + } + + /** + * Returns a string or an associative and possibly multidimensional array from + * a SimpleXMLElement. + * + * @param SimpleXMLElement $xmlObject Convert a SimpleXMLElement into an array + * @return array|string + */ + protected function _toArray(SimpleXMLElement $xmlObject) + { + $config = array(); + $nsAttributes = $xmlObject->attributes(self::XML_NAMESPACE); + + // Search for parent node values + if (count($xmlObject->attributes()) > 0) { + foreach ($xmlObject->attributes() as $key => $value) { + if ($key === 'extends') { + continue; + } + + $value = (string) $value; + + if (array_key_exists($key, $config)) { + if (!is_array($config[$key])) { + $config[$key] = array($config[$key]); + } + + $config[$key][] = $value; + } else { + $config[$key] = $value; + } + } + } + + // Search for local 'const' nodes and replace them + if (count($xmlObject->children(self::XML_NAMESPACE)) > 0) { + if (count($xmlObject->children()) > 0) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("A node with a 'const' childnode may not have any other children"); + } + + $dom = dom_import_simplexml($xmlObject); + $namespaceChildNodes = array(); + + // We have to store them in an array, as replacing nodes will + // confuse the DOMNodeList later + foreach ($dom->childNodes as $node) { + if ($node instanceof DOMElement && $node->namespaceURI === self::XML_NAMESPACE) { + $namespaceChildNodes[] = $node; + } + } + + foreach ($namespaceChildNodes as $node) { + switch ($node->localName) { + case 'const': + if (!$node->hasAttributeNS(self::XML_NAMESPACE, 'name')) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Misssing 'name' attribute in 'const' node"); + } + + $constantName = $node->getAttributeNS(self::XML_NAMESPACE, 'name'); + + if (!defined($constantName)) { + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Constant with name '$constantName' was not defined"); + } + + $constantValue = constant($constantName); + + $dom->replaceChild($dom->ownerDocument->createTextNode($constantValue), $node); + break; + + default: + require_once 'Zend/Config/Exception.php'; + throw new Zend_Config_Exception("Unknown node with name '$node->localName' found"); + } + } + + return (string) simplexml_import_dom($dom); + } + + // Search for children + if (count($xmlObject->children()) > 0) { + foreach ($xmlObject->children() as $key => $value) { + if (count($value->children()) > 0 || count($value->children(self::XML_NAMESPACE)) > 0) { + $value = $this->_toArray($value); + } else if (count($value->attributes()) > 0) { + $attributes = $value->attributes(); + if (isset($attributes['value'])) { + $value = (string) $attributes['value']; + } else { + $value = $this->_toArray($value); + } + } else { + $value = (string) $value; + } + + if (array_key_exists($key, $config)) { + if (!is_array($config[$key]) || !array_key_exists(0, $config[$key])) { + $config[$key] = array($config[$key]); + } + + $config[$key][] = $value; + } else { + $config[$key] = $value; + } + } + } else if (!isset($xmlObject['extends']) && !isset($nsAttributes['extends']) && (count($config) === 0)) { + // Object has no children nor attributes and doesn't use the extends + // attribute: it's a string + $config = (string) $xmlObject; + } + + return $config; + } + + /** + * Merge two arrays recursively, overwriting keys of the same name + * in $firstArray with the value in $secondArray. + * + * @param mixed $firstArray First array + * @param mixed $secondArray Second array to merge into first array + * @return array + */ + protected function _arrayMergeRecursive($firstArray, $secondArray) + { + if (is_array($firstArray) && is_array($secondArray)) { + foreach ($secondArray as $key => $value) { + if (isset($firstArray[$key])) { + $firstArray[$key] = $this->_arrayMergeRecursive($firstArray[$key], $value); + } else { + if($key === 0) { + $firstArray= array(0=>$this->_arrayMergeRecursive($firstArray, $value)); + } else { + $firstArray[$key] = $value; + } + } + } + } else { + $firstArray = $secondArray; + } + + return $firstArray; + } +} diff --git a/lib/zend/Zend/Console/Getopt.php b/lib/zend/Zend/Console/Getopt.php new file mode 100644 index 0000000000..0936a3e487 --- /dev/null +++ b/lib/zend/Zend/Console/Getopt.php @@ -0,0 +1,957 @@ + self::MODE_ZEND, + self::CONFIG_DASHDASH => true, + self::CONFIG_IGNORECASE => false, + self::CONFIG_PARSEALL => true, + ); + + /** + * Stores the command-line arguments for the calling applicaion. + * + * @var array + */ + protected $_argv = array(); + + /** + * Stores the name of the calling applicaion. + * + * @var string + */ + protected $_progname = ''; + + /** + * Stores the list of legal options for this application. + * + * @var array + */ + protected $_rules = array(); + + /** + * Stores alternate spellings of legal options. + * + * @var array + */ + protected $_ruleMap = array(); + + /** + * Stores options given by the user in the current invocation + * of the application, as well as parameters given in options. + * + * @var array + */ + protected $_options = array(); + + /** + * Stores the command-line arguments other than options. + * + * @var array + */ + protected $_remainingArgs = array(); + + /** + * State of the options: parsed or not yet parsed? + * + * @var boolean + */ + protected $_parsed = false; + + /** + * The constructor takes one to three parameters. + * + * The first parameter is $rules, which may be a string for + * gnu-style format, or a structured array for Zend-style format. + * + * The second parameter is $argv, and it is optional. If not + * specified, $argv is inferred from the global argv. + * + * The third parameter is an array of configuration parameters + * to control the behavior of this instance of Getopt; it is optional. + * + * @param array $rules + * @param array $argv + * @param array $getoptConfig + * @return void + */ + public function __construct($rules, $argv = null, $getoptConfig = array()) + { + if (!isset($_SERVER['argv'])) { + require_once 'Zend/Console/Getopt/Exception.php'; + if (ini_get('register_argc_argv') == false) { + throw new Zend_Console_Getopt_Exception( + "argv is not available, because ini option 'register_argc_argv' is set Off" + ); + } else { + throw new Zend_Console_Getopt_Exception( + '$_SERVER["argv"] is not set, but Zend_Console_Getopt cannot work without this information.' + ); + } + } + + $this->_progname = $_SERVER['argv'][0]; + $this->setOptions($getoptConfig); + $this->addRules($rules); + if (!is_array($argv)) { + $argv = array_slice($_SERVER['argv'], 1); + } + if (isset($argv)) { + $this->addArguments((array)$argv); + } + } + + /** + * Return the state of the option seen on the command line of the + * current application invocation. This function returns true, or the + * parameter to the option, if any. If the option was not given, + * this function returns null. + * + * The magic __get method works in the context of naming the option + * as a virtual member of this class. + * + * @param string $key + * @return string + */ + public function __get($key) + { + return $this->getOption($key); + } + + /** + * Test whether a given option has been seen. + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + $this->parse(); + if (isset($this->_ruleMap[$key])) { + $key = $this->_ruleMap[$key]; + return isset($this->_options[$key]); + } + return false; + } + + /** + * Set the value for a given option. + * + * @param string $key + * @param string $value + * @return void + */ + public function __set($key, $value) + { + $this->parse(); + if (isset($this->_ruleMap[$key])) { + $key = $this->_ruleMap[$key]; + $this->_options[$key] = $value; + } + } + + /** + * Return the current set of options and parameters seen as a string. + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Unset an option. + * + * @param string $key + * @return void + */ + public function __unset($key) + { + $this->parse(); + if (isset($this->_ruleMap[$key])) { + $key = $this->_ruleMap[$key]; + unset($this->_options[$key]); + } + } + + /** + * Define additional command-line arguments. + * These are appended to those defined when the constructor was called. + * + * @param array $argv + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function addArguments($argv) + { + $this->_argv = array_merge($this->_argv, $argv); + $this->_parsed = false; + return $this; + } + + /** + * Define full set of command-line arguments. + * These replace any currently defined. + * + * @param array $argv + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function setArguments($argv) + { + $this->_argv = $argv; + $this->_parsed = false; + return $this; + } + + /** + * Define multiple configuration options from an associative array. + * These are not program options, but properties to configure + * the behavior of Zend_Console_Getopt. + * + * @param array $getoptConfig + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function setOptions($getoptConfig) + { + if (isset($getoptConfig)) { + foreach ($getoptConfig as $key => $value) { + $this->setOption($key, $value); + } + } + return $this; + } + + /** + * Define one configuration option as a key/value pair. + * These are not program options, but properties to configure + * the behavior of Zend_Console_Getopt. + * + * @param string $configKey + * @param string $configValue + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function setOption($configKey, $configValue) + { + if ($configKey !== null) { + $this->_getoptConfig[$configKey] = $configValue; + } + return $this; + } + + /** + * Define additional option rules. + * These are appended to the rules defined when the constructor was called. + * + * @param array $rules + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function addRules($rules) + { + $ruleMode = $this->_getoptConfig['ruleMode']; + switch ($this->_getoptConfig['ruleMode']) { + case self::MODE_ZEND: + if (is_array($rules)) { + $this->_addRulesModeZend($rules); + break; + } + // intentional fallthrough + case self::MODE_GNU: + $this->_addRulesModeGnu($rules); + break; + default: + /** + * Call addRulesModeFoo() for ruleMode 'foo'. + * The developer should subclass Getopt and + * provide this method. + */ + $method = '_addRulesMode' . ucfirst($ruleMode); + $this->$method($rules); + } + $this->_parsed = false; + return $this; + } + + /** + * Return the current set of options and parameters seen as a string. + * + * @return string + */ + public function toString() + { + $this->parse(); + $s = array(); + foreach ($this->_options as $flag => $value) { + $s[] = $flag . '=' . ($value === true ? 'true' : $value); + } + return implode(' ', $s); + } + + /** + * Return the current set of options and parameters seen + * as an array of canonical options and parameters. + * + * Clusters have been expanded, and option aliases + * have been mapped to their primary option names. + * + * @return array + */ + public function toArray() + { + $this->parse(); + $s = array(); + foreach ($this->_options as $flag => $value) { + $s[] = $flag; + if ($value !== true) { + $s[] = $value; + } + } + return $s; + } + + /** + * Return the current set of options and parameters seen in Json format. + * + * @return string + */ + public function toJson() + { + $this->parse(); + $j = array(); + foreach ($this->_options as $flag => $value) { + $j['options'][] = array( + 'option' => array( + 'flag' => $flag, + 'parameter' => $value + ) + ); + } + + /** + * @see Zend_Json + */ + require_once 'Zend/Json.php'; + $json = Zend_Json::encode($j); + + return $json; + } + + /** + * Return the current set of options and parameters seen in XML format. + * + * @return string + */ + public function toXml() + { + $this->parse(); + $doc = new DomDocument('1.0', 'utf-8'); + $optionsNode = $doc->createElement('options'); + $doc->appendChild($optionsNode); + foreach ($this->_options as $flag => $value) { + $optionNode = $doc->createElement('option'); + $optionNode->setAttribute('flag', utf8_encode($flag)); + if ($value !== true) { + $optionNode->setAttribute('parameter', utf8_encode($value)); + } + $optionsNode->appendChild($optionNode); + } + $xml = $doc->saveXML(); + return $xml; + } + + /** + * Return a list of options that have been seen in the current argv. + * + * @return array + */ + public function getOptions() + { + $this->parse(); + return array_keys($this->_options); + } + + /** + * Return the state of the option seen on the command line of the + * current application invocation. + * + * This function returns true, or the parameter value to the option, if any. + * If the option was not given, this function returns false. + * + * @param string $flag + * @return mixed + */ + public function getOption($flag) + { + $this->parse(); + if ($this->_getoptConfig[self::CONFIG_IGNORECASE]) { + $flag = strtolower($flag); + } + if (isset($this->_ruleMap[$flag])) { + $flag = $this->_ruleMap[$flag]; + if (isset($this->_options[$flag])) { + return $this->_options[$flag]; + } + } + return null; + } + + /** + * Return the arguments from the command-line following all options found. + * + * @return array + */ + public function getRemainingArgs() + { + $this->parse(); + return $this->_remainingArgs; + } + + /** + * Return a useful option reference, formatted for display in an + * error message. + * + * Note that this usage information is provided in most Exceptions + * generated by this class. + * + * @return string + */ + public function getUsageMessage() + { + $usage = "Usage: {$this->_progname} [ options ]\n"; + $maxLen = 20; + foreach ($this->_rules as $rule) { + $flags = array(); + if (is_array($rule['alias'])) { + foreach ($rule['alias'] as $flag) { + $flags[] = (strlen($flag) == 1 ? '-' : '--') . $flag; + } + } + $linepart['name'] = implode('|', $flags); + if (isset($rule['param']) && $rule['param'] != 'none') { + $linepart['name'] .= ' '; + switch ($rule['param']) { + case 'optional': + $linepart['name'] .= "[ <{$rule['paramType']}> ]"; + break; + case 'required': + $linepart['name'] .= "<{$rule['paramType']}>"; + break; + } + } + if (strlen($linepart['name']) > $maxLen) { + $maxLen = strlen($linepart['name']); + } + $linepart['help'] = ''; + if (isset($rule['help'])) { + $linepart['help'] .= $rule['help']; + } + $lines[] = $linepart; + } + foreach ($lines as $linepart) { + $usage .= sprintf("%s %s\n", + str_pad($linepart['name'], $maxLen), + $linepart['help']); + } + return $usage; + } + + /** + * Define aliases for options. + * + * The parameter $aliasMap is an associative array + * mapping option name (short or long) to an alias. + * + * @param array $aliasMap + * @throws Zend_Console_Getopt_Exception + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function setAliases($aliasMap) + { + foreach ($aliasMap as $flag => $alias) + { + if ($this->_getoptConfig[self::CONFIG_IGNORECASE]) { + $flag = strtolower($flag); + $alias = strtolower($alias); + } + if (!isset($this->_ruleMap[$flag])) { + continue; + } + $flag = $this->_ruleMap[$flag]; + if (isset($this->_rules[$alias]) || isset($this->_ruleMap[$alias])) { + $o = (strlen($alias) == 1 ? '-' : '--') . $alias; + require_once 'Zend/Console/Getopt/Exception.php'; + throw new Zend_Console_Getopt_Exception( + "Option \"$o\" is being defined more than once."); + } + $this->_rules[$flag]['alias'][] = $alias; + $this->_ruleMap[$alias] = $flag; + } + return $this; + } + + /** + * Define help messages for options. + * + * The parameter $help_map is an associative array + * mapping option name (short or long) to the help string. + * + * @param array $helpMap + * @return Zend_Console_Getopt Provides a fluent interface + */ + public function setHelp($helpMap) + { + foreach ($helpMap as $flag => $help) + { + if (!isset($this->_ruleMap[$flag])) { + continue; + } + $flag = $this->_ruleMap[$flag]; + $this->_rules[$flag]['help'] = $help; + } + return $this; + } + + /** + * Parse command-line arguments and find both long and short + * options. + * + * Also find option parameters, and remaining arguments after + * all options have been parsed. + * + * @return Zend_Console_Getopt|null Provides a fluent interface + */ + public function parse() + { + if ($this->_parsed === true) { + return; + } + $argv = $this->_argv; + $this->_options = array(); + $this->_remainingArgs = array(); + while (count($argv) > 0) { + if ($argv[0] == '--') { + array_shift($argv); + if ($this->_getoptConfig[self::CONFIG_DASHDASH]) { + $this->_remainingArgs = array_merge($this->_remainingArgs, $argv); + break; + } + } + if (substr($argv[0], 0, 2) == '--') { + $this->_parseLongOption($argv); + } else if (substr($argv[0], 0, 1) == '-' && ('-' != $argv[0] || count($argv) >1)) { + $this->_parseShortOptionCluster($argv); + } else if($this->_getoptConfig[self::CONFIG_PARSEALL]) { + $this->_remainingArgs[] = array_shift($argv); + } else { + /* + * We should put all other arguments in _remainingArgs and stop parsing + * since CONFIG_PARSEALL is false. + */ + $this->_remainingArgs = array_merge($this->_remainingArgs, $argv); + break; + } + } + $this->_parsed = true; + return $this; + } + + /** + * Parse command-line arguments for a single long option. + * A long option is preceded by a double '--' character. + * Long options may not be clustered. + * + * @param mixed &$argv + * @return void + */ + protected function _parseLongOption(&$argv) + { + $optionWithParam = ltrim(array_shift($argv), '-'); + $l = explode('=', $optionWithParam, 2); + $flag = array_shift($l); + $param = array_shift($l); + if (isset($param)) { + array_unshift($argv, $param); + } + $this->_parseSingleOption($flag, $argv); + } + + /** + * Parse command-line arguments for short options. + * Short options are those preceded by a single '-' character. + * Short options may be clustered. + * + * @param mixed &$argv + * @return void + */ + protected function _parseShortOptionCluster(&$argv) + { + $flagCluster = ltrim(array_shift($argv), '-'); + foreach (str_split($flagCluster) as $flag) { + $this->_parseSingleOption($flag, $argv); + } + } + + /** + * Parse command-line arguments for a single option. + * + * @param string $flag + * @param mixed $argv + * @throws Zend_Console_Getopt_Exception + * @return void + */ + protected function _parseSingleOption($flag, &$argv) + { + if ($this->_getoptConfig[self::CONFIG_IGNORECASE]) { + $flag = strtolower($flag); + } + if (!isset($this->_ruleMap[$flag])) { + require_once 'Zend/Console/Getopt/Exception.php'; + throw new Zend_Console_Getopt_Exception( + "Option \"$flag\" is not recognized.", + $this->getUsageMessage()); + } + $realFlag = $this->_ruleMap[$flag]; + switch ($this->_rules[$realFlag]['param']) { + case 'required': + if (count($argv) > 0) { + $param = array_shift($argv); + $this->_checkParameterType($realFlag, $param); + } else { + require_once 'Zend/Console/Getopt/Exception.php'; + throw new Zend_Console_Getopt_Exception( + "Option \"$flag\" requires a parameter.", + $this->getUsageMessage()); + } + break; + case 'optional': + if (count($argv) > 0 && substr($argv[0], 0, 1) != '-') { + $param = array_shift($argv); + $this->_checkParameterType($realFlag, $param); + } else { + $param = true; + } + break; + default: + $param = true; + } + $this->_options[$realFlag] = $param; + } + + /** + * Return true if the parameter is in a valid format for + * the option $flag. + * Throw an exception in most other cases. + * + * @param string $flag + * @param string $param + * @throws Zend_Console_Getopt_Exception + * @return bool + */ + protected function _checkParameterType($flag, $param) + { + $type = 'string'; + if (isset($this->_rules[$flag]['paramType'])) { + $type = $this->_rules[$flag]['paramType']; + } + switch ($type) { + case 'word': + if (preg_match('/\W/', $param)) { + require_once 'Zend/Console/Getopt/Exception.php'; + throw new Zend_Console_Getopt_Exception( + "Option \"$flag\" requires a single-word parameter, but was given \"$param\".", + $this->getUsageMessage()); + } + break; + case 'integer': + if (preg_match('/\D/', $param)) { + require_once 'Zend/Console/Getopt/Exception.php'; + throw new Zend_Console_Getopt_Exception( + "Option \"$flag\" requires an integer parameter, but was given \"$param\".", + $this->getUsageMessage()); + } + break; + case 'string': + default: + break; + } + return true; + } + + /** + * Define legal options using the gnu-style format. + * + * @param string $rules + * @return void + */ + protected function _addRulesModeGnu($rules) + { + $ruleArray = array(); + + /** + * Options may be single alphanumeric characters. + * Options may have a ':' which indicates a required string parameter. + * No long options or option aliases are supported in GNU style. + */ + preg_match_all('/([a-zA-Z0-9]:?)/', $rules, $ruleArray); + foreach ($ruleArray[1] as $rule) { + $r = array(); + $flag = substr($rule, 0, 1); + if ($this->_getoptConfig[self::CONFIG_IGNORECASE]) { + $flag = strtolower($flag); + } + $r['alias'][] = $flag; + if (substr($rule, 1, 1) == ':') { + $r['param'] = 'required'; + $r['paramType'] = 'string'; + } else { + $r['param'] = 'none'; + } + $this->_rules[$flag] = $r; + $this->_ruleMap[$flag] = $flag; + } + } + + /** + * Define legal options using the Zend-style format. + * + * @param array $rules + * @throws Zend_Console_Getopt_Exception + * @return void + */ + protected function _addRulesModeZend($rules) + { + foreach ($rules as $ruleCode => $helpMessage) + { + // this may have to translate the long parm type if there + // are any complaints that =string will not work (even though that use + // case is not documented) + if (in_array(substr($ruleCode, -2, 1), array('-', '='))) { + $flagList = substr($ruleCode, 0, -2); + $delimiter = substr($ruleCode, -2, 1); + $paramType = substr($ruleCode, -1); + } else { + $flagList = $ruleCode; + $delimiter = $paramType = null; + } + if ($this->_getoptConfig[self::CONFIG_IGNORECASE]) { + $flagList = strtolower($flagList); + } + $flags = explode('|', $flagList); + $rule = array(); + $mainFlag = $flags[0]; + foreach ($flags as $flag) { + if (empty($flag)) { + require_once 'Zend/Console/Getopt/Exception.php'; + throw new Zend_Console_Getopt_Exception( + "Blank flag not allowed in rule \"$ruleCode\"."); + } + if (strlen($flag) == 1) { + if (isset($this->_ruleMap[$flag])) { + require_once 'Zend/Console/Getopt/Exception.php'; + throw new Zend_Console_Getopt_Exception( + "Option \"-$flag\" is being defined more than once."); + } + $this->_ruleMap[$flag] = $mainFlag; + $rule['alias'][] = $flag; + } else { + if (isset($this->_rules[$flag]) || isset($this->_ruleMap[$flag])) { + require_once 'Zend/Console/Getopt/Exception.php'; + throw new Zend_Console_Getopt_Exception( + "Option \"--$flag\" is being defined more than once."); + } + $this->_ruleMap[$flag] = $mainFlag; + $rule['alias'][] = $flag; + } + } + if (isset($delimiter)) { + switch ($delimiter) { + case self::PARAM_REQUIRED: + $rule['param'] = 'required'; + break; + case self::PARAM_OPTIONAL: + default: + $rule['param'] = 'optional'; + } + switch (substr($paramType, 0, 1)) { + case self::TYPE_WORD: + $rule['paramType'] = 'word'; + break; + case self::TYPE_INTEGER: + $rule['paramType'] = 'integer'; + break; + case self::TYPE_STRING: + default: + $rule['paramType'] = 'string'; + } + } else { + $rule['param'] = 'none'; + } + $rule['help'] = $helpMessage; + $this->_rules[$mainFlag] = $rule; + } + } + +} diff --git a/lib/zend/Zend/Console/Getopt/Exception.php b/lib/zend/Zend/Console/Getopt/Exception.php new file mode 100644 index 0000000000..053200eeda --- /dev/null +++ b/lib/zend/Zend/Console/Getopt/Exception.php @@ -0,0 +1,66 @@ +usage = $usage; + parent::__construct($message); + } + + /** + * Returns the usage + * + * @return string + */ + public function getUsageMessage() + { + return $this->usage; + } +} diff --git a/lib/zend/Zend/Controller/Action.php b/lib/zend/Zend/Controller/Action.php new file mode 100644 index 0000000000..016b40adca --- /dev/null +++ b/lib/zend/Zend/Controller/Action.php @@ -0,0 +1,688 @@ +setRequest($request) + ->setResponse($response) + ->_setInvokeArgs($invokeArgs); + $this->_helper = new Zend_Controller_Action_HelperBroker($this); + $this->init(); + } + + /** + * Initialize object + * + * Called from {@link __construct()} as final step of object instantiation. + * + * @return void + */ + public function init() + { + } + + /** + * Initialize View object + * + * Initializes {@link $view} if not otherwise a Zend_View_Interface. + * + * If {@link $view} is not otherwise set, instantiates a new Zend_View + * object, using the 'views' subdirectory at the same level as the + * controller directory for the current module as the base directory. + * It uses this to set the following: + * - script path = views/scripts/ + * - helper path = views/helpers/ + * - filter path = views/filters/ + * + * @return Zend_View_Interface + * @throws Zend_Controller_Exception if base view directory does not exist + */ + public function initView() + { + if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { + return $this->view; + } + + require_once 'Zend/View/Interface.php'; + if (isset($this->view) && ($this->view instanceof Zend_View_Interface)) { + return $this->view; + } + + $request = $this->getRequest(); + $module = $request->getModuleName(); + $dirs = $this->getFrontController()->getControllerDirectory(); + if (empty($module) || !isset($dirs[$module])) { + $module = $this->getFrontController()->getDispatcher()->getDefaultModule(); + } + $baseDir = dirname($dirs[$module]) . DIRECTORY_SEPARATOR . 'views'; + if (!file_exists($baseDir) || !is_dir($baseDir)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Missing base view directory ("' . $baseDir . '")'); + } + + require_once 'Zend/View.php'; + $this->view = new Zend_View(array('basePath' => $baseDir)); + + return $this->view; + } + + /** + * Render a view + * + * Renders a view. By default, views are found in the view script path as + * /.phtml. You may change the script suffix by + * resetting {@link $viewSuffix}. You may omit the controller directory + * prefix by specifying boolean true for $noController. + * + * By default, the rendered contents are appended to the response. You may + * specify the named body content segment to set by specifying a $name. + * + * @see Zend_Controller_Response_Abstract::appendBody() + * @param string|null $action Defaults to action registered in request object + * @param string|null $name Response object named path segment to use; defaults to null + * @param bool $noController Defaults to false; i.e. use controller name as subdir in which to search for view script + * @return void + */ + public function render($action = null, $name = null, $noController = false) + { + if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { + return $this->_helper->viewRenderer->render($action, $name, $noController); + } + + $view = $this->initView(); + $script = $this->getViewScript($action, $noController); + + $this->getResponse()->appendBody( + $view->render($script), + $name + ); + } + + /** + * Render a given view script + * + * Similar to {@link render()}, this method renders a view script. Unlike render(), + * however, it does not autodetermine the view script via {@link getViewScript()}, + * but instead renders the script passed to it. Use this if you know the + * exact view script name and path you wish to use, or if using paths that do not + * conform to the spec defined with getViewScript(). + * + * By default, the rendered contents are appended to the response. You may + * specify the named body content segment to set by specifying a $name. + * + * @param string $script + * @param string $name + * @return void + */ + public function renderScript($script, $name = null) + { + if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { + return $this->_helper->viewRenderer->renderScript($script, $name); + } + + $view = $this->initView(); + $this->getResponse()->appendBody( + $view->render($script), + $name + ); + } + + /** + * Construct view script path + * + * Used by render() to determine the path to the view script. + * + * @param string $action Defaults to action registered in request object + * @param bool $noController Defaults to false; i.e. use controller name as subdir in which to search for view script + * @return string + * @throws Zend_Controller_Exception with bad $action + */ + public function getViewScript($action = null, $noController = null) + { + if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { + $viewRenderer = $this->_helper->getHelper('viewRenderer'); + if (null !== $noController) { + $viewRenderer->setNoController($noController); + } + return $viewRenderer->getViewScript($action); + } + + $request = $this->getRequest(); + if (null === $action) { + $action = $request->getActionName(); + } elseif (!is_string($action)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid action specifier for view render'); + } + + if (null === $this->_delimiters) { + $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher(); + $wordDelimiters = $dispatcher->getWordDelimiter(); + $pathDelimiters = $dispatcher->getPathDelimiter(); + $this->_delimiters = array_unique(array_merge($wordDelimiters, (array) $pathDelimiters)); + } + + $action = str_replace($this->_delimiters, '-', $action); + $script = $action . '.' . $this->viewSuffix; + + if (!$noController) { + $controller = $request->getControllerName(); + $controller = str_replace($this->_delimiters, '-', $controller); + $script = $controller . DIRECTORY_SEPARATOR . $script; + } + + return $script; + } + + /** + * Return the Request object + * + * @return Zend_Controller_Request_Abstract + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Set the Request object + * + * @param Zend_Controller_Request_Abstract $request + * @return Zend_Controller_Action + */ + public function setRequest(Zend_Controller_Request_Abstract $request) + { + $this->_request = $request; + return $this; + } + + /** + * Return the Response object + * + * @return Zend_Controller_Response_Abstract + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Set the Response object + * + * @param Zend_Controller_Response_Abstract $response + * @return Zend_Controller_Action + */ + public function setResponse(Zend_Controller_Response_Abstract $response) + { + $this->_response = $response; + return $this; + } + + /** + * Set invocation arguments + * + * @param array $args + * @return Zend_Controller_Action + */ + protected function _setInvokeArgs(array $args = array()) + { + $this->_invokeArgs = $args; + return $this; + } + + /** + * Return the array of constructor arguments (minus the Request object) + * + * @return array + */ + public function getInvokeArgs() + { + return $this->_invokeArgs; + } + + /** + * Return a single invocation argument + * + * @param string $key + * @return mixed + */ + public function getInvokeArg($key) + { + if (isset($this->_invokeArgs[$key])) { + return $this->_invokeArgs[$key]; + } + + return null; + } + + /** + * Get a helper by name + * + * @param string $helperName + * @return Zend_Controller_Action_Helper_Abstract + */ + public function getHelper($helperName) + { + return $this->_helper->{$helperName}; + } + + /** + * Get a clone of a helper by name + * + * @param string $helperName + * @return Zend_Controller_Action_Helper_Abstract + */ + public function getHelperCopy($helperName) + { + return clone $this->_helper->{$helperName}; + } + + /** + * Set the front controller instance + * + * @param Zend_Controller_Front $front + * @return Zend_Controller_Action + */ + public function setFrontController(Zend_Controller_Front $front) + { + $this->_frontController = $front; + return $this; + } + + /** + * Retrieve Front Controller + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + // Used cache version if found + if (null !== $this->_frontController) { + return $this->_frontController; + } + + // Grab singleton instance, if class has been loaded + if (class_exists('Zend_Controller_Front')) { + $this->_frontController = Zend_Controller_Front::getInstance(); + return $this->_frontController; + } + + // Throw exception in all other cases + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Front controller class has not been loaded'); + } + + /** + * Pre-dispatch routines + * + * Called before action method. If using class with + * {@link Zend_Controller_Front}, it may modify the + * {@link $_request Request object} and reset its dispatched flag in order + * to skip processing the current action. + * + * @return void + */ + public function preDispatch() + { + } + + /** + * Post-dispatch routines + * + * Called after action method execution. If using class with + * {@link Zend_Controller_Front}, it may modify the + * {@link $_request Request object} and reset its dispatched flag in order + * to process an additional action. + * + * Common usages for postDispatch() include rendering content in a sitewide + * template, link url correction, setting headers, etc. + * + * @return void + */ + public function postDispatch() + { + } + + /** + * Proxy for undefined methods. Default behavior is to throw an + * exception on undefined methods, however this function can be + * overridden to implement magic (dynamic) actions, or provide run-time + * dispatching. + * + * @param string $methodName + * @param array $args + * @return void + * @throws Zend_Controller_Action_Exception + */ + public function __call($methodName, $args) + { + require_once 'Zend/Controller/Action/Exception.php'; + if ('Action' == substr($methodName, -6)) { + $action = substr($methodName, 0, strlen($methodName) - 6); + throw new Zend_Controller_Action_Exception(sprintf('Action "%s" does not exist and was not trapped in __call()', $action), 404); + } + + throw new Zend_Controller_Action_Exception(sprintf('Method "%s" does not exist and was not trapped in __call()', $methodName), 500); + } + + /** + * Dispatch the requested action + * + * @param string $action Method name of action + * @return void + */ + public function dispatch($action) + { + // Notify helpers of action preDispatch state + $this->_helper->notifyPreDispatch(); + + $this->preDispatch(); + if ($this->getRequest()->isDispatched()) { + if (null === $this->_classMethods) { + $this->_classMethods = get_class_methods($this); + } + + // preDispatch() didn't change the action, so we can continue + if ($this->getInvokeArg('useCaseSensitiveActions') || in_array($action, $this->_classMethods)) { + if ($this->getInvokeArg('useCaseSensitiveActions')) { + trigger_error('Using case sensitive actions without word separators is deprecated; please do not rely on this "feature"'); + } + $this->$action(); + } else { + $this->__call($action, array()); + } + $this->postDispatch(); + } + + // whats actually important here is that this action controller is + // shutting down, regardless of dispatching; notify the helpers of this + // state + $this->_helper->notifyPostDispatch(); + } + + /** + * Call the action specified in the request object, and return a response + * + * Not used in the Action Controller implementation, but left for usage in + * Page Controller implementations. Dispatches a method based on the + * request. + * + * Returns a Zend_Controller_Response_Abstract object, instantiating one + * prior to execution if none exists in the controller. + * + * {@link preDispatch()} is called prior to the action, + * {@link postDispatch()} is called following it. + * + * @param null|Zend_Controller_Request_Abstract $request Optional request + * object to use + * @param null|Zend_Controller_Response_Abstract $response Optional response + * object to use + * @return Zend_Controller_Response_Abstract + */ + public function run(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null) + { + if (null !== $request) { + $this->setRequest($request); + } else { + $request = $this->getRequest(); + } + + if (null !== $response) { + $this->setResponse($response); + } + + $action = $request->getActionName(); + if (empty($action)) { + $action = 'index'; + } + $action = $action . 'Action'; + + $request->setDispatched(true); + $this->dispatch($action); + + return $this->getResponse(); + } + + /** + * Gets a parameter from the {@link $_request Request object}. If the + * parameter does not exist, NULL will be returned. + * + * If the parameter does not exist and $default is set, then + * $default will be returned instead of NULL. + * + * @param string $paramName + * @param mixed $default + * @return mixed + */ + protected function _getParam($paramName, $default = null) + { + $value = $this->getRequest()->getParam($paramName); + if ((null == $value) && (null !== $default)) { + $value = $default; + } + + return $value; + } + + /** + * Set a parameter in the {@link $_request Request object}. + * + * @param string $paramName + * @param mixed $value + * @return Zend_Controller_Action + */ + protected function _setParam($paramName, $value) + { + $this->getRequest()->setParam($paramName, $value); + + return $this; + } + + /** + * Determine whether a given parameter exists in the + * {@link $_request Request object}. + * + * @param string $paramName + * @return boolean + */ + protected function _hasParam($paramName) + { + return null !== $this->getRequest()->getParam($paramName); + } + + /** + * Return all parameters in the {@link $_request Request object} + * as an associative array. + * + * @return array + */ + protected function _getAllParams() + { + return $this->getRequest()->getParams(); + } + + + /** + * Forward to another controller/action. + * + * It is important to supply the unformatted names, i.e. "article" + * rather than "ArticleController". The dispatcher will do the + * appropriate formatting when the request is received. + * + * If only an action name is provided, forwards to that action in this + * controller. + * + * If an action and controller are specified, forwards to that action and + * controller in this module. + * + * Specifying an action, controller, and module is the most specific way to + * forward. + * + * A fourth argument, $params, will be used to set the request parameters. + * If either the controller or module are unnecessary for forwarding, + * simply pass null values for them before specifying the parameters. + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return void + */ + final protected function _forward($action, $controller = null, $module = null, array $params = null) + { + $request = $this->getRequest(); + + if (null !== $params) { + $request->setParams($params); + } + + if (null !== $controller) { + $request->setControllerName($controller); + + // Module should only be reset if controller has been specified + if (null !== $module) { + $request->setModuleName($module); + } + } + + $request->setActionName($action) + ->setDispatched(false); + } + + /** + * Redirect to another URL + * + * Proxies to {@link Zend_Controller_Action_Helper_Redirector::gotoUrl()}. + * + * @param string $url + * @param array $options Options to be used when redirecting + * @return void + */ + protected function _redirect($url, array $options = array()) + { + $this->_helper->redirector->gotoUrl($url, $options); + } +} diff --git a/lib/zend/Zend/Controller/Action/Exception.php b/lib/zend/Zend/Controller/Action/Exception.php new file mode 100644 index 0000000000..386fbe08e9 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Exception.php @@ -0,0 +1,38 @@ +_actionController = $actionController; + return $this; + } + + /** + * Retrieve current action controller + * + * @return Zend_Controller_Action + */ + public function getActionController() + { + return $this->_actionController; + } + + /** + * Retrieve front controller instance + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + if (null === $this->_frontController) { + $this->_frontController = Zend_Controller_Front::getInstance(); + } + + return $this->_frontController; + } + + /** + * Hook into action controller initialization + * + * @return void + */ + public function init() + { + } + + /** + * Hook into action controller preDispatch() workflow + * + * @return void + */ + public function preDispatch() + { + } + + /** + * Hook into action controller postDispatch() workflow + * + * @return void + */ + public function postDispatch() + { + } + + /** + * getRequest() - + * + * @return Zend_Controller_Request_Abstract $request + */ + public function getRequest() + { + $controller = $this->getActionController(); + if (null === $controller) { + $controller = $this->getFrontController(); + } + + return $controller->getRequest(); + } + + /** + * getResponse() - + * + * @return Zend_Controller_Response_Abstract $response + */ + public function getResponse() + { + $controller = $this->getActionController(); + if (null === $controller) { + $controller = $this->getFrontController(); + } + + return $controller->getResponse(); + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + $full_class_name = get_class($this); + + if (strpos($full_class_name, '_') !== false) { + $helper_name = strrchr($full_class_name, '_'); + return ltrim($helper_name, '_'); + } else { + return $full_class_name; + } + } +} diff --git a/lib/zend/Zend/Controller/Action/Helper/ActionStack.php b/lib/zend/Zend/Controller/Action/Helper/ActionStack.php new file mode 100644 index 0000000000..8edccfdfd7 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/ActionStack.php @@ -0,0 +1,138 @@ +hasPlugin('Zend_Controller_Plugin_ActionStack')) { + /** + * @see Zend_Controller_Plugin_ActionStack + */ + require_once 'Zend/Controller/Plugin/ActionStack.php'; + $this->_actionStack = new Zend_Controller_Plugin_ActionStack(); + $front->registerPlugin($this->_actionStack, 97); + } else { + $this->_actionStack = $front->getPlugin('Zend_Controller_Plugin_ActionStack'); + } + } + + /** + * Push onto the stack + * + * @param Zend_Controller_Request_Abstract $next + * @return Zend_Controller_Action_Helper_ActionStack Provides a fluent interface + */ + public function pushStack(Zend_Controller_Request_Abstract $next) + { + $this->_actionStack->pushStack($next); + return $this; + } + + /** + * Push a new action onto the stack + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ActionStack + */ + public function actionToStack($action, $controller = null, $module = null, array $params = array()) + { + if ($action instanceof Zend_Controller_Request_Abstract) { + return $this->pushStack($action); + } elseif (!is_string($action)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('ActionStack requires either a request object or minimally a string action'); + } + + $request = $this->getRequest(); + + if ($request instanceof Zend_Controller_Request_Abstract === false){ + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Request object not set yet'); + } + + $controller = (null === $controller) ? $request->getControllerName() : $controller; + $module = (null === $module) ? $request->getModuleName() : $module; + + /** + * @see Zend_Controller_Request_Simple + */ + require_once 'Zend/Controller/Request/Simple.php'; + $newRequest = new Zend_Controller_Request_Simple($action, $controller, $module, $params); + + return $this->pushStack($newRequest); + } + + /** + * Perform helper when called as $this->_helper->actionStack() from an action controller + * + * Proxies to {@link simple()} + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return boolean + */ + public function direct($action, $controller = null, $module = null, array $params = array()) + { + return $this->actionToStack($action, $controller, $module, $params); + } +} diff --git a/lib/zend/Zend/Controller/Action/Helper/AjaxContext.php b/lib/zend/Zend/Controller/Action/Helper/AjaxContext.php new file mode 100644 index 0000000000..06394902f6 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/AjaxContext.php @@ -0,0 +1,77 @@ +addContext('html', array('suffix' => 'ajax')); + } + + /** + * Initialize AJAX context switching + * + * Checks for XHR requests; if detected, attempts to perform context switch. + * + * @param string $format + * @return void + */ + public function initContext($format = null) + { + $this->_currentContext = null; + + if (!$this->getRequest()->isXmlHttpRequest()) { + return; + } + + return parent::initContext($format); + } +} diff --git a/lib/zend/Zend/Controller/Action/Helper/AutoComplete/Abstract.php b/lib/zend/Zend/Controller/Action/Helper/AutoComplete/Abstract.php new file mode 100644 index 0000000000..0306d93b15 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/AutoComplete/Abstract.php @@ -0,0 +1,149 @@ +disableLayout(); + } + + Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true); + + return $this; + } + + /** + * Encode data to JSON + * + * @param mixed $data + * @param bool $keepLayouts + * @throws Zend_Controller_Action_Exception + * @return string + */ + public function encodeJson($data, $keepLayouts = false) + { + if ($this->validateData($data)) { + return Zend_Controller_Action_HelperBroker::getStaticHelper('Json')->encodeJson($data, $keepLayouts); + } + + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Invalid data passed for autocompletion'); + } + + /** + * Send autocompletion data + * + * Calls prepareAutoCompletion, populates response body with this + * information, and sends response. + * + * @param mixed $data + * @param bool $keepLayouts + * @return string|void + */ + public function sendAutoCompletion($data, $keepLayouts = false) + { + $data = $this->prepareAutoCompletion($data, $keepLayouts); + + $response = $this->getResponse(); + $response->setBody($data); + + if (!$this->suppressExit) { + $response->sendResponse(); + exit; + } + + return $data; + } + + /** + * Strategy pattern: allow calling helper as broker method + * + * Prepares autocompletion data and, if $sendNow is true, immediately sends + * response. + * + * @param mixed $data + * @param bool $sendNow + * @param bool $keepLayouts + * @return string|void + */ + public function direct($data, $sendNow = true, $keepLayouts = false) + { + if ($sendNow) { + return $this->sendAutoCompletion($data, $keepLayouts); + } + + return $this->prepareAutoCompletion($data, $keepLayouts); + } +} diff --git a/lib/zend/Zend/Controller/Action/Helper/AutoCompleteDojo.php b/lib/zend/Zend/Controller/Action/Helper/AutoCompleteDojo.php new file mode 100644 index 0000000000..447c0b26d7 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/AutoCompleteDojo.php @@ -0,0 +1,87 @@ + $value) { + $items[] = array('label' => $value, 'name' => $value); + } + $data = new Zend_Dojo_Data('name', $items); + } + + if (!$keepLayouts) { + require_once 'Zend/Controller/Action/HelperBroker.php'; + Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true); + + require_once 'Zend/Layout.php'; + $layout = Zend_Layout::getMvcInstance(); + if ($layout instanceof Zend_Layout) { + $layout->disableLayout(); + } + } + + $response = Zend_Controller_Front::getInstance()->getResponse(); + $response->setHeader('Content-Type', 'application/json'); + + return $data->toJson(); + } +} diff --git a/lib/zend/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php b/lib/zend/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php new file mode 100644 index 0000000000..27356577f7 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php @@ -0,0 +1,82 @@ +validateData($data)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Invalid data passed for autocompletion'); + } + + $data = (array) $data; + $data = '
  • ' . implode('
  • ', $data) . '
'; + + if (!$keepLayouts) { + $this->disableLayouts(); + } + + return $data; + } +} diff --git a/lib/zend/Zend/Controller/Action/Helper/ContextSwitch.php b/lib/zend/Zend/Controller/Action/Helper/ContextSwitch.php new file mode 100644 index 0000000000..239ab3e718 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/ContextSwitch.php @@ -0,0 +1,1394 @@ +setConfig($options); + } elseif (is_array($options)) { + $this->setOptions($options); + } + + if (empty($this->_contexts)) { + $this->addContexts(array( + 'json' => array( + 'suffix' => 'json', + 'headers' => array('Content-Type' => 'application/json'), + 'callbacks' => array( + 'init' => 'initJsonContext', + 'post' => 'postJsonContext' + ) + ), + 'xml' => array( + 'suffix' => 'xml', + 'headers' => array('Content-Type' => 'application/xml'), + ) + )); + } + + $this->init(); + } + + /** + * Initialize at start of action controller + * + * Reset the view script suffix to the original state, or store the + * original state. + * + * @return void + */ + public function init() + { + if (null === $this->_viewSuffixOrig) { + $this->_viewSuffixOrig = $this->_getViewRenderer()->getViewSuffix(); + } else { + $this->_getViewRenderer()->setViewSuffix($this->_viewSuffixOrig); + } + } + + /** + * Configure object from array of options + * + * @param array $options + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setOptions(array $options) + { + if (isset($options['contexts'])) { + $this->setContexts($options['contexts']); + unset($options['contexts']); + } + + foreach ($options as $key => $value) { + $method = 'set' . ucfirst($key); + if (in_array($method, $this->_unconfigurable)) { + continue; + } + + if (in_array($method, $this->_specialConfig)) { + $method = '_' . $method; + } + + if (method_exists($this, $method)) { + $this->$method($value); + } + } + return $this; + } + + /** + * Set object state from config object + * + * @param Zend_Config $config + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Strategy pattern: return object + * + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function direct() + { + return $this; + } + + /** + * Initialize context detection and switching + * + * @param mixed $format + * @throws Zend_Controller_Action_Exception + * @return void + */ + public function initContext($format = null) + { + $this->_currentContext = null; + + $controller = $this->getActionController(); + $request = $this->getRequest(); + $action = $request->getActionName(); + + // Return if no context switching enabled, or no context switching + // enabled for this action + $contexts = $this->getActionContexts($action); + if (empty($contexts)) { + return; + } + + // Return if no context parameter provided + if (!$context = $request->getParam($this->getContextParam())) { + if ($format === null) { + return; + } + $context = $format; + $format = null; + } + + // Check if context allowed by action controller + if (!$this->hasActionContext($action, $context)) { + return; + } + + // Return if invalid context parameter provided and no format or invalid + // format provided + if (!$this->hasContext($context)) { + if (empty($format) || !$this->hasContext($format)) { + + return; + } + } + + // Use provided format if passed + if (!empty($format) && $this->hasContext($format)) { + $context = $format; + } + + $suffix = $this->getSuffix($context); + + $this->_getViewRenderer()->setViewSuffix($suffix); + + $headers = $this->getHeaders($context); + if (!empty($headers)) { + $response = $this->getResponse(); + foreach ($headers as $header => $content) { + $response->setHeader($header, $content); + } + } + + if ($this->getAutoDisableLayout()) { + /** + * @see Zend_Layout + */ + require_once 'Zend/Layout.php'; + $layout = Zend_Layout::getMvcInstance(); + if (null !== $layout) { + $layout->disableLayout(); + } + } + + if (null !== ($callback = $this->getCallback($context, self::TRIGGER_INIT))) { + if (is_string($callback) && method_exists($this, $callback)) { + $this->$callback(); + } elseif (is_string($callback) && function_exists($callback)) { + $callback(); + } elseif (is_array($callback)) { + call_user_func($callback); + } else { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Invalid context callback registered for context "%s"', $context)); + } + } + + $this->_currentContext = $context; + } + + /** + * JSON context extra initialization + * + * Turns off viewRenderer auto-rendering + * + * @return void + */ + public function initJsonContext() + { + if (!$this->getAutoJsonSerialization()) { + return; + } + + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + $view = $viewRenderer->view; + if ($view instanceof Zend_View_Interface) { + $viewRenderer->setNoRender(true); + } + } + + /** + * Should JSON contexts auto-serialize? + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setAutoJsonSerialization($flag) + { + $this->_autoJsonSerialization = (bool) $flag; + return $this; + } + + /** + * Get JSON context auto-serialization flag + * + * @return boolean + */ + public function getAutoJsonSerialization() + { + return $this->_autoJsonSerialization; + } + + /** + * Set suffix from array + * + * @param array $spec + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + protected function _setSuffix(array $spec) + { + foreach ($spec as $context => $suffixInfo) { + if (!is_string($context)) { + $context = null; + } + + if (is_string($suffixInfo)) { + $this->setSuffix($context, $suffixInfo); + continue; + } elseif (is_array($suffixInfo)) { + if (isset($suffixInfo['suffix'])) { + $suffix = $suffixInfo['suffix']; + $prependViewRendererSuffix = true; + + if ((null === $context) && isset($suffixInfo['context'])) { + $context = $suffixInfo['context']; + } + + if (isset($suffixInfo['prependViewRendererSuffix'])) { + $prependViewRendererSuffix = $suffixInfo['prependViewRendererSuffix']; + } + + $this->setSuffix($context, $suffix, $prependViewRendererSuffix); + continue; + } + + $count = count($suffixInfo); + switch (true) { + case (($count < 2) && (null === $context)): + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Invalid suffix information provided in config'); + case ($count < 2): + $suffix = array_shift($suffixInfo); + $this->setSuffix($context, $suffix); + break; + case (($count < 3) && (null === $context)): + $context = array_shift($suffixInfo); + $suffix = array_shift($suffixInfo); + $this->setSuffix($context, $suffix); + break; + case (($count == 3) && (null === $context)): + $context = array_shift($suffixInfo); + $suffix = array_shift($suffixInfo); + $prependViewRendererSuffix = array_shift($suffixInfo); + $this->setSuffix($context, $suffix, $prependViewRendererSuffix); + break; + case ($count >= 2): + $suffix = array_shift($suffixInfo); + $prependViewRendererSuffix = array_shift($suffixInfo); + $this->setSuffix($context, $suffix, $prependViewRendererSuffix); + break; + } + } + } + return $this; + } + + /** + * Customize view script suffix to use when switching context. + * + * Passing an empty suffix value to the setters disables the view script + * suffix change. + * + * @param string $context Context type for which to set suffix + * @param string $suffix Suffix to use + * @param boolean $prependViewRendererSuffix Whether or not to prepend the new suffix to the viewrenderer suffix + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setSuffix($context, $suffix, $prependViewRendererSuffix = true) + { + if (!isset($this->_contexts[$context])) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Cannot set suffix; invalid context type "%s"', $context)); + } + + if (empty($suffix)) { + $suffix = ''; + } + + if (is_array($suffix)) { + if (isset($suffix['prependViewRendererSuffix'])) { + $prependViewRendererSuffix = $suffix['prependViewRendererSuffix']; + } + if (isset($suffix['suffix'])) { + $suffix = $suffix['suffix']; + } else { + $suffix = ''; + } + } + + $suffix = (string) $suffix; + + if ($prependViewRendererSuffix) { + if (empty($suffix)) { + $suffix = $this->_getViewRenderer()->getViewSuffix(); + } else { + $suffix .= '.' . $this->_getViewRenderer()->getViewSuffix(); + } + } + + $this->_contexts[$context]['suffix'] = $suffix; + return $this; + } + + /** + * Retrieve suffix for given context type + * + * @param string $type Context type + * @throws Zend_Controller_Action_Exception + * @return string + */ + public function getSuffix($type) + { + if (!isset($this->_contexts[$type])) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Cannot retrieve suffix; invalid context type "%s"', $type)); + } + + return $this->_contexts[$type]['suffix']; + } + + /** + * Does the given context exist? + * + * @param string $context + * @param boolean $throwException + * @throws Zend_Controller_Action_Exception if context does not exist and throwException is true + * @return bool + */ + public function hasContext($context, $throwException = false) + { + if (is_string($context)) { + if (isset($this->_contexts[$context])) { + return true; + } + } elseif (is_array($context)) { + $error = false; + foreach ($context as $test) { + if (!isset($this->_contexts[$test])) { + $error = (string) $test; + break; + } + } + if (false === $error) { + return true; + } + $context = $error; + } elseif (true === $context) { + return true; + } + + if ($throwException) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Context "%s" does not exist', $context)); + } + + return false; + } + + /** + * Add header to context + * + * @param string $context + * @param string $header + * @param string $content + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function addHeader($context, $header, $content) + { + $context = (string) $context; + $this->hasContext($context, true); + + $header = (string) $header; + $content = (string) $content; + + if (isset($this->_contexts[$context]['headers'][$header])) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Cannot add "%s" header to context "%s": already exists', $header, $context)); + } + + $this->_contexts[$context]['headers'][$header] = $content; + return $this; + } + + /** + * Customize response header to use when switching context + * + * Passing an empty header value to the setters disables the response + * header. + * + * @param string $type Context type for which to set suffix + * @param string $header Header to set + * @param string $content Header content + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setHeader($context, $header, $content) + { + $this->hasContext($context, true); + $context = (string) $context; + $header = (string) $header; + $content = (string) $content; + + $this->_contexts[$context]['headers'][$header] = $content; + return $this; + } + + /** + * Add multiple headers at once for a given context + * + * @param string $context + * @param array $headers + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function addHeaders($context, array $headers) + { + foreach ($headers as $header => $content) { + $this->addHeader($context, $header, $content); + } + + return $this; + } + + /** + * Set headers from context => headers pairs + * + * @param array $options + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + protected function _setHeaders(array $options) + { + foreach ($options as $context => $headers) { + if (!is_array($headers)) { + continue; + } + $this->setHeaders($context, $headers); + } + + return $this; + } + + /** + * Set multiple headers at once for a given context + * + * @param string $context + * @param array $headers + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setHeaders($context, array $headers) + { + $this->clearHeaders($context); + foreach ($headers as $header => $content) { + $this->setHeader($context, $header, $content); + } + + return $this; + } + + /** + * Retrieve context header + * + * Returns the value of a given header for a given context type + * + * @param string $context + * @param string $header + * @return string|null + */ + public function getHeader($context, $header) + { + $this->hasContext($context, true); + $context = (string) $context; + $header = (string) $header; + if (isset($this->_contexts[$context]['headers'][$header])) { + return $this->_contexts[$context]['headers'][$header]; + } + + return null; + } + + /** + * Retrieve context headers + * + * Returns all headers for a context as key/value pairs + * + * @param string $context + * @return array + */ + public function getHeaders($context) + { + $this->hasContext($context, true); + $context = (string) $context; + return $this->_contexts[$context]['headers']; + } + + /** + * Remove a single header from a context + * + * @param string $context + * @param string $header + * @return boolean + */ + public function removeHeader($context, $header) + { + $this->hasContext($context, true); + $context = (string) $context; + $header = (string) $header; + if (isset($this->_contexts[$context]['headers'][$header])) { + unset($this->_contexts[$context]['headers'][$header]); + return true; + } + + return false; + } + + /** + * Clear all headers for a given context + * + * @param string $context + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function clearHeaders($context) + { + $this->hasContext($context, true); + $context = (string) $context; + $this->_contexts[$context]['headers'] = array(); + return $this; + } + + /** + * Validate trigger and return in normalized form + * + * @param string $trigger + * @throws Zend_Controller_Action_Exception + * @return string + */ + protected function _validateTrigger($trigger) + { + $trigger = strtoupper($trigger); + if ('TRIGGER_' !== substr($trigger, 0, 8)) { + $trigger = 'TRIGGER_' . $trigger; + } + + if (!in_array($trigger, array(self::TRIGGER_INIT, self::TRIGGER_POST))) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Invalid trigger "%s"', $trigger)); + } + + return $trigger; + } + + /** + * Set a callback for a given context and trigger + * + * @param string $context + * @param string $trigger + * @param string|array $callback + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setCallback($context, $trigger, $callback) + { + $this->hasContext($context, true); + $trigger = $this->_validateTrigger($trigger); + + if (!is_string($callback)) { + if (!is_array($callback) || (2 != count($callback))) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Invalid callback specified'); + } + } + + $this->_contexts[$context]['callbacks'][$trigger] = $callback; + return $this; + } + + /** + * Set callbacks from array of context => callbacks pairs + * + * @param array $options + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + protected function _setCallbacks(array $options) + { + foreach ($options as $context => $callbacks) { + if (!is_array($callbacks)) { + continue; + } + + $this->setCallbacks($context, $callbacks); + } + return $this; + } + + /** + * Set callbacks for a given context + * + * Callbacks should be in trigger/callback pairs. + * + * @param string $context + * @param array $callbacks + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setCallbacks($context, array $callbacks) + { + $this->hasContext($context, true); + $context = (string) $context; + if (!isset($this->_contexts[$context]['callbacks'])) { + $this->_contexts[$context]['callbacks'] = array(); + } + + foreach ($callbacks as $trigger => $callback) { + $this->setCallback($context, $trigger, $callback); + } + return $this; + } + + /** + * Get a single callback for a given context and trigger + * + * @param string $context + * @param string $trigger + * @return string|array|null + */ + public function getCallback($context, $trigger) + { + $this->hasContext($context, true); + $trigger = $this->_validateTrigger($trigger); + if (isset($this->_contexts[$context]['callbacks'][$trigger])) { + return $this->_contexts[$context]['callbacks'][$trigger]; + } + + return null; + } + + /** + * Get all callbacks for a given context + * + * @param string $context + * @return array + */ + public function getCallbacks($context) + { + $this->hasContext($context, true); + return $this->_contexts[$context]['callbacks']; + } + + /** + * Clear a callback for a given context and trigger + * + * @param string $context + * @param string $trigger + * @return boolean + */ + public function removeCallback($context, $trigger) + { + $this->hasContext($context, true); + $trigger = $this->_validateTrigger($trigger); + if (isset($this->_contexts[$context]['callbacks'][$trigger])) { + unset($this->_contexts[$context]['callbacks'][$trigger]); + return true; + } + + return false; + } + + /** + * Clear all callbacks for a given context + * + * @param string $context + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function clearCallbacks($context) + { + $this->hasContext($context, true); + $this->_contexts[$context]['callbacks'] = array(); + return $this; + } + + /** + * Set name of parameter to use when determining context format + * + * @param string $name + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setContextParam($name) + { + $this->_contextParam = (string) $name; + return $this; + } + + /** + * Return context format request parameter name + * + * @return string + */ + public function getContextParam() + { + return $this->_contextParam; + } + + /** + * Indicate default context to use when no context format provided + * + * @param string $type + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setDefaultContext($type) + { + if (!isset($this->_contexts[$type])) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Cannot set default context; invalid context type "%s"', $type)); + } + + $this->_defaultContext = $type; + return $this; + } + + /** + * Return default context + * + * @return string + */ + public function getDefaultContext() + { + return $this->_defaultContext; + } + + /** + * Set flag indicating if layout should be disabled + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setAutoDisableLayout($flag) + { + $this->_disableLayout = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve auto layout disable flag + * + * @return boolean + */ + public function getAutoDisableLayout() + { + return $this->_disableLayout; + } + + /** + * Add new context + * + * @param string $context Context type + * @param array $spec Context specification + * @throws Zend_Controller_Action_Exception + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function addContext($context, array $spec) + { + if ($this->hasContext($context)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Cannot add context "%s"; already exists', $context)); + } + $context = (string) $context; + + $this->_contexts[$context] = array(); + + $this->setSuffix($context, (isset($spec['suffix']) ? $spec['suffix'] : '')) + ->setHeaders($context, (isset($spec['headers']) ? $spec['headers'] : array())) + ->setCallbacks($context, (isset($spec['callbacks']) ? $spec['callbacks'] : array())); + return $this; + } + + /** + * Overwrite existing context + * + * @param string $context Context type + * @param array $spec Context specification + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setContext($context, array $spec) + { + $this->removeContext($context); + return $this->addContext($context, $spec); + } + + /** + * Add multiple contexts + * + * @param array $contexts + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function addContexts(array $contexts) + { + foreach ($contexts as $context => $spec) { + $this->addContext($context, $spec); + } + return $this; + } + + /** + * Set multiple contexts, after first removing all + * + * @param array $contexts + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setContexts(array $contexts) + { + $this->clearContexts(); + foreach ($contexts as $context => $spec) { + $this->addContext($context, $spec); + } + return $this; + } + + /** + * Retrieve context specification + * + * @param string $context + * @return array|null + */ + public function getContext($context) + { + if ($this->hasContext($context)) { + return $this->_contexts[(string) $context]; + } + return null; + } + + /** + * Retrieve context definitions + * + * @return array + */ + public function getContexts() + { + return $this->_contexts; + } + + /** + * Remove a context + * + * @param string $context + * @return boolean + */ + public function removeContext($context) + { + if ($this->hasContext($context)) { + unset($this->_contexts[(string) $context]); + return true; + } + return false; + } + + /** + * Remove all contexts + * + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function clearContexts() + { + $this->_contexts = array(); + return $this; + } + + /** + * Return current context, if any + * + * @return null|string + */ + public function getCurrentContext() + { + return $this->_currentContext; + } + + /** + * Post dispatch processing + * + * Execute postDispatch callback for current context, if available + * + * @throws Zend_Controller_Action_Exception + * @return void + */ + public function postDispatch() + { + $context = $this->getCurrentContext(); + if (null !== $context) { + if (null !== ($callback = $this->getCallback($context, self::TRIGGER_POST))) { + if (is_string($callback) && method_exists($this, $callback)) { + $this->$callback(); + } elseif (is_string($callback) && function_exists($callback)) { + $callback(); + } elseif (is_array($callback)) { + call_user_func($callback); + } else { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Invalid postDispatch context callback registered for context "%s"', $context)); + } + } + } + } + + /** + * JSON post processing + * + * JSON serialize view variables to response body + * + * @return void + */ + public function postJsonContext() + { + if (!$this->getAutoJsonSerialization()) { + return; + } + + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + $view = $viewRenderer->view; + if ($view instanceof Zend_View_Interface) { + /** + * @see Zend_Json + */ + if(method_exists($view, 'getVars')) { + require_once 'Zend/Json.php'; + $vars = Zend_Json::encode($view->getVars()); + $this->getResponse()->setBody($vars); + } else { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('View does not implement the getVars() method needed to encode the view into JSON'); + } + } + } + + /** + * Add one or more contexts to an action + * + * @param string $action + * @param string|array $context + * @return Zend_Controller_Action_Helper_ContextSwitch|void Provides a fluent interface + */ + public function addActionContext($action, $context) + { + $this->hasContext($context, true); + $controller = $this->getActionController(); + if (null === $controller) { + return; + } + $action = (string) $action; + $contextKey = $this->_contextKey; + + if (!isset($controller->$contextKey)) { + $controller->$contextKey = array(); + } + + if (true === $context) { + $contexts = $this->getContexts(); + $controller->{$contextKey}[$action] = array_keys($contexts); + return $this; + } + + $context = (array) $context; + if (!isset($controller->{$contextKey}[$action])) { + $controller->{$contextKey}[$action] = $context; + } else { + $controller->{$contextKey}[$action] = array_merge( + $controller->{$contextKey}[$action], + $context + ); + } + + return $this; + } + + /** + * Set a context as available for a given controller action + * + * @param string $action + * @param string|array $context + * @return Zend_Controller_Action_Helper_ContextSwitch|void Provides a fluent interface + */ + public function setActionContext($action, $context) + { + $this->hasContext($context, true); + $controller = $this->getActionController(); + if (null === $controller) { + return; + } + $action = (string) $action; + $contextKey = $this->_contextKey; + + if (!isset($controller->$contextKey)) { + $controller->$contextKey = array(); + } + + if (true === $context) { + $contexts = $this->getContexts(); + $controller->{$contextKey}[$action] = array_keys($contexts); + } else { + $controller->{$contextKey}[$action] = (array) $context; + } + + return $this; + } + + /** + * Add multiple action/context pairs at once + * + * @param array $contexts + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function addActionContexts(array $contexts) + { + foreach ($contexts as $action => $context) { + $this->addActionContext($action, $context); + } + return $this; + } + + /** + * Overwrite and set multiple action contexts at once + * + * @param array $contexts + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function setActionContexts(array $contexts) + { + foreach ($contexts as $action => $context) { + $this->setActionContext($action, $context); + } + return $this; + } + + /** + * Does a particular controller action have the given context(s)? + * + * @param string $action + * @param string|array $context + * @throws Zend_Controller_Action_Exception + * @return boolean + */ + public function hasActionContext($action, $context) + { + $this->hasContext($context, true); + $controller = $this->getActionController(); + if (null === $controller) { + return false; + } + $action = (string) $action; + $contextKey = $this->_contextKey; + + if (!isset($controller->{$contextKey})) { + return false; + } + + $allContexts = $controller->{$contextKey}; + + if (!is_array($allContexts)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception("Invalid contexts found for controller"); + } + + if (!isset($allContexts[$action])) { + return false; + } + + if (true === $allContexts[$action]) { + return true; + } + + $contexts = $allContexts[$action]; + + if (!is_array($contexts)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf("Invalid contexts found for action '%s'", $action)); + } + + if (is_string($context) && in_array($context, $contexts)) { + return true; + } elseif (is_array($context)) { + $found = true; + foreach ($context as $test) { + if (!in_array($test, $contexts)) { + $found = false; + break; + } + } + return $found; + } + + return false; + } + + /** + * Get contexts for a given action or all actions in the controller + * + * @param string $action + * @return array + */ + public function getActionContexts($action = null) + { + $controller = $this->getActionController(); + if (null === $controller) { + return array(); + } + $action = (string) $action; + $contextKey = $this->_contextKey; + + if (!isset($controller->$contextKey)) { + return array(); + } + + if (null !== $action) { + if (isset($controller->{$contextKey}[$action])) { + return $controller->{$contextKey}[$action]; + } else { + return array(); + } + } + + return $controller->$contextKey; + } + + /** + * Remove one or more contexts for a given controller action + * + * @param string $action + * @param string|array $context + * @return boolean + */ + public function removeActionContext($action, $context) + { + if ($this->hasActionContext($action, $context)) { + $controller = $this->getActionController(); + $contextKey = $this->_contextKey; + $action = (string) $action; + $contexts = $controller->$contextKey; + $actionContexts = $contexts[$action]; + $contexts = (array) $context; + foreach ($contexts as $context) { + $index = array_search($context, $actionContexts); + if (false !== $index) { + unset($controller->{$contextKey}[$action][$index]); + } + } + return true; + } + return false; + } + + /** + * Clear all contexts for a given controller action or all actions + * + * @param string $action + * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface + */ + public function clearActionContexts($action = null) + { + $controller = $this->getActionController(); + $contextKey = $this->_contextKey; + + if (!isset($controller->$contextKey) || empty($controller->$contextKey)) { + return $this; + } + + if (null === $action) { + $controller->$contextKey = array(); + return $this; + } + + $action = (string) $action; + if (isset($controller->{$contextKey}[$action])) { + unset($controller->{$contextKey}[$action]); + } + + return $this; + } + + /** + * Retrieve ViewRenderer + * + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + protected function _getViewRenderer() + { + if (null === $this->_viewRenderer) { + $this->_viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + } + + return $this->_viewRenderer; + } +} + diff --git a/lib/zend/Zend/Controller/Action/Helper/FlashMessenger.php b/lib/zend/Zend/Controller/Action/Helper/FlashMessenger.php new file mode 100644 index 0000000000..45b38a5038 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/FlashMessenger.php @@ -0,0 +1,266 @@ +getName()); + foreach (self::$_session as $namespace => $messages) { + self::$_messages[$namespace] = $messages; + unset(self::$_session->{$namespace}); + } + } + } + + /** + * postDispatch() - runs after action is dispatched, in this + * case, it is resetting the namespace in case we have forwarded to a different + * action, Flashmessage will be 'clean' (default namespace) + * + * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface + */ + public function postDispatch() + { + $this->resetNamespace(); + return $this; + } + + /** + * setNamespace() - change the namespace messages are added to, useful for + * per action controller messaging between requests + * + * @param string $namespace + * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface + */ + public function setNamespace($namespace = 'default') + { + $this->_namespace = $namespace; + return $this; + } + + /** + * resetNamespace() - reset the namespace to the default + * + * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface + */ + public function resetNamespace() + { + $this->setNamespace(); + return $this; + } + + /** + * addMessage() - Add a message to flash message + * + * @param string $message + * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface + */ + public function addMessage($message) + { + if (self::$_messageAdded === false) { + self::$_session->setExpirationHops(1, null, true); + } + + if (!is_array(self::$_session->{$this->_namespace})) { + self::$_session->{$this->_namespace} = array(); + } + + self::$_session->{$this->_namespace}[] = $message; + + return $this; + } + + /** + * hasMessages() - Wether a specific namespace has messages + * + * @return boolean + */ + public function hasMessages() + { + return isset(self::$_messages[$this->_namespace]); + } + + /** + * getMessages() - Get messages from a specific namespace + * + * @return array + */ + public function getMessages() + { + if ($this->hasMessages()) { + return self::$_messages[$this->_namespace]; + } + + return array(); + } + + /** + * Clear all messages from the previous request & current namespace + * + * @return boolean True if messages were cleared, false if none existed + */ + public function clearMessages() + { + if ($this->hasMessages()) { + unset(self::$_messages[$this->_namespace]); + return true; + } + + return false; + } + + /** + * hasCurrentMessages() - check to see if messages have been added to current + * namespace within this request + * + * @return boolean + */ + public function hasCurrentMessages() + { + return isset(self::$_session->{$this->_namespace}); + } + + /** + * getCurrentMessages() - get messages that have been added to the current + * namespace within this request + * + * @return array + */ + public function getCurrentMessages() + { + if ($this->hasCurrentMessages()) { + return self::$_session->{$this->_namespace}; + } + + return array(); + } + + /** + * clear messages from the current request & current namespace + * + * @return boolean + */ + public function clearCurrentMessages() + { + if ($this->hasCurrentMessages()) { + unset(self::$_session->{$this->_namespace}); + return true; + } + + return false; + } + + /** + * getIterator() - complete the IteratorAggregate interface, for iterating + * + * @return ArrayObject + */ + public function getIterator() + { + if ($this->hasMessages()) { + return new ArrayObject($this->getMessages()); + } + + return new ArrayObject(); + } + + /** + * count() - Complete the countable interface + * + * @return int + */ + public function count() + { + if ($this->hasMessages()) { + return count($this->getMessages()); + } + + return 0; + } + + /** + * Strategy pattern: proxy to addMessage() + * + * @param string $message + * @return void + */ + public function direct($message) + { + return $this->addMessage($message); + } +} diff --git a/lib/zend/Zend/Controller/Action/Helper/Json.php b/lib/zend/Zend/Controller/Action/Helper/Json.php new file mode 100644 index 0000000000..58834dbdc3 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/Json.php @@ -0,0 +1,130 @@ +true|false + * if $keepLayouts and parmas for Zend_Json::encode are required + * then, the array can contains a 'keepLayout'=>true|false + * that will not be passed to Zend_Json::encode method but will be passed + * to Zend_View_Helper_Json + * @throws Zend_Controller_Action_Helper_Json + * @return string + */ + public function encodeJson($data, $keepLayouts = false) + { + /** + * @see Zend_View_Helper_Json + */ + require_once 'Zend/View/Helper/Json.php'; + $jsonHelper = new Zend_View_Helper_Json(); + $data = $jsonHelper->json($data, $keepLayouts); + + if (!$keepLayouts) { + /** + * @see Zend_Controller_Action_HelperBroker + */ + require_once 'Zend/Controller/Action/HelperBroker.php'; + Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true); + } + + return $data; + } + + /** + * Encode JSON response and immediately send + * + * @param mixed $data + * @param boolean|array $keepLayouts + * NOTE: if boolean, establish $keepLayouts to true|false + * if array, admit params for Zend_Json::encode as enableJsonExprFinder=>true|false + * if $keepLayouts and parmas for Zend_Json::encode are required + * then, the array can contains a 'keepLayout'=>true|false + * that will not be passed to Zend_Json::encode method but will be passed + * to Zend_View_Helper_Json + * @return string|void + */ + public function sendJson($data, $keepLayouts = false) + { + $data = $this->encodeJson($data, $keepLayouts); + $response = $this->getResponse(); + $response->setBody($data); + + if (!$this->suppressExit) { + $response->sendResponse(); + exit; + } + + return $data; + } + + /** + * Strategy pattern: call helper as helper broker method + * + * Allows encoding JSON. If $sendNow is true, immediately sends JSON + * response. + * + * @param mixed $data + * @param boolean $sendNow + * @param boolean $keepLayouts + * @return string|void + */ + public function direct($data, $sendNow = true, $keepLayouts = false) + { + if ($sendNow) { + return $this->sendJson($data, $keepLayouts); + } + return $this->encodeJson($data, $keepLayouts); + } +} diff --git a/lib/zend/Zend/Controller/Action/Helper/Redirector.php b/lib/zend/Zend/Controller/Action/Helper/Redirector.php new file mode 100644 index 0000000000..a7bdfa3f04 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/Redirector.php @@ -0,0 +1,531 @@ +_code; + } + + /** + * Validate HTTP status redirect code + * + * @param int $code + * @throws Zend_Controller_Action_Exception on invalid HTTP status code + * @return true + */ + protected function _checkCode($code) + { + $code = (int)$code; + if ((300 > $code) || (307 < $code) || (304 == $code) || (306 == $code)) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Invalid redirect HTTP status code (' . $code . ')'); + } + + return true; + } + + /** + * Retrieve HTTP status code for {@link _redirect()} behaviour + * + * @param int $code + * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface + */ + public function setCode($code) + { + $this->_checkCode($code); + $this->_code = $code; + return $this; + } + + /** + * Retrieve flag for whether or not {@link _redirect()} will exit when finished. + * + * @return boolean + */ + public function getExit() + { + return $this->_exit; + } + + /** + * Retrieve exit flag for {@link _redirect()} behaviour + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface + */ + public function setExit($flag) + { + $this->_exit = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve flag for whether or not {@link _redirect()} will prepend the + * base URL on relative URLs + * + * @return boolean + */ + public function getPrependBase() + { + return $this->_prependBase; + } + + /** + * Retrieve 'prepend base' flag for {@link _redirect()} behaviour + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface + */ + public function setPrependBase($flag) + { + $this->_prependBase = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve flag for whether or not {@link redirectAndExit()} shall close the session before + * exiting. + * + * @return boolean + */ + public function getCloseSessionOnExit() + { + return $this->_closeSessionOnExit; + } + + /** + * Set flag for whether or not {@link redirectAndExit()} shall close the session before exiting. + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface + */ + public function setCloseSessionOnExit($flag) + { + $this->_closeSessionOnExit = ($flag) ? true : false; + return $this; + } + + /** + * Return use absolute URI flag + * + * @return boolean + */ + public function getUseAbsoluteUri() + { + return $this->_useAbsoluteUri; + } + + /** + * Set use absolute URI flag + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface + */ + public function setUseAbsoluteUri($flag = true) + { + $this->_useAbsoluteUri = ($flag) ? true : false; + return $this; + } + + /** + * Set redirect in response object + * + * @return void + */ + protected function _redirect($url) + { + if ($this->getUseAbsoluteUri() && !preg_match('#^(https?|ftp)://#', $url)) { + $host = (isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:''); + $proto = (isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=="off") ? 'https' : 'http'; + $port = (isset($_SERVER['SERVER_PORT'])?$_SERVER['SERVER_PORT']:80); + $uri = $proto . '://' . $host; + if ((('http' == $proto) && (80 != $port)) || (('https' == $proto) && (443 != $port))) { + $uri .= ':' . $port; + } + $url = $uri . '/' . ltrim($url, '/'); + } + $this->_redirectUrl = $url; + $this->getResponse()->setRedirect($url, $this->getCode()); + } + + /** + * Retrieve currently set URL for redirect + * + * @return string + */ + public function getRedirectUrl() + { + return $this->_redirectUrl; + } + + /** + * Determine if the baseUrl should be prepended, and prepend if necessary + * + * @param string $url + * @return string + */ + protected function _prependBase($url) + { + if ($this->getPrependBase()) { + $request = $this->getRequest(); + if ($request instanceof Zend_Controller_Request_Http) { + $base = rtrim($request->getBaseUrl(), '/'); + if (!empty($base) && ('/' != $base)) { + $url = $base . '/' . ltrim($url, '/'); + } else { + $url = '/' . ltrim($url, '/'); + } + } + } + + return $url; + } + + /** + * Set a redirect URL of the form /module/controller/action/params + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return void + */ + public function setGotoSimple($action, $controller = null, $module = null, array $params = array()) + { + $dispatcher = $this->getFrontController()->getDispatcher(); + $request = $this->getRequest(); + $curModule = $request->getModuleName(); + $useDefaultController = false; + + if (null === $controller && null !== $module) { + $useDefaultController = true; + } + + if (null === $module) { + $module = $curModule; + } + + if ($module == $dispatcher->getDefaultModule()) { + $module = ''; + } + + if (null === $controller && !$useDefaultController) { + $controller = $request->getControllerName(); + if (empty($controller)) { + $controller = $dispatcher->getDefaultControllerName(); + } + } + + $params['module'] = $module; + $params['controller'] = $controller; + $params['action'] = $action; + + $router = $this->getFrontController()->getRouter(); + $url = $router->assemble($params, 'default', true); + + $this->_redirect($url); + } + + /** + * Build a URL based on a route + * + * @param array $urlOptions + * @param string $name Route name + * @param boolean $reset + * @param boolean $encode + * @return void + */ + public function setGotoRoute(array $urlOptions = array(), $name = null, $reset = false, $encode = true) + { + $router = $this->getFrontController()->getRouter(); + $url = $router->assemble($urlOptions, $name, $reset, $encode); + + $this->_redirect($url); + } + + /** + * Set a redirect URL string + * + * By default, emits a 302 HTTP status header, prepends base URL as defined + * in request object if url is relative, and halts script execution by + * calling exit(). + * + * $options is an optional associative array that can be used to control + * redirect behaviour. The available option keys are: + * - exit: boolean flag indicating whether or not to halt script execution when done + * - prependBase: boolean flag indicating whether or not to prepend the base URL when a relative URL is provided + * - code: integer HTTP status code to use with redirect. Should be between 300 and 307. + * + * _redirect() sets the Location header in the response object. If you set + * the exit flag to false, you can override this header later in code + * execution. + * + * If the exit flag is true (true by default), _redirect() will write and + * close the current session, if any. + * + * @param string $url + * @param array $options + * @return void + */ + public function setGotoUrl($url, array $options = array()) + { + // prevent header injections + $url = str_replace(array("\n", "\r"), '', $url); + + if (null !== $options) { + if (isset($options['exit'])) { + $this->setExit(($options['exit']) ? true : false); + } + if (isset($options['prependBase'])) { + $this->setPrependBase(($options['prependBase']) ? true : false); + } + if (isset($options['code'])) { + $this->setCode($options['code']); + } + } + + // If relative URL, decide if we should prepend base URL + if (!preg_match('|^[a-z]+://|', $url)) { + $url = $this->_prependBase($url); + } + + $this->_redirect($url); + } + + /** + * Perform a redirect to an action/controller/module with params + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return void + */ + public function gotoSimple($action, $controller = null, $module = null, array $params = array()) + { + $this->setGotoSimple($action, $controller, $module, $params); + + if ($this->getExit()) { + $this->redirectAndExit(); + } + } + + /** + * Perform a redirect to an action/controller/module with params, forcing an immdiate exit + * + * @param mixed $action + * @param mixed $controller + * @param mixed $module + * @param array $params + * @return void + */ + public function gotoSimpleAndExit($action, $controller = null, $module = null, array $params = array()) + { + $this->setGotoSimple($action, $controller, $module, $params); + $this->redirectAndExit(); + } + + /** + * Redirect to a route-based URL + * + * Uses route's assemble method tobuild the URL; route is specified by $name; + * default route is used if none provided. + * + * @param array $urlOptions Array of key/value pairs used to assemble URL + * @param string $name + * @param boolean $reset + * @param boolean $encode + * @return void + */ + public function gotoRoute(array $urlOptions = array(), $name = null, $reset = false, $encode = true) + { + $this->setGotoRoute($urlOptions, $name, $reset, $encode); + + if ($this->getExit()) { + $this->redirectAndExit(); + } + } + + /** + * Redirect to a route-based URL, and immediately exit + * + * Uses route's assemble method tobuild the URL; route is specified by $name; + * default route is used if none provided. + * + * @param array $urlOptions Array of key/value pairs used to assemble URL + * @param string $name + * @param boolean $reset + * @return void + */ + public function gotoRouteAndExit(array $urlOptions = array(), $name = null, $reset = false) + { + $this->setGotoRoute($urlOptions, $name, $reset); + $this->redirectAndExit(); + } + + /** + * Perform a redirect to a url + * + * @param string $url + * @param array $options + * @return void + */ + public function gotoUrl($url, array $options = array()) + { + $this->setGotoUrl($url, $options); + + if ($this->getExit()) { + $this->redirectAndExit(); + } + } + + /** + * Set a URL string for a redirect, perform redirect, and immediately exit + * + * @param string $url + * @param array $options + * @return void + */ + public function gotoUrlAndExit($url, array $options = array()) + { + $this->gotoUrl($url, $options); + $this->redirectAndExit(); + } + + /** + * exit(): Perform exit for redirector + * + * @return void + */ + public function redirectAndExit() + { + if ($this->getCloseSessionOnExit()) { + // Close session, if started + if (class_exists('Zend_Session', false) && Zend_Session::isStarted()) { + Zend_Session::writeClose(); + } elseif (isset($_SESSION)) { + session_write_close(); + } + } + + $this->getResponse()->sendHeaders(); + exit(); + } + + /** + * direct(): Perform helper when called as + * $this->_helper->redirector($action, $controller, $module, $params) + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return void + */ + public function direct($action, $controller = null, $module = null, array $params = array()) + { + $this->gotoSimple($action, $controller, $module, $params); + } + + /** + * Overloading + * + * Overloading for old 'goto', 'setGoto', and 'gotoAndExit' methods + * + * @param string $method + * @param array $args + * @return mixed + * @throws Zend_Controller_Action_Exception for invalid methods + */ + public function __call($method, $args) + { + $method = strtolower($method); + if ('goto' == $method) { + return call_user_func_array(array($this, 'gotoSimple'), $args); + } + if ('setgoto' == $method) { + return call_user_func_array(array($this, 'setGotoSimple'), $args); + } + if ('gotoandexit' == $method) { + return call_user_func_array(array($this, 'gotoSimpleAndExit'), $args); + } + + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception(sprintf('Invalid method "%s" called on redirector', $method)); + } +} diff --git a/lib/zend/Zend/Controller/Action/Helper/Url.php b/lib/zend/Zend/Controller/Action/Helper/Url.php new file mode 100644 index 0000000000..21f11a0f37 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/Url.php @@ -0,0 +1,117 @@ +getRequest(); + + if (null === $controller) { + $controller = $request->getControllerName(); + } + + if (null === $module) { + $module = $request->getModuleName(); + } + + $url = $controller . '/' . $action; + if ($module != $this->getFrontController()->getDispatcher()->getDefaultModule()) { + $url = $module . '/' . $url; + } + + if ('' !== ($baseUrl = $this->getFrontController()->getBaseUrl())) { + $url = $baseUrl . '/' . $url; + } + + if (null !== $params) { + $paramPairs = array(); + foreach ($params as $key => $value) { + $paramPairs[] = urlencode($key) . '/' . urlencode($value); + } + $paramString = implode('/', $paramPairs); + $url .= '/' . $paramString; + } + + $url = '/' . ltrim($url, '/'); + + return $url; + } + + /** + * Assembles a URL based on a given route + * + * This method will typically be used for more complex operations, as it + * ties into the route objects registered with the router. + * + * @param array $urlOptions Options passed to the assemble method of the Route object. + * @param mixed $name The name of a Route to use. If null it will use the current Route + * @param boolean $reset + * @param boolean $encode + * @return string Url for the link href attribute. + */ + public function url($urlOptions = array(), $name = null, $reset = false, $encode = true) + { + $router = $this->getFrontController()->getRouter(); + return $router->assemble($urlOptions, $name, $reset, $encode); + } + + /** + * Perform helper when called as $this->_helper->url() from an action controller + * + * Proxies to {@link simple()} + * + * @param string $action + * @param string $controller + * @param string $module + * @param array $params + * @return string + */ + public function direct($action, $controller = null, $module = null, array $params = null) + { + return $this->simple($action, $controller, $module, $params); + } +} diff --git a/lib/zend/Zend/Controller/Action/Helper/ViewRenderer.php b/lib/zend/Zend/Controller/Action/Helper/ViewRenderer.php new file mode 100644 index 0000000000..d0be76405c --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Helper/ViewRenderer.php @@ -0,0 +1,995 @@ + + * // In your bootstrap: + * Zend_Controller_Action_HelperBroker::addHelper(new Zend_Controller_Action_Helper_ViewRenderer()); + * + * // In your action controller methods: + * $viewHelper = $this->_helper->getHelper('view'); + * + * // Don't use controller subdirectories + * $viewHelper->setNoController(true); + * + * // Specify a different script to render: + * $this->_helper->viewRenderer('form'); + * + * + * + * @uses Zend_Controller_Action_Helper_Abstract + * @package Zend_Controller + * @subpackage Zend_Controller_Action_Helper + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Controller_Action_Helper_ViewRenderer extends Zend_Controller_Action_Helper_Abstract +{ + /** + * @var Zend_View_Interface + */ + public $view; + + /** + * Word delimiters + * @var array + */ + protected $_delimiters; + + /** + * Front controller instance + * @var Zend_Controller_Front + */ + protected $_frontController; + + /** + * @var Zend_Filter_Inflector + */ + protected $_inflector; + + /** + * Inflector target + * @var string + */ + protected $_inflectorTarget = ''; + + /** + * Current module directory + * @var string + */ + protected $_moduleDir = ''; + + /** + * Whether or not to autorender using controller name as subdirectory; + * global setting (not reset at next invocation) + * @var boolean + */ + protected $_neverController = false; + + /** + * Whether or not to autorender postDispatch; global setting (not reset at + * next invocation) + * @var boolean + */ + protected $_neverRender = false; + + /** + * Whether or not to use a controller name as a subdirectory when rendering + * @var boolean + */ + protected $_noController = false; + + /** + * Whether or not to autorender postDispatch; per controller/action setting (reset + * at next invocation) + * @var boolean + */ + protected $_noRender = false; + + /** + * Characters representing path delimiters in the controller + * @var string|array + */ + protected $_pathDelimiters; + + /** + * Which named segment of the response to utilize + * @var string + */ + protected $_responseSegment = null; + + /** + * Which action view script to render + * @var string + */ + protected $_scriptAction = null; + + /** + * View object basePath + * @var string + */ + protected $_viewBasePathSpec = ':moduleDir/views'; + + /** + * View script path specification string + * @var string + */ + protected $_viewScriptPathSpec = ':controller/:action.:suffix'; + + /** + * View script path specification string, minus controller segment + * @var string + */ + protected $_viewScriptPathNoControllerSpec = ':action.:suffix'; + + /** + * View script suffix + * @var string + */ + protected $_viewSuffix = 'phtml'; + + /** + * Constructor + * + * Optionally set view object and options. + * + * @param Zend_View_Interface $view + * @param array $options + * @return void + */ + public function __construct(Zend_View_Interface $view = null, array $options = array()) + { + if (null !== $view) { + $this->setView($view); + } + + if (!empty($options)) { + $this->_setOptions($options); + } + } + + /** + * Clone - also make sure the view is cloned. + * + * @return void + */ + public function __clone() + { + if (isset($this->view) && $this->view instanceof Zend_View_Interface) { + $this->view = clone $this->view; + + } + } + + /** + * Set the view object + * + * @param Zend_View_Interface $view + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setView(Zend_View_Interface $view) + { + $this->view = $view; + return $this; + } + + /** + * Get current module name + * + * @return string + */ + public function getModule() + { + $request = $this->getRequest(); + $module = $request->getModuleName(); + if (null === $module) { + $module = $this->getFrontController()->getDispatcher()->getDefaultModule(); + } + + return $module; + } + + /** + * Get module directory + * + * @throws Zend_Controller_Action_Exception + * @return string + */ + public function getModuleDirectory() + { + $module = $this->getModule(); + $moduleDir = $this->getFrontController()->getControllerDirectory($module); + if ((null === $moduleDir) || is_array($moduleDir)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('ViewRenderer cannot locate module directory'); + } + $this->_moduleDir = dirname($moduleDir); + return $this->_moduleDir; + } + + /** + * Get inflector + * + * @return Zend_Filter_Inflector + */ + public function getInflector() + { + if (null === $this->_inflector) { + /** + * @see Zend_Filter_Inflector + */ + require_once 'Zend/Filter/Inflector.php'; + /** + * @see Zend_Filter_PregReplace + */ + require_once 'Zend/Filter/PregReplace.php'; + /** + * @see Zend_Filter_Word_UnderscoreToSeparator + */ + require_once 'Zend/Filter/Word/UnderscoreToSeparator.php'; + $this->_inflector = new Zend_Filter_Inflector(); + $this->_inflector->setStaticRuleReference('moduleDir', $this->_moduleDir) // moduleDir must be specified before the less specific 'module' + ->addRules(array( + ':module' => array('Word_CamelCaseToDash', 'StringToLower'), + ':controller' => array('Word_CamelCaseToDash', new Zend_Filter_Word_UnderscoreToSeparator('/'), 'StringToLower', new Zend_Filter_PregReplace('/\./', '-')), + ':action' => array('Word_CamelCaseToDash', new Zend_Filter_PregReplace('#[^a-z0-9' . preg_quote('/', '#') . ']+#i', '-'), 'StringToLower'), + )) + ->setStaticRuleReference('suffix', $this->_viewSuffix) + ->setTargetReference($this->_inflectorTarget); + } + + // Ensure that module directory is current + $this->getModuleDirectory(); + + return $this->_inflector; + } + + /** + * Set inflector + * + * @param Zend_Filter_Inflector $inflector + * @param boolean $reference Whether the moduleDir, target, and suffix should be set as references to ViewRenderer properties + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setInflector(Zend_Filter_Inflector $inflector, $reference = false) + { + $this->_inflector = $inflector; + if ($reference) { + $this->_inflector->setStaticRuleReference('suffix', $this->_viewSuffix) + ->setStaticRuleReference('moduleDir', $this->_moduleDir) + ->setTargetReference($this->_inflectorTarget); + } + return $this; + } + + /** + * Set inflector target + * + * @param string $target + * @return void + */ + protected function _setInflectorTarget($target) + { + $this->_inflectorTarget = (string) $target; + } + + /** + * Set internal module directory representation + * + * @param string $dir + * @return void + */ + protected function _setModuleDir($dir) + { + $this->_moduleDir = (string) $dir; + } + + /** + * Get internal module directory representation + * + * @return string + */ + protected function _getModuleDir() + { + return $this->_moduleDir; + } + + /** + * Generate a class prefix for helper and filter classes + * + * @return string + */ + protected function _generateDefaultPrefix() + { + $default = 'Zend_View'; + if (null === $this->_actionController) { + return $default; + } + + $class = get_class($this->_actionController); + + if (!strstr($class, '_')) { + return $default; + } + + $module = $this->getModule(); + if ('default' == $module) { + return $default; + } + + $prefix = substr($class, 0, strpos($class, '_')) . '_View'; + + return $prefix; + } + + /** + * Retrieve base path based on location of current action controller + * + * @return string + */ + protected function _getBasePath() + { + if (null === $this->_actionController) { + return './views'; + } + + $inflector = $this->getInflector(); + $this->_setInflectorTarget($this->getViewBasePathSpec()); + + $dispatcher = $this->_frontController->getDispatcher(); + $request = $this->getRequest(); + + $parts = array( + 'module' => (($moduleName = $request->getModuleName()) != '') ? $dispatcher->formatModuleName($moduleName) : $moduleName, + 'controller' => $request->getControllerName(), + 'action' => $dispatcher->formatActionName($request->getActionName()) + ); + + $path = $inflector->filter($parts); + return $path; + } + + /** + * Set options + * + * @param array $options + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + protected function _setOptions(array $options) + { + foreach ($options as $key => $value) + { + switch ($key) { + case 'neverRender': + case 'neverController': + case 'noController': + case 'noRender': + $property = '_' . $key; + $this->{$property} = ($value) ? true : false; + break; + case 'responseSegment': + case 'scriptAction': + case 'viewBasePathSpec': + case 'viewScriptPathSpec': + case 'viewScriptPathNoControllerSpec': + case 'viewSuffix': + $property = '_' . $key; + $this->{$property} = (string) $value; + break; + default: + break; + } + } + + return $this; + } + + /** + * Initialize the view object + * + * $options may contain the following keys: + * - neverRender - flag dis/enabling postDispatch() autorender (affects all subsequent calls) + * - noController - flag indicating whether or not to look for view scripts in subdirectories named after the controller + * - noRender - flag indicating whether or not to autorender postDispatch() + * - responseSegment - which named response segment to render a view script to + * - scriptAction - what action script to render + * - viewBasePathSpec - specification to use for determining view base path + * - viewScriptPathSpec - specification to use for determining view script paths + * - viewScriptPathNoControllerSpec - specification to use for determining view script paths when noController flag is set + * - viewSuffix - what view script filename suffix to use + * + * @param string $path + * @param string $prefix + * @param array $options + * @throws Zend_Controller_Action_Exception + * @return void + */ + public function initView($path = null, $prefix = null, array $options = array()) + { + if (null === $this->view) { + $this->setView(new Zend_View()); + } + + // Reset some flags every time + $options['noController'] = (isset($options['noController'])) ? $options['noController'] : false; + $options['noRender'] = (isset($options['noRender'])) ? $options['noRender'] : false; + $this->_scriptAction = null; + $this->_responseSegment = null; + + // Set options first; may be used to determine other initializations + $this->_setOptions($options); + + // Get base view path + if (empty($path)) { + $path = $this->_getBasePath(); + if (empty($path)) { + /** + * @see Zend_Controller_Action_Exception + */ + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('ViewRenderer initialization failed: retrieved view base path is empty'); + } + } + + if (null === $prefix) { + $prefix = $this->_generateDefaultPrefix(); + } + + // Determine if this path has already been registered + $currentPaths = $this->view->getScriptPaths(); + $path = str_replace(array('/', '\\'), '/', $path); + $pathExists = false; + foreach ($currentPaths as $tmpPath) { + $tmpPath = str_replace(array('/', '\\'), '/', $tmpPath); + if (strstr($tmpPath, $path)) { + $pathExists = true; + break; + } + } + if (!$pathExists) { + $this->view->addBasePath($path, $prefix); + } + + // Register view with action controller (unless already registered) + if ((null !== $this->_actionController) && (null === $this->_actionController->view)) { + $this->_actionController->view = $this->view; + $this->_actionController->viewSuffix = $this->_viewSuffix; + } + } + + /** + * init - initialize view + * + * @return void + */ + public function init() + { + if ($this->getFrontController()->getParam('noViewRenderer')) { + return; + } + + $this->initView(); + } + + /** + * Set view basePath specification + * + * Specification can contain one or more of the following: + * - :moduleDir - current module directory + * - :controller - name of current controller in the request + * - :action - name of current action in the request + * - :module - name of current module in the request + * + * @param string $path + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setViewBasePathSpec($path) + { + $this->_viewBasePathSpec = (string) $path; + return $this; + } + + /** + * Retrieve the current view basePath specification string + * + * @return string + */ + public function getViewBasePathSpec() + { + return $this->_viewBasePathSpec; + } + + /** + * Set view script path specification + * + * Specification can contain one or more of the following: + * - :moduleDir - current module directory + * - :controller - name of current controller in the request + * - :action - name of current action in the request + * - :module - name of current module in the request + * + * @param string $path + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setViewScriptPathSpec($path) + { + $this->_viewScriptPathSpec = (string) $path; + return $this; + } + + /** + * Retrieve the current view script path specification string + * + * @return string + */ + public function getViewScriptPathSpec() + { + return $this->_viewScriptPathSpec; + } + + /** + * Set view script path specification (no controller variant) + * + * Specification can contain one or more of the following: + * - :moduleDir - current module directory + * - :controller - name of current controller in the request + * - :action - name of current action in the request + * - :module - name of current module in the request + * + * :controller will likely be ignored in this variant. + * + * @param string $path + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setViewScriptPathNoControllerSpec($path) + { + $this->_viewScriptPathNoControllerSpec = (string) $path; + return $this; + } + + /** + * Retrieve the current view script path specification string (no controller variant) + * + * @return string + */ + public function getViewScriptPathNoControllerSpec() + { + return $this->_viewScriptPathNoControllerSpec; + } + + /** + * Get a view script based on an action and/or other variables + * + * Uses values found in current request if no values passed in $vars. + * + * If {@link $_noController} is set, uses {@link $_viewScriptPathNoControllerSpec}; + * otherwise, uses {@link $_viewScriptPathSpec}. + * + * @param string $action + * @param array $vars + * @return string + */ + public function getViewScript($action = null, array $vars = array()) + { + $request = $this->getRequest(); + if ((null === $action) && (!isset($vars['action']))) { + $action = $this->getScriptAction(); + if (null === $action) { + $action = $request->getActionName(); + } + $vars['action'] = $action; + } elseif (null !== $action) { + $vars['action'] = $action; + } + + $inflector = $this->getInflector(); + if ($this->getNoController() || $this->getNeverController()) { + $this->_setInflectorTarget($this->getViewScriptPathNoControllerSpec()); + } else { + $this->_setInflectorTarget($this->getViewScriptPathSpec()); + } + return $this->_translateSpec($vars); + } + + /** + * Set the neverRender flag (i.e., globally dis/enable autorendering) + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setNeverRender($flag = true) + { + $this->_neverRender = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve neverRender flag value + * + * @return boolean + */ + public function getNeverRender() + { + return $this->_neverRender; + } + + /** + * Set the noRender flag (i.e., whether or not to autorender) + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setNoRender($flag = true) + { + $this->_noRender = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve noRender flag value + * + * @return boolean + */ + public function getNoRender() + { + return $this->_noRender; + } + + /** + * Set the view script to use + * + * @param string $name + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setScriptAction($name) + { + $this->_scriptAction = (string) $name; + return $this; + } + + /** + * Retrieve view script name + * + * @return string + */ + public function getScriptAction() + { + return $this->_scriptAction; + } + + /** + * Set the response segment name + * + * @param string $name + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setResponseSegment($name) + { + if (null === $name) { + $this->_responseSegment = null; + } else { + $this->_responseSegment = (string) $name; + } + + return $this; + } + + /** + * Retrieve named response segment name + * + * @return string + */ + public function getResponseSegment() + { + return $this->_responseSegment; + } + + /** + * Set the noController flag (i.e., whether or not to render into controller subdirectories) + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setNoController($flag = true) + { + $this->_noController = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve noController flag value + * + * @return boolean + */ + public function getNoController() + { + return $this->_noController; + } + + /** + * Set the neverController flag (i.e., whether or not to render into controller subdirectories) + * + * @param boolean $flag + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setNeverController($flag = true) + { + $this->_neverController = ($flag) ? true : false; + return $this; + } + + /** + * Retrieve neverController flag value + * + * @return boolean + */ + public function getNeverController() + { + return $this->_neverController; + } + + /** + * Set view script suffix + * + * @param string $suffix + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setViewSuffix($suffix) + { + $this->_viewSuffix = (string) $suffix; + return $this; + } + + /** + * Get view script suffix + * + * @return string + */ + public function getViewSuffix() + { + return $this->_viewSuffix; + } + + /** + * Set options for rendering a view script + * + * @param string $action View script to render + * @param string $name Response named segment to render to + * @param boolean $noController Whether or not to render within a subdirectory named after the controller + * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface + */ + public function setRender($action = null, $name = null, $noController = null) + { + if (null !== $action) { + $this->setScriptAction($action); + } + + if (null !== $name) { + $this->setResponseSegment($name); + } + + if (null !== $noController) { + $this->setNoController($noController); + } + + return $this; + } + + /** + * Inflect based on provided vars + * + * Allowed variables are: + * - :moduleDir - current module directory + * - :module - current module name + * - :controller - current controller name + * - :action - current action name + * - :suffix - view script file suffix + * + * @param array $vars + * @return string + */ + protected function _translateSpec(array $vars = array()) + { + $inflector = $this->getInflector(); + $request = $this->getRequest(); + $dispatcher = $this->_frontController->getDispatcher(); + $module = $dispatcher->formatModuleName($request->getModuleName()); + $controller = $request->getControllerName(); + $action = $dispatcher->formatActionName($request->getActionName()); + + $params = compact('module', 'controller', 'action'); + foreach ($vars as $key => $value) { + switch ($key) { + case 'module': + case 'controller': + case 'action': + case 'moduleDir': + case 'suffix': + $params[$key] = (string) $value; + break; + default: + break; + } + } + + if (isset($params['suffix'])) { + $origSuffix = $this->getViewSuffix(); + $this->setViewSuffix($params['suffix']); + } + if (isset($params['moduleDir'])) { + $origModuleDir = $this->_getModuleDir(); + $this->_setModuleDir($params['moduleDir']); + } + + $filtered = $inflector->filter($params); + + if (isset($params['suffix'])) { + $this->setViewSuffix($origSuffix); + } + if (isset($params['moduleDir'])) { + $this->_setModuleDir($origModuleDir); + } + + return $filtered; + } + + /** + * Render a view script (optionally to a named response segment) + * + * Sets the noRender flag to true when called. + * + * @param string $script + * @param string $name + * @return void + */ + public function renderScript($script, $name = null) + { + if (null === $name) { + $name = $this->getResponseSegment(); + } + + $this->getResponse()->appendBody( + $this->view->render($script), + $name + ); + + $this->setNoRender(); + } + + /** + * Render a view based on path specifications + * + * Renders a view based on the view script path specifications. + * + * @param string $action + * @param string $name + * @param boolean $noController + * @return void + */ + public function render($action = null, $name = null, $noController = null) + { + $this->setRender($action, $name, $noController); + $path = $this->getViewScript(); + $this->renderScript($path, $name); + } + + /** + * Render a script based on specification variables + * + * Pass an action, and one or more specification variables (view script suffix) + * to determine the view script path, and render that script. + * + * @param string $action + * @param array $vars + * @param string $name + * @return void + */ + public function renderBySpec($action = null, array $vars = array(), $name = null) + { + if (null !== $name) { + $this->setResponseSegment($name); + } + + $path = $this->getViewScript($action, $vars); + + $this->renderScript($path); + } + + /** + * postDispatch - auto render a view + * + * Only autorenders if: + * - _noRender is false + * - action controller is present + * - request has not been re-dispatched (i.e., _forward() has not been called) + * - response is not a redirect + * + * @return void + */ + public function postDispatch() + { + if ($this->_shouldRender()) { + $this->render(); + } + } + + /** + * Should the ViewRenderer render a view script? + * + * @return boolean + */ + protected function _shouldRender() + { + return (!$this->getFrontController()->getParam('noViewRenderer') + && !$this->_neverRender + && !$this->_noRender + && (null !== $this->_actionController) + && $this->getRequest()->isDispatched() + && !$this->getResponse()->isRedirect() + ); + } + + /** + * Use this helper as a method; proxies to setRender() + * + * @param string $action + * @param string $name + * @param boolean $noController + * @return void + */ + public function direct($action = null, $name = null, $noController = null) + { + $this->setRender($action, $name, $noController); + } +} diff --git a/lib/zend/Zend/Controller/Action/HelperBroker.php b/lib/zend/Zend/Controller/Action/HelperBroker.php new file mode 100644 index 0000000000..c0db09c8da --- /dev/null +++ b/lib/zend/Zend/Controller/Action/HelperBroker.php @@ -0,0 +1,381 @@ + 'Zend/Controller/Action/Helper/', + )); + } + return self::$_pluginLoader; + } + + /** + * addPrefix() - Add repository of helpers by prefix + * + * @param string $prefix + */ + static public function addPrefix($prefix) + { + $prefix = rtrim($prefix, '_'); + $path = str_replace('_', DIRECTORY_SEPARATOR, $prefix); + self::getPluginLoader()->addPrefixPath($prefix, $path); + } + + /** + * addPath() - Add path to repositories where Action_Helpers could be found. + * + * @param string $path + * @param string $prefix Optional; defaults to 'Zend_Controller_Action_Helper' + * @return void + */ + static public function addPath($path, $prefix = 'Zend_Controller_Action_Helper') + { + self::getPluginLoader()->addPrefixPath($prefix, $path); + } + + /** + * addHelper() - Add helper objects + * + * @param Zend_Controller_Action_Helper_Abstract $helper + * @return void + */ + static public function addHelper(Zend_Controller_Action_Helper_Abstract $helper) + { + self::getStack()->push($helper); + return; + } + + /** + * resetHelpers() + * + * @return void + */ + static public function resetHelpers() + { + self::$_stack = null; + return; + } + + /** + * Retrieve or initialize a helper statically + * + * Retrieves a helper object statically, loading on-demand if the helper + * does not already exist in the stack. Always returns a helper, unless + * the helper class cannot be found. + * + * @param string $name + * @return Zend_Controller_Action_Helper_Abstract + */ + public static function getStaticHelper($name) + { + $name = self::_normalizeHelperName($name); + $stack = self::getStack(); + + if (!isset($stack->{$name})) { + self::_loadHelper($name); + } + + return $stack->{$name}; + } + + /** + * getExistingHelper() - get helper by name + * + * Static method to retrieve helper object. Only retrieves helpers already + * initialized with the broker (either via addHelper() or on-demand loading + * via getHelper()). + * + * Throws an exception if the referenced helper does not exist in the + * stack; use {@link hasHelper()} to check if the helper is registered + * prior to retrieving it. + * + * @param string $name + * @return Zend_Controller_Action_Helper_Abstract + * @throws Zend_Controller_Action_Exception + */ + public static function getExistingHelper($name) + { + $name = self::_normalizeHelperName($name); + $stack = self::getStack(); + + if (!isset($stack->{$name})) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Action helper "' . $name . '" has not been registered with the helper broker'); + } + + return $stack->{$name}; + } + + /** + * Return all registered helpers as helper => object pairs + * + * @return array + */ + public static function getExistingHelpers() + { + return self::getStack()->getHelpersByName(); + } + + /** + * Is a particular helper loaded in the broker? + * + * @param string $name + * @return boolean + */ + public static function hasHelper($name) + { + $name = self::_normalizeHelperName($name); + return isset(self::getStack()->{$name}); + } + + /** + * Remove a particular helper from the broker + * + * @param string $name + * @return boolean + */ + public static function removeHelper($name) + { + $name = self::_normalizeHelperName($name); + $stack = self::getStack(); + if (isset($stack->{$name})) { + unset($stack->{$name}); + } + + return false; + } + + /** + * Lazy load the priority stack and return it + * + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public static function getStack() + { + if (self::$_stack == null) { + self::$_stack = new Zend_Controller_Action_HelperBroker_PriorityStack(); + } + + return self::$_stack; + } + + /** + * Constructor + * + * @param Zend_Controller_Action $actionController + * @return void + */ + public function __construct(Zend_Controller_Action $actionController) + { + $this->_actionController = $actionController; + foreach (self::getStack() as $helper) { + $helper->setActionController($actionController); + $helper->init(); + } + } + + /** + * notifyPreDispatch() - called by action controller dispatch method + * + * @return void + */ + public function notifyPreDispatch() + { + foreach (self::getStack() as $helper) { + $helper->preDispatch(); + } + } + + /** + * notifyPostDispatch() - called by action controller dispatch method + * + * @return void + */ + public function notifyPostDispatch() + { + foreach (self::getStack() as $helper) { + $helper->postDispatch(); + } + } + + /** + * getHelper() - get helper by name + * + * @param string $name + * @return Zend_Controller_Action_Helper_Abstract + */ + public function getHelper($name) + { + $name = self::_normalizeHelperName($name); + $stack = self::getStack(); + + if (!isset($stack->{$name})) { + self::_loadHelper($name); + } + + $helper = $stack->{$name}; + + $initialize = false; + if (null === ($actionController = $helper->getActionController())) { + $initialize = true; + } elseif ($actionController !== $this->_actionController) { + $initialize = true; + } + + if ($initialize) { + $helper->setActionController($this->_actionController) + ->init(); + } + + return $helper; + } + + /** + * Method overloading + * + * @param string $method + * @param array $args + * @return mixed + * @throws Zend_Controller_Action_Exception if helper does not have a direct() method + */ + public function __call($method, $args) + { + $helper = $this->getHelper($method); + if (!method_exists($helper, 'direct')) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Helper "' . $method . '" does not support overloading via direct()'); + } + return call_user_func_array(array($helper, 'direct'), $args); + } + + /** + * Retrieve helper by name as object property + * + * @param string $name + * @return Zend_Controller_Action_Helper_Abstract + */ + public function __get($name) + { + return $this->getHelper($name); + } + + /** + * Normalize helper name for lookups + * + * @param string $name + * @return string + */ + protected static function _normalizeHelperName($name) + { + if (strpos($name, '_') !== false) { + $name = str_replace(' ', '', ucwords(str_replace('_', ' ', $name))); + } + + return ucfirst($name); + } + + /** + * Load a helper + * + * @param string $name + * @return void + */ + protected static function _loadHelper($name) + { + try { + $class = self::getPluginLoader()->load($name); + } catch (Zend_Loader_PluginLoader_Exception $e) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Action Helper by name ' . $name . ' not found'); + } + + $helper = new $class(); + + if (!$helper instanceof Zend_Controller_Action_Helper_Abstract) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('Helper name ' . $name . ' -> class ' . $class . ' is not of type Zend_Controller_Action_Helper_Abstract'); + } + + self::getStack()->push($helper); + } +} diff --git a/lib/zend/Zend/Controller/Action/HelperBroker/PriorityStack.php b/lib/zend/Zend/Controller/Action/HelperBroker/PriorityStack.php new file mode 100644 index 0000000000..b52860335e --- /dev/null +++ b/lib/zend/Zend/Controller/Action/HelperBroker/PriorityStack.php @@ -0,0 +1,280 @@ +_helpersByNameRef)) { + return false; + } + + return $this->_helpersByNameRef[$helperName]; + } + + /** + * Magic property overloading for returning if helper is set by name + * + * @param string $helperName The helper name + * @return Zend_Controller_Action_Helper_Abstract + */ + public function __isset($helperName) + { + return array_key_exists($helperName, $this->_helpersByNameRef); + } + + /** + * Magic property overloading for unsetting if helper is exists by name + * + * @param string $helperName The helper name + * @return Zend_Controller_Action_Helper_Abstract + */ + public function __unset($helperName) + { + return $this->offsetUnset($helperName); + } + + /** + * push helper onto the stack + * + * @param Zend_Controller_Action_Helper_Abstract $helper + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public function push(Zend_Controller_Action_Helper_Abstract $helper) + { + $this->offsetSet($this->getNextFreeHigherPriority(), $helper); + return $this; + } + + /** + * Return something iterable + * + * @return array + */ + public function getIterator() + { + return new ArrayObject($this->_helpersByPriority); + } + + /** + * offsetExists() + * + * @param int|string $priorityOrHelperName + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public function offsetExists($priorityOrHelperName) + { + if (is_string($priorityOrHelperName)) { + return array_key_exists($priorityOrHelperName, $this->_helpersByNameRef); + } else { + return array_key_exists($priorityOrHelperName, $this->_helpersByPriority); + } + } + + /** + * offsetGet() + * + * @param int|string $priorityOrHelperName + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public function offsetGet($priorityOrHelperName) + { + if (!$this->offsetExists($priorityOrHelperName)) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('A helper with priority ' . $priorityOrHelperName . ' does not exist.'); + } + + if (is_string($priorityOrHelperName)) { + return $this->_helpersByNameRef[$priorityOrHelperName]; + } else { + return $this->_helpersByPriority[$priorityOrHelperName]; + } + } + + /** + * offsetSet() + * + * @param int $priority + * @param Zend_Controller_Action_Helper_Abstract $helper + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public function offsetSet($priority, $helper) + { + $priority = (int) $priority; + + if (!$helper instanceof Zend_Controller_Action_Helper_Abstract) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('$helper must extend Zend_Controller_Action_Helper_Abstract.'); + } + + if (array_key_exists($helper->getName(), $this->_helpersByNameRef)) { + // remove any object with the same name to retain BC compailitbility + // @todo At ZF 2.0 time throw an exception here. + $this->offsetUnset($helper->getName()); + } + + if (array_key_exists($priority, $this->_helpersByPriority)) { + $priority = $this->getNextFreeHigherPriority($priority); // ensures LIFO + trigger_error("A helper with the same priority already exists, reassigning to $priority", E_USER_WARNING); + } + + $this->_helpersByPriority[$priority] = $helper; + $this->_helpersByNameRef[$helper->getName()] = $helper; + + if ($priority == ($nextFreeDefault = $this->getNextFreeHigherPriority($this->_nextDefaultPriority))) { + $this->_nextDefaultPriority = $nextFreeDefault; + } + + krsort($this->_helpersByPriority); // always make sure priority and LIFO are both enforced + return $this; + } + + /** + * offsetUnset() + * + * @param int|string $priorityOrHelperName Priority integer or the helper name + * @return Zend_Controller_Action_HelperBroker_PriorityStack + */ + public function offsetUnset($priorityOrHelperName) + { + if (!$this->offsetExists($priorityOrHelperName)) { + require_once 'Zend/Controller/Action/Exception.php'; + throw new Zend_Controller_Action_Exception('A helper with priority or name ' . $priorityOrHelperName . ' does not exist.'); + } + + if (is_string($priorityOrHelperName)) { + $helperName = $priorityOrHelperName; + $helper = $this->_helpersByNameRef[$helperName]; + $priority = array_search($helper, $this->_helpersByPriority, true); + } else { + $priority = $priorityOrHelperName; + $helperName = $this->_helpersByPriority[$priorityOrHelperName]->getName(); + } + + unset($this->_helpersByNameRef[$helperName]); + unset($this->_helpersByPriority[$priority]); + return $this; + } + + /** + * return the count of helpers + * + * @return int + */ + public function count() + { + return count($this->_helpersByPriority); + } + + /** + * Find the next free higher priority. If an index is given, it will + * find the next free highest priority after it. + * + * @param int $indexPriority OPTIONAL + * @return int + */ + public function getNextFreeHigherPriority($indexPriority = null) + { + if ($indexPriority == null) { + $indexPriority = $this->_nextDefaultPriority; + } + + $priorities = array_keys($this->_helpersByPriority); + + while (in_array($indexPriority, $priorities)) { + $indexPriority++; + } + + return $indexPriority; + } + + /** + * Find the next free lower priority. If an index is given, it will + * find the next free lower priority before it. + * + * @param int $indexPriority + * @return int + */ + public function getNextFreeLowerPriority($indexPriority = null) + { + if ($indexPriority == null) { + $indexPriority = $this->_nextDefaultPriority; + } + + $priorities = array_keys($this->_helpersByPriority); + + while (in_array($indexPriority, $priorities)) { + $indexPriority--; + } + + return $indexPriority; + } + + /** + * return the highest priority + * + * @return int + */ + public function getHighestPriority() + { + return max(array_keys($this->_helpersByPriority)); + } + + /** + * return the lowest priority + * + * @return int + */ + public function getLowestPriority() + { + return min(array_keys($this->_helpersByPriority)); + } + + /** + * return the helpers referenced by name + * + * @return array + */ + public function getHelpersByName() + { + return $this->_helpersByNameRef; + } + +} diff --git a/lib/zend/Zend/Controller/Action/Interface.php b/lib/zend/Zend/Controller/Action/Interface.php new file mode 100644 index 0000000000..147f823620 --- /dev/null +++ b/lib/zend/Zend/Controller/Action/Interface.php @@ -0,0 +1,69 @@ +setParams($params); + } + + /** + * Formats a string into a controller name. This is used to take a raw + * controller name, such as one stored inside a Zend_Controller_Request_Abstract + * object, and reformat it to a proper class name that a class extending + * Zend_Controller_Action would use. + * + * @param string $unformatted + * @return string + */ + public function formatControllerName($unformatted) + { + return ucfirst($this->_formatName($unformatted)) . 'Controller'; + } + + /** + * Formats a string into an action name. This is used to take a raw + * action name, such as one that would be stored inside a Zend_Controller_Request_Abstract + * object, and reformat into a proper method name that would be found + * inside a class extending Zend_Controller_Action. + * + * @param string $unformatted + * @return string + */ + public function formatActionName($unformatted) + { + $formatted = $this->_formatName($unformatted, true); + return strtolower(substr($formatted, 0, 1)) . substr($formatted, 1) . 'Action'; + } + + /** + * Verify delimiter + * + * Verify a delimiter to use in controllers or actions. May be a single + * string or an array of strings. + * + * @param string|array $spec + * @return array + * @throws Zend_Controller_Dispatcher_Exception with invalid delimiters + */ + public function _verifyDelimiter($spec) + { + if (is_string($spec)) { + return (array) $spec; + } elseif (is_array($spec)) { + $allStrings = true; + foreach ($spec as $delim) { + if (!is_string($delim)) { + $allStrings = false; + break; + } + } + + if (!$allStrings) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Word delimiter array must contain only strings'); + } + + return $spec; + } + + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Invalid word delimiter'); + } + + /** + * Retrieve the word delimiter character(s) used in + * controller or action names + * + * @return array + */ + public function getWordDelimiter() + { + return $this->_wordDelimiter; + } + + /** + * Set word delimiter + * + * Set the word delimiter to use in controllers and actions. May be a + * single string or an array of strings. + * + * @param string|array $spec + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setWordDelimiter($spec) + { + $spec = $this->_verifyDelimiter($spec); + $this->_wordDelimiter = $spec; + + return $this; + } + + /** + * Retrieve the path delimiter character(s) used in + * controller names + * + * @return array + */ + public function getPathDelimiter() + { + return $this->_pathDelimiter; + } + + /** + * Set path delimiter + * + * Set the path delimiter to use in controllers. May be a single string or + * an array of strings. + * + * @param string $spec + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setPathDelimiter($spec) + { + if (!is_string($spec)) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Invalid path delimiter'); + } + $this->_pathDelimiter = $spec; + + return $this; + } + + /** + * Formats a string from a URI into a PHP-friendly name. + * + * By default, replaces words separated by the word separator character(s) + * with camelCaps. If $isAction is false, it also preserves replaces words + * separated by the path separation character with an underscore, making + * the following word Title cased. All non-alphanumeric characters are + * removed. + * + * @param string $unformatted + * @param boolean $isAction Defaults to false + * @return string + */ + protected function _formatName($unformatted, $isAction = false) + { + // preserve directories + if (!$isAction) { + $segments = explode($this->getPathDelimiter(), $unformatted); + } else { + $segments = (array) $unformatted; + } + + foreach ($segments as $key => $segment) { + $segment = str_replace($this->getWordDelimiter(), ' ', strtolower($segment)); + $segment = preg_replace('/[^a-z0-9 ]/', '', $segment); + $segments[$key] = str_replace(' ', '', ucwords($segment)); + } + + return implode('_', $segments); + } + + /** + * Retrieve front controller instance + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + if (null === $this->_frontController) { + require_once 'Zend/Controller/Front.php'; + $this->_frontController = Zend_Controller_Front::getInstance(); + } + + return $this->_frontController; + } + + /** + * Set front controller instance + * + * @param Zend_Controller_Front $controller + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setFrontController(Zend_Controller_Front $controller) + { + $this->_frontController = $controller; + return $this; + } + + /** + * Add or modify a parameter to use when instantiating an action controller + * + * @param string $name + * @param mixed $value + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setParam($name, $value) + { + $name = (string) $name; + $this->_invokeParams[$name] = $value; + return $this; + } + + /** + * Set parameters to pass to action controller constructors + * + * @param array $params + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setParams(array $params) + { + $this->_invokeParams = array_merge($this->_invokeParams, $params); + return $this; + } + + /** + * Retrieve a single parameter from the controller parameter stack + * + * @param string $name + * @return mixed + */ + public function getParam($name) + { + if(isset($this->_invokeParams[$name])) { + return $this->_invokeParams[$name]; + } + + return null; + } + + /** + * Retrieve action controller instantiation parameters + * + * @return array + */ + public function getParams() + { + return $this->_invokeParams; + } + + /** + * Clear the controller parameter stack + * + * By default, clears all parameters. If a parameter name is given, clears + * only that parameter; if an array of parameter names is provided, clears + * each. + * + * @param null|string|array single key or array of keys for params to clear + * @return Zend_Controller_Dispatcher_Abstract + */ + public function clearParams($name = null) + { + if (null === $name) { + $this->_invokeParams = array(); + } elseif (is_string($name) && isset($this->_invokeParams[$name])) { + unset($this->_invokeParams[$name]); + } elseif (is_array($name)) { + foreach ($name as $key) { + if (is_string($key) && isset($this->_invokeParams[$key])) { + unset($this->_invokeParams[$key]); + } + } + } + + return $this; + } + + /** + * Set response object to pass to action controllers + * + * @param Zend_Controller_Response_Abstract|null $response + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setResponse(Zend_Controller_Response_Abstract $response = null) + { + $this->_response = $response; + return $this; + } + + /** + * Return the registered response object + * + * @return Zend_Controller_Response_Abstract|null + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Set the default controller (minus any formatting) + * + * @param string $controller + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setDefaultControllerName($controller) + { + $this->_defaultController = (string) $controller; + return $this; + } + + /** + * Retrieve the default controller name (minus formatting) + * + * @return string + */ + public function getDefaultControllerName() + { + return $this->_defaultController; + } + + /** + * Set the default action (minus any formatting) + * + * @param string $action + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setDefaultAction($action) + { + $this->_defaultAction = (string) $action; + return $this; + } + + /** + * Retrieve the default action name (minus formatting) + * + * @return string + */ + public function getDefaultAction() + { + return $this->_defaultAction; + } + + /** + * Set the default module + * + * @param string $module + * @return Zend_Controller_Dispatcher_Abstract + */ + public function setDefaultModule($module) + { + $this->_defaultModule = (string) $module; + return $this; + } + + /** + * Retrieve the default module + * + * @return string + */ + public function getDefaultModule() + { + return $this->_defaultModule; + } +} diff --git a/lib/zend/Zend/Controller/Dispatcher/Exception.php b/lib/zend/Zend/Controller/Dispatcher/Exception.php new file mode 100644 index 0000000000..3df382ac81 --- /dev/null +++ b/lib/zend/Zend/Controller/Dispatcher/Exception.php @@ -0,0 +1,37 @@ +_curModule = $this->getDefaultModule(); + } + + /** + * Add a single path to the controller directory stack + * + * @param string $path + * @param string $module + * @return Zend_Controller_Dispatcher_Standard + */ + public function addControllerDirectory($path, $module = null) + { + if (null === $module) { + $module = $this->_defaultModule; + } + + $module = (string) $module; + $path = rtrim((string) $path, '/\\'); + + $this->_controllerDirectory[$module] = $path; + return $this; + } + + /** + * Set controller directory + * + * @param array|string $directory + * @return Zend_Controller_Dispatcher_Standard + */ + public function setControllerDirectory($directory, $module = null) + { + $this->_controllerDirectory = array(); + + if (is_string($directory)) { + $this->addControllerDirectory($directory, $module); + } elseif (is_array($directory)) { + foreach ((array) $directory as $module => $path) { + $this->addControllerDirectory($path, $module); + } + } else { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Controller directory spec must be either a string or an array'); + } + + return $this; + } + + /** + * Return the currently set directories for Zend_Controller_Action class + * lookup + * + * If a module is specified, returns just that directory. + * + * @param string $module Module name + * @return array|string Returns array of all directories by default, single + * module directory if module argument provided + */ + public function getControllerDirectory($module = null) + { + if (null === $module) { + return $this->_controllerDirectory; + } + + $module = (string) $module; + if (array_key_exists($module, $this->_controllerDirectory)) { + return $this->_controllerDirectory[$module]; + } + + return null; + } + + /** + * Remove a controller directory by module name + * + * @param string $module + * @return bool + */ + public function removeControllerDirectory($module) + { + $module = (string) $module; + if (array_key_exists($module, $this->_controllerDirectory)) { + unset($this->_controllerDirectory[$module]); + return true; + } + return false; + } + + /** + * Format the module name. + * + * @param string $unformatted + * @return string + */ + public function formatModuleName($unformatted) + { + if (($this->_defaultModule == $unformatted) && !$this->getParam('prefixDefaultModule')) { + return $unformatted; + } + + return ucfirst($this->_formatName($unformatted)); + } + + /** + * Format action class name + * + * @param string $moduleName Name of the current module + * @param string $className Name of the action class + * @return string Formatted class name + */ + public function formatClassName($moduleName, $className) + { + return $this->formatModuleName($moduleName) . '_' . $className; + } + + /** + * Convert a class name to a filename + * + * @param string $class + * @return string + */ + public function classToFilename($class) + { + return str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php'; + } + + /** + * Returns TRUE if the Zend_Controller_Request_Abstract object can be + * dispatched to a controller. + * + * Use this method wisely. By default, the dispatcher will fall back to the + * default controller (either in the module specified or the global default) + * if a given controller does not exist. This method returning false does + * not necessarily indicate the dispatcher will not still dispatch the call. + * + * @param Zend_Controller_Request_Abstract $action + * @return boolean + */ + public function isDispatchable(Zend_Controller_Request_Abstract $request) + { + $className = $this->getControllerClass($request); + if (!$className) { + return false; + } + + if (class_exists($className, false)) { + return true; + } + + $fileSpec = $this->classToFilename($className); + $dispatchDir = $this->getDispatchDirectory(); + $test = $dispatchDir . DIRECTORY_SEPARATOR . $fileSpec; + return Zend_Loader::isReadable($test); + } + + /** + * Dispatch to a controller/action + * + * By default, if a controller is not dispatchable, dispatch() will throw + * an exception. If you wish to use the default controller instead, set the + * param 'useDefaultControllerAlways' via {@link setParam()}. + * + * @param Zend_Controller_Request_Abstract $request + * @param Zend_Controller_Response_Abstract $response + * @return void + * @throws Zend_Controller_Dispatcher_Exception + */ + public function dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response) + { + $this->setResponse($response); + + /** + * Get controller class + */ + if (!$this->isDispatchable($request)) { + $controller = $request->getControllerName(); + if (!$this->getParam('useDefaultControllerAlways') && !empty($controller)) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Invalid controller specified (' . $request->getControllerName() . ')'); + } + + $className = $this->getDefaultControllerClass($request); + } else { + $className = $this->getControllerClass($request); + if (!$className) { + $className = $this->getDefaultControllerClass($request); + } + } + + /** + * Load the controller class file + */ + $className = $this->loadClass($className); + + /** + * Instantiate controller with request, response, and invocation + * arguments; throw exception if it's not an action controller + */ + $controller = new $className($request, $this->getResponse(), $this->getParams()); + if (!($controller instanceof Zend_Controller_Action_Interface) && + !($controller instanceof Zend_Controller_Action)) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception( + 'Controller "' . $className . '" is not an instance of Zend_Controller_Action_Interface' + ); + } + + /** + * Retrieve the action name + */ + $action = $this->getActionMethod($request); + + /** + * Dispatch the method call + */ + $request->setDispatched(true); + + // by default, buffer output + $disableOb = $this->getParam('disableOutputBuffering'); + $obLevel = ob_get_level(); + if (empty($disableOb)) { + ob_start(); + } + + try { + $controller->dispatch($action); + } catch (Exception $e) { + // Clean output buffer on error + $curObLevel = ob_get_level(); + if ($curObLevel > $obLevel) { + do { + ob_get_clean(); + $curObLevel = ob_get_level(); + } while ($curObLevel > $obLevel); + } + + throw $e; + } + + if (empty($disableOb)) { + $content = ob_get_clean(); + $response->appendBody($content); + } + + // Destroy the page controller instance and reflection objects + $controller = null; + } + + /** + * Load a controller class + * + * Attempts to load the controller class file from + * {@link getControllerDirectory()}. If the controller belongs to a + * module, looks for the module prefix to the controller class. + * + * @param string $className + * @return string Class name loaded + * @throws Zend_Controller_Dispatcher_Exception if class not loaded + */ + public function loadClass($className) + { + $finalClass = $className; + if (($this->_defaultModule != $this->_curModule) + || $this->getParam('prefixDefaultModule')) + { + $finalClass = $this->formatClassName($this->_curModule, $className); + } + if (class_exists($finalClass, false)) { + return $finalClass; + } + + $dispatchDir = $this->getDispatchDirectory(); + $loadFile = $dispatchDir . DIRECTORY_SEPARATOR . $this->classToFilename($className); + + if (!include_once $loadFile) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Cannot load controller class "' . $className . '" from file "' . $loadFile . "'"); + } + + if (!class_exists($finalClass, false)) { + require_once 'Zend/Controller/Dispatcher/Exception.php'; + throw new Zend_Controller_Dispatcher_Exception('Invalid controller class ("' . $finalClass . '")'); + } + + return $finalClass; + } + + /** + * Get controller class name + * + * Try request first; if not found, try pulling from request parameter; + * if still not found, fallback to default + * + * @param Zend_Controller_Request_Abstract $request + * @return string|false Returns class name on success + */ + public function getControllerClass(Zend_Controller_Request_Abstract $request) + { + $controllerName = $request->getControllerName(); + if (empty($controllerName)) { + if (!$this->getParam('useDefaultControllerAlways')) { + return false; + } + $controllerName = $this->getDefaultControllerName(); + $request->setControllerName($controllerName); + } + + $className = $this->formatControllerName($controllerName); + + $controllerDirs = $this->getControllerDirectory(); + $module = $request->getModuleName(); + if ($this->isValidModule($module)) { + $this->_curModule = $module; + $this->_curDirectory = $controllerDirs[$module]; + } elseif ($this->isValidModule($this->_defaultModule)) { + $request->setModuleName($this->_defaultModule); + $this->_curModule = $this->_defaultModule; + $this->_curDirectory = $controllerDirs[$this->_defaultModule]; + } else { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('No default module defined for this application'); + } + + return $className; + } + + /** + * Determine if a given module is valid + * + * @param string $module + * @return bool + */ + public function isValidModule($module) + { + if (!is_string($module)) { + return false; + } + + $module = strtolower($module); + $controllerDir = $this->getControllerDirectory(); + foreach (array_keys($controllerDir) as $moduleName) { + if ($module == strtolower($moduleName)) { + return true; + } + } + + return false; + } + + /** + * Retrieve default controller class + * + * Determines whether the default controller to use lies within the + * requested module, or if the global default should be used. + * + * By default, will only use the module default unless that controller does + * not exist; if this is the case, it falls back to the default controller + * in the default module. + * + * @param Zend_Controller_Request_Abstract $request + * @return string + */ + public function getDefaultControllerClass(Zend_Controller_Request_Abstract $request) + { + $controller = $this->getDefaultControllerName(); + $default = $this->formatControllerName($controller); + $request->setControllerName($controller) + ->setActionName(null); + + $module = $request->getModuleName(); + $controllerDirs = $this->getControllerDirectory(); + $this->_curModule = $this->_defaultModule; + $this->_curDirectory = $controllerDirs[$this->_defaultModule]; + if ($this->isValidModule($module)) { + $found = false; + if (class_exists($default, false)) { + $found = true; + } else { + $moduleDir = $controllerDirs[$module]; + $fileSpec = $moduleDir . DIRECTORY_SEPARATOR . $this->classToFilename($default); + if (Zend_Loader::isReadable($fileSpec)) { + $found = true; + $this->_curDirectory = $moduleDir; + } + } + if ($found) { + $request->setModuleName($module); + $this->_curModule = $this->formatModuleName($module); + } + } else { + $request->setModuleName($this->_defaultModule); + } + + return $default; + } + + /** + * Return the value of the currently selected dispatch directory (as set by + * {@link getController()}) + * + * @return string + */ + public function getDispatchDirectory() + { + return $this->_curDirectory; + } + + /** + * Determine the action name + * + * First attempt to retrieve from request; then from request params + * using action key; default to default action + * + * Returns formatted action name + * + * @param Zend_Controller_Request_Abstract $request + * @return string + */ + public function getActionMethod(Zend_Controller_Request_Abstract $request) + { + $action = $request->getActionName(); + if (empty($action)) { + $action = $this->getDefaultAction(); + $request->setActionName($action); + } + + return $this->formatActionName($action); + } +} diff --git a/lib/zend/Zend/Controller/Exception.php b/lib/zend/Zend/Controller/Exception.php new file mode 100644 index 0000000000..d2fa66abfb --- /dev/null +++ b/lib/zend/Zend/Controller/Exception.php @@ -0,0 +1,35 @@ +_plugins = new Zend_Controller_Plugin_Broker(); + } + + /** + * Enforce singleton; disallow cloning + * + * @return void + */ + private function __clone() + { + } + + /** + * Singleton instance + * + * @return Zend_Controller_Front + */ + public static function getInstance() + { + if (null === self::$_instance) { + self::$_instance = new self(); + } + + return self::$_instance; + } + + /** + * Resets all object properties of the singleton instance + * + * Primarily used for testing; could be used to chain front controllers. + * + * Also resets action helper broker, clearing all registered helpers. + * + * @return void + */ + public function resetInstance() + { + $reflection = new ReflectionObject($this); + foreach ($reflection->getProperties() as $property) { + $name = $property->getName(); + switch ($name) { + case '_instance': + break; + case '_controllerDir': + case '_invokeParams': + $this->{$name} = array(); + break; + case '_plugins': + $this->{$name} = new Zend_Controller_Plugin_Broker(); + break; + case '_throwExceptions': + case '_returnResponse': + $this->{$name} = false; + break; + case '_moduleControllerDirectoryName': + $this->{$name} = 'controllers'; + break; + default: + $this->{$name} = null; + break; + } + } + Zend_Controller_Action_HelperBroker::resetHelpers(); + } + + /** + * Convenience feature, calls setControllerDirectory()->setRouter()->dispatch() + * + * In PHP 5.1.x, a call to a static method never populates $this -- so run() + * may actually be called after setting up your front controller. + * + * @param string|array $controllerDirectory Path to Zend_Controller_Action + * controller classes or array of such paths + * @return void + * @throws Zend_Controller_Exception if called from an object instance + */ + public static function run($controllerDirectory) + { + self::getInstance() + ->setControllerDirectory($controllerDirectory) + ->dispatch(); + } + + /** + * Add a controller directory to the controller directory stack + * + * If $args is presented and is a string, uses it for the array key mapping + * to the directory specified. + * + * @param string $directory + * @param string $module Optional argument; module with which to associate directory. If none provided, assumes 'default' + * @return Zend_Controller_Front + * @throws Zend_Controller_Exception if directory not found or readable + */ + public function addControllerDirectory($directory, $module = null) + { + $this->getDispatcher()->addControllerDirectory($directory, $module); + return $this; + } + + /** + * Set controller directory + * + * Stores controller directory(ies) in dispatcher. May be an array of + * directories or a string containing a single directory. + * + * @param string|array $directory Path to Zend_Controller_Action controller + * classes or array of such paths + * @param string $module Optional module name to use with string $directory + * @return Zend_Controller_Front + */ + public function setControllerDirectory($directory, $module = null) + { + $this->getDispatcher()->setControllerDirectory($directory, $module); + return $this; + } + + /** + * Retrieve controller directory + * + * Retrieves: + * - Array of all controller directories if no $name passed + * - String path if $name passed and exists as a key in controller directory array + * - null if $name passed but does not exist in controller directory keys + * + * @param string $name Default null + * @return array|string|null + */ + public function getControllerDirectory($name = null) + { + return $this->getDispatcher()->getControllerDirectory($name); + } + + /** + * Remove a controller directory by module name + * + * @param string $module + * @return bool + */ + public function removeControllerDirectory($module) + { + return $this->getDispatcher()->removeControllerDirectory($module); + } + + /** + * Specify a directory as containing modules + * + * Iterates through the directory, adding any subdirectories as modules; + * the subdirectory within each module named after {@link $_moduleControllerDirectoryName} + * will be used as the controller directory path. + * + * @param string $path + * @return Zend_Controller_Front + */ + public function addModuleDirectory($path) + { + try{ + $dir = new DirectoryIterator($path); + }catch(Exception $e){ + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception("Directory $path not readable"); + } + foreach ($dir as $file) { + if ($file->isDot() || !$file->isDir()) { + continue; + } + + $module = $file->getFilename(); + + // Don't use SCCS directories as modules + if (preg_match('/^[^a-z]/i', $module) || ('CVS' == $module)) { + continue; + } + + $moduleDir = $file->getPathname() . DIRECTORY_SEPARATOR . $this->getModuleControllerDirectoryName(); + $this->addControllerDirectory($moduleDir, $module); + } + + return $this; + } + + /** + * Return the path to a module directory (but not the controllers directory within) + * + * @param string $module + * @return string|null + */ + public function getModuleDirectory($module = null) + { + if (null === $module) { + $request = $this->getRequest(); + if (null !== $request) { + $module = $this->getRequest()->getModuleName(); + } + if (empty($module)) { + $module = $this->getDispatcher()->getDefaultModule(); + } + } + + $controllerDir = $this->getControllerDirectory($module); + + if ((null === $controllerDir) || !is_string($controllerDir)) { + return null; + } + + return dirname($controllerDir); + } + + /** + * Set the directory name within a module containing controllers + * + * @param string $name + * @return Zend_Controller_Front + */ + public function setModuleControllerDirectoryName($name = 'controllers') + { + $this->_moduleControllerDirectoryName = (string) $name; + + return $this; + } + + /** + * Return the directory name within a module containing controllers + * + * @return string + */ + public function getModuleControllerDirectoryName() + { + return $this->_moduleControllerDirectoryName; + } + + /** + * Set the default controller (unformatted string) + * + * @param string $controller + * @return Zend_Controller_Front + */ + public function setDefaultControllerName($controller) + { + $dispatcher = $this->getDispatcher(); + $dispatcher->setDefaultControllerName($controller); + return $this; + } + + /** + * Retrieve the default controller (unformatted string) + * + * @return string + */ + public function getDefaultControllerName() + { + return $this->getDispatcher()->getDefaultControllerName(); + } + + /** + * Set the default action (unformatted string) + * + * @param string $action + * @return Zend_Controller_Front + */ + public function setDefaultAction($action) + { + $dispatcher = $this->getDispatcher(); + $dispatcher->setDefaultAction($action); + return $this; + } + + /** + * Retrieve the default action (unformatted string) + * + * @return string + */ + public function getDefaultAction() + { + return $this->getDispatcher()->getDefaultAction(); + } + + /** + * Set the default module name + * + * @param string $module + * @return Zend_Controller_Front + */ + public function setDefaultModule($module) + { + $dispatcher = $this->getDispatcher(); + $dispatcher->setDefaultModule($module); + return $this; + } + + /** + * Retrieve the default module + * + * @return string + */ + public function getDefaultModule() + { + return $this->getDispatcher()->getDefaultModule(); + } + + /** + * Set request class/object + * + * Set the request object. The request holds the request environment. + * + * If a class name is provided, it will instantiate it + * + * @param string|Zend_Controller_Request_Abstract $request + * @throws Zend_Controller_Exception if invalid request class + * @return Zend_Controller_Front + */ + public function setRequest($request) + { + if (is_string($request)) { + if (!class_exists($request)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($request); + } + $request = new $request(); + } + if (!$request instanceof Zend_Controller_Request_Abstract) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid request class'); + } + + $this->_request = $request; + + return $this; + } + + /** + * Return the request object. + * + * @return null|Zend_Controller_Request_Abstract + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Set router class/object + * + * Set the router object. The router is responsible for mapping + * the request to a controller and action. + * + * If a class name is provided, instantiates router with any parameters + * registered via {@link setParam()} or {@link setParams()}. + * + * @param string|Zend_Controller_Router_Interface $router + * @throws Zend_Controller_Exception if invalid router class + * @return Zend_Controller_Front + */ + public function setRouter($router) + { + if (is_string($router)) { + if (!class_exists($router)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($router); + } + $router = new $router(); + } + + if (!$router instanceof Zend_Controller_Router_Interface) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid router class'); + } + + $router->setFrontController($this); + $this->_router = $router; + + return $this; + } + + /** + * Return the router object. + * + * Instantiates a Zend_Controller_Router_Rewrite object if no router currently set. + * + * @return Zend_Controller_Router_Interface + */ + public function getRouter() + { + if (null == $this->_router) { + require_once 'Zend/Controller/Router/Rewrite.php'; + $this->setRouter(new Zend_Controller_Router_Rewrite()); + } + + return $this->_router; + } + + /** + * Set the base URL used for requests + * + * Use to set the base URL segment of the REQUEST_URI to use when + * determining PATH_INFO, etc. Examples: + * - /admin + * - /myapp + * - /subdir/index.php + * + * Note that the URL should not include the full URI. Do not use: + * - http://example.com/admin + * - http://example.com/myapp + * - http://example.com/subdir/index.php + * + * If a null value is passed, this can be used as well for autodiscovery (default). + * + * @param string $base + * @return Zend_Controller_Front + * @throws Zend_Controller_Exception for non-string $base + */ + public function setBaseUrl($base = null) + { + if (!is_string($base) && (null !== $base)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Rewrite base must be a string'); + } + + $this->_baseUrl = $base; + + if ((null !== ($request = $this->getRequest())) && (method_exists($request, 'setBaseUrl'))) { + $request->setBaseUrl($base); + } + + return $this; + } + + /** + * Retrieve the currently set base URL + * + * @return string + */ + public function getBaseUrl() + { + $request = $this->getRequest(); + if ((null !== $request) && method_exists($request, 'getBaseUrl')) { + return $request->getBaseUrl(); + } + + return $this->_baseUrl; + } + + /** + * Set the dispatcher object. The dispatcher is responsible for + * taking a Zend_Controller_Dispatcher_Token object, instantiating the controller, and + * call the action method of the controller. + * + * @param Zend_Controller_Dispatcher_Interface $dispatcher + * @return Zend_Controller_Front + */ + public function setDispatcher(Zend_Controller_Dispatcher_Interface $dispatcher) + { + $this->_dispatcher = $dispatcher; + return $this; + } + + /** + * Return the dispatcher object. + * + * @return Zend_Controller_Dispatcher_Interface + */ + public function getDispatcher() + { + /** + * Instantiate the default dispatcher if one was not set. + */ + if (!$this->_dispatcher instanceof Zend_Controller_Dispatcher_Interface) { + require_once 'Zend/Controller/Dispatcher/Standard.php'; + $this->_dispatcher = new Zend_Controller_Dispatcher_Standard(); + } + return $this->_dispatcher; + } + + /** + * Set response class/object + * + * Set the response object. The response is a container for action + * responses and headers. Usage is optional. + * + * If a class name is provided, instantiates a response object. + * + * @param string|Zend_Controller_Response_Abstract $response + * @throws Zend_Controller_Exception if invalid response class + * @return Zend_Controller_Front + */ + public function setResponse($response) + { + if (is_string($response)) { + if (!class_exists($response)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($response); + } + $response = new $response(); + } + if (!$response instanceof Zend_Controller_Response_Abstract) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid response class'); + } + + $this->_response = $response; + + return $this; + } + + /** + * Return the response object. + * + * @return null|Zend_Controller_Response_Abstract + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Add or modify a parameter to use when instantiating an action controller + * + * @param string $name + * @param mixed $value + * @return Zend_Controller_Front + */ + public function setParam($name, $value) + { + $name = (string) $name; + $this->_invokeParams[$name] = $value; + return $this; + } + + /** + * Set parameters to pass to action controller constructors + * + * @param array $params + * @return Zend_Controller_Front + */ + public function setParams(array $params) + { + $this->_invokeParams = array_merge($this->_invokeParams, $params); + return $this; + } + + /** + * Retrieve a single parameter from the controller parameter stack + * + * @param string $name + * @return mixed + */ + public function getParam($name) + { + if(isset($this->_invokeParams[$name])) { + return $this->_invokeParams[$name]; + } + + return null; + } + + /** + * Retrieve action controller instantiation parameters + * + * @return array + */ + public function getParams() + { + return $this->_invokeParams; + } + + /** + * Clear the controller parameter stack + * + * By default, clears all parameters. If a parameter name is given, clears + * only that parameter; if an array of parameter names is provided, clears + * each. + * + * @param null|string|array single key or array of keys for params to clear + * @return Zend_Controller_Front + */ + public function clearParams($name = null) + { + if (null === $name) { + $this->_invokeParams = array(); + } elseif (is_string($name) && isset($this->_invokeParams[$name])) { + unset($this->_invokeParams[$name]); + } elseif (is_array($name)) { + foreach ($name as $key) { + if (is_string($key) && isset($this->_invokeParams[$key])) { + unset($this->_invokeParams[$key]); + } + } + } + + return $this; + } + + /** + * Register a plugin. + * + * @param Zend_Controller_Plugin_Abstract $plugin + * @param int $stackIndex Optional; stack index for plugin + * @return Zend_Controller_Front + */ + public function registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null) + { + $this->_plugins->registerPlugin($plugin, $stackIndex); + return $this; + } + + /** + * Unregister a plugin. + * + * @param string|Zend_Controller_Plugin_Abstract $plugin Plugin class or object to unregister + * @return Zend_Controller_Front + */ + public function unregisterPlugin($plugin) + { + $this->_plugins->unregisterPlugin($plugin); + return $this; + } + + /** + * Is a particular plugin registered? + * + * @param string $class + * @return bool + */ + public function hasPlugin($class) + { + return $this->_plugins->hasPlugin($class); + } + + /** + * Retrieve a plugin or plugins by class + * + * @param string $class + * @return false|Zend_Controller_Plugin_Abstract|array + */ + public function getPlugin($class) + { + return $this->_plugins->getPlugin($class); + } + + /** + * Retrieve all plugins + * + * @return array + */ + public function getPlugins() + { + return $this->_plugins->getPlugins(); + } + + /** + * Set the throwExceptions flag and retrieve current status + * + * Set whether exceptions encounted in the dispatch loop should be thrown + * or caught and trapped in the response object. + * + * Default behaviour is to trap them in the response object; call this + * method to have them thrown. + * + * Passing no value will return the current value of the flag; passing a + * boolean true or false value will set the flag and return the current + * object instance. + * + * @param boolean $flag Defaults to null (return flag state) + * @return boolean|Zend_Controller_Front Used as a setter, returns object; as a getter, returns boolean + */ + public function throwExceptions($flag = null) + { + if ($flag !== null) { + $this->_throwExceptions = (bool) $flag; + return $this; + } + + return $this->_throwExceptions; + } + + /** + * Set whether {@link dispatch()} should return the response without first + * rendering output. By default, output is rendered and dispatch() returns + * nothing. + * + * @param boolean $flag + * @return boolean|Zend_Controller_Front Used as a setter, returns object; as a getter, returns boolean + */ + public function returnResponse($flag = null) + { + if (true === $flag) { + $this->_returnResponse = true; + return $this; + } elseif (false === $flag) { + $this->_returnResponse = false; + return $this; + } + + return $this->_returnResponse; + } + + /** + * Dispatch an HTTP request to a controller/action. + * + * @param Zend_Controller_Request_Abstract|null $request + * @param Zend_Controller_Response_Abstract|null $response + * @return void|Zend_Controller_Response_Abstract Returns response object if returnResponse() is true + */ + public function dispatch(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null) + { + if (!$this->getParam('noErrorHandler') && !$this->_plugins->hasPlugin('Zend_Controller_Plugin_ErrorHandler')) { + // Register with stack index of 100 + require_once 'Zend/Controller/Plugin/ErrorHandler.php'; + $this->_plugins->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(), 100); + } + + if (!$this->getParam('noViewRenderer') && !Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) { + require_once 'Zend/Controller/Action/Helper/ViewRenderer.php'; + Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-80, new Zend_Controller_Action_Helper_ViewRenderer()); + } + + /** + * Instantiate default request object (HTTP version) if none provided + */ + if (null !== $request) { + $this->setRequest($request); + } elseif ((null === $request) && (null === ($request = $this->getRequest()))) { + require_once 'Zend/Controller/Request/Http.php'; + $request = new Zend_Controller_Request_Http(); + $this->setRequest($request); + } + + /** + * Set base URL of request object, if available + */ + if (is_callable(array($this->_request, 'setBaseUrl'))) { + if (null !== $this->_baseUrl) { + $this->_request->setBaseUrl($this->_baseUrl); + } + } + + /** + * Instantiate default response object (HTTP version) if none provided + */ + if (null !== $response) { + $this->setResponse($response); + } elseif ((null === $this->_response) && (null === ($this->_response = $this->getResponse()))) { + require_once 'Zend/Controller/Response/Http.php'; + $response = new Zend_Controller_Response_Http(); + $this->setResponse($response); + } + + /** + * Register request and response objects with plugin broker + */ + $this->_plugins + ->setRequest($this->_request) + ->setResponse($this->_response); + + /** + * Initialize router + */ + $router = $this->getRouter(); + $router->setParams($this->getParams()); + + /** + * Initialize dispatcher + */ + $dispatcher = $this->getDispatcher(); + $dispatcher->setParams($this->getParams()) + ->setResponse($this->_response); + + // Begin dispatch + try { + /** + * Route request to controller/action, if a router is provided + */ + + /** + * Notify plugins of router startup + */ + $this->_plugins->routeStartup($this->_request); + + $router->route($this->_request); + + /** + * Notify plugins of router completion + */ + $this->_plugins->routeShutdown($this->_request); + + /** + * Notify plugins of dispatch loop startup + */ + $this->_plugins->dispatchLoopStartup($this->_request); + + /** + * Attempt to dispatch the controller/action. If the $this->_request + * indicates that it needs to be dispatched, move to the next + * action in the request. + */ + do { + $this->_request->setDispatched(true); + + /** + * Notify plugins of dispatch startup + */ + $this->_plugins->preDispatch($this->_request); + + /** + * Skip requested action if preDispatch() has reset it + */ + if (!$this->_request->isDispatched()) { + continue; + } + + /** + * Dispatch request + */ + try { + $dispatcher->dispatch($this->_request, $this->_response); + } catch (Exception $e) { + if ($this->throwExceptions()) { + throw $e; + } + $this->_response->setException($e); + } + + /** + * Notify plugins of dispatch completion + */ + $this->_plugins->postDispatch($this->_request); + } while (!$this->_request->isDispatched()); + } catch (Exception $e) { + if ($this->throwExceptions()) { + throw $e; + } + + $this->_response->setException($e); + } + + /** + * Notify plugins of dispatch loop completion + */ + try { + $this->_plugins->dispatchLoopShutdown(); + } catch (Exception $e) { + if ($this->throwExceptions()) { + throw $e; + } + + $this->_response->setException($e); + } + + if ($this->returnResponse()) { + return $this->_response; + } + + $this->_response->sendResponse(); + } +} diff --git a/lib/zend/Zend/Controller/Plugin/Abstract.php b/lib/zend/Zend/Controller/Plugin/Abstract.php new file mode 100644 index 0000000000..6105af6586 --- /dev/null +++ b/lib/zend/Zend/Controller/Plugin/Abstract.php @@ -0,0 +1,151 @@ +_request = $request; + return $this; + } + + /** + * Get request object + * + * @return Zend_Controller_Request_Abstract $request + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Set response object + * + * @param Zend_Controller_Response_Abstract $response + * @return Zend_Controller_Plugin_Abstract + */ + public function setResponse(Zend_Controller_Response_Abstract $response) + { + $this->_response = $response; + return $this; + } + + /** + * Get response object + * + * @return Zend_Controller_Response_Abstract $response + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Called before Zend_Controller_Front begins evaluating the + * request against its routes. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function routeStartup(Zend_Controller_Request_Abstract $request) + {} + + /** + * Called after Zend_Controller_Router exits. + * + * Called after Zend_Controller_Front exits from the router. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function routeShutdown(Zend_Controller_Request_Abstract $request) + {} + + /** + * Called before Zend_Controller_Front enters its dispatch loop. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) + {} + + /** + * Called before an action is dispatched by Zend_Controller_Dispatcher. + * + * This callback allows for proxy or filter behavior. By altering the + * request and resetting its dispatched flag (via + * {@link Zend_Controller_Request_Abstract::setDispatched() setDispatched(false)}), + * the current action may be skipped. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function preDispatch(Zend_Controller_Request_Abstract $request) + {} + + /** + * Called after an action is dispatched by Zend_Controller_Dispatcher. + * + * This callback allows for proxy or filter behavior. By altering the + * request and resetting its dispatched flag (via + * {@link Zend_Controller_Request_Abstract::setDispatched() setDispatched(false)}), + * a new action may be specified for dispatching. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function postDispatch(Zend_Controller_Request_Abstract $request) + {} + + /** + * Called before Zend_Controller_Front exits its dispatch loop. + * + * @return void + */ + public function dispatchLoopShutdown() + {} +} diff --git a/lib/zend/Zend/Controller/Plugin/ActionStack.php b/lib/zend/Zend/Controller/Plugin/ActionStack.php new file mode 100644 index 0000000000..90802fa7c2 --- /dev/null +++ b/lib/zend/Zend/Controller/Plugin/ActionStack.php @@ -0,0 +1,280 @@ +setRegistry($registry); + + if (null !== $key) { + $this->setRegistryKey($key); + } else { + $key = $this->getRegistryKey(); + } + + $registry[$key] = array(); + } + + /** + * Set registry object + * + * @param Zend_Registry $registry + * @return Zend_Controller_Plugin_ActionStack + */ + public function setRegistry(Zend_Registry $registry) + { + $this->_registry = $registry; + return $this; + } + + /** + * Retrieve registry object + * + * @return Zend_Registry + */ + public function getRegistry() + { + return $this->_registry; + } + + /** + * Retrieve registry key + * + * @return string + */ + public function getRegistryKey() + { + return $this->_registryKey; + } + + /** + * Set registry key + * + * @param string $key + * @return Zend_Controller_Plugin_ActionStack + */ + public function setRegistryKey($key) + { + $this->_registryKey = (string) $key; + return $this; + } + + /** + * Set clearRequestParams flag + * + * @param bool $clearRequestParams + * @return Zend_Controller_Plugin_ActionStack + */ + public function setClearRequestParams($clearRequestParams) + { + $this->_clearRequestParams = (bool) $clearRequestParams; + return $this; + } + + /** + * Retrieve clearRequestParams flag + * + * @return bool + */ + public function getClearRequestParams() + { + return $this->_clearRequestParams; + } + + /** + * Retrieve action stack + * + * @return array + */ + public function getStack() + { + $registry = $this->getRegistry(); + $stack = $registry[$this->getRegistryKey()]; + return $stack; + } + + /** + * Save stack to registry + * + * @param array $stack + * @return Zend_Controller_Plugin_ActionStack + */ + protected function _saveStack(array $stack) + { + $registry = $this->getRegistry(); + $registry[$this->getRegistryKey()] = $stack; + return $this; + } + + /** + * Push an item onto the stack + * + * @param Zend_Controller_Request_Abstract $next + * @return Zend_Controller_Plugin_ActionStack + */ + public function pushStack(Zend_Controller_Request_Abstract $next) + { + $stack = $this->getStack(); + array_push($stack, $next); + return $this->_saveStack($stack); + } + + /** + * Pop an item off the action stack + * + * @return false|Zend_Controller_Request_Abstract + */ + public function popStack() + { + $stack = $this->getStack(); + if (0 == count($stack)) { + return false; + } + + $next = array_pop($stack); + $this->_saveStack($stack); + + if (!$next instanceof Zend_Controller_Request_Abstract) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('ArrayStack should only contain request objects'); + } + $action = $next->getActionName(); + if (empty($action)) { + return $this->popStack($stack); + } + + $request = $this->getRequest(); + $controller = $next->getControllerName(); + if (empty($controller)) { + $next->setControllerName($request->getControllerName()); + } + + $module = $next->getModuleName(); + if (empty($module)) { + $next->setModuleName($request->getModuleName()); + } + + return $next; + } + + /** + * postDispatch() plugin hook -- check for actions in stack, and dispatch if any found + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function postDispatch(Zend_Controller_Request_Abstract $request) + { + // Don't move on to next request if this is already an attempt to + // forward + if (!$request->isDispatched()) { + return; + } + + $this->setRequest($request); + $stack = $this->getStack(); + if (empty($stack)) { + return; + } + $next = $this->popStack(); + if (!$next) { + return; + } + + $this->forward($next); + } + + /** + * Forward request with next action + * + * @param array $next + * @return void + */ + public function forward(Zend_Controller_Request_Abstract $next) + { + $request = $this->getRequest(); + if ($this->getClearRequestParams()) { + $request->clearParams(); + } + + $request->setModuleName($next->getModuleName()) + ->setControllerName($next->getControllerName()) + ->setActionName($next->getActionName()) + ->setParams($next->getParams()) + ->setDispatched(false); + } +} diff --git a/lib/zend/Zend/Controller/Plugin/Broker.php b/lib/zend/Zend/Controller/Plugin/Broker.php new file mode 100644 index 0000000000..0e16cf94e2 --- /dev/null +++ b/lib/zend/Zend/Controller/Plugin/Broker.php @@ -0,0 +1,363 @@ +_plugins, true)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Plugin already registered'); + } + + $stackIndex = (int) $stackIndex; + + if ($stackIndex) { + if (isset($this->_plugins[$stackIndex])) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Plugin with stackIndex "' . $stackIndex . '" already registered'); + } + $this->_plugins[$stackIndex] = $plugin; + } else { + $stackIndex = count($this->_plugins); + while (isset($this->_plugins[$stackIndex])) { + ++$stackIndex; + } + $this->_plugins[$stackIndex] = $plugin; + } + + $request = $this->getRequest(); + if ($request) { + $this->_plugins[$stackIndex]->setRequest($request); + } + $response = $this->getResponse(); + if ($response) { + $this->_plugins[$stackIndex]->setResponse($response); + } + + ksort($this->_plugins); + + return $this; + } + + /** + * Unregister a plugin. + * + * @param string|Zend_Controller_Plugin_Abstract $plugin Plugin object or class name + * @return Zend_Controller_Plugin_Broker + */ + public function unregisterPlugin($plugin) + { + if ($plugin instanceof Zend_Controller_Plugin_Abstract) { + // Given a plugin object, find it in the array + $key = array_search($plugin, $this->_plugins, true); + if (false === $key) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Plugin never registered.'); + } + unset($this->_plugins[$key]); + } elseif (is_string($plugin)) { + // Given a plugin class, find all plugins of that class and unset them + foreach ($this->_plugins as $key => $_plugin) { + $type = get_class($_plugin); + if ($plugin == $type) { + unset($this->_plugins[$key]); + } + } + } + return $this; + } + + /** + * Is a plugin of a particular class registered? + * + * @param string $class + * @return bool + */ + public function hasPlugin($class) + { + foreach ($this->_plugins as $plugin) { + $type = get_class($plugin); + if ($class == $type) { + return true; + } + } + + return false; + } + + /** + * Retrieve a plugin or plugins by class + * + * @param string $class Class name of plugin(s) desired + * @return false|Zend_Controller_Plugin_Abstract|array Returns false if none found, plugin if only one found, and array of plugins if multiple plugins of same class found + */ + public function getPlugin($class) + { + $found = array(); + foreach ($this->_plugins as $plugin) { + $type = get_class($plugin); + if ($class == $type) { + $found[] = $plugin; + } + } + + switch (count($found)) { + case 0: + return false; + case 1: + return $found[0]; + default: + return $found; + } + } + + /** + * Retrieve all plugins + * + * @return array + */ + public function getPlugins() + { + return $this->_plugins; + } + + /** + * Set request object, and register with each plugin + * + * @param Zend_Controller_Request_Abstract $request + * @return Zend_Controller_Plugin_Broker + */ + public function setRequest(Zend_Controller_Request_Abstract $request) + { + $this->_request = $request; + + foreach ($this->_plugins as $plugin) { + $plugin->setRequest($request); + } + + return $this; + } + + /** + * Get request object + * + * @return Zend_Controller_Request_Abstract $request + */ + public function getRequest() + { + return $this->_request; + } + + /** + * Set response object + * + * @param Zend_Controller_Response_Abstract $response + * @return Zend_Controller_Plugin_Broker + */ + public function setResponse(Zend_Controller_Response_Abstract $response) + { + $this->_response = $response; + + foreach ($this->_plugins as $plugin) { + $plugin->setResponse($response); + } + + + return $this; + } + + /** + * Get response object + * + * @return Zend_Controller_Response_Abstract $response + */ + public function getResponse() + { + return $this->_response; + } + + + /** + * Called before Zend_Controller_Front begins evaluating the + * request against its routes. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function routeStartup(Zend_Controller_Request_Abstract $request) + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->routeStartup($request); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } + + + /** + * Called before Zend_Controller_Front exits its iterations over + * the route set. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function routeShutdown(Zend_Controller_Request_Abstract $request) + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->routeShutdown($request); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } + + + /** + * Called before Zend_Controller_Front enters its dispatch loop. + * + * During the dispatch loop, Zend_Controller_Front keeps a + * Zend_Controller_Request_Abstract object, and uses + * Zend_Controller_Dispatcher to dispatch the + * Zend_Controller_Request_Abstract object to controllers/actions. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->dispatchLoopStartup($request); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } + + + /** + * Called before an action is dispatched by Zend_Controller_Dispatcher. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function preDispatch(Zend_Controller_Request_Abstract $request) + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->preDispatch($request); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } + + + /** + * Called after an action is dispatched by Zend_Controller_Dispatcher. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function postDispatch(Zend_Controller_Request_Abstract $request) + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->postDispatch($request); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } + + + /** + * Called before Zend_Controller_Front exits its dispatch loop. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function dispatchLoopShutdown() + { + foreach ($this->_plugins as $plugin) { + try { + $plugin->dispatchLoopShutdown(); + } catch (Exception $e) { + if (Zend_Controller_Front::getInstance()->throwExceptions()) { + throw $e; + } else { + $this->getResponse()->setException($e); + } + } + } + } +} diff --git a/lib/zend/Zend/Controller/Plugin/ErrorHandler.php b/lib/zend/Zend/Controller/Plugin/ErrorHandler.php new file mode 100644 index 0000000000..ffc50b97e1 --- /dev/null +++ b/lib/zend/Zend/Controller/Plugin/ErrorHandler.php @@ -0,0 +1,257 @@ +setErrorHandler($options); + } + + /** + * setErrorHandler() - setup the error handling options + * + * @param array $options + * @return Zend_Controller_Plugin_ErrorHandler + */ + public function setErrorHandler(Array $options = array()) + { + if (isset($options['module'])) { + $this->setErrorHandlerModule($options['module']); + } + if (isset($options['controller'])) { + $this->setErrorHandlerController($options['controller']); + } + if (isset($options['action'])) { + $this->setErrorHandlerAction($options['action']); + } + return $this; + } + + /** + * Set the module name for the error handler + * + * @param string $module + * @return Zend_Controller_Plugin_ErrorHandler + */ + public function setErrorHandlerModule($module) + { + $this->_errorModule = (string) $module; + return $this; + } + + /** + * Retrieve the current error handler module + * + * @return string + */ + public function getErrorHandlerModule() + { + if (null === $this->_errorModule) { + $this->_errorModule = Zend_Controller_Front::getInstance()->getDispatcher()->getDefaultModule(); + } + return $this->_errorModule; + } + + /** + * Set the controller name for the error handler + * + * @param string $controller + * @return Zend_Controller_Plugin_ErrorHandler + */ + public function setErrorHandlerController($controller) + { + $this->_errorController = (string) $controller; + return $this; + } + + /** + * Retrieve the current error handler controller + * + * @return string + */ + public function getErrorHandlerController() + { + return $this->_errorController; + } + + /** + * Set the action name for the error handler + * + * @param string $action + * @return Zend_Controller_Plugin_ErrorHandler + */ + public function setErrorHandlerAction($action) + { + $this->_errorAction = (string) $action; + return $this; + } + + /** + * Retrieve the current error handler action + * + * @return string + */ + public function getErrorHandlerAction() + { + return $this->_errorAction; + } + + /** + * postDispatch() plugin hook -- check for exceptions and dispatch error + * handler if necessary + * + * If the 'noErrorHandler' front controller flag has been set, + * returns early. + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function postDispatch(Zend_Controller_Request_Abstract $request) + { + $frontController = Zend_Controller_Front::getInstance(); + if ($frontController->getParam('noErrorHandler')) { + return; + } + + $response = $this->getResponse(); + + if ($this->_isInsideErrorHandlerLoop) { + $exceptions = $response->getException(); + if (count($exceptions) > $this->_exceptionCountAtFirstEncounter) { + // Exception thrown by error handler; tell the front controller to throw it + $frontController->throwExceptions(true); + throw array_pop($exceptions); + } + } + + // check for an exception AND allow the error handler controller the option to forward + if (($response->isException()) && (!$this->_isInsideErrorHandlerLoop)) { + $this->_isInsideErrorHandlerLoop = true; + + // Get exception information + $error = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS); + $exceptions = $response->getException(); + $exception = $exceptions[0]; + $exceptionType = get_class($exception); + $error->exception = $exception; + switch ($exceptionType) { + case 'Zend_Controller_Dispatcher_Exception': + $error->type = self::EXCEPTION_NO_CONTROLLER; + break; + case 'Zend_Controller_Action_Exception': + if (404 == $exception->getCode()) { + $error->type = self::EXCEPTION_NO_ACTION; + } else { + $error->type = self::EXCEPTION_OTHER; + } + break; + default: + $error->type = self::EXCEPTION_OTHER; + break; + } + + // Keep a copy of the original request + $error->request = clone $request; + + // get a count of the number of exceptions encountered + $this->_exceptionCountAtFirstEncounter = count($exceptions); + + // Forward to the error handler + $request->setParam('error_handler', $error) + ->setModuleName($this->getErrorHandlerModule()) + ->setControllerName($this->getErrorHandlerController()) + ->setActionName($this->getErrorHandlerAction()) + ->setDispatched(false); + } + } +} diff --git a/lib/zend/Zend/Controller/Plugin/PutHandler.php b/lib/zend/Zend/Controller/Plugin/PutHandler.php new file mode 100644 index 0000000000..0695f91481 --- /dev/null +++ b/lib/zend/Zend/Controller/Plugin/PutHandler.php @@ -0,0 +1,60 @@ +_request->isPut()) { + $putParams = array(); + parse_str($this->_request->getRawBody(), $putParams); + $request->setParams($putParams); + } + } +} diff --git a/lib/zend/Zend/Controller/Request/Abstract.php b/lib/zend/Zend/Controller/Request/Abstract.php new file mode 100644 index 0000000000..0496ae9e36 --- /dev/null +++ b/lib/zend/Zend/Controller/Request/Abstract.php @@ -0,0 +1,356 @@ +_module) { + $this->_module = $this->getParam($this->getModuleKey()); + } + + return $this->_module; + } + + /** + * Set the module name to use + * + * @param string $value + * @return Zend_Controller_Request_Abstract + */ + public function setModuleName($value) + { + $this->_module = $value; + return $this; + } + + /** + * Retrieve the controller name + * + * @return string + */ + public function getControllerName() + { + if (null === $this->_controller) { + $this->_controller = $this->getParam($this->getControllerKey()); + } + + return $this->_controller; + } + + /** + * Set the controller name to use + * + * @param string $value + * @return Zend_Controller_Request_Abstract + */ + public function setControllerName($value) + { + $this->_controller = $value; + return $this; + } + + /** + * Retrieve the action name + * + * @return string + */ + public function getActionName() + { + if (null === $this->_action) { + $this->_action = $this->getParam($this->getActionKey()); + } + + return $this->_action; + } + + /** + * Set the action name + * + * @param string $value + * @return Zend_Controller_Request_Abstract + */ + public function setActionName($value) + { + $this->_action = $value; + /** + * @see ZF-3465 + */ + if (null === $value) { + $this->setParam($this->getActionKey(), $value); + } + return $this; + } + + /** + * Retrieve the module key + * + * @return string + */ + public function getModuleKey() + { + return $this->_moduleKey; + } + + /** + * Set the module key + * + * @param string $key + * @return Zend_Controller_Request_Abstract + */ + public function setModuleKey($key) + { + $this->_moduleKey = (string) $key; + return $this; + } + + /** + * Retrieve the controller key + * + * @return string + */ + public function getControllerKey() + { + return $this->_controllerKey; + } + + /** + * Set the controller key + * + * @param string $key + * @return Zend_Controller_Request_Abstract + */ + public function setControllerKey($key) + { + $this->_controllerKey = (string) $key; + return $this; + } + + /** + * Retrieve the action key + * + * @return string + */ + public function getActionKey() + { + return $this->_actionKey; + } + + /** + * Set the action key + * + * @param string $key + * @return Zend_Controller_Request_Abstract + */ + public function setActionKey($key) + { + $this->_actionKey = (string) $key; + return $this; + } + + /** + * Get an action parameter + * + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed + */ + public function getParam($key, $default = null) + { + $key = (string) $key; + if (isset($this->_params[$key])) { + return $this->_params[$key]; + } + + return $default; + } + + /** + * Retrieve only user params (i.e, any param specific to the object and not the environment) + * + * @return array + */ + public function getUserParams() + { + return $this->_params; + } + + /** + * Retrieve a single user param (i.e, a param specific to the object and not the environment) + * + * @param string $key + * @param string $default Default value to use if key not found + * @return mixed + */ + public function getUserParam($key, $default = null) + { + if (isset($this->_params[$key])) { + return $this->_params[$key]; + } + + return $default; + } + + /** + * Set an action parameter + * + * A $value of null will unset the $key if it exists + * + * @param string $key + * @param mixed $value + * @return Zend_Controller_Request_Abstract + */ + public function setParam($key, $value) + { + $key = (string) $key; + + if ((null === $value) && isset($this->_params[$key])) { + unset($this->_params[$key]); + } elseif (null !== $value) { + $this->_params[$key] = $value; + } + + return $this; + } + + /** + * Get all action parameters + * + * @return array + */ + public function getParams() + { + return $this->_params; + } + + /** + * Set action parameters en masse; does not overwrite + * + * Null values will unset the associated key. + * + * @param array $array + * @return Zend_Controller_Request_Abstract + */ + public function setParams(array $array) + { + $this->_params = $this->_params + (array) $array; + + foreach ($this->_params as $key => $value) { + if (null === $value) { + unset($this->_params[$key]); + } + } + + return $this; + } + + /** + * Unset all user parameters + * + * @return Zend_Controller_Request_Abstract + */ + public function clearParams() + { + $this->_params = array(); + return $this; + } + + /** + * Set flag indicating whether or not request has been dispatched + * + * @param boolean $flag + * @return Zend_Controller_Request_Abstract + */ + public function setDispatched($flag = true) + { + $this->_dispatched = $flag ? true : false; + return $this; + } + + /** + * Determine if the request has been dispatched + * + * @return boolean + */ + public function isDispatched() + { + return $this->_dispatched; + } +} diff --git a/lib/zend/Zend/Controller/Request/Apache404.php b/lib/zend/Zend/Controller/Request/Apache404.php new file mode 100644 index 0000000000..3e5caef1ce --- /dev/null +++ b/lib/zend/Zend/Controller/Request/Apache404.php @@ -0,0 +1,82 @@ +_requestUri = $requestUri; + return $this; + } +} diff --git a/lib/zend/Zend/Controller/Request/Exception.php b/lib/zend/Zend/Controller/Request/Exception.php new file mode 100644 index 0000000000..35b8f44cfa --- /dev/null +++ b/lib/zend/Zend/Controller/Request/Exception.php @@ -0,0 +1,37 @@ +valid()) { + $path = $uri->getPath(); + $query = $uri->getQuery(); + if (!empty($query)) { + $path .= '?' . $query; + } + + $this->setRequestUri($path); + } else { + require_once 'Zend/Controller/Request/Exception.php'; + throw new Zend_Controller_Request_Exception('Invalid URI provided to constructor'); + } + } else { + $this->setRequestUri(); + } + } + + /** + * Access values contained in the superglobals as public members + * Order of precedence: 1. GET, 2. POST, 3. COOKIE, 4. SERVER, 5. ENV + * + * @see http://msdn.microsoft.com/en-us/library/system.web.httprequest.item.aspx + * @param string $key + * @return mixed + */ + public function __get($key) + { + switch (true) { + case isset($this->_params[$key]): + return $this->_params[$key]; + case isset($_GET[$key]): + return $_GET[$key]; + case isset($_POST[$key]): + return $_POST[$key]; + case isset($_COOKIE[$key]): + return $_COOKIE[$key]; + case ($key == 'REQUEST_URI'): + return $this->getRequestUri(); + case ($key == 'PATH_INFO'): + return $this->getPathInfo(); + case isset($_SERVER[$key]): + return $_SERVER[$key]; + case isset($_ENV[$key]): + return $_ENV[$key]; + default: + return null; + } + } + + /** + * Alias to __get + * + * @param string $key + * @return mixed + */ + public function get($key) + { + return $this->__get($key); + } + + /** + * Set values + * + * In order to follow {@link __get()}, which operates on a number of + * superglobals, setting values through overloading is not allowed and will + * raise an exception. Use setParam() instead. + * + * @param string $key + * @param mixed $value + * @return void + * @throws Zend_Controller_Request_Exception + */ + public function __set($key, $value) + { + require_once 'Zend/Controller/Request/Exception.php'; + throw new Zend_Controller_Request_Exception('Setting values in superglobals not allowed; please use setParam()'); + } + + /** + * Alias to __set() + * + * @param string $key + * @param mixed $value + * @return void + */ + public function set($key, $value) + { + return $this->__set($key, $value); + } + + /** + * Check to see if a property is set + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + switch (true) { + case isset($this->_params[$key]): + return true; + case isset($_GET[$key]): + return true; + case isset($_POST[$key]): + return true; + case isset($_COOKIE[$key]): + return true; + case isset($_SERVER[$key]): + return true; + case isset($_ENV[$key]): + return true; + default: + return false; + } + } + + /** + * Alias to __isset() + * + * @param string $key + * @return boolean + */ + public function has($key) + { + return $this->__isset($key); + } + + /** + * Set GET values + * + * @param string|array $spec + * @param null|mixed $value + * @return Zend_Controller_Request_Http + */ + public function setQuery($spec, $value = null) + { + if ((null === $value) && !is_array($spec)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid value passed to setQuery(); must be either array of values or key/value pair'); + } + if ((null === $value) && is_array($spec)) { + foreach ($spec as $key => $value) { + $this->setQuery($key, $value); + } + return $this; + } + $_GET[(string) $spec] = $value; + return $this; + } + + /** + * Retrieve a member of the $_GET superglobal + * + * If no $key is passed, returns the entire $_GET array. + * + * @todo How to retrieve from nested arrays + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed Returns null if key does not exist + */ + public function getQuery($key = null, $default = null) + { + if (null === $key) { + return $_GET; + } + + return (isset($_GET[$key])) ? $_GET[$key] : $default; + } + + /** + * Set POST values + * + * @param string|array $spec + * @param null|mixed $value + * @return Zend_Controller_Request_Http + */ + public function setPost($spec, $value = null) + { + if ((null === $value) && !is_array($spec)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid value passed to setPost(); must be either array of values or key/value pair'); + } + if ((null === $value) && is_array($spec)) { + foreach ($spec as $key => $value) { + $this->setPost($key, $value); + } + return $this; + } + $_POST[(string) $spec] = $value; + return $this; + } + + /** + * Retrieve a member of the $_POST superglobal + * + * If no $key is passed, returns the entire $_POST array. + * + * @todo How to retrieve from nested arrays + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed Returns null if key does not exist + */ + public function getPost($key = null, $default = null) + { + if (null === $key) { + return $_POST; + } + + return (isset($_POST[$key])) ? $_POST[$key] : $default; + } + + /** + * Retrieve a member of the $_COOKIE superglobal + * + * If no $key is passed, returns the entire $_COOKIE array. + * + * @todo How to retrieve from nested arrays + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed Returns null if key does not exist + */ + public function getCookie($key = null, $default = null) + { + if (null === $key) { + return $_COOKIE; + } + + return (isset($_COOKIE[$key])) ? $_COOKIE[$key] : $default; + } + + /** + * Retrieve a member of the $_SERVER superglobal + * + * If no $key is passed, returns the entire $_SERVER array. + * + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed Returns null if key does not exist + */ + public function getServer($key = null, $default = null) + { + if (null === $key) { + return $_SERVER; + } + + return (isset($_SERVER[$key])) ? $_SERVER[$key] : $default; + } + + /** + * Retrieve a member of the $_ENV superglobal + * + * If no $key is passed, returns the entire $_ENV array. + * + * @param string $key + * @param mixed $default Default value to use if key not found + * @return mixed Returns null if key does not exist + */ + public function getEnv($key = null, $default = null) + { + if (null === $key) { + return $_ENV; + } + + return (isset($_ENV[$key])) ? $_ENV[$key] : $default; + } + + /** + * Set the REQUEST_URI on which the instance operates + * + * If no request URI is passed, uses the value in $_SERVER['REQUEST_URI'], + * $_SERVER['HTTP_X_REWRITE_URL'], or $_SERVER['ORIG_PATH_INFO'] + $_SERVER['QUERY_STRING']. + * + * @param string $requestUri + * @return Zend_Controller_Request_Http + */ + public function setRequestUri($requestUri = null) + { + if ($requestUri === null) { + if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch + $requestUri = $_SERVER['HTTP_X_REWRITE_URL']; + } elseif ( + // IIS7 with URL Rewrite: make sure we get the unencoded url (double slash problem) + isset($_SERVER['IIS_WasUrlRewritten']) + && $_SERVER['IIS_WasUrlRewritten'] == '1' + && isset($_SERVER['UNENCODED_URL']) + && $_SERVER['UNENCODED_URL'] != '' + ) { + $requestUri = $_SERVER['UNENCODED_URL']; + } elseif (isset($_SERVER['REQUEST_URI'])) { + $requestUri = $_SERVER['REQUEST_URI']; + // Http proxy reqs setup request uri with scheme and host [and port] + the url path, only use url path + $schemeAndHttpHost = $this->getScheme() . '://' . $this->getHttpHost(); + if (strpos($requestUri, $schemeAndHttpHost) === 0) { + $requestUri = substr($requestUri, strlen($schemeAndHttpHost)); + } + } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI + $requestUri = $_SERVER['ORIG_PATH_INFO']; + if (!empty($_SERVER['QUERY_STRING'])) { + $requestUri .= '?' . $_SERVER['QUERY_STRING']; + } + } else { + return $this; + } + } elseif (!is_string($requestUri)) { + return $this; + } else { + // Set GET items, if available + if (false !== ($pos = strpos($requestUri, '?'))) { + // Get key => value pairs and set $_GET + $query = substr($requestUri, $pos + 1); + parse_str($query, $vars); + $this->setQuery($vars); + } + } + + $this->_requestUri = $requestUri; + return $this; + } + + /** + * Returns the REQUEST_URI taking into account + * platform differences between Apache and IIS + * + * @return string + */ + public function getRequestUri() + { + if (empty($this->_requestUri)) { + $this->setRequestUri(); + } + + return $this->_requestUri; + } + + /** + * Set the base URL of the request; i.e., the segment leading to the script name + * + * E.g.: + * - /admin + * - /myapp + * - /subdir/index.php + * + * Do not use the full URI when providing the base. The following are + * examples of what not to use: + * - http://example.com/admin (should be just /admin) + * - http://example.com/subdir/index.php (should be just /subdir/index.php) + * + * If no $baseUrl is provided, attempts to determine the base URL from the + * environment, using SCRIPT_FILENAME, SCRIPT_NAME, PHP_SELF, and + * ORIG_SCRIPT_NAME in its determination. + * + * @param mixed $baseUrl + * @return Zend_Controller_Request_Http + */ + public function setBaseUrl($baseUrl = null) + { + if ((null !== $baseUrl) && !is_string($baseUrl)) { + return $this; + } + + if ($baseUrl === null) { + $filename = (isset($_SERVER['SCRIPT_FILENAME'])) ? basename($_SERVER['SCRIPT_FILENAME']) : ''; + + if (isset($_SERVER['SCRIPT_NAME']) && basename($_SERVER['SCRIPT_NAME']) === $filename) { + $baseUrl = $_SERVER['SCRIPT_NAME']; + } elseif (isset($_SERVER['PHP_SELF']) && basename($_SERVER['PHP_SELF']) === $filename) { + $baseUrl = $_SERVER['PHP_SELF']; + } elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $filename) { + $baseUrl = $_SERVER['ORIG_SCRIPT_NAME']; // 1and1 shared hosting compatibility + } else { + // Backtrack up the script_filename to find the portion matching + // php_self + $path = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : ''; + $file = isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : ''; + $segs = explode('/', trim($file, '/')); + $segs = array_reverse($segs); + $index = 0; + $last = count($segs); + $baseUrl = ''; + do { + $seg = $segs[$index]; + $baseUrl = '/' . $seg . $baseUrl; + ++$index; + } while (($last > $index) && (false !== ($pos = strpos($path, $baseUrl))) && (0 != $pos)); + } + + // Does the baseUrl have anything in common with the request_uri? + $requestUri = $this->getRequestUri(); + + if (0 === strpos($requestUri, $baseUrl)) { + // full $baseUrl matches + $this->_baseUrl = $baseUrl; + return $this; + } + + if (0 === strpos($requestUri, dirname($baseUrl))) { + // directory portion of $baseUrl matches + $this->_baseUrl = rtrim(dirname($baseUrl), '/'); + return $this; + } + + $basename = basename($baseUrl); + if (empty($basename) || !strpos($requestUri, $basename)) { + // no match whatsoever; set it blank + $this->_baseUrl = ''; + return $this; + } + + // If using mod_rewrite or ISAPI_Rewrite strip the script filename + // out of baseUrl. $pos !== 0 makes sure it is not matching a value + // from PATH_INFO or QUERY_STRING + if ((strlen($requestUri) >= strlen($baseUrl)) + && ((false !== ($pos = strpos($requestUri, $baseUrl))) && ($pos !== 0))) + { + $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl)); + } + } + + $this->_baseUrl = rtrim($baseUrl, '/'); + return $this; + } + + /** + * Everything in REQUEST_URI before PATH_INFO + *
+ * + * @return string + */ + public function getBaseUrl() + { + if (null === $this->_baseUrl) { + $this->setBaseUrl(); + } + + return $this->_baseUrl; + } + + /** + * Set the base path for the URL + * + * @param string|null $basePath + * @return Zend_Controller_Request_Http + */ + public function setBasePath($basePath = null) + { + if ($basePath === null) { + $filename = (isset($_SERVER['SCRIPT_FILENAME'])) + ? basename($_SERVER['SCRIPT_FILENAME']) + : ''; + + $baseUrl = $this->getBaseUrl(); + if (empty($baseUrl)) { + $this->_basePath = ''; + return $this; + } + + if (basename($baseUrl) === $filename) { + $basePath = dirname($baseUrl); + } else { + $basePath = $baseUrl; + } + } + + if (substr(PHP_OS, 0, 3) === 'WIN') { + $basePath = str_replace('\\', '/', $basePath); + } + + $this->_basePath = rtrim($basePath, '/'); + return $this; + } + + /** + * Everything in REQUEST_URI before PATH_INFO not including the filename + * + * + * @return string + */ + public function getBasePath() + { + if (null === $this->_basePath) { + $this->setBasePath(); + } + + return $this->_basePath; + } + + /** + * Set the PATH_INFO string + * + * @param string|null $pathInfo + * @return Zend_Controller_Request_Http + */ + public function setPathInfo($pathInfo = null) + { + if ($pathInfo === null) { + $baseUrl = $this->getBaseUrl(); + + if (null === ($requestUri = $this->getRequestUri())) { + return $this; + } + + // Remove the query string from REQUEST_URI + if ($pos = strpos($requestUri, '?')) { + $requestUri = substr($requestUri, 0, $pos); + } + + if ((null !== $baseUrl) + && (false === ($pathInfo = substr($requestUri, strlen($baseUrl))))) + { + // If substr() returns false then PATH_INFO is set to an empty string + $pathInfo = ''; + } elseif (null === $baseUrl) { + $pathInfo = $requestUri; + } + } + + $this->_pathInfo = (string) $pathInfo; + return $this; + } + + /** + * Returns everything between the BaseUrl and QueryString. + * This value is calculated instead of reading PATH_INFO + * directly from $_SERVER due to cross-platform differences. + * + * @return string + */ + public function getPathInfo() + { + if (empty($this->_pathInfo)) { + $this->setPathInfo(); + } + + return $this->_pathInfo; + } + + /** + * Set allowed parameter sources + * + * Can be empty array, or contain one or more of '_GET' or '_POST'. + * + * @param array $paramSoures + * @return Zend_Controller_Request_Http + */ + public function setParamSources(array $paramSources = array()) + { + $this->_paramSources = $paramSources; + return $this; + } + + /** + * Get list of allowed parameter sources + * + * @return array + */ + public function getParamSources() + { + return $this->_paramSources; + } + + /** + * Set a userland parameter + * + * Uses $key to set a userland parameter. If $key is an alias, the actual + * key will be retrieved and used to set the parameter. + * + * @param mixed $key + * @param mixed $value + * @return Zend_Controller_Request_Http + */ + public function setParam($key, $value) + { + $key = (null !== ($alias = $this->getAlias($key))) ? $alias : $key; + parent::setParam($key, $value); + return $this; + } + + /** + * Retrieve a parameter + * + * Retrieves a parameter from the instance. Priority is in the order of + * userland parameters (see {@link setParam()}), $_GET, $_POST. If a + * parameter matching the $key is not found, null is returned. + * + * If the $key is an alias, the actual key aliased will be used. + * + * @param mixed $key + * @param mixed $default Default value to use if key not found + * @return mixed + */ + public function getParam($key, $default = null) + { + $keyName = (null !== ($alias = $this->getAlias($key))) ? $alias : $key; + + $paramSources = $this->getParamSources(); + if (isset($this->_params[$keyName])) { + return $this->_params[$keyName]; + } elseif (in_array('_GET', $paramSources) && (isset($_GET[$keyName]))) { + return $_GET[$keyName]; + } elseif (in_array('_POST', $paramSources) && (isset($_POST[$keyName]))) { + return $_POST[$keyName]; + } + + return $default; + } + + /** + * Retrieve an array of parameters + * + * Retrieves a merged array of parameters, with precedence of userland + * params (see {@link setParam()}), $_GET, $POST (i.e., values in the + * userland params will take precedence over all others). + * + * @return array + */ + public function getParams() + { + $return = $this->_params; + $paramSources = $this->getParamSources(); + if (in_array('_GET', $paramSources) + && isset($_GET) + && is_array($_GET) + ) { + $return += $_GET; + } + if (in_array('_POST', $paramSources) + && isset($_POST) + && is_array($_POST) + ) { + $return += $_POST; + } + return $return; + } + + /** + * Set parameters + * + * Set one or more parameters. Parameters are set as userland parameters, + * using the keys specified in the array. + * + * @param array $params + * @return Zend_Controller_Request_Http + */ + public function setParams(array $params) + { + foreach ($params as $key => $value) { + $this->setParam($key, $value); + } + return $this; + } + + /** + * Set a key alias + * + * Set an alias used for key lookups. $name specifies the alias, $target + * specifies the actual key to use. + * + * @param string $name + * @param string $target + * @return Zend_Controller_Request_Http + */ + public function setAlias($name, $target) + { + $this->_aliases[$name] = $target; + return $this; + } + + /** + * Retrieve an alias + * + * Retrieve the actual key represented by the alias $name. + * + * @param string $name + * @return string|null Returns null when no alias exists + */ + public function getAlias($name) + { + if (isset($this->_aliases[$name])) { + return $this->_aliases[$name]; + } + + return null; + } + + /** + * Retrieve the list of all aliases + * + * @return array + */ + public function getAliases() + { + return $this->_aliases; + } + + /** + * Return the method by which the request was made + * + * @return string + */ + public function getMethod() + { + return $this->getServer('REQUEST_METHOD'); + } + + /** + * Was the request made by POST? + * + * @return boolean + */ + public function isPost() + { + if ('POST' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Was the request made by GET? + * + * @return boolean + */ + public function isGet() + { + if ('GET' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Was the request made by PUT? + * + * @return boolean + */ + public function isPut() + { + if ('PUT' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Was the request made by DELETE? + * + * @return boolean + */ + public function isDelete() + { + if ('DELETE' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Was the request made by HEAD? + * + * @return boolean + */ + public function isHead() + { + if ('HEAD' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Was the request made by OPTIONS? + * + * @return boolean + */ + public function isOptions() + { + if ('OPTIONS' == $this->getMethod()) { + return true; + } + + return false; + } + + /** + * Is the request a Javascript XMLHttpRequest? + * + * Should work with Prototype/Script.aculo.us, possibly others. + * + * @return boolean + */ + public function isXmlHttpRequest() + { + return ($this->getHeader('X_REQUESTED_WITH') == 'XMLHttpRequest'); + } + + /** + * Is this a Flash request? + * + * @return bool + */ + public function isFlashRequest() + { + $header = strtolower($this->getHeader('USER_AGENT')); + return (strstr($header, ' flash')) ? true : false; + } + + /** + * Is https secure request + * + * @return boolean + */ + public function isSecure() + { + return ($this->getScheme() === self::SCHEME_HTTPS); + } + + /** + * Return the raw body of the request, if present + * + * @return string|false Raw body, or false if not present + */ + public function getRawBody() + { + if (null === $this->_rawBody) { + $body = file_get_contents('php://input'); + + if (strlen(trim($body)) > 0) { + $this->_rawBody = $body; + } else { + $this->_rawBody = false; + } + } + return $this->_rawBody; + } + + /** + * Return the value of the given HTTP header. Pass the header name as the + * plain, HTTP-specified header name. Ex.: Ask for 'Accept' to get the + * Accept header, 'Accept-Encoding' to get the Accept-Encoding header. + * + * @param string $header HTTP header name + * @return string|false HTTP header value, or false if not found + * @throws Zend_Controller_Request_Exception + */ + public function getHeader($header) + { + if (empty($header)) { + require_once 'Zend/Controller/Request/Exception.php'; + throw new Zend_Controller_Request_Exception('An HTTP header name is required'); + } + + // Try to get it from the $_SERVER array first + $temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header)); + if (!empty($_SERVER[$temp])) { + return $_SERVER[$temp]; + } + + // This seems to be the only way to get the Authorization header on + // Apache + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + if (!empty($headers[$header])) { + return $headers[$header]; + } + } + + return false; + } + + /** + * Get the request URI scheme + * + * @return string + */ + public function getScheme() + { + return ($this->getServer('HTTPS') == 'on') ? self::SCHEME_HTTPS : self::SCHEME_HTTP; + } + + /** + * Get the HTTP host. + * + * "Host" ":" host [ ":" port ] ; Section 3.2.2 + * Note the HTTP Host header is not the same as the URI host. + * It includes the port while the URI host doesn't. + * + * @return string + */ + public function getHttpHost() + { + $host = $this->getServer('HTTP_HOST'); + if (!empty($host)) { + return $host; + } + + $scheme = $this->getScheme(); + $name = $this->getServer('SERVER_NAME'); + $port = $this->getServer('SERVER_PORT'); + + if (($scheme == self::SCHEME_HTTP && $port == 80) || ($scheme == self::SCHEME_HTTPS && $port == 443)) { + return $name; + } else { + return $name . ':' . $port; + } + } + + /** + * Get the client's IP addres + * + * @return string + */ + public function getClientIp($checkProxy = true) + { + if ($checkProxy && $this->getServer('HTTP_CLIENT_IP') != null) { + $ip = $this->getServer('HTTP_CLIENT_IP'); + } else if ($checkProxy && $this->getServer('HTTP_X_FORWARDED_FOR') != null) { + $ip = $this->getServer('HTTP_X_FORWARDED_FOR'); + } else { + $ip = $this->getServer('REMOTE_ADDR'); + } + + return $ip; + } +} diff --git a/lib/zend/Zend/Controller/Request/HttpTestCase.php b/lib/zend/Zend/Controller/Request/HttpTestCase.php new file mode 100644 index 0000000000..9ecf577adc --- /dev/null +++ b/lib/zend/Zend/Controller/Request/HttpTestCase.php @@ -0,0 +1,276 @@ +_rawBody = (string) $content; + return $this; + } + + /** + * Get RAW POST body + * + * @return string|null + */ + public function getRawBody() + { + return $this->_rawBody; + } + + /** + * Clear raw POST body + * + * @return Zend_Controller_Request_HttpTestCase + */ + public function clearRawBody() + { + $this->_rawBody = null; + return $this; + } + + /** + * Set a cookie + * + * @param string $key + * @param mixed $value + * @return Zend_Controller_Request_HttpTestCase + */ + public function setCookie($key, $value) + { + $_COOKIE[(string) $key] = $value; + return $this; + } + + /** + * Set multiple cookies at once + * + * @param array $cookies + * @return void + */ + public function setCookies(array $cookies) + { + foreach ($cookies as $key => $value) { + $_COOKIE[$key] = $value; + } + return $this; + } + + /** + * Clear all cookies + * + * @return Zend_Controller_Request_HttpTestCase + */ + public function clearCookies() + { + $_COOKIE = array(); + return $this; + } + + /** + * Set request method + * + * @param string $type + * @return Zend_Controller_Request_HttpTestCase + */ + public function setMethod($type) + { + $type = strtoupper(trim((string) $type)); + if (!in_array($type, $this->_validMethodTypes)) { + require_once 'Zend/Controller/Exception.php'; + throw new Zend_Controller_Exception('Invalid request method specified'); + } + $this->_method = $type; + return $this; + } + + /** + * Get request method + * + * @return string|null + */ + public function getMethod() + { + return $this->_method; + } + + /** + * Set a request header + * + * @param string $key + * @param string $value + * @return Zend_Controller_Request_HttpTestCase + */ + public function setHeader($key, $value) + { + $key = $this->_normalizeHeaderName($key); + $this->_headers[$key] = (string) $value; + return $this; + } + + /** + * Set request headers + * + * @param array $headers + * @return Zend_Controller_Request_HttpTestCase + */ + public function setHeaders(array $headers) + { + foreach ($headers as $key => $value) { + $this->setHeader($key, $value); + } + return $this; + } + + /** + * Get request header + * + * @param string $header + * @param mixed $default + * @return string|null + */ + public function getHeader($header, $default = null) + { + $header = $this->_normalizeHeaderName($header); + if (array_key_exists($header, $this->_headers)) { + return $this->_headers[$header]; + } + return $default; + } + + /** + * Get all request headers + * + * @return array + */ + public function getHeaders() + { + return $this->_headers; + } + + /** + * Clear request headers + * + * @return Zend_Controller_Request_HttpTestCase + */ + public function clearHeaders() + { + $this->_headers = array(); + return $this; + } + + /** + * Get REQUEST_URI + * + * @return null|string + */ + public function getRequestUri() + { + return $this->_requestUri; + } + + /** + * Normalize a header name for setting and retrieval + * + * @param string $name + * @return string + */ + protected function _normalizeHeaderName($name) + { + $name = strtoupper((string) $name); + $name = str_replace('-', '_', $name); + return $name; + } +} diff --git a/lib/zend/Zend/Controller/Request/Simple.php b/lib/zend/Zend/Controller/Request/Simple.php new file mode 100644 index 0000000000..61ca68caea --- /dev/null +++ b/lib/zend/Zend/Controller/Request/Simple.php @@ -0,0 +1,55 @@ +setActionName($action); + } + + if ($controller) { + $this->setControllerName($controller); + } + + if ($module) { + $this->setModuleName($module); + } + + if ($params) { + $this->setParams($params); + } + } + +} diff --git a/lib/zend/Zend/Controller/Response/Abstract.php b/lib/zend/Zend/Controller/Response/Abstract.php new file mode 100644 index 0000000000..3763621694 --- /dev/null +++ b/lib/zend/Zend/Controller/Response/Abstract.php @@ -0,0 +1,755 @@ +canSendHeaders(true); + $name = $this->_normalizeHeader($name); + $value = (string) $value; + + if ($replace) { + foreach ($this->_headers as $key => $header) { + if ($name == $header['name']) { + unset($this->_headers[$key]); + } + } + } + + $this->_headers[] = array( + 'name' => $name, + 'value' => $value, + 'replace' => $replace + ); + + return $this; + } + + /** + * Set redirect URL + * + * Sets Location header and response code. Forces replacement of any prior + * redirects. + * + * @param string $url + * @param int $code + * @return Zend_Controller_Response_Abstract + */ + public function setRedirect($url, $code = 302) + { + $this->canSendHeaders(true); + $this->setHeader('Location', $url, true) + ->setHttpResponseCode($code); + + return $this; + } + + /** + * Is this a redirect? + * + * @return boolean + */ + public function isRedirect() + { + return $this->_isRedirect; + } + + /** + * Return array of headers; see {@link $_headers} for format + * + * @return array + */ + public function getHeaders() + { + return $this->_headers; + } + + /** + * Clear headers + * + * @return Zend_Controller_Response_Abstract + */ + public function clearHeaders() + { + $this->_headers = array(); + + return $this; + } + + /** + * Set raw HTTP header + * + * Allows setting non key => value headers, such as status codes + * + * @param string $value + * @return Zend_Controller_Response_Abstract + */ + public function setRawHeader($value) + { + $this->canSendHeaders(true); + if ('Location' == substr($value, 0, 8)) { + $this->_isRedirect = true; + } + $this->_headersRaw[] = (string) $value; + return $this; + } + + /** + * Retrieve all {@link setRawHeader() raw HTTP headers} + * + * @return array + */ + public function getRawHeaders() + { + return $this->_headersRaw; + } + + /** + * Clear all {@link setRawHeader() raw HTTP headers} + * + * @return Zend_Controller_Response_Abstract + */ + public function clearRawHeaders() + { + $this->_headersRaw = array(); + return $this; + } + + /** + * Clear all headers, normal and raw + * + * @return Zend_Controller_Response_Abstract + */ + public function clearAllHeaders() + { + return $this->clearHeaders() + ->clearRawHeaders(); + } + + /** + * Set HTTP response code to use with headers + * + * @param int $code + * @return Zend_Controller_Response_Abstract + */ + public function setHttpResponseCode($code) + { + if (!is_int($code) || (100 > $code) || (599 < $code)) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Invalid HTTP response code'); + } + + if ((300 <= $code) && (307 >= $code)) { + $this->_isRedirect = true; + } else { + $this->_isRedirect = false; + } + + $this->_httpResponseCode = $code; + return $this; + } + + /** + * Retrieve HTTP response code + * + * @return int + */ + public function getHttpResponseCode() + { + return $this->_httpResponseCode; + } + + /** + * Can we send headers? + * + * @param boolean $throw Whether or not to throw an exception if headers have been sent; defaults to false + * @return boolean + * @throws Zend_Controller_Response_Exception + */ + public function canSendHeaders($throw = false) + { + $ok = headers_sent($file, $line); + if ($ok && $throw && $this->headersSentThrowsException) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line); + } + + return !$ok; + } + + /** + * Send all headers + * + * Sends any headers specified. If an {@link setHttpResponseCode() HTTP response code} + * has been specified, it is sent with the first header. + * + * @return Zend_Controller_Response_Abstract + */ + public function sendHeaders() + { + // Only check if we can send headers if we have headers to send + if (count($this->_headersRaw) || count($this->_headers) || (200 != $this->_httpResponseCode)) { + $this->canSendHeaders(true); + } elseif (200 == $this->_httpResponseCode) { + // Haven't changed the response code, and we have no headers + return $this; + } + + $httpCodeSent = false; + + foreach ($this->_headersRaw as $header) { + if (!$httpCodeSent && $this->_httpResponseCode) { + header($header, true, $this->_httpResponseCode); + $httpCodeSent = true; + } else { + header($header); + } + } + + foreach ($this->_headers as $header) { + if (!$httpCodeSent && $this->_httpResponseCode) { + header($header['name'] . ': ' . $header['value'], $header['replace'], $this->_httpResponseCode); + $httpCodeSent = true; + } else { + header($header['name'] . ': ' . $header['value'], $header['replace']); + } + } + + if (!$httpCodeSent) { + header('HTTP/1.1 ' . $this->_httpResponseCode); + $httpCodeSent = true; + } + + return $this; + } + + /** + * Set body content + * + * If $name is not passed, or is not a string, resets the entire body and + * sets the 'default' key to $content. + * + * If $name is a string, sets the named segment in the body array to + * $content. + * + * @param string $content + * @param null|string $name + * @return Zend_Controller_Response_Abstract + */ + public function setBody($content, $name = null) + { + if ((null === $name) || !is_string($name)) { + $this->_body = array('default' => (string) $content); + } else { + $this->_body[$name] = (string) $content; + } + + return $this; + } + + /** + * Append content to the body content + * + * @param string $content + * @param null|string $name + * @return Zend_Controller_Response_Abstract + */ + public function appendBody($content, $name = null) + { + if ((null === $name) || !is_string($name)) { + if (isset($this->_body['default'])) { + $this->_body['default'] .= (string) $content; + } else { + return $this->append('default', $content); + } + } elseif (isset($this->_body[$name])) { + $this->_body[$name] .= (string) $content; + } else { + return $this->append($name, $content); + } + + return $this; + } + + /** + * Clear body array + * + * With no arguments, clears the entire body array. Given a $name, clears + * just that named segment; if no segment matching $name exists, returns + * false to indicate an error. + * + * @param string $name Named segment to clear + * @return boolean + */ + public function clearBody($name = null) + { + if (null !== $name) { + $name = (string) $name; + if (isset($this->_body[$name])) { + unset($this->_body[$name]); + return true; + } + + return false; + } + + $this->_body = array(); + return true; + } + + /** + * Return the body content + * + * If $spec is false, returns the concatenated values of the body content + * array. If $spec is boolean true, returns the body content array. If + * $spec is a string and matches a named segment, returns the contents of + * that segment; otherwise, returns null. + * + * @param boolean $spec + * @return string|array|null + */ + public function getBody($spec = false) + { + if (false === $spec) { + ob_start(); + $this->outputBody(); + return ob_get_clean(); + } elseif (true === $spec) { + return $this->_body; + } elseif (is_string($spec) && isset($this->_body[$spec])) { + return $this->_body[$spec]; + } + + return null; + } + + /** + * Append a named body segment to the body content array + * + * If segment already exists, replaces with $content and places at end of + * array. + * + * @param string $name + * @param string $content + * @return Zend_Controller_Response_Abstract + */ + public function append($name, $content) + { + if (!is_string($name)) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Invalid body segment key ("' . gettype($name) . '")'); + } + + if (isset($this->_body[$name])) { + unset($this->_body[$name]); + } + $this->_body[$name] = (string) $content; + return $this; + } + + /** + * Prepend a named body segment to the body content array + * + * If segment already exists, replaces with $content and places at top of + * array. + * + * @param string $name + * @param string $content + * @return void + */ + public function prepend($name, $content) + { + if (!is_string($name)) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Invalid body segment key ("' . gettype($name) . '")'); + } + + if (isset($this->_body[$name])) { + unset($this->_body[$name]); + } + + $new = array($name => (string) $content); + $this->_body = $new + $this->_body; + + return $this; + } + + /** + * Insert a named segment into the body content array + * + * @param string $name + * @param string $content + * @param string $parent + * @param boolean $before Whether to insert the new segment before or + * after the parent. Defaults to false (after) + * @return Zend_Controller_Response_Abstract + */ + public function insert($name, $content, $parent = null, $before = false) + { + if (!is_string($name)) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Invalid body segment key ("' . gettype($name) . '")'); + } + + if ((null !== $parent) && !is_string($parent)) { + require_once 'Zend/Controller/Response/Exception.php'; + throw new Zend_Controller_Response_Exception('Invalid body segment parent key ("' . gettype($parent) . '")'); + } + + if (isset($this->_body[$name])) { + unset($this->_body[$name]); + } + + if ((null === $parent) || !isset($this->_body[$parent])) { + return $this->append($name, $content); + } + + $ins = array($name => (string) $content); + $keys = array_keys($this->_body); + $loc = array_search($parent, $keys); + if (!$before) { + // Increment location if not inserting before + ++$loc; + } + + if (0 === $loc) { + // If location of key is 0, we're prepending + $this->_body = $ins + $this->_body; + } elseif ($loc >= (count($this->_body))) { + // If location of key is maximal, we're appending + $this->_body = $this->_body + $ins; + } else { + // Otherwise, insert at location specified + $pre = array_slice($this->_body, 0, $loc); + $post = array_slice($this->_body, $loc); + $this->_body = $pre + $ins + $post; + } + + return $this; + } + + /** + * Echo the body segments + * + * @return void + */ + public function outputBody() + { + $body = implode('', $this->_body); + echo $body; + } + + /** + * Register an exception with the response + * + * @param Exception $e + * @return Zend_Controller_Response_Abstract + */ + public function setException(Exception $e) + { + $this->_exceptions[] = $e; + return $this; + } + + /** + * Retrieve the exception stack + * + * @return array + */ + public function getException() + { + return $this->_exceptions; + } + + /** + * Has an exception been registered with the response? + * + * @return boolean + */ + public function isException() + { + return !empty($this->_exceptions); + } + + /** + * Does the response object contain an exception of a given type? + * + * @param string $type + * @return boolean + */ + public function hasExceptionOfType($type) + { + foreach ($this->_exceptions as $e) { + if ($e instanceof $type) { + return true; + } + } + + return false; + } + + /** + * Does the response object contain an exception with a given message? + * + * @param string $message + * @return boolean + */ + public function hasExceptionOfMessage($message) + { + foreach ($this->_exceptions as $e) { + if ($message == $e->getMessage()) { + return true; + } + } + + return false; + } + + /** + * Does the response object contain an exception with a given code? + * + * @param int $code + * @return boolean + */ + public function hasExceptionOfCode($code) + { + $code = (int) $code; + foreach ($this->_exceptions as $e) { + if ($code == $e->getCode()) { + return true; + } + } + + return false; + } + + /** + * Retrieve all exceptions of a given type + * + * @param string $type + * @return false|array + */ + public function getExceptionByType($type) + { + $exceptions = array(); + foreach ($this->_exceptions as $e) { + if ($e instanceof $type) { + $exceptions[] = $e; + } + } + + if (empty($exceptions)) { + $exceptions = false; + } + + return $exceptions; + } + + /** + * Retrieve all exceptions of a given message + * + * @param string $message + * @return false|array + */ + public function getExceptionByMessage($message) + { + $exceptions = array(); + foreach ($this->_exceptions as $e) { + if ($message == $e->getMessage()) { + $exceptions[] = $e; + } + } + + if (empty($exceptions)) { + $exceptions = false; + } + + return $exceptions; + } + + /** + * Retrieve all exceptions of a given code + * + * @param mixed $code + * @return void + */ + public function getExceptionByCode($code) + { + $code = (int) $code; + $exceptions = array(); + foreach ($this->_exceptions as $e) { + if ($code == $e->getCode()) { + $exceptions[] = $e; + } + } + + if (empty($exceptions)) { + $exceptions = false; + } + + return $exceptions; + } + + /** + * Whether or not to render exceptions (off by default) + * + * If called with no arguments or a null argument, returns the value of the + * flag; otherwise, sets it and returns the current value. + * + * @param boolean $flag Optional + * @return boolean + */ + public function renderExceptions($flag = null) + { + if (null !== $flag) { + $this->_renderExceptions = $flag ? true : false; + } + + return $this->_renderExceptions; + } + + /** + * Send the response, including all headers, rendering exceptions if so + * requested. + * + * @return void + */ + public function sendResponse() + { + $this->sendHeaders(); + + if ($this->isException() && $this->renderExceptions()) { + $exceptions = ''; + foreach ($this->getException() as $e) { + $exceptions .= $e->__toString() . "\n"; + } + echo $exceptions; + return; + } + + $this->outputBody(); + } + + /** + * Magic __toString functionality + * + * Proxies to {@link sendResponse()} and returns response value as string + * using output buffering. + * + * @return string + */ + public function __toString() + { + ob_start(); + $this->sendResponse(); + return ob_get_clean(); + } +} diff --git a/lib/zend/Zend/Controller/Response/Cli.php b/lib/zend/Zend/Controller/Response/Cli.php new file mode 100644 index 0000000000..d48b6d5140 --- /dev/null +++ b/lib/zend/Zend/Controller/Response/Cli.php @@ -0,0 +1,68 @@ +isException() && $this->renderExceptions()) { + $exceptions = ''; + foreach ($this->getException() as $e) { + $exceptions .= $e->__toString() . "\n"; + } + return $exceptions; + } + + return $this->_body; + } +} diff --git a/lib/zend/Zend/Controller/Response/Exception.php b/lib/zend/Zend/Controller/Response/Exception.php new file mode 100644 index 0000000000..366051f69b --- /dev/null +++ b/lib/zend/Zend/Controller/Response/Exception.php @@ -0,0 +1,36 @@ +_headersRaw as $header) { + $headers[] = $header; + } + foreach ($this->_headers as $header) { + $name = $header['name']; + $key = strtolower($name); + if (array_key_exists($name, $headers)) { + if ($header['replace']) { + $headers[$key] = $header['name'] . ': ' . $header['value']; + } + } else { + $headers[$key] = $header['name'] . ': ' . $header['value']; + } + } + return $headers; + } + + /** + * Can we send headers? + * + * @param bool $throw + * @return void + */ + public function canSendHeaders($throw = false) + { + return true; + } + + /** + * Return the concatenated body segments + * + * @return string + */ + public function outputBody() + { + $fullContent = ''; + foreach ($this->_body as $content) { + $fullContent .= $content; + } + return $fullContent; + } + + /** + * Get body and/or body segments + * + * @param bool|string $spec + * @return string|array|null + */ + public function getBody($spec = false) + { + if (false === $spec) { + return $this->outputBody(); + } elseif (true === $spec) { + return $this->_body; + } elseif (is_string($spec) && isset($this->_body[$spec])) { + return $this->_body[$spec]; + } + + return null; + } + + /** + * "send" Response + * + * Concats all response headers, and then final body (separated by two + * newlines) + * + * @return string + */ + public function sendResponse() + { + $headers = $this->sendHeaders(); + $content = implode("\n", $headers) . "\n\n"; + + if ($this->isException() && $this->renderExceptions()) { + $exceptions = ''; + foreach ($this->getException() as $e) { + $exceptions .= $e->__toString() . "\n"; + } + $content .= $exceptions; + } else { + $content .= $this->outputBody(); + } + + return $content; + } +} diff --git a/lib/zend/Zend/Controller/Router/Abstract.php b/lib/zend/Zend/Controller/Router/Abstract.php new file mode 100644 index 0000000000..b9de53d30b --- /dev/null +++ b/lib/zend/Zend/Controller/Router/Abstract.php @@ -0,0 +1,170 @@ +setParams($params); + } + + /** + * Add or modify a parameter to use when instantiating an action controller + * + * @param string $name + * @param mixed $value + * @return Zend_Controller_Router + */ + public function setParam($name, $value) + { + $name = (string) $name; + $this->_invokeParams[$name] = $value; + return $this; + } + + /** + * Set parameters to pass to action controller constructors + * + * @param array $params + * @return Zend_Controller_Router + */ + public function setParams(array $params) + { + $this->_invokeParams = array_merge($this->_invokeParams, $params); + return $this; + } + + /** + * Retrieve a single parameter from the controller parameter stack + * + * @param string $name + * @return mixed + */ + public function getParam($name) + { + if(isset($this->_invokeParams[$name])) { + return $this->_invokeParams[$name]; + } + + return null; + } + + /** + * Retrieve action controller instantiation parameters + * + * @return array + */ + public function getParams() + { + return $this->_invokeParams; + } + + /** + * Clear the controller parameter stack + * + * By default, clears all parameters. If a parameter name is given, clears + * only that parameter; if an array of parameter names is provided, clears + * each. + * + * @param null|string|array single key or array of keys for params to clear + * @return Zend_Controller_Router + */ + public function clearParams($name = null) + { + if (null === $name) { + $this->_invokeParams = array(); + } elseif (is_string($name) && isset($this->_invokeParams[$name])) { + unset($this->_invokeParams[$name]); + } elseif (is_array($name)) { + foreach ($name as $key) { + if (is_string($key) && isset($this->_invokeParams[$key])) { + unset($this->_invokeParams[$key]); + } + } + } + + return $this; + } + + /** + * Retrieve Front Controller + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + // Used cache version if found + if (null !== $this->_frontController) { + return $this->_frontController; + } + + require_once 'Zend/Controller/Front.php'; + $this->_frontController = Zend_Controller_Front::getInstance(); + return $this->_frontController; + } + + /** + * Set Front Controller + * + * @param Zend_Controller_Front $controller + * @return Zend_Controller_Router_Interface + */ + public function setFrontController(Zend_Controller_Front $controller) + { + $this->_frontController = $controller; + return $this; + } + +} diff --git a/lib/zend/Zend/Controller/Router/Exception.php b/lib/zend/Zend/Controller/Router/Exception.php new file mode 100644 index 0000000000..04b0df86e6 --- /dev/null +++ b/lib/zend/Zend/Controller/Router/Exception.php @@ -0,0 +1,36 @@ +hasRoute('default')) { + $dispatcher = $this->getFrontController()->getDispatcher(); + $request = $this->getFrontController()->getRequest(); + + require_once 'Zend/Controller/Router/Route/Module.php'; + $compat = new Zend_Controller_Router_Route_Module(array(), $dispatcher, $request); + + $this->_routes = array_merge(array('default' => $compat), $this->_routes); + } + + return $this; + } + + /** + * Add route to the route chain + * + * If route contains method setRequest(), it is initialized with a request object + * + * @param string $name Name of the route + * @param Zend_Controller_Router_Route_Interface $route Instance of the route + * @return Zend_Controller_Router_Rewrite + */ + public function addRoute($name, Zend_Controller_Router_Route_Interface $route) + { + if (method_exists($route, 'setRequest')) { + $route->setRequest($this->getFrontController()->getRequest()); + } + + $this->_routes[$name] = $route; + + return $this; + } + + /** + * Add routes to the route chain + * + * @param array $routes Array of routes with names as keys and routes as values + * @return Zend_Controller_Router_Rewrite + */ + public function addRoutes($routes) { + foreach ($routes as $name => $route) { + $this->addRoute($name, $route); + } + + return $this; + } + + /** + * Create routes out of Zend_Config configuration + * + * Example INI: + * routes.archive.route = "archive/:year/*" + * routes.archive.defaults.controller = archive + * routes.archive.defaults.action = show + * routes.archive.defaults.year = 2000 + * routes.archive.reqs.year = "\d+" + * + * routes.news.type = "Zend_Controller_Router_Route_Static" + * routes.news.route = "news" + * routes.news.defaults.controller = "news" + * routes.news.defaults.action = "list" + * + * And finally after you have created a Zend_Config with above ini: + * $router = new Zend_Controller_Router_Rewrite(); + * $router->addConfig($config, 'routes'); + * + * @param Zend_Config $config Configuration object + * @param string $section Name of the config section containing route's definitions + * @throws Zend_Controller_Router_Exception + * @return Zend_Controller_Router_Rewrite + */ + public function addConfig(Zend_Config $config, $section = null) + { + if ($section !== null) { + if ($config->{$section} === null) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception("No route configuration in section '{$section}'"); + } + + $config = $config->{$section}; + } + + foreach ($config as $name => $info) { + $route = $this->_getRouteFromConfig($info); + + if ($route instanceof Zend_Controller_Router_Route_Chain) { + if (!isset($info->chain)) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception("No chain defined"); + } + + if ($info->chain instanceof Zend_Config) { + $childRouteNames = $info->chain; + } else { + $childRouteNames = explode(',', $info->chain); + } + + foreach ($childRouteNames as $childRouteName) { + $childRoute = $this->getRoute(trim($childRouteName)); + $route->chain($childRoute); + } + + $this->addRoute($name, $route); + } elseif (isset($info->chains) && $info->chains instanceof Zend_Config) { + $this->_addChainRoutesFromConfig($name, $route, $info->chains); + } else { + $this->addRoute($name, $route); + } + } + + return $this; + } + + /** + * Get a route frm a config instance + * + * @param Zend_Config $info + * @return Zend_Controller_Router_Route_Interface + */ + protected function _getRouteFromConfig(Zend_Config $info) + { + $class = (isset($info->type)) ? $info->type : 'Zend_Controller_Router_Route'; + if (!class_exists($class)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($class); + } + + $route = call_user_func(array($class, 'getInstance'), $info); + + if (isset($info->abstract) && $info->abstract && method_exists($route, 'isAbstract')) { + $route->isAbstract(true); + } + + return $route; + } + + /** + * Add chain routes from a config route + * + * @param string $name + * @param Zend_Controller_Router_Route_Interface $route + * @param Zend_Config $childRoutesInfo + * @return void + */ + protected function _addChainRoutesFromConfig($name, + Zend_Controller_Router_Route_Interface $route, + Zend_Config $childRoutesInfo) + { + foreach ($childRoutesInfo as $childRouteName => $childRouteInfo) { + if (is_string($childRouteInfo)) { + $childRouteName = $childRouteInfo; + $childRoute = $this->getRoute($childRouteName); + } else { + $childRoute = $this->_getRouteFromConfig($childRouteInfo); + } + + if ($route instanceof Zend_Controller_Router_Route_Chain) { + $chainRoute = clone $route; + $chainRoute->chain($childRoute); + } else { + $chainRoute = $route->chain($childRoute); + } + + $chainName = $name . $this->_chainNameSeparator . $childRouteName; + + if (isset($childRouteInfo->chains)) { + $this->_addChainRoutesFromConfig($chainName, $chainRoute, $childRouteInfo->chains); + } else { + $this->addRoute($chainName, $chainRoute); + } + } + } + + /** + * Remove a route from the route chain + * + * @param string $name Name of the route + * @throws Zend_Controller_Router_Exception + * @return Zend_Controller_Router_Rewrite + */ + public function removeRoute($name) + { + if (!isset($this->_routes[$name])) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception("Route $name is not defined"); + } + + unset($this->_routes[$name]); + + return $this; + } + + /** + * Remove all standard default routes + * + * @param Zend_Controller_Router_Route_Interface Route + * @return Zend_Controller_Router_Rewrite + */ + public function removeDefaultRoutes() + { + $this->_useDefaultRoutes = false; + + return $this; + } + + /** + * Check if named route exists + * + * @param string $name Name of the route + * @return boolean + */ + public function hasRoute($name) + { + return isset($this->_routes[$name]); + } + + /** + * Retrieve a named route + * + * @param string $name Name of the route + * @throws Zend_Controller_Router_Exception + * @return Zend_Controller_Router_Route_Interface Route object + */ + public function getRoute($name) + { + if (!isset($this->_routes[$name])) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception("Route $name is not defined"); + } + + return $this->_routes[$name]; + } + + /** + * Retrieve a currently matched route + * + * @throws Zend_Controller_Router_Exception + * @return Zend_Controller_Router_Route_Interface Route object + */ + public function getCurrentRoute() + { + if (!isset($this->_currentRoute)) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception("Current route is not defined"); + } + return $this->getRoute($this->_currentRoute); + } + + /** + * Retrieve a name of currently matched route + * + * @throws Zend_Controller_Router_Exception + * @return Zend_Controller_Router_Route_Interface Route object + */ + public function getCurrentRouteName() + { + if (!isset($this->_currentRoute)) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception("Current route is not defined"); + } + return $this->_currentRoute; + } + + /** + * Retrieve an array of routes added to the route chain + * + * @return array All of the defined routes + */ + public function getRoutes() + { + return $this->_routes; + } + + /** + * Find a matching route to the current PATH_INFO and inject + * returning values to the Request object. + * + * @throws Zend_Controller_Router_Exception + * @return Zend_Controller_Request_Abstract Request object + */ + public function route(Zend_Controller_Request_Abstract $request) + { + if (!$request instanceof Zend_Controller_Request_Http) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception('Zend_Controller_Router_Rewrite requires a Zend_Controller_Request_Http-based request object'); + } + + if ($this->_useDefaultRoutes) { + $this->addDefaultRoutes(); + } + + // Find the matching route + foreach (array_reverse($this->_routes) as $name => $route) { + // TODO: Should be an interface method. Hack for 1.0 BC + if (method_exists($route, 'isAbstract') && $route->isAbstract()) { + continue; + } + + // TODO: Should be an interface method. Hack for 1.0 BC + if (!method_exists($route, 'getVersion') || $route->getVersion() == 1) { + $match = $request->getPathInfo(); + } else { + $match = $request; + } + + if ($params = $route->match($match)) { + $this->_setRequestParams($request, $params); + $this->_currentRoute = $name; + break; + } + } + + return $request; + + } + + protected function _setRequestParams($request, $params) + { + foreach ($params as $param => $value) { + + $request->setParam($param, $value); + + if ($param === $request->getModuleKey()) { + $request->setModuleName($value); + } + if ($param === $request->getControllerKey()) { + $request->setControllerName($value); + } + if ($param === $request->getActionKey()) { + $request->setActionName($value); + } + + } + } + + /** + * Generates a URL path that can be used in URL creation, redirection, etc. + * + * @param array $userParams Options passed by a user used to override parameters + * @param mixed $name The name of a Route to use + * @param bool $reset Whether to reset to the route defaults ignoring URL params + * @param bool $encode Tells to encode URL parts on output + * @throws Zend_Controller_Router_Exception + * @return string Resulting absolute URL path + */ + public function assemble($userParams, $name = null, $reset = false, $encode = true) + { + if ($name == null) { + try { + $name = $this->getCurrentRouteName(); + } catch (Zend_Controller_Router_Exception $e) { + $name = 'default'; + } + } + + $params = array_merge($this->_globalParams, $userParams); + + $route = $this->getRoute($name); + $url = $route->assemble($params, $reset, $encode); + + if (!preg_match('|^[a-z]+://|', $url)) { + $url = rtrim($this->getFrontController()->getBaseUrl(), '/') . '/' . $url; + } + + return $url; + } + + /** + * Set a global parameter + * + * @param string $name + * @param mixed $value + * @return Zend_Controller_Router_Rewrite + */ + public function setGlobalParam($name, $value) + { + $this->_globalParams[$name] = $value; + + return $this; + } + + /** + * Set the separator to use with chain names + * + * @param string $separator The separator to use + * @return Zend_Controller_Router_Rewrite + */ + public function setChainNameSeparator($separator) { + $this->_chainNameSeparator = $separator; + + return $this; + } + + /** + * Get the separator to use for chain names + * + * @return string + */ + public function getChainNameSeparator() { + return $this->_chainNameSeparator; + } +} diff --git a/lib/zend/Zend/Controller/Router/Route.php b/lib/zend/Zend/Controller/Router/Route.php new file mode 100644 index 0000000000..a622be790d --- /dev/null +++ b/lib/zend/Zend/Controller/Router/Route.php @@ -0,0 +1,557 @@ +reqs instanceof Zend_Config) ? $config->reqs->toArray() : array(); + $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + return new self($config->route, $defs, $reqs); + } + + /** + * Prepares the route for mapping by splitting (exploding) it + * to a corresponding atomic parts. These parts are assigned + * a position which is later used for matching and preparing values. + * + * @param string $route Map used to match with later submitted URL path + * @param array $defaults Defaults for map variables with keys as variable names + * @param array $reqs Regular expression requirements for variables (keys as variable names) + * @param array $reqs Regular expression requirements for variables (keys as variable names) + * @param Zend_Translate $translator Translator to use for this instance + */ + public function __construct($route, $defaults = array(), $reqs = array(), Zend_Translate $translator = null, $locale = null) + { + $route = trim($route, $this->_urlDelimiter); + $this->_defaults = (array) $defaults; + $this->_requirements = (array) $reqs; + $this->_translator = $translator; + $this->_locale = $locale; + + if ($route !== '') { + foreach (explode($this->_urlDelimiter, $route) as $pos => $part) { + if (substr($part, 0, 1) == $this->_urlVariable && substr($part, 1, 1) != $this->_urlVariable) { + $name = substr($part, 1); + + if (substr($name, 0, 1) === '@' && substr($name, 1, 1) !== '@') { + $name = substr($name, 1); + $this->_translatable[] = $name; + $this->_isTranslated = true; + } + + $this->_parts[$pos] = (isset($reqs[$name]) ? $reqs[$name] : $this->_defaultRegex); + $this->_variables[$pos] = $name; + } else { + if (substr($part, 0, 1) == $this->_urlVariable) { + $part = substr($part, 1); + } + + if (substr($part, 0, 1) === '@' && substr($part, 1, 1) !== '@') { + $this->_isTranslated = true; + } + + $this->_parts[$pos] = $part; + + if ($part !== '*') { + $this->_staticCount++; + } + } + } + } + } + + /** + * Matches a user submitted path with parts defined by a map. Assigns and + * returns an array of variables on a successful match. + * + * @param string $path Path used to match against this routing map + * @return array|false An array of assigned values or a false on a mismatch + */ + public function match($path, $partial = false) + { + if ($this->_isTranslated) { + $translateMessages = $this->getTranslator()->getMessages(); + } + + $pathStaticCount = 0; + $values = array(); + $matchedPath = ''; + + if (!$partial) { + $path = trim($path, $this->_urlDelimiter); + } + + if ($path !== '') { + $path = explode($this->_urlDelimiter, $path); + + foreach ($path as $pos => $pathPart) { + // Path is longer than a route, it's not a match + if (!array_key_exists($pos, $this->_parts)) { + if ($partial) { + break; + } else { + return false; + } + } + + $matchedPath .= $pathPart . $this->_urlDelimiter; + + // If it's a wildcard, get the rest of URL as wildcard data and stop matching + if ($this->_parts[$pos] == '*') { + $count = count($path); + for($i = $pos; $i < $count; $i+=2) { + $var = urldecode($path[$i]); + if (!isset($this->_wildcardData[$var]) && !isset($this->_defaults[$var]) && !isset($values[$var])) { + $this->_wildcardData[$var] = (isset($path[$i+1])) ? urldecode($path[$i+1]) : null; + } + } + break; + } + + $name = isset($this->_variables[$pos]) ? $this->_variables[$pos] : null; + $pathPart = urldecode($pathPart); + + // Translate value if required + $part = $this->_parts[$pos]; + if ($this->_isTranslated && (substr($part, 0, 1) === '@' && substr($part, 1, 1) !== '@' && $name === null) || $name !== null && in_array($name, $this->_translatable)) { + if (substr($part, 0, 1) === '@') { + $part = substr($part, 1); + } + + if (($originalPathPart = array_search($pathPart, $translateMessages)) !== false) { + $pathPart = $originalPathPart; + } + } + + if (substr($part, 0, 2) === '@@') { + $part = substr($part, 1); + } + + // If it's a static part, match directly + if ($name === null && $part != $pathPart) { + return false; + } + + // If it's a variable with requirement, match a regex. If not - everything matches + if ($part !== null && !preg_match($this->_regexDelimiter . '^' . $part . '$' . $this->_regexDelimiter . 'iu', $pathPart)) { + return false; + } + + // If it's a variable store it's value for later + if ($name !== null) { + $values[$name] = $pathPart; + } else { + $pathStaticCount++; + } + } + } + + // Check if all static mappings have been matched + if ($this->_staticCount != $pathStaticCount) { + return false; + } + + $return = $values + $this->_wildcardData + $this->_defaults; + + // Check if all map variables have been initialized + foreach ($this->_variables as $var) { + if (!array_key_exists($var, $return)) { + return false; + } + } + + $this->setMatchedPath(rtrim($matchedPath, $this->_urlDelimiter)); + + $this->_values = $values; + + return $return; + + } + + /** + * Assembles user submitted parameters forming a URL path defined by this route + * + * @param array $data An array of variable and value pairs used as parameters + * @param boolean $reset Whether or not to set route defaults with those provided in $data + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = false, $partial = false) + { + if ($this->_isTranslated) { + $translator = $this->getTranslator(); + + if (isset($data['@locale'])) { + $locale = $data['@locale']; + unset($data['@locale']); + } else { + $locale = $this->getLocale(); + } + } + + $url = array(); + $flag = false; + + foreach ($this->_parts as $key => $part) { + $name = isset($this->_variables[$key]) ? $this->_variables[$key] : null; + + $useDefault = false; + if (isset($name) && array_key_exists($name, $data) && $data[$name] === null) { + $useDefault = true; + } + + if (isset($name)) { + if (isset($data[$name]) && !$useDefault) { + $value = $data[$name]; + unset($data[$name]); + } elseif (!$reset && !$useDefault && isset($this->_values[$name])) { + $value = $this->_values[$name]; + } elseif (!$reset && !$useDefault && isset($this->_wildcardData[$name])) { + $value = $this->_wildcardData[$name]; + } elseif (isset($this->_defaults[$name])) { + $value = $this->_defaults[$name]; + } else { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception($name . ' is not specified'); + } + + if ($this->_isTranslated && in_array($name, $this->_translatable)) { + $url[$key] = $translator->translate($value, $locale); + } else { + $url[$key] = $value; + } + } elseif ($part != '*') { + if ($this->_isTranslated && substr($part, 0, 1) === '@') { + if (substr($part, 1, 1) !== '@') { + $url[$key] = $translator->translate(substr($part, 1), $locale); + } else { + $url[$key] = substr($part, 1); + } + } else { + if (substr($part, 0, 2) === '@@') { + $part = substr($part, 1); + } + + $url[$key] = $part; + } + } else { + if (!$reset) $data += $this->_wildcardData; + foreach ($data as $var => $value) { + if ($value !== null) { + $url[$key++] = $var; + $url[$key++] = $value; + $flag = true; + } + } + } + } + + $return = ''; + + foreach (array_reverse($url, true) as $key => $value) { + $defaultValue = null; + + if (isset($this->_variables[$key])) { + $defaultValue = $this->getDefault($this->_variables[$key]); + + if ($this->_isTranslated && $defaultValue !== null && isset($this->_translatable[$this->_variables[$key]])) { + $defaultValue = $translator->translate($defaultValue, $locale); + } + } + + if ($flag || $value !== $defaultValue || $partial) { + if ($encode) $value = urlencode($value); + $return = $this->_urlDelimiter . $value . $return; + $flag = true; + } + } + + return trim($return, $this->_urlDelimiter); + + } + + /** + * Return a single parameter of route's defaults + * + * @param string $name Array key of the parameter + * @return string Previously set default + */ + public function getDefault($name) { + if (isset($this->_defaults[$name])) { + return $this->_defaults[$name]; + } + return null; + } + + /** + * Return an array of defaults + * + * @return array Route defaults + */ + public function getDefaults() { + return $this->_defaults; + } + + /** + * Get all variables which are used by the route + * + * @return array + */ + public function getVariables() + { + return $this->_variables; + } + + /** + * Set a default translator + * + * @param Zend_Translate $translator + * @return void + */ + public static function setDefaultTranslator(Zend_Translate $translator = null) + { + self::$_defaultTranslator = $translator; + } + + /** + * Get the default translator + * + * @return Zend_Translate + */ + public static function getDefaultTranslator() + { + return self::$_defaultTranslator; + } + + /** + * Set a translator + * + * @param Zend_Translate $translator + * @return void + */ + public function setTranslator(Zend_Translate $translator) + { + $this->_translator = $translator; + } + + /** + * Get the translator + * + * @throws Zend_Controller_Router_Exception When no translator can be found + * @return Zend_Translate + */ + public function getTranslator() + { + if ($this->_translator !== null) { + return $this->_translator; + } else if (($translator = self::getDefaultTranslator()) !== null) { + return $translator; + } else { + try { + $translator = Zend_Registry::get('Zend_Translate'); + } catch (Zend_Exception $e) { + $translator = null; + } + + if ($translator instanceof Zend_Translate) { + return $translator; + } + } + + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception('Could not find a translator'); + } + + /** + * Set a default locale + * + * @param mixed $locale + * @return void + */ + public static function setDefaultLocale($locale = null) + { + self::$_defaultLocale = $locale; + } + + /** + * Get the default locale + * + * @return mixed + */ + public static function getDefaultLocale() + { + return self::$_defaultLocale; + } + + /** + * Set a locale + * + * @param mixed $locale + * @return void + */ + public function setLocale($locale) + { + $this->_locale = $locale; + } + + /** + * Get the locale + * + * @return mixed + */ + public function getLocale() + { + if ($this->_locale !== null) { + return $this->_locale; + } else if (($locale = self::getDefaultLocale()) !== null) { + return $locale; + } else { + try { + $locale = Zend_Registry::get('Zend_Locale'); + } catch (Zend_Exception $e) { + $locale = null; + } + + if ($locale !== null) { + return $locale; + } + } + + return null; + } +} diff --git a/lib/zend/Zend/Controller/Router/Route/Abstract.php b/lib/zend/Zend/Controller/Router/Route/Abstract.php new file mode 100644 index 0000000000..86ecfbb634 --- /dev/null +++ b/lib/zend/Zend/Controller/Router/Route/Abstract.php @@ -0,0 +1,117 @@ +_matchedPath = $path; + } + + /** + * Get partially matched path + * + * @return string + */ + public function getMatchedPath() + { + return $this->_matchedPath; + } + + /** + * Check or set wether this is an abstract route or not + * + * @param boolean $flag + * @return boolean + */ + public function isAbstract($flag = null) + { + if ($flag !== null) { + $this->_isAbstract = $flag; + } + + return $this->_isAbstract; + } + + /** + * Create a new chain + * + * @param Zend_Controller_Router_Route_Abstract $route + * @param string $separator + * @return Zend_Controller_Router_Route_Chain + */ + public function chain(Zend_Controller_Router_Route_Abstract $route, $separator = '/') + { + require_once 'Zend/Controller/Router/Route/Chain.php'; + + $chain = new Zend_Controller_Router_Route_Chain(); + $chain->chain($this)->chain($route, $separator); + + return $chain; + } + +} diff --git a/lib/zend/Zend/Controller/Router/Route/Chain.php b/lib/zend/Zend/Controller/Router/Route/Chain.php new file mode 100644 index 0000000000..d637a3fc58 --- /dev/null +++ b/lib/zend/Zend/Controller/Router/Route/Chain.php @@ -0,0 +1,169 @@ +defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + return new self($config->route, $defs); + } + + /** + * Add a route to this chain + * + * @param Zend_Controller_Router_Route_Abstract $route + * @param string $separator + * @return Zend_Controller_Router_Route_Chain + */ + public function chain(Zend_Controller_Router_Route_Abstract $route, $separator = '/') + { + $this->_routes[] = $route; + $this->_separators[] = $separator; + + return $this; + + } + + /** + * Matches a user submitted path with a previously defined route. + * Assigns and returns an array of defaults on a successful match. + * + * @param Zend_Controller_Request_Http $request Request to get the path info from + * @return array|false An array of assigned values or a false on a mismatch + */ + public function match($request, $partial = null) + { + $path = trim($request->getPathInfo(), '/'); + $subPath = $path; + $values = array(); + + foreach ($this->_routes as $key => $route) { + if ($key > 0 && $matchedPath !== null) { + $separator = substr($subPath, 0, strlen($this->_separators[$key])); + + if ($separator !== $this->_separators[$key]) { + return false; + } + + $subPath = substr($subPath, strlen($separator)); + } + + // TODO: Should be an interface method. Hack for 1.0 BC + if (!method_exists($route, 'getVersion') || $route->getVersion() == 1) { + $match = $subPath; + } else { + $request->setPathInfo($subPath); + $match = $request; + } + + $res = $route->match($match, true); + if ($res === false) { + return false; + } + + $matchedPath = $route->getMatchedPath(); + + if ($matchedPath !== null) { + $subPath = substr($subPath, strlen($matchedPath)); + $separator = substr($subPath, 0, strlen($this->_separators[$key])); + } + + $values = $res + $values; + } + + $request->setPathInfo($path); + + if ($subPath !== '' && $subPath !== false) { + return false; + } + + return $values; + } + + /** + * Assembles a URL path defined by this route + * + * @param array $data An array of variable and value pairs used as parameters + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = false) + { + $value = ''; + $numRoutes = count($this->_routes); + + foreach ($this->_routes as $key => $route) { + if ($key > 0) { + $value .= $this->_separators[$key]; + } + + $value .= $route->assemble($data, $reset, $encode, (($numRoutes - 1) > $key)); + + if (method_exists($route, 'getVariables')) { + $variables = $route->getVariables(); + + foreach ($variables as $variable) { + $data[$variable] = null; + } + } + } + + return $value; + } + + /** + * Set the request object for this and the child routes + * + * @param Zend_Controller_Request_Abstract|null $request + * @return void + */ + public function setRequest(Zend_Controller_Request_Abstract $request = null) + { + $this->_request = $request; + + foreach ($this->_routes as $route) { + if (method_exists($route, 'setRequest')) { + $route->setRequest($request); + } + } + } + +} diff --git a/lib/zend/Zend/Controller/Router/Route/Hostname.php b/lib/zend/Zend/Controller/Router/Route/Hostname.php new file mode 100644 index 0000000000..77931a0e74 --- /dev/null +++ b/lib/zend/Zend/Controller/Router/Route/Hostname.php @@ -0,0 +1,342 @@ +_request = $request; + } + + /** + * Get the request object + * + * @return Zend_Controller_Request_Abstract $request + */ + public function getRequest() + { + if ($this->_request === null) { + require_once 'Zend/Controller/Front.php'; + $this->_request = Zend_Controller_Front::getInstance()->getRequest(); + } + + return $this->_request; + } + + /** + * Instantiates route based on passed Zend_Config structure + * + * @param Zend_Config $config Configuration object + */ + public static function getInstance(Zend_Config $config) + { + $reqs = ($config->reqs instanceof Zend_Config) ? $config->reqs->toArray() : array(); + $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + $scheme = (isset($config->scheme)) ? $config->scheme : null; + return new self($config->route, $defs, $reqs, $scheme); + } + + /** + * Prepares the route for mapping by splitting (exploding) it + * to a corresponding atomic parts. These parts are assigned + * a position which is later used for matching and preparing values. + * + * @param string $route Map used to match with later submitted hostname + * @param array $defaults Defaults for map variables with keys as variable names + * @param array $reqs Regular expression requirements for variables (keys as variable names) + * @param string $scheme + */ + public function __construct($route, $defaults = array(), $reqs = array(), $scheme = null) + { + $route = trim($route, '.'); + $this->_defaults = (array) $defaults; + $this->_requirements = (array) $reqs; + $this->_scheme = $scheme; + + if ($route != '') { + foreach (explode('.', $route) as $pos => $part) { + if (substr($part, 0, 1) == $this->_hostVariable) { + $name = substr($part, 1); + $this->_parts[$pos] = (isset($reqs[$name]) ? $reqs[$name] : $this->_defaultRegex); + $this->_variables[$pos] = $name; + } else { + $this->_parts[$pos] = $part; + $this->_staticCount++; + } + } + } + } + + /** + * Matches a user submitted path with parts defined by a map. Assigns and + * returns an array of variables on a successful match. + * + * @param Zend_Controller_Request_Http $request Request to get the host from + * @return array|false An array of assigned values or a false on a mismatch + */ + public function match($request) + { + // Check the scheme if required + if ($this->_scheme !== null) { + $scheme = $request->getScheme(); + + if ($scheme !== $this->_scheme) { + return false; + } + } + + // Get the host and remove unnecessary port information + $host = $request->getHttpHost(); + if (preg_match('#:\d+$#', $host, $result) === 1) { + $host = substr($host, 0, -strlen($result[0])); + } + + $hostStaticCount = 0; + $values = array(); + + $host = trim($host, '.'); + + if ($host != '') { + $host = explode('.', $host); + + foreach ($host as $pos => $hostPart) { + // Host is longer than a route, it's not a match + if (!array_key_exists($pos, $this->_parts)) { + return false; + } + + $name = isset($this->_variables[$pos]) ? $this->_variables[$pos] : null; + $hostPart = urldecode($hostPart); + + // If it's a static part, match directly + if ($name === null && $this->_parts[$pos] != $hostPart) { + return false; + } + + // If it's a variable with requirement, match a regex. If not - everything matches + if ($this->_parts[$pos] !== null && !preg_match($this->_regexDelimiter . '^' . $this->_parts[$pos] . '$' . $this->_regexDelimiter . 'iu', $hostPart)) { + return false; + } + + // If it's a variable store it's value for later + if ($name !== null) { + $values[$name] = $hostPart; + } else { + $hostStaticCount++; + } + } + } + + // Check if all static mappings have been matched + if ($this->_staticCount != $hostStaticCount) { + return false; + } + + $return = $values + $this->_defaults; + + // Check if all map variables have been initialized + foreach ($this->_variables as $var) { + if (!array_key_exists($var, $return)) { + return false; + } + } + + $this->_values = $values; + + return $return; + + } + + /** + * Assembles user submitted parameters forming a hostname defined by this route + * + * @param array $data An array of variable and value pairs used as parameters + * @param boolean $reset Whether or not to set route defaults with those provided in $data + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = false, $partial = false) + { + $host = array(); + $flag = false; + + foreach ($this->_parts as $key => $part) { + $name = isset($this->_variables[$key]) ? $this->_variables[$key] : null; + + $useDefault = false; + if (isset($name) && array_key_exists($name, $data) && $data[$name] === null) { + $useDefault = true; + } + + if (isset($name)) { + if (isset($data[$name]) && !$useDefault) { + $host[$key] = $data[$name]; + unset($data[$name]); + } elseif (!$reset && !$useDefault && isset($this->_values[$name])) { + $host[$key] = $this->_values[$name]; + } elseif (isset($this->_defaults[$name])) { + $host[$key] = $this->_defaults[$name]; + } else { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception($name . ' is not specified'); + } + } else { + $host[$key] = $part; + } + } + + $return = ''; + + foreach (array_reverse($host, true) as $key => $value) { + if ($flag || !isset($this->_variables[$key]) || $value !== $this->getDefault($this->_variables[$key]) || $partial) { + if ($encode) $value = urlencode($value); + $return = '.' . $value . $return; + $flag = true; + } + } + + $url = trim($return, '.'); + + if ($this->_scheme !== null) { + $scheme = $this->_scheme; + } else { + $request = $this->getRequest(); + if ($request instanceof Zend_Controller_Request_Http) { + $scheme = $request->getScheme(); + } else { + $scheme = 'http'; + } + } + + $hostname = implode('.', $host); + $url = $scheme . '://' . $url; + + return $url; + } + + /** + * Return a single parameter of route's defaults + * + * @param string $name Array key of the parameter + * @return string Previously set default + */ + public function getDefault($name) { + if (isset($this->_defaults[$name])) { + return $this->_defaults[$name]; + } + return null; + } + + /** + * Return an array of defaults + * + * @return array Route defaults + */ + public function getDefaults() { + return $this->_defaults; + } + + /** + * Get all variables which are used by the route + * + * @return array + */ + public function getVariables() + { + return $this->_variables; + } +} diff --git a/lib/zend/Zend/Controller/Router/Route/Interface.php b/lib/zend/Zend/Controller/Router/Route/Interface.php new file mode 100644 index 0000000000..de50768c8f --- /dev/null +++ b/lib/zend/Zend/Controller/Router/Route/Interface.php @@ -0,0 +1,37 @@ +defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + $dispatcher = $frontController->getDispatcher(); + $request = $frontController->getRequest(); + + return new self($defs, $dispatcher, $request); + } + + /** + * Constructor + * + * @param array $defaults Defaults for map variables with keys as variable names + * @param Zend_Controller_Dispatcher_Interface $dispatcher Dispatcher object + * @param Zend_Controller_Request_Abstract $request Request object + */ + public function __construct(array $defaults = array(), + Zend_Controller_Dispatcher_Interface $dispatcher = null, + Zend_Controller_Request_Abstract $request = null) + { + $this->_defaults = $defaults; + + if (isset($request)) { + $this->_request = $request; + } + + if (isset($dispatcher)) { + $this->_dispatcher = $dispatcher; + } + } + + /** + * Set request keys based on values in request object + * + * @return void + */ + protected function _setRequestKeys() + { + if (null !== $this->_request) { + $this->_moduleKey = $this->_request->getModuleKey(); + $this->_controllerKey = $this->_request->getControllerKey(); + $this->_actionKey = $this->_request->getActionKey(); + } + + if (null !== $this->_dispatcher) { + $this->_defaults += array( + $this->_controllerKey => $this->_dispatcher->getDefaultControllerName(), + $this->_actionKey => $this->_dispatcher->getDefaultAction(), + $this->_moduleKey => $this->_dispatcher->getDefaultModule() + ); + } + + $this->_keysSet = true; + } + + /** + * Matches a user submitted path. Assigns and returns an array of variables + * on a successful match. + * + * If a request object is registered, it uses its setModuleName(), + * setControllerName(), and setActionName() accessors to set those values. + * Always returns the values as an array. + * + * @param string $path Path used to match against this routing map + * @return array An array of assigned values or a false on a mismatch + */ + public function match($path, $partial = false) + { + $this->_setRequestKeys(); + + $values = array(); + $params = array(); + + if (!$partial) { + $path = trim($path, self::URI_DELIMITER); + } else { + $matchedPath = $path; + } + + if ($path != '') { + $path = explode(self::URI_DELIMITER, $path); + + if ($this->_dispatcher && $this->_dispatcher->isValidModule($path[0])) { + $values[$this->_moduleKey] = array_shift($path); + $this->_moduleValid = true; + } + + if (count($path) && !empty($path[0])) { + $values[$this->_controllerKey] = array_shift($path); + } + + if (count($path) && !empty($path[0])) { + $values[$this->_actionKey] = array_shift($path); + } + + if ($numSegs = count($path)) { + for ($i = 0; $i < $numSegs; $i = $i + 2) { + $key = urldecode($path[$i]); + $val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null; + $params[$key] = (isset($params[$key]) ? (array_merge((array) $params[$key], array($val))): $val); + } + } + } + + if ($partial) { + $this->setMatchedPath($matchedPath); + } + + $this->_values = $values + $params; + + return $this->_values + $this->_defaults; + } + + /** + * Assembles user submitted parameters forming a URL path defined by this route + * + * @param array $data An array of variable and value pairs used as parameters + * @param bool $reset Weither to reset the current params + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = true, $partial = false) + { + if (!$this->_keysSet) { + $this->_setRequestKeys(); + } + + $params = (!$reset) ? $this->_values : array(); + + foreach ($data as $key => $value) { + if ($value !== null) { + $params[$key] = $value; + } elseif (isset($params[$key])) { + unset($params[$key]); + } + } + + $params += $this->_defaults; + + $url = ''; + + if ($this->_moduleValid || array_key_exists($this->_moduleKey, $data)) { + if ($params[$this->_moduleKey] != $this->_defaults[$this->_moduleKey]) { + $module = $params[$this->_moduleKey]; + } + } + unset($params[$this->_moduleKey]); + + $controller = $params[$this->_controllerKey]; + unset($params[$this->_controllerKey]); + + $action = $params[$this->_actionKey]; + unset($params[$this->_actionKey]); + + foreach ($params as $key => $value) { + if (is_array($value)) { + foreach ($value as $arrayValue) { + if ($encode) $arrayValue = urlencode($arrayValue); + $url .= '/' . $key; + $url .= '/' . $arrayValue; + } + } else { + if ($encode) $value = urlencode($value); + $url .= '/' . $key; + $url .= '/' . $value; + } + } + + if (!empty($url) || $action !== $this->_defaults[$this->_actionKey]) { + if ($encode) $action = urlencode($action); + $url = '/' . $action . $url; + } + + if (!empty($url) || $controller !== $this->_defaults[$this->_controllerKey]) { + if ($encode) $controller = urlencode($controller); + $url = '/' . $controller . $url; + } + + if (isset($module)) { + if ($encode) $module = urlencode($module); + $url = '/' . $module . $url; + } + + return ltrim($url, self::URI_DELIMITER); + } + + /** + * Return a single parameter of route's defaults + * + * @param string $name Array key of the parameter + * @return string Previously set default + */ + public function getDefault($name) { + if (isset($this->_defaults[$name])) { + return $this->_defaults[$name]; + } + } + + /** + * Return an array of defaults + * + * @return array Route defaults + */ + public function getDefaults() { + return $this->_defaults; + } + +} diff --git a/lib/zend/Zend/Controller/Router/Route/Regex.php b/lib/zend/Zend/Controller/Router/Route/Regex.php new file mode 100644 index 0000000000..4f6be9151e --- /dev/null +++ b/lib/zend/Zend/Controller/Router/Route/Regex.php @@ -0,0 +1,262 @@ +defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + $map = ($config->map instanceof Zend_Config) ? $config->map->toArray() : array(); + $reverse = (isset($config->reverse)) ? $config->reverse : null; + return new self($config->route, $defs, $map, $reverse); + } + + public function __construct($route, $defaults = array(), $map = array(), $reverse = null) + { + $this->_regex = $route; + $this->_defaults = (array) $defaults; + $this->_map = (array) $map; + $this->_reverse = $reverse; + } + + public function getVersion() { + return 1; + } + + /** + * Matches a user submitted path with a previously defined route. + * Assigns and returns an array of defaults on a successful match. + * + * @param string $path Path used to match against this routing map + * @return array|false An array of assigned values or a false on a mismatch + */ + public function match($path, $partial = false) + { + if (!$partial) { + $path = trim(urldecode($path), '/'); + $regex = '#^' . $this->_regex . '$#i'; + } else { + $regex = '#^' . $this->_regex . '#i'; + } + + $res = preg_match($regex, $path, $values); + + if ($res === 0) { + return false; + } + + if ($partial) { + $this->setMatchedPath($values[0]); + } + + // array_filter_key()? Why isn't this in a standard PHP function set yet? :) + foreach ($values as $i => $value) { + if (!is_int($i) || $i === 0) { + unset($values[$i]); + } + } + + $this->_values = $values; + + $values = $this->_getMappedValues($values); + $defaults = $this->_getMappedValues($this->_defaults, false, true); + $return = $values + $defaults; + + return $return; + } + + /** + * Maps numerically indexed array values to it's associative mapped counterpart. + * Or vice versa. Uses user provided map array which consists of index => name + * parameter mapping. If map is not found, it returns original array. + * + * Method strips destination type of keys form source array. Ie. if source array is + * indexed numerically then every associative key will be stripped. Vice versa if reversed + * is set to true. + * + * @param array $values Indexed or associative array of values to map + * @param boolean $reversed False means translation of index to association. True means reverse. + * @param boolean $preserve Should wrong type of keys be preserved or stripped. + * @return array An array of mapped values + */ + protected function _getMappedValues($values, $reversed = false, $preserve = false) + { + if (count($this->_map) == 0) { + return $values; + } + + $return = array(); + + foreach ($values as $key => $value) { + if (is_int($key) && !$reversed) { + if (array_key_exists($key, $this->_map)) { + $index = $this->_map[$key]; + } elseif (false === ($index = array_search($key, $this->_map))) { + $index = $key; + } + $return[$index] = $values[$key]; + } elseif ($reversed) { + $index = (!is_int($key)) ? array_search($key, $this->_map, true) : $key; + if (false !== $index) { + $return[$index] = $values[$key]; + } + } elseif ($preserve) { + $return[$key] = $value; + } + } + + return $return; + } + + /** + * Assembles a URL path defined by this route + * + * @param array $data An array of name (or index) and value pairs used as parameters + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = false, $partial = false) + { + if ($this->_reverse === null) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception('Cannot assemble. Reversed route is not specified.'); + } + + $defaultValuesMapped = $this->_getMappedValues($this->_defaults, true, false); + $matchedValuesMapped = $this->_getMappedValues($this->_values, true, false); + $dataValuesMapped = $this->_getMappedValues($data, true, false); + + // handle resets, if so requested (By null value) to do so + if (($resetKeys = array_search(null, $dataValuesMapped, true)) !== false) { + foreach ((array) $resetKeys as $resetKey) { + if (isset($matchedValuesMapped[$resetKey])) { + unset($matchedValuesMapped[$resetKey]); + unset($dataValuesMapped[$resetKey]); + } + } + } + + // merge all the data together, first defaults, then values matched, then supplied + $mergedData = $defaultValuesMapped; + $mergedData = $this->_arrayMergeNumericKeys($mergedData, $matchedValuesMapped); + $mergedData = $this->_arrayMergeNumericKeys($mergedData, $dataValuesMapped); + + if ($encode) { + foreach ($mergedData as $key => &$value) { + $value = urlencode($value); + } + } + + ksort($mergedData); + + $return = @vsprintf($this->_reverse, $mergedData); + + if ($return === false) { + require_once 'Zend/Controller/Router/Exception.php'; + throw new Zend_Controller_Router_Exception('Cannot assemble. Too few arguments?'); + } + + return $return; + + } + + /** + * Return a single parameter of route's defaults + * + * @param string $name Array key of the parameter + * @return string Previously set default + */ + public function getDefault($name) { + if (isset($this->_defaults[$name])) { + return $this->_defaults[$name]; + } + } + + /** + * Return an array of defaults + * + * @return array Route defaults + */ + public function getDefaults() { + return $this->_defaults; + } + + /** + * Get all variables which are used by the route + * + * @return array + */ + public function getVariables() + { + $variables = array(); + + foreach ($this->_map as $key => $value) { + if (is_numeric($key)) { + $variables[] = $value; + } else { + $variables[] = $key; + } + } + + return $variables; + } + + /** + * _arrayMergeNumericKeys() - allows for a strict key (numeric's included) array_merge. + * php's array_merge() lacks the ability to merge with numeric keys. + * + * @param array $array1 + * @param array $array2 + * @return array + */ + protected function _arrayMergeNumericKeys(Array $array1, Array $array2) + { + $returnArray = $array1; + foreach ($array2 as $array2Index => $array2Value) { + $returnArray[$array2Index] = $array2Value; + } + return $returnArray; + } + + +} diff --git a/lib/zend/Zend/Controller/Router/Route/Static.php b/lib/zend/Zend/Controller/Router/Route/Static.php new file mode 100644 index 0000000000..01f1fa5f10 --- /dev/null +++ b/lib/zend/Zend/Controller/Router/Route/Static.php @@ -0,0 +1,125 @@ +defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); + return new self($config->route, $defs); + } + + /** + * Prepares the route for mapping. + * + * @param string $route Map used to match with later submitted URL path + * @param array $defaults Defaults for map variables with keys as variable names + */ + public function __construct($route, $defaults = array()) + { + $this->_route = trim($route, '/'); + $this->_defaults = (array) $defaults; + } + + /** + * Matches a user submitted path with a previously defined route. + * Assigns and returns an array of defaults on a successful match. + * + * @param string $path Path used to match against this routing map + * @return array|false An array of assigned values or a false on a mismatch + */ + public function match($path, $partial = false) + { + if ($partial) { + if (substr($path, 0, strlen($this->_route)) === $this->_route) { + $this->setMatchedPath($this->_route); + return $this->_defaults; + } + } else { + if (trim($path, '/') == $this->_route) { + return $this->_defaults; + } + } + + return false; + } + + /** + * Assembles a URL path defined by this route + * + * @param array $data An array of variable and value pairs used as parameters + * @return string Route path with user submitted parameters + */ + public function assemble($data = array(), $reset = false, $encode = false, $partial = false) + { + return $this->_route; + } + + /** + * Return a single parameter of route's defaults + * + * @param string $name Array key of the parameter + * @return string Previously set default + */ + public function getDefault($name) { + if (isset($this->_defaults[$name])) { + return $this->_defaults[$name]; + } + return null; + } + + /** + * Return an array of defaults + * + * @return array Route defaults + */ + public function getDefaults() { + return $this->_defaults; + } + +} diff --git a/lib/zend/Zend/Crypt/DiffieHellman.php b/lib/zend/Zend/Crypt/DiffieHellman.php new file mode 100644 index 0000000000..1da870b8fd --- /dev/null +++ b/lib/zend/Zend/Crypt/DiffieHellman.php @@ -0,0 +1,380 @@ +setPrime($prime); + $this->setGenerator($generator); + if (!is_null($privateKey)) { + $this->setPrivateKey($privateKey, $privateKeyType); + } + $this->setBigIntegerMath(); + } + + /** + * Generate own public key. If a private number has not already been + * set, one will be generated at this stage. + * + * @return Zend_Crypt_DiffieHellman + */ + public function generateKeys() + { + if (function_exists('openssl_dh_compute_key') && self::$useOpenssl !== false) { + $details = array(); + $details['p'] = $this->getPrime(); + $details['g'] = $this->getGenerator(); + if ($this->hasPrivateKey()) { + $details['priv_key'] = $this->getPrivateKey(); + } + $opensslKeyResource = openssl_pkey_new( array('dh' => $details) ); + $data = openssl_pkey_get_details($opensslKeyResource); + $this->setPrivateKey($data['dh']['priv_key'], self::BINARY); + $this->setPublicKey($data['dh']['pub_key'], self::BINARY); + } else { + // Private key is lazy generated in the absence of PHP 5.3's ext/openssl + $publicKey = $this->_math->powmod($this->getGenerator(), $this->getPrivateKey(), $this->getPrime()); + $this->setPublicKey($publicKey); + } + return $this; + } + + /** + * Setter for the value of the public number + * + * @param string $number + * @param string $type + * @return Zend_Crypt_DiffieHellman + */ + public function setPublicKey($number, $type = self::NUMBER) + { + if ($type == self::BINARY) { + $number = $this->_math->fromBinary($number); + } + if (!preg_match("/^\d+$/", $number)) { + require_once('Zend/Crypt/DiffieHellman/Exception.php'); + throw new Zend_Crypt_DiffieHellman_Exception('invalid parameter; not a positive natural number'); + } + $this->_publicKey = (string) $number; + return $this; + } + + /** + * Returns own public key for communication to the second party to this + * transaction. + * + * @param string $type + * @return string + */ + public function getPublicKey($type = self::NUMBER) + { + if (is_null($this->_publicKey)) { + require_once 'Zend/Crypt/DiffieHellman/Exception.php'; + throw new Zend_Crypt_DiffieHellman_Exception('A public key has not yet been generated using a prior call to generateKeys()'); + } + if ($type == self::BINARY) { + return $this->_math->toBinary($this->_publicKey); + } elseif ($type == self::BTWOC) { + return $this->_math->btwoc($this->_math->toBinary($this->_publicKey)); + } + return $this->_publicKey; + } + + /** + * Compute the shared secret key based on the public key received from the + * the second party to this transaction. This should agree to the secret + * key the second party computes on our own public key. + * Once in agreement, the key is known to only to both parties. + * By default, the function expects the public key to be in binary form + * which is the typical format when being transmitted. + * + * If you need the binary form of the shared secret key, call + * getSharedSecretKey() with the optional parameter for Binary output. + * + * @param string $publicKey + * @param string $type + * @return mixed + */ + public function computeSecretKey($publicKey, $type = self::NUMBER, $output = self::NUMBER) + { + if ($type == self::BINARY) { + $publicKey = $this->_math->fromBinary($publicKey); + } + if (!preg_match("/^\d+$/", $publicKey)) { + require_once('Zend/Crypt/DiffieHellman/Exception.php'); + throw new Zend_Crypt_DiffieHellman_Exception('invalid parameter; not a positive natural number'); + } + if (function_exists('openssl_dh_compute_key') && self::$useOpenssl !== false) { + $this->_secretKey = openssl_dh_compute_key($publicKey, $this->getPublicKey()); + } else { + $this->_secretKey = $this->_math->powmod($publicKey, $this->getPrivateKey(), $this->getPrime()); + } + return $this->getSharedSecretKey($output); + } + + /** + * Return the computed shared secret key from the DiffieHellman transaction + * + * @param string $type + * @return string + */ + public function getSharedSecretKey($type = self::NUMBER) + { + if (!isset($this->_secretKey)) { + require_once('Zend/Crypt/DiffieHellman/Exception.php'); + throw new Zend_Crypt_DiffieHellman_Exception('A secret key has not yet been computed; call computeSecretKey()'); + } + if ($type == self::BINARY) { + return $this->_math->toBinary($this->_secretKey); + } elseif ($type == self::BTWOC) { + return $this->_math->btwoc($this->_math->toBinary($this->_secretKey)); + } + return $this->_secretKey; + } + + /** + * Setter for the value of the prime number + * + * @param string $number + * @return Zend_Crypt_DiffieHellman + */ + public function setPrime($number) + { + if (!preg_match("/^\d+$/", $number) || $number < 11) { + require_once('Zend/Crypt/DiffieHellman/Exception.php'); + throw new Zend_Crypt_DiffieHellman_Exception('invalid parameter; not a positive natural number or too small: should be a large natural number prime'); + } + $this->_prime = (string) $number; + return $this; + } + + /** + * Getter for the value of the prime number + * + * @return string + */ + public function getPrime() + { + if (!isset($this->_prime)) { + require_once('Zend/Crypt/DiffieHellman/Exception.php'); + throw new Zend_Crypt_DiffieHellman_Exception('No prime number has been set'); + } + return $this->_prime; + } + + + /** + * Setter for the value of the generator number + * + * @param string $number + * @return Zend_Crypt_DiffieHellman + */ + public function setGenerator($number) + { + if (!preg_match("/^\d+$/", $number) || $number < 2) { + require_once('Zend/Crypt/DiffieHellman/Exception.php'); + throw new Zend_Crypt_DiffieHellman_Exception('invalid parameter; not a positive natural number greater than 1'); + } + $this->_generator = (string) $number; + return $this; + } + + /** + * Getter for the value of the generator number + * + * @return string + */ + public function getGenerator() + { + if (!isset($this->_generator)) { + require_once('Zend/Crypt/DiffieHellman/Exception.php'); + throw new Zend_Crypt_DiffieHellman_Exception('No generator number has been set'); + } + return $this->_generator; + } + + /** + * Setter for the value of the private number + * + * @param string $number + * @param string $type + * @return Zend_Crypt_DiffieHellman + */ + public function setPrivateKey($number, $type = self::NUMBER) + { + if ($type == self::BINARY) { + $number = $this->_math->fromBinary($number); + } + if (!preg_match("/^\d+$/", $number)) { + require_once('Zend/Crypt/DiffieHellman/Exception.php'); + throw new Zend_Crypt_DiffieHellman_Exception('invalid parameter; not a positive natural number'); + } + $this->_privateKey = (string) $number; + return $this; + } + + /** + * Getter for the value of the private number + * + * @param string $type + * @return string + */ + public function getPrivateKey($type = self::NUMBER) + { + if (!$this->hasPrivateKey()) { + $this->setPrivateKey($this->_generatePrivateKey()); + } + if ($type == self::BINARY) { + return $this->_math->toBinary($this->_privateKey); + } elseif ($type == self::BTWOC) { + return $this->_math->btwoc($this->_math->toBinary($this->_privateKey)); + } + return $this->_privateKey; + } + + /** + * Check whether a private key currently exists. + * + * @return boolean + */ + public function hasPrivateKey() + { + return isset($this->_privateKey); + } + + /** + * Setter to pass an extension parameter which is used to create + * a specific BigInteger instance for a specific extension type. + * Allows manual setting of the class in case of an extension + * problem or bug. + * + * @param string $extension + * @return void + */ + public function setBigIntegerMath($extension = null) + { + /** + * @see Zend_Crypt_Math + */ + require_once 'Zend/Crypt/Math.php'; + $this->_math = new Zend_Crypt_Math($extension); + } + + /** + * In the event a private number/key has not been set by the user, + * or generated by ext/openssl, a best attempt will be made to + * generate a random key. Having a random number generator installed + * on linux/bsd is highly recommended! The alternative is not recommended + * for production unless without any other option. + * + * @return string + */ + protected function _generatePrivateKey() + { + $rand = $this->_math->rand($this->getGenerator(), $this->getPrime()); + return $rand; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Crypt/DiffieHellman/Exception.php b/lib/zend/Zend/Crypt/DiffieHellman/Exception.php new file mode 100644 index 0000000000..172d37fdf0 --- /dev/null +++ b/lib/zend/Zend/Crypt/DiffieHellman/Exception.php @@ -0,0 +1,36 @@ +80 using internal algo) + * @todo Check if mhash() is a required alternative (will be PECL-only soon) + * @category Zend + * @package Zend_Crypt + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Crypt_Hmac extends Zend_Crypt +{ + + /** + * The key to use for the hash + * + * @var string + */ + protected static $_key = null; + + /** + * pack() format to be used for current hashing method + * + * @var string + */ + protected static $_packFormat = null; + + /** + * Hashing algorithm; can be the md5/sha1 functions or any algorithm name + * listed in the output of PHP 5.1.2+ hash_algos(). + * + * @var string + */ + protected static $_hashAlgorithm = 'md5'; + + /** + * List of algorithms supported my mhash() + * + * @var array + */ + protected static $_supportedMhashAlgorithms = array('adler32',' crc32', 'crc32b', 'gost', + 'haval128', 'haval160', 'haval192', 'haval256', 'md4', 'md5', 'ripemd160', + 'sha1', 'sha256', 'tiger', 'tiger128', 'tiger160'); + + /** + * Constants representing the output mode of the hash algorithm + */ + const STRING = 'string'; + const BINARY = 'binary'; + + /** + * Performs a HMAC computation given relevant details such as Key, Hashing + * algorithm, the data to compute MAC of, and an output format of String, + * Binary notation or BTWOC. + * + * @param string $key + * @param string $hash + * @param string $data + * @param string $output + * @param boolean $internal + * @return string + */ + public static function compute($key, $hash, $data, $output = self::STRING) + { + // set the key + if (!isset($key) || empty($key)) { + require_once 'Zend/Crypt/Hmac/Exception.php'; + throw new Zend_Crypt_Hmac_Exception('provided key is null or empty'); + } + self::$_key = $key; + + // set the hash + self::_setHashAlgorithm($hash); + + // perform hashing and return + return self::_hash($data, $output); + } + + /** + * Setter for the hash method. + * + * @param string $hash + * @return Zend_Crypt_Hmac + */ + protected static function _setHashAlgorithm($hash) + { + if (!isset($hash) || empty($hash)) { + require_once 'Zend/Crypt/Hmac/Exception.php'; + throw new Zend_Crypt_Hmac_Exception('provided hash string is null or empty'); + } + + $hash = strtolower($hash); + $hashSupported = false; + + if (function_exists('hash_algos') && in_array($hash, hash_algos())) { + $hashSupported = true; + } + + if ($hashSupported === false && function_exists('mhash') && in_array($hash, self::$_supportedAlgosMhash)) { + $hashSupported = true; + } + + if ($hashSupported === false) { + require_once 'Zend/Crypt/Hmac/Exception.php'; + throw new Zend_Crypt_Hmac_Exception('hash algorithm provided is not supported on this PHP installation; please enable the hash or mhash extensions'); + } + self::$_hashAlgorithm = $hash; + } + + /** + * Perform HMAC and return the keyed data + * + * @param string $data + * @param string $output + * @param bool $internal Option to not use hash() functions for testing + * @return string + */ + protected static function _hash($data, $output = self::STRING, $internal = false) + { + if (function_exists('hash_hmac')) { + if ($output == self::BINARY) { + return hash_hmac(self::$_hashAlgorithm, $data, self::$_key, 1); + } + return hash_hmac(self::$_hashAlgorithm, $data, self::$_key); + } + + if (function_exists('mhash')) { + if ($output == self::BINARY) { + return mhash(self::_getMhashDefinition(self::$_hashAlgorithm), $data, self::$_key); + } + $bin = mhash(self::_getMhashDefinition(self::$_hashAlgorithm), $data, self::$_key); + return bin2hex($bin); + } + } + + /** + * Since MHASH accepts an integer constant representing the hash algorithm + * we need to make a small detour to get the correct integer matching our + * algorithm's name. + * + * @param string $hashAlgorithm + * @return integer + */ + protected static function _getMhashDefinition($hashAlgorithm) + { + for ($i = 0; $i <= mhash_count(); $i++) + { + $types[mhash_get_hash_name($i)] = $i; + } + return $types[strtoupper($hashAlgorithm)]; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Crypt/Hmac/Exception.php b/lib/zend/Zend/Crypt/Hmac/Exception.php new file mode 100644 index 0000000000..1431bf80cd --- /dev/null +++ b/lib/zend/Zend/Crypt/Hmac/Exception.php @@ -0,0 +1,36 @@ + 127) { + return "\x00" . $long; + } + return $long; + } + + /** + * Translate a binary form into a big integer string + * + * @param string $binary + * @return string + */ + public function fromBinary($binary) { + return $this->_math->binaryToInteger($binary); + } + + /** + * Translate a big integer string into a binary form + * + * @param string $integer + * @return string + */ + public function toBinary($integer) + { + return $this->_math->integerToBinary($integer); + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Crypt/Math/BigInteger.php b/lib/zend/Zend/Crypt/Math/BigInteger.php new file mode 100644 index 0000000000..183cbd4650 --- /dev/null +++ b/lib/zend/Zend/Crypt/Math/BigInteger.php @@ -0,0 +1,117 @@ +_loadAdapter($extension); + } + + /** + * Redirect all public method calls to the wrapped extension object. + * + * @param string $methodName + * @param array $args + * @throws Zend_Crypt_Math_BigInteger_Exception + */ + public function __call($methodName, $args) + { + if(!method_exists($this->_math, $methodName)) { + require_once 'Zend/Crypt/Math/BigInteger/Exception.php'; + throw new Zend_Crypt_Math_BigInteger_Exception('invalid method call: ' . get_class($this->_math) . '::' . $methodName . '() does not exist'); + } + return call_user_func_array(array($this->_math, $methodName), $args); + } + + /** + * @param string $extension + * @throws Zend_Crypt_Math_BigInteger_Exception + */ + protected function _loadAdapter($extension = null) + { + if (is_null($extension)) { + if (extension_loaded('gmp')) { + $extension = 'gmp'; + //} elseif (extension_loaded('big_int')) { + // $extension = 'big_int'; + } else { + $extension = 'bcmath'; + } + } + if($extension == 'gmp' && extension_loaded('gmp')) { + require_once 'Zend/Crypt/Math/BigInteger/Gmp.php'; + $this->_math = new Zend_Crypt_Math_BigInteger_Gmp(); + //} elseif($extension == 'bigint' && extension_loaded('big_int')) { + // require_once 'Zend/Crypt_Math/BigInteger/Bigint.php'; + // $this->_math = new Zend_Crypt_Math_BigInteger_Bigint(); + } elseif ($extension == 'bcmath') { + require_once 'Zend/Crypt/Math/BigInteger/Bcmath.php'; + $this->_math = new Zend_Crypt_Math_BigInteger_Bcmath(); + } else { + require_once 'Zend/Crypt/Math/BigInteger/Exception.php'; + throw new Zend_Crypt_Math_BigInteger_Exception($extension . ' big integer precision math support not detected'); + } + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Crypt/Math/BigInteger/Bcmath.php b/lib/zend/Zend/Crypt/Math/BigInteger/Bcmath.php new file mode 100644 index 0000000000..7b6e8173b3 --- /dev/null +++ b/lib/zend/Zend/Crypt/Math/BigInteger/Bcmath.php @@ -0,0 +1,203 @@ + 0) { + $return = chr(bcmod($operand, 256)) . $return; + $operand = bcdiv($operand, 256); + } + if (ord($return[0]) > 127) { + $return = chr(0) . $return; + } + return $return; + } + + /**public function integerToBinary($operand) + { + $return = ''; + while(bccomp($operand, '0')) { + $return .= chr(bcmod($operand, '256')); + $operand = bcdiv($operand, '256'); + } + return $return; + }**/ // Prior version for referenced offset + + + public function hexToDecimal($operand) + { + $return = '0'; + while(strlen($hex)) { + $hex = hexdec(substr($operand, 0, 4)); + $dec = bcadd(bcmul($return, 65536), $hex); + $operand = substr($operand, 4); + } + return $return; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Crypt/Math/BigInteger/Exception.php b/lib/zend/Zend/Crypt/Math/BigInteger/Exception.php new file mode 100644 index 0000000000..aaac212c84 --- /dev/null +++ b/lib/zend/Zend/Crypt/Math/BigInteger/Exception.php @@ -0,0 +1,36 @@ + '7') { + $bigInt = '00' . $bigInt; + } + $return = pack("H*", $bigInt); + return $return; + } + + + public function hexToDecimal($operand) + { + $return = '0'; + while(strlen($hex)) { + $hex = hexdec(substr($operand, 0, 4)); + $dec = gmp_add(gmp_mul($return, 65536), $hex); + $operand = substr($operand, 4); + } + return $return; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Crypt/Math/BigInteger/Interface.php b/lib/zend/Zend/Crypt/Math/BigInteger/Interface.php new file mode 100644 index 0000000000..0e579572a8 --- /dev/null +++ b/lib/zend/Zend/Crypt/Math/BigInteger/Interface.php @@ -0,0 +1,51 @@ +setOptions($options); + } + } + + public function setOptions(array $options) + { + if (isset($options['passPhrase'])) { + $this->_passPhrase = $options['passPhrase']; + } + foreach ($options as $option=>$value) { + switch ($option) { + case 'pemString': + $this->setPemString($value); + break; + case 'pemPath': + $this->setPemPath($value); + break; + case 'certificateString': + $this->setCertificateString($value); + break; + case 'certificatePath': + $this->setCertificatePath($value); + break; + case 'hashAlgorithm': + $this->setHashAlgorithm($value); + break; + } + } + } + + public function getPrivateKey() + { + return $this->_privateKey; + } + + public function getPublicKey() + { + return $this->_publicKey; + } + + /** + * @param string $data + * @param Zend_Crypt_Rsa_Key_Private $privateKey + * @param string $format + * @return string + */ + public function sign($data, Zend_Crypt_Rsa_Key_Private $privateKey = null, $format = null) + { + $signature = ''; + if (isset($privateKey)) { + $opensslKeyResource = $privateKey->getOpensslKeyResource(); + } else { + $opensslKeyResource = $this->_privateKey->getOpensslKeyResource(); + } + $result = openssl_sign( + $data, $signature, + $opensslKeyResource, + $this->getHashAlgorithm() + ); + if ($format == self::BASE64) { + return base64_encode($signature); + } + return $signature; + } + + /** + * @param string $data + * @param string $signature + * @param string $format + * @return string + */ + public function verifySignature($data, $signature, $format = null) + { + if ($format == self::BASE64) { + $signature = base64_decode($signature); + } + $result = openssl_verify($data, $signature, + $this->getPublicKey()->getOpensslKeyResource(), + $this->getHashAlgorithm()); + return $result; + } + + /** + * @param string $data + * @param Zend_Crypt_Rsa_Key $key + * @param string $format + * @return string + */ + public function encrypt($data, Zend_Crypt_Rsa_Key $key, $format = null) + { + $encrypted = ''; + $function = 'openssl_public_encrypt'; + if ($key instanceof Zend_Crypt_Rsa_Key_Private) { + $function = 'openssl_private_encrypt'; + } + $function($data, $encrypted, $key->getOpensslKeyResource()); + if ($format == self::BASE64) { + return base64_encode($encrypted); + } + return $encrypted; + } + + /** + * @param string $data + * @param Zend_Crypt_Rsa_Key $key + * @param string $format + * @return string + */ + public function decrypt($data, Zend_Crypt_Rsa_Key $key, $format = null) + { + $decrypted = ''; + if ($format == self::BASE64) { + $data = base64_decode($data); + } + $function = 'openssl_private_decrypt'; + if ($key instanceof Zend_Crypt_Rsa_Key_Public) { + $function = 'openssl_public_decrypt'; + } + $function($data, $decrypted, $key->getOpensslKeyResource()); + return $decrypted; + } + + public function generateKeys(array $configargs = null) + { + $config = null; + $passPhrase = null; + if (!is_null($configargs)) { + if (isset($configargs['passPhrase'])) { + $passPhrase = $configargs['passPhrase']; + unset($configargs['passPhrase']); + } + $config = $this->_parseConfigArgs($configargs); + } + $privateKey = null; + $publicKey = null; + $resource = openssl_pkey_new($config); + // above fails on PHP 5.3 + openssl_pkey_export($resource, $private, $passPhrase); + $privateKey = new Zend_Crypt_Rsa_Key_Private($private, $passPhrase); + $details = openssl_pkey_get_details($resource); + $publicKey = new Zend_Crypt_Rsa_Key_Public($details['key']); + $return = new ArrayObject(array( + 'privateKey'=>$privateKey, + 'publicKey'=>$publicKey + ), ArrayObject::ARRAY_AS_PROPS); + return $return; + } + + /** + * @param string $value + */ + public function setPemString($value) + { + $this->_pemString = $value; + $this->_privateKey = new Zend_Crypt_Rsa_Key_Private($this->_pemString, $this->_passPhrase); + $this->_publicKey = $this->_privateKey->getPublicKey(); + } + + public function setPemPath($value) + { + $this->_pemPath = $value; + $this->setPemString(file_get_contents($this->_pemPath)); + } + + public function setCertificateString($value) + { + $this->_certificateString = $value; + $this->_publicKey = new Zend_Crypt_Rsa_Key_Public($this->_certificateString, $this->_passPhrase); + } + + public function setCertificatePath($value) + { + $this->_certificatePath = $value; + $this->setCertificateString(file_get_contents($this->_certificatePath)); + } + + public function setHashAlgorithm($name) + { + switch ($name) { + case 'md2': + $this->_hashAlgorithm = OPENSSL_ALGO_MD2; + break; + case 'md4': + $this->_hashAlgorithm = OPENSSL_ALGO_MD4; + break; + case 'md5': + $this->_hashAlgorithm = OPENSSL_ALGO_MD5; + break; + } + } + + /** + * @return string + */ + public function getPemString() + { + return $this->_pemString; + } + + public function getPemPath() + { + return $this->_pemPath; + } + + public function getCertificateString() + { + return $this->_certificateString; + } + + public function getCertificatePath() + { + return $this->_certificatePath; + } + + public function getHashAlgorithm() + { + return $this->_hashAlgorithm; + } + + protected function _parseConfigArgs(array $config = null) + { + $configs = array(); + if (isset($config['privateKeyBits'])) { + $configs['private_key_bits'] = $config['privateKeyBits']; + } + if (!empty($configs)) { + return $configs; + } + return null; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Crypt/Rsa/Key.php b/lib/zend/Zend/Crypt/Rsa/Key.php new file mode 100644 index 0000000000..d8f7e2c5c9 --- /dev/null +++ b/lib/zend/Zend/Crypt/Rsa/Key.php @@ -0,0 +1,95 @@ +_opensslKeyResource; + } + + /** + * @return string + * @throws Zend_Crypt_Exception + */ + public function toString() + { + if (!empty($this->_pemString)) { + return $this->_pemString; + } elseif (!empty($this->_certificateString)) { + return $this->_certificateString; + } + /** + * @see Zend_Crypt_Exception + */ + require_once 'Zend/Crypt/Exception.php'; + throw new Zend_Crypt_Exception('No public key string representation is available'); + } + + /** + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + public function count() + { + return $this->_details['bits']; + } + + public function getType() + { + return $this->_details['type']; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Crypt/Rsa/Key/Private.php b/lib/zend/Zend/Crypt/Rsa/Key/Private.php new file mode 100644 index 0000000000..b4d2141fb6 --- /dev/null +++ b/lib/zend/Zend/Crypt/Rsa/Key/Private.php @@ -0,0 +1,75 @@ +_pemString = $pemString; + $this->_parse($passPhrase); + } + + /** + * @param string $passPhrase + * @throws Zend_Crypt_Exception + */ + protected function _parse($passPhrase) + { + $result = openssl_get_privatekey($this->_pemString, $passPhrase); + if (!$result) { + /** + * @see Zend_Crypt_Exception + */ + require_once 'Zend/Crypt/Exception.php'; + throw new Zend_Crypt_Exception('Unable to load private key'); + } + $this->_opensslKeyResource = $result; + $this->_details = openssl_pkey_get_details($this->_opensslKeyResource); + } + + public function getPublicKey() + { + if (is_null($this->_publicKey)) { + /** + * @see Zend_Crypt_Rsa_Key_Public + */ + require_once 'Zend/Crypt/Rsa/Key/Public.php'; + $this->_publicKey = new Zend_Crypt_Rsa_Key_Public($this->_details['key']); + } + return $this->_publicKey; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Crypt/Rsa/Key/Public.php b/lib/zend/Zend/Crypt/Rsa/Key/Public.php new file mode 100644 index 0000000000..f8afe9dde3 --- /dev/null +++ b/lib/zend/Zend/Crypt/Rsa/Key/Public.php @@ -0,0 +1,74 @@ +_parse($string); + } + + /** + * @param string $string + * @throws Zend_Crypt_Exception + */ + protected function _parse($string) + { + if (preg_match("/^-----BEGIN CERTIFICATE-----/", $string)) { + $this->_certificateString = $string; + } else { + $this->_pemString = $string; + } + $result = openssl_get_publickey($string); + if (!$result) { + /** + * @see Zend_Crypt_Exception + */ + require_once 'Zend/Crypt/Exception.php'; + throw new Zend_Crypt_Exception('Unable to load public key'); + } + //openssl_pkey_export($result, $public); + //$this->_pemString = $public; + $this->_opensslKeyResource = $result; + $this->_details = openssl_pkey_get_details($this->_opensslKeyResource); + } + + public function getCertificate() + { + return $this->_certificateString; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Currency/Exception.php b/lib/zend/Zend/Currency/Exception.php new file mode 100644 index 0000000000..caabf26b32 --- /dev/null +++ b/lib/zend/Zend/Currency/Exception.php @@ -0,0 +1,37 @@ +_offset; + $gmtstr = ($gmt === true) ? 0 : $this->getGmtOffset(); $output .= sprintf('%s%04d', ($gmtstr <= 0) ? '+' : '-', abs($gmtstr) / 36); break; case 'P': // difference to GMT with colon - $gmtstr = ($gmt === true) ? 0 : $this->_offset; + $gmtstr = ($gmt === true) ? 0 : $this->getGmtOffset(); $gmtstr = sprintf('%s%04d', ($gmtstr <= 0) ? '+' : '-', abs($gmtstr) / 36); $output = $output . substr($gmtstr, 0, 3) . ':' . substr($gmtstr, 3); break; @@ -555,13 +555,13 @@ abstract class Zend_Date_DateObject { break; case 'Z': // timezone offset in seconds - $output .= ($gmt === true) ? 0 : -$this->_offset; + $output .= ($gmt === true) ? 0 : -$this->getGmtOffset(); break; // complete time formats case 'c': // ISO 8601 date format - $difference = $this->_offset; + $difference = $this->getGmtOffset(); $difference = sprintf('%s%04d', ($difference <= 0) ? '+' : '-', abs($difference) / 36); $output .= $date['year'] . '-' . (($date['mon'] < 10) ? '0' . $date['mon'] : $date['mon']) . '-' @@ -573,7 +573,7 @@ abstract class Zend_Date_DateObject { break; case 'r': // RFC 2822 date format - $difference = $this->_offset; + $difference = $this->getGmtOffset(); $difference = sprintf('%s%04d', ($difference <= 0) ? '+' : '-', abs($difference) / 36); $output .= gmdate('D', 86400 * (3 + self::dayOfWeek($date['year'], $date['mon'], $date['mday']))) . ', ' . (($date['mday'] < 10) ? '0' . $date['mday'] : $date['mday']) . ' ' @@ -658,13 +658,13 @@ abstract class Zend_Date_DateObject { { // actual timestamp - if ($timestamp === null) { + if (!is_numeric($timestamp)) { return getdate(); } // 32bit timestamp if (abs($timestamp) <= 0x7FFFFFFF) { - return @getdate($timestamp); + return @getdate((int) $timestamp); } if (isset(self::$_cache)) { @@ -895,10 +895,10 @@ abstract class Zend_Date_DateObject { if (abs($this->_unixTimestamp) <= 0x7FFFFFFF) { if ($rise === false) { return date_sunset($this->_unixTimestamp, SUNFUNCS_RET_TIMESTAMP, $location['latitude'], - $location['longitude'], 90 + $horizon, $this->_offset / 3600); + $location['longitude'], 90 + $horizon, $this->getGmtOffset() / 3600); } return date_sunrise($this->_unixTimestamp, SUNFUNCS_RET_TIMESTAMP, $location['latitude'], - $location['longitude'], 90 + $horizon, $this->_offset / 3600); + $location['longitude'], 90 + $horizon, $this->getGmtOffset() / 3600); } // self calculation - timestamp bigger than 32bit @@ -1041,6 +1041,17 @@ abstract class Zend_Date_DateObject { */ public function getGmtOffset() { - return $this->_offset; + $date = $this->getDateParts($this->getUnixTimestamp(), true); + $zone = @date_default_timezone_get(); + $result = @date_default_timezone_set($this->_timezone); + if ($result === true) { + $offset = $this->mktime($date['hours'], $date['minutes'], $date['seconds'], + $date['mon'], $date['mday'], $date['year'], false) + - $this->mktime($date['hours'], $date['minutes'], $date['seconds'], + $date['mon'], $date['mday'], $date['year'], true); + } + date_default_timezone_set($zone); + + return $offset; } } diff --git a/lib/zend/Zend/Date/Exception.php b/lib/zend/Zend/Date/Exception.php index 1aaf196c26..0d2998615b 100644 --- a/lib/zend/Zend/Date/Exception.php +++ b/lib/zend/Zend/Date/Exception.php @@ -14,7 +14,7 @@ * * @category Zend * @package Zend_Date - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @version $Id$ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -29,7 +29,7 @@ require_once 'Zend/Exception.php'; /** * @category Zend * @package Zend_Date - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Date_Exception extends Zend_Exception diff --git a/lib/zend/Zend/Db/Adapter/Abstract.php b/lib/zend/Zend/Db/Adapter/Abstract.php new file mode 100644 index 0000000000..b34e5da386 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Abstract.php @@ -0,0 +1,1252 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE + ); + + /** Weither or not that object can get serialized + * + * @var bool + */ + protected $_allowSerialization = true; + + /** + * Weither or not the database should be reconnected + * to that adapter when waking up + * + * @var bool + */ + protected $_autoReconnectOnUnserialize = false; + + /** + * Constructor. + * + * $config is an array of key/value pairs or an instance of Zend_Config + * containing configuration options. These options are common to most adapters: + * + * dbname => (string) The name of the database to user + * username => (string) Connect to the database as this username. + * password => (string) Password associated with the username. + * host => (string) What host to connect to, defaults to localhost + * + * Some options are used on a case-by-case basis by adapters: + * + * port => (string) The port of the database + * persistent => (boolean) Whether to use a persistent connection or not, defaults to false + * protocol => (string) The network protocol, defaults to TCPIP + * caseFolding => (int) style of case-alteration used for identifiers + * + * @param array|Zend_Config $config An array or instance of Zend_Config having configuration data + * @throws Zend_Db_Adapter_Exception + */ + public function __construct($config) + { + /* + * Verify that adapter parameters are in an array. + */ + if (!is_array($config)) { + /* + * Convert Zend_Config argument to a plain array. + */ + if ($config instanceof Zend_Config) { + $config = $config->toArray(); + } else { + /** + * @see Zend_Db_Exception + */ + require_once 'Zend/Db/Exception.php'; + throw new Zend_Db_Exception('Adapter parameters must be in an array or a Zend_Config object'); + } + } + + $this->_checkRequiredOptions($config); + + $options = array( + Zend_Db::CASE_FOLDING => $this->_caseFolding, + Zend_Db::AUTO_QUOTE_IDENTIFIERS => $this->_autoQuoteIdentifiers + ); + $driverOptions = array(); + + /* + * normalize the config and merge it with the defaults + */ + if (array_key_exists('options', $config)) { + // can't use array_merge() because keys might be integers + foreach ((array) $config['options'] as $key => $value) { + $options[$key] = $value; + } + } + if (array_key_exists('driver_options', $config)) { + if (!empty($config['driver_options'])) { + // can't use array_merge() because keys might be integers + foreach ((array) $config['driver_options'] as $key => $value) { + $driverOptions[$key] = $value; + } + } + } + + if (!isset($config['charset'])) { + $config['charset'] = null; + } + + if (!isset($config['persistent'])) { + $config['persistent'] = false; + } + + $this->_config = array_merge($this->_config, $config); + $this->_config['options'] = $options; + $this->_config['driver_options'] = $driverOptions; + + + // obtain the case setting, if there is one + if (array_key_exists(Zend_Db::CASE_FOLDING, $options)) { + $case = (int) $options[Zend_Db::CASE_FOLDING]; + switch ($case) { + case Zend_Db::CASE_LOWER: + case Zend_Db::CASE_UPPER: + case Zend_Db::CASE_NATURAL: + $this->_caseFolding = $case; + break; + default: + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception('Case must be one of the following constants: ' + . 'Zend_Db::CASE_NATURAL, Zend_Db::CASE_LOWER, Zend_Db::CASE_UPPER'); + } + } + + // obtain quoting property if there is one + if (array_key_exists(Zend_Db::AUTO_QUOTE_IDENTIFIERS, $options)) { + $this->_autoQuoteIdentifiers = (bool) $options[Zend_Db::AUTO_QUOTE_IDENTIFIERS]; + } + + // obtain allow serialization property if there is one + if (array_key_exists(Zend_Db::ALLOW_SERIALIZATION, $options)) { + $this->_allowSerialization = (bool) $options[Zend_Db::ALLOW_SERIALIZATION]; + } + + // obtain auto reconnect on unserialize property if there is one + if (array_key_exists(Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE, $options)) { + $this->_autoReconnectOnUnserialize = (bool) $options[Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE]; + } + + // create a profiler object + $profiler = false; + if (array_key_exists(Zend_Db::PROFILER, $this->_config)) { + $profiler = $this->_config[Zend_Db::PROFILER]; + unset($this->_config[Zend_Db::PROFILER]); + } + $this->setProfiler($profiler); + } + + /** + * Check for config options that are mandatory. + * Throw exceptions if any are missing. + * + * @param array $config + * @throws Zend_Db_Adapter_Exception + */ + protected function _checkRequiredOptions(array $config) + { + // we need at least a dbname + if (! array_key_exists('dbname', $config)) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance"); + } + + if (! array_key_exists('password', $config)) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'password' for login credentials"); + } + + if (! array_key_exists('username', $config)) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'username' for login credentials"); + } + } + + /** + * Returns the underlying database connection object or resource. + * If not presently connected, this initiates the connection. + * + * @return object|resource|null + */ + public function getConnection() + { + $this->_connect(); + return $this->_connection; + } + + /** + * Returns the configuration variables in this adapter. + * + * @return array + */ + public function getConfig() + { + return $this->_config; + } + + /** + * Set the adapter's profiler object. + * + * The argument may be a boolean, an associative array, an instance of + * Zend_Db_Profiler, or an instance of Zend_Config. + * + * A boolean argument sets the profiler to enabled if true, or disabled if + * false. The profiler class is the adapter's default profiler class, + * Zend_Db_Profiler. + * + * An instance of Zend_Db_Profiler sets the adapter's instance to that + * object. The profiler is enabled and disabled separately. + * + * An associative array argument may contain any of the keys 'enabled', + * 'class', and 'instance'. The 'enabled' and 'instance' keys correspond to the + * boolean and object types documented above. The 'class' key is used to name a + * class to use for a custom profiler. The class must be Zend_Db_Profiler or a + * subclass. The class is instantiated with no constructor arguments. The 'class' + * option is ignored when the 'instance' option is supplied. + * + * An object of type Zend_Config may contain the properties 'enabled', 'class', and + * 'instance', just as if an associative array had been passed instead. + * + * @param Zend_Db_Profiler|Zend_Config|array|boolean $profiler + * @return Zend_Db_Adapter_Abstract Provides a fluent interface + * @throws Zend_Db_Profiler_Exception if the object instance or class specified + * is not Zend_Db_Profiler or an extension of that class. + */ + public function setProfiler($profiler) + { + $enabled = null; + $profilerClass = $this->_defaultProfilerClass; + $profilerInstance = null; + + if ($profilerIsObject = is_object($profiler)) { + if ($profiler instanceof Zend_Db_Profiler) { + $profilerInstance = $profiler; + } else if ($profiler instanceof Zend_Config) { + $profiler = $profiler->toArray(); + } else { + /** + * @see Zend_Db_Profiler_Exception + */ + require_once 'Zend/Db/Profiler/Exception.php'; + throw new Zend_Db_Profiler_Exception('Profiler argument must be an instance of either Zend_Db_Profiler' + . ' or Zend_Config when provided as an object'); + } + } + + if (is_array($profiler)) { + if (isset($profiler['enabled'])) { + $enabled = (bool) $profiler['enabled']; + } + if (isset($profiler['class'])) { + $profilerClass = $profiler['class']; + } + if (isset($profiler['instance'])) { + $profilerInstance = $profiler['instance']; + } + } else if (!$profilerIsObject) { + $enabled = (bool) $profiler; + } + + if ($profilerInstance === null) { + if (!class_exists($profilerClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($profilerClass); + } + $profilerInstance = new $profilerClass(); + } + + if (!$profilerInstance instanceof Zend_Db_Profiler) { + /** @see Zend_Db_Profiler_Exception */ + require_once 'Zend/Db/Profiler/Exception.php'; + throw new Zend_Db_Profiler_Exception('Class ' . get_class($profilerInstance) . ' does not extend ' + . 'Zend_Db_Profiler'); + } + + if (null !== $enabled) { + $profilerInstance->setEnabled($enabled); + } + + $this->_profiler = $profilerInstance; + + return $this; + } + + + /** + * Returns the profiler for this adapter. + * + * @return Zend_Db_Profiler + */ + public function getProfiler() + { + return $this->_profiler; + } + + /** + * Get the default statement class. + * + * @return string + */ + public function getStatementClass() + { + return $this->_defaultStmtClass; + } + + /** + * Set the default statement class. + * + * @return Zend_Db_Adapter_Abstract Fluent interface + */ + public function setStatementClass($class) + { + $this->_defaultStmtClass = $class; + return $this; + } + + /** + * Prepares and executes an SQL statement with bound data. + * + * @param mixed $sql The SQL statement with placeholders. + * May be a string or Zend_Db_Select. + * @param mixed $bind An array of data to bind to the placeholders. + * @return Zend_Db_Statement_Interface + */ + public function query($sql, $bind = array()) + { + // connect to the database if needed + $this->_connect(); + + // is the $sql a Zend_Db_Select object? + if ($sql instanceof Zend_Db_Select) { + if (empty($bind)) { + $bind = $sql->getBind(); + } + + $sql = $sql->assemble(); + } + + // make sure $bind to an array; + // don't use (array) typecasting because + // because $bind may be a Zend_Db_Expr object + if (!is_array($bind)) { + $bind = array($bind); + } + + // prepare and execute the statement with profiling + $stmt = $this->prepare($sql); + $stmt->execute($bind); + + // return the results embedded in the prepared statement object + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Leave autocommit mode and begin a transaction. + * + * @return Zend_Db_Adapter_Abstract + */ + public function beginTransaction() + { + $this->_connect(); + $q = $this->_profiler->queryStart('begin', Zend_Db_Profiler::TRANSACTION); + $this->_beginTransaction(); + $this->_profiler->queryEnd($q); + return $this; + } + + /** + * Commit a transaction and return to autocommit mode. + * + * @return Zend_Db_Adapter_Abstract + */ + public function commit() + { + $this->_connect(); + $q = $this->_profiler->queryStart('commit', Zend_Db_Profiler::TRANSACTION); + $this->_commit(); + $this->_profiler->queryEnd($q); + return $this; + } + + /** + * Roll back a transaction and return to autocommit mode. + * + * @return Zend_Db_Adapter_Abstract + */ + public function rollBack() + { + $this->_connect(); + $q = $this->_profiler->queryStart('rollback', Zend_Db_Profiler::TRANSACTION); + $this->_rollBack(); + $this->_profiler->queryEnd($q); + return $this; + } + + /** + * Inserts a table row with specified data. + * + * @param mixed $table The table to insert data into. + * @param array $bind Column-value pairs. + * @return int The number of affected rows. + */ + public function insert($table, array $bind) + { + // extract and quote col names from the array keys + $cols = array(); + $vals = array(); + foreach ($bind as $col => $val) { + $cols[] = $this->quoteIdentifier($col, true); + if ($val instanceof Zend_Db_Expr) { + $vals[] = $val->__toString(); + unset($bind[$col]); + } else { + $vals[] = '?'; + } + } + + // build the statement + $sql = "INSERT INTO " + . $this->quoteIdentifier($table, true) + . ' (' . implode(', ', $cols) . ') ' + . 'VALUES (' . implode(', ', $vals) . ')'; + + // execute the statement and return the number of affected rows + $stmt = $this->query($sql, array_values($bind)); + $result = $stmt->rowCount(); + return $result; + } + + /** + * Updates table rows with specified data based on a WHERE clause. + * + * @param mixed $table The table to update. + * @param array $bind Column-value pairs. + * @param mixed $where UPDATE WHERE clause(s). + * @return int The number of affected rows. + */ + public function update($table, array $bind, $where = '') + { + /** + * Build "col = ?" pairs for the statement, + * except for Zend_Db_Expr which is treated literally. + */ + $set = array(); + $i = 0; + foreach ($bind as $col => $val) { + if ($val instanceof Zend_Db_Expr) { + $val = $val->__toString(); + unset($bind[$col]); + } else { + if ($this->supportsParameters('positional')) { + $val = '?'; + } else { + if ($this->supportsParameters('named')) { + unset($bind[$col]); + $bind[':'.$col.$i] = $val; + $val = ':'.$col.$i; + $i++; + } else { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding"); + } + } + } + $set[] = $this->quoteIdentifier($col, true) . ' = ' . $val; + } + + $where = $this->_whereExpr($where); + + /** + * Build the UPDATE statement + */ + $sql = "UPDATE " + . $this->quoteIdentifier($table, true) + . ' SET ' . implode(', ', $set) + . (($where) ? " WHERE $where" : ''); + + /** + * Execute the statement and return the number of affected rows + */ + if ($this->supportsParameters('positional')) { + $stmt = $this->query($sql, array_values($bind)); + } else { + $stmt = $this->query($sql, $bind); + } + $result = $stmt->rowCount(); + return $result; + } + + /** + * Deletes table rows based on a WHERE clause. + * + * @param mixed $table The table to update. + * @param mixed $where DELETE WHERE clause(s). + * @return int The number of affected rows. + */ + public function delete($table, $where = '') + { + $where = $this->_whereExpr($where); + + /** + * Build the DELETE statement + */ + $sql = "DELETE FROM " + . $this->quoteIdentifier($table, true) + . (($where) ? " WHERE $where" : ''); + + /** + * Execute the statement and return the number of affected rows + */ + $stmt = $this->query($sql); + $result = $stmt->rowCount(); + return $result; + } + + /** + * Convert an array, string, or Zend_Db_Expr object + * into a string to put in a WHERE clause. + * + * @param mixed $where + * @return string + */ + protected function _whereExpr($where) + { + if (empty($where)) { + return $where; + } + if (!is_array($where)) { + $where = array($where); + } + foreach ($where as $cond => &$term) { + // is $cond an int? (i.e. Not a condition) + if (is_int($cond)) { + // $term is the full condition + if ($term instanceof Zend_Db_Expr) { + $term = $term->__toString(); + } + } else { + // $cond is the condition with placeholder, + // and $term is quoted into the condition + $term = $this->quoteInto($cond, $term); + } + $term = '(' . $term . ')'; + } + + $where = implode(' AND ', $where); + return $where; + } + + /** + * Creates and returns a new Zend_Db_Select object for this adapter. + * + * @return Zend_Db_Select + */ + public function select() + { + return new Zend_Db_Select($this); + } + + /** + * Get the fetch mode. + * + * @return int + */ + public function getFetchMode() + { + return $this->_fetchMode; + } + + /** + * Fetches all SQL result rows as a sequential array. + * Uses the current fetchMode for the adapter. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @param mixed $fetchMode Override current fetch mode. + * @return array + */ + public function fetchAll($sql, $bind = array(), $fetchMode = null) + { + if ($fetchMode === null) { + $fetchMode = $this->_fetchMode; + } + $stmt = $this->query($sql, $bind); + $result = $stmt->fetchAll($fetchMode); + return $result; + } + + /** + * Fetches the first row of the SQL result. + * Uses the current fetchMode for the adapter. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @param mixed $fetchMode Override current fetch mode. + * @return array + */ + public function fetchRow($sql, $bind = array(), $fetchMode = null) + { + if ($fetchMode === null) { + $fetchMode = $this->_fetchMode; + } + $stmt = $this->query($sql, $bind); + $result = $stmt->fetch($fetchMode); + return $result; + } + + /** + * Fetches all SQL result rows as an associative array. + * + * The first column is the key, the entire row array is the + * value. You should construct the query to be sure that + * the first column contains unique values, or else + * rows with duplicate values in the first column will + * overwrite previous data. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @return array + */ + public function fetchAssoc($sql, $bind = array()) + { + $stmt = $this->query($sql, $bind); + $data = array(); + while ($row = $stmt->fetch(Zend_Db::FETCH_ASSOC)) { + $tmp = array_values(array_slice($row, 0, 1)); + $data[$tmp[0]] = $row; + } + return $data; + } + + /** + * Fetches the first column of all SQL result rows as an array. + * + * The first column in each row is used as the array key. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @return array + */ + public function fetchCol($sql, $bind = array()) + { + $stmt = $this->query($sql, $bind); + $result = $stmt->fetchAll(Zend_Db::FETCH_COLUMN, 0); + return $result; + } + + /** + * Fetches all SQL result rows as an array of key-value pairs. + * + * The first column is the key, the second column is the + * value. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @return array + */ + public function fetchPairs($sql, $bind = array()) + { + $stmt = $this->query($sql, $bind); + $data = array(); + while ($row = $stmt->fetch(Zend_Db::FETCH_NUM)) { + $data[$row[0]] = $row[1]; + } + return $data; + } + + /** + * Fetches the first column of the first row of the SQL result. + * + * @param string|Zend_Db_Select $sql An SQL SELECT statement. + * @param mixed $bind Data to bind into SELECT placeholders. + * @return string + */ + public function fetchOne($sql, $bind = array()) + { + $stmt = $this->query($sql, $bind); + $result = $stmt->fetchColumn(0); + return $result; + } + + /** + * Quote a raw string. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value)) { + return $value; + } elseif (is_float($value)) { + return sprintf('%F', $value); + } + return "'" . addcslashes($value, "\000\n\r\\'\"\032") . "'"; + } + + /** + * Safely quotes a value for an SQL statement. + * + * If an array is passed as the value, the array values are quoted + * and then returned as a comma-separated string. + * + * @param mixed $value The value to quote. + * @param mixed $type OPTIONAL the SQL datatype name, or constant, or null. + * @return mixed An SQL-safe quoted value (or string of separated values). + */ + public function quote($value, $type = null) + { + $this->_connect(); + + if ($value instanceof Zend_Db_Select) { + return '(' . $value->assemble() . ')'; + } + + if ($value instanceof Zend_Db_Expr) { + return $value->__toString(); + } + + if (is_array($value)) { + foreach ($value as &$val) { + $val = $this->quote($val, $type); + } + return implode(', ', $value); + } + + if ($type !== null && array_key_exists($type = strtoupper($type), $this->_numericDataTypes)) { + $quotedValue = '0'; + switch ($this->_numericDataTypes[$type]) { + case Zend_Db::INT_TYPE: // 32-bit integer + $quotedValue = (string) intval($value); + break; + case Zend_Db::BIGINT_TYPE: // 64-bit integer + // ANSI SQL-style hex literals (e.g. x'[\dA-F]+') + // are not supported here, because these are string + // literals, not numeric literals. + if (preg_match('/^( + [+-]? # optional sign + (?: + 0[Xx][\da-fA-F]+ # ODBC-style hexadecimal + |\d+ # decimal or octal, or MySQL ZEROFILL decimal + (?:[eE][+-]?\d+)? # optional exponent on decimals or octals + ) + )/x', + (string) $value, $matches)) { + $quotedValue = $matches[1]; + } + break; + case Zend_Db::FLOAT_TYPE: // float or decimal + $quotedValue = sprintf('%F', $value); + } + return $quotedValue; + } + + return $this->_quote($value); + } + + /** + * Quotes a value and places into a piece of text at a placeholder. + * + * The placeholder is a question-mark; all placeholders will be replaced + * with the quoted value. For example: + * + * + * $text = "WHERE date < ?"; + * $date = "2005-01-02"; + * $safe = $sql->quoteInto($text, $date); + * // $safe = "WHERE date < '2005-01-02'" + * + * + * @param string $text The text with a placeholder. + * @param mixed $value The value to quote. + * @param string $type OPTIONAL SQL datatype + * @param integer $count OPTIONAL count of placeholders to replace + * @return string An SQL-safe quoted value placed into the original text. + */ + public function quoteInto($text, $value, $type = null, $count = null) + { + if ($count === null) { + return str_replace('?', $this->quote($value, $type), $text); + } else { + while ($count > 0) { + if (strpos($text, '?') != false) { + $text = substr_replace($text, $this->quote($value, $type), strpos($text, '?'), 1); + } + --$count; + } + return $text; + } + } + + /** + * Quotes an identifier. + * + * Accepts a string representing a qualified indentifier. For Example: + * + * $adapter->quoteIdentifier('myschema.mytable') + * + * Returns: "myschema"."mytable" + * + * Or, an array of one or more identifiers that may form a qualified identifier: + * + * $adapter->quoteIdentifier(array('myschema','my.table')) + * + * Returns: "myschema"."my.table" + * + * The actual quote character surrounding the identifiers may vary depending on + * the adapter. + * + * @param string|array|Zend_Db_Expr $ident The identifier. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier. + */ + public function quoteIdentifier($ident, $auto=false) + { + return $this->_quoteIdentifierAs($ident, null, $auto); + } + + /** + * Quote a column identifier and alias. + * + * @param string|array|Zend_Db_Expr $ident The identifier or expression. + * @param string $alias An alias for the column. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier and alias. + */ + public function quoteColumnAs($ident, $alias, $auto=false) + { + return $this->_quoteIdentifierAs($ident, $alias, $auto); + } + + /** + * Quote a table identifier and alias. + * + * @param string|array|Zend_Db_Expr $ident The identifier or expression. + * @param string $alias An alias for the table. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier and alias. + */ + public function quoteTableAs($ident, $alias = null, $auto = false) + { + return $this->_quoteIdentifierAs($ident, $alias, $auto); + } + + /** + * Quote an identifier and an optional alias. + * + * @param string|array|Zend_Db_Expr $ident The identifier or expression. + * @param string $alias An optional alias. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @param string $as The string to add between the identifier/expression and the alias. + * @return string The quoted identifier and alias. + */ + protected function _quoteIdentifierAs($ident, $alias = null, $auto = false, $as = ' AS ') + { + if ($ident instanceof Zend_Db_Expr) { + $quoted = $ident->__toString(); + } elseif ($ident instanceof Zend_Db_Select) { + $quoted = '(' . $ident->assemble() . ')'; + } else { + if (is_string($ident)) { + $ident = explode('.', $ident); + } + if (is_array($ident)) { + $segments = array(); + foreach ($ident as $segment) { + if ($segment instanceof Zend_Db_Expr) { + $segments[] = $segment->__toString(); + } else { + $segments[] = $this->_quoteIdentifier($segment, $auto); + } + } + if ($alias !== null && end($ident) == $alias) { + $alias = null; + } + $quoted = implode('.', $segments); + } else { + $quoted = $this->_quoteIdentifier($ident, $auto); + } + } + if ($alias !== null) { + $quoted .= $as . $this->_quoteIdentifier($alias, $auto); + } + return $quoted; + } + + /** + * Quote an identifier. + * + * @param string $value The identifier or expression. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier and alias. + */ + protected function _quoteIdentifier($value, $auto=false) + { + if ($auto === false || $this->_autoQuoteIdentifiers === true) { + $q = $this->getQuoteIdentifierSymbol(); + return ($q . str_replace("$q", "$q$q", $value) . $q); + } + return $value; + } + + /** + * Returns the symbol the adapter uses for delimited identifiers. + * + * @return string + */ + public function getQuoteIdentifierSymbol() + { + return '"'; + } + + /** + * Return the most recent value from the specified sequence in the database. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function lastSequenceId($sequenceName) + { + return null; + } + + /** + * Generate a new value from the specified sequence in the database, and return it. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function nextSequenceId($sequenceName) + { + return null; + } + + /** + * Helper method to change the case of the strings used + * when returning result sets in FETCH_ASSOC and FETCH_BOTH + * modes. + * + * This is not intended to be used by application code, + * but the method must be public so the Statement class + * can invoke it. + * + * @param string $key + * @return string + */ + public function foldCase($key) + { + switch ($this->_caseFolding) { + case Zend_Db::CASE_LOWER: + $value = strtolower((string) $key); + break; + case Zend_Db::CASE_UPPER: + $value = strtoupper((string) $key); + break; + case Zend_Db::CASE_NATURAL: + default: + $value = (string) $key; + } + return $value; + } + + /** + * called when object is getting serialized + * This disconnects the DB object that cant be serialized + * + * @throws Zend_Db_Adapter_Exception + * @return array + */ + public function __sleep() + { + if ($this->_allowSerialization == false) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception(get_class($this) ." is not allowed to be serialized"); + } + $this->_connection = false; + return array_keys(array_diff_key(get_object_vars($this), array('_connection'=>false))); + } + + /** + * called when object is getting unserialized + * + * @return void + */ + public function __wakeup() + { + if ($this->_autoReconnectOnUnserialize == true) { + $this->getConnection(); + } + } + + /** + * Abstract Methods + */ + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + abstract public function listTables(); + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + abstract public function describeTable($tableName, $schemaName = null); + + /** + * Creates a connection to the database. + * + * @return void + */ + abstract protected function _connect(); + + /** + * Test if a connection is active + * + * @return boolean + */ + abstract public function isConnected(); + + /** + * Force the connection to close. + * + * @return void + */ + abstract public function closeConnection(); + + /** + * Prepare a statement and return a PDOStatement-like object. + * + * @param string|Zend_Db_Select $sql SQL query + * @return Zend_Db_Statement|PDOStatement + */ + abstract public function prepare($sql); + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + */ + abstract public function lastInsertId($tableName = null, $primaryKey = null); + + /** + * Begin a transaction. + */ + abstract protected function _beginTransaction(); + + /** + * Commit a transaction. + */ + abstract protected function _commit(); + + /** + * Roll-back a transaction. + */ + abstract protected function _rollBack(); + + /** + * Set the fetch mode. + * + * @param integer $mode + * @return void + * @throws Zend_Db_Adapter_Exception + */ + abstract public function setFetchMode($mode); + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param mixed $sql + * @param integer $count + * @param integer $offset + * @return string + */ + abstract public function limit($sql, $count, $offset = 0); + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + abstract public function supportsParameters($type); + + /** + * Retrieve server version in PHP style + * + * @return string + */ + abstract public function getServerVersion(); +} diff --git a/lib/zend/Zend/Db/Adapter/Db2.php b/lib/zend/Zend/Db/Adapter/Db2.php new file mode 100644 index 0000000000..47b9f72d8b --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Db2.php @@ -0,0 +1,832 @@ + (string) Connect to the database as this username. + * password => (string) Password associated with the username. + * host => (string) What host to connect to (default 127.0.0.1) + * dbname => (string) The name of the database to user + * protocol => (string) Protocol to use, defaults to "TCPIP" + * port => (integer) Port number to use for TCP/IP if protocol is "TCPIP" + * persistent => (boolean) Set TRUE to use a persistent connection (db2_pconnect) + * os => (string) This should be set to 'i5' if the db is on an os400/i5 + * schema => (string) The default schema the connection should use + * + * @var array + */ + protected $_config = array( + 'dbname' => null, + 'username' => null, + 'password' => null, + 'host' => 'localhost', + 'port' => '50000', + 'protocol' => 'TCPIP', + 'persistent' => false, + 'os' => null, + 'schema' => null + ); + + /** + * Execution mode + * + * @var int execution flag (DB2_AUTOCOMMIT_ON or DB2_AUTOCOMMIT_OFF) + */ + protected $_execute_mode = DB2_AUTOCOMMIT_ON; + + /** + * Default class name for a DB statement. + * + * @var string + */ + protected $_defaultStmtClass = 'Zend_Db_Statement_Db2'; + protected $_isI5 = false; + + /** + * Keys are UPPERCASE SQL datatypes or the constants + * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE. + * + * Values are: + * 0 = 32-bit integer + * 1 = 64-bit integer + * 2 = float or decimal + * + * @var array Associative array of datatypes to values 0, 1, or 2. + */ + protected $_numericDataTypes = array( + Zend_Db::INT_TYPE => Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INTEGER' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'NUMERIC' => Zend_Db::FLOAT_TYPE + ); + + /** + * Creates a connection resource. + * + * @return void + */ + protected function _connect() + { + if (is_resource($this->_connection)) { + // connection already exists + return; + } + + if (!extension_loaded('ibm_db2')) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception('The IBM DB2 extension is required for this adapter but the extension is not loaded'); + } + + $this->_determineI5(); + if ($this->_config['persistent']) { + // use persistent connection + $conn_func_name = 'db2_pconnect'; + } else { + // use "normal" connection + $conn_func_name = 'db2_connect'; + } + + if (!isset($this->_config['driver_options']['autocommit'])) { + // set execution mode + $this->_config['driver_options']['autocommit'] = &$this->_execute_mode; + } + + if (isset($this->_config['options'][Zend_Db::CASE_FOLDING])) { + $caseAttrMap = array( + Zend_Db::CASE_NATURAL => DB2_CASE_NATURAL, + Zend_Db::CASE_UPPER => DB2_CASE_UPPER, + Zend_Db::CASE_LOWER => DB2_CASE_LOWER + ); + $this->_config['driver_options']['DB2_ATTR_CASE'] = $caseAttrMap[$this->_config['options'][Zend_Db::CASE_FOLDING]]; + } + + if ($this->_config['host'] !== 'localhost' && !$this->_isI5) { + // if the host isn't localhost, use extended connection params + $dbname = 'DRIVER={IBM DB2 ODBC DRIVER}' . + ';DATABASE=' . $this->_config['dbname'] . + ';HOSTNAME=' . $this->_config['host'] . + ';PORT=' . $this->_config['port'] . + ';PROTOCOL=' . $this->_config['protocol'] . + ';UID=' . $this->_config['username'] . + ';PWD=' . $this->_config['password'] .';'; + $this->_connection = $conn_func_name( + $dbname, + null, + null, + $this->_config['driver_options'] + ); + } else { + // host is localhost, so use standard connection params + $this->_connection = $conn_func_name( + $this->_config['dbname'], + $this->_config['username'], + $this->_config['password'], + $this->_config['driver_options'] + ); + } + + // check the connection + if (!$this->_connection) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception(db2_conn_errormsg(), db2_conn_error()); + } + } + + /** + * Test if a connection is active + * + * @return boolean + */ + public function isConnected() + { + return ((bool) (is_resource($this->_connection) + && get_resource_type($this->_connection) == 'DB2 Connection')); + } + + /** + * Force the connection to close. + * + * @return void + */ + public function closeConnection() + { + if ($this->isConnected()) { + db2_close($this->_connection); + } + $this->_connection = null; + } + + /** + * Returns an SQL statement for preparation. + * + * @param string $sql The SQL statement with placeholders. + * @return Zend_Db_Statement_Db2 + */ + public function prepare($sql) + { + $this->_connect(); + $stmtClass = $this->_defaultStmtClass; + if (!class_exists($stmtClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($stmtClass); + } + $stmt = new $stmtClass($this, $sql); + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Gets the execution mode + * + * @return int the execution mode (DB2_AUTOCOMMIT_ON or DB2_AUTOCOMMIT_OFF) + */ + public function _getExecuteMode() + { + return $this->_execute_mode; + } + + /** + * @param integer $mode + * @return void + */ + public function _setExecuteMode($mode) + { + switch ($mode) { + case DB2_AUTOCOMMIT_OFF: + case DB2_AUTOCOMMIT_ON: + $this->_execute_mode = $mode; + db2_autocommit($this->_connection, $mode); + break; + default: + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception("execution mode not supported"); + break; + } + } + + /** + * Quote a raw string. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value) || is_float($value)) { + return $value; + } + /** + * Use db2_escape_string() if it is present in the IBM DB2 extension. + * But some supported versions of PHP do not include this function, + * so fall back to default quoting in the parent class. + */ + if (function_exists('db2_escape_string')) { + return "'" . db2_escape_string($value) . "'"; + } + return parent::_quote($value); + } + + /** + * @return string + */ + public function getQuoteIdentifierSymbol() + { + $this->_connect(); + $info = db2_server_info($this->_connection); + if ($info) { + $identQuote = $info->IDENTIFIER_QUOTE_CHAR; + } else { + // db2_server_info() does not return result on some i5 OS version + if ($this->_isI5) { + $identQuote ="'"; + } + } + return $identQuote; + } + + /** + * Returns a list of the tables in the database. + * @param string $schema OPTIONAL + * @return array + */ + public function listTables($schema = null) + { + $this->_connect(); + + if ($schema === null && $this->_config['schema'] != null) { + $schema = $this->_config['schema']; + } + + $tables = array(); + + if (!$this->_isI5) { + if ($schema) { + $stmt = db2_tables($this->_connection, null, $schema); + } else { + $stmt = db2_tables($this->_connection); + } + while ($row = db2_fetch_assoc($stmt)) { + $tables[] = $row['TABLE_NAME']; + } + } else { + $tables = $this->_i5listTables($schema); + } + + return $tables; + } + + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * DB2 not supports UNSIGNED integer. + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + // Ensure the connection is made so that _isI5 is set + $this->_connect(); + + if ($schemaName === null && $this->_config['schema'] != null) { + $schemaName = $this->_config['schema']; + } + + if (!$this->_isI5) { + + $sql = "SELECT DISTINCT c.tabschema, c.tabname, c.colname, c.colno, + c.typename, c.default, c.nulls, c.length, c.scale, + c.identity, tc.type AS tabconsttype, k.colseq + FROM syscat.columns c + LEFT JOIN (syscat.keycoluse k JOIN syscat.tabconst tc + ON (k.tabschema = tc.tabschema + AND k.tabname = tc.tabname + AND tc.type = 'P')) + ON (c.tabschema = k.tabschema + AND c.tabname = k.tabname + AND c.colname = k.colname) + WHERE " + . $this->quoteInto('UPPER(c.tabname) = UPPER(?)', $tableName); + + if ($schemaName) { + $sql .= $this->quoteInto(' AND UPPER(c.tabschema) = UPPER(?)', $schemaName); + } + + $sql .= " ORDER BY c.colno"; + + } else { + + // DB2 On I5 specific query + $sql = "SELECT DISTINCT C.TABLE_SCHEMA, C.TABLE_NAME, C.COLUMN_NAME, C.ORDINAL_POSITION, + C.DATA_TYPE, C.COLUMN_DEFAULT, C.NULLS ,C.LENGTH, C.SCALE, LEFT(C.IDENTITY,1), + LEFT(tc.TYPE, 1) AS tabconsttype, k.COLSEQ + FROM QSYS2.SYSCOLUMNS C + LEFT JOIN (QSYS2.syskeycst k JOIN QSYS2.SYSCST tc + ON (k.TABLE_SCHEMA = tc.TABLE_SCHEMA + AND k.TABLE_NAME = tc.TABLE_NAME + AND LEFT(tc.type,1) = 'P')) + ON (C.TABLE_SCHEMA = k.TABLE_SCHEMA + AND C.TABLE_NAME = k.TABLE_NAME + AND C.COLUMN_NAME = k.COLUMN_NAME) + WHERE " + . $this->quoteInto('UPPER(C.TABLE_NAME) = UPPER(?)', $tableName); + + if ($schemaName) { + $sql .= $this->quoteInto(' AND UPPER(C.TABLE_SCHEMA) = UPPER(?)', $schemaName); + } + + $sql .= " ORDER BY C.ORDINAL_POSITION FOR FETCH ONLY"; + } + + $desc = array(); + $stmt = $this->query($sql); + + /** + * To avoid case issues, fetch using FETCH_NUM + */ + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + /** + * The ordering of columns is defined by the query so we can map + * to variables to improve readability + */ + $tabschema = 0; + $tabname = 1; + $colname = 2; + $colno = 3; + $typename = 4; + $default = 5; + $nulls = 6; + $length = 7; + $scale = 8; + $identityCol = 9; + $tabconstType = 10; + $colseq = 11; + + foreach ($result as $key => $row) { + list ($primary, $primaryPosition, $identity) = array(false, null, false); + if ($row[$tabconstType] == 'P') { + $primary = true; + $primaryPosition = $row[$colseq]; + } + /** + * In IBM DB2, an column can be IDENTITY + * even if it is not part of the PRIMARY KEY. + */ + if ($row[$identityCol] == 'Y') { + $identity = true; + } + + // only colname needs to be case adjusted + $desc[$this->foldCase($row[$colname])] = array( + 'SCHEMA_NAME' => $this->foldCase($row[$tabschema]), + 'TABLE_NAME' => $this->foldCase($row[$tabname]), + 'COLUMN_NAME' => $this->foldCase($row[$colname]), + 'COLUMN_POSITION' => (!$this->_isI5) ? $row[$colno]+1 : $row[$colno], + 'DATA_TYPE' => $row[$typename], + 'DEFAULT' => $row[$default], + 'NULLABLE' => (bool) ($row[$nulls] == 'Y'), + 'LENGTH' => $row[$length], + 'SCALE' => $row[$scale], + 'PRECISION' => ($row[$typename] == 'DECIMAL' ? $row[$length] : 0), + 'UNSIGNED' => false, + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + + return $desc; + } + + /** + * Return the most recent value from the specified sequence in the database. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function lastSequenceId($sequenceName) + { + $this->_connect(); + + if (!$this->_isI5) { + $quotedSequenceName = $this->quoteIdentifier($sequenceName, true); + $sql = 'SELECT PREVVAL FOR ' . $quotedSequenceName . ' AS VAL FROM SYSIBM.SYSDUMMY1'; + } else { + $quotedSequenceName = $sequenceName; + $sql = 'SELECT PREVVAL FOR ' . $this->quoteIdentifier($sequenceName, true) . ' AS VAL FROM QSYS2.QSQPTABL'; + } + + $value = $this->fetchOne($sql); + return (string) $value; + } + + /** + * Generate a new value from the specified sequence in the database, and return it. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function nextSequenceId($sequenceName) + { + $this->_connect(); + $sql = 'SELECT NEXTVAL FOR '.$this->quoteIdentifier($sequenceName, true).' AS VAL FROM SYSIBM.SYSDUMMY1'; + $value = $this->fetchOne($sql); + return (string) $value; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * The IDENTITY_VAL_LOCAL() function gives the last generated identity value + * in the current process, even if it was for a GENERATED column. + * + * @param string $tableName OPTIONAL + * @param string $primaryKey OPTIONAL + * @param string $idType OPTIONAL used for i5 platform to define sequence/idenity unique value + * @return string + */ + + public function lastInsertId($tableName = null, $primaryKey = null, $idType = null) + { + $this->_connect(); + + if ($this->_isI5) { + return (string) $this->_i5LastInsertId($tableName, $idType); + } + + if ($tableName !== null) { + $sequenceName = $tableName; + if ($primaryKey) { + $sequenceName .= "_$primaryKey"; + } + $sequenceName .= '_seq'; + return $this->lastSequenceId($sequenceName); + } + + $sql = 'SELECT IDENTITY_VAL_LOCAL() AS VAL FROM SYSIBM.SYSDUMMY1'; + $value = $this->fetchOne($sql); + return (string) $value; + } + + /** + * Begin a transaction. + * + * @return void + */ + protected function _beginTransaction() + { + $this->_setExecuteMode(DB2_AUTOCOMMIT_OFF); + } + + /** + * Commit a transaction. + * + * @return void + */ + protected function _commit() + { + if (!db2_commit($this->_connection)) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception( + db2_conn_errormsg($this->_connection), + db2_conn_error($this->_connection)); + } + + $this->_setExecuteMode(DB2_AUTOCOMMIT_ON); + } + + /** + * Rollback a transaction. + * + * @return void + */ + protected function _rollBack() + { + if (!db2_rollback($this->_connection)) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception( + db2_conn_errormsg($this->_connection), + db2_conn_error($this->_connection)); + } + $this->_setExecuteMode(DB2_AUTOCOMMIT_ON); + } + + /** + * Set the fetch mode. + * + * @param integer $mode + * @return void + * @throws Zend_Db_Adapter_Db2_Exception + */ + public function setFetchMode($mode) + { + switch ($mode) { + case Zend_Db::FETCH_NUM: // seq array + case Zend_Db::FETCH_ASSOC: // assoc array + case Zend_Db::FETCH_BOTH: // seq+assoc array + case Zend_Db::FETCH_OBJ: // object + $this->_fetchMode = $mode; + break; + case Zend_Db::FETCH_BOUND: // bound to PHP variable + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception('FETCH_BOUND is not supported yet'); + break; + default: + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception("Invalid fetch mode '$mode' specified"); + break; + } + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** + * @see Zend_Db_Adapter_Db2_Exception + */ + require_once 'Zend/Db/Adapter/Db2/Exception.php'; + throw new Zend_Db_Adapter_Db2_Exception("LIMIT argument offset=$offset is not valid"); + } + + if ($offset == 0) { + $limit_sql = $sql . " FETCH FIRST $count ROWS ONLY"; + return $limit_sql; + } + + /** + * DB2 does not implement the LIMIT clause as some RDBMS do. + * We have to simulate it with subqueries and ROWNUM. + * Unfortunately because we use the column wildcard "*", + * this puts an extra column into the query result set. + */ + $limit_sql = "SELECT z2.* + FROM ( + SELECT ROW_NUMBER() OVER() AS \"ZEND_DB_ROWNUM\", z1.* + FROM ( + " . $sql . " + ) z1 + ) z2 + WHERE z2.zend_db_rownum BETWEEN " . ($offset+1) . " AND " . ($offset+$count); + return $limit_sql; + } + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + public function supportsParameters($type) + { + if ($type == 'positional') { + return true; + } + + // if its 'named' or anything else + return false; + } + + /** + * Retrieve server version in PHP style + * + * @return string + */ + public function getServerVersion() + { + $this->_connect(); + $server_info = db2_server_info($this->_connection); + if ($server_info !== false) { + $version = $server_info->DBMS_VER; + if ($this->_isI5) { + $version = (int) substr($version, 0, 2) . '.' . (int) substr($version, 2, 2) . '.' . (int) substr($version, 4); + } + return $version; + } else { + return null; + } + } + + /** + * Return whether or not this is running on i5 + * + * @return bool + */ + public function isI5() + { + if ($this->_isI5 === null) { + $this->_determineI5(); + } + + return (bool) $this->_isI5; + } + + /** + * Check the connection parameters according to verify + * type of used OS + * + * @return void + */ + protected function _determineI5() + { + // first us the compiled flag. + $this->_isI5 = (php_uname('s') == 'OS400') ? true : false; + + // if this is set, then us it + if (isset($this->_config['os'])){ + if (strtolower($this->_config['os']) === 'i5') { + $this->_isI5 = true; + } else { + // any other value passed in, its null + $this->_isI5 = false; + } + } + + } + + /** + * Db2 On I5 specific method + * + * Returns a list of the tables in the database . + * Used only for DB2/400. + * + * @return array + */ + protected function _i5listTables($schema = null) + { + //list of i5 libraries. + $tables = array(); + if ($schema) { + $tablesStatement = db2_tables($this->_connection, null, $schema); + while ($rowTables = db2_fetch_assoc($tablesStatement) ) { + if ($rowTables['TABLE_NAME'] !== null) { + $tables[] = $rowTables['TABLE_NAME']; + } + } + } else { + $schemaStatement = db2_tables($this->_connection); + while ($schema = db2_fetch_assoc($schemaStatement)) { + if ($schema['TABLE_SCHEM'] !== null) { + // list of the tables which belongs to the selected library + $tablesStatement = db2_tables($this->_connection, NULL, $schema['TABLE_SCHEM']); + if (is_resource($tablesStatement)) { + while ($rowTables = db2_fetch_assoc($tablesStatement) ) { + if ($rowTables['TABLE_NAME'] !== null) { + $tables[] = $rowTables['TABLE_NAME']; + } + } + } + } + } + } + + return $tables; + } + + protected function _i5LastInsertId($objectName = null, $idType = null) + { + + if ($objectName === null) { + $sql = 'SELECT IDENTITY_VAL_LOCAL() AS VAL FROM QSYS2.QSQPTABL'; + $value = $this->fetchOne($sql); + return $value; + } + + if (strtoupper($idType) === 'S'){ + //check i5_lib option + $sequenceName = $objectName; + return $this->lastSequenceId($sequenceName); + } + + //returns last identity value for the specified table + //if (strtoupper($idType) === 'I') { + $tableName = $objectName; + return $this->fetchOne('SELECT IDENTITY_VAL_LOCAL() from ' . $this->quoteIdentifier($tableName)); + } + +} + + diff --git a/lib/zend/Zend/Db/Adapter/Db2/Exception.php b/lib/zend/Zend/Db/Adapter/Db2/Exception.php new file mode 100644 index 0000000000..081bcfaaec --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Db2/Exception.php @@ -0,0 +1,45 @@ +message = $msg; + $this->code = $state; + } +} diff --git a/lib/zend/Zend/Db/Adapter/Exception.php b/lib/zend/Zend/Db/Adapter/Exception.php new file mode 100644 index 0000000000..3e7b8478b7 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Exception.php @@ -0,0 +1,58 @@ +_chainedException = $e; + $this->code = $e->getCode(); + } + parent::__construct($message); + } + + public function hasChainedException() + { + return ($this->_chainedException!==null); + } + + public function getChainedException() + { + return $this->_chainedException; + } + +} diff --git a/lib/zend/Zend/Db/Adapter/Mysqli.php b/lib/zend/Zend/Db/Adapter/Mysqli.php new file mode 100644 index 0000000000..74ab6843be --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Mysqli.php @@ -0,0 +1,549 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INT' => Zend_Db::INT_TYPE, + 'INTEGER' => Zend_Db::INT_TYPE, + 'MEDIUMINT' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'TINYINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'SERIAL' => Zend_Db::BIGINT_TYPE, + 'DEC' => Zend_Db::FLOAT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'DOUBLE' => Zend_Db::FLOAT_TYPE, + 'DOUBLE PRECISION' => Zend_Db::FLOAT_TYPE, + 'FIXED' => Zend_Db::FLOAT_TYPE, + 'FLOAT' => Zend_Db::FLOAT_TYPE + ); + + /** + * @var Zend_Db_Statement_Mysqli + */ + protected $_stmt = null; + + /** + * Default class name for a DB statement. + * + * @var string + */ + protected $_defaultStmtClass = 'Zend_Db_Statement_Mysqli'; + + /** + * Quote a raw string. + * + * @param mixed $value Raw string + * + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value) || is_float($value)) { + return $value; + } + $this->_connect(); + return "'" . $this->_connection->real_escape_string($value) . "'"; + } + + /** + * Returns the symbol the adapter uses for delimiting identifiers. + * + * @return string + */ + public function getQuoteIdentifierSymbol() + { + return "`"; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $result = array(); + // Use mysqli extension API, because SHOW doesn't work + // well as a prepared statement on MySQL 4.1. + $sql = 'SHOW TABLES'; + if ($queryResult = $this->getConnection()->query($sql)) { + while ($row = $queryResult->fetch_row()) { + $result[] = $row[0]; + } + $queryResult->close(); + } else { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception($this->getConnection()->error); + } + return $result; + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + /** + * @todo use INFORMATION_SCHEMA someday when + * MySQL's implementation isn't too slow. + */ + + if ($schemaName) { + $sql = 'DESCRIBE ' . $this->quoteIdentifier("$schemaName.$tableName", true); + } else { + $sql = 'DESCRIBE ' . $this->quoteIdentifier($tableName, true); + } + + /** + * Use mysqli extension API, because DESCRIBE doesn't work + * well as a prepared statement on MySQL 4.1. + */ + if ($queryResult = $this->getConnection()->query($sql)) { + while ($row = $queryResult->fetch_assoc()) { + $result[] = $row; + } + $queryResult->close(); + } else { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception($this->getConnection()->error); + } + + $desc = array(); + + $row_defaults = array( + 'Length' => null, + 'Scale' => null, + 'Precision' => null, + 'Unsigned' => null, + 'Primary' => false, + 'PrimaryPosition' => null, + 'Identity' => false + ); + $i = 1; + $p = 1; + foreach ($result as $key => $row) { + $row = array_merge($row_defaults, $row); + if (preg_match('/unsigned/', $row['Type'])) { + $row['Unsigned'] = true; + } + if (preg_match('/^((?:var)?char)\((\d+)\)/', $row['Type'], $matches)) { + $row['Type'] = $matches[1]; + $row['Length'] = $matches[2]; + } else if (preg_match('/^decimal\((\d+),(\d+)\)/', $row['Type'], $matches)) { + $row['Type'] = 'decimal'; + $row['Precision'] = $matches[1]; + $row['Scale'] = $matches[2]; + } else if (preg_match('/^float\((\d+),(\d+)\)/', $row['Type'], $matches)) { + $row['Type'] = 'float'; + $row['Precision'] = $matches[1]; + $row['Scale'] = $matches[2]; + } else if (preg_match('/^((?:big|medium|small|tiny)?int)\((\d+)\)/', $row['Type'], $matches)) { + $row['Type'] = $matches[1]; + /** + * The optional argument of a MySQL int type is not precision + * or length; it is only a hint for display width. + */ + } + if (strtoupper($row['Key']) == 'PRI') { + $row['Primary'] = true; + $row['PrimaryPosition'] = $p; + if ($row['Extra'] == 'auto_increment') { + $row['Identity'] = true; + } else { + $row['Identity'] = false; + } + ++$p; + } + $desc[$this->foldCase($row['Field'])] = array( + 'SCHEMA_NAME' => null, // @todo + 'TABLE_NAME' => $this->foldCase($tableName), + 'COLUMN_NAME' => $this->foldCase($row['Field']), + 'COLUMN_POSITION' => $i, + 'DATA_TYPE' => $row['Type'], + 'DEFAULT' => $row['Default'], + 'NULLABLE' => (bool) ($row['Null'] == 'YES'), + 'LENGTH' => $row['Length'], + 'SCALE' => $row['Scale'], + 'PRECISION' => $row['Precision'], + 'UNSIGNED' => $row['Unsigned'], + 'PRIMARY' => $row['Primary'], + 'PRIMARY_POSITION' => $row['PrimaryPosition'], + 'IDENTITY' => $row['Identity'] + ); + ++$i; + } + return $desc; + } + + /** + * Creates a connection to the database. + * + * @return void + * @throws Zend_Db_Adapter_Mysqli_Exception + */ + protected function _connect() + { + if ($this->_connection) { + return; + } + + if (!extension_loaded('mysqli')) { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception('The Mysqli extension is required for this adapter but the extension is not loaded'); + } + + if (isset($this->_config['port'])) { + $port = (integer) $this->_config['port']; + } else { + $port = null; + } + + $this->_connection = mysqli_init(); + + if(!empty($this->_config['driver_options'])) { + foreach($this->_config['driver_options'] as $option=>$value) { + if(is_string($option)) { + // Suppress warnings here + // Ignore it if it's not a valid constant + $option = @constant(strtoupper($option)); + if($option === null) + continue; + } + mysqli_options($this->_connection, $option, $value); + } + } + + // Suppress connection warnings here. + // Throw an exception instead. + $_isConnected = @mysqli_real_connect( + $this->_connection, + $this->_config['host'], + $this->_config['username'], + $this->_config['password'], + $this->_config['dbname'], + $port + ); + + if ($_isConnected === false || mysqli_connect_errno()) { + + $this->closeConnection(); + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception(mysqli_connect_error()); + } + + if (!empty($this->_config['charset'])) { + mysqli_set_charset($this->_connection, $this->_config['charset']); + } + } + + /** + * Test if a connection is active + * + * @return boolean + */ + public function isConnected() + { + return ((bool) ($this->_connection instanceof mysqli)); + } + + /** + * Force the connection to close. + * + * @return void + */ + public function closeConnection() + { + if ($this->isConnected()) { + $this->_connection->close(); + } + $this->_connection = null; + } + + /** + * Prepare a statement and return a PDOStatement-like object. + * + * @param string $sql SQL query + * @return Zend_Db_Statement_Mysqli + */ + public function prepare($sql) + { + $this->_connect(); + if ($this->_stmt) { + $this->_stmt->close(); + } + $stmtClass = $this->_defaultStmtClass; + if (!class_exists($stmtClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($stmtClass); + } + $stmt = new $stmtClass($this, $sql); + if ($stmt === false) { + return false; + } + $stmt->setFetchMode($this->_fetchMode); + $this->_stmt = $stmt; + return $stmt; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * MySQL does not support sequences, so $tableName and $primaryKey are ignored. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + * @todo Return value should be int? + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + $mysqli = $this->_connection; + return (string) $mysqli->insert_id; + } + + /** + * Begin a transaction. + * + * @return void + */ + protected function _beginTransaction() + { + $this->_connect(); + $this->_connection->autocommit(false); + } + + /** + * Commit a transaction. + * + * @return void + */ + protected function _commit() + { + $this->_connect(); + $this->_connection->commit(); + $this->_connection->autocommit(true); + } + + /** + * Roll-back a transaction. + * + * @return void + */ + protected function _rollBack() + { + $this->_connect(); + $this->_connection->rollback(); + $this->_connection->autocommit(true); + } + + /** + * Set the fetch mode. + * + * @param int $mode + * @return void + * @throws Zend_Db_Adapter_Mysqli_Exception + */ + public function setFetchMode($mode) + { + switch ($mode) { + case Zend_Db::FETCH_LAZY: + case Zend_Db::FETCH_ASSOC: + case Zend_Db::FETCH_NUM: + case Zend_Db::FETCH_BOTH: + case Zend_Db::FETCH_NAMED: + case Zend_Db::FETCH_OBJ: + $this->_fetchMode = $mode; + break; + case Zend_Db::FETCH_BOUND: // bound to PHP variable + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception('FETCH_BOUND is not supported yet'); + break; + default: + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception("Invalid fetch mode '$mode' specified"); + } + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param int $count + * @param int $offset OPTIONAL + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** + * @see Zend_Db_Adapter_Mysqli_Exception + */ + require_once 'Zend/Db/Adapter/Mysqli/Exception.php'; + throw new Zend_Db_Adapter_Mysqli_Exception("LIMIT argument offset=$offset is not valid"); + } + + $sql .= " LIMIT $count"; + if ($offset > 0) { + $sql .= " OFFSET $offset"; + } + + return $sql; + } + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + public function supportsParameters($type) + { + switch ($type) { + case 'positional': + return true; + case 'named': + default: + return false; + } + } + + /** + * Retrieve server version in PHP style + * + *@return string + */ + public function getServerVersion() + { + $this->_connect(); + $version = $this->_connection->server_version; + $major = (int) ($version / 10000); + $minor = (int) ($version % 10000 / 100); + $revision = (int) ($version % 100); + return $major . '.' . $minor . '.' . $revision; + } +} diff --git a/lib/zend/Zend/Db/Adapter/Mysqli/Exception.php b/lib/zend/Zend/Db/Adapter/Mysqli/Exception.php new file mode 100644 index 0000000000..f14288331c --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Mysqli/Exception.php @@ -0,0 +1,40 @@ + (string) Connect to the database as this username. + * password => (string) Password associated with the username. + * dbname => Either the name of the local Oracle instance, or the + * name of the entry in tnsnames.ora to which you want to connect. + * persistent => (boolean) Set TRUE to use a persistent connection + * @var array + */ + protected $_config = array( + 'dbname' => null, + 'username' => null, + 'password' => null, + 'persistent' => false + ); + + /** + * Keys are UPPERCASE SQL datatypes or the constants + * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE. + * + * Values are: + * 0 = 32-bit integer + * 1 = 64-bit integer + * 2 = float or decimal + * + * @var array Associative array of datatypes to values 0, 1, or 2. + */ + protected $_numericDataTypes = array( + Zend_Db::INT_TYPE => Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'BINARY_DOUBLE' => Zend_Db::FLOAT_TYPE, + 'BINARY_FLOAT' => Zend_Db::FLOAT_TYPE, + 'NUMBER' => Zend_Db::FLOAT_TYPE, + ); + + /** + * @var integer + */ + protected $_execute_mode = null; + + /** + * Default class name for a DB statement. + * + * @var string + */ + protected $_defaultStmtClass = 'Zend_Db_Statement_Oracle'; + + /** + * Check if LOB field are returned as string + * instead of OCI-Lob object + * + * @var boolean + */ + protected $_lobAsString = null; + + /** + * Creates a connection resource. + * + * @return void + * @throws Zend_Db_Adapter_Oracle_Exception + */ + protected function _connect() + { + if (is_resource($this->_connection)) { + // connection already exists + return; + } + + if (!extension_loaded('oci8')) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception('The OCI8 extension is required for this adapter but the extension is not loaded'); + } + + $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS); + + $connectionFuncName = ($this->_config['persistent'] == true) ? 'oci_pconnect' : 'oci_connect'; + + $this->_connection = @$connectionFuncName( + $this->_config['username'], + $this->_config['password'], + $this->_config['dbname'], + $this->_config['charset']); + + // check the connection + if (!$this->_connection) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception(oci_error()); + } + } + + /** + * Test if a connection is active + * + * @return boolean + */ + public function isConnected() + { + return ((bool) (is_resource($this->_connection) + && get_resource_type($this->_connection) == 'oci8 connection')); + } + + /** + * Force the connection to close. + * + * @return void + */ + public function closeConnection() + { + if ($this->isConnected()) { + oci_close($this->_connection); + } + $this->_connection = null; + } + + /** + * Activate/deactivate return of LOB as string + * + * @param string $lob_as_string + * @return Zend_Db_Adapter_Oracle + */ + public function setLobAsString($lobAsString) + { + $this->_lobAsString = (bool) $lobAsString; + return $this; + } + + /** + * Return whether or not LOB are returned as string + * + * @return boolean + */ + public function getLobAsString() + { + if ($this->_lobAsString === null) { + // if never set by user, we use driver option if it exists otherwise false + if (isset($this->_config['driver_options']) && + isset($this->_config['driver_options']['lob_as_string'])) { + $this->_lobAsString = (bool) $this->_config['driver_options']['lob_as_string']; + } else { + $this->_lobAsString = false; + } + } + return $this->_lobAsString; + } + + /** + * Returns an SQL statement for preparation. + * + * @param string $sql The SQL statement with placeholders. + * @return Zend_Db_Statement_Oracle + */ + public function prepare($sql) + { + $this->_connect(); + $stmtClass = $this->_defaultStmtClass; + if (!class_exists($stmtClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($stmtClass); + } + $stmt = new $stmtClass($this, $sql); + if ($stmt instanceof Zend_Db_Statement_Oracle) { + $stmt->setLobAsString($this->getLobAsString()); + } + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Quote a raw string. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value) || is_float($value)) { + return $value; + } + $value = str_replace("'", "''", $value); + return "'" . addcslashes($value, "\000\n\r\\\032") . "'"; + } + + /** + * Quote a table identifier and alias. + * + * @param string|array|Zend_Db_Expr $ident The identifier or expression. + * @param string $alias An alias for the table. + * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option. + * @return string The quoted identifier and alias. + */ + public function quoteTableAs($ident, $alias = null, $auto = false) + { + // Oracle doesn't allow the 'AS' keyword between the table identifier/expression and alias. + return $this->_quoteIdentifierAs($ident, $alias, $auto, ' '); + } + + /** + * Return the most recent value from the specified sequence in the database. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function lastSequenceId($sequenceName) + { + $this->_connect(); + $sql = 'SELECT '.$this->quoteIdentifier($sequenceName, true).'.CURRVAL FROM dual'; + $value = $this->fetchOne($sql); + return $value; + } + + /** + * Generate a new value from the specified sequence in the database, and return it. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function nextSequenceId($sequenceName) + { + $this->_connect(); + $sql = 'SELECT '.$this->quoteIdentifier($sequenceName, true).'.NEXTVAL FROM dual'; + $value = $this->fetchOne($sql); + return $value; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * Oracle does not support IDENTITY columns, so if the sequence is not + * specified, this method returns null. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + if ($tableName !== null) { + $sequenceName = $tableName; + if ($primaryKey) { + $sequenceName .= "_$primaryKey"; + } + $sequenceName .= '_seq'; + return $this->lastSequenceId($sequenceName); + } + + // No support for IDENTITY columns; return null + return null; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $this->_connect(); + $data = $this->fetchCol('SELECT table_name FROM all_tables'); + return $data; + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $version = $this->getServerVersion(); + if (($version === null) || version_compare($version, '9.0.0', '>=')) { + $sql = "SELECT TC.TABLE_NAME, TC.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE, + TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH, + TC.DATA_SCALE, TC.DATA_PRECISION, C.CONSTRAINT_TYPE, CC.POSITION + FROM ALL_TAB_COLUMNS TC + LEFT JOIN (ALL_CONS_COLUMNS CC JOIN ALL_CONSTRAINTS C + ON (CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND CC.TABLE_NAME = C.TABLE_NAME AND C.CONSTRAINT_TYPE = 'P')) + ON TC.TABLE_NAME = CC.TABLE_NAME AND TC.COLUMN_NAME = CC.COLUMN_NAME + WHERE UPPER(TC.TABLE_NAME) = UPPER(:TBNAME)"; + $bind[':TBNAME'] = $tableName; + if ($schemaName) { + $sql .= ' AND UPPER(TC.OWNER) = UPPER(:SCNAME)'; + $bind[':SCNAME'] = $schemaName; + } + $sql .= ' ORDER BY TC.COLUMN_ID'; + } else { + $subSql="SELECT AC.OWNER, AC.TABLE_NAME, ACC.COLUMN_NAME, AC.CONSTRAINT_TYPE, ACC.POSITION + from ALL_CONSTRAINTS AC, ALL_CONS_COLUMNS ACC + WHERE ACC.CONSTRAINT_NAME = AC.CONSTRAINT_NAME + AND ACC.TABLE_NAME = AC.TABLE_NAME + AND ACC.OWNER = AC.OWNER + AND AC.CONSTRAINT_TYPE = 'P' + AND UPPER(AC.TABLE_NAME) = UPPER(:TBNAME)"; + $bind[':TBNAME'] = $tableName; + if ($schemaName) { + $subSql .= ' AND UPPER(ACC.OWNER) = UPPER(:SCNAME)'; + $bind[':SCNAME'] = $schemaName; + } + $sql="SELECT TC.TABLE_NAME, TC.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE, + TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH, + TC.DATA_SCALE, TC.DATA_PRECISION, CC.CONSTRAINT_TYPE, CC.POSITION + FROM ALL_TAB_COLUMNS TC, ($subSql) CC + WHERE UPPER(TC.TABLE_NAME) = UPPER(:TBNAME) + AND TC.OWNER = CC.OWNER(+) AND TC.TABLE_NAME = CC.TABLE_NAME(+) AND TC.COLUMN_NAME = CC.COLUMN_NAME(+)"; + if ($schemaName) { + $sql .= ' AND UPPER(TC.OWNER) = UPPER(:SCNAME)'; + } + $sql .= ' ORDER BY TC.COLUMN_ID'; + } + + $stmt = $this->query($sql, $bind); + + /** + * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection + */ + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $table_name = 0; + $owner = 1; + $column_name = 2; + $data_type = 3; + $data_default = 4; + $nullable = 5; + $column_id = 6; + $data_length = 7; + $data_scale = 8; + $data_precision = 9; + $constraint_type = 10; + $position = 11; + + $desc = array(); + foreach ($result as $key => $row) { + list ($primary, $primaryPosition, $identity) = array(false, null, false); + if ($row[$constraint_type] == 'P') { + $primary = true; + $primaryPosition = $row[$position]; + /** + * Oracle does not support auto-increment keys. + */ + $identity = false; + } + $desc[$this->foldCase($row[$column_name])] = array( + 'SCHEMA_NAME' => $this->foldCase($row[$owner]), + 'TABLE_NAME' => $this->foldCase($row[$table_name]), + 'COLUMN_NAME' => $this->foldCase($row[$column_name]), + 'COLUMN_POSITION' => $row[$column_id], + 'DATA_TYPE' => $row[$data_type], + 'DEFAULT' => $row[$data_default], + 'NULLABLE' => (bool) ($row[$nullable] == 'Y'), + 'LENGTH' => $row[$data_length], + 'SCALE' => $row[$data_scale], + 'PRECISION' => $row[$data_precision], + 'UNSIGNED' => null, // @todo + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + return $desc; + } + + /** + * Leave autocommit mode and begin a transaction. + * + * @return void + */ + protected function _beginTransaction() + { + $this->_setExecuteMode(OCI_DEFAULT); + } + + /** + * Commit a transaction and return to autocommit mode. + * + * @return void + * @throws Zend_Db_Adapter_Oracle_Exception + */ + protected function _commit() + { + if (!oci_commit($this->_connection)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection)); + } + $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS); + } + + /** + * Roll back a transaction and return to autocommit mode. + * + * @return void + * @throws Zend_Db_Adapter_Oracle_Exception + */ + protected function _rollBack() + { + if (!oci_rollback($this->_connection)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection)); + } + $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS); + } + + /** + * Set the fetch mode. + * + * @todo Support FETCH_CLASS and FETCH_INTO. + * + * @param integer $mode A fetch mode. + * @return void + * @throws Zend_Db_Adapter_Oracle_Exception + */ + public function setFetchMode($mode) + { + switch ($mode) { + case Zend_Db::FETCH_NUM: // seq array + case Zend_Db::FETCH_ASSOC: // assoc array + case Zend_Db::FETCH_BOTH: // seq+assoc array + case Zend_Db::FETCH_OBJ: // object + $this->_fetchMode = $mode; + break; + case Zend_Db::FETCH_BOUND: // bound to PHP variable + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception('FETCH_BOUND is not supported yet'); + break; + default: + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception("Invalid fetch mode '$mode' specified"); + break; + } + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + * @throws Zend_Db_Adapter_Oracle_Exception + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception("LIMIT argument offset=$offset is not valid"); + } + + /** + * Oracle does not implement the LIMIT clause as some RDBMS do. + * We have to simulate it with subqueries and ROWNUM. + * Unfortunately because we use the column wildcard "*", + * this puts an extra column into the query result set. + */ + $limit_sql = "SELECT z2.* + FROM ( + SELECT z1.*, ROWNUM AS \"zend_db_rownum\" + FROM ( + " . $sql . " + ) z1 + ) z2 + WHERE z2.\"zend_db_rownum\" BETWEEN " . ($offset+1) . " AND " . ($offset+$count); + return $limit_sql; + } + + /** + * @param integer $mode + * @throws Zend_Db_Adapter_Oracle_Exception + */ + private function _setExecuteMode($mode) + { + switch($mode) { + case OCI_COMMIT_ON_SUCCESS: + case OCI_DEFAULT: + case OCI_DESCRIBE_ONLY: + $this->_execute_mode = $mode; + break; + default: + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Adapter/Oracle/Exception.php'; + throw new Zend_Db_Adapter_Oracle_Exception("Invalid execution mode '$mode' specified"); + break; + } + } + + /** + * @return int + */ + public function _getExecuteMode() + { + return $this->_execute_mode; + } + + /** + * Inserts a table row with specified data. + * + * Oracle does not support anonymous ('?') binds. + * + * @param mixed $table The table to insert data into. + * @param array $bind Column-value pairs. + * @return int The number of affected rows. + */ + public function insert($table, array $bind) + { + $i = 0; + // extract and quote col names from the array keys + $cols = array(); + $vals = array(); + foreach ($bind as $col => $val) { + $cols[] = $this->quoteIdentifier($col, true); + if ($val instanceof Zend_Db_Expr) { + $vals[] = $val->__toString(); + unset($bind[$col]); + } else { + $vals[] = ':'.$col.$i; + unset($bind[$col]); + $bind[':'.$col.$i] = $val; + } + $i++; + } + + // build the statement + $sql = "INSERT INTO " + . $this->quoteIdentifier($table, true) + . ' (' . implode(', ', $cols) . ') ' + . 'VALUES (' . implode(', ', $vals) . ')'; + + // execute the statement and return the number of affected rows + $stmt = $this->query($sql, $bind); + $result = $stmt->rowCount(); + return $result; + } + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + public function supportsParameters($type) + { + switch ($type) { + case 'named': + return true; + case 'positional': + default: + return false; + } + } + + /** + * Retrieve server version in PHP style + * + * @return string + */ + public function getServerVersion() + { + $this->_connect(); + $version = oci_server_version($this->_connection); + if ($version !== false) { + $matches = null; + if (preg_match('/((?:[0-9]{1,2}\.){1,3}[0-9]{1,2})/', $version, $matches)) { + return $matches[1]; + } else { + return null; + } + } else { + return null; + } + } +} diff --git a/lib/zend/Zend/Db/Adapter/Oracle/Exception.php b/lib/zend/Zend/Db/Adapter/Oracle/Exception.php new file mode 100644 index 0000000000..5f4eaa46f5 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Oracle/Exception.php @@ -0,0 +1,60 @@ +message = $error['code'] .' '. $error['message']; + } else { + $this->message = $error['code'] .' '. $error['message']." " + . substr($error['sqltext'], 0, $error['offset']) + . "*" + . substr($error['sqltext'], $error['offset']); + } + $this->code = $error['code']; + } else if (is_string($error)) { + $this->message = $error; + } + if (!$this->code && $code) { + $this->code = $code; + } + } +} diff --git a/lib/zend/Zend/Db/Adapter/Pdo/Abstract.php b/lib/zend/Zend/Db/Adapter/Pdo/Abstract.php new file mode 100644 index 0000000000..2be45427d9 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Pdo/Abstract.php @@ -0,0 +1,401 @@ +_config settings. + * + * @return string + */ + protected function _dsn() + { + // baseline of DSN parts + $dsn = $this->_config; + + // don't pass the username, password, charset, persistent and driver_options in the DSN + unset($dsn['username']); + unset($dsn['password']); + unset($dsn['options']); + unset($dsn['charset']); + unset($dsn['persistent']); + unset($dsn['driver_options']); + + // use all remaining parts in the DSN + foreach ($dsn as $key => $val) { + $dsn[$key] = "$key=$val"; + } + + return $this->_pdoType . ':' . implode(';', $dsn); + } + + /** + * Creates a PDO object and connects to the database. + * + * @return void + * @throws Zend_Db_Adapter_Exception + */ + protected function _connect() + { + // if we already have a PDO object, no need to re-connect. + if ($this->_connection) { + return; + } + + // get the dsn first, because some adapters alter the $_pdoType + $dsn = $this->_dsn(); + + // check for PDO extension + if (!extension_loaded('pdo')) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded'); + } + + // check the PDO driver is available + if (!in_array($this->_pdoType, PDO::getAvailableDrivers())) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception('The ' . $this->_pdoType . ' driver is not currently installed'); + } + + // create PDO connection + $q = $this->_profiler->queryStart('connect', Zend_Db_Profiler::CONNECT); + + // add the persistence flag if we find it in our config array + if (isset($this->_config['persistent']) && ($this->_config['persistent'] == true)) { + $this->_config['driver_options'][PDO::ATTR_PERSISTENT] = true; + } + + try { + $this->_connection = new PDO( + $dsn, + $this->_config['username'], + $this->_config['password'], + $this->_config['driver_options'] + ); + + $this->_profiler->queryEnd($q); + + // set the PDO connection to perform case-folding on array keys, or not + $this->_connection->setAttribute(PDO::ATTR_CASE, $this->_caseFolding); + + // always use exceptions. + $this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + } catch (PDOException $e) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception($e->getMessage(), $e); + } + + } + + /** + * Test if a connection is active + * + * @return boolean + */ + public function isConnected() + { + return ((bool) ($this->_connection instanceof PDO)); + } + + /** + * Force the connection to close. + * + * @return void + */ + public function closeConnection() + { + $this->_connection = null; + } + + /** + * Prepares an SQL statement. + * + * @param string $sql The SQL statement with placeholders. + * @param array $bind An array of data to bind to the placeholders. + * @return PDOStatement + */ + public function prepare($sql) + { + $this->_connect(); + $stmtClass = $this->_defaultStmtClass; + if (!class_exists($stmtClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($stmtClass); + } + $stmt = new $stmtClass($this, $sql); + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * On RDBMS brands that don't support sequences, $tableName and $primaryKey + * are ignored. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + $this->_connect(); + return $this->_connection->lastInsertId(); + } + + /** + * Special handling for PDO query(). + * All bind parameter names must begin with ':' + * + * @param string|Zend_Db_Select $sql The SQL statement with placeholders. + * @param array $bind An array of data to bind to the placeholders. + * @return Zend_Db_Statement_Pdo + * @throws Zend_Db_Adapter_Exception To re-throw PDOException. + */ + public function query($sql, $bind = array()) + { + if (empty($bind) && $sql instanceof Zend_Db_Select) { + $bind = $sql->getBind(); + } + + if (is_array($bind)) { + foreach ($bind as $name => $value) { + if (!is_int($name) && !preg_match('/^:/', $name)) { + $newName = ":$name"; + unset($bind[$name]); + $bind[$newName] = $value; + } + } + } + + try { + return parent::query($sql, $bind); + } catch (PDOException $e) { + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Executes an SQL statement and return the number of affected rows + * + * @param mixed $sql The SQL statement with placeholders. + * May be a string or Zend_Db_Select. + * @return integer Number of rows that were modified + * or deleted by the SQL statement + */ + public function exec($sql) + { + if ($sql instanceof Zend_Db_Select) { + $sql = $sql->assemble(); + } + + try { + $affected = $this->getConnection()->exec($sql); + + if ($affected === false) { + $errorInfo = $this->getConnection()->errorInfo(); + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception($errorInfo[2]); + } + + return $affected; + } catch (PDOException $e) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception($e->getMessage(), $e); + } + } + + /** + * Quote a raw string. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value) || is_float($value)) { + return $value; + } + $this->_connect(); + return $this->_connection->quote($value); + } + + /** + * Begin a transaction. + */ + protected function _beginTransaction() + { + $this->_connect(); + $this->_connection->beginTransaction(); + } + + /** + * Commit a transaction. + */ + protected function _commit() + { + $this->_connect(); + $this->_connection->commit(); + } + + /** + * Roll-back a transaction. + */ + protected function _rollBack() { + $this->_connect(); + $this->_connection->rollBack(); + } + + /** + * Set the PDO fetch mode. + * + * @todo Support FETCH_CLASS and FETCH_INTO. + * + * @param int $mode A PDO fetch mode. + * @return void + * @throws Zend_Db_Adapter_Exception + */ + public function setFetchMode($mode) + { + //check for PDO extension + if (!extension_loaded('pdo')) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception('The PDO extension is required for this adapter but the extension is not loaded'); + } + switch ($mode) { + case PDO::FETCH_LAZY: + case PDO::FETCH_ASSOC: + case PDO::FETCH_NUM: + case PDO::FETCH_BOTH: + case PDO::FETCH_NAMED: + case PDO::FETCH_OBJ: + $this->_fetchMode = $mode; + break; + default: + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Invalid fetch mode '$mode' specified"); + break; + } + } + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + public function supportsParameters($type) + { + switch ($type) { + case 'positional': + case 'named': + default: + return true; + } + } + + /** + * Retrieve server version in PHP style + * + * @return string + */ + public function getServerVersion() + { + $this->_connect(); + try { + $version = $this->_connection->getAttribute(PDO::ATTR_SERVER_VERSION); + } catch (PDOException $e) { + // In case of the driver doesn't support getting attributes + return null; + } + $matches = null; + if (preg_match('/((?:[0-9]{1,2}\.){1,3}[0-9]{1,2})/', $version, $matches)) { + return $matches[1]; + } else { + return null; + } + } +} + diff --git a/lib/zend/Zend/Db/Adapter/Pdo/Ibm.php b/lib/zend/Zend/Db/Adapter/Pdo/Ibm.php new file mode 100644 index 0000000000..8b1c429ad7 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Pdo/Ibm.php @@ -0,0 +1,360 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INTEGER' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'DEC' => Zend_Db::FLOAT_TYPE, + 'REAL' => Zend_Db::FLOAT_TYPE, + 'NUMERIC' => Zend_Db::FLOAT_TYPE, + 'DOUBLE PRECISION' => Zend_Db::FLOAT_TYPE, + 'FLOAT' => Zend_Db::FLOAT_TYPE + ); + + /** + * Creates a PDO object and connects to the database. + * + * The IBM data server is set. + * Current options are DB2 or IDS + * @todo also differentiate between z/OS and i/5 + * + * @return void + * @throws Zend_Db_Adapter_Exception + */ + public function _connect() + { + if ($this->_connection) { + return; + } + parent::_connect(); + + $this->getConnection()->setAttribute(Zend_Db::ATTR_STRINGIFY_FETCHES, true); + + try { + if ($this->_serverType === null) { + $server = substr($this->getConnection()->getAttribute(PDO::ATTR_SERVER_INFO), 0, 3); + + switch ($server) { + case 'DB2': + $this->_serverType = new Zend_Db_Adapter_Pdo_Ibm_Db2($this); + + // Add DB2-specific numeric types + $this->_numericDataTypes['DECFLOAT'] = Zend_Db::FLOAT_TYPE; + $this->_numericDataTypes['DOUBLE'] = Zend_Db::FLOAT_TYPE; + $this->_numericDataTypes['NUM'] = Zend_Db::FLOAT_TYPE; + + break; + case 'IDS': + $this->_serverType = new Zend_Db_Adapter_Pdo_Ibm_Ids($this); + + // Add IDS-specific numeric types + $this->_numericDataTypes['SERIAL'] = Zend_Db::INT_TYPE; + $this->_numericDataTypes['SERIAL8'] = Zend_Db::BIGINT_TYPE; + $this->_numericDataTypes['INT8'] = Zend_Db::BIGINT_TYPE; + $this->_numericDataTypes['SMALLFLOAT'] = Zend_Db::FLOAT_TYPE; + $this->_numericDataTypes['MONEY'] = Zend_Db::FLOAT_TYPE; + + break; + } + } + } catch (PDOException $e) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + $error = strpos($e->getMessage(), 'driver does not support that attribute'); + if ($error) { + throw new Zend_Db_Adapter_Exception("PDO_IBM driver extension is downlevel. Please use driver release version 1.2.1 or later"); + } else { + throw new Zend_Db_Adapter_Exception($e->getMessage()); + } + } + } + + /** + * Creates a PDO DSN for the adapter from $this->_config settings. + * + * @return string + */ + protected function _dsn() + { + $this->_checkRequiredOptions($this->_config); + + // check if using full connection string + if (array_key_exists('host', $this->_config)) { + $dsn = ';DATABASE=' . $this->_config['dbname'] + . ';HOSTNAME=' . $this->_config['host'] + . ';PORT=' . $this->_config['port'] + // PDO_IBM supports only DB2 TCPIP protocol + . ';PROTOCOL=' . 'TCPIP;'; + } else { + // catalogued connection + $dsn = $this->_config['dbname']; + } + return $this->_pdoType . ': ' . $dsn; + } + + /** + * Checks required options + * + * @param array $config + * @throws Zend_Db_Adapter_Exception + * @return void + */ + protected function _checkRequiredOptions(array $config) + { + parent::_checkRequiredOptions($config); + + if (array_key_exists('host', $this->_config) && + !array_key_exists('port', $config)) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration must have a key for 'port' when 'host' is specified"); + } + } + + /** + * Prepares an SQL statement. + * + * @param string $sql The SQL statement with placeholders. + * @param array $bind An array of data to bind to the placeholders. + * @return PDOStatement + */ + public function prepare($sql) + { + $this->_connect(); + $stmtClass = $this->_defaultStmtClass; + $stmt = new $stmtClass($this, $sql); + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $this->_connect(); + return $this->_serverType->listTables(); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $this->_connect(); + return $this->_serverType->describeTable($tableName, $schemaName); + } + + /** + * Inserts a table row with specified data. + * Special handling for PDO_IBM + * remove empty slots + * + * @param mixed $table The table to insert data into. + * @param array $bind Column-value pairs. + * @return int The number of affected rows. + */ + public function insert($table, array $bind) + { + $this->_connect(); + $newbind = array(); + if (is_array($bind)) { + foreach ($bind as $name => $value) { + if($value !== null) { + $newbind[$name] = $value; + } + } + } + + return parent::insert($table, $newbind); + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $this->_connect(); + return $this->_serverType->limit($sql, $count, $offset); + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT + * column. + * + * @param string $tableName OPTIONAL + * @param string $primaryKey OPTIONAL + * @return integer + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + $this->_connect(); + + if ($tableName !== null) { + $sequenceName = $tableName; + if ($primaryKey) { + $sequenceName .= "_$primaryKey"; + } + $sequenceName .= '_seq'; + return $this->lastSequenceId($sequenceName); + } + + $id = $this->getConnection()->lastInsertId(); + + return $id; + } + + /** + * Return the most recent value from the specified sequence in the database. + * + * @param string $sequenceName + * @return integer + */ + public function lastSequenceId($sequenceName) + { + $this->_connect(); + return $this->_serverType->lastSequenceId($sequenceName); + } + + /** + * Generate a new value from the specified sequence in the database, + * and return it. + * + * @param string $sequenceName + * @return integer + */ + public function nextSequenceId($sequenceName) + { + $this->_connect(); + return $this->_serverType->nextSequenceId($sequenceName); + } + + /** + * Retrieve server version in PHP style + * Pdo_Idm doesn't support getAttribute(PDO::ATTR_SERVER_VERSION) + * @return string + */ + public function getServerVersion() + { + try { + $stmt = $this->query('SELECT service_level, fixpack_num FROM TABLE (sysproc.env_get_inst_info()) as INSTANCEINFO'); + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + if (count($result)) { + $matches = null; + if (preg_match('/((?:[0-9]{1,2}\.){1,3}[0-9]{1,2})/', $result[0][0], $matches)) { + return $matches[1]; + } else { + return null; + } + } + return null; + } catch (PDOException $e) { + return null; + } + } +} diff --git a/lib/zend/Zend/Db/Adapter/Pdo/Ibm/Db2.php b/lib/zend/Zend/Db/Adapter/Pdo/Ibm/Db2.php new file mode 100644 index 0000000000..0c64700854 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Pdo/Ibm/Db2.php @@ -0,0 +1,228 @@ +_adapter = $adapter; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $sql = "SELECT tabname " + . "FROM SYSCAT.TABLES "; + return $this->_adapter->fetchCol($sql); + } + + /** + * DB2 catalog lookup for describe table + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $sql = "SELECT DISTINCT c.tabschema, c.tabname, c.colname, c.colno, + c.typename, c.default, c.nulls, c.length, c.scale, + c.identity, tc.type AS tabconsttype, k.colseq + FROM syscat.columns c + LEFT JOIN (syscat.keycoluse k JOIN syscat.tabconst tc + ON (k.tabschema = tc.tabschema + AND k.tabname = tc.tabname + AND tc.type = 'P')) + ON (c.tabschema = k.tabschema + AND c.tabname = k.tabname + AND c.colname = k.colname) + WHERE " + . $this->_adapter->quoteInto('UPPER(c.tabname) = UPPER(?)', $tableName); + if ($schemaName) { + $sql .= $this->_adapter->quoteInto(' AND UPPER(c.tabschema) = UPPER(?)', $schemaName); + } + $sql .= " ORDER BY c.colno"; + + $desc = array(); + $stmt = $this->_adapter->query($sql); + + /** + * To avoid case issues, fetch using FETCH_NUM + */ + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + /** + * The ordering of columns is defined by the query so we can map + * to variables to improve readability + */ + $tabschema = 0; + $tabname = 1; + $colname = 2; + $colno = 3; + $typename = 4; + $default = 5; + $nulls = 6; + $length = 7; + $scale = 8; + $identityCol = 9; + $tabconstype = 10; + $colseq = 11; + + foreach ($result as $key => $row) { + list ($primary, $primaryPosition, $identity) = array(false, null, false); + if ($row[$tabconstype] == 'P') { + $primary = true; + $primaryPosition = $row[$colseq]; + } + /** + * In IBM DB2, an column can be IDENTITY + * even if it is not part of the PRIMARY KEY. + */ + if ($row[$identityCol] == 'Y') { + $identity = true; + } + + $desc[$this->_adapter->foldCase($row[$colname])] = array( + 'SCHEMA_NAME' => $this->_adapter->foldCase($row[$tabschema]), + 'TABLE_NAME' => $this->_adapter->foldCase($row[$tabname]), + 'COLUMN_NAME' => $this->_adapter->foldCase($row[$colname]), + 'COLUMN_POSITION' => $row[$colno]+1, + 'DATA_TYPE' => $row[$typename], + 'DEFAULT' => $row[$default], + 'NULLABLE' => (bool) ($row[$nulls] == 'Y'), + 'LENGTH' => $row[$length], + 'SCALE' => $row[$scale], + 'PRECISION' => ($row[$typename] == 'DECIMAL' ? $row[$length] : 0), + 'UNSIGNED' => false, + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + + return $desc; + } + + /** + * Adds a DB2-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @throws Zend_Db_Adapter_Exception + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } else { + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + if ($offset == 0 && $count > 0) { + $limit_sql = $sql . " FETCH FIRST $count ROWS ONLY"; + return $limit_sql; + } + /** + * DB2 does not implement the LIMIT clause as some RDBMS do. + * We have to simulate it with subqueries and ROWNUM. + * Unfortunately because we use the column wildcard "*", + * this puts an extra column into the query result set. + */ + $limit_sql = "SELECT z2.* + FROM ( + SELECT ROW_NUMBER() OVER() AS \"ZEND_DB_ROWNUM\", z1.* + FROM ( + " . $sql . " + ) z1 + ) z2 + WHERE z2.zend_db_rownum BETWEEN " . ($offset+1) . " AND " . ($offset+$count); + } + return $limit_sql; + } + + /** + * DB2-specific last sequence id + * + * @param string $sequenceName + * @return integer + */ + public function lastSequenceId($sequenceName) + { + $sql = 'SELECT PREVVAL FOR '.$this->_adapter->quoteIdentifier($sequenceName).' AS VAL FROM SYSIBM.SYSDUMMY1'; + $value = $this->_adapter->fetchOne($sql); + return $value; + } + + /** + * DB2-specific sequence id value + * + * @param string $sequenceName + * @return integer + */ + public function nextSequenceId($sequenceName) + { + $sql = 'SELECT NEXTVAL FOR '.$this->_adapter->quoteIdentifier($sequenceName).' AS VAL FROM SYSIBM.SYSDUMMY1'; + $value = $this->_adapter->fetchOne($sql); + return $value; + } +} diff --git a/lib/zend/Zend/Db/Adapter/Pdo/Ibm/Ids.php b/lib/zend/Zend/Db/Adapter/Pdo/Ibm/Ids.php new file mode 100644 index 0000000000..8ec33709fe --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Pdo/Ibm/Ids.php @@ -0,0 +1,301 @@ +_adapter = $adapter; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $sql = "SELECT tabname " + . "FROM systables "; + + return $this->_adapter->fetchCol($sql); + } + + /** + * IDS catalog lookup for describe table + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + // this is still a work in progress + + $sql= "SELECT DISTINCT t.owner, t.tabname, c.colname, c.colno, c.coltype, + d.default, c.collength, t.tabid + FROM syscolumns c + JOIN systables t ON c.tabid = t.tabid + LEFT JOIN sysdefaults d ON c.tabid = d.tabid AND c.colno = d.colno + WHERE " + . $this->_adapter->quoteInto('UPPER(t.tabname) = UPPER(?)', $tableName); + if ($schemaName) { + $sql .= $this->_adapter->quoteInto(' AND UPPER(t.owner) = UPPER(?)', $schemaName); + } + $sql .= " ORDER BY c.colno"; + + $desc = array(); + $stmt = $this->_adapter->query($sql); + + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + /** + * The ordering of columns is defined by the query so we can map + * to variables to improve readability + */ + $tabschema = 0; + $tabname = 1; + $colname = 2; + $colno = 3; + $typename = 4; + $default = 5; + $length = 6; + $tabid = 7; + + $primaryCols = null; + + foreach ($result as $key => $row) { + $primary = false; + $primaryPosition = null; + + if (!$primaryCols) { + $primaryCols = $this->_getPrimaryInfo($row[$tabid]); + } + + if (array_key_exists($row[$colno], $primaryCols)) { + $primary = true; + $primaryPosition = $primaryCols[$row[$colno]]; + } + + $identity = false; + if ($row[$typename] == 6 + 256 || + $row[$typename] == 18 + 256) { + $identity = true; + } + + $desc[$this->_adapter->foldCase($row[$colname])] = array ( + 'SCHEMA_NAME' => $this->_adapter->foldCase($row[$tabschema]), + 'TABLE_NAME' => $this->_adapter->foldCase($row[$tabname]), + 'COLUMN_NAME' => $this->_adapter->foldCase($row[$colname]), + 'COLUMN_POSITION' => $row[$colno], + 'DATA_TYPE' => $this->_getDataType($row[$typename]), + 'DEFAULT' => $row[$default], + 'NULLABLE' => (bool) !($row[$typename] - 256 >= 0), + 'LENGTH' => $row[$length], + 'SCALE' => ($row[$typename] == 5 ? $row[$length]&255 : 0), + 'PRECISION' => ($row[$typename] == 5 ? (int)($row[$length]/256) : 0), + 'UNSIGNED' => false, + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + + return $desc; + } + + /** + * Map number representation of a data type + * to a string + * + * @param int $typeNo + * @return string + */ + protected function _getDataType($typeNo) + { + $typemap = array( + 0 => "CHAR", + 1 => "SMALLINT", + 2 => "INTEGER", + 3 => "FLOAT", + 4 => "SMALLFLOAT", + 5 => "DECIMAL", + 6 => "SERIAL", + 7 => "DATE", + 8 => "MONEY", + 9 => "NULL", + 10 => "DATETIME", + 11 => "BYTE", + 12 => "TEXT", + 13 => "VARCHAR", + 14 => "INTERVAL", + 15 => "NCHAR", + 16 => "NVARCHAR", + 17 => "INT8", + 18 => "SERIAL8", + 19 => "SET", + 20 => "MULTISET", + 21 => "LIST", + 22 => "Unnamed ROW", + 40 => "Variable-length opaque type", + 4118 => "Named ROW" + ); + + if ($typeNo - 256 >= 0) { + $typeNo = $typeNo - 256; + } + + return $typemap[$typeNo]; + } + + /** + * Helper method to retrieve primary key column + * and column location + * + * @param int $tabid + * @return array + */ + protected function _getPrimaryInfo($tabid) + { + $sql = "SELECT i.part1, i.part2, i.part3, i.part4, i.part5, i.part6, + i.part7, i.part8, i.part9, i.part10, i.part11, i.part12, + i.part13, i.part14, i.part15, i.part16 + FROM sysindexes i + JOIN sysconstraints c ON c.idxname = i.idxname + WHERE i.tabid = " . $tabid . " AND c.constrtype = 'P'"; + + $stmt = $this->_adapter->query($sql); + $results = $stmt->fetchAll(); + + $cols = array(); + + // this should return only 1 row + // unless there is no primary key, + // in which case, the empty array is returned + if ($results) { + $row = $results[0]; + } else { + return $cols; + } + + $position = 0; + foreach ($row as $key => $colno) { + $position++; + if ($colno == 0) { + return $cols; + } else { + $cols[$colno] = $position; + } + } + } + + /** + * Adds an IDS-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @throws Zend_Db_Adapter_Exception + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } else if ($count == 0) { + $limit_sql = str_ireplace("SELECT", "SELECT * FROM (SELECT", $sql); + $limit_sql .= ") WHERE 0 = 1"; + } else { + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + if ($offset == 0) { + $limit_sql = str_ireplace("SELECT", "SELECT FIRST $count", $sql); + } else { + $limit_sql = str_ireplace("SELECT", "SELECT SKIP $offset LIMIT $count", $sql); + } + } + return $limit_sql; + } + + /** + * IDS-specific last sequence id + * + * @param string $sequenceName + * @return integer + */ + public function lastSequenceId($sequenceName) + { + $sql = 'SELECT '.$this->_adapter->quoteIdentifier($sequenceName).'.CURRVAL FROM ' + .'systables WHERE tabid = 1'; + $value = $this->_adapter->fetchOne($sql); + return $value; + } + + /** + * IDS-specific sequence id value + * + * @param string $sequenceName + * @return integer + */ + public function nextSequenceId($sequenceName) + { + $sql = 'SELECT '.$this->_adapter->quoteIdentifier($sequenceName).'.NEXTVAL FROM ' + .'systables WHERE tabid = 1'; + $value = $this->_adapter->fetchOne($sql); + return $value; + } +} diff --git a/lib/zend/Zend/Db/Adapter/Pdo/Mssql.php b/lib/zend/Zend/Db/Adapter/Pdo/Mssql.php new file mode 100644 index 0000000000..57c06e0844 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Pdo/Mssql.php @@ -0,0 +1,423 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INT' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'TINYINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'FLOAT' => Zend_Db::FLOAT_TYPE, + 'MONEY' => Zend_Db::FLOAT_TYPE, + 'NUMERIC' => Zend_Db::FLOAT_TYPE, + 'REAL' => Zend_Db::FLOAT_TYPE, + 'SMALLMONEY' => Zend_Db::FLOAT_TYPE + ); + + /** + * Creates a PDO DSN for the adapter from $this->_config settings. + * + * @return string + */ + protected function _dsn() + { + // baseline of DSN parts + $dsn = $this->_config; + + // don't pass the username and password in the DSN + unset($dsn['username']); + unset($dsn['password']); + unset($dsn['options']); + unset($dsn['persistent']); + unset($dsn['driver_options']); + + if (isset($dsn['port'])) { + $seperator = ':'; + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $seperator = ','; + } + $dsn['host'] .= $seperator . $dsn['port']; + unset($dsn['port']); + } + + // this driver supports multiple DSN prefixes + // @see http://www.php.net/manual/en/ref.pdo-dblib.connection.php + if (isset($dsn['pdoType'])) { + switch (strtolower($dsn['pdoType'])) { + case 'freetds': + case 'sybase': + $this->_pdoType = 'sybase'; + break; + case 'mssql': + $this->_pdoType = 'mssql'; + break; + case 'dblib': + default: + $this->_pdoType = 'dblib'; + break; + } + unset($dsn['pdoType']); + } + + // use all remaining parts in the DSN + foreach ($dsn as $key => $val) { + $dsn[$key] = "$key=$val"; + } + + $dsn = $this->_pdoType . ':' . implode(';', $dsn); + return $dsn; + } + + /** + * @return void + */ + protected function _connect() + { + if ($this->_connection) { + return; + } + parent::_connect(); + $this->_connection->exec('SET QUOTED_IDENTIFIER ON'); + } + + /** + * Begin a transaction. + * + * It is necessary to override the abstract PDO transaction functions here, as + * the PDO driver for MSSQL does not support transactions. + */ + protected function _beginTransaction() + { + $this->_connect(); + $this->_connection->exec('BEGIN TRANSACTION'); + return true; + } + + /** + * Commit a transaction. + * + * It is necessary to override the abstract PDO transaction functions here, as + * the PDO driver for MSSQL does not support transactions. + */ + protected function _commit() + { + $this->_connect(); + $this->_connection->exec('COMMIT TRANSACTION'); + return true; + } + + /** + * Roll-back a transaction. + * + * It is necessary to override the abstract PDO transaction functions here, as + * the PDO driver for MSSQL does not support transactions. + */ + protected function _rollBack() { + $this->_connect(); + $this->_connection->exec('ROLLBACK TRANSACTION'); + return true; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name"; + return $this->fetchCol($sql); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * PRIMARY_AUTO => integer; position of auto-generated column in primary key + * + * @todo Discover column primary key position. + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + if ($schemaName != null) { + if (strpos($schemaName, '.') !== false) { + $result = explode('.', $schemaName); + $schemaName = $result[1]; + } + } + /** + * Discover metadata information about this table. + */ + $sql = "exec sp_columns @table_name = " . $this->quoteIdentifier($tableName, true); + if ($schemaName != null) { + $sql .= ", @table_owner = " . $this->quoteIdentifier($schemaName, true); + } + + $stmt = $this->query($sql); + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $table_name = 2; + $column_name = 3; + $type_name = 5; + $precision = 6; + $length = 7; + $scale = 8; + $nullable = 10; + $column_def = 12; + $column_position = 16; + + /** + * Discover primary key column(s) for this table. + */ + $sql = "exec sp_pkeys @table_name = " . $this->quoteIdentifier($tableName, true); + if ($schemaName != null) { + $sql .= ", @table_owner = " . $this->quoteIdentifier($schemaName, true); + } + + $stmt = $this->query($sql); + $primaryKeysResult = $stmt->fetchAll(Zend_Db::FETCH_NUM); + $primaryKeyColumn = array(); + $pkey_column_name = 3; + $pkey_key_seq = 4; + foreach ($primaryKeysResult as $pkeysRow) { + $primaryKeyColumn[$pkeysRow[$pkey_column_name]] = $pkeysRow[$pkey_key_seq]; + } + + $desc = array(); + $p = 1; + foreach ($result as $key => $row) { + $identity = false; + $words = explode(' ', $row[$type_name], 2); + if (isset($words[0])) { + $type = $words[0]; + if (isset($words[1])) { + $identity = (bool) preg_match('/identity/', $words[1]); + } + } + + $isPrimary = array_key_exists($row[$column_name], $primaryKeyColumn); + if ($isPrimary) { + $primaryPosition = $primaryKeyColumn[$row[$column_name]]; + } else { + $primaryPosition = null; + } + + $desc[$this->foldCase($row[$column_name])] = array( + 'SCHEMA_NAME' => null, // @todo + 'TABLE_NAME' => $this->foldCase($row[$table_name]), + 'COLUMN_NAME' => $this->foldCase($row[$column_name]), + 'COLUMN_POSITION' => (int) $row[$column_position], + 'DATA_TYPE' => $type, + 'DEFAULT' => $row[$column_def], + 'NULLABLE' => (bool) $row[$nullable], + 'LENGTH' => $row[$length], + 'SCALE' => $row[$scale], + 'PRECISION' => $row[$precision], + 'UNSIGNED' => null, // @todo + 'PRIMARY' => $isPrimary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + return $desc; + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @link http://lists.bestpractical.com/pipermail/rt-devel/2005-June/007339.html + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @throws Zend_Db_Adapter_Exception + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + $sql = preg_replace( + '/^SELECT\s+(DISTINCT\s)?/i', + 'SELECT $1TOP ' . ($count+$offset) . ' ', + $sql + ); + + if ($offset > 0) { + $orderby = stristr($sql, 'ORDER BY'); + + if ($orderby !== false) { + $orderParts = explode(',', substr($orderby, 8)); + $pregReplaceCount = null; + $orderbyInverseParts = array(); + foreach ($orderParts as $orderPart) { + $orderPart = rtrim($orderPart); + $inv = preg_replace('/\s+desc$/i', ' ASC', $orderPart, 1, $pregReplaceCount); + if ($pregReplaceCount) { + $orderbyInverseParts[] = $inv; + continue; + } + $inv = preg_replace('/\s+asc$/i', ' DESC', $orderPart, 1, $pregReplaceCount); + if ($pregReplaceCount) { + $orderbyInverseParts[] = $inv; + continue; + } else { + $orderbyInverseParts[] = $orderPart . ' DESC'; + } + } + + $orderbyInverse = 'ORDER BY ' . implode(', ', $orderbyInverseParts); + } + + + + + $sql = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $sql . ') AS inner_tbl'; + if ($orderby !== false) { + $sql .= ' ' . $orderbyInverse . ' '; + } + $sql .= ') AS outer_tbl'; + if ($orderby !== false) { + $sql .= ' ' . $orderby; + } + } + + return $sql; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * Microsoft SQL Server does not support sequences, so the arguments to + * this method are ignored. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + * @throws Zend_Db_Adapter_Exception + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + $sql = 'SELECT SCOPE_IDENTITY()'; + return (int)$this->fetchOne($sql); + } + + /** + * Retrieve server version in PHP style + * Pdo_Mssql doesn't support getAttribute(PDO::ATTR_SERVER_VERSION) + * @return string + */ + public function getServerVersion() + { + try { + $stmt = $this->query("SELECT SERVERPROPERTY('productversion')"); + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + if (count($result)) { + return $result[0][0]; + } + return null; + } catch (PDOException $e) { + return null; + } + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Db/Adapter/Pdo/Mysql.php b/lib/zend/Zend/Db/Adapter/Pdo/Mysql.php new file mode 100644 index 0000000000..7c1af3b6b3 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Pdo/Mysql.php @@ -0,0 +1,257 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INT' => Zend_Db::INT_TYPE, + 'INTEGER' => Zend_Db::INT_TYPE, + 'MEDIUMINT' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'TINYINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'SERIAL' => Zend_Db::BIGINT_TYPE, + 'DEC' => Zend_Db::FLOAT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'DOUBLE' => Zend_Db::FLOAT_TYPE, + 'DOUBLE PRECISION' => Zend_Db::FLOAT_TYPE, + 'FIXED' => Zend_Db::FLOAT_TYPE, + 'FLOAT' => Zend_Db::FLOAT_TYPE + ); + + /** + * Creates a PDO object and connects to the database. + * + * @return void + * @throws Zend_Db_Adapter_Exception + */ + protected function _connect() + { + if ($this->_connection) { + return; + } + + if (!empty($this->_config['charset'])) { + $initCommand = "SET NAMES '" . $this->_config['charset'] . "'"; + $this->_config['driver_options'][1002] = $initCommand; // 1002 = PDO::MYSQL_ATTR_INIT_COMMAND + } + + parent::_connect(); + } + + /** + * @return string + */ + public function getQuoteIdentifierSymbol() + { + return "`"; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + return $this->fetchCol('SHOW TABLES'); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + // @todo use INFORMATION_SCHEMA someday when MySQL's + // implementation has reasonably good performance and + // the version with this improvement is in wide use. + + if ($schemaName) { + $sql = 'DESCRIBE ' . $this->quoteIdentifier("$schemaName.$tableName", true); + } else { + $sql = 'DESCRIBE ' . $this->quoteIdentifier($tableName, true); + } + $stmt = $this->query($sql); + + // Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $field = 0; + $type = 1; + $null = 2; + $key = 3; + $default = 4; + $extra = 5; + + $desc = array(); + $i = 1; + $p = 1; + foreach ($result as $row) { + list($length, $scale, $precision, $unsigned, $primary, $primaryPosition, $identity) + = array(null, null, null, null, false, null, false); + if (preg_match('/unsigned/', $row[$type])) { + $unsigned = true; + } + if (preg_match('/^((?:var)?char)\((\d+)\)/', $row[$type], $matches)) { + $row[$type] = $matches[1]; + $length = $matches[2]; + } else if (preg_match('/^decimal\((\d+),(\d+)\)/', $row[$type], $matches)) { + $row[$type] = 'decimal'; + $precision = $matches[1]; + $scale = $matches[2]; + } else if (preg_match('/^float\((\d+),(\d+)\)/', $row[$type], $matches)) { + $row[$type] = 'float'; + $precision = $matches[1]; + $scale = $matches[2]; + } else if (preg_match('/^((?:big|medium|small|tiny)?int)\((\d+)\)/', $row[$type], $matches)) { + $row[$type] = $matches[1]; + // The optional argument of a MySQL int type is not precision + // or length; it is only a hint for display width. + } + if (strtoupper($row[$key]) == 'PRI') { + $primary = true; + $primaryPosition = $p; + if ($row[$extra] == 'auto_increment') { + $identity = true; + } else { + $identity = false; + } + ++$p; + } + $desc[$this->foldCase($row[$field])] = array( + 'SCHEMA_NAME' => null, // @todo + 'TABLE_NAME' => $this->foldCase($tableName), + 'COLUMN_NAME' => $this->foldCase($row[$field]), + 'COLUMN_POSITION' => $i, + 'DATA_TYPE' => $row[$type], + 'DEFAULT' => $row[$default], + 'NULLABLE' => (bool) ($row[$null] == 'YES'), + 'LENGTH' => $length, + 'SCALE' => $scale, + 'PRECISION' => $precision, + 'UNSIGNED' => $unsigned, + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + ++$i; + } + return $desc; + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @throws Zend_Db_Adapter_Exception + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + $sql .= " LIMIT $count"; + if ($offset > 0) { + $sql .= " OFFSET $offset"; + } + + return $sql; + } + +} diff --git a/lib/zend/Zend/Db/Adapter/Pdo/Oci.php b/lib/zend/Zend/Db/Adapter/Pdo/Oci.php new file mode 100644 index 0000000000..8256ece0f9 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Pdo/Oci.php @@ -0,0 +1,378 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'BINARY_DOUBLE' => Zend_Db::FLOAT_TYPE, + 'BINARY_FLOAT' => Zend_Db::FLOAT_TYPE, + 'NUMBER' => Zend_Db::FLOAT_TYPE + ); + + /** + * Creates a PDO DSN for the adapter from $this->_config settings. + * + * @return string + */ + protected function _dsn() + { + // baseline of DSN parts + $dsn = $this->_config; + + if (isset($dsn['host'])) { + $tns = 'dbname=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)' . + '(HOST=' . $dsn['host'] . ')'; + + if (isset($dsn['port'])) { + $tns .= '(PORT=' . $dsn['port'] . ')'; + } else { + $tns .= '(PORT=1521)'; + } + + $tns .= '))(CONNECT_DATA=(SID=' . $dsn['dbname'] . ')))'; + } else { + $tns = 'dbname=' . $dsn['dbname']; + } + + if (isset($dsn['charset'])) { + $tns .= ';charset=' . $dsn['charset']; + } + + return $this->_pdoType . ':' . $tns; + } + + /** + * Quote a raw string. + * Most PDO drivers have an implementation for the quote() method, + * but the Oracle OCI driver must use the same implementation as the + * Zend_Db_Adapter_Abstract class. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value) || is_float($value)) { + return $value; + } + $value = str_replace("'", "''", $value); + return "'" . addcslashes($value, "\000\n\r\\\032") . "'"; + } + + /** + * Quote a table identifier and alias. + * + * @param string|array|Zend_Db_Expr $ident The identifier or expression. + * @param string $alias An alias for the table. + * @return string The quoted identifier and alias. + */ + public function quoteTableAs($ident, $alias = null, $auto = false) + { + // Oracle doesn't allow the 'AS' keyword between the table identifier/expression and alias. + return $this->_quoteIdentifierAs($ident, $alias, $auto, ' '); + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $data = $this->fetchCol('SELECT table_name FROM all_tables'); + return $data; + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $version = $this->getServerVersion(); + if (($version === null) || version_compare($version, '9.0.0', '>=')) { + $sql = "SELECT TC.TABLE_NAME, TC.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE, + TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH, + TC.DATA_SCALE, TC.DATA_PRECISION, C.CONSTRAINT_TYPE, CC.POSITION + FROM ALL_TAB_COLUMNS TC + LEFT JOIN (ALL_CONS_COLUMNS CC JOIN ALL_CONSTRAINTS C + ON (CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND CC.TABLE_NAME = C.TABLE_NAME AND C.CONSTRAINT_TYPE = 'P')) + ON TC.TABLE_NAME = CC.TABLE_NAME AND TC.COLUMN_NAME = CC.COLUMN_NAME + WHERE UPPER(TC.TABLE_NAME) = UPPER(:TBNAME)"; + $bind[':TBNAME'] = $tableName; + if ($schemaName) { + $sql .= ' AND UPPER(TC.OWNER) = UPPER(:SCNAME)'; + $bind[':SCNAME'] = $schemaName; + } + $sql .= ' ORDER BY TC.COLUMN_ID'; + } else { + $subSql="SELECT AC.OWNER, AC.TABLE_NAME, ACC.COLUMN_NAME, AC.CONSTRAINT_TYPE, ACC.POSITION + from ALL_CONSTRAINTS AC, ALL_CONS_COLUMNS ACC + WHERE ACC.CONSTRAINT_NAME = AC.CONSTRAINT_NAME + AND ACC.TABLE_NAME = AC.TABLE_NAME + AND ACC.OWNER = AC.OWNER + AND AC.CONSTRAINT_TYPE = 'P' + AND UPPER(AC.TABLE_NAME) = UPPER(:TBNAME)"; + $bind[':TBNAME'] = $tableName; + if ($schemaName) { + $subSql .= ' AND UPPER(ACC.OWNER) = UPPER(:SCNAME)'; + $bind[':SCNAME'] = $schemaName; + } + $sql="SELECT TC.TABLE_NAME, TC.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE, + TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH, + TC.DATA_SCALE, TC.DATA_PRECISION, CC.CONSTRAINT_TYPE, CC.POSITION + FROM ALL_TAB_COLUMNS TC, ($subSql) CC + WHERE UPPER(TC.TABLE_NAME) = UPPER(:TBNAME) + AND TC.OWNER = CC.OWNER(+) AND TC.TABLE_NAME = CC.TABLE_NAME(+) AND TC.COLUMN_NAME = CC.COLUMN_NAME(+)"; + if ($schemaName) { + $sql .= ' AND UPPER(TC.OWNER) = UPPER(:SCNAME)'; + } + $sql .= ' ORDER BY TC.COLUMN_ID'; + } + + $stmt = $this->query($sql, $bind); + + /** + * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection + */ + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $table_name = 0; + $owner = 1; + $column_name = 2; + $data_type = 3; + $data_default = 4; + $nullable = 5; + $column_id = 6; + $data_length = 7; + $data_scale = 8; + $data_precision = 9; + $constraint_type = 10; + $position = 11; + + $desc = array(); + foreach ($result as $key => $row) { + list ($primary, $primaryPosition, $identity) = array(false, null, false); + if ($row[$constraint_type] == 'P') { + $primary = true; + $primaryPosition = $row[$position]; + /** + * Oracle does not support auto-increment keys. + */ + $identity = false; + } + $desc[$this->foldCase($row[$column_name])] = array( + 'SCHEMA_NAME' => $this->foldCase($row[$owner]), + 'TABLE_NAME' => $this->foldCase($row[$table_name]), + 'COLUMN_NAME' => $this->foldCase($row[$column_name]), + 'COLUMN_POSITION' => $row[$column_id], + 'DATA_TYPE' => $row[$data_type], + 'DEFAULT' => $row[$data_default], + 'NULLABLE' => (bool) ($row[$nullable] == 'Y'), + 'LENGTH' => $row[$data_length], + 'SCALE' => $row[$data_scale], + 'PRECISION' => $row[$data_precision], + 'UNSIGNED' => null, // @todo + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + return $desc; + } + + /** + * Return the most recent value from the specified sequence in the database. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return integer + */ + public function lastSequenceId($sequenceName) + { + $this->_connect(); + $value = $this->fetchOne('SELECT '.$this->quoteIdentifier($sequenceName, true).'.CURRVAL FROM dual'); + return $value; + } + + /** + * Generate a new value from the specified sequence in the database, and return it. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return integer + */ + public function nextSequenceId($sequenceName) + { + $this->_connect(); + $value = $this->fetchOne('SELECT '.$this->quoteIdentifier($sequenceName, true).'.NEXTVAL FROM dual'); + return $value; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * Oracle does not support IDENTITY columns, so if the sequence is not + * specified, this method returns null. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + * @throws Zend_Db_Adapter_Oracle_Exception + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + if ($tableName !== null) { + $sequenceName = $tableName; + if ($primaryKey) { + $sequenceName .= $this->foldCase("_$primaryKey"); + } + $sequenceName .= $this->foldCase('_seq'); + return $this->lastSequenceId($sequenceName); + } + // No support for IDENTITY columns; return null + return null; + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset + * @throws Zend_Db_Adapter_Exception + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + /** + * Oracle does not implement the LIMIT clause as some RDBMS do. + * We have to simulate it with subqueries and ROWNUM. + * Unfortunately because we use the column wildcard "*", + * this puts an extra column into the query result set. + */ + $limit_sql = "SELECT z2.* + FROM ( + SELECT z1.*, ROWNUM AS \"zend_db_rownum\" + FROM ( + " . $sql . " + ) z1 + ) z2 + WHERE z2.\"zend_db_rownum\" BETWEEN " . ($offset+1) . " AND " . ($offset+$count); + return $limit_sql; + } + +} diff --git a/lib/zend/Zend/Db/Adapter/Pdo/Pgsql.php b/lib/zend/Zend/Db/Adapter/Pdo/Pgsql.php new file mode 100644 index 0000000000..e07a9babf0 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Pdo/Pgsql.php @@ -0,0 +1,326 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INTEGER' => Zend_Db::INT_TYPE, + 'SERIAL' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'BIGSERIAL' => Zend_Db::BIGINT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'DOUBLE PRECISION' => Zend_Db::FLOAT_TYPE, + 'NUMERIC' => Zend_Db::FLOAT_TYPE, + 'REAL' => Zend_Db::FLOAT_TYPE + ); + + /** + * Creates a PDO object and connects to the database. + * + * @return void + * @throws Zend_Db_Adapter_Exception + */ + protected function _connect() + { + if ($this->_connection) { + return; + } + + parent::_connect(); + + if (!empty($this->_config['charset'])) { + $sql = "SET NAMES '" . $this->_config['charset'] . "'"; + $this->_connection->exec($sql); + } + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + // @todo use a better query with joins instead of subqueries + $sql = "SELECT c.relname AS table_name " + . "FROM pg_class c, pg_user u " + . "WHERE c.relowner = u.usesysid AND c.relkind = 'r' " + . "AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) " + . "AND c.relname !~ '^(pg_|sql_)' " + . "UNION " + . "SELECT c.relname AS table_name " + . "FROM pg_class c " + . "WHERE c.relkind = 'r' " + . "AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) " + . "AND NOT EXISTS (SELECT 1 FROM pg_user WHERE usesysid = c.relowner) " + . "AND c.relname !~ '^pg_'"; + + return $this->fetchCol($sql); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $sql = "SELECT + a.attnum, + n.nspname, + c.relname, + a.attname AS colname, + t.typname AS type, + a.atttypmod, + FORMAT_TYPE(a.atttypid, a.atttypmod) AS complete_type, + d.adsrc AS default_value, + a.attnotnull AS notnull, + a.attlen AS length, + co.contype, + ARRAY_TO_STRING(co.conkey, ',') AS conkey + FROM pg_attribute AS a + JOIN pg_class AS c ON a.attrelid = c.oid + JOIN pg_namespace AS n ON c.relnamespace = n.oid + JOIN pg_type AS t ON a.atttypid = t.oid + LEFT OUTER JOIN pg_constraint AS co ON (co.conrelid = c.oid + AND a.attnum = ANY(co.conkey) AND co.contype = 'p') + LEFT OUTER JOIN pg_attrdef AS d ON d.adrelid = c.oid AND d.adnum = a.attnum + WHERE a.attnum > 0 AND c.relname = ".$this->quote($tableName); + if ($schemaName) { + $sql .= " AND n.nspname = ".$this->quote($schemaName); + } + $sql .= ' ORDER BY a.attnum'; + + $stmt = $this->query($sql); + + // Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $attnum = 0; + $nspname = 1; + $relname = 2; + $colname = 3; + $type = 4; + $atttypemod = 5; + $complete_type = 6; + $default_value = 7; + $notnull = 8; + $length = 9; + $contype = 10; + $conkey = 11; + + $desc = array(); + foreach ($result as $key => $row) { + if ($row[$type] == 'varchar') { + if (preg_match('/character varying(?:\((\d+)\))?/', $row[$complete_type], $matches)) { + if (isset($matches[1])) { + $row[$length] = $matches[1]; + } else { + $row[$length] = null; // unlimited + } + } + } + list($primary, $primaryPosition, $identity) = array(false, null, false); + if ($row[$contype] == 'p') { + $primary = true; + $primaryPosition = array_search($row[$attnum], explode(',', $row[$conkey])) + 1; + $identity = (bool) (preg_match('/^nextval/', $row[$default_value])); + } + $desc[$this->foldCase($row[$colname])] = array( + 'SCHEMA_NAME' => $this->foldCase($row[$nspname]), + 'TABLE_NAME' => $this->foldCase($row[$relname]), + 'COLUMN_NAME' => $this->foldCase($row[$colname]), + 'COLUMN_POSITION' => $row[$attnum], + 'DATA_TYPE' => $row[$type], + 'DEFAULT' => $row[$default_value], + 'NULLABLE' => (bool) ($row[$notnull] != 't'), + 'LENGTH' => $row[$length], + 'SCALE' => null, // @todo + 'PRECISION' => null, // @todo + 'UNSIGNED' => null, // @todo + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + return $desc; + } + + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + $sql .= " LIMIT $count"; + if ($offset > 0) { + $sql .= " OFFSET $offset"; + } + + return $sql; + } + + /** + * Return the most recent value from the specified sequence in the database. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function lastSequenceId($sequenceName) + { + $this->_connect(); + $value = $this->fetchOne("SELECT CURRVAL(".$this->quote($sequenceName).")"); + return $value; + } + + /** + * Generate a new value from the specified sequence in the database, and return it. + * This is supported only on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. + * + * @param string $sequenceName + * @return string + */ + public function nextSequenceId($sequenceName) + { + $this->_connect(); + $value = $this->fetchOne("SELECT NEXTVAL(".$this->quote($sequenceName).")"); + return $value; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + if ($tableName !== null) { + $sequenceName = $tableName; + if ($primaryKey) { + $sequenceName .= "_$primaryKey"; + } + $sequenceName .= '_seq'; + return $this->lastSequenceId($sequenceName); + } + return $this->_connection->lastInsertId($tableName); + } + +} diff --git a/lib/zend/Zend/Db/Adapter/Pdo/Sqlite.php b/lib/zend/Zend/Db/Adapter/Pdo/Sqlite.php new file mode 100644 index 0000000000..8aedbc88f1 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Pdo/Sqlite.php @@ -0,0 +1,297 @@ + Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INTEGER' => Zend_Db::BIGINT_TYPE, + 'REAL' => Zend_Db::FLOAT_TYPE + ); + + /** + * Constructor. + * + * $config is an array of key/value pairs containing configuration + * options. Note that the SQLite options are different than most of + * the other PDO adapters in that no username or password are needed. + * Also, an extra config key "sqlite2" specifies compatibility mode. + * + * dbname => (string) The name of the database to user (required, + * use :memory: for memory-based database) + * + * sqlite2 => (boolean) PDO_SQLITE defaults to SQLite 3. For compatibility + * with an older SQLite 2 database, set this to TRUE. + * + * @param array $config An array of configuration keys. + */ + public function __construct(array $config = array()) + { + if (isset($config['sqlite2']) && $config['sqlite2']) { + $this->_pdoType = 'sqlite2'; + } + + // SQLite uses no username/password. Stub to satisfy parent::_connect() + $this->_config['username'] = null; + $this->_config['password'] = null; + + return parent::__construct($config); + } + + /** + * Check for config options that are mandatory. + * Throw exceptions if any are missing. + * + * @param array $config + * @throws Zend_Db_Adapter_Exception + */ + protected function _checkRequiredOptions(array $config) + { + // we need at least a dbname + if (! array_key_exists('dbname', $config)) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance"); + } + } + + /** + * DSN builder + */ + protected function _dsn() + { + return $this->_pdoType .':'. $this->_config['dbname']; + } + + /** + * Special configuration for SQLite behavior: make sure that result sets + * contain keys like 'column' instead of 'table.column'. + * + * @throws Zend_Db_Adapter_Exception + */ + protected function _connect() + { + /** + * if we already have a PDO object, no need to re-connect. + */ + if ($this->_connection) { + return; + } + + parent::_connect(); + + $retval = $this->_connection->exec('PRAGMA full_column_names=0'); + if ($retval === false) { + $error = $this->_connection->errorInfo(); + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception($error[2]); + } + + $retval = $this->_connection->exec('PRAGMA short_column_names=1'); + if ($retval === false) { + $error = $this->_connection->errorInfo(); + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception($error[2]); + } + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $sql = "SELECT name FROM sqlite_master WHERE type='table' " + . "UNION ALL SELECT name FROM sqlite_temp_master " + . "WHERE type='table' ORDER BY name"; + + return $this->fetchCol($sql); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + $sql = 'PRAGMA '; + + if ($schemaName) { + $sql .= $this->quoteIdentifier($schemaName) . '.'; + } + + $sql .= 'table_info('.$this->quoteIdentifier($tableName).')'; + + $stmt = $this->query($sql); + + /** + * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection + */ + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $cid = 0; + $name = 1; + $type = 2; + $notnull = 3; + $dflt_value = 4; + $pk = 5; + + $desc = array(); + + $p = 1; + foreach ($result as $key => $row) { + list($length, $scale, $precision, $primary, $primaryPosition, $identity) = + array(null, null, null, false, null, false); + if (preg_match('/^((?:var)?char)\((\d+)\)/i', $row[$type], $matches)) { + $row[$type] = $matches[1]; + $length = $matches[2]; + } else if (preg_match('/^decimal\((\d+),(\d+)\)/i', $row[$type], $matches)) { + $row[$type] = 'DECIMAL'; + $precision = $matches[1]; + $scale = $matches[2]; + } + if ((bool) $row[$pk]) { + $primary = true; + $primaryPosition = $p; + /** + * SQLite INTEGER primary key is always auto-increment. + */ + $identity = (bool) ($row[$type] == 'INTEGER'); + ++$p; + } + $desc[$this->foldCase($row[$name])] = array( + 'SCHEMA_NAME' => $this->foldCase($schemaName), + 'TABLE_NAME' => $this->foldCase($tableName), + 'COLUMN_NAME' => $this->foldCase($row[$name]), + 'COLUMN_POSITION' => $row[$cid]+1, + 'DATA_TYPE' => $row[$type], + 'DEFAULT' => $row[$dflt_value], + 'NULLABLE' => ! (bool) $row[$notnull], + 'LENGTH' => $length, + 'SCALE' => $scale, + 'PRECISION' => $precision, + 'UNSIGNED' => null, // Sqlite3 does not support unsigned data + 'PRIMARY' => $primary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity + ); + } + return $desc; + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + $sql .= " LIMIT $count"; + if ($offset > 0) { + $sql .= " OFFSET $offset"; + } + + return $sql; + } + +} diff --git a/lib/zend/Zend/Db/Adapter/Sqlsrv.php b/lib/zend/Zend/Db/Adapter/Sqlsrv.php new file mode 100644 index 0000000000..3de2500ea1 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Sqlsrv.php @@ -0,0 +1,661 @@ + (string) Connect to the database as this username. + * password => (string) Password associated with the username. + * dbname => The name of the local SQL Server instance + * + * @var array + */ + protected $_config = array( + 'dbname' => null, + 'username' => null, + 'password' => null, + ); + + /** + * Last insert id from INSERT query + * + * @var int + */ + protected $_lastInsertId; + + /** + * Query used to fetch last insert id + * + * @var string + */ + protected $_lastInsertSQL = 'SELECT SCOPE_IDENTITY() as Current_Identity'; + + /** + * Keys are UPPERCASE SQL datatypes or the constants + * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE. + * + * Values are: + * 0 = 32-bit integer + * 1 = 64-bit integer + * 2 = float or decimal + * + * @var array Associative array of datatypes to values 0, 1, or 2. + */ + protected $_numericDataTypes = array( + Zend_Db::INT_TYPE => Zend_Db::INT_TYPE, + Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE, + Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE, + 'INT' => Zend_Db::INT_TYPE, + 'SMALLINT' => Zend_Db::INT_TYPE, + 'TINYINT' => Zend_Db::INT_TYPE, + 'BIGINT' => Zend_Db::BIGINT_TYPE, + 'DECIMAL' => Zend_Db::FLOAT_TYPE, + 'FLOAT' => Zend_Db::FLOAT_TYPE, + 'MONEY' => Zend_Db::FLOAT_TYPE, + 'NUMERIC' => Zend_Db::FLOAT_TYPE, + 'REAL' => Zend_Db::FLOAT_TYPE, + 'SMALLMONEY' => Zend_Db::FLOAT_TYPE, + ); + + /** + * Default class name for a DB statement. + * + * @var string + */ + protected $_defaultStmtClass = 'Zend_Db_Statement_Sqlsrv'; + + /** + * Creates a connection resource. + * + * @return void + * @throws Zend_Db_Adapter_Sqlsrv_Exception + */ + protected function _connect() + { + if (is_resource($this->_connection)) { + // connection already exists + return; + } + + if (!extension_loaded('sqlsrv')) { + /** + * @see Zend_Db_Adapter_Sqlsrv_Exception + */ + require_once 'Zend/Db/Adapter/Sqlsrv/Exception.php'; + throw new Zend_Db_Adapter_Sqlsrv_Exception('The Sqlsrv extension is required for this adapter but the extension is not loaded'); + } + + $serverName = $this->_config['host']; + if (isset($this->_config['port'])) { + $port = (integer) $this->_config['port']; + $serverName .= ', ' . $port; + } + + $connectionInfo = array( + 'Database' => $this->_config['dbname'], + ); + + if (isset($this->_config['username']) && isset($this->_config['password'])) + { + $connectionInfo += array( + 'UID' => $this->_config['username'], + 'PWD' => $this->_config['password'], + ); + } + // else - windows authentication + + if (!empty($this->_config['driver_options'])) { + foreach ($this->_config['driver_options'] as $option => $value) { + // A value may be a constant. + if (is_string($value)) { + $constantValue = @constant(strtoupper($value)); + if ($constantValue === null) { + $connectionInfo[$option] = $value; + } else { + $connectionInfo[$option] = $constantValue; + } + } + } + } + + $this->_connection = sqlsrv_connect($serverName, $connectionInfo); + + if (!$this->_connection) { + /** + * @see Zend_Db_Adapter_Sqlsrv_Exception + */ + require_once 'Zend/Db/Adapter/Sqlsrv/Exception.php'; + throw new Zend_Db_Adapter_Sqlsrv_Exception(sqlsrv_errors()); + } + } + + /** + * Check for config options that are mandatory. + * Throw exceptions if any are missing. + * + * @param array $config + * @throws Zend_Db_Adapter_Exception + */ + protected function _checkRequiredOptions(array $config) + { + // we need at least a dbname + if (! array_key_exists('dbname', $config)) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance"); + } + + if (! array_key_exists('password', $config) && array_key_exists('username', $config)) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'password' for login credentials. + If Windows Authentication is desired, both keys 'username' and 'password' should be ommited from config."); + } + + if (array_key_exists('password', $config) && !array_key_exists('username', $config)) { + /** + * @see Zend_Db_Adapter_Exception + */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'username' for login credentials. + If Windows Authentication is desired, both keys 'username' and 'password' should be ommited from config."); + } + } + + /** + * Set the transaction isoltion level. + * + * @param integer|null $level A fetch mode from SQLSRV_TXN_*. + * @return true + * @throws Zend_Db_Adapter_Sqlsrv_Exception + */ + public function setTransactionIsolationLevel($level = null) + { + $this->_connect(); + $sql = null; + + // Default transaction level in sql server + if ($level === null) + { + $level = SQLSRV_TXN_READ_COMMITTED; + } + + switch ($level) { + case SQLSRV_TXN_READ_UNCOMMITTED: + $sql = "READ UNCOMMITTED"; + break; + case SQLSRV_TXN_READ_COMMITTED: + $sql = "READ COMMITTED"; + break; + case SQLSRV_TXN_REPEATABLE_READ: + $sql = "REPEATABLE READ"; + break; + case SQLSRV_TXN_SNAPSHOT: + $sql = "SNAPSHOT"; + break; + case SQLSRV_TXN_SERIALIZABLE: + $sql = "SERIALIZABLE"; + break; + default: + require_once 'Zend/Db/Adapter/Sqlsrv/Exception.php'; + throw new Zend_Db_Adapter_Sqlsrv_Exception("Invalid transaction isolation level mode '$level' specified"); + } + + if (!sqlsrv_query($this->_connection, "SET TRANSACTION ISOLATION LEVEL $sql;")) { + require_once 'Zend/Db/Adapter/Sqlsrv/Exception.php'; + throw new Zend_Db_Adapter_Sqlsrv_Exception("Transaction cannot be changed to '$level'"); + } + + return true; + } + + /** + * Test if a connection is active + * + * @return boolean + */ + public function isConnected() + { + return (is_resource($this->_connection) + && (get_resource_type($this->_connection) == 'SQL Server Connection') + ); + } + + /** + * Force the connection to close. + * + * @return void + */ + public function closeConnection() + { + if ($this->isConnected()) { + sqlsrv_close($this->_connection); + } + $this->_connection = null; + } + + /** + * Returns an SQL statement for preparation. + * + * @param string $sql The SQL statement with placeholders. + * @return Zend_Db_Statement_Sqlsrv + */ + public function prepare($sql) + { + $this->_connect(); + $stmtClass = $this->_defaultStmtClass; + + if (!class_exists($stmtClass)) { + /** + * @see Zend_Loader + */ + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($stmtClass); + } + + $stmt = new $stmtClass($this, $sql); + $stmt->setFetchMode($this->_fetchMode); + return $stmt; + } + + /** + * Quote a raw string. + * + * @param string $value Raw string + * @return string Quoted string + */ + protected function _quote($value) + { + if (is_int($value)) { + return $value; + } elseif (is_float($value)) { + return sprintf('%F', $value); + } + + return "'" . str_replace("'", "''", $value) . "'"; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + if ($tableName) { + $tableName = $this->quote($tableName); + $sql = 'SELECT IDENT_CURRENT (' . $tableName . ') as Current_Identity'; + return (string) $this->fetchOne($sql); + } + + if ($this->_lastInsertId > 0) { + return (string) $this->_lastInsertId; + } + + $sql = $this->_lastInsertSQL; + return (string) $this->fetchOne($sql); + } + + /** + * Inserts a table row with specified data. + * + * @param mixed $table The table to insert data into. + * @param array $bind Column-value pairs. + * @return int The number of affected rows. + */ + public function insert($table, array $bind) + { + // extract and quote col names from the array keys + $cols = array(); + $vals = array(); + foreach ($bind as $col => $val) { + $cols[] = $this->quoteIdentifier($col, true); + if ($val instanceof Zend_Db_Expr) { + $vals[] = $val->__toString(); + unset($bind[$col]); + } else { + $vals[] = '?'; + } + } + + // build the statement + $sql = "INSERT INTO " + . $this->quoteIdentifier($table, true) + . ' (' . implode(', ', $cols) . ') ' + . 'VALUES (' . implode(', ', $vals) . ')' + . ' ' . $this->_lastInsertSQL; + + // execute the statement and return the number of affected rows + $stmt = $this->query($sql, array_values($bind)); + $result = $stmt->rowCount(); + + $stmt->nextRowset(); + + $this->_lastInsertId = $stmt->fetchColumn(); + + return $result; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + $this->_connect(); + $sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name"; + return $this->fetchCol($sql); + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * IDENTITY => integer; true if column is auto-generated with unique values + * + * @todo Discover integer unsigned property. + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + /** + * Discover metadata information about this table. + */ + $sql = "exec sp_columns @table_name = " . $this->quoteIdentifier($tableName, true); + $stmt = $this->query($sql); + $result = $stmt->fetchAll(Zend_Db::FETCH_NUM); + + $owner = 1; + $table_name = 2; + $column_name = 3; + $type_name = 5; + $precision = 6; + $length = 7; + $scale = 8; + $nullable = 10; + $column_def = 12; + $column_position = 16; + + /** + * Discover primary key column(s) for this table. + */ + $tableOwner = $result[0][$owner]; + $sql = "exec sp_pkeys @table_owner = " . $tableOwner + . ", @table_name = " . $this->quoteIdentifier($tableName, true); + $stmt = $this->query($sql); + + $primaryKeysResult = $stmt->fetchAll(Zend_Db::FETCH_NUM); + $primaryKeyColumn = array(); + + // Per http://msdn.microsoft.com/en-us/library/ms189813.aspx, + // results from sp_keys stored procedure are: + // 0=TABLE_QUALIFIER 1=TABLE_OWNER 2=TABLE_NAME 3=COLUMN_NAME 4=KEY_SEQ 5=PK_NAME + + $pkey_column_name = 3; + $pkey_key_seq = 4; + foreach ($primaryKeysResult as $pkeysRow) { + $primaryKeyColumn[$pkeysRow[$pkey_column_name]] = $pkeysRow[$pkey_key_seq]; + } + + $desc = array(); + $p = 1; + foreach ($result as $key => $row) { + $identity = false; + $words = explode(' ', $row[$type_name], 2); + if (isset($words[0])) { + $type = $words[0]; + if (isset($words[1])) { + $identity = (bool) preg_match('/identity/', $words[1]); + } + } + + $isPrimary = array_key_exists($row[$column_name], $primaryKeyColumn); + if ($isPrimary) { + $primaryPosition = $primaryKeyColumn[$row[$column_name]]; + } else { + $primaryPosition = null; + } + + $desc[$this->foldCase($row[$column_name])] = array( + 'SCHEMA_NAME' => null, // @todo + 'TABLE_NAME' => $this->foldCase($row[$table_name]), + 'COLUMN_NAME' => $this->foldCase($row[$column_name]), + 'COLUMN_POSITION' => (int) $row[$column_position], + 'DATA_TYPE' => $type, + 'DEFAULT' => $row[$column_def], + 'NULLABLE' => (bool) $row[$nullable], + 'LENGTH' => $row[$length], + 'SCALE' => $row[$scale], + 'PRECISION' => $row[$precision], + 'UNSIGNED' => null, // @todo + 'PRIMARY' => $isPrimary, + 'PRIMARY_POSITION' => $primaryPosition, + 'IDENTITY' => $identity, + ); + } + + return $desc; + } + + /** + * Leave autocommit mode and begin a transaction. + * + * @return void + * @throws Zend_Db_Adapter_Sqlsrv_Exception + */ + protected function _beginTransaction() + { + if (!sqlsrv_begin_transaction($this->_connection)) { + require_once 'Zend/Db/Adapter/Sqlsrv/Exception.php'; + throw new Zend_Db_Adapter_Sqlsrv_Exception(sqlsrv_errors()); + } + } + + /** + * Commit a transaction and return to autocommit mode. + * + * @return void + * @throws Zend_Db_Adapter_Sqlsrv_Exception + */ + protected function _commit() + { + if (!sqlsrv_commit($this->_connection)) { + require_once 'Zend/Db/Adapter/Sqlsrv/Exception.php'; + throw new Zend_Db_Adapter_Sqlsrv_Exception(sqlsrv_errors()); + } + } + + /** + * Roll back a transaction and return to autocommit mode. + * + * @return void + * @throws Zend_Db_Adapter_Sqlsrv_Exception + */ + protected function _rollBack() + { + if (!sqlsrv_rollback($this->_connection)) { + require_once 'Zend/Db/Adapter/Sqlsrv/Exception.php'; + throw new Zend_Db_Adapter_Sqlsrv_Exception(sqlsrv_errors()); + } + } + + /** + * Set the fetch mode. + * + * @todo Support FETCH_CLASS and FETCH_INTO. + * + * @param integer $mode A fetch mode. + * @return void + * @throws Zend_Db_Adapter_Sqlsrv_Exception + */ + public function setFetchMode($mode) + { + switch ($mode) { + case Zend_Db::FETCH_NUM: // seq array + case Zend_Db::FETCH_ASSOC: // assoc array + case Zend_Db::FETCH_BOTH: // seq+assoc array + case Zend_Db::FETCH_OBJ: // object + $this->_fetchMode = $mode; + break; + case Zend_Db::FETCH_BOUND: // bound to PHP variable + require_once 'Zend/Db/Adapter/Sqlsrv/Exception.php'; + throw new Zend_Db_Adapter_Sqlsrv_Exception('FETCH_BOUND is not supported yet'); + break; + default: + require_once 'Zend/Db/Adapter/Sqlsrv/Exception.php'; + throw new Zend_Db_Adapter_Sqlsrv_Exception("Invalid fetch mode '$mode' specified"); + break; + } + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param string $sql + * @param integer $count + * @param integer $offset OPTIONAL + * @return string + * @throws Zend_Db_Adapter_Sqlsrv_Exception + */ + public function limit($sql, $count, $offset = 0) + { + $count = intval($count); + if ($count <= 0) { + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid"); + } + + $offset = intval($offset); + if ($offset < 0) { + /** @see Zend_Db_Adapter_Exception */ + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid"); + } + + $orderby = stristr($sql, 'ORDER BY'); + if ($orderby !== false) { + $sort = (stripos($orderby, ' desc') !== false) ? 'desc' : 'asc'; + $order = str_ireplace('ORDER BY', '', $orderby); + $order = trim(preg_replace('/\bASC\b|\bDESC\b/i', '', $order)); + } + + $sql = preg_replace('/^SELECT\s/i', 'SELECT TOP ' . ($count+$offset) . ' ', $sql); + + $sql = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $sql . ') AS inner_tbl'; + if ($orderby !== false) { + $sql .= ' ORDER BY ' . $order . ' '; + $sql .= (stripos($sort, 'asc') !== false) ? 'DESC' : 'ASC'; + } + $sql .= ') AS outer_tbl'; + if ($orderby !== false) { + $sql .= ' ORDER BY ' . $order . ' ' . $sort; + } + + return $sql; + } + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + public function supportsParameters($type) + { + if ($type == 'positional') { + return true; + } + + // if its 'named' or anything else + return false; + } + + /** + * Retrieve server version in PHP style + * + * @return string + */ + public function getServerVersion() + { + $this->_connect(); + $version = sqlsrv_client_info($this->_connection); + + if ($version !== false) { + return $version['DriverVer']; + } + + return null; + } +} diff --git a/lib/zend/Zend/Db/Adapter/Sqlsrv/Exception.php b/lib/zend/Zend/Db/Adapter/Sqlsrv/Exception.php new file mode 100644 index 0000000000..a07b3eb9a3 --- /dev/null +++ b/lib/zend/Zend/Db/Adapter/Sqlsrv/Exception.php @@ -0,0 +1,63 @@ +_expression = (string) $expression; + } + + /** + * @return string The string of the SQL expression stored in this object. + */ + public function __toString() + { + return $this->_expression; + } + +} diff --git a/lib/zend/Zend/Db/Profiler.php b/lib/zend/Zend/Db/Profiler.php new file mode 100644 index 0000000000..e031d8a977 --- /dev/null +++ b/lib/zend/Zend/Db/Profiler.php @@ -0,0 +1,460 @@ +setEnabled($enabled); + } + + /** + * Enable or disable the profiler. If $enable is false, the profiler + * is disabled and will not log any queries sent to it. + * + * @param boolean $enable + * @return Zend_Db_Profiler Provides a fluent interface + */ + public function setEnabled($enable) + { + $this->_enabled = (boolean) $enable; + + return $this; + } + + /** + * Get the current state of enable. If True is returned, + * the profiler is enabled. + * + * @return boolean + */ + public function getEnabled() + { + return $this->_enabled; + } + + /** + * Sets a minimum number of seconds for saving query profiles. If this + * is set, only those queries whose elapsed time is equal or greater than + * $minimumSeconds will be saved. To save all queries regardless of + * elapsed time, set $minimumSeconds to null. + * + * @param integer $minimumSeconds OPTIONAL + * @return Zend_Db_Profiler Provides a fluent interface + */ + public function setFilterElapsedSecs($minimumSeconds = null) + { + if (null === $minimumSeconds) { + $this->_filterElapsedSecs = null; + } else { + $this->_filterElapsedSecs = (integer) $minimumSeconds; + } + + return $this; + } + + /** + * Returns the minimum number of seconds for saving query profiles, or null if + * query profiles are saved regardless of elapsed time. + * + * @return integer|null + */ + public function getFilterElapsedSecs() + { + return $this->_filterElapsedSecs; + } + + /** + * Sets the types of query profiles to save. Set $queryType to one of + * the Zend_Db_Profiler::* constants to only save profiles for that type of + * query. To save more than one type, logical OR them together. To + * save all queries regardless of type, set $queryType to null. + * + * @param integer $queryTypes OPTIONAL + * @return Zend_Db_Profiler Provides a fluent interface + */ + public function setFilterQueryType($queryTypes = null) + { + $this->_filterTypes = $queryTypes; + + return $this; + } + + /** + * Returns the types of query profiles saved, or null if queries are saved regardless + * of their types. + * + * @return integer|null + * @see Zend_Db_Profiler::setFilterQueryType() + */ + public function getFilterQueryType() + { + return $this->_filterTypes; + } + + /** + * Clears the history of any past query profiles. This is relentless + * and will even clear queries that were started and may not have + * been marked as ended. + * + * @return Zend_Db_Profiler Provides a fluent interface + */ + public function clear() + { + $this->_queryProfiles = array(); + + return $this; + } + + /** + * @param integer $queryId + * @return integer or null + */ + public function queryClone(Zend_Db_Profiler_Query $query) + { + $this->_queryProfiles[] = clone $query; + + end($this->_queryProfiles); + + return key($this->_queryProfiles); + } + + /** + * Starts a query. Creates a new query profile object (Zend_Db_Profiler_Query) + * and returns the "query profiler handle". Run the query, then call + * queryEnd() and pass it this handle to make the query as ended and + * record the time. If the profiler is not enabled, this takes no + * action and immediately returns null. + * + * @param string $queryText SQL statement + * @param integer $queryType OPTIONAL Type of query, one of the Zend_Db_Profiler::* constants + * @return integer|null + */ + public function queryStart($queryText, $queryType = null) + { + if (!$this->_enabled) { + return null; + } + + // make sure we have a query type + if (null === $queryType) { + switch (strtolower(substr(ltrim($queryText), 0, 6))) { + case 'insert': + $queryType = self::INSERT; + break; + case 'update': + $queryType = self::UPDATE; + break; + case 'delete': + $queryType = self::DELETE; + break; + case 'select': + $queryType = self::SELECT; + break; + default: + $queryType = self::QUERY; + break; + } + } + + /** + * @see Zend_Db_Profiler_Query + */ + require_once 'Zend/Db/Profiler/Query.php'; + $this->_queryProfiles[] = new Zend_Db_Profiler_Query($queryText, $queryType); + + end($this->_queryProfiles); + + return key($this->_queryProfiles); + } + + /** + * Ends a query. Pass it the handle that was returned by queryStart(). + * This will mark the query as ended and save the time. + * + * @param integer $queryId + * @throws Zend_Db_Profiler_Exception + * @return void + */ + public function queryEnd($queryId) + { + // Don't do anything if the Zend_Db_Profiler is not enabled. + if (!$this->_enabled) { + return; + } + + // Check for a valid query handle. + if (!isset($this->_queryProfiles[$queryId])) { + /** + * @see Zend_Db_Profiler_Exception + */ + require_once 'Zend/Db/Profiler/Exception.php'; + throw new Zend_Db_Profiler_Exception("Profiler has no query with handle '$queryId'."); + } + + $qp = $this->_queryProfiles[$queryId]; + + // Ensure that the query profile has not already ended + if ($qp->hasEnded()) { + /** + * @see Zend_Db_Profiler_Exception + */ + require_once 'Zend/Db/Profiler/Exception.php'; + throw new Zend_Db_Profiler_Exception("Query with profiler handle '$queryId' has already ended."); + } + + // End the query profile so that the elapsed time can be calculated. + $qp->end(); + + /** + * If filtering by elapsed time is enabled, only keep the profile if + * it ran for the minimum time. + */ + if (null !== $this->_filterElapsedSecs && $qp->getElapsedSecs() < $this->_filterElapsedSecs) { + unset($this->_queryProfiles[$queryId]); + return; + } + + /** + * If filtering by query type is enabled, only keep the query if + * it was one of the allowed types. + */ + if (null !== $this->_filterTypes && !($qp->getQueryType() & $this->_filterTypes)) { + unset($this->_queryProfiles[$queryId]); + return; + } + } + + /** + * Get a profile for a query. Pass it the same handle that was returned + * by queryStart() and it will return a Zend_Db_Profiler_Query object. + * + * @param integer $queryId + * @throws Zend_Db_Profiler_Exception + * @return Zend_Db_Profiler_Query + */ + public function getQueryProfile($queryId) + { + if (!array_key_exists($queryId, $this->_queryProfiles)) { + /** + * @see Zend_Db_Profiler_Exception + */ + require_once 'Zend/Db/Profiler/Exception.php'; + throw new Zend_Db_Profiler_Exception("Query handle '$queryId' not found in profiler log."); + } + + return $this->_queryProfiles[$queryId]; + } + + /** + * Get an array of query profiles (Zend_Db_Profiler_Query objects). If $queryType + * is set to one of the Zend_Db_Profiler::* constants then only queries of that + * type will be returned. Normally, queries that have not yet ended will + * not be returned unless $showUnfinished is set to True. If no + * queries were found, False is returned. The returned array is indexed by the query + * profile handles. + * + * @param integer $queryType + * @param boolean $showUnfinished + * @return array|false + */ + public function getQueryProfiles($queryType = null, $showUnfinished = false) + { + $queryProfiles = array(); + foreach ($this->_queryProfiles as $key => $qp) { + if ($queryType === null) { + $condition = true; + } else { + $condition = ($qp->getQueryType() & $queryType); + } + + if (($qp->hasEnded() || $showUnfinished) && $condition) { + $queryProfiles[$key] = $qp; + } + } + + if (empty($queryProfiles)) { + $queryProfiles = false; + } + + return $queryProfiles; + } + + /** + * Get the total elapsed time (in seconds) of all of the profiled queries. + * Only queries that have ended will be counted. If $queryType is set to + * one or more of the Zend_Db_Profiler::* constants, the elapsed time will be calculated + * only for queries of the given type(s). + * + * @param integer $queryType OPTIONAL + * @return float + */ + public function getTotalElapsedSecs($queryType = null) + { + $elapsedSecs = 0; + foreach ($this->_queryProfiles as $key => $qp) { + if (null === $queryType) { + $condition = true; + } else { + $condition = ($qp->getQueryType() & $queryType); + } + if (($qp->hasEnded()) && $condition) { + $elapsedSecs += $qp->getElapsedSecs(); + } + } + return $elapsedSecs; + } + + /** + * Get the total number of queries that have been profiled. Only queries that have ended will + * be counted. If $queryType is set to one of the Zend_Db_Profiler::* constants, only queries of + * that type will be counted. + * + * @param integer $queryType OPTIONAL + * @return integer + */ + public function getTotalNumQueries($queryType = null) + { + if (null === $queryType) { + return count($this->_queryProfiles); + } + + $numQueries = 0; + foreach ($this->_queryProfiles as $qp) { + if ($qp->hasEnded() && ($qp->getQueryType() & $queryType)) { + $numQueries++; + } + } + + return $numQueries; + } + + /** + * Get the Zend_Db_Profiler_Query object for the last query that was run, regardless if it has + * ended or not. If the query has not ended, its end time will be null. If no queries have + * been profiled, false is returned. + * + * @return Zend_Db_Profiler_Query|false + */ + public function getLastQueryProfile() + { + if (empty($this->_queryProfiles)) { + return false; + } + + end($this->_queryProfiles); + + return current($this->_queryProfiles); + } + +} + diff --git a/lib/zend/Zend/Db/Profiler/Exception.php b/lib/zend/Zend/Db/Profiler/Exception.php new file mode 100644 index 0000000000..78c1a8d7dc --- /dev/null +++ b/lib/zend/Zend/Db/Profiler/Exception.php @@ -0,0 +1,40 @@ +_label = $label; + if(!$this->_label) { + $this->_label = 'Zend_Db_Profiler_Firebug'; + } + } + + /** + * Enable or disable the profiler. If $enable is false, the profiler + * is disabled and will not log any queries sent to it. + * + * @param boolean $enable + * @return Zend_Db_Profiler Provides a fluent interface + */ + public function setEnabled($enable) + { + parent::setEnabled($enable); + + if ($this->getEnabled()) { + + if (!$this->_message) { + $this->_message = new Zend_Wildfire_Plugin_FirePhp_TableMessage($this->_label); + $this->_message->setBuffered(true); + $this->_message->setHeader(array('Time','Event','Parameters')); + $this->_message->setDestroy(true); + $this->_message->setOption('includeLineNumbers', false); + Zend_Wildfire_Plugin_FirePhp::getInstance()->send($this->_message); + } + + } else { + + if ($this->_message) { + $this->_message->setDestroy(true); + $this->_message = null; + } + + } + + return $this; + } + + /** + * Intercept the query end and log the profiling data. + * + * @param integer $queryId + * @throws Zend_Db_Profiler_Exception + * @return void + */ + public function queryEnd($queryId) + { + parent::queryEnd($queryId); + + if (!$this->getEnabled()) { + return; + } + + $this->_message->setDestroy(false); + + $profile = $this->getQueryProfile($queryId); + + $this->_totalElapsedTime += $profile->getElapsedSecs(); + + $this->_message->addRow(array((string)round($profile->getElapsedSecs(),5), + $profile->getQuery(), + ($params=$profile->getQueryParams())?$params:null)); + + $this->updateMessageLabel(); + } + + /** + * Update the label of the message holding the profile info. + * + * @return void + */ + protected function updateMessageLabel() + { + if (!$this->_message) { + return; + } + $this->_message->setLabel(str_replace(array('%label%', + '%totalCount%', + '%totalDuration%'), + array($this->_label, + $this->getTotalNumQueries(), + (string)round($this->_totalElapsedTime,5)), + $this->_label_template)); + } +} diff --git a/lib/zend/Zend/Db/Profiler/Query.php b/lib/zend/Zend/Db/Profiler/Query.php new file mode 100644 index 0000000000..04d7459d9b --- /dev/null +++ b/lib/zend/Zend/Db/Profiler/Query.php @@ -0,0 +1,199 @@ +_query = $query; + $this->_queryType = $queryType; + // by default, and for backward-compatibility, start the click ticking + $this->start(); + } + + /** + * Clone handler for the query object. + * @return void + */ + public function __clone() + { + $this->_boundParams = array(); + $this->_endedMicrotime = null; + $this->start(); + } + + /** + * Starts the elapsed time click ticking. + * This can be called subsequent to object creation, + * to restart the clock. For instance, this is useful + * right before executing a prepared query. + * + * @return void + */ + public function start() + { + $this->_startedMicrotime = microtime(true); + } + + /** + * Ends the query and records the time so that the elapsed time can be determined later. + * + * @return void + */ + public function end() + { + $this->_endedMicrotime = microtime(true); + } + + /** + * Returns true if and only if the query has ended. + * + * @return boolean + */ + public function hasEnded() + { + return $this->_endedMicrotime !== null; + } + + /** + * Get the original SQL text of the query. + * + * @return string + */ + public function getQuery() + { + return $this->_query; + } + + /** + * Get the type of this query (one of the Zend_Db_Profiler::* constants) + * + * @return integer + */ + public function getQueryType() + { + return $this->_queryType; + } + + /** + * @param string $param + * @param mixed $variable + * @return void + */ + public function bindParam($param, $variable) + { + $this->_boundParams[$param] = $variable; + } + + /** + * @param array $param + * @return void + */ + public function bindParams(array $params) + { + if (array_key_exists(0, $params)) { + array_unshift($params, null); + unset($params[0]); + } + foreach ($params as $param => $value) { + $this->bindParam($param, $value); + } + } + + /** + * @return array + */ + public function getQueryParams() + { + return $this->_boundParams; + } + + /** + * Get the elapsed time (in seconds) that the query ran. + * If the query has not yet ended, false is returned. + * + * @return float|false + */ + public function getElapsedSecs() + { + if (null === $this->_endedMicrotime) { + return false; + } + + return $this->_endedMicrotime - $this->_startedMicrotime; + } +} + diff --git a/lib/zend/Zend/Db/Select.php b/lib/zend/Zend/Db/Select.php new file mode 100644 index 0000000000..0633fd872f --- /dev/null +++ b/lib/zend/Zend/Db/Select.php @@ -0,0 +1,1340 @@ + false, + self::COLUMNS => array(), + self::UNION => array(), + self::FROM => array(), + self::WHERE => array(), + self::GROUP => array(), + self::HAVING => array(), + self::ORDER => array(), + self::LIMIT_COUNT => null, + self::LIMIT_OFFSET => null, + self::FOR_UPDATE => false + ); + + /** + * Specify legal join types. + * + * @var array + */ + protected static $_joinTypes = array( + self::INNER_JOIN, + self::LEFT_JOIN, + self::RIGHT_JOIN, + self::FULL_JOIN, + self::CROSS_JOIN, + self::NATURAL_JOIN, + ); + + /** + * Specify legal union types. + * + * @var array + */ + protected static $_unionTypes = array( + self::SQL_UNION, + self::SQL_UNION_ALL + ); + + /** + * The component parts of a SELECT statement. + * Initialized to the $_partsInit array in the constructor. + * + * @var array + */ + protected $_parts = array(); + + /** + * Tracks which columns are being select from each table and join. + * + * @var array + */ + protected $_tableCols = array(); + + /** + * Class constructor + * + * @param Zend_Db_Adapter_Abstract $adapter + */ + public function __construct(Zend_Db_Adapter_Abstract $adapter) + { + $this->_adapter = $adapter; + $this->_parts = self::$_partsInit; + } + + /** + * Get bind variables + * + * @return array + */ + public function getBind() + { + return $this->_bind; + } + + /** + * Set bind variables + * + * @param mixed $bind + * @return Zend_Db_Select + */ + public function bind($bind) + { + $this->_bind = $bind; + + return $this; + } + + /** + * Makes the query SELECT DISTINCT. + * + * @param bool $flag Whether or not the SELECT is DISTINCT (default true). + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function distinct($flag = true) + { + $this->_parts[self::DISTINCT] = (bool) $flag; + return $this; + } + + /** + * Adds a FROM table and optional columns to the query. + * + * The first parameter $name can be a simple string, in which case the + * correlation name is generated automatically. If you want to specify + * the correlation name, the first parameter must be an associative + * array in which the key is the physical table name, and the value is + * the correlation name. For example, array('table' => 'alias'). + * The correlation name is prepended to all columns fetched for this + * table. + * + * The second parameter can be a single string or Zend_Db_Expr object, + * or else an array of strings or Zend_Db_Expr objects. + * + * The first parameter can be null or an empty string, in which case + * no correlation name is generated or prepended to the columns named + * in the second parameter. + * + * @param array|string|Zend_Db_Expr $name The table name or an associative array relating table name to + * correlation name. + * @param array|string|Zend_Db_Expr $cols The columns to select from this table. + * @param string $schema The schema name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function from($name, $cols = '*', $schema = null) + { + return $this->_join(self::FROM, $name, null, $cols, $schema); + } + + /** + * Specifies the columns used in the FROM clause. + * + * The parameter can be a single string or Zend_Db_Expr object, + * or else an array of strings or Zend_Db_Expr objects. + * + * @param array|string|Zend_Db_Expr $cols The columns to select from this table. + * @param string $correlationName Correlation name of target table. OPTIONAL + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function columns($cols = '*', $correlationName = null) + { + if ($correlationName === null && count($this->_parts[self::FROM])) { + $correlationName = current(array_keys($this->_parts[self::FROM])); + } + + if (!array_key_exists($correlationName, $this->_parts[self::FROM])) { + /** + * @see Zend_Db_Select_Exception + */ + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("No table has been specified for the FROM clause"); + } + + $this->_tableCols($correlationName, $cols); + + return $this; + } + + /** + * Adds a UNION clause to the query. + * + * The first parameter $select can be a string, an existing Zend_Db_Select + * object or an array of either of these types. + * + * @param array|string|Zend_Db_Select $select One or more select clauses for the UNION. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function union($select = array(), $type = self::SQL_UNION) + { + if (!is_array($select)) { + $select = array(); + } + + if (!in_array($type, self::$_unionTypes)) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Invalid union type '{$type}'"); + } + + foreach ($select as $target) { + $this->_parts[self::UNION][] = array($target, $type); + } + + return $this; + } + + /** + * Adds a JOIN table and columns to the query. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param string $cond Join on this condition. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function join($name, $cond, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->joinInner($name, $cond, $cols, $schema); + } + + /** + * Add an INNER JOIN table and colums to the query + * Rows in both tables are matched according to the expression + * in the $cond argument. The result set is comprised + * of all cases where rows from the left table match + * rows from the right table. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param string $cond Join on this condition. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinInner($name, $cond, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::INNER_JOIN, $name, $cond, $cols, $schema); + } + + /** + * Add a LEFT OUTER JOIN table and colums to the query + * All rows from the left operand table are included, + * matching rows from the right operand table included, + * and the columns from the right operand table are filled + * with NULLs if no row exists matching the left table. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param string $cond Join on this condition. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinLeft($name, $cond, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::LEFT_JOIN, $name, $cond, $cols, $schema); + } + + /** + * Add a RIGHT OUTER JOIN table and colums to the query. + * Right outer join is the complement of left outer join. + * All rows from the right operand table are included, + * matching rows from the left operand table included, + * and the columns from the left operand table are filled + * with NULLs if no row exists matching the right table. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param string $cond Join on this condition. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinRight($name, $cond, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::RIGHT_JOIN, $name, $cond, $cols, $schema); + } + + /** + * Add a FULL OUTER JOIN table and colums to the query. + * A full outer join is like combining a left outer join + * and a right outer join. All rows from both tables are + * included, paired with each other on the same row of the + * result set if they satisfy the join condition, and otherwise + * paired with NULLs in place of columns from the other table. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param string $cond Join on this condition. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinFull($name, $cond, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::FULL_JOIN, $name, $cond, $cols, $schema); + } + + /** + * Add a CROSS JOIN table and colums to the query. + * A cross join is a cartesian product; there is no join condition. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinCross($name, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::CROSS_JOIN, $name, null, $cols, $schema); + } + + /** + * Add a NATURAL JOIN table and colums to the query. + * A natural join assumes an equi-join across any column(s) + * that appear with the same name in both tables. + * Only natural inner joins are supported by this API, + * even though SQL permits natural outer joins as well. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param array|string|Zend_Db_Expr $name The table name. + * @param array|string $cols The columns to select from the joined table. + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function joinNatural($name, $cols = self::SQL_WILDCARD, $schema = null) + { + return $this->_join(self::NATURAL_JOIN, $name, null, $cols, $schema); + } + + /** + * Adds a WHERE condition to the query by AND. + * + * If a value is passed as the second param, it will be quoted + * and replaced into the condition wherever a question-mark + * appears. Array values are quoted and comma-separated. + * + * + * // simplest but non-secure + * $select->where("id = $id"); + * + * // secure (ID is quoted but matched anyway) + * $select->where('id = ?', $id); + * + * // alternatively, with named binding + * $select->where('id = :id'); + * + * + * Note that it is more correct to use named bindings in your + * queries for values other than strings. When you use named + * bindings, don't forget to pass the values when actually + * making a query: + * + * + * $db->fetchAll($select, array('id' => 5)); + * + * + * @param string $cond The WHERE condition. + * @param string $value OPTIONAL A single value to quote into the condition. + * @param constant $type OPTIONAL The type of the given value + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function where($cond, $value = null, $type = null) + { + $this->_parts[self::WHERE][] = $this->_where($cond, $value, $type, true); + + return $this; + } + + /** + * Adds a WHERE condition to the query by OR. + * + * Otherwise identical to where(). + * + * @param string $cond The WHERE condition. + * @param string $value OPTIONAL A single value to quote into the condition. + * @param constant $type OPTIONAL The type of the given value + * @return Zend_Db_Select This Zend_Db_Select object. + * + * @see where() + */ + public function orWhere($cond, $value = null, $type = null) + { + $this->_parts[self::WHERE][] = $this->_where($cond, $value, $type, false); + + return $this; + } + + /** + * Adds grouping to the query. + * + * @param array|string $spec The column(s) to group by. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function group($spec) + { + if (!is_array($spec)) { + $spec = array($spec); + } + + foreach ($spec as $val) { + if (preg_match('/\(.*\)/', (string) $val)) { + $val = new Zend_Db_Expr($val); + } + $this->_parts[self::GROUP][] = $val; + } + + return $this; + } + + /** + * Adds a HAVING condition to the query by AND. + * + * If a value is passed as the second param, it will be quoted + * and replaced into the condition wherever a question-mark + * appears. See {@link where()} for an example + * + * @param string $cond The HAVING condition. + * @param string|Zend_Db_Expr $val A single value to quote into the condition. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function having($cond) + { + if (func_num_args() > 1) { + $val = func_get_arg(1); + $cond = $this->_adapter->quoteInto($cond, $val); + } + + if ($this->_parts[self::HAVING]) { + $this->_parts[self::HAVING][] = self::SQL_AND . " ($cond)"; + } else { + $this->_parts[self::HAVING][] = "($cond)"; + } + + return $this; + } + + /** + * Adds a HAVING condition to the query by OR. + * + * Otherwise identical to orHaving(). + * + * @param string $cond The HAVING condition. + * @param string $val A single value to quote into the condition. + * @return Zend_Db_Select This Zend_Db_Select object. + * + * @see having() + */ + public function orHaving($cond) + { + if (func_num_args() > 1) { + $val = func_get_arg(1); + $cond = $this->_adapter->quoteInto($cond, $val); + } + + if ($this->_parts[self::HAVING]) { + $this->_parts[self::HAVING][] = self::SQL_OR . " ($cond)"; + } else { + $this->_parts[self::HAVING][] = "($cond)"; + } + + return $this; + } + + /** + * Adds a row order to the query. + * + * @param mixed $spec The column(s) and direction to order by. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function order($spec) + { + if (!is_array($spec)) { + $spec = array($spec); + } + + // force 'ASC' or 'DESC' on each order spec, default is ASC. + foreach ($spec as $val) { + if ($val instanceof Zend_Db_Expr) { + $expr = $val->__toString(); + if (empty($expr)) { + continue; + } + $this->_parts[self::ORDER][] = $val; + } else { + if (empty($val)) { + continue; + } + $direction = self::SQL_ASC; + if (preg_match('/(.*\W)(' . self::SQL_ASC . '|' . self::SQL_DESC . ')\b/si', $val, $matches)) { + $val = trim($matches[1]); + $direction = $matches[2]; + } + if (preg_match('/\(.*\)/', $val)) { + $val = new Zend_Db_Expr($val); + } + $this->_parts[self::ORDER][] = array($val, $direction); + } + } + + return $this; + } + + /** + * Sets a limit count and offset to the query. + * + * @param int $count OPTIONAL The number of rows to return. + * @param int $offset OPTIONAL Start returning after this many rows. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function limit($count = null, $offset = null) + { + $this->_parts[self::LIMIT_COUNT] = (int) $count; + $this->_parts[self::LIMIT_OFFSET] = (int) $offset; + return $this; + } + + /** + * Sets the limit and count by page number. + * + * @param int $page Limit results to this page number. + * @param int $rowCount Use this many rows per page. + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function limitPage($page, $rowCount) + { + $page = ($page > 0) ? $page : 1; + $rowCount = ($rowCount > 0) ? $rowCount : 1; + $this->_parts[self::LIMIT_COUNT] = (int) $rowCount; + $this->_parts[self::LIMIT_OFFSET] = (int) $rowCount * ($page - 1); + return $this; + } + + /** + * Makes the query SELECT FOR UPDATE. + * + * @param bool $flag Whether or not the SELECT is FOR UPDATE (default true). + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function forUpdate($flag = true) + { + $this->_parts[self::FOR_UPDATE] = (bool) $flag; + return $this; + } + + /** + * Get part of the structured information for the currect query. + * + * @param string $part + * @return mixed + * @throws Zend_Db_Select_Exception + */ + public function getPart($part) + { + $part = strtolower($part); + if (!array_key_exists($part, $this->_parts)) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Invalid Select part '$part'"); + } + return $this->_parts[$part]; + } + + /** + * Executes the current select object and returns the result + * + * @param integer $fetchMode OPTIONAL + * @param mixed $bind An array of data to bind to the placeholders. + * @return PDO_Statement|Zend_Db_Statement + */ + public function query($fetchMode = null, $bind = array()) + { + if (!empty($bind)) { + $this->bind($bind); + } + + $stmt = $this->_adapter->query($this); + if ($fetchMode == null) { + $fetchMode = $this->_adapter->getFetchMode(); + } + $stmt->setFetchMode($fetchMode); + return $stmt; + } + + /** + * Converts this object to an SQL SELECT string. + * + * @return string|null This object as a SELECT string. (or null if a string cannot be produced.) + */ + public function assemble() + { + $sql = self::SQL_SELECT; + foreach (array_keys(self::$_partsInit) as $part) { + $method = '_render' . ucfirst($part); + if (method_exists($this, $method)) { + $sql = $this->$method($sql); + } + } + return $sql; + } + + /** + * Clear parts of the Select object, or an individual part. + * + * @param string $part OPTIONAL + * @return Zend_Db_Select + */ + public function reset($part = null) + { + if ($part == null) { + $this->_parts = self::$_partsInit; + } else if (array_key_exists($part, self::$_partsInit)) { + $this->_parts[$part] = self::$_partsInit[$part]; + } + return $this; + } + + /** + * Gets the Zend_Db_Adapter_Abstract for this + * particular Zend_Db_Select object. + * + * @return Zend_Db_Adapter_Abstract + */ + public function getAdapter() + { + return $this->_adapter; + } + + /** + * Populate the {@link $_parts} 'join' key + * + * Does the dirty work of populating the join key. + * + * The $name and $cols parameters follow the same logic + * as described in the from() method. + * + * @param null|string $type Type of join; inner, left, and null are currently supported + * @param array|string|Zend_Db_Expr $name Table name + * @param string $cond Join on this condition + * @param array|string $cols The columns to select from the joined table + * @param string $schema The database name to specify, if any. + * @return Zend_Db_Select This Zend_Db_Select object + * @throws Zend_Db_Select_Exception + */ + protected function _join($type, $name, $cond, $cols, $schema = null) + { + if (!in_array($type, self::$_joinTypes) && $type != self::FROM) { + /** + * @see Zend_Db_Select_Exception + */ + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Invalid join type '$type'"); + } + + if (count($this->_parts[self::UNION])) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Invalid use of table with " . self::SQL_UNION); + } + + if (empty($name)) { + $correlationName = $tableName = ''; + } else if (is_array($name)) { + // Must be array($correlationName => $tableName) or array($ident, ...) + foreach ($name as $_correlationName => $_tableName) { + if (is_string($_correlationName)) { + // We assume the key is the correlation name and value is the table name + $tableName = $_tableName; + $correlationName = $_correlationName; + } else { + // We assume just an array of identifiers, with no correlation name + $tableName = $_tableName; + $correlationName = $this->_uniqueCorrelation($tableName); + } + break; + } + } else if ($name instanceof Zend_Db_Expr|| $name instanceof Zend_Db_Select) { + $tableName = $name; + $correlationName = $this->_uniqueCorrelation('t'); + } else if (preg_match('/^(.+)\s+AS\s+(.+)$/i', $name, $m)) { + $tableName = $m[1]; + $correlationName = $m[2]; + } else { + $tableName = $name; + $correlationName = $this->_uniqueCorrelation($tableName); + } + + // Schema from table name overrides schema argument + if (!is_object($tableName) && false !== strpos($tableName, '.')) { + list($schema, $tableName) = explode('.', $tableName); + } + + if (!empty($correlationName)) { + if (array_key_exists($correlationName, $this->_parts[self::FROM])) { + /** + * @see Zend_Db_Select_Exception + */ + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("You cannot define a correlation name '$correlationName' more than once"); + } + + $lastFromCorrelationName = null; + if ($type == self::FROM) { + // append this from after the last from joinType + $tmpFromParts = $this->_parts[self::FROM]; + $this->_parts[self::FROM] = array(); + // move all the froms onto the stack + while ($tmpFromParts) { + $currentCorrelationName = key($tmpFromParts); + if ($tmpFromParts[$currentCorrelationName]['joinType'] != self::FROM) { + break; + } + $lastFromCorrelationName = $currentCorrelationName; + $this->_parts[self::FROM][$currentCorrelationName] = array_shift($tmpFromParts); + } + } else { + $tmpFromParts = array(); + } + $this->_parts[self::FROM][$correlationName] = array( + 'joinType' => $type, + 'schema' => $schema, + 'tableName' => $tableName, + 'joinCondition' => $cond + ); + while ($tmpFromParts) { + $currentCorrelationName = key($tmpFromParts); + $this->_parts[self::FROM][$currentCorrelationName] = array_shift($tmpFromParts); + } + } + + // add to the columns from this joined table + if ($type == self::FROM && $lastFromCorrelationName == null) { + $lastFromCorrelationName = true; + } + $this->_tableCols($correlationName, $cols, $lastFromCorrelationName); + + return $this; + } + + /** + * Handle JOIN... USING... syntax + * + * This is functionality identical to the existing JOIN methods, however + * the join condition can be passed as a single column name. This method + * then completes the ON condition by using the same field for the FROM + * table and the JOIN table. + * + * + * $select = $db->select()->from('table1') + * ->joinUsing('table2', 'column1'); + * + * // SELECT * FROM table1 JOIN table2 ON table1.column1 = table2.column2 + * + * + * These joins are called by the developer simply by adding 'Using' to the + * method name. E.g. + * * joinUsing + * * joinInnerUsing + * * joinFullUsing + * * joinRightUsing + * * joinLeftUsing + * + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function _joinUsing($type, $name, $cond, $cols = '*', $schema = null) + { + if (empty($this->_parts[self::FROM])) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("You can only perform a joinUsing after specifying a FROM table"); + } + + $join = $this->_adapter->quoteIdentifier(key($this->_parts[self::FROM]), true); + $from = $this->_adapter->quoteIdentifier($this->_uniqueCorrelation($name), true); + + $cond1 = $from . '.' . $cond; + $cond2 = $join . '.' . $cond; + $cond = $cond1 . ' = ' . $cond2; + + return $this->_join($type, $name, $cond, $cols, $schema); + } + + /** + * Generate a unique correlation name + * + * @param string|array $name A qualified identifier. + * @return string A unique correlation name. + */ + private function _uniqueCorrelation($name) + { + if (is_array($name)) { + $c = end($name); + } else { + // Extract just the last name of a qualified table name + $dot = strrpos($name,'.'); + $c = ($dot === false) ? $name : substr($name, $dot+1); + } + for ($i = 2; array_key_exists($c, $this->_parts[self::FROM]); ++$i) { + $c = $name . '_' . (string) $i; + } + return $c; + } + + /** + * Adds to the internal table-to-column mapping array. + * + * @param string $tbl The table/join the columns come from. + * @param array|string $cols The list of columns; preferably as + * an array, but possibly as a string containing one column. + * @param bool|string True if it should be prepended, a correlation name if it should be inserted + * @return void + */ + protected function _tableCols($correlationName, $cols, $afterCorrelationName = null) + { + if (!is_array($cols)) { + $cols = array($cols); + } + + if ($correlationName == null) { + $correlationName = ''; + } + + $columnValues = array(); + + foreach (array_filter($cols) as $alias => $col) { + $currentCorrelationName = $correlationName; + if (is_string($col)) { + // Check for a column matching " AS " and extract the alias name + if (preg_match('/^(.+)\s+' . self::SQL_AS . '\s+(.+)$/i', $col, $m)) { + $col = $m[1]; + $alias = $m[2]; + } + // Check for columns that look like functions and convert to Zend_Db_Expr + if (preg_match('/\(.*\)/', $col)) { + $col = new Zend_Db_Expr($col); + } elseif (preg_match('/(.+)\.(.+)/', $col, $m)) { + $currentCorrelationName = $m[1]; + $col = $m[2]; + } + } + $columnValues[] = array($currentCorrelationName, $col, is_string($alias) ? $alias : null); + } + + if ($columnValues) { + + // should we attempt to prepend or insert these values? + if ($afterCorrelationName === true || is_string($afterCorrelationName)) { + $tmpColumns = $this->_parts[self::COLUMNS]; + $this->_parts[self::COLUMNS] = array(); + } else { + $tmpColumns = array(); + } + + // find the correlation name to insert after + if (is_string($afterCorrelationName)) { + while ($tmpColumns) { + $this->_parts[self::COLUMNS][] = $currentColumn = array_shift($tmpColumns); + if ($currentColumn[0] == $afterCorrelationName) { + break; + } + } + } + + // apply current values to current stack + foreach ($columnValues as $columnValue) { + array_push($this->_parts[self::COLUMNS], $columnValue); + } + + // finish ensuring that all previous values are applied (if they exist) + while ($tmpColumns) { + array_push($this->_parts[self::COLUMNS], array_shift($tmpColumns)); + } + } + } + + /** + * Internal function for creating the where clause + * + * @param string $condition + * @param string $value optional + * @param string $type optional + * @param boolean $bool true = AND, false = OR + * @return string clause + */ + protected function _where($condition, $value = null, $type = null, $bool = true) + { + if (count($this->_parts[self::UNION])) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Invalid use of where clause with " . self::SQL_UNION); + } + + if ($value !== null) { + $condition = $this->_adapter->quoteInto($condition, $value, $type); + } + + $cond = ""; + if ($this->_parts[self::WHERE]) { + if ($bool === true) { + $cond = self::SQL_AND . ' '; + } else { + $cond = self::SQL_OR . ' '; + } + } + + return $cond . "($condition)"; + } + + /** + * @return array + */ + protected function _getDummyTable() + { + return array(); + } + + /** + * Return a quoted schema name + * + * @param string $schema The schema name OPTIONAL + * @return string|null + */ + protected function _getQuotedSchema($schema = null) + { + if ($schema === null) { + return null; + } + return $this->_adapter->quoteIdentifier($schema, true) . '.'; + } + + /** + * Return a quoted table name + * + * @param string $tableName The table name + * @param string $correlationName The correlation name OPTIONAL + * @return string + */ + protected function _getQuotedTable($tableName, $correlationName = null) + { + return $this->_adapter->quoteTableAs($tableName, $correlationName, true); + } + + /** + * Render DISTINCT clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderDistinct($sql) + { + if ($this->_parts[self::DISTINCT]) { + $sql .= ' ' . self::SQL_DISTINCT; + } + + return $sql; + } + + /** + * Render DISTINCT clause + * + * @param string $sql SQL query + * @return string|null + */ + protected function _renderColumns($sql) + { + if (!count($this->_parts[self::COLUMNS])) { + return null; + } + + $columns = array(); + foreach ($this->_parts[self::COLUMNS] as $columnEntry) { + list($correlationName, $column, $alias) = $columnEntry; + if ($column instanceof Zend_Db_Expr) { + $columns[] = $this->_adapter->quoteColumnAs($column, $alias, true); + } else { + if ($column == self::SQL_WILDCARD) { + $column = new Zend_Db_Expr(self::SQL_WILDCARD); + $alias = null; + } + if (empty($correlationName)) { + $columns[] = $this->_adapter->quoteColumnAs($column, $alias, true); + } else { + $columns[] = $this->_adapter->quoteColumnAs(array($correlationName, $column), $alias, true); + } + } + } + + return $sql .= ' ' . implode(', ', $columns); + } + + /** + * Render FROM clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderFrom($sql) + { + /* + * If no table specified, use RDBMS-dependent solution + * for table-less query. e.g. DUAL in Oracle. + */ + if (empty($this->_parts[self::FROM])) { + $this->_parts[self::FROM] = $this->_getDummyTable(); + } + + $from = array(); + + foreach ($this->_parts[self::FROM] as $correlationName => $table) { + $tmp = ''; + + $joinType = ($table['joinType'] == self::FROM) ? self::INNER_JOIN : $table['joinType']; + + // Add join clause (if applicable) + if (! empty($from)) { + $tmp .= ' ' . strtoupper($joinType) . ' '; + } + + $tmp .= $this->_getQuotedSchema($table['schema']); + $tmp .= $this->_getQuotedTable($table['tableName'], $correlationName); + + // Add join conditions (if applicable) + if (!empty($from) && ! empty($table['joinCondition'])) { + $tmp .= ' ' . self::SQL_ON . ' ' . $table['joinCondition']; + } + + // Add the table name and condition add to the list + $from[] = $tmp; + } + + // Add the list of all joins + if (!empty($from)) { + $sql .= ' ' . self::SQL_FROM . ' ' . implode("\n", $from); + } + + return $sql; + } + + /** + * Render UNION query + * + * @param string $sql SQL query + * @return string + */ + protected function _renderUnion($sql) + { + if ($this->_parts[self::UNION]) { + $parts = count($this->_parts[self::UNION]); + foreach ($this->_parts[self::UNION] as $cnt => $union) { + list($target, $type) = $union; + if ($target instanceof Zend_Db_Select) { + $target = $target->assemble(); + } + $sql .= $target; + if ($cnt < $parts - 1) { + $sql .= ' ' . $type . ' '; + } + } + } + + return $sql; + } + + /** + * Render WHERE clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderWhere($sql) + { + if ($this->_parts[self::FROM] && $this->_parts[self::WHERE]) { + $sql .= ' ' . self::SQL_WHERE . ' ' . implode(' ', $this->_parts[self::WHERE]); + } + + return $sql; + } + + /** + * Render GROUP clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderGroup($sql) + { + if ($this->_parts[self::FROM] && $this->_parts[self::GROUP]) { + $group = array(); + foreach ($this->_parts[self::GROUP] as $term) { + $group[] = $this->_adapter->quoteIdentifier($term, true); + } + $sql .= ' ' . self::SQL_GROUP_BY . ' ' . implode(",\n\t", $group); + } + + return $sql; + } + + /** + * Render HAVING clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderHaving($sql) + { + if ($this->_parts[self::FROM] && $this->_parts[self::HAVING]) { + $sql .= ' ' . self::SQL_HAVING . ' ' . implode(' ', $this->_parts[self::HAVING]); + } + + return $sql; + } + + /** + * Render ORDER clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderOrder($sql) + { + if ($this->_parts[self::ORDER]) { + $order = array(); + foreach ($this->_parts[self::ORDER] as $term) { + if (is_array($term)) { + if(is_numeric($term[0]) && strval(intval($term[0])) == $term[0]) { + $order[] = (int)trim($term[0]) . ' ' . $term[1]; + } else { + $order[] = $this->_adapter->quoteIdentifier($term[0], true) . ' ' . $term[1]; + } + } else if (is_numeric($term) && strval(intval($term)) == $term) { + $order[] = (int)trim($term); + } else { + $order[] = $this->_adapter->quoteIdentifier($term, true); + } + } + $sql .= ' ' . self::SQL_ORDER_BY . ' ' . implode(', ', $order); + } + + return $sql; + } + + /** + * Render LIMIT OFFSET clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderLimitoffset($sql) + { + $count = 0; + $offset = 0; + + if (!empty($this->_parts[self::LIMIT_OFFSET])) { + $offset = (int) $this->_parts[self::LIMIT_OFFSET]; + // This should reduce to the max integer PHP can support + $count = intval(9223372036854775807); + } + + if (!empty($this->_parts[self::LIMIT_COUNT])) { + $count = (int) $this->_parts[self::LIMIT_COUNT]; + } + + /* + * Add limits clause + */ + if ($count > 0) { + $sql = trim($this->_adapter->limit($sql, $count, $offset)); + } + + return $sql; + } + + /** + * Render FOR UPDATE clause + * + * @param string $sql SQL query + * @return string + */ + protected function _renderForupdate($sql) + { + if ($this->_parts[self::FOR_UPDATE]) { + $sql .= ' ' . self::SQL_FOR_UPDATE; + } + + return $sql; + } + + /** + * Turn magic function calls into non-magic function calls + * for joinUsing syntax + * + * @param string $method + * @param array $args OPTIONAL Zend_Db_Table_Select query modifier + * @return Zend_Db_Select + * @throws Zend_Db_Select_Exception If an invalid method is called. + */ + public function __call($method, array $args) + { + $matches = array(); + + /** + * Recognize methods for Has-Many cases: + * findParent() + * findParentBy() + * Use the non-greedy pattern repeat modifier e.g. \w+? + */ + if (preg_match('/^join([a-zA-Z]*?)Using$/', $method, $matches)) { + $type = strtolower($matches[1]); + if ($type) { + $type .= ' join'; + if (!in_array($type, self::$_joinTypes)) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Unrecognized method '$method()'"); + } + if (in_array($type, array(self::CROSS_JOIN, self::NATURAL_JOIN))) { + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Cannot perform a joinUsing with method '$method()'"); + } + } else { + $type = self::INNER_JOIN; + } + array_unshift($args, $type); + return call_user_func_array(array($this, '_joinUsing'), $args); + } + + require_once 'Zend/Db/Select/Exception.php'; + throw new Zend_Db_Select_Exception("Unrecognized method '$method()'"); + } + + /** + * Implements magic method. + * + * @return string This object as a SELECT string. + */ + public function __toString() + { + try { + $sql = $this->assemble(); + } catch (Exception $e) { + trigger_error($e->getMessage(), E_USER_WARNING); + $sql = ''; + } + return (string)$sql; + } + +} diff --git a/lib/zend/Zend/Db/Select/Exception.php b/lib/zend/Zend/Db/Select/Exception.php new file mode 100644 index 0000000000..9f021344f8 --- /dev/null +++ b/lib/zend/Zend/Db/Select/Exception.php @@ -0,0 +1,39 @@ +_adapter = $adapter; + if ($sql instanceof Zend_Db_Select) { + $sql = $sql->assemble(); + } + $this->_parseParameters($sql); + $this->_prepare($sql); + + $this->_queryId = $this->_adapter->getProfiler()->queryStart($sql); + } + + /** + * Internal method called by abstract statment constructor to setup + * the driver level statement + * + * @return void + */ + protected function _prepare($sql) + { + return; + } + + /** + * @param string $sql + * @return void + */ + protected function _parseParameters($sql) + { + $sql = $this->_stripQuoted($sql); + + // split into text and params + $this->_sqlSplit = preg_split('/(\?|\:[a-zA-Z0-9_]+)/', + $sql, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); + + // map params + $this->_sqlParam = array(); + foreach ($this->_sqlSplit as $key => $val) { + if ($val == '?') { + if ($this->_adapter->supportsParameters('positional') === false) { + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception("Invalid bind-variable position '$val'"); + } + } else if ($val[0] == ':') { + if ($this->_adapter->supportsParameters('named') === false) { + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception("Invalid bind-variable name '$val'"); + } + } + $this->_sqlParam[] = $val; + } + + // set up for binding + $this->_bindParam = array(); + } + + /** + * Remove parts of a SQL string that contain quoted strings + * of values or identifiers. + * + * @param string $sql + * @return string + */ + protected function _stripQuoted($sql) + { + // get the character for delimited id quotes, + // this is usually " but in MySQL is ` + $d = $this->_adapter->quoteIdentifier('a'); + $d = $d[0]; + + // get the value used as an escaped delimited id quote, + // e.g. \" or "" or \` + $de = $this->_adapter->quoteIdentifier($d); + $de = substr($de, 1, 2); + $de = str_replace('\\', '\\\\', $de); + + // get the character for value quoting + // this should be ' + $q = $this->_adapter->quote('a'); + $q = $q[0]; + + // get the value used as an escaped quote, + // e.g. \' or '' + $qe = $this->_adapter->quote($q); + $qe = substr($qe, 1, 2); + $qe = str_replace('\\', '\\\\', $qe); + + // get a version of the SQL statement with all quoted + // values and delimited identifiers stripped out + // remove "foo\"bar" + $sql = preg_replace("/$q($qe|\\\\{2}|[^$q])*$q/", '', $sql); + // remove 'foo\'bar' + if (!empty($q)) { + $sql = preg_replace("/$q($qe|[^$q])*$q/", '', $sql); + } + + return $sql; + } + + /** + * Bind a column of the statement result set to a PHP variable. + * + * @param string $column Name the column in the result set, either by + * position or by name. + * @param mixed $param Reference to the PHP variable containing the value. + * @param mixed $type OPTIONAL + * @return bool + */ + public function bindColumn($column, &$param, $type = null) + { + $this->_bindColumn[$column] =& $param; + return true; + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + */ + public function bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + if (!is_int($parameter) && !is_string($parameter)) { + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception('Invalid bind-variable position'); + } + + $position = null; + if (($intval = (int) $parameter) > 0 && $this->_adapter->supportsParameters('positional')) { + if ($intval >= 1 || $intval <= count($this->_sqlParam)) { + $position = $intval; + } + } else if ($this->_adapter->supportsParameters('named')) { + if ($parameter[0] != ':') { + $parameter = ':' . $parameter; + } + if (in_array($parameter, $this->_sqlParam) !== false) { + $position = $parameter; + } + } + + if ($position === null) { + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception("Invalid bind-variable position '$parameter'"); + } + + // Finally we are assured that $position is valid + $this->_bindParam[$position] =& $variable; + return $this->_bindParam($position, $variable, $type, $length, $options); + } + + /** + * Binds a value to a parameter. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $value Scalar value to bind to the parameter. + * @param mixed $type OPTIONAL Datatype of the parameter. + * @return bool + */ + public function bindValue($parameter, $value, $type = null) + { + return $this->bindParam($parameter, $value, $type); + } + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + */ + public function execute(array $params = null) + { + /* + * Simple case - no query profiler to manage. + */ + if ($this->_queryId === null) { + return $this->_execute($params); + } + + /* + * Do the same thing, but with query profiler + * management before and after the execute. + */ + $prof = $this->_adapter->getProfiler(); + $qp = $prof->getQueryProfile($this->_queryId); + if ($qp->hasEnded()) { + $this->_queryId = $prof->queryClone($qp); + $qp = $prof->getQueryProfile($this->_queryId); + } + if ($params !== null) { + $qp->bindParams($params); + } else { + $qp->bindParams($this->_bindParam); + } + $qp->start($this->_queryId); + + $retval = $this->_execute($params); + + $prof->queryEnd($this->_queryId); + + return $retval; + } + + /** + * Returns an array containing all of the result set rows. + * + * @param int $style OPTIONAL Fetch mode. + * @param int $col OPTIONAL Column number, if fetch mode is by column. + * @return array Collection of rows, each in a format by the fetch mode. + */ + public function fetchAll($style = null, $col = null) + { + $data = array(); + if ($style === Zend_Db::FETCH_COLUMN && $col === null) { + $col = 0; + } + if ($col === null) { + while ($row = $this->fetch($style)) { + $data[] = $row; + } + } else { + while (false !== ($val = $this->fetchColumn($col))) { + $data[] = $val; + } + } + return $data; + } + + /** + * Returns a single column from the next row of a result set. + * + * @param int $col OPTIONAL Position of the column to fetch. + * @return string One value from the next row of result set, or false. + */ + public function fetchColumn($col = 0) + { + $data = array(); + $col = (int) $col; + $row = $this->fetch(Zend_Db::FETCH_NUM); + if (!is_array($row)) { + return false; + } + return $row[$col]; + } + + /** + * Fetches the next row and returns it as an object. + * + * @param string $class OPTIONAL Name of the class to create. + * @param array $config OPTIONAL Constructor arguments for the class. + * @return mixed One object instance of the specified class, or false. + */ + public function fetchObject($class = 'stdClass', array $config = array()) + { + $obj = new $class($config); + $row = $this->fetch(Zend_Db::FETCH_ASSOC); + if (!is_array($row)) { + return false; + } + foreach ($row as $key => $val) { + $obj->$key = $val; + } + return $obj; + } + + /** + * Retrieve a statement attribute. + * + * @param string $key Attribute name. + * @return mixed Attribute value. + */ + public function getAttribute($key) + { + if (array_key_exists($key, $this->_attribute)) { + return $this->_attribute[$key]; + } + } + + /** + * Set a statement attribute. + * + * @param string $key Attribute name. + * @param mixed $val Attribute value. + * @return bool + */ + public function setAttribute($key, $val) + { + $this->_attribute[$key] = $val; + } + + /** + * Set the default fetch mode for this statement. + * + * @param int $mode The fetch mode. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function setFetchMode($mode) + { + switch ($mode) { + case Zend_Db::FETCH_NUM: + case Zend_Db::FETCH_ASSOC: + case Zend_Db::FETCH_BOTH: + case Zend_Db::FETCH_OBJ: + $this->_fetchMode = $mode; + break; + case Zend_Db::FETCH_BOUND: + default: + $this->closeCursor(); + /** + * @see Zend_Db_Statement_Exception + */ + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception('invalid fetch mode'); + break; + } + } + + /** + * Helper function to map retrieved row + * to bound column variables + * + * @param array $row + * @return bool True + */ + public function _fetchBound($row) + { + foreach ($row as $key => $value) { + // bindColumn() takes 1-based integer positions + // but fetch() returns 0-based integer indexes + if (is_int($key)) { + $key++; + } + // set results only to variables that were bound previously + if (isset($this->_bindColumn[$key])) { + $this->_bindColumn[$key] = $value; + } + } + return true; + } + + /** + * Gets the Zend_Db_Adapter_Abstract for this + * particular Zend_Db_Statement object. + * + * @return Zend_Db_Adapter_Abstract + */ + public function getAdapter() + { + return $this->_adapter; + } + + /** + * Gets the resource or object setup by the + * _parse + * @return unknown_type + */ + public function getDriverStatement() + { + return $this->_stmt; + } +} diff --git a/lib/zend/Zend/Db/Statement/Db2.php b/lib/zend/Zend/Db/Statement/Db2.php new file mode 100644 index 0000000000..a0c78d9b1a --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Db2.php @@ -0,0 +1,360 @@ +_adapter->getConnection(); + + // db2_prepare on i5 emits errors, these need to be + // suppressed so that proper exceptions can be thrown + $this->_stmt = @db2_prepare($connection, $sql); + + if (!$this->_stmt) { + /** + * @see Zend_Db_Statement_Db2_Exception + */ + require_once 'Zend/Db/Statement/Db2/Exception.php'; + throw new Zend_Db_Statement_Db2_Exception( + db2_stmt_errormsg(), + db2_stmt_error() + ); + } + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Db2_Exception + */ + public function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + if ($type === null) { + $type = DB2_PARAM_IN; + } + + if (isset($options['data-type'])) { + $datatype = $options['data-type']; + } else { + $datatype = DB2_CHAR; + } + + if (!db2_bind_param($this->_stmt, $position, "variable", $type, $datatype)) { + /** + * @see Zend_Db_Statement_Db2_Exception + */ + require_once 'Zend/Db/Statement/Db2/Exception.php'; + throw new Zend_Db_Statement_Db2_Exception( + db2_stmt_errormsg(), + db2_stmt_error() + ); + } + + return true; + } + + /** + * Closes the cursor, allowing the statement to be executed again. + * + * @return bool + */ + public function closeCursor() + { + if (!$this->_stmt) { + return false; + } + db2_free_stmt($this->_stmt); + $this->_stmt = false; + return true; + } + + + /** + * Returns the number of columns in the result set. + * Returns null if the statement has no result set metadata. + * + * @return int The number of columns. + */ + public function columnCount() + { + if (!$this->_stmt) { + return false; + } + return db2_num_fields($this->_stmt); + } + + /** + * Retrieves the error code, if any, associated with the last operation on + * the statement handle. + * + * @return string error code. + */ + public function errorCode() + { + if (!$this->_stmt) { + return false; + } + + $error = db2_stmt_error(); + if ($error === '') { + return false; + } + + return $error; + } + + /** + * Retrieves an array of error information, if any, associated with the + * last operation on the statement handle. + * + * @return array + */ + public function errorInfo() + { + $error = $this->errorCode(); + if ($error === false){ + return false; + } + + /* + * Return three-valued array like PDO. But DB2 does not distinguish + * between SQLCODE and native RDBMS error code, so repeat the SQLCODE. + */ + return array( + $error, + $error, + db2_stmt_errormsg() + ); + } + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + * @throws Zend_Db_Statement_Db2_Exception + */ + public function _execute(array $params = null) + { + if (!$this->_stmt) { + return false; + } + + $retval = true; + if ($params !== null) { + $retval = @db2_execute($this->_stmt, $params); + } else { + $retval = @db2_execute($this->_stmt); + } + + if ($retval === false) { + /** + * @see Zend_Db_Statement_Db2_Exception + */ + require_once 'Zend/Db/Statement/Db2/Exception.php'; + throw new Zend_Db_Statement_Db2_Exception( + db2_stmt_errormsg(), + db2_stmt_error()); + } + + $this->_keys = array(); + if ($field_num = $this->columnCount()) { + for ($i = 0; $i < $field_num; $i++) { + $name = db2_field_name($this->_stmt, $i); + $this->_keys[] = $name; + } + } + + $this->_values = array(); + if ($this->_keys) { + $this->_values = array_fill(0, count($this->_keys), null); + } + + return $retval; + } + + /** + * Fetches a row from the result set. + * + * @param int $style OPTIONAL Fetch mode for this fetch operation. + * @param int $cursor OPTIONAL Absolute, relative, or other. + * @param int $offset OPTIONAL Number for absolute or relative cursors. + * @return mixed Array, object, or scalar depending on fetch mode. + * @throws Zend_Db_Statement_Db2_Exception + */ + public function fetch($style = null, $cursor = null, $offset = null) + { + if (!$this->_stmt) { + return false; + } + + if ($style === null) { + $style = $this->_fetchMode; + } + + switch ($style) { + case Zend_Db::FETCH_NUM : + $row = db2_fetch_array($this->_stmt); + break; + case Zend_Db::FETCH_ASSOC : + $row = db2_fetch_assoc($this->_stmt); + break; + case Zend_Db::FETCH_BOTH : + $row = db2_fetch_both($this->_stmt); + break; + case Zend_Db::FETCH_OBJ : + $row = db2_fetch_object($this->_stmt); + break; + case Zend_Db::FETCH_BOUND: + $row = db2_fetch_both($this->_stmt); + if ($row !== false) { + return $this->_fetchBound($row); + } + break; + default: + /** + * @see Zend_Db_Statement_Db2_Exception + */ + require_once 'Zend/Db/Statement/Db2/Exception.php'; + throw new Zend_Db_Statement_Db2_Exception("Invalid fetch mode '$style' specified"); + break; + } + + return $row; + } + + /** + * Fetches the next row and returns it as an object. + * + * @param string $class OPTIONAL Name of the class to create. + * @param array $config OPTIONAL Constructor arguments for the class. + * @return mixed One object instance of the specified class. + */ + public function fetchObject($class = 'stdClass', array $config = array()) + { + $obj = $this->fetch(Zend_Db::FETCH_OBJ); + return $obj; + } + + /** + * Retrieves the next rowset (result set) for a SQL statement that has + * multiple result sets. An example is a stored procedure that returns + * the results of multiple queries. + * + * @return bool + * @throws Zend_Db_Statement_Db2_Exception + */ + public function nextRowset() + { + /** + * @see Zend_Db_Statement_Db2_Exception + */ + require_once 'Zend/Db/Statement/Db2/Exception.php'; + throw new Zend_Db_Statement_Db2_Exception(__FUNCTION__ . '() is not implemented'); + } + + /** + * Returns the number of rows affected by the execution of the + * last INSERT, DELETE, or UPDATE statement executed by this + * statement object. + * + * @return int The number of rows affected. + */ + public function rowCount() + { + if (!$this->_stmt) { + return false; + } + + $num = @db2_num_rows($this->_stmt); + + if ($num === false) { + return 0; + } + + return $num; + } + + /** + * Returns an array containing all of the result set rows. + * + * @param int $style OPTIONAL Fetch mode. + * @param int $col OPTIONAL Column number, if fetch mode is by column. + * @return array Collection of rows, each in a format by the fetch mode. + * + * Behaves like parent, but if limit() + * is used, the final result removes the extra column + * 'zend_db_rownum' + */ + public function fetchAll($style = null, $col = null) + { + $data = parent::fetchAll($style, $col); + $results = array(); + $remove = $this->_adapter->foldCase('ZEND_DB_ROWNUM'); + + foreach ($data as $row) { + if (is_array($row) && array_key_exists($remove, $row)) { + unset($row[$remove]); + } + $results[] = $row; + } + return $results; + } +} diff --git a/lib/zend/Zend/Db/Statement/Db2/Exception.php b/lib/zend/Zend/Db/Statement/Db2/Exception.php new file mode 100644 index 0000000000..77888cbda3 --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Db2/Exception.php @@ -0,0 +1,58 @@ +message = $msg; + $this->code = $state; + } + +} + diff --git a/lib/zend/Zend/Db/Statement/Exception.php b/lib/zend/Zend/Db/Statement/Exception.php new file mode 100644 index 0000000000..94b5407ed3 --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Exception.php @@ -0,0 +1,73 @@ +message = $message; + $this->code = $code; + $this->_chainedException = $chainedException; + } + + /** + * Check if this general exception has a specific database driver specific exception nested inside. + * + * @return bool + */ + public function hasChainedException() + { + return ($this->_chainedException!==null); + } + + /** + * @return Exception|null + */ + public function getChainedException() + { + return $this->_chainedException; + } +} diff --git a/lib/zend/Zend/Db/Statement/Interface.php b/lib/zend/Zend/Db/Statement/Interface.php new file mode 100644 index 0000000000..b969160aac --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Interface.php @@ -0,0 +1,203 @@ +_adapter->getConnection(); + + $this->_stmt = $mysqli->prepare($sql); + + if ($this->_stmt === false || $mysqli->errno) { + /** + * @see Zend_Db_Statement_Mysqli_Exception + */ + require_once 'Zend/Db/Statement/Mysqli/Exception.php'; + throw new Zend_Db_Statement_Mysqli_Exception("Mysqli prepare error: " . $mysqli->error, $mysqli->errno); + } + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Mysqli_Exception + */ + protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + return true; + } + + /** + * Closes the cursor and the statement. + * + * @return bool + */ + public function close() + { + if ($this->_stmt) { + $r = $this->_stmt->close(); + $this->_stmt = null; + return $r; + } + return false; + } + + /** + * Closes the cursor, allowing the statement to be executed again. + * + * @return bool + */ + public function closeCursor() + { + if ($stmt = $this->_stmt) { + $mysqli = $this->_adapter->getConnection(); + while ($mysqli->more_results()) { + $mysqli->next_result(); + } + $this->_stmt->free_result(); + return $this->_stmt->reset(); + } + return false; + } + + /** + * Returns the number of columns in the result set. + * Returns null if the statement has no result set metadata. + * + * @return int The number of columns. + */ + public function columnCount() + { + if (isset($this->_meta) && $this->_meta) { + return $this->_meta->field_count; + } + return 0; + } + + /** + * Retrieves the error code, if any, associated with the last operation on + * the statement handle. + * + * @return string error code. + */ + public function errorCode() + { + if (!$this->_stmt) { + return false; + } + return substr($this->_stmt->sqlstate, 0, 5); + } + + /** + * Retrieves an array of error information, if any, associated with the + * last operation on the statement handle. + * + * @return array + */ + public function errorInfo() + { + if (!$this->_stmt) { + return false; + } + return array( + substr($this->_stmt->sqlstate, 0, 5), + $this->_stmt->errno, + $this->_stmt->error, + ); + } + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + * @throws Zend_Db_Statement_Mysqli_Exception + */ + public function _execute(array $params = null) + { + if (!$this->_stmt) { + return false; + } + + // if no params were given as an argument to execute(), + // then default to the _bindParam array + if ($params === null) { + $params = $this->_bindParam; + } + // send $params as input parameters to the statement + if ($params) { + array_unshift($params, str_repeat('s', count($params))); + $stmtParams = array(); + foreach ($params as $k => &$value) { + $stmtParams[$k] = &$value; + } + call_user_func_array( + array($this->_stmt, 'bind_param'), + $stmtParams + ); + } + + // execute the statement + $retval = $this->_stmt->execute(); + if ($retval === false) { + /** + * @see Zend_Db_Statement_Mysqli_Exception + */ + require_once 'Zend/Db/Statement/Mysqli/Exception.php'; + throw new Zend_Db_Statement_Mysqli_Exception("Mysqli statement execute error : " . $this->_stmt->error, $this->_stmt->errno); + } + + + // retain metadata + if ($this->_meta === null) { + $this->_meta = $this->_stmt->result_metadata(); + if ($this->_stmt->errno) { + /** + * @see Zend_Db_Statement_Mysqli_Exception + */ + require_once 'Zend/Db/Statement/Mysqli/Exception.php'; + throw new Zend_Db_Statement_Mysqli_Exception("Mysqli statement metadata error: " . $this->_stmt->error, $this->_stmt->errno); + } + } + + // statements that have no result set do not return metadata + if ($this->_meta !== false) { + + // get the column names that will result + $this->_keys = array(); + foreach ($this->_meta->fetch_fields() as $col) { + $this->_keys[] = $this->_adapter->foldCase($col->name); + } + + // set up a binding space for result variables + $this->_values = array_fill(0, count($this->_keys), null); + + // set up references to the result binding space. + // just passing $this->_values in the call_user_func_array() + // below won't work, you need references. + $refs = array(); + foreach ($this->_values as $i => &$f) { + $refs[$i] = &$f; + } + + $this->_stmt->store_result(); + // bind to the result variables + call_user_func_array( + array($this->_stmt, 'bind_result'), + $this->_values + ); + } + return $retval; + } + + + /** + * Fetches a row from the result set. + * + * @param int $style OPTIONAL Fetch mode for this fetch operation. + * @param int $cursor OPTIONAL Absolute, relative, or other. + * @param int $offset OPTIONAL Number for absolute or relative cursors. + * @return mixed Array, object, or scalar depending on fetch mode. + * @throws Zend_Db_Statement_Mysqli_Exception + */ + public function fetch($style = null, $cursor = null, $offset = null) + { + if (!$this->_stmt) { + return false; + } + // fetch the next result + $retval = $this->_stmt->fetch(); + switch ($retval) { + case null: // end of data + case false: // error occurred + $this->_stmt->reset(); + return false; + default: + // fallthrough + } + + // make sure we have a fetch mode + if ($style === null) { + $style = $this->_fetchMode; + } + + // dereference the result values, otherwise things like fetchAll() + // return the same values for every entry (because of the reference). + $values = array(); + foreach ($this->_values as $key => $val) { + $values[] = $val; + } + + $row = false; + switch ($style) { + case Zend_Db::FETCH_NUM: + $row = $values; + break; + case Zend_Db::FETCH_ASSOC: + $row = array_combine($this->_keys, $values); + break; + case Zend_Db::FETCH_BOTH: + $assoc = array_combine($this->_keys, $values); + $row = array_merge($values, $assoc); + break; + case Zend_Db::FETCH_OBJ: + $row = (object) array_combine($this->_keys, $values); + break; + case Zend_Db::FETCH_BOUND: + $assoc = array_combine($this->_keys, $values); + $row = array_merge($values, $assoc); + return $this->_fetchBound($row); + break; + default: + /** + * @see Zend_Db_Statement_Mysqli_Exception + */ + require_once 'Zend/Db/Statement/Mysqli/Exception.php'; + throw new Zend_Db_Statement_Mysqli_Exception("Invalid fetch mode '$style' specified"); + break; + } + return $row; + } + + /** + * Retrieves the next rowset (result set) for a SQL statement that has + * multiple result sets. An example is a stored procedure that returns + * the results of multiple queries. + * + * @return bool + * @throws Zend_Db_Statement_Mysqli_Exception + */ + public function nextRowset() + { + /** + * @see Zend_Db_Statement_Mysqli_Exception + */ + require_once 'Zend/Db/Statement/Mysqli/Exception.php'; + throw new Zend_Db_Statement_Mysqli_Exception(__FUNCTION__.'() is not implemented'); + } + + /** + * Returns the number of rows affected by the execution of the + * last INSERT, DELETE, or UPDATE statement executed by this + * statement object. + * + * @return int The number of rows affected. + */ + public function rowCount() + { + if (!$this->_adapter) { + return false; + } + $mysqli = $this->_adapter->getConnection(); + return $mysqli->affected_rows; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Db/Statement/Mysqli/Exception.php b/lib/zend/Zend/Db/Statement/Mysqli/Exception.php new file mode 100644 index 0000000000..3d775d0a2d --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Mysqli/Exception.php @@ -0,0 +1,38 @@ +_lobAsString = (bool) $lob_as_string; + return $this; + } + + /** + * Return whether or not LOB are returned as string + * + * @return boolean + */ + public function getLobAsString() + { + return $this->_lobAsString; + } + + /** + * Prepares statement handle + * + * @param string $sql + * @return void + * @throws Zend_Db_Statement_Oracle_Exception + */ + protected function _prepare($sql) + { + $connection = $this->_adapter->getConnection(); + $this->_stmt = oci_parse($connection, $sql); + if (!$this->_stmt) { + /** + * @see Zend_Db_Statement_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($connection)); + } + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + // default value + if ($type === NULL) { + $type = SQLT_CHR; + } + + // default value + if ($length === NULL) { + $length = -1; + } + + $retval = @oci_bind_by_name($this->_stmt, $parameter, $variable, $length, $type); + if ($retval === false) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + + return true; + } + + /** + * Closes the cursor, allowing the statement to be executed again. + * + * @return bool + */ + public function closeCursor() + { + if (!$this->_stmt) { + return false; + } + + oci_free_statement($this->_stmt); + $this->_stmt = false; + return true; + } + + /** + * Returns the number of columns in the result set. + * Returns null if the statement has no result set metadata. + * + * @return int The number of columns. + */ + public function columnCount() + { + if (!$this->_stmt) { + return false; + } + + return oci_num_fields($this->_stmt); + } + + + /** + * Retrieves the error code, if any, associated with the last operation on + * the statement handle. + * + * @return string error code. + */ + public function errorCode() + { + if (!$this->_stmt) { + return false; + } + + $error = oci_error($this->_stmt); + + if (!$error) { + return false; + } + + return $error['code']; + } + + + /** + * Retrieves an array of error information, if any, associated with the + * last operation on the statement handle. + * + * @return array + */ + public function errorInfo() + { + if (!$this->_stmt) { + return false; + } + + $error = oci_error($this->_stmt); + if (!$error) { + return false; + } + + if (isset($error['sqltext'])) { + return array( + $error['code'], + $error['message'], + $error['offset'], + $error['sqltext'], + ); + } else { + return array( + $error['code'], + $error['message'], + ); + } + } + + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function _execute(array $params = null) + { + $connection = $this->_adapter->getConnection(); + if (!$this->_stmt) { + return false; + } + + if (! $this->_stmt) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($connection)); + } + + if ($params !== null) { + if (!is_array($params)) { + $params = array($params); + } + $error = false; + foreach (array_keys($params) as $name) { + if (!@oci_bind_by_name($this->_stmt, $name, $params[$name], -1)) { + $error = true; + break; + } + } + if ($error) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + } + + $retval = @oci_execute($this->_stmt, $this->_adapter->_getExecuteMode()); + if ($retval === false) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + + $this->_keys = Array(); + if ($field_num = oci_num_fields($this->_stmt)) { + for ($i = 1; $i <= $field_num; $i++) { + $name = oci_field_name($this->_stmt, $i); + $this->_keys[] = $name; + } + } + + $this->_values = Array(); + if ($this->_keys) { + $this->_values = array_fill(0, count($this->_keys), null); + } + + return $retval; + } + + /** + * Fetches a row from the result set. + * + * @param int $style OPTIONAL Fetch mode for this fetch operation. + * @param int $cursor OPTIONAL Absolute, relative, or other. + * @param int $offset OPTIONAL Number for absolute or relative cursors. + * @return mixed Array, object, or scalar depending on fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetch($style = null, $cursor = null, $offset = null) + { + if (!$this->_stmt) { + return false; + } + + if ($style === null) { + $style = $this->_fetchMode; + } + + $lob_as_string = $this->getLobAsString() ? OCI_RETURN_LOBS : 0; + + switch ($style) { + case Zend_Db::FETCH_NUM: + $row = oci_fetch_array($this->_stmt, OCI_NUM | OCI_RETURN_NULLS | $lob_as_string); + break; + case Zend_Db::FETCH_ASSOC: + $row = oci_fetch_array($this->_stmt, OCI_ASSOC | OCI_RETURN_NULLS | $lob_as_string); + break; + case Zend_Db::FETCH_BOTH: + $row = oci_fetch_array($this->_stmt, OCI_BOTH | OCI_RETURN_NULLS | $lob_as_string); + break; + case Zend_Db::FETCH_OBJ: + $row = oci_fetch_object($this->_stmt); + break; + case Zend_Db::FETCH_BOUND: + $row = oci_fetch_array($this->_stmt, OCI_BOTH | OCI_RETURN_NULLS | $lob_as_string); + if ($row !== false) { + return $this->_fetchBound($row); + } + break; + default: + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception( + array( + 'code' => 'HYC00', + 'message' => "Invalid fetch mode '$style' specified" + ) + ); + break; + } + + if (! $row && $error = oci_error($this->_stmt)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception($error); + } + + if (is_array($row) && array_key_exists('zend_db_rownum', $row)) { + unset($row['zend_db_rownum']); + } + + return $row; + } + + /** + * Returns an array containing all of the result set rows. + * + * @param int $style OPTIONAL Fetch mode. + * @param int $col OPTIONAL Column number, if fetch mode is by column. + * @return array Collection of rows, each in a format by the fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetchAll($style = null, $col = 0) + { + if (!$this->_stmt) { + return false; + } + + // make sure we have a fetch mode + if ($style === null) { + $style = $this->_fetchMode; + } + + $flags = OCI_FETCHSTATEMENT_BY_ROW; + + switch ($style) { + case Zend_Db::FETCH_BOTH: + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception( + array( + 'code' => 'HYC00', + 'message' => "OCI8 driver does not support fetchAll(FETCH_BOTH), use fetch() in a loop instead" + ) + ); + // notreached + $flags |= OCI_NUM; + $flags |= OCI_ASSOC; + break; + case Zend_Db::FETCH_NUM: + $flags |= OCI_NUM; + break; + case Zend_Db::FETCH_ASSOC: + $flags |= OCI_ASSOC; + break; + case Zend_Db::FETCH_OBJ: + break; + case Zend_Db::FETCH_COLUMN: + $flags = $flags &~ OCI_FETCHSTATEMENT_BY_ROW; + $flags |= OCI_FETCHSTATEMENT_BY_COLUMN; + $flags |= OCI_NUM; + break; + default: + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception( + array( + 'code' => 'HYC00', + 'message' => "Invalid fetch mode '$style' specified" + ) + ); + break; + } + + $result = Array(); + if ($flags != OCI_FETCHSTATEMENT_BY_ROW) { /* not Zend_Db::FETCH_OBJ */ + if (! ($rows = oci_fetch_all($this->_stmt, $result, 0, -1, $flags) )) { + if ($error = oci_error($this->_stmt)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception($error); + } + if (!$rows) { + return array(); + } + } + if ($style == Zend_Db::FETCH_COLUMN) { + $result = $result[$col]; + } + foreach ($result as &$row) { + if (is_array($row) && array_key_exists('zend_db_rownum', $row)) { + unset($row['zend_db_rownum']); + } + } + } else { + while (($row = oci_fetch_object($this->_stmt)) !== false) { + $result [] = $row; + } + if ($error = oci_error($this->_stmt)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception($error); + } + } + + return $result; + } + + + /** + * Returns a single column from the next row of a result set. + * + * @param int $col OPTIONAL Position of the column to fetch. + * @return string + * @throws Zend_Db_Statement_Exception + */ + public function fetchColumn($col = 0) + { + if (!$this->_stmt) { + return false; + } + + if (!oci_fetch($this->_stmt)) { + // if no error, there is simply no record + if (!$error = oci_error($this->_stmt)) { + return false; + } + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception($error); + } + + $data = oci_result($this->_stmt, $col+1); //1-based + if ($data === false) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + + if ($this->getLobAsString()) { + // instanceof doesn't allow '-', we must use a temporary string + $type = 'OCI-Lob'; + if ($data instanceof $type) { + $data = $data->read($data->size()); + } + } + + return $data; + } + + /** + * Fetches the next row and returns it as an object. + * + * @param string $class OPTIONAL Name of the class to create. + * @param array $config OPTIONAL Constructor arguments for the class. + * @return mixed One object instance of the specified class. + * @throws Zend_Db_Statement_Exception + */ + public function fetchObject($class = 'stdClass', array $config = array()) + { + if (!$this->_stmt) { + return false; + } + + $obj = oci_fetch_object($this->_stmt); + + if ($error = oci_error($this->_stmt)) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception($error); + } + + /* @todo XXX handle parameters */ + + return $obj; + } + + /** + * Retrieves the next rowset (result set) for a SQL statement that has + * multiple result sets. An example is a stored procedure that returns + * the results of multiple queries. + * + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function nextRowset() + { + /** + * @see Zend_Db_Statement_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception( + array( + 'code' => 'HYC00', + 'message' => 'Optional feature not implemented' + ) + ); + } + + /** + * Returns the number of rows affected by the execution of the + * last INSERT, DELETE, or UPDATE statement executed by this + * statement object. + * + * @return int The number of rows affected. + * @throws Zend_Db_Statement_Exception + */ + public function rowCount() + { + if (!$this->_stmt) { + return false; + } + + $num_rows = oci_num_rows($this->_stmt); + + if ($num_rows === false) { + /** + * @see Zend_Db_Adapter_Oracle_Exception + */ + require_once 'Zend/Db/Statement/Oracle/Exception.php'; + throw new Zend_Db_Statement_Oracle_Exception(oci_error($this->_stmt)); + } + + return $num_rows; + } + +} diff --git a/lib/zend/Zend/Db/Statement/Oracle/Exception.php b/lib/zend/Zend/Db/Statement/Oracle/Exception.php new file mode 100644 index 0000000000..ae148355bb --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Oracle/Exception.php @@ -0,0 +1,59 @@ +message = $error['code']." ".$error['message']; + } else { + $this->message = $error['code']." ".$error['message']." "; + $this->message .= substr($error['sqltext'], 0, $error['offset']); + $this->message .= "*"; + $this->message .= substr($error['sqltext'], $error['offset']); + } + $this->code = $error['code']; + } + if (!$this->code && $code) { + $this->code = $code; + } + } +} + diff --git a/lib/zend/Zend/Db/Statement/Pdo.php b/lib/zend/Zend/Db/Statement/Pdo.php new file mode 100644 index 0000000000..71ac623116 --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Pdo.php @@ -0,0 +1,439 @@ +_stmt = $this->_adapter->getConnection()->prepare($sql); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Bind a column of the statement result set to a PHP variable. + * + * @param string $column Name the column in the result set, either by + * position or by name. + * @param mixed $param Reference to the PHP variable containing the value. + * @param mixed $type OPTIONAL + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function bindColumn($column, &$param, $type = null) + { + try { + if ($type === null) { + return $this->_stmt->bindColumn($column, $param); + } else { + return $this->_stmt->bindColumn($column, $param, $type); + } + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + try { + if ($type === null) { + if (is_bool($variable)) { + $type = PDO::PARAM_BOOL; + } elseif ($variable === null) { + $type = PDO::PARAM_NULL; + } elseif (is_integer($variable)) { + $type = PDO::PARAM_INT; + } else { + $type = PDO::PARAM_STR; + } + } + return $this->_stmt->bindParam($parameter, $variable, $type, $length, $options); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Binds a value to a parameter. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $value Scalar value to bind to the parameter. + * @param mixed $type OPTIONAL Datatype of the parameter. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function bindValue($parameter, $value, $type = null) + { + if (is_string($parameter) && $parameter[0] != ':') { + $parameter = ":$parameter"; + } + + $this->_bindParam[$parameter] = $value; + + try { + if ($type === null) { + return $this->_stmt->bindValue($parameter, $value); + } else { + return $this->_stmt->bindValue($parameter, $value, $type); + } + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Closes the cursor, allowing the statement to be executed again. + * + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function closeCursor() + { + try { + return $this->_stmt->closeCursor(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Returns the number of columns in the result set. + * Returns null if the statement has no result set metadata. + * + * @return int The number of columns. + * @throws Zend_Db_Statement_Exception + */ + public function columnCount() + { + try { + return $this->_stmt->columnCount(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Retrieves the error code, if any, associated with the last operation on + * the statement handle. + * + * @return string error code. + * @throws Zend_Db_Statement_Exception + */ + public function errorCode() + { + try { + return $this->_stmt->errorCode(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Retrieves an array of error information, if any, associated with the + * last operation on the statement handle. + * + * @return array + * @throws Zend_Db_Statement_Exception + */ + public function errorInfo() + { + try { + return $this->_stmt->errorInfo(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function _execute(array $params = null) + { + try { + if ($params !== null) { + return $this->_stmt->execute($params); + } else { + return $this->_stmt->execute(); + } + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Fetches a row from the result set. + * + * @param int $style OPTIONAL Fetch mode for this fetch operation. + * @param int $cursor OPTIONAL Absolute, relative, or other. + * @param int $offset OPTIONAL Number for absolute or relative cursors. + * @return mixed Array, object, or scalar depending on fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetch($style = null, $cursor = null, $offset = null) + { + if ($style === null) { + $style = $this->_fetchMode; + } + try { + return $this->_stmt->fetch($style, $cursor, $offset); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Required by IteratorAggregate interface + * + * @return IteratorIterator + */ + public function getIterator() + { + return new IteratorIterator($this->_stmt); + } + + /** + * Returns an array containing all of the result set rows. + * + * @param int $style OPTIONAL Fetch mode. + * @param int $col OPTIONAL Column number, if fetch mode is by column. + * @return array Collection of rows, each in a format by the fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetchAll($style = null, $col = null) + { + if ($style === null) { + $style = $this->_fetchMode; + } + try { + if ($style == PDO::FETCH_COLUMN) { + if ($col === null) { + $col = 0; + } + return $this->_stmt->fetchAll($style, $col); + } else { + return $this->_stmt->fetchAll($style); + } + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Returns a single column from the next row of a result set. + * + * @param int $col OPTIONAL Position of the column to fetch. + * @return string + * @throws Zend_Db_Statement_Exception + */ + public function fetchColumn($col = 0) + { + try { + return $this->_stmt->fetchColumn($col); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Fetches the next row and returns it as an object. + * + * @param string $class OPTIONAL Name of the class to create. + * @param array $config OPTIONAL Constructor arguments for the class. + * @return mixed One object instance of the specified class. + * @throws Zend_Db_Statement_Exception + */ + public function fetchObject($class = 'stdClass', array $config = array()) + { + try { + return $this->_stmt->fetchObject($class, $config); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Retrieve a statement attribute. + * + * @param integer $key Attribute name. + * @return mixed Attribute value. + * @throws Zend_Db_Statement_Exception + */ + public function getAttribute($key) + { + try { + return $this->_stmt->getAttribute($key); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Returns metadata for a column in a result set. + * + * @param int $column + * @return mixed + * @throws Zend_Db_Statement_Exception + */ + public function getColumnMeta($column) + { + try { + return $this->_stmt->getColumnMeta($column); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Retrieves the next rowset (result set) for a SQL statement that has + * multiple result sets. An example is a stored procedure that returns + * the results of multiple queries. + * + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function nextRowset() + { + try { + return $this->_stmt->nextRowset(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Returns the number of rows affected by the execution of the + * last INSERT, DELETE, or UPDATE statement executed by this + * statement object. + * + * @return int The number of rows affected. + * @throws Zend_Db_Statement_Exception + */ + public function rowCount() + { + try { + return $this->_stmt->rowCount(); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Set a statement attribute. + * + * @param string $key Attribute name. + * @param mixed $val Attribute value. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function setAttribute($key, $val) + { + try { + return $this->_stmt->setAttribute($key, $val); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Set the default fetch mode for this statement. + * + * @param int $mode The fetch mode. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function setFetchMode($mode) + { + $this->_fetchMode = $mode; + try { + return $this->_stmt->setFetchMode($mode); + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + +} diff --git a/lib/zend/Zend/Db/Statement/Pdo/Ibm.php b/lib/zend/Zend/Db/Statement/Pdo/Ibm.php new file mode 100644 index 0000000000..87f808f6a3 --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Pdo/Ibm.php @@ -0,0 +1,94 @@ +_adapter->foldCase('ZEND_DB_ROWNUM'); + + foreach ($data as $row) { + if (is_array($row) && array_key_exists($remove, $row)) { + unset($row[$remove]); + } + $results[] = $row; + } + return $results; + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + try { + if (($type === null) && ($length === null) && ($options === null)) { + return $this->_stmt->bindParam($parameter, $variable); + } else { + return $this->_stmt->bindParam($parameter, $variable, $type, $length, $options); + } + } catch (PDOException $e) { + require_once 'Zend/Db/Statement/Exception.php'; + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); + } + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Db/Statement/Pdo/Oci.php b/lib/zend/Zend/Db/Statement/Pdo/Oci.php new file mode 100644 index 0000000000..0635cce5de --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Pdo/Oci.php @@ -0,0 +1,69 @@ +_adapter->foldCase('zend_db_rownum'); + + foreach ($data as $row) { + if (is_array($row) && array_key_exists($remove, $row)) { + unset($row[$remove]); + } + $results[] = $row; + } + return $results; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Db/Statement/Sqlsrv.php b/lib/zend/Zend/Db/Statement/Sqlsrv.php new file mode 100644 index 0000000000..45c243edf1 --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Sqlsrv.php @@ -0,0 +1,410 @@ +_adapter->getConnection(); + + $this->_stmt = sqlsrv_prepare($connection, $sql); + + if (!$this->_stmt) { + require_once 'Zend/Db/Statement/Sqlsrv/Exception.php'; + throw new Zend_Db_Statement_Sqlsrv_Exception(sqlsrv_errors()); + } + + $this->_originalSQL = $sql; + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + protected function _bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + //Sql server doesn't support bind by name + return true; + } + + /** + * Closes the cursor, allowing the statement to be executed again. + * + * @return bool + */ + public function closeCursor() + { + if (!$this->_stmt) { + return false; + } + + sqlsrv_free_stmt($this->_stmt); + $this->_stmt = false; + return true; + } + + /** + * Returns the number of columns in the result set. + * Returns null if the statement has no result set metadata. + * + * @return int The number of columns. + */ + public function columnCount() + { + if ($this->_stmt && $this->_executed) { + return sqlsrv_num_fields($this->_stmt); + } + + return 0; + } + + + /** + * Retrieves the error code, if any, associated with the last operation on + * the statement handle. + * + * @return string error code. + */ + public function errorCode() + { + if (!$this->_stmt) { + return false; + } + + $error = sqlsrv_errors(); + if (!$error) { + return false; + } + + return $error[0]['code']; + } + + + /** + * Retrieves an array of error information, if any, associated with the + * last operation on the statement handle. + * + * @return array + */ + public function errorInfo() + { + if (!$this->_stmt) { + return false; + } + + $error = sqlsrv_errors(); + if (!$error) { + return false; + } + + return array( + $error[0]['code'], + $error[0]['message'], + ); + } + + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function _execute(array $params = null) + { + $connection = $this->_adapter->getConnection(); + if (!$this->_stmt) { + return false; + } + + if ($params !== null) { + if (!is_array($params)) { + $params = array($params); + } + $error = false; + + // make all params passed by reference + $params_ = array(); + $temp = array(); + $i = 1; + foreach ($params as $param) { + $temp[$i] = $param; + $params_[] = &$temp[$i]; + $i++; + } + $params = $params_; + } + + $this->_stmt = sqlsrv_query($connection, $this->_originalSQL, $params); + + if (!$this->_stmt) { + require_once 'Zend/Db/Statement/Sqlsrv/Exception.php'; + throw new Zend_Db_Statement_Sqlsrv_Exception(sqlsrv_errors()); + } + + $this->_executed = true; + + return (!$this->_stmt); + } + + /** + * Fetches a row from the result set. + * + * @param int $style OPTIONAL Fetch mode for this fetch operation. + * @param int $cursor OPTIONAL Absolute, relative, or other. + * @param int $offset OPTIONAL Number for absolute or relative cursors. + * @return mixed Array, object, or scalar depending on fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetch($style = null, $cursor = null, $offset = null) + { + if (!$this->_stmt) { + return false; + } + + if (null === $style) { + $style = $this->_fetchMode; + } + + $values = sqlsrv_fetch_array($this->_stmt, SQLSRV_FETCH_ASSOC); + + if (!$values && (null !== $error = sqlsrv_errors())) { + require_once 'Zend/Db/Statement/Sqlsrv/Exception.php'; + throw new Zend_Db_Statement_Sqlsrv_Exception($error); + } + + if (null === $values) { + return null; + } + + if (!$this->_keys) { + foreach ($values as $key => $value) { + $this->_keys[] = $this->_adapter->foldCase($key); + } + } + + $values = array_values($values); + + $row = false; + switch ($style) { + case Zend_Db::FETCH_NUM: + $row = $values; + break; + case Zend_Db::FETCH_ASSOC: + $row = array_combine($this->_keys, $values); + break; + case Zend_Db::FETCH_BOTH: + $assoc = array_combine($this->_keys, $values); + $row = array_merge($values, $assoc); + break; + case Zend_Db::FETCH_OBJ: + $row = (object) array_combine($this->_keys, $values); + break; + case Zend_Db::FETCH_BOUND: + $assoc = array_combine($this->_keys, $values); + $row = array_merge($values, $assoc); + $row = $this->_fetchBound($row); + break; + default: + require_once 'Zend/Db/Statement/Sqlsrv/Exception.php'; + throw new Zend_Db_Statement_Sqlsrv_Exception("Invalid fetch mode '$style' specified"); + break; + } + + return $row; + } + + /** + * Returns a single column from the next row of a result set. + * + * @param int $col OPTIONAL Position of the column to fetch. + * @return string + * @throws Zend_Db_Statement_Exception + */ + public function fetchColumn($col = 0) + { + if (!$this->_stmt) { + return false; + } + + if (!sqlsrv_fetch($this->_stmt)) { + if (null !== $error = sqlsrv_errors()) { + require_once 'Zend/Db/Statement/Sqlsrv/Exception.php'; + throw new Zend_Db_Statement_Sqlsrv_Exception($error); + } + + // If no error, there is simply no record + return false; + } + + $data = sqlsrv_get_field($this->_stmt, $col); //0-based + if ($data === false) { + require_once 'Zend/Db/Statement/Sqlsrv/Exception.php'; + throw new Zend_Db_Statement_Sqlsrv_Exception(sqlsrv_errors()); + } + + return $data; + } + + /** + * Fetches the next row and returns it as an object. + * + * @param string $class OPTIONAL Name of the class to create. + * @param array $config OPTIONAL Constructor arguments for the class. + * @return mixed One object instance of the specified class. + * @throws Zend_Db_Statement_Exception + */ + public function fetchObject($class = 'stdClass', array $config = array()) + { + if (!$this->_stmt) { + return false; + } + + $obj = sqlsrv_fetch_object($this->_stmt); + + if ($error = sqlsrv_errors()) { + require_once 'Zend/Db/Statement/Sqlsrv/Exception.php'; + throw new Zend_Db_Statement_Sqlsrv_Exception($error); + } + + /* @todo XXX handle parameters */ + + if (null === $obj) { + return false; + } + + return $obj; + } + + /** + * Returns metadata for a column in a result set. + * + * @param int $column + * @return mixed + * @throws Zend_Db_Statement_Sqlsrv_Exception + */ + public function getColumnMeta($column) + { + $fields = sqlsrv_field_metadata($this->_stmt); + + if (!$fields) { + throw new Zend_Db_Statement_Sqlsrv_Exception('Column metadata can not be fetched'); + } + + if (!isset($fields[$column])) { + throw new Zend_Db_Statement_Sqlsrv_Exception('Column index does not exist in statement'); + } + + return $fields[$column]; + } + + /** + * Retrieves the next rowset (result set) for a SQL statement that has + * multiple result sets. An example is a stored procedure that returns + * the results of multiple queries. + * + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function nextRowset() + { + if (sqlsrv_next_result($this->_stmt) === false) { + require_once 'Zend/Db/Statement/Sqlsrv/Exception.php'; + throw new Zend_Db_Statement_Sqlsrv_Exception(sqlsrv_errors()); + } + + //else - moved to next (or there are no more rows) + } + + /** + * Returns the number of rows affected by the execution of the + * last INSERT, DELETE, or UPDATE statement executed by this + * statement object. + * + * @return int The number of rows affected. + * @throws Zend_Db_Statement_Exception + */ + public function rowCount() + { + if (!$this->_stmt) { + return false; + } + + if (!$this->_executed) { + return 0; + } + + $num_rows = sqlsrv_rows_affected($this->_stmt); + + // Strict check is necessary; 0 is a valid return value + if ($num_rows === false) { + require_once 'Zend/Db/Statement/Sqlsrv/Exception.php'; + throw new Zend_Db_Statement_Sqlsrv_Exception(sqlsrv_errors()); + } + + return $num_rows; + } +} diff --git a/lib/zend/Zend/Db/Statement/Sqlsrv/Exception.php b/lib/zend/Zend/Db/Statement/Sqlsrv/Exception.php new file mode 100644 index 0000000000..02378627f9 --- /dev/null +++ b/lib/zend/Zend/Db/Statement/Sqlsrv/Exception.php @@ -0,0 +1,59 @@ + $config); + } else { + // process this as table with or without a definition + if ($definition instanceof Zend_Db_Table_Definition + && $definition->hasTableConfig($config)) { + // this will have DEFINITION_CONFIG_NAME & DEFINITION + $config = $definition->getTableConfig($config); + } else { + $config = array(self::NAME => $config); + } + } + } + + parent::__construct($config); + } + + + + + +} diff --git a/lib/zend/Zend/Db/Table/Abstract.php b/lib/zend/Zend/Db/Table/Abstract.php new file mode 100644 index 0000000000..4e85deefca --- /dev/null +++ b/lib/zend/Zend/Db/Table/Abstract.php @@ -0,0 +1,1514 @@ + $config); + } + + if ($config) { + $this->setOptions($config); + } + + $this->_setup(); + $this->init(); + } + + /** + * setOptions() + * + * @param array $options + * @return Zend_Db_Table_Abstract + */ + public function setOptions(Array $options) + { + foreach ($options as $key => $value) { + switch ($key) { + case self::ADAPTER: + $this->_setAdapter($value); + break; + case self::DEFINITION: + $this->setDefinition($value); + break; + case self::DEFINITION_CONFIG_NAME: + $this->setDefinitionConfigName($value); + break; + case self::SCHEMA: + $this->_schema = (string) $value; + break; + case self::NAME: + $this->_name = (string) $value; + break; + case self::PRIMARY: + $this->_primary = (array) $value; + break; + case self::ROW_CLASS: + $this->setRowClass($value); + break; + case self::ROWSET_CLASS: + $this->setRowsetClass($value); + break; + case self::REFERENCE_MAP: + $this->setReferences($value); + break; + case self::DEPENDENT_TABLES: + $this->setDependentTables($value); + break; + case self::METADATA_CACHE: + $this->_setMetadataCache($value); + break; + case self::METADATA_CACHE_IN_CLASS: + $this->setMetadataCacheInClass($value); + break; + case self::SEQUENCE: + $this->_setSequence($value); + break; + default: + // ignore unrecognized configuration directive + break; + } + } + + return $this; + } + + /** + * setDefinition() + * + * @param Zend_Db_Table_Definition $definition + * @return Zend_Db_Table_Abstract + */ + public function setDefinition(Zend_Db_Table_Definition $definition) + { + $this->_definition = $definition; + return $this; + } + + /** + * getDefinition() + * + * @return Zend_Db_Table_Definition|null + */ + public function getDefinition() + { + return $this->_definition; + } + + /** + * setDefinitionConfigName() + * + * @param string $definition + * @return Zend_Db_Table_Abstract + */ + public function setDefinitionConfigName($definitionConfigName) + { + $this->_definitionConfigName = $definitionConfigName; + return $this; + } + + /** + * getDefinitionConfigName() + * + * @return string + */ + public function getDefinitionConfigName() + { + return $this->_definitionConfigName; + } + + /** + * @param string $classname + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + public function setRowClass($classname) + { + $this->_rowClass = (string) $classname; + + return $this; + } + + /** + * @return string + */ + public function getRowClass() + { + return $this->_rowClass; + } + + /** + * @param string $classname + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + public function setRowsetClass($classname) + { + $this->_rowsetClass = (string) $classname; + + return $this; + } + + /** + * @return string + */ + public function getRowsetClass() + { + return $this->_rowsetClass; + } + + /** + * Add a reference to the reference map + * + * @param string $ruleKey + * @param string|array $columns + * @param string $refTableClass + * @param string|array $refColumns + * @param string $onDelete + * @param string $onUpdate + * @return Zend_Db_Table_Abstract + */ + public function addReference($ruleKey, $columns, $refTableClass, $refColumns, + $onDelete = null, $onUpdate = null) + { + $reference = array(self::COLUMNS => (array) $columns, + self::REF_TABLE_CLASS => $refTableClass, + self::REF_COLUMNS => (array) $refColumns); + + if (!empty($onDelete)) { + $reference[self::ON_DELETE] = $onDelete; + } + + if (!empty($onUpdate)) { + $reference[self::ON_UPDATE] = $onUpdate; + } + + $this->_referenceMap[$ruleKey] = $reference; + + return $this; + } + + /** + * @param array $referenceMap + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + public function setReferences(array $referenceMap) + { + $this->_referenceMap = $referenceMap; + + return $this; + } + + /** + * @param string $tableClassname + * @param string $ruleKey OPTIONAL + * @return array + * @throws Zend_Db_Table_Exception + */ + public function getReference($tableClassname, $ruleKey = null) + { + $thisClass = get_class($this); + if ($thisClass === 'Zend_Db_Table') { + $thisClass = $this->_definitionConfigName; + } + $refMap = $this->_getReferenceMapNormalized(); + if ($ruleKey !== null) { + if (!isset($refMap[$ruleKey])) { + require_once "Zend/Db/Table/Exception.php"; + throw new Zend_Db_Table_Exception("No reference rule \"$ruleKey\" from table $thisClass to table $tableClassname"); + } + if ($refMap[$ruleKey][self::REF_TABLE_CLASS] != $tableClassname) { + require_once "Zend/Db/Table/Exception.php"; + throw new Zend_Db_Table_Exception("Reference rule \"$ruleKey\" does not reference table $tableClassname"); + } + return $refMap[$ruleKey]; + } + foreach ($refMap as $reference) { + if ($reference[self::REF_TABLE_CLASS] == $tableClassname) { + return $reference; + } + } + require_once "Zend/Db/Table/Exception.php"; + throw new Zend_Db_Table_Exception("No reference from table $thisClass to table $tableClassname"); + } + + /** + * @param array $dependentTables + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + public function setDependentTables(array $dependentTables) + { + $this->_dependentTables = $dependentTables; + + return $this; + } + + /** + * @return array + */ + public function getDependentTables() + { + return $this->_dependentTables; + } + + /** + * set the defaultSource property - this tells the table class where to find default values + * + * @param string $defaultSource + * @return Zend_Db_Table_Abstract + */ + public function setDefaultSource($defaultSource = self::DEFAULT_NONE) + { + if (!in_array($defaultSource, array(self::DEFAULT_CLASS, self::DEFAULT_DB, self::DEFAULT_NONE))) { + $defaultSource = self::DEFAULT_NONE; + } + + $this->_defaultSource = $defaultSource; + return $this; + } + + /** + * returns the default source flag that determines where defaultSources come from + * + * @return unknown + */ + public function getDefaultSource() + { + return $this->_defaultSource; + } + + /** + * set the default values for the table class + * + * @param array $defaultValues + * @return Zend_Db_Table_Abstract + */ + public function setDefaultValues(Array $defaultValues) + { + foreach ($defaultValues as $defaultName => $defaultValue) { + if (array_key_exists($defaultName, $this->_metadata)) { + $this->_defaultValues[$defaultName] = $defaultValue; + } + } + return $this; + } + + public function getDefaultValues() + { + return $this->_defaultValues; + } + + + /** + * Sets the default Zend_Db_Adapter_Abstract for all Zend_Db_Table objects. + * + * @param mixed $db Either an Adapter object, or a string naming a Registry key + * @return void + */ + public static function setDefaultAdapter($db = null) + { + self::$_defaultDb = self::_setupAdapter($db); + } + + /** + * Gets the default Zend_Db_Adapter_Abstract for all Zend_Db_Table objects. + * + * @return Zend_Db_Adapter_Abstract or null + */ + public static function getDefaultAdapter() + { + return self::$_defaultDb; + } + + /** + * @param mixed $db Either an Adapter object, or a string naming a Registry key + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + protected function _setAdapter($db) + { + $this->_db = self::_setupAdapter($db); + return $this; + } + + /** + * Gets the Zend_Db_Adapter_Abstract for this particular Zend_Db_Table object. + * + * @return Zend_Db_Adapter_Abstract + */ + public function getAdapter() + { + return $this->_db; + } + + /** + * @param mixed $db Either an Adapter object, or a string naming a Registry key + * @return Zend_Db_Adapter_Abstract + * @throws Zend_Db_Table_Exception + */ + protected static function _setupAdapter($db) + { + if ($db === null) { + return null; + } + if (is_string($db)) { + require_once 'Zend/Registry.php'; + $db = Zend_Registry::get($db); + } + if (!$db instanceof Zend_Db_Adapter_Abstract) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('Argument must be of type Zend_Db_Adapter_Abstract, or a Registry key where a Zend_Db_Adapter_Abstract object is stored'); + } + return $db; + } + + /** + * Sets the default metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable(). + * + * If $defaultMetadataCache is null, then no metadata cache is used by default. + * + * @param mixed $metadataCache Either a Cache object, or a string naming a Registry key + * @return void + */ + public static function setDefaultMetadataCache($metadataCache = null) + { + self::$_defaultMetadataCache = self::_setupMetadataCache($metadataCache); + } + + /** + * Gets the default metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable(). + * + * @return Zend_Cache_Core or null + */ + public static function getDefaultMetadataCache() + { + return self::$_defaultMetadataCache; + } + + /** + * Sets the metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable(). + * + * If $metadataCache is null, then no metadata cache is used. Since there is no opportunity to reload metadata + * after instantiation, this method need not be public, particularly because that it would have no effect + * results in unnecessary API complexity. To configure the metadata cache, use the metadataCache configuration + * option for the class constructor upon instantiation. + * + * @param mixed $metadataCache Either a Cache object, or a string naming a Registry key + * @return Zend_Db_Table_Abstract Provides a fluent interface + */ + protected function _setMetadataCache($metadataCache) + { + $this->_metadataCache = self::_setupMetadataCache($metadataCache); + return $this; + } + + /** + * Gets the metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable(). + * + * @return Zend_Cache_Core or null + */ + public function getMetadataCache() + { + return $this->_metadataCache; + } + + /** + * Indicate whether metadata should be cached in the class for the duration + * of the instance + * + * @param bool $flag + * @return Zend_Db_Table_Abstract + */ + public function setMetadataCacheInClass($flag) + { + $this->_metadataCacheInClass = (bool) $flag; + return $this; + } + + /** + * Retrieve flag indicating if metadata should be cached for duration of + * instance + * + * @return bool + */ + public function metadataCacheInClass() + { + return $this->_metadataCacheInClass; + } + + /** + * @param mixed $metadataCache Either a Cache object, or a string naming a Registry key + * @return Zend_Cache_Core + * @throws Zend_Db_Table_Exception + */ + protected static function _setupMetadataCache($metadataCache) + { + if ($metadataCache === null) { + return null; + } + if (is_string($metadataCache)) { + require_once 'Zend/Registry.php'; + $metadataCache = Zend_Registry::get($metadataCache); + } + if (!$metadataCache instanceof Zend_Cache_Core) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('Argument must be of type Zend_Cache_Core, or a Registry key where a Zend_Cache_Core object is stored'); + } + return $metadataCache; + } + + /** + * Sets the sequence member, which defines the behavior for generating + * primary key values in new rows. + * - If this is a string, then the string names the sequence object. + * - If this is boolean true, then the key uses an auto-incrementing + * or identity mechanism. + * - If this is boolean false, then the key is user-defined. + * Use this for natural keys, for example. + * + * @param mixed $sequence + * @return Zend_Db_Table_Adapter_Abstract Provides a fluent interface + */ + protected function _setSequence($sequence) + { + $this->_sequence = $sequence; + + return $this; + } + + /** + * Turnkey for initialization of a table object. + * Calls other protected methods for individual tasks, to make it easier + * for a subclass to override part of the setup logic. + * + * @return void + */ + protected function _setup() + { + $this->_setupDatabaseAdapter(); + $this->_setupTableName(); + } + + /** + * Initialize database adapter. + * + * @return void + */ + protected function _setupDatabaseAdapter() + { + if (! $this->_db) { + $this->_db = self::getDefaultAdapter(); + if (!$this->_db instanceof Zend_Db_Adapter_Abstract) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('No adapter found for ' . get_class($this)); + } + } + } + + /** + * Initialize table and schema names. + * + * If the table name is not set in the class definition, + * use the class name itself as the table name. + * + * A schema name provided with the table name (e.g., "schema.table") overrides + * any existing value for $this->_schema. + * + * @return void + */ + protected function _setupTableName() + { + if (! $this->_name) { + $this->_name = get_class($this); + } else if (strpos($this->_name, '.')) { + list($this->_schema, $this->_name) = explode('.', $this->_name); + } + } + + /** + * Initializes metadata. + * + * If metadata cannot be loaded from cache, adapter's describeTable() method is called to discover metadata + * information. Returns true if and only if the metadata are loaded from cache. + * + * @return boolean + * @throws Zend_Db_Table_Exception + */ + protected function _setupMetadata() + { + if ($this->metadataCacheInClass() && (count($this->_metadata) > 0)) { + return true; + } + + // Assume that metadata will be loaded from cache + $isMetadataFromCache = true; + + // If $this has no metadata cache but the class has a default metadata cache + if (null === $this->_metadataCache && null !== self::$_defaultMetadataCache) { + // Make $this use the default metadata cache of the class + $this->_setMetadataCache(self::$_defaultMetadataCache); + } + + // If $this has a metadata cache + if (null !== $this->_metadataCache) { + // Define the cache identifier where the metadata are saved + + //get db configuration + $dbConfig = $this->_db->getConfig(); + + // Define the cache identifier where the metadata are saved + $cacheId = md5( // port:host/dbname:schema.table (based on availabilty) + (isset($dbConfig['options']['port']) ? ':'.$dbConfig['options']['port'] : null) + . (isset($dbConfig['options']['host']) ? ':'.$dbConfig['options']['host'] : null) + . '/'.$dbConfig['dbname'].':'.$this->_schema.'.'.$this->_name + ); + } + + // If $this has no metadata cache or metadata cache misses + if (null === $this->_metadataCache || !($metadata = $this->_metadataCache->load($cacheId))) { + // Metadata are not loaded from cache + $isMetadataFromCache = false; + // Fetch metadata from the adapter's describeTable() method + $metadata = $this->_db->describeTable($this->_name, $this->_schema); + // If $this has a metadata cache, then cache the metadata + if (null !== $this->_metadataCache && !$this->_metadataCache->save($metadata, $cacheId)) { + /** + * @see Zend_Db_Table_Exception + */ + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('Failed saving metadata to metadataCache'); + } + } + + // Assign the metadata to $this + $this->_metadata = $metadata; + + // Return whether the metadata were loaded from cache + return $isMetadataFromCache; + } + + /** + * Retrieve table columns + * + * @return array + */ + protected function _getCols() + { + if (null === $this->_cols) { + $this->_setupMetadata(); + $this->_cols = array_keys($this->_metadata); + } + return $this->_cols; + } + + /** + * Initialize primary key from metadata. + * If $_primary is not defined, discover primary keys + * from the information returned by describeTable(). + * + * @return void + * @throws Zend_Db_Table_Exception + */ + protected function _setupPrimaryKey() + { + if (!$this->_primary) { + $this->_setupMetadata(); + $this->_primary = array(); + foreach ($this->_metadata as $col) { + if ($col['PRIMARY']) { + $this->_primary[ $col['PRIMARY_POSITION'] ] = $col['COLUMN_NAME']; + if ($col['IDENTITY']) { + $this->_identity = $col['PRIMARY_POSITION']; + } + } + } + // if no primary key was specified and none was found in the metadata + // then throw an exception. + if (empty($this->_primary)) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('A table must have a primary key, but none was found'); + } + } else if (!is_array($this->_primary)) { + $this->_primary = array(1 => $this->_primary); + } else if (isset($this->_primary[0])) { + array_unshift($this->_primary, null); + unset($this->_primary[0]); + } + + $cols = $this->_getCols(); + if (! array_intersect((array) $this->_primary, $cols) == (array) $this->_primary) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception("Primary key column(s) (" + . implode(',', (array) $this->_primary) + . ") are not columns in this table (" + . implode(',', $cols) + . ")"); + } + + $primary = (array) $this->_primary; + $pkIdentity = $primary[(int) $this->_identity]; + + /** + * Special case for PostgreSQL: a SERIAL key implicitly uses a sequence + * object whose name is "__seq". + */ + if ($this->_sequence === true && $this->_db instanceof Zend_Db_Adapter_Pdo_Pgsql) { + $this->_sequence = $this->_db->quoteIdentifier("{$this->_name}_{$pkIdentity}_seq"); + if ($this->_schema) { + $this->_sequence = $this->_db->quoteIdentifier($this->_schema) . '.' . $this->_sequence; + } + } + } + + /** + * Returns a normalized version of the reference map + * + * @return array + */ + protected function _getReferenceMapNormalized() + { + $referenceMapNormalized = array(); + + foreach ($this->_referenceMap as $rule => $map) { + + $referenceMapNormalized[$rule] = array(); + + foreach ($map as $key => $value) { + switch ($key) { + + // normalize COLUMNS and REF_COLUMNS to arrays + case self::COLUMNS: + case self::REF_COLUMNS: + if (!is_array($value)) { + $referenceMapNormalized[$rule][$key] = array($value); + } else { + $referenceMapNormalized[$rule][$key] = $value; + } + break; + + // other values are copied as-is + default: + $referenceMapNormalized[$rule][$key] = $value; + break; + } + } + } + + return $referenceMapNormalized; + } + + /** + * Initialize object + * + * Called from {@link __construct()} as final step of object instantiation. + * + * @return void + */ + public function init() + { + } + + /** + * Returns table information. + * + * You can elect to return only a part of this information by supplying its key name, + * otherwise all information is returned as an array. + * + * @param $key The specific info part to return OPTIONAL + * @return mixed + */ + public function info($key = null) + { + $this->_setupPrimaryKey(); + + $info = array( + self::SCHEMA => $this->_schema, + self::NAME => $this->_name, + self::COLS => $this->_getCols(), + self::PRIMARY => (array) $this->_primary, + self::METADATA => $this->_metadata, + self::ROW_CLASS => $this->getRowClass(), + self::ROWSET_CLASS => $this->getRowsetClass(), + self::REFERENCE_MAP => $this->_referenceMap, + self::DEPENDENT_TABLES => $this->_dependentTables, + self::SEQUENCE => $this->_sequence + ); + + if ($key === null) { + return $info; + } + + if (!array_key_exists($key, $info)) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception('There is no table information for the key "' . $key . '"'); + } + + return $info[$key]; + } + + /** + * Returns an instance of a Zend_Db_Table_Select object. + * + * @param bool $withFromPart Whether or not to include the from part of the select based on the table + * @return Zend_Db_Table_Select + */ + public function select($withFromPart = self::SELECT_WITHOUT_FROM_PART) + { + require_once 'Zend/Db/Table/Select.php'; + $select = new Zend_Db_Table_Select($this); + if ($withFromPart == self::SELECT_WITH_FROM_PART) { + $select->from($this->info(self::NAME), Zend_Db_Table_Select::SQL_WILDCARD, $this->info(self::SCHEMA)); + } + return $select; + } + + /** + * Inserts a new row. + * + * @param array $data Column-value pairs. + * @return mixed The primary key of the row inserted. + */ + public function insert(array $data) + { + $this->_setupPrimaryKey(); + + /** + * Zend_Db_Table assumes that if you have a compound primary key + * and one of the columns in the key uses a sequence, + * it's the _first_ column in the compound key. + */ + $primary = (array) $this->_primary; + $pkIdentity = $primary[(int)$this->_identity]; + + /** + * If this table uses a database sequence object and the data does not + * specify a value, then get the next ID from the sequence and add it + * to the row. We assume that only the first column in a compound + * primary key takes a value from a sequence. + */ + if (is_string($this->_sequence) && !isset($data[$pkIdentity])) { + $data[$pkIdentity] = $this->_db->nextSequenceId($this->_sequence); + } + + /** + * If the primary key can be generated automatically, and no value was + * specified in the user-supplied data, then omit it from the tuple. + */ + if (array_key_exists($pkIdentity, $data) && $data[$pkIdentity] === null) { + unset($data[$pkIdentity]); + } + + /** + * INSERT the new row. + */ + $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name; + $this->_db->insert($tableSpec, $data); + + /** + * Fetch the most recent ID generated by an auto-increment + * or IDENTITY column, unless the user has specified a value, + * overriding the auto-increment mechanism. + */ + if ($this->_sequence === true && !isset($data[$pkIdentity])) { + $data[$pkIdentity] = $this->_db->lastInsertId(); + } + + /** + * Return the primary key value if the PK is a single column, + * else return an associative array of the PK column/value pairs. + */ + $pkData = array_intersect_key($data, array_flip($primary)); + if (count($primary) == 1) { + reset($pkData); + return current($pkData); + } + + return $pkData; + } + + /** + * Check if the provided column is an identity of the table + * + * @param string $column + * @throws Zend_Db_Table_Exception + * @return boolean + */ + public function isIdentity($column) + { + $this->_setupPrimaryKey(); + + if (!isset($this->_metadata[$column])) { + /** + * @see Zend_Db_Table_Exception + */ + require_once 'Zend/Db/Table/Exception.php'; + + throw new Zend_Db_Table_Exception('Column "' . $column . '" not found in table.'); + } + + return (bool) $this->_metadata[$column]['IDENTITY']; + } + + /** + * Updates existing rows. + * + * @param array $data Column-value pairs. + * @param array|string $where An SQL WHERE clause, or an array of SQL WHERE clauses. + * @return int The number of rows updated. + */ + public function update(array $data, $where) + { + $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name; + return $this->_db->update($tableSpec, $data, $where); + } + + /** + * Called by a row object for the parent table's class during save() method. + * + * @param string $parentTableClassname + * @param array $oldPrimaryKey + * @param array $newPrimaryKey + * @return int + */ + public function _cascadeUpdate($parentTableClassname, array $oldPrimaryKey, array $newPrimaryKey) + { + $this->_setupMetadata(); + $rowsAffected = 0; + foreach ($this->_getReferenceMapNormalized() as $map) { + if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_UPDATE])) { + switch ($map[self::ON_UPDATE]) { + case self::CASCADE: + $newRefs = array(); + $where = array(); + for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) { + $col = $this->_db->foldCase($map[self::COLUMNS][$i]); + $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]); + if (array_key_exists($refCol, $newPrimaryKey)) { + $newRefs[$col] = $newPrimaryKey[$refCol]; + } + $type = $this->_metadata[$col]['DATA_TYPE']; + $where[] = $this->_db->quoteInto( + $this->_db->quoteIdentifier($col, true) . ' = ?', + $oldPrimaryKey[$refCol], $type); + } + $rowsAffected += $this->update($newRefs, $where); + break; + default: + // no action + break; + } + } + } + return $rowsAffected; + } + + /** + * Deletes existing rows. + * + * @param array|string $where SQL WHERE clause(s). + * @return int The number of rows deleted. + */ + public function delete($where) + { + $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name; + return $this->_db->delete($tableSpec, $where); + } + + /** + * Called by parent table's class during delete() method. + * + * @param string $parentTableClassname + * @param array $primaryKey + * @return int Number of affected rows + */ + public function _cascadeDelete($parentTableClassname, array $primaryKey) + { + $this->_setupMetadata(); + $rowsAffected = 0; + foreach ($this->_getReferenceMapNormalized() as $map) { + if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_DELETE])) { + switch ($map[self::ON_DELETE]) { + case self::CASCADE: + $where = array(); + for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) { + $col = $this->_db->foldCase($map[self::COLUMNS][$i]); + $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]); + $type = $this->_metadata[$col]['DATA_TYPE']; + $where[] = $this->_db->quoteInto( + $this->_db->quoteIdentifier($col, true) . ' = ?', + $primaryKey[$refCol], $type); + } + $rowsAffected += $this->delete($where); + break; + default: + // no action + break; + } + } + } + return $rowsAffected; + } + + /** + * Fetches rows by primary key. The argument specifies one or more primary + * key value(s). To find multiple rows by primary key, the argument must + * be an array. + * + * This method accepts a variable number of arguments. If the table has a + * multi-column primary key, the number of arguments must be the same as + * the number of columns in the primary key. To find multiple rows in a + * table with a multi-column primary key, each argument must be an array + * with the same number of elements. + * + * The find() method always returns a Rowset object, even if only one row + * was found. + * + * @param mixed $key The value(s) of the primary keys. + * @return Zend_Db_Table_Rowset_Abstract Row(s) matching the criteria. + * @throws Zend_Db_Table_Exception + */ + public function find() + { + $this->_setupPrimaryKey(); + $args = func_get_args(); + $keyNames = array_values((array) $this->_primary); + + if (count($args) < count($keyNames)) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception("Too few columns for the primary key"); + } + + if (count($args) > count($keyNames)) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception("Too many columns for the primary key"); + } + + $whereList = array(); + $numberTerms = 0; + foreach ($args as $keyPosition => $keyValues) { + $keyValuesCount = count($keyValues); + // Coerce the values to an array. + // Don't simply typecast to array, because the values + // might be Zend_Db_Expr objects. + if (!is_array($keyValues)) { + $keyValues = array($keyValues); + } + if ($numberTerms == 0) { + $numberTerms = $keyValuesCount; + } else if ($keyValuesCount != $numberTerms) { + require_once 'Zend/Db/Table/Exception.php'; + throw new Zend_Db_Table_Exception("Missing value(s) for the primary key"); + } + $keyValues = array_values($keyValues); + for ($i = 0; $i < $keyValuesCount; ++$i) { + if (!isset($whereList[$i])) { + $whereList[$i] = array(); + } + $whereList[$i][$keyPosition] = $keyValues[$i]; + } + } + + $whereClause = null; + if (count($whereList)) { + $whereOrTerms = array(); + $tableName = $this->_db->quoteTableAs($this->_name, null, true); + foreach ($whereList as $keyValueSets) { + $whereAndTerms = array(); + foreach ($keyValueSets as $keyPosition => $keyValue) { + $type = $this->_metadata[$keyNames[$keyPosition]]['DATA_TYPE']; + $columnName = $this->_db->quoteIdentifier($keyNames[$keyPosition], true); + $whereAndTerms[] = $this->_db->quoteInto( + $tableName . '.' . $columnName . ' = ?', + $keyValue, $type); + } + $whereOrTerms[] = '(' . implode(' AND ', $whereAndTerms) . ')'; + } + $whereClause = '(' . implode(' OR ', $whereOrTerms) . ')'; + } + + // issue ZF-5775 (empty where clause should return empty rowset) + if ($whereClause == null) { + $rowsetClass = $this->getRowsetClass(); + if (!class_exists($rowsetClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($rowsetClass); + } + return new $rowsetClass(array('table' => $this, 'rowClass' => $this->getRowClass(), 'stored' => true)); + } + + return $this->fetchAll($whereClause); + } + + /** + * Fetches all rows. + * + * Honors the Zend_Db_Adapter fetch mode. + * + * @param string|array|Zend_Db_Table_Select $where OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object. + * @param string|array $order OPTIONAL An SQL ORDER clause. + * @param int $count OPTIONAL An SQL LIMIT count. + * @param int $offset OPTIONAL An SQL LIMIT offset. + * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode. + */ + public function fetchAll($where = null, $order = null, $count = null, $offset = null) + { + if (!($where instanceof Zend_Db_Table_Select)) { + $select = $this->select(); + + if ($where !== null) { + $this->_where($select, $where); + } + + if ($order !== null) { + $this->_order($select, $order); + } + + if ($count !== null || $offset !== null) { + $select->limit($count, $offset); + } + + } else { + $select = $where; + } + + $rows = $this->_fetch($select); + + $data = array( + 'table' => $this, + 'data' => $rows, + 'readOnly' => $select->isReadOnly(), + 'rowClass' => $this->getRowClass(), + 'stored' => true + ); + + $rowsetClass = $this->getRowsetClass(); + if (!class_exists($rowsetClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($rowsetClass); + } + return new $rowsetClass($data); + } + + /** + * Fetches one row in an object of type Zend_Db_Table_Row_Abstract, + * or returns null if no row matches the specified criteria. + * + * @param string|array|Zend_Db_Table_Select $where OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object. + * @param string|array $order OPTIONAL An SQL ORDER clause. + * @return Zend_Db_Table_Row_Abstract|null The row results per the + * Zend_Db_Adapter fetch mode, or null if no row found. + */ + public function fetchRow($where = null, $order = null) + { + if (!($where instanceof Zend_Db_Table_Select)) { + $select = $this->select(); + + if ($where !== null) { + $this->_where($select, $where); + } + + if ($order !== null) { + $this->_order($select, $order); + } + + $select->limit(1); + + } else { + $select = $where->limit(1); + } + + $rows = $this->_fetch($select); + + if (count($rows) == 0) { + return null; + } + + $data = array( + 'table' => $this, + 'data' => $rows[0], + 'readOnly' => $select->isReadOnly(), + 'stored' => true + ); + + $rowClass = $this->getRowClass(); + if (!class_exists($rowClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($rowClass); + } + return new $rowClass($data); + } + + /** + * Fetches a new blank row (not from the database). + * + * @return Zend_Db_Table_Row_Abstract + * @deprecated since 0.9.3 - use createRow() instead. + */ + public function fetchNew() + { + return $this->createRow(); + } + + /** + * Fetches a new blank row (not from the database). + * + * @param array $data OPTIONAL data to populate in the new row. + * @param string $defaultSource OPTIONAL flag to force default values into new row + * @return Zend_Db_Table_Row_Abstract + */ + public function createRow(array $data = array(), $defaultSource = null) + { + $cols = $this->_getCols(); + $defaults = array_combine($cols, array_fill(0, count($cols), null)); + + // nothing provided at call-time, take the class value + if ($defaultSource == null) { + $defaultSource = $this->_defaultSource; + } + + if (!in_array($defaultSource, array(self::DEFAULT_CLASS, self::DEFAULT_DB, self::DEFAULT_NONE))) { + $defaultSource = self::DEFAULT_NONE; + } + + if ($defaultSource == self::DEFAULT_DB) { + foreach ($this->_metadata as $metadataName => $metadata) { + if (($metadata['DEFAULT'] != null) && + ($metadata['NULLABLE'] !== true || ($metadata['NULLABLE'] === true && isset($this->_defaultValues[$metadataName]) && $this->_defaultValues[$metadataName] === true)) && + (!(isset($this->_defaultValues[$metadataName]) && $this->_defaultValues[$metadataName] === false))) { + $defaults[$metadataName] = $metadata['DEFAULT']; + } + } + } elseif ($defaultSource == self::DEFAULT_CLASS && $this->_defaultValues) { + foreach ($this->_defaultValues as $defaultName => $defaultValue) { + if (array_key_exists($defaultName, $defaults)) { + $defaults[$defaultName] = $defaultValue; + } + } + } + + $config = array( + 'table' => $this, + 'data' => $defaults, + 'readOnly' => false, + 'stored' => false + ); + + $rowClass = $this->getRowClass(); + if (!class_exists($rowClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($rowClass); + } + $row = new $rowClass($config); + $row->setFromArray($data); + return $row; + } + + /** + * Generate WHERE clause from user-supplied string or array + * + * @param string|array $where OPTIONAL An SQL WHERE clause. + * @return Zend_Db_Table_Select + */ + protected function _where(Zend_Db_Table_Select $select, $where) + { + $where = (array) $where; + + foreach ($where as $key => $val) { + // is $key an int? + if (is_int($key)) { + // $val is the full condition + $select->where($val); + } else { + // $key is the condition with placeholder, + // and $val is quoted into the condition + $select->where($key, $val); + } + } + + return $select; + } + + /** + * Generate ORDER clause from user-supplied string or array + * + * @param string|array $order OPTIONAL An SQL ORDER clause. + * @return Zend_Db_Table_Select + */ + protected function _order(Zend_Db_Table_Select $select, $order) + { + if (!is_array($order)) { + $order = array($order); + } + + foreach ($order as $val) { + $select->order($val); + } + + return $select; + } + + /** + * Support method for fetching rows. + * + * @param Zend_Db_Table_Select $select query options. + * @return array An array containing the row results in FETCH_ASSOC mode. + */ + protected function _fetch(Zend_Db_Table_Select $select) + { + $stmt = $this->_db->query($select); + $data = $stmt->fetchAll(Zend_Db::FETCH_ASSOC); + return $data; + } + +} diff --git a/lib/zend/Zend/Db/Table/Definition.php b/lib/zend/Zend/Db/Table/Definition.php new file mode 100644 index 0000000000..771c624302 --- /dev/null +++ b/lib/zend/Zend/Db/Table/Definition.php @@ -0,0 +1,131 @@ +setConfig($options); + } elseif (is_array($options)) { + $this->setOptions($options); + } + } + + /** + * setConfig() + * + * @param Zend_Config $config + * @return Zend_Db_Table_Definition + */ + public function setConfig(Zend_Config $config) + { + $this->setOptions($config->toArray()); + return $this; + } + + /** + * setOptions() + * + * @param array $options + * @return Zend_Db_Table_Definition + */ + public function setOptions(Array $options) + { + foreach ($options as $optionName => $optionValue) { + $this->setTableConfig($optionName, $optionValue); + } + return $this; + } + + /** + * @param string $tableName + * @param array $tableConfig + * @return Zend_Db_Table_Definition + */ + public function setTableConfig($tableName, array $tableConfig) + { + // @todo logic here + $tableConfig[Zend_Db_Table::DEFINITION_CONFIG_NAME] = $tableName; + $tableConfig[Zend_Db_Table::DEFINITION] = $this; + + if (!isset($tableConfig[Zend_Db_Table::NAME])) { + $tableConfig[Zend_Db_Table::NAME] = $tableName; + } + + $this->_tableConfigs[$tableName] = $tableConfig; + return $this; + } + + /** + * getTableConfig() + * + * @param string $tableName + * @return array + */ + public function getTableConfig($tableName) + { + return $this->_tableConfigs[$tableName]; + } + + /** + * removeTableConfig() + * + * @param string $tableName + */ + public function removeTableConfig($tableName) + { + unset($this->_tableConfigs[$tableName]); + } + + /** + * hasTableConfig() + * + * @param string $tableName + * @return bool + */ + public function hasTableConfig($tableName) + { + return (isset($this->_tableConfigs[$tableName])); + } + +} diff --git a/lib/zend/Zend/Db/Table/Exception.php b/lib/zend/Zend/Db/Table/Exception.php new file mode 100644 index 0000000000..ceaaf16276 --- /dev/null +++ b/lib/zend/Zend/Db/Table/Exception.php @@ -0,0 +1,38 @@ + value). + * The keys must match the physical names of columns in the + * table for which this row is defined. + * + * @var array + */ + protected $_data = array(); + + /** + * This is set to a copy of $_data when the data is fetched from + * a database, specified as a new tuple in the constructor, or + * when dirty data is posted to the database with save(). + * + * @var array + */ + protected $_cleanData = array(); + + /** + * Tracks columns where data has been updated. Allows more specific insert and + * update operations. + * + * @var array + */ + protected $_modifiedFields = array(); + + /** + * Zend_Db_Table_Abstract parent class or instance. + * + * @var Zend_Db_Table_Abstract + */ + protected $_table = null; + + /** + * Connected is true if we have a reference to a live + * Zend_Db_Table_Abstract object. + * This is false after the Rowset has been deserialized. + * + * @var boolean + */ + protected $_connected = true; + + /** + * A row is marked read only if it contains columns that are not physically represented within + * the database schema (e.g. evaluated columns/Zend_Db_Expr columns). This can also be passed + * as a run-time config options as a means of protecting row data. + * + * @var boolean + */ + protected $_readOnly = false; + + /** + * Name of the class of the Zend_Db_Table_Abstract object. + * + * @var string + */ + protected $_tableClass = null; + + /** + * Primary row key(s). + * + * @var array + */ + protected $_primary; + + /** + * Constructor. + * + * Supported params for $config are:- + * - table = class name or object of type Zend_Db_Table_Abstract + * - data = values of columns in this row. + * + * @param array $config OPTIONAL Array of user-specified config options. + * @return void + * @throws Zend_Db_Table_Row_Exception + */ + public function __construct(array $config = array()) + { + if (isset($config['table']) && $config['table'] instanceof Zend_Db_Table_Abstract) { + $this->_table = $config['table']; + $this->_tableClass = get_class($this->_table); + } elseif ($this->_tableClass !== null) { + $this->_table = $this->_getTableFromString($this->_tableClass); + } + + if (isset($config['data'])) { + if (!is_array($config['data'])) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('Data must be an array'); + } + $this->_data = $config['data']; + } + if (isset($config['stored']) && $config['stored'] === true) { + $this->_cleanData = $this->_data; + } + + if (isset($config['readOnly']) && $config['readOnly'] === true) { + $this->setReadOnly(true); + } + + // Retrieve primary keys from table schema + if (($table = $this->_getTable())) { + $info = $table->info(); + $this->_primary = (array) $info['primary']; + } + + $this->init(); + } + + /** + * Transform a column name from the user-specified form + * to the physical form used in the database. + * You can override this method in a custom Row class + * to implement column name mappings, for example inflection. + * + * @param string $columnName Column name given. + * @return string The column name after transformation applied (none by default). + * @throws Zend_Db_Table_Row_Exception if the $columnName is not a string. + */ + protected function _transformColumn($columnName) + { + if (!is_string($columnName)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('Specified column is not a string'); + } + // Perform no transformation by default + return $columnName; + } + + /** + * Retrieve row field value + * + * @param string $columnName The user-specified column name. + * @return string The corresponding column value. + * @throws Zend_Db_Table_Row_Exception if the $columnName is not a column in the row. + */ + public function __get($columnName) + { + $columnName = $this->_transformColumn($columnName); + if (!array_key_exists($columnName, $this->_data)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Specified column \"$columnName\" is not in the row"); + } + return $this->_data[$columnName]; + } + + /** + * Set row field value + * + * @param string $columnName The column key. + * @param mixed $value The value for the property. + * @return void + * @throws Zend_Db_Table_Row_Exception + */ + public function __set($columnName, $value) + { + $columnName = $this->_transformColumn($columnName); + if (!array_key_exists($columnName, $this->_data)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Specified column \"$columnName\" is not in the row"); + } + $this->_data[$columnName] = $value; + $this->_modifiedFields[$columnName] = true; + } + + /** + * Unset row field value + * + * @param string $columnName The column key. + * @return Zend_Db_Table_Row_Abstract + * @throws Zend_Db_Table_Row_Exception + */ + public function __unset($columnName) + { + $columnName = $this->_transformColumn($columnName); + if (!array_key_exists($columnName, $this->_data)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Specified column \"$columnName\" is not in the row"); + } + if ($this->isConnected() && in_array($columnName, $this->_table->info('primary'))) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Specified column \"$columnName\" is a primary key and should not be unset"); + } + unset($this->_data[$columnName]); + return $this; + } + + /** + * Test existence of row field + * + * @param string $columnName The column key. + * @return boolean + */ + public function __isset($columnName) + { + $columnName = $this->_transformColumn($columnName); + return array_key_exists($columnName, $this->_data); + } + + /** + * Store table, primary key and data in serialized object + * + * @return array + */ + public function __sleep() + { + return array('_tableClass', '_primary', '_data', '_cleanData', '_readOnly' ,'_modifiedFields'); + } + + /** + * Setup to do on wakeup. + * A de-serialized Row should not be assumed to have access to a live + * database connection, so set _connected = false. + * + * @return void + */ + public function __wakeup() + { + $this->_connected = false; + } + + /** + * Proxy to __isset + * Required by the ArrayAccess implementation + * + * @param string $offset + * @return boolean + */ + public function offsetExists($offset) + { + return $this->__isset($offset); + } + + /** + * Proxy to __get + * Required by the ArrayAccess implementation + * + * @param string $offset + * @return string + */ + public function offsetGet($offset) + { + return $this->__get($offset); + } + + /** + * Proxy to __set + * Required by the ArrayAccess implementation + * + * @param string $offset + * @param mixed $value + */ + public function offsetSet($offset, $value) + { + $this->__set($offset, $value); + } + + /** + * Does nothing + * Required by the ArrayAccess implementation + * + * @param string $offset + */ + public function offsetUnset($offset) + { + } + + /** + * Initialize object + * + * Called from {@link __construct()} as final step of object instantiation. + * + * @return void + */ + public function init() + { + } + + /** + * Returns the table object, or null if this is disconnected row + * + * @return Zend_Db_Table_Abstract|null + */ + public function getTable() + { + return $this->_table; + } + + /** + * Set the table object, to re-establish a live connection + * to the database for a Row that has been de-serialized. + * + * @param Zend_Db_Table_Abstract $table + * @return boolean + * @throws Zend_Db_Table_Row_Exception + */ + public function setTable(Zend_Db_Table_Abstract $table = null) + { + if ($table == null) { + $this->_table = null; + $this->_connected = false; + return false; + } + + $tableClass = get_class($table); + if (! $table instanceof $this->_tableClass) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("The specified Table is of class $tableClass, expecting class to be instance of $this->_tableClass"); + } + + $this->_table = $table; + $this->_tableClass = $tableClass; + + $info = $this->_table->info(); + + if ($info['cols'] != array_keys($this->_data)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('The specified Table does not have the same columns as the Row'); + } + + if (! array_intersect((array) $this->_primary, $info['primary']) == (array) $this->_primary) { + + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("The specified Table '$tableClass' does not have the same primary key as the Row"); + } + + $this->_connected = true; + return true; + } + + /** + * Query the class name of the Table object for which this + * Row was created. + * + * @return string + */ + public function getTableClass() + { + return $this->_tableClass; + } + + /** + * Test the connected status of the row. + * + * @return boolean + */ + public function isConnected() + { + return $this->_connected; + } + + /** + * Test the read-only status of the row. + * + * @return boolean + */ + public function isReadOnly() + { + return $this->_readOnly; + } + + /** + * Set the read-only status of the row. + * + * @param boolean $flag + * @return boolean + */ + public function setReadOnly($flag) + { + $this->_readOnly = (bool) $flag; + } + + /** + * Returns an instance of the parent table's Zend_Db_Table_Select object. + * + * @return Zend_Db_Table_Select + */ + public function select() + { + return $this->getTable()->select(); + } + + /** + * Saves the properties to the database. + * + * This performs an intelligent insert/update, and reloads the + * properties with fresh data from the table on success. + * + * @return mixed The primary key value(s), as an associative array if the + * key is compound, or a scalar if the key is single-column. + */ + public function save() + { + /** + * If the _cleanData array is empty, + * this is an INSERT of a new row. + * Otherwise it is an UPDATE. + */ + if (empty($this->_cleanData)) { + return $this->_doInsert(); + } else { + return $this->_doUpdate(); + } + } + + /** + * @return mixed The primary key value(s), as an associative array if the + * key is compound, or a scalar if the key is single-column. + */ + protected function _doInsert() + { + /** + * A read-only row cannot be saved. + */ + if ($this->_readOnly === true) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('This row has been marked read-only'); + } + + /** + * Run pre-INSERT logic + */ + $this->_insert(); + + /** + * Execute the INSERT (this may throw an exception) + */ + $data = array_intersect_key($this->_data, $this->_modifiedFields); + $primaryKey = $this->_getTable()->insert($data); + + /** + * Normalize the result to an array indexed by primary key column(s). + * The table insert() method may return a scalar. + */ + if (is_array($primaryKey)) { + $newPrimaryKey = $primaryKey; + } else { + //ZF-6167 Use tempPrimaryKey temporary to avoid that zend encoding fails. + $tempPrimaryKey = (array) $this->_primary; + $newPrimaryKey = array(current($tempPrimaryKey) => $primaryKey); + } + + /** + * Save the new primary key value in _data. The primary key may have + * been generated by a sequence or auto-increment mechanism, and this + * merge should be done before the _postInsert() method is run, so the + * new values are available for logging, etc. + */ + $this->_data = array_merge($this->_data, $newPrimaryKey); + + /** + * Run post-INSERT logic + */ + $this->_postInsert(); + + /** + * Update the _cleanData to reflect that the data has been inserted. + */ + $this->_refresh(); + + return $primaryKey; + } + + /** + * @return mixed The primary key value(s), as an associative array if the + * key is compound, or a scalar if the key is single-column. + */ + protected function _doUpdate() + { + /** + * A read-only row cannot be saved. + */ + if ($this->_readOnly === true) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('This row has been marked read-only'); + } + + /** + * Get expressions for a WHERE clause + * based on the primary key value(s). + */ + $where = $this->_getWhereQuery(false); + + /** + * Run pre-UPDATE logic + */ + $this->_update(); + + /** + * Compare the data to the modified fields array to discover + * which columns have been changed. + */ + $diffData = array_intersect_key($this->_data, $this->_modifiedFields); + + /** + * Were any of the changed columns part of the primary key? + */ + $pkDiffData = array_intersect_key($diffData, array_flip((array)$this->_primary)); + + /** + * Execute cascading updates against dependent tables. + * Do this only if primary key value(s) were changed. + */ + if (count($pkDiffData) > 0) { + $depTables = $this->_getTable()->getDependentTables(); + if (!empty($depTables)) { + $pkNew = $this->_getPrimaryKey(true); + $pkOld = $this->_getPrimaryKey(false); + foreach ($depTables as $tableClass) { + $t = $this->_getTableFromString($tableClass); + $t->_cascadeUpdate($this->getTableClass(), $pkOld, $pkNew); + } + } + } + + /** + * Execute the UPDATE (this may throw an exception) + * Do this only if data values were changed. + * Use the $diffData variable, so the UPDATE statement + * includes SET terms only for data values that changed. + */ + if (count($diffData) > 0) { + $this->_getTable()->update($diffData, $where); + } + + /** + * Run post-UPDATE logic. Do this before the _refresh() + * so the _postUpdate() function can tell the difference + * between changed data and clean (pre-changed) data. + */ + $this->_postUpdate(); + + /** + * Refresh the data just in case triggers in the RDBMS changed + * any columns. Also this resets the _cleanData. + */ + $this->_refresh(); + + /** + * Return the primary key value(s) as an array + * if the key is compound or a scalar if the key + * is a scalar. + */ + $primaryKey = $this->_getPrimaryKey(true); + if (count($primaryKey) == 1) { + return current($primaryKey); + } + + return $primaryKey; + } + + /** + * Deletes existing rows. + * + * @return int The number of rows deleted. + */ + public function delete() + { + /** + * A read-only row cannot be deleted. + */ + if ($this->_readOnly === true) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('This row has been marked read-only'); + } + + $where = $this->_getWhereQuery(); + + /** + * Execute pre-DELETE logic + */ + $this->_delete(); + + /** + * Execute cascading deletes against dependent tables + */ + $depTables = $this->_getTable()->getDependentTables(); + if (!empty($depTables)) { + $pk = $this->_getPrimaryKey(); + foreach ($depTables as $tableClass) { + $t = $this->_getTableFromString($tableClass); + $t->_cascadeDelete($this->getTableClass(), $pk); + } + } + + /** + * Execute the DELETE (this may throw an exception) + */ + $result = $this->_getTable()->delete($where); + + /** + * Execute post-DELETE logic + */ + $this->_postDelete(); + + /** + * Reset all fields to null to indicate that the row is not there + */ + $this->_data = array_combine( + array_keys($this->_data), + array_fill(0, count($this->_data), null) + ); + + return $result; + } + + /** + * Returns the column/value data as an array. + * + * @return array + */ + public function toArray() + { + return (array)$this->_data; + } + + /** + * Sets all data in the row from an array. + * + * @param array $data + * @return Zend_Db_Table_Row_Abstract Provides a fluent interface + */ + public function setFromArray(array $data) + { + $data = array_intersect_key($data, $this->_data); + + foreach ($data as $columnName => $value) { + $this->__set($columnName, $value); + } + + return $this; + } + + /** + * Refreshes properties from the database. + * + * @return void + */ + public function refresh() + { + return $this->_refresh(); + } + + /** + * Retrieves an instance of the parent table. + * + * @return Zend_Db_Table_Abstract + */ + protected function _getTable() + { + if (!$this->_connected) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('Cannot save a Row unless it is connected'); + } + return $this->_table; + } + + /** + * Retrieves an associative array of primary keys. + * + * @param bool $useDirty + * @return array + */ + protected function _getPrimaryKey($useDirty = true) + { + if (!is_array($this->_primary)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("The primary key must be set as an array"); + } + + $primary = array_flip($this->_primary); + if ($useDirty) { + $array = array_intersect_key($this->_data, $primary); + } else { + $array = array_intersect_key($this->_cleanData, $primary); + } + if (count($primary) != count($array)) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("The specified Table '$this->_tableClass' does not have the same primary key as the Row"); + } + return $array; + } + + /** + * Constructs where statement for retrieving row(s). + * + * @param bool $useDirty + * @return array + */ + protected function _getWhereQuery($useDirty = true) + { + $where = array(); + $db = $this->_getTable()->getAdapter(); + $primaryKey = $this->_getPrimaryKey($useDirty); + $info = $this->_getTable()->info(); + $metadata = $info[Zend_Db_Table_Abstract::METADATA]; + + // retrieve recently updated row using primary keys + $where = array(); + foreach ($primaryKey as $column => $value) { + $tableName = $db->quoteIdentifier($info[Zend_Db_Table_Abstract::NAME], true); + $type = $metadata[$column]['DATA_TYPE']; + $columnName = $db->quoteIdentifier($column, true); + $where[] = $db->quoteInto("{$tableName}.{$columnName} = ?", $value, $type); + } + return $where; + } + + /** + * Refreshes properties from the database. + * + * @return void + */ + protected function _refresh() + { + $where = $this->_getWhereQuery(); + $row = $this->_getTable()->fetchRow($where); + + if (null === $row) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception('Cannot refresh row as parent is missing'); + } + + $this->_data = $row->toArray(); + $this->_cleanData = $this->_data; + $this->_modifiedFields = array(); + } + + /** + * Allows pre-insert logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _insert() + { + } + + /** + * Allows post-insert logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _postInsert() + { + } + + /** + * Allows pre-update logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _update() + { + } + + /** + * Allows post-update logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _postUpdate() + { + } + + /** + * Allows pre-delete logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _delete() + { + } + + /** + * Allows post-delete logic to be applied to row. + * Subclasses may override this method. + * + * @return void + */ + protected function _postDelete() + { + } + + /** + * Prepares a table reference for lookup. + * + * Ensures all reference keys are set and properly formatted. + * + * @param Zend_Db_Table_Abstract $dependentTable + * @param Zend_Db_Table_Abstract $parentTable + * @param string $ruleKey + * @return array + */ + protected function _prepareReference(Zend_Db_Table_Abstract $dependentTable, Zend_Db_Table_Abstract $parentTable, $ruleKey) + { + $parentTableName = (get_class($parentTable) === 'Zend_Db_Table') ? $parentTable->getDefinitionConfigName() : get_class($parentTable); + $map = $dependentTable->getReference($parentTableName, $ruleKey); + + if (!isset($map[Zend_Db_Table_Abstract::REF_COLUMNS])) { + $parentInfo = $parentTable->info(); + $map[Zend_Db_Table_Abstract::REF_COLUMNS] = array_values((array) $parentInfo['primary']); + } + + $map[Zend_Db_Table_Abstract::COLUMNS] = (array) $map[Zend_Db_Table_Abstract::COLUMNS]; + $map[Zend_Db_Table_Abstract::REF_COLUMNS] = (array) $map[Zend_Db_Table_Abstract::REF_COLUMNS]; + + return $map; + } + + /** + * Query a dependent table to retrieve rows matching the current row. + * + * @param string|Zend_Db_Table_Abstract $dependentTable + * @param string OPTIONAL $ruleKey + * @param Zend_Db_Table_Select OPTIONAL $select + * @return Zend_Db_Table_Rowset_Abstract Query result from $dependentTable + * @throws Zend_Db_Table_Row_Exception If $dependentTable is not a table or is not loadable. + */ + public function findDependentRowset($dependentTable, $ruleKey = null, Zend_Db_Table_Select $select = null) + { + $db = $this->_getTable()->getAdapter(); + + if (is_string($dependentTable)) { + $dependentTable = $this->_getTableFromString($dependentTable); + } + + if (!$dependentTable instanceof Zend_Db_Table_Abstract) { + $type = gettype($dependentTable); + if ($type == 'object') { + $type = get_class($dependentTable); + } + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Dependent table must be a Zend_Db_Table_Abstract, but it is $type"); + } + + // even if we are interacting between a table defined in a class and a + // table via extension, ensure to persist the definition + if (($tableDefinition = $this->_table->getDefinition()) !== null + && ($dependentTable->getDefinition() == null)) { + $dependentTable->setOptions(array(Zend_Db_Table_Abstract::DEFINITION => $tableDefinition)); + } + + if ($select === null) { + $select = $dependentTable->select(); + } else { + $select->setTable($dependentTable); + } + + $map = $this->_prepareReference($dependentTable, $this->_getTable(), $ruleKey); + + for ($i = 0; $i < count($map[Zend_Db_Table_Abstract::COLUMNS]); ++$i) { + $parentColumnName = $db->foldCase($map[Zend_Db_Table_Abstract::REF_COLUMNS][$i]); + $value = $this->_data[$parentColumnName]; + // Use adapter from dependent table to ensure correct query construction + $dependentDb = $dependentTable->getAdapter(); + $dependentColumnName = $dependentDb->foldCase($map[Zend_Db_Table_Abstract::COLUMNS][$i]); + $dependentColumn = $dependentDb->quoteIdentifier($dependentColumnName, true); + $dependentInfo = $dependentTable->info(); + $type = $dependentInfo[Zend_Db_Table_Abstract::METADATA][$dependentColumnName]['DATA_TYPE']; + $select->where("$dependentColumn = ?", $value, $type); + } + + return $dependentTable->fetchAll($select); + } + + /** + * Query a parent table to retrieve the single row matching the current row. + * + * @param string|Zend_Db_Table_Abstract $parentTable + * @param string OPTIONAL $ruleKey + * @param Zend_Db_Table_Select OPTIONAL $select + * @return Zend_Db_Table_Row_Abstract Query result from $parentTable + * @throws Zend_Db_Table_Row_Exception If $parentTable is not a table or is not loadable. + */ + public function findParentRow($parentTable, $ruleKey = null, Zend_Db_Table_Select $select = null) + { + $db = $this->_getTable()->getAdapter(); + + if (is_string($parentTable)) { + $parentTable = $this->_getTableFromString($parentTable); + } + + if (!$parentTable instanceof Zend_Db_Table_Abstract) { + $type = gettype($parentTable); + if ($type == 'object') { + $type = get_class($parentTable); + } + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Parent table must be a Zend_Db_Table_Abstract, but it is $type"); + } + + // even if we are interacting between a table defined in a class and a + // table via extension, ensure to persist the definition + if (($tableDefinition = $this->_table->getDefinition()) !== null + && ($parentTable->getDefinition() == null)) { + $parentTable->setOptions(array(Zend_Db_Table_Abstract::DEFINITION => $tableDefinition)); + } + + if ($select === null) { + $select = $parentTable->select(); + } else { + $select->setTable($parentTable); + } + + $map = $this->_prepareReference($this->_getTable(), $parentTable, $ruleKey); + + // iterate the map, creating the proper wheres + for ($i = 0; $i < count($map[Zend_Db_Table_Abstract::COLUMNS]); ++$i) { + $dependentColumnName = $db->foldCase($map[Zend_Db_Table_Abstract::COLUMNS][$i]); + $value = $this->_data[$dependentColumnName]; + // Use adapter from parent table to ensure correct query construction + $parentDb = $parentTable->getAdapter(); + $parentColumnName = $parentDb->foldCase($map[Zend_Db_Table_Abstract::REF_COLUMNS][$i]); + $parentColumn = $parentDb->quoteIdentifier($parentColumnName, true); + $parentInfo = $parentTable->info(); + + // determine where part + $type = $parentInfo[Zend_Db_Table_Abstract::METADATA][$parentColumnName]['DATA_TYPE']; + $nullable = $parentInfo[Zend_Db_Table_Abstract::METADATA][$parentColumnName]['NULLABLE']; + if ($value === null && $nullable == true) { + $select->where("$parentColumn IS NULL"); + } elseif ($value === null && $nullable == false) { + return null; + } else { + $select->where("$parentColumn = ?", $value, $type); + } + + } + + return $parentTable->fetchRow($select); + } + + /** + * @param string|Zend_Db_Table_Abstract $matchTable + * @param string|Zend_Db_Table_Abstract $intersectionTable + * @param string OPTIONAL $callerRefRule + * @param string OPTIONAL $matchRefRule + * @param Zend_Db_Table_Select OPTIONAL $select + * @return Zend_Db_Table_Rowset_Abstract Query result from $matchTable + * @throws Zend_Db_Table_Row_Exception If $matchTable or $intersectionTable is not a table class or is not loadable. + */ + public function findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule = null, + $matchRefRule = null, Zend_Db_Table_Select $select = null) + { + $db = $this->_getTable()->getAdapter(); + + if (is_string($intersectionTable)) { + $intersectionTable = $this->_getTableFromString($intersectionTable); + } + + if (!$intersectionTable instanceof Zend_Db_Table_Abstract) { + $type = gettype($intersectionTable); + if ($type == 'object') { + $type = get_class($intersectionTable); + } + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Intersection table must be a Zend_Db_Table_Abstract, but it is $type"); + } + + // even if we are interacting between a table defined in a class and a + // table via extension, ensure to persist the definition + if (($tableDefinition = $this->_table->getDefinition()) !== null + && ($intersectionTable->getDefinition() == null)) { + $intersectionTable->setOptions(array(Zend_Db_Table_Abstract::DEFINITION => $tableDefinition)); + } + + if (is_string($matchTable)) { + $matchTable = $this->_getTableFromString($matchTable); + } + + if (! $matchTable instanceof Zend_Db_Table_Abstract) { + $type = gettype($matchTable); + if ($type == 'object') { + $type = get_class($matchTable); + } + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Match table must be a Zend_Db_Table_Abstract, but it is $type"); + } + + // even if we are interacting between a table defined in a class and a + // table via extension, ensure to persist the definition + if (($tableDefinition = $this->_table->getDefinition()) !== null + && ($matchTable->getDefinition() == null)) { + $matchTable->setOptions(array(Zend_Db_Table_Abstract::DEFINITION => $tableDefinition)); + } + + if ($select === null) { + $select = $matchTable->select(); + } else { + $select->setTable($matchTable); + } + + // Use adapter from intersection table to ensure correct query construction + $interInfo = $intersectionTable->info(); + $interDb = $intersectionTable->getAdapter(); + $interName = $interInfo['name']; + $interSchema = isset($interInfo['schema']) ? $interInfo['schema'] : null; + $matchInfo = $matchTable->info(); + $matchName = $matchInfo['name']; + $matchSchema = isset($matchInfo['schema']) ? $matchInfo['schema'] : null; + + $matchMap = $this->_prepareReference($intersectionTable, $matchTable, $matchRefRule); + + for ($i = 0; $i < count($matchMap[Zend_Db_Table_Abstract::COLUMNS]); ++$i) { + $interCol = $interDb->quoteIdentifier('i' . '.' . $matchMap[Zend_Db_Table_Abstract::COLUMNS][$i], true); + $matchCol = $interDb->quoteIdentifier('m' . '.' . $matchMap[Zend_Db_Table_Abstract::REF_COLUMNS][$i], true); + $joinCond[] = "$interCol = $matchCol"; + } + $joinCond = implode(' AND ', $joinCond); + + $select->from(array('i' => $interName), Zend_Db_Select::SQL_WILDCARD, $interSchema) + ->joinInner(array('m' => $matchName), $joinCond, Zend_Db_Select::SQL_WILDCARD, $matchSchema) + ->setIntegrityCheck(false); + + $callerMap = $this->_prepareReference($intersectionTable, $this->_getTable(), $callerRefRule); + + for ($i = 0; $i < count($callerMap[Zend_Db_Table_Abstract::COLUMNS]); ++$i) { + $callerColumnName = $db->foldCase($callerMap[Zend_Db_Table_Abstract::REF_COLUMNS][$i]); + $value = $this->_data[$callerColumnName]; + $interColumnName = $interDb->foldCase($callerMap[Zend_Db_Table_Abstract::COLUMNS][$i]); + $interCol = $interDb->quoteIdentifier("i.$interColumnName", true); + $interInfo = $intersectionTable->info(); + $type = $interInfo[Zend_Db_Table_Abstract::METADATA][$interColumnName]['DATA_TYPE']; + $select->where($interDb->quoteInto("$interCol = ?", $value, $type)); + } + + $stmt = $select->query(); + + $config = array( + 'table' => $matchTable, + 'data' => $stmt->fetchAll(Zend_Db::FETCH_ASSOC), + 'rowClass' => $matchTable->getRowClass(), + 'readOnly' => false, + 'stored' => true + ); + + $rowsetClass = $matchTable->getRowsetClass(); + if (!class_exists($rowsetClass)) { + try { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($rowsetClass); + } catch (Zend_Exception $e) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception($e->getMessage()); + } + } + $rowset = new $rowsetClass($config); + return $rowset; + } + + /** + * Turn magic function calls into non-magic function calls + * to the above methods. + * + * @param string $method + * @param array $args OPTIONAL Zend_Db_Table_Select query modifier + * @return Zend_Db_Table_Row_Abstract|Zend_Db_Table_Rowset_Abstract + * @throws Zend_Db_Table_Row_Exception If an invalid method is called. + */ + public function __call($method, array $args) + { + $matches = array(); + + if (count($args) && $args[0] instanceof Zend_Db_Table_Select) { + $select = $args[0]; + } else { + $select = null; + } + + /** + * Recognize methods for Has-Many cases: + * findParent() + * findParentBy() + * Use the non-greedy pattern repeat modifier e.g. \w+? + */ + if (preg_match('/^findParent(\w+?)(?:By(\w+))?$/', $method, $matches)) { + $class = $matches[1]; + $ruleKey1 = isset($matches[2]) ? $matches[2] : null; + return $this->findParentRow($class, $ruleKey1, $select); + } + + /** + * Recognize methods for Many-to-Many cases: + * findVia() + * findViaBy() + * findViaByAnd() + * Use the non-greedy pattern repeat modifier e.g. \w+? + */ + if (preg_match('/^find(\w+?)Via(\w+?)(?:By(\w+?)(?:And(\w+))?)?$/', $method, $matches)) { + $class = $matches[1]; + $viaClass = $matches[2]; + $ruleKey1 = isset($matches[3]) ? $matches[3] : null; + $ruleKey2 = isset($matches[4]) ? $matches[4] : null; + return $this->findManyToManyRowset($class, $viaClass, $ruleKey1, $ruleKey2, $select); + } + + /** + * Recognize methods for Belongs-To cases: + * find() + * findBy() + * Use the non-greedy pattern repeat modifier e.g. \w+? + */ + if (preg_match('/^find(\w+?)(?:By(\w+))?$/', $method, $matches)) { + $class = $matches[1]; + $ruleKey1 = isset($matches[2]) ? $matches[2] : null; + return $this->findDependentRowset($class, $ruleKey1, $select); + } + + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception("Unrecognized method '$method()'"); + } + + + /** + * _getTableFromString + * + * @param string $tableName + * @return Zend_Db_Table_Abstract + */ + protected function _getTableFromString($tableName) + { + + if ($this->_table instanceof Zend_Db_Table_Abstract) { + $tableDefinition = $this->_table->getDefinition(); + + if ($tableDefinition !== null && $tableDefinition->hasTableConfig($tableName)) { + return new Zend_Db_Table($tableName, $tableDefinition); + } + } + + // assume the tableName is the class name + if (!class_exists($tableName)) { + try { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($tableName); + } catch (Zend_Exception $e) { + require_once 'Zend/Db/Table/Row/Exception.php'; + throw new Zend_Db_Table_Row_Exception($e->getMessage()); + } + } + + $options = array(); + + if (($table = $this->_getTable())) { + $options['db'] = $table->getAdapter(); + } + + if (isset($tableDefinition) && $tableDefinition !== null) { + $options[Zend_Db_Table_Abstract::DEFINITION] = $tableDefinition; + } + + return new $tableName($options); + } + +} diff --git a/lib/zend/Zend/Db/Table/Row/Exception.php b/lib/zend/Zend/Db/Table/Row/Exception.php new file mode 100644 index 0000000000..98195f74d9 --- /dev/null +++ b/lib/zend/Zend/Db/Table/Row/Exception.php @@ -0,0 +1,38 @@ +_table = $config['table']; + $this->_tableClass = get_class($this->_table); + } + if (isset($config['rowClass'])) { + $this->_rowClass = $config['rowClass']; + } + if (!class_exists($this->_rowClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($this->_rowClass); + } + if (isset($config['data'])) { + $this->_data = $config['data']; + } + if (isset($config['readOnly'])) { + $this->_readOnly = $config['readOnly']; + } + if (isset($config['stored'])) { + $this->_stored = $config['stored']; + } + + // set the count of rows + $this->_count = count($this->_data); + + $this->init(); + } + + /** + * Store data, class names, and state in serialized object + * + * @return array + */ + public function __sleep() + { + return array('_data', '_tableClass', '_rowClass', '_pointer', '_count', '_rows', '_stored', + '_readOnly'); + } + + /** + * Setup to do on wakeup. + * A de-serialized Rowset should not be assumed to have access to a live + * database connection, so set _connected = false. + * + * @return void + */ + public function __wakeup() + { + $this->_connected = false; + } + + /** + * Initialize object + * + * Called from {@link __construct()} as final step of object instantiation. + * + * @return void + */ + public function init() + { + } + + /** + * Return the connected state of the rowset. + * + * @return boolean + */ + public function isConnected() + { + return $this->_connected; + } + + /** + * Returns the table object, or null if this is disconnected rowset + * + * @return Zend_Db_Table_Abstract + */ + public function getTable() + { + return $this->_table; + } + + /** + * Set the table object, to re-establish a live connection + * to the database for a Rowset that has been de-serialized. + * + * @param Zend_Db_Table_Abstract $table + * @return boolean + * @throws Zend_Db_Table_Row_Exception + */ + public function setTable(Zend_Db_Table_Abstract $table) + { + $this->_table = $table; + $this->_connected = false; + // @todo This works only if we have iterated through + // the result set once to instantiate the rows. + foreach ($this as $row) { + $connected = $row->setTable($table); + if ($connected == true) { + $this->_connected = true; + } + } + return $this->_connected; + } + + /** + * Query the class name of the Table object for which this + * Rowset was created. + * + * @return string + */ + public function getTableClass() + { + return $this->_tableClass; + } + + /** + * Rewind the Iterator to the first element. + * Similar to the reset() function for arrays in PHP. + * Required by interface Iterator. + * + * @return Zend_Db_Table_Rowset_Abstract Fluent interface. + */ + public function rewind() + { + $this->_pointer = 0; + return $this; + } + + /** + * Return the current element. + * Similar to the current() function for arrays in PHP + * Required by interface Iterator. + * + * @return Zend_Db_Table_Row_Abstract current element from the collection + */ + public function current() + { + if ($this->valid() === false) { + return null; + } + + // do we already have a row object for this position? + if (empty($this->_rows[$this->_pointer])) { + $this->_rows[$this->_pointer] = new $this->_rowClass( + array( + 'table' => $this->_table, + 'data' => $this->_data[$this->_pointer], + 'stored' => $this->_stored, + 'readOnly' => $this->_readOnly + ) + ); + } + + // return the row object + return $this->_rows[$this->_pointer]; + } + + /** + * Return the identifying key of the current element. + * Similar to the key() function for arrays in PHP. + * Required by interface Iterator. + * + * @return int + */ + public function key() + { + return $this->_pointer; + } + + /** + * Move forward to next element. + * Similar to the next() function for arrays in PHP. + * Required by interface Iterator. + * + * @return void + */ + public function next() + { + ++$this->_pointer; + } + + /** + * Check if there is a current element after calls to rewind() or next(). + * Used to check if we've iterated to the end of the collection. + * Required by interface Iterator. + * + * @return bool False if there's nothing more to iterate over + */ + public function valid() + { + return $this->_pointer < $this->_count; + } + + /** + * Returns the number of elements in the collection. + * + * Implements Countable::count() + * + * @return int + */ + public function count() + { + return $this->_count; + } + + /** + * Take the Iterator to position $position + * Required by interface SeekableIterator. + * + * @param int $position the position to seek to + * @return Zend_Db_Table_Rowset_Abstract + * @throws Zend_Db_Table_Rowset_Exception + */ + public function seek($position) + { + $position = (int) $position; + if ($position < 0 || $position >= $this->_count) { + require_once 'Zend/Db/Table/Rowset/Exception.php'; + throw new Zend_Db_Table_Rowset_Exception("Illegal index $position"); + } + $this->_pointer = $position; + return $this; + } + + /** + * Check if an offset exists + * Required by the ArrayAccess implementation + * + * @param string $offset + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->_data[(int) $offset]); + } + + /** + * Get the row for the given offset + * Required by the ArrayAccess implementation + * + * @param string $offset + * @return Zend_Db_Table_Row_Abstract + */ + public function offsetGet($offset) + { + $this->_pointer = (int) $offset; + + return $this->current(); + } + + /** + * Does nothing + * Required by the ArrayAccess implementation + * + * @param string $offset + * @param mixed $value + */ + public function offsetSet($offset, $value) + { + } + + /** + * Does nothing + * Required by the ArrayAccess implementation + * + * @param string $offset + */ + public function offsetUnset($offset) + { + } + + /** + * Returns a Zend_Db_Table_Row from a known position into the Iterator + * + * @param int $position the position of the row expected + * @param bool $seek wether or not seek the iterator to that position after + * @return Zend_Db_Table_Row + * @throws Zend_Db_Table_Rowset_Exception + */ + public function getRow($position, $seek = false) + { + $key = $this->key(); + try { + $this->seek($position); + $row = $this->current(); + } catch (Zend_Db_Table_Rowset_Exception $e) { + require_once 'Zend/Db/Table/Rowset/Exception.php'; + throw new Zend_Db_Table_Rowset_Exception('No row could be found at position ' . (int) $position); + } + if ($seek == false) { + $this->seek($key); + } + return $row; + } + + /** + * Returns all data as an array. + * + * Updates the $_data property with current row object values. + * + * @return array + */ + public function toArray() + { + // @todo This works only if we have iterated through + // the result set once to instantiate the rows. + foreach ($this->_rows as $i => $row) { + $this->_data[$i] = $row->toArray(); + } + return $this->_data; + } + +} diff --git a/lib/zend/Zend/Db/Table/Rowset/Exception.php b/lib/zend/Zend/Db/Table/Rowset/Exception.php new file mode 100644 index 0000000000..9ef71c6181 --- /dev/null +++ b/lib/zend/Zend/Db/Table/Rowset/Exception.php @@ -0,0 +1,37 @@ +getAdapter()); + + $this->setTable($table); + } + + /** + * Return the table that created this select object + * + * @return Zend_Db_Table_Abstract + */ + public function getTable() + { + return $this->_table; + } + + /** + * Sets the primary table name and retrieves the table schema. + * + * @param Zend_Db_Table_Abstract $adapter + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function setTable(Zend_Db_Table_Abstract $table) + { + $this->_adapter = $table->getAdapter(); + $this->_info = $table->info(); + $this->_table = $table; + + return $this; + } + + /** + * Sets the integrity check flag. + * + * Setting this flag to false skips the checks for table joins, allowing + * 'hybrid' table rows to be created. + * + * @param Zend_Db_Table_Abstract $adapter + * @return Zend_Db_Select This Zend_Db_Select object. + */ + public function setIntegrityCheck($flag = true) + { + $this->_integrityCheck = $flag; + return $this; + } + + /** + * Tests query to determine if expressions or aliases columns exist. + * + * @return boolean + */ + public function isReadOnly() + { + $readOnly = false; + $fields = $this->getPart(Zend_Db_Table_Select::COLUMNS); + $cols = $this->_info[Zend_Db_Table_Abstract::COLS]; + + if (!count($fields)) { + return $readOnly; + } + + foreach ($fields as $columnEntry) { + $column = $columnEntry[1]; + $alias = $columnEntry[2]; + + if ($alias !== null) { + $column = $alias; + } + + switch (true) { + case ($column == self::SQL_WILDCARD): + break; + + case ($column instanceof Zend_Db_Expr): + case (!in_array($column, $cols)): + $readOnly = true; + break 2; + } + } + + return $readOnly; + } + + /** + * Adds a FROM table and optional columns to the query. + * + * The table name can be expressed + * + * @param array|string|Zend_Db_Expr|Zend_Db_Table_Abstract $name The table name or an + associative array relating + table name to correlation + name. + * @param array|string|Zend_Db_Expr $cols The columns to select from this table. + * @param string $schema The schema name to specify, if any. + * @return Zend_Db_Table_Select This Zend_Db_Table_Select object. + */ + public function from($name, $cols = self::SQL_WILDCARD, $schema = null) + { + if ($name instanceof Zend_Db_Table_Abstract) { + $info = $name->info(); + $name = $info[Zend_Db_Table_Abstract::NAME]; + if (isset($info[Zend_Db_Table_Abstract::SCHEMA])) { + $schema = $info[Zend_Db_Table_Abstract::SCHEMA]; + } + } + + return $this->joinInner($name, null, $cols, $schema); + } + + /** + * Performs a validation on the select query before passing back to the parent class. + * Ensures that only columns from the primary Zend_Db_Table are returned in the result. + * + * @return string|null This object as a SELECT string (or null if a string cannot be produced) + */ + public function assemble() + { + $fields = $this->getPart(Zend_Db_Table_Select::COLUMNS); + $primary = $this->_info[Zend_Db_Table_Abstract::NAME]; + $schema = $this->_info[Zend_Db_Table_Abstract::SCHEMA]; + + + if (count($this->_parts[self::UNION]) == 0) { + + // If no fields are specified we assume all fields from primary table + if (!count($fields)) { + $this->from($primary, self::SQL_WILDCARD, $schema); + $fields = $this->getPart(Zend_Db_Table_Select::COLUMNS); + } + + $from = $this->getPart(Zend_Db_Table_Select::FROM); + + if ($this->_integrityCheck !== false) { + foreach ($fields as $columnEntry) { + list($table, $column) = $columnEntry; + + // Check each column to ensure it only references the primary table + if ($column) { + if (!isset($from[$table]) || $from[$table]['tableName'] != $primary) { + require_once 'Zend/Db/Table/Select/Exception.php'; + throw new Zend_Db_Table_Select_Exception('Select query cannot join with another table'); + } + } + } + } + } + + return parent::assemble(); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Db/Table/Select/Exception.php b/lib/zend/Zend/Db/Table/Select/Exception.php new file mode 100644 index 0000000000..05e6e5cd94 --- /dev/null +++ b/lib/zend/Zend/Db/Table/Select/Exception.php @@ -0,0 +1,39 @@ + 'release', + 'optimize' => 'shrinksafe', + 'layerOptimize' => 'shrinksafe', + 'copyTests' => false, + 'loader' => 'default', + 'cssOptimize' => 'comments', + ); + + /** + * Associative array of module/path pairs for the build profile + * @var array + */ + protected $_profilePrefixes = array(); + + /** + * Zend_View reference + * @var Zend_View_Interface + */ + protected $_view; + + /** + * Constructor + * + * @param array|Zend_Config $options + * @return void + * @throws Zend_Dojo_Exception for invalid option argument + */ + public function __construct($options = null) + { + if (null !== $options) { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (!is_array($options)) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Invalid options provided to constructor'); + } + $this->setOptions($options); + } + } + + /** + * Set options + * + * Proxies to any setter that matches an option key. + * + * @param array $options + * @return Zend_Dojo_BuildLayer + */ + public function setOptions(array $options) + { + $methods = get_class_methods($this); + foreach ($options as $key => $value) { + $method = 'set' . ucfirst($key); + if (in_array($method, $methods)) { + $this->$method($value); + } + } + return $this; + } + + /** + * Set View object + * + * @param Zend_View_Interface $view + * @return Zend_Dojo_BuildLayer + */ + public function setView(Zend_View_Interface $view) + { + $this->_view = $view; + return $this; + } + + /** + * Retrieve view object + * + * @return Zend_View_Interface|null + */ + public function getView() + { + return $this->_view; + } + + /** + * Set dojo() view helper instance + * + * @param Zend_Dojo_View_Helper_Dojo_Container $helper + * @return Zend_Dojo_BuildLayer + */ + public function setDojoHelper(Zend_Dojo_View_Helper_Dojo_Container $helper) + { + $this->_dojo = $helper; + return $this; + } + + /** + * Retrieve dojo() view helper instance + * + * Will retrieve it from the view object if not registered. + * + * @return Zend_Dojo_View_Helper_Dojo_Container + * @throws Zend_Dojo_Exception if not registered and no view object found + */ + public function getDojoHelper() + { + if (null === $this->_dojo) { + if (null === ($view = $this->getView())) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('View object not registered; cannot retrieve dojo helper'); + } + $helper = $view->getHelper('dojo'); + $this->setDojoHelper($view->dojo()); + } + return $this->_dojo; + } + + /** + * Set custom layer name; e.g. "custom.main" + * + * @param string $name + * @return Zend_Dojo_BuildLayer + */ + public function setLayerName($name) + { + if (!preg_match('/^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$/i', $name)) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Invalid layer name provided; must be of form[a-z][a-z0-9_](\.[a-z][a-z0-9_])+'); + } + $this->_layerName = $name; + return $this; + } + + /** + * Retrieve custom layer name + * + * @return string|null + */ + public function getLayerName() + { + return $this->_layerName; + } + + /** + * Set the path to the custom layer script + * + * Should be a path relative to dojo.js + * + * @param string $path + * @return Zend_Dojo_BuildLayer + */ + public function setLayerScriptPath($path) + { + $this->_layerScriptPath = (string) $path; + return $this; + } + + /** + * Get custom layer script path + * + * @return string|null + */ + public function getLayerScriptPath() + { + return $this->_layerScriptPath; + } + + /** + * Set flag indicating whether or not to consume JS aggregated in dojo() + * view helper + * + * @param bool $flag + * @return Zend_Dojo_BuildLayer + */ + public function setConsumeJavascript($flag) + { + $this->_consumeJavascript = (bool) $flag; + return $this; + } + + /** + * Get flag indicating whether or not to consume JS aggregated in dojo() + * view helper + * + * @return bool + */ + public function consumeJavascript() + { + return $this->_consumeJavascript; + } + + /** + * Set flag indicating whether or not to consume dojo.addOnLoad events + * aggregated in dojo() view helper + * + * @param bool $flag + * @return Zend_Dojo_BuildLayer + */ + public function setConsumeOnLoad($flag) + { + $this->_consumeOnLoad = (bool) $flag; + return $this; + } + + /** + * Get flag indicating whether or not to consume dojo.addOnLoad events aggregated in dojo() view helper + * + * @return bool + */ + public function consumeOnLoad() + { + return $this->_consumeOnLoad; + } + + /** + * Set many build profile options at once + * + * @param array $options + * @return Zend_Dojo_BuildLayer + */ + public function setProfileOptions(array $options) + { + $this->_profileOptions += $options; + return $this; + } + + /** + * Add many build profile options at once + * + * @param array $options + * @return Zend_Dojo_BuildLayer + */ + public function addProfileOptions(array $options) + { + $this->_profileOptions = $this->_profileOptions + $options; + return $this; + } + + /** + * Add a single build profile option + * + * @param string $key + * @param value $value + * @return Zend_Dojo_BuildLayer + */ + public function addProfileOption($key, $value) + { + $this->_profileOptions[(string) $key] = $value; + return $this; + } + + /** + * Is a given build profile option set? + * + * @param string $key + * @return bool + */ + public function hasProfileOption($key) + { + return array_key_exists((string) $key, $this->_profileOptions); + } + + /** + * Retrieve a single build profile option + * + * Returns null if profile option does not exist. + * + * @param string $key + * @return mixed + */ + public function getProfileOption($key) + { + if ($this->hasProfileOption($key)) { + return $this->_profileOptions[(string) $key]; + } + return null; + } + + /** + * Get all build profile options + * + * @return array + */ + public function getProfileOptions() + { + return $this->_profileOptions; + } + + /** + * Remove a build profile option + * + * @param string $name + * @return Zend_Dojo_BuildLayer + */ + public function removeProfileOption($name) + { + if ($this->hasProfileOption($name)) { + unset($this->_profileOptions[(string) $name]); + } + return $this; + } + + /** + * Remove all build profile options + * + * @return Zend_Dojo_BuildLayer + */ + public function clearProfileOptions() + { + $this->_profileOptions = array(); + return $this; + } + + /** + * Add a build profile dependency prefix + * + * If just the prefix is passed, sets path to "../$prefix". + * + * @param string $prefix + * @param null|string $path + * @return Zend_Dojo_BuildLayer + */ + public function addProfilePrefix($prefix, $path = null) + { + if (null === $path) { + $path = '../' . $prefix; + } + $this->_profilePrefixes[$prefix] = array($prefix, $path); + return $this; + } + + /** + * Set multiple dependency prefixes for bulid profile + * + * @param array $prefixes + * @return Zend_Dojo_BuildLayer + */ + public function setProfilePrefixes(array $prefixes) + { + foreach ($prefixes as $prefix => $path) { + $this->addProfilePrefix($prefix, $path); + } + return $this; + } + + /** + * Get build profile dependency prefixes + * + * @return array + */ + public function getProfilePrefixes() + { + $layerName = $this->getLayerName(); + if (null !== $layerName) { + $prefix = $this->_getPrefix($layerName); + if (!array_key_exists($prefix, $this->_profilePrefixes)) { + $this->addProfilePrefix($prefix); + } + } + $view = $this->getView(); + if (!empty($view)) { + $helper = $this->getDojoHelper(); + if ($helper) { + $modules = $helper->getModules(); + foreach ($modules as $module) { + $prefix = $this->_getPrefix($module); + if (!array_key_exists($prefix, $this->_profilePrefixes)) { + $this->addProfilePrefix($prefix); + } + } + } + } + return $this->_profilePrefixes; + } + + /** + * Generate module layer script + * + * @return string + */ + public function generateLayerScript() + { + $helper = $this->getDojoHelper(); + $layerName = $this->getLayerName(); + $modulePaths = $helper->getModulePaths(); + $modules = $helper->getModules(); + $onLoadActions = $helper->getOnLoadActions(); + $javascript = $helper->getJavascript(); + + $content = 'dojo.provide("' . $layerName . '");' . "\n\n(function(){\n"; + + foreach ($modulePaths as $module => $path) { + $content .= sprintf("dojo.registerModulePath(\"%s\", \"%s\");\n", $module, $path); + } + foreach ($modules as $module) { + $content .= sprintf("dojo.require(\"%s\");\n", $module); + } + + if ($this->consumeOnLoad()) { + foreach ($helper->getOnLoadActions() as $callback) { + $content .= sprintf("dojo.addOnLoad(%s);\n", $callback); + } + } + if ($this->consumeJavascript()) { + $javascript = implode("\n", $helper->getJavascript()); + if (!empty($javascript)) { + $content .= "\n" . $javascript . "\n"; + } + } + + $content .= "})();"; + + return $content; + } + + /** + * Generate build profile + * + * @return string + */ + public function generateBuildProfile() + { + $profileOptions = $this->getProfileOptions(); + $layerName = $this->getLayerName(); + $layerScriptPath = $this->getLayerScriptPath(); + $profilePrefixes = $this->getProfilePrefixes(); + + if (!array_key_exists('releaseName', $profileOptions)) { + $profileOptions['releaseName'] = substr($layerName, 0, strpos($layerName, '.')); + } + + $profile = $profileOptions; + $profile['layers'] = array(array( + 'name' => $layerScriptPath, + 'layerDependencies' => array(), + 'dependencies' => array($layerName), + )); + $profile['prefixes'] = array_values($profilePrefixes); + + return 'dependencies = ' . $this->_filterJsonProfileToJavascript($profile) . ';'; + } + + /** + * Retrieve module prefix + * + * @param string $module + * @return void + */ + protected function _getPrefix($module) + { + $segments = explode('.', $module, 2); + return $segments[0]; + } + + /** + * Filter a JSON build profile to JavaScript + * + * @param string $profile + * @return string + */ + protected function _filterJsonProfileToJavascript($profile) + { + require_once 'Zend/Json.php'; + $profile = Zend_Json::encode($profile); + $profile = preg_replace('/"([^"]*)":/', '$1:', $profile); + $profile = preg_replace('/' . preg_quote('\\') . '/', '', $profile); + return $profile; + } +} diff --git a/lib/zend/Zend/Dojo/Data.php b/lib/zend/Zend/Dojo/Data.php new file mode 100644 index 0000000000..40cfe0fce7 --- /dev/null +++ b/lib/zend/Zend/Dojo/Data.php @@ -0,0 +1,563 @@ +setIdentifier($identifier); + } + if (null !== $items) { + $this->setItems($items); + } + if (null !== $label) { + $this->setLabel($label); + } + } + + /** + * Set the items to collect + * + * @param array|Traversable $items + * @return Zend_Dojo_Data + */ + public function setItems($items) + { + $this->clearItems(); + return $this->addItems($items); + } + + /** + * Set an individual item, optionally by identifier (overwrites) + * + * @param array|object $item + * @param string|null $identifier + * @return Zend_Dojo_Data + */ + public function setItem($item, $id = null) + { + $item = $this->_normalizeItem($item, $id); + $this->_items[$item['id']] = $item['data']; + return $this; + } + + /** + * Add an individual item, optionally by identifier + * + * @param array|object $item + * @param string|null $id + * @return Zend_Dojo_Data + */ + public function addItem($item, $id = null) + { + $item = $this->_normalizeItem($item, $id); + + if ($this->hasItem($item['id'])) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Overwriting items using addItem() is not allowed'); + } + + $this->_items[$item['id']] = $item['data']; + + return $this; + } + + /** + * Add multiple items at once + * + * @param array|Traversable $items + * @return Zend_Dojo_Data + */ + public function addItems($items) + { + if (!is_array($items) && (!is_object($items) || !($items instanceof Traversable))) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Only arrays and Traversable objects may be added to ' . __CLASS__); + } + + foreach ($items as $item) { + $this->addItem($item); + } + + return $this; + } + + /** + * Get all items as an array + * + * Serializes items to arrays. + * + * @return array + */ + public function getItems() + { + return $this->_items; + } + + /** + * Does an item with the given identifier exist? + * + * @param string|int $id + * @return bool + */ + public function hasItem($id) + { + return array_key_exists($id, $this->_items); + } + + /** + * Retrieve an item by identifier + * + * Item retrieved will be flattened to an array. + * + * @param string $id + * @return array + */ + public function getItem($id) + { + if (!$this->hasItem($id)) { + return null; + } + + return $this->_items[$id]; + } + + /** + * Remove item by identifier + * + * @param string $id + * @return Zend_Dojo_Data + */ + public function removeItem($id) + { + if ($this->hasItem($id)) { + unset($this->_items[$id]); + } + + return $this; + } + + /** + * Remove all items at once + * + * @return Zend_Dojo_Data + */ + public function clearItems() + { + $this->_items = array(); + return $this; + } + + + /** + * Set identifier for item lookups + * + * @param string|int|null $identifier + * @return Zend_Dojo_Data + */ + public function setIdentifier($identifier) + { + if (null === $identifier) { + $this->_identifier = null; + } elseif (is_string($identifier)) { + $this->_identifier = $identifier; + } elseif (is_numeric($identifier)) { + $this->_identifier = (int) $identifier; + } else { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Invalid identifier; please use a string or integer'); + } + + return $this; + } + + /** + * Retrieve current item identifier + * + * @return string|int|null + */ + public function getIdentifier() + { + return $this->_identifier; + } + + + /** + * Set label to use for displaying item associations + * + * @param string|null $label + * @return Zend_Dojo_Data + */ + public function setLabel($label) + { + if (null === $label) { + $this->_label = null; + } else { + $this->_label = (string) $label; + } + return $this; + } + + /** + * Retrieve item association label + * + * @return string|null + */ + public function getLabel() + { + return $this->_label; + } + + /** + * Set metadata by key or en masse + * + * @param string|array $spec + * @param mixed $value + * @return Zend_Dojo_Data + */ + public function setMetadata($spec, $value = null) + { + if (is_string($spec) && (null !== $value)) { + $this->_metadata[$spec] = $value; + } elseif (is_array($spec)) { + foreach ($spec as $key => $value) { + $this->setMetadata($key, $value); + } + } + return $this; + } + + /** + * Get metadata item or all metadata + * + * @param null|string $key Metadata key when pulling single metadata item + * @return mixed + */ + public function getMetadata($key = null) + { + if (null === $key) { + return $this->_metadata; + } + + if (array_key_exists($key, $this->_metadata)) { + return $this->_metadata[$key]; + } + + return null; + } + + /** + * Clear individual or all metadata item(s) + * + * @param null|string $key + * @return Zend_Dojo_Data + */ + public function clearMetadata($key = null) + { + if (null === $key) { + $this->_metadata = array(); + } elseif (array_key_exists($key, $this->_metadata)) { + unset($this->_metadata[$key]); + } + return $this; + } + + /** + * Load object from array + * + * @param array $data + * @return Zend_Dojo_Data + */ + public function fromArray(array $data) + { + if (array_key_exists('identifier', $data)) { + $this->setIdentifier($data['identifier']); + } + if (array_key_exists('label', $data)) { + $this->setLabel($data['label']); + } + if (array_key_exists('items', $data) && is_array($data['items'])) { + $this->setItems($data['items']); + } else { + $this->clearItems(); + } + return $this; + } + + /** + * Load object from JSON + * + * @param string $json + * @return Zend_Dojo_Data + */ + public function fromJson($json) + { + if (!is_string($json)) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('fromJson() expects JSON input'); + } + require_once 'Zend/Json.php'; + $data = Zend_Json::decode($json); + return $this->fromArray($data); + } + + /** + * Seralize entire data structure, including identifier and label, to array + * + * @return array + */ + public function toArray() + { + if (null === ($identifier = $this->getIdentifier())) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Serialization requires that an identifier be present in the object; first call setIdentifier()'); + } + + $array = array( + 'identifier' => $identifier, + 'items' => array_values($this->getItems()), + ); + + $metadata = $this->getMetadata(); + if (!empty($metadata)) { + foreach ($metadata as $key => $value) { + $array[$key] = $value; + } + } + + if (null !== ($label = $this->getLabel())) { + $array['label'] = $label; + } + + return $array; + } + + /** + * Serialize to JSON (dojo.data format) + * + * @return string + */ + public function toJson() + { + require_once 'Zend/Json.php'; + return Zend_Json::encode($this->toArray()); + } + + /** + * Serialize to string (proxy to {@link toJson()}) + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } + + /** + * ArrayAccess: does offset exist? + * + * @param string|int $offset + * @return bool + */ + public function offsetExists($offset) + { + return (null !== $this->getItem($offset)); + } + + /** + * ArrayAccess: retrieve by offset + * + * @param string|int $offset + * @return array + */ + public function offsetGet($offset) + { + return $this->getItem($offset); + } + + /** + * ArrayAccess: set value by offset + * + * @param string $offset + * @param array|object|null $value + * @return void + */ + public function offsetSet($offset, $value) + { + $this->setItem($value, $offset); + } + + /** + * ArrayAccess: unset value by offset + * + * @param string $offset + * @return void + */ + public function offsetUnset($offset) + { + $this->removeItem($offset); + } + + /** + * Iterator: get current value + * + * @return array + */ + public function current() + { + return current($this->_items); + } + + /** + * Iterator: get current key + * + * @return string|int + */ + public function key() + { + return key($this->_items); + } + + /** + * Iterator: get next item + * + * @return void + */ + public function next() + { + return next($this->_items); + } + + /** + * Iterator: rewind to first value in collection + * + * @return void + */ + public function rewind() + { + return reset($this->_items); + } + + /** + * Iterator: is item valid? + * + * @return bool + */ + public function valid() + { + return (bool) $this->current(); + } + + /** + * Countable: how many items are present + * + * @return int + */ + public function count() + { + return count($this->_items); + } + + /** + * Normalize an item to attach to the collection + * + * @param array|object $item + * @param string|int|null $id + * @return array + */ + protected function _normalizeItem($item, $id) + { + if (null === ($identifier = $this->getIdentifier())) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('You must set an identifier prior to adding items'); + } + + if (!is_object($item) && !is_array($item)) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Only arrays and objects may be attached'); + } + + if (is_object($item)) { + if (method_exists($item, 'toArray')) { + $item = $item->toArray(); + } else { + $item = get_object_vars($item); + } + } + + if ((null === $id) && !array_key_exists($identifier, $item)) { + require_once 'Zend/Dojo/Exception.php'; + throw new Zend_Dojo_Exception('Item must contain a column matching the currently set identifier'); + } elseif (null === $id) { + $id = $item[$identifier]; + } else { + $item[$identifier] = $id; + } + + return array( + 'id' => $id, + 'data' => $item, + ); + } +} diff --git a/lib/zend/Zend/Dojo/Exception.php b/lib/zend/Zend/Dojo/Exception.php new file mode 100644 index 0000000000..78251e3dbe --- /dev/null +++ b/lib/zend/Zend/Dojo/Exception.php @@ -0,0 +1,35 @@ +addPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator') + ->addPrefixPath('Zend_Dojo_Form_Element', 'Zend/Dojo/Form/Element', 'element') + ->addElementPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator') + ->addDisplayGroupPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator') + ->setDefaultDisplayGroupClass('Zend_Dojo_Form_DisplayGroup'); + parent::__construct($options); + } + + /** + * Load the default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('FormElements') + ->addDecorator('HtmlTag', array('tag' => 'dl', 'class' => 'zend_form_dojo')) + ->addDecorator('DijitForm'); + } + } + + /** + * Set the view object + * + * Ensures that the view object has the dojo view helper path set. + * + * @param Zend_View_Interface $view + * @return Zend_Dojo_Form_Element_Dijit + */ + public function setView(Zend_View_Interface $view = null) + { + if (null !== $view) { + if (false === $view->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) { + $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); + } + } + return parent::setView($view); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Decorator/AccordionContainer.php b/lib/zend/Zend/Dojo/Form/Decorator/AccordionContainer.php new file mode 100644 index 0000000000..34de7965af --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Decorator/AccordionContainer.php @@ -0,0 +1,43 @@ +_helper) { + require_once 'Zend/Form/Decorator/Exception.php'; + throw new Zend_Form_Decorator_Exception('No view helper specified fo DijitContainer decorator'); + } + return $this->_helper; + } + + /** + * Get element attributes + * + * @return array + */ + public function getAttribs() + { + if (null === $this->_attribs) { + $attribs = $this->getElement()->getAttribs(); + if (array_key_exists('dijitParams', $attribs)) { + unset($attribs['dijitParams']); + } + $this->_attribs = $attribs; + } + return $this->_attribs; + } + + /** + * Get dijit option parameters + * + * @return array + */ + public function getDijitParams() + { + if (null === $this->_dijitParams) { + $attribs = $this->getElement()->getAttribs(); + if (array_key_exists('dijitParams', $attribs)) { + $this->_dijitParams = $attribs['dijitParams']; + } else { + $this->_dijitParams = array(); + } + + $options = $this->getOptions(); + if (array_key_exists('dijitParams', $options)) { + $this->_dijitParams = array_merge($this->_dijitParams, $options['dijitParams']); + $this->removeOption('dijitParams'); + } + } + + // Ensure we have a title param + if (!array_key_exists('title', $this->_dijitParams)) { + $this->_dijitParams['title'] = $this->getTitle(); + } + + return $this->_dijitParams; + } + + /** + * Get title + * + * @return string + */ + public function getTitle() + { + if (null === $this->_title) { + $title = null; + if (null !== ($element = $this->getElement())) { + if (method_exists($element, 'getLegend')) { + $title = $element->getLegend(); + } + } + if (empty($title) && (null !== ($title = $this->getOption('legend')))) { + $this->removeOption('legend'); + } + if (empty($title) && (null !== ($title = $this->getOption('title')))) { + $this->removeOption('title'); + } + + if (!empty($title)) { + if (null !== ($translator = $element->getTranslator())) { + $title = $translator->translate($title); + } + $this->_title = $title; + } + } + + return (empty($this->_title) ? '' : $this->_title); + } + + /** + * Render a dijit layout container + * + * Replaces $content entirely from currently set element. + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $dijitParams = $this->getDijitParams(); + $attribs = array_merge($this->getAttribs(), $this->getOptions()); + + if (array_key_exists('legend', $attribs)) { + if (!array_key_exists('title', $dijitParams) || empty($dijitParams['title'])) { + $dijitParams['title'] = $attribs['legend']; + } + unset($attribs['legend']); + } + + $helper = $this->getHelper(); + $id = $element->getId() . '-' . $helper; + + if ($view->dojo()->hasDijit($id)) { + trigger_error(sprintf('Duplicate dijit ID detected for id "%s; temporarily generating uniqid"', $id), E_USER_WARNING); + $base = $id; + do { + $id = $base . '-' . uniqid(); + } while ($view->dojo()->hasDijit($id)); + } + + return $view->$helper($id, $content, $dijitParams, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Decorator/DijitElement.php b/lib/zend/Zend/Dojo/Form/Decorator/DijitElement.php new file mode 100644 index 0000000000..39bb5c7d98 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Decorator/DijitElement.php @@ -0,0 +1,195 @@ +_attribs) { + $this->_attribs = parent::getElementAttribs(); + if (array_key_exists('dijitParams', $this->_attribs)) { + $this->setDijitParams($this->_attribs['dijitParams']); + unset($this->_attribs['dijitParams']); + } + } + + return $this->_attribs; + } + + /** + * Set a single dijit option parameter + * + * @param string $key + * @param mixed $value + * @return Zend_Dojo_Form_Decorator_DijitContainer + */ + public function setDijitParam($key, $value) + { + $this->_dijitParams[(string) $key] = $value; + return $this; + } + + /** + * Set dijit option parameters + * + * @param array $params + * @return Zend_Dojo_Form_Decorator_DijitContainer + */ + public function setDijitParams(array $params) + { + $this->_dijitParams = array_merge($this->_dijitParams, $params); + return $this; + } + + /** + * Retrieve a single dijit option parameter + * + * @param string $key + * @return mixed|null + */ + public function getDijitParam($key) + { + $this->getElementAttribs(); + $key = (string) $key; + if (array_key_exists($key, $this->_dijitParams)) { + return $this->_dijitParams[$key]; + } + + return null; + } + + /** + * Get dijit option parameters + * + * @return array + */ + public function getDijitParams() + { + $this->getElementAttribs(); + return $this->_dijitParams; + } + + /** + * Render an element using a view helper + * + * Determine view helper from 'helper' option, or, if none set, from + * the element type. Then call as + * helper($element->getName(), $element->getValue(), $element->getAttribs()) + * + * @param string $content + * @return string + * @throws Zend_Form_Decorator_Exception if element or view are not registered + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + require_once 'Zend/Form/Decorator/Exception.php'; + throw new Zend_Form_Decorator_Exception('DijitElement decorator cannot render without a registered view object'); + } + + $options = null; + $helper = $this->getHelper(); + $separator = $this->getSeparator(); + $value = $this->getValue($element); + $attribs = $this->getElementAttribs(); + $name = $element->getFullyQualifiedName(); + + $dijitParams = $this->getDijitParams(); + if ($element->isRequired()) { + $dijitParams['required'] = true; + } + + $id = $element->getId(); + if ($view->dojo()->hasDijit($id)) { + trigger_error(sprintf('Duplicate dijit ID detected for id "%s; temporarily generating uniqid"', $id), E_USER_NOTICE); + $base = $id; + do { + $id = $base . '-' . uniqid(); + } while ($view->dojo()->hasDijit($id)); + } + $attribs['id'] = $id; + + if (array_key_exists('options', $attribs)) { + $options = $attribs['options']; + } + + $elementContent = $view->$helper($name, $value, $dijitParams, $attribs, $options); + switch ($this->getPlacement()) { + case self::APPEND: + return $content . $separator . $elementContent; + case self::PREPEND: + return $elementContent . $separator . $content; + default: + return $elementContent; + } + } +} diff --git a/lib/zend/Zend/Dojo/Form/Decorator/DijitForm.php b/lib/zend/Zend/Dojo/Form/Decorator/DijitForm.php new file mode 100644 index 0000000000..1d90cc1718 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Decorator/DijitForm.php @@ -0,0 +1,61 @@ +getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $dijitParams = $this->getDijitParams(); + $attribs = array_merge($this->getAttribs(), $this->getOptions()); + + return $view->form($element->getName(), $attribs, $content); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Decorator/SplitContainer.php b/lib/zend/Zend/Dojo/Form/Decorator/SplitContainer.php new file mode 100644 index 0000000000..7cf48d014f --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Decorator/SplitContainer.php @@ -0,0 +1,43 @@ +addPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator'); + } + + /** + * Set the view object + * + * Ensures that the view object has the dojo view helper path set. + * + * @param Zend_View_Interface $view + * @return Zend_Dojo_Form_Element_Dijit + */ + public function setView(Zend_View_Interface $view = null) + { + if (null !== $view) { + if (false === $view->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) { + $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); + } + } + return parent::setView($view); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/Button.php b/lib/zend/Zend/Dojo/Form/Element/Button.php new file mode 100644 index 0000000000..171930fbe5 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/Button.php @@ -0,0 +1,121 @@ + $options); + } + + parent::__construct($spec, $options); + } + + /** + * Return label + * + * If no label is present, returns the currently set name. + * + * If a translator is present, returns the translated label. + * + * @return string + */ + public function getLabel() + { + $value = parent::getLabel(); + + if (null === $value) { + $value = $this->getName(); + } + + if (null !== ($translator = $this->getTranslator())) { + return $translator->translate($value); + } + + return $value; + } + + /** + * Has this submit button been selected? + * + * @return bool + */ + public function isChecked() + { + $value = $this->getValue(); + + if (empty($value)) { + return false; + } + if ($value != $this->getLabel()) { + return false; + } + + return true; + } + + /** + * Default decorators + * + * Uses only 'DijitElement' and 'DtDdWrapper' decorators by default. + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('DijitElement') + ->addDecorator('DtDdWrapper'); + } + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/CheckBox.php b/lib/zend/Zend/Dojo/Form/Element/CheckBox.php new file mode 100644 index 0000000000..27ba84a7c2 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/CheckBox.php @@ -0,0 +1,205 @@ + '1', + 'uncheckedValue' => '0', + ); + + /** + * Value when checked + * @var string + */ + protected $_checkedValue = '1'; + + /** + * Value when not checked + * @var string + */ + protected $_uncheckedValue = '0'; + + /** + * Current value + * @var string 0 or 1 + */ + protected $_value = '0'; + + /** + * Set options + * + * Intercept checked and unchecked values and set them early; test stored + * value against checked and unchecked values after configuration. + * + * @param array $options + * @return Zend_Form_Element_Checkbox + */ + public function setOptions(array $options) + { + if (array_key_exists('checkedValue', $options)) { + $this->setCheckedValue($options['checkedValue']); + unset($options['checkedValue']); + } + if (array_key_exists('uncheckedValue', $options)) { + $this->setUncheckedValue($options['uncheckedValue']); + unset($options['uncheckedValue']); + } + parent::setOptions($options); + + $curValue = $this->getValue(); + $test = array($this->getCheckedValue(), $this->getUncheckedValue()); + if (!in_array($curValue, $test)) { + $this->setValue($curValue); + } + + return $this; + } + + /** + * Set value + * + * If value matches checked value, sets to that value, and sets the checked + * flag to true. + * + * Any other value causes the unchecked value to be set as the current + * value, and the checked flag to be set as false. + * + * + * @param mixed $value + * @return Zend_Form_Element_Checkbox + */ + public function setValue($value) + { + if ($value == $this->getCheckedValue()) { + parent::setValue($value); + $this->checked = true; + } else { + parent::setValue($this->getUncheckedValue()); + $this->checked = false; + } + return $this; + } + + /** + * Set checked value + * + * @param string $value + * @return Zend_Form_Element_Checkbox + */ + public function setCheckedValue($value) + { + $this->_checkedValue = (string) $value; + $this->options['checkedValue'] = $value; + return $this; + } + + /** + * Get value when checked + * + * @return string + */ + public function getCheckedValue() + { + return $this->_checkedValue; + } + + /** + * Set unchecked value + * + * @param string $value + * @return Zend_Form_Element_Checkbox + */ + public function setUncheckedValue($value) + { + $this->_uncheckedValue = (string) $value; + $this->options['uncheckedValue'] = $value; + return $this; + } + + /** + * Get value when not checked + * + * @return string + */ + public function getUncheckedValue() + { + return $this->_uncheckedValue; + } + + /** + * Set checked flag + * + * @param bool $flag + * @return Zend_Form_Element_Checkbox + */ + public function setChecked($flag) + { + $this->checked = (bool) $flag; + if ($this->checked) { + $this->setValue($this->getCheckedValue()); + } else { + $this->setValue($this->getUncheckedValue()); + } + return $this; + } + + /** + * Get checked flag + * + * @return bool + */ + public function isChecked() + { + return $this->checked; + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/ComboBox.php b/lib/zend/Zend/Dojo/Form/Element/ComboBox.php new file mode 100644 index 0000000000..0e4ce30962 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/ComboBox.php @@ -0,0 +1,186 @@ +hasDijitParam('store')) { + $this->dijitParams['store'] = array(); + } + return $this->dijitParams['store']; + } + + /** + * Set datastore identifier + * + * @param string $identifier + * @return Zend_Dojo_Form_Element_ComboBox + */ + public function setStoreId($identifier) + { + $store = $this->getStoreInfo(); + $store['store'] = (string) $identifier; + $this->setDijitParam('store', $store); + return $this; + } + + /** + * Get datastore identifier + * + * @return string|null + */ + public function getStoreId() + { + $store = $this->getStoreInfo(); + if (array_key_exists('store', $store)) { + return $store['store']; + } + return null; + } + + /** + * Set datastore dijit type + * + * @param string $dojoType + * @return Zend_Dojo_Form_Element_ComboBox + */ + public function setStoreType($dojoType) + { + $store = $this->getStoreInfo(); + $store['type'] = (string) $dojoType; + $this->setDijitParam('store', $store); + return $this; + } + + /** + * Get datastore dijit type + * + * @return string|null + */ + public function getStoreType() + { + $store = $this->getStoreInfo(); + if (array_key_exists('type', $store)) { + return $store['type']; + } + return null; + } + + /** + * Set datastore parameters + * + * @param array $params + * @return Zend_Dojo_Form_Element_ComboBox + */ + public function setStoreParams(array $params) + { + $store = $this->getStoreInfo(); + $store['params'] = $params; + $this->setDijitParam('store', $store); + return $this; + } + + /** + * Get datastore params + * + * @return array + */ + public function getStoreParams() + { + $store = $this->getStoreInfo(); + if (array_key_exists('params', $store)) { + return $store['params']; + } + return array(); + } + + /** + * Set autocomplete flag + * + * @param bool $flag + * @return Zend_Dojo_Form_Element_ComboBox + */ + public function setAutocomplete($flag) + { + $this->setDijitParam('autocomplete', (bool) $flag); + return $this; + } + + /** + * Get autocomplete flag + * + * @return bool + */ + public function getAutocomplete() + { + if (!$this->hasDijitParam('autocomplete')) { + return false; + } + return $this->getDijitParam('autocomplete'); + } + + /** + * Is the value valid? + * + * @param string $value + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + $storeInfo = $this->getStoreInfo(); + if (!empty($storeInfo)) { + $this->setRegisterInArrayValidator(false); + } + return parent::isValid($value, $context); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/CurrencyTextBox.php b/lib/zend/Zend/Dojo/Form/Element/CurrencyTextBox.php new file mode 100644 index 0000000000..b31a274861 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/CurrencyTextBox.php @@ -0,0 +1,120 @@ +setDijitParam('currency', (string) $currency); + return $this; + } + + /** + * Retrieve currency + * + * @return string|null + */ + public function getCurrency() + { + return $this->getDijitParam('currency'); + } + + /** + * Set currency symbol + * + * Casts to string, uppercases, and trims to three characters. + * + * @param string $symbol + * @return Zend_Dojo_Form_Element_CurrencyTextBox + */ + public function setSymbol($symbol) + { + $symbol = strtoupper((string) $symbol); + $length = strlen($symbol); + if (3 > $length) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception('Invalid symbol provided; please provide ISO 4217 alphabetic currency code'); + } + if (3 < $length) { + $symbol = substr($symbol, 0, 3); + } + + $this->setConstraint('symbol', $symbol); + return $this; + } + + /** + * Retrieve symbol + * + * @return string|null + */ + public function getSymbol() + { + return $this->getConstraint('symbol'); + } + + /** + * Set whether currency is fractional + * + * @param bool $flag + * @return Zend_Dojo_Form_Element_CurrencyTextBox + */ + public function setFractional($flag) + { + $this->setConstraint('fractional', (bool) $flag); + return $this; + } + + /** + * Get whether or not to present fractional values + * + * @return bool + */ + public function getFractional() + { + return ('true' == $this->getConstraint('fractional')); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/DateTextBox.php b/lib/zend/Zend/Dojo/Form/Element/DateTextBox.php new file mode 100644 index 0000000000..9bbb9cea1f --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/DateTextBox.php @@ -0,0 +1,214 @@ +setConstraint('am,pm', (bool) $flag); + return $this; + } + + /** + * Retrieve am,pm flag + * + * @return bool + */ + public function getAmPm() + { + if (!$this->hasConstraint('am,pm')) { + return false; + } + return ('true' ==$this->getConstraint('am,pm')); + } + + /** + * Set strict flag + * + * @param bool $strict + * @return Zend_Dojo_Form_Element_DateTextBox + */ + public function setStrict($flag) + { + $this->setConstraint('strict', (bool) $flag); + return $this; + } + + /** + * Retrieve strict flag + * + * @return bool + */ + public function getStrict() + { + if (!$this->hasConstraint('strict')) { + return false; + } + return ('true' == $this->getConstraint('strict')); + } + + /** + * Set locale + * + * @param string $locale + * @return Zend_Dojo_Form_Element_DateTextBox + */ + public function setLocale($locale) + { + $this->setConstraint('locale', (string) $locale); + return $this; + } + + /** + * Retrieve locale + * + * @return string|null + */ + public function getLocale() + { + return $this->getConstraint('locale'); + } + + /** + * Set date format pattern + * + * @param string $pattern + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setDatePattern($pattern) + { + $this->setConstraint('datePattern', (string) $pattern); + return $this; + } + + /** + * Retrieve date format pattern + * + * @return string|null + */ + public function getDatePattern() + { + return $this->getConstraint('datePattern'); + } + + /** + * Set numeric format formatLength + * + * @see $_allowedFormatTypes + * @param string $formatLength + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setFormatLength($formatLength) + { + $formatLength = strtolower($formatLength); + if (!in_array($formatLength, $this->_allowedFormatTypes)) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception(sprintf('Invalid formatLength "%s" specified', $formatLength)); + } + + $this->setConstraint('formatLength', $formatLength); + return $this; + } + + /** + * Retrieve formatLength + * + * @return string|null + */ + public function getFormatLength() + { + return $this->getConstraint('formatLength'); + } + + /** + * Set numeric format Selector + * + * @see $_allowedSelectorTypes + * @param string $selector + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setSelector($selector) + { + $selector = strtolower($selector); + if (!in_array($selector, $this->_allowedSelectorTypes)) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception(sprintf('Invalid Selector "%s" specified', $selector)); + } + + $this->setConstraint('selector', $selector); + return $this; + } + + /** + * Retrieve selector + * + * @return string|null + */ + public function getSelector() + { + return $this->getConstraint('selector'); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/Dijit.php b/lib/zend/Zend/Dojo/Form/Element/Dijit.php new file mode 100644 index 0000000000..ee75065b7d --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/Dijit.php @@ -0,0 +1,189 @@ +addPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator'); + parent::__construct($spec, $options); + } + + /** + * Set a dijit parameter + * + * @param string $key + * @param mixed $value + * @return Zend_Dojo_Form_Element_Dijit + */ + public function setDijitParam($key, $value) + { + $key = (string) $key; + $this->dijitParams[$key] = $value; + return $this; + } + + /** + * Set multiple dijit params at once + * + * @param array $params + * @return Zend_Dojo_Form_Element_Dijit + */ + public function setDijitParams(array $params) + { + $this->dijitParams = array_merge($this->dijitParams, $params); + return $this; + } + + /** + * Does the given dijit parameter exist? + * + * @param string $key + * @return bool + */ + public function hasDijitParam($key) + { + return array_key_exists($key, $this->dijitParams); + } + + /** + * Get a single dijit parameter + * + * @param string $key + * @return mixed + */ + public function getDijitParam($key) + { + $key = (string) $key; + if ($this->hasDijitParam($key)) { + return $this->dijitParams[$key]; + } + return null; + } + + /** + * Retrieve all dijit parameters + * + * @return array + */ + public function getDijitParams() + { + return $this->dijitParams; + } + + /** + * Remove a single dijit parameter + * + * @param string $key + * @return Zend_Dojo_Form_Element_Dijit + */ + public function removeDijitParam($key) + { + $key = (string) $key; + if (array_key_exists($key, $this->dijitParams)) { + unset($this->dijitParams[$key]); + } + return $this; + } + + /** + * Clear all dijit parameters + * + * @return Zend_Dojo_Form_Element_Dijit + */ + public function clearDijitParams() + { + $this->dijitParams = array(); + return $this; + } + + /** + * Load default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('DijitElement') + ->addDecorator('Errors') + ->addDecorator('Description', array('tag' => 'p', 'class' => 'description')) + ->addDecorator('HtmlTag', array('tag' => 'dd')) + ->addDecorator('Label', array('tag' => 'dt')); + } + } + + /** + * Set the view object + * + * Ensures that the view object has the dojo view helper path set. + * + * @param Zend_View_Interface $view + * @return Zend_Dojo_Form_Element_Dijit + */ + public function setView(Zend_View_Interface $view = null) + { + if (null !== $view) { + if (false === $view->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) { + $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); + } + } + return parent::setView($view); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/DijitMulti.php b/lib/zend/Zend/Dojo/Form/Element/DijitMulti.php new file mode 100644 index 0000000000..852d3bddca --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/DijitMulti.php @@ -0,0 +1,304 @@ +'. + * @var string + */ + protected $_separator = '
'; + + /** + * Which values are translated already? + * @var array + */ + protected $_translated = array(); + + /** + * Retrieve separator + * + * @return mixed + */ + public function getSeparator() + { + return $this->_separator; + } + + /** + * Set separator + * + * @param mixed $separator + * @return self + */ + public function setSeparator($separator) + { + $this->_separator = $separator; + return $this; + } + + /** + * Retrieve options array + * + * @return array + */ + protected function _getMultiOptions() + { + if (null === $this->options || !is_array($this->options)) { + $this->options = array(); + } + + return $this->options; + } + + /** + * Add an option + * + * @param string $option + * @param string $value + * @return Zend_Form_Element_Multi + */ + public function addMultiOption($option, $value = '') + { + $option = (string) $option; + $this->_getMultiOptions(); + if (!$this->_translateOption($option, $value)) { + $this->options[$option] = $value; + } + + return $this; + } + + /** + * Add many options at once + * + * @param array $options + * @return Zend_Form_Element_Multi + */ + public function addMultiOptions(array $options) + { + foreach ($options as $option => $value) { + if (is_array($value) + && array_key_exists('key', $value) + && array_key_exists('value', $value) + ) { + $this->addMultiOption($value['key'], $value['value']); + } else { + $this->addMultiOption($option, $value); + } + } + return $this; + } + + /** + * Set all options at once (overwrites) + * + * @param array $options + * @return Zend_Form_Element_Multi + */ + public function setMultiOptions(array $options) + { + $this->clearMultiOptions(); + return $this->addMultiOptions($options); + } + + /** + * Retrieve single multi option + * + * @param string $option + * @return mixed + */ + public function getMultiOption($option) + { + $option = (string) $option; + $this->_getMultiOptions(); + if (isset($this->options[$option])) { + $this->_translateOption($option, $this->options[$option]); + return $this->options[$option]; + } + + return null; + } + + /** + * Retrieve options + * + * @return array + */ + public function getMultiOptions() + { + $this->_getMultiOptions(); + foreach ($this->options as $option => $value) { + $this->_translateOption($option, $value); + } + return $this->options; + } + + /** + * Remove a single multi option + * + * @param string $option + * @return bool + */ + public function removeMultiOption($option) + { + $option = (string) $option; + $this->_getMultiOptions(); + if (isset($this->options[$option])) { + unset($this->options[$option]); + if (isset($this->_translated[$option])) { + unset($this->_translated[$option]); + } + return true; + } + + return false; + } + + /** + * Clear all options + * + * @return Zend_Form_Element_Multi + */ + public function clearMultiOptions() + { + $this->options = array(); + $this->_translated = array(); + return $this; + } + + /** + * Set flag indicating whether or not to auto-register inArray validator + * + * @param bool $flag + * @return Zend_Form_Element_Multi + */ + public function setRegisterInArrayValidator($flag) + { + $this->_registerInArrayValidator = (bool) $flag; + return $this; + } + + /** + * Get status of auto-register inArray validator flag + * + * @return bool + */ + public function registerInArrayValidator() + { + return $this->_registerInArrayValidator; + } + + /** + * Is the value provided valid? + * + * Autoregisters InArray validator if necessary. + * + * @param string $value + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + if ($this->registerInArrayValidator()) { + if (!$this->getValidator('InArray')) { + $options = $this->getMultiOptions(); + $this->addValidator( + 'InArray', + true, + array(array_keys($options)) + ); + } + } + return parent::isValid($value, $context); + } + + /** + * Translate an option + * + * @param string $option + * @param string $value + * @return bool + */ + protected function _translateOption($option, $value) + { + if (!isset($this->_translated[$option])) { + $this->options[$option] = $this->_translateValue($value); + if ($this->options[$option] === $value) { + return false; + } + $this->_translated[$option] = true; + return true; + } + + return false; + } + + /** + * Translate a value + * + * @param array|string $value + * @return array|string + */ + protected function _translateValue($value) + { + if (is_array($value)) { + foreach ($value as $key => $val) { + $value[$key] = $this->_translateValue($val); + } + return $value; + } else { + if (null !== ($translator = $this->getTranslator())) { + if ($translator->isTranslated($value)) { + return $translator->translate($value); + } + } + return $value; + } + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/Editor.php b/lib/zend/Zend/Dojo/Form/Element/Editor.php new file mode 100644 index 0000000000..2ff6fc6a08 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/Editor.php @@ -0,0 +1,599 @@ +getCaptureEvents(); + if (in_array($event, $captureEvents)) { + return $this; + } + + $captureEvents[] = (string) $event; + $this->setDijitParam('captureEvents', $captureEvents); + return $this; + } + + /** + * Add multiple capture events + * + * @param array $events + * @return Zend_Dojo_Form_Element_Editor + */ + public function addCaptureEvents(array $events) + { + foreach ($events as $event) { + $this->addCaptureEvent($event); + } + return $this; + } + + /** + * Overwrite many capture events at once + * + * @param array $events + * @return Zend_Dojo_Form_Element_Editor + */ + public function setCaptureEvents(array $events) + { + $this->clearCaptureEvents(); + $this->addCaptureEvents($events); + return $this; + } + + /** + * Get all capture events + * + * @return array + */ + public function getCaptureEvents() + { + if (!$this->hasDijitParam('captureEvents')) { + return array(); + } + return $this->getDijitParam('captureEvents'); + } + + /** + * Is a given capture event registered? + * + * @param string $event + * @return bool + */ + public function hasCaptureEvent($event) + { + $captureEvents = $this->getCaptureEvents(); + return in_array((string) $event, $captureEvents); + } + + /** + * Remove a given capture event + * + * @param string $event + * @return Zend_Dojo_Form_Element_Editor + */ + public function removeCaptureEvent($event) + { + $event = (string) $event; + $captureEvents = $this->getCaptureEvents(); + if (false === ($index = array_search($event, $captureEvents))) { + return $this; + } + unset($captureEvents[$index]); + $this->setDijitParam('captureEvents', $captureEvents); + return $this; + } + + /** + * Clear all capture events + * + * @return Zend_Dojo_Form_Element_Editor + */ + public function clearCaptureEvents() + { + return $this->removeDijitParam('captureEvents'); + } + + /** + * Add a single event to the dijit + * + * @param string $event + * @return Zend_Dojo_Form_Element_Editor + */ + public function addEvent($event) + { + $event = (string) $event; + $events = $this->getEvents(); + if (in_array($event, $events)) { + return $this; + } + + $events[] = (string) $event; + $this->setDijitParam('events', $events); + return $this; + } + + /** + * Add multiple events + * + * @param array $events + * @return Zend_Dojo_Form_Element_Editor + */ + public function addEvents(array $events) + { + foreach ($events as $event) { + $this->addEvent($event); + } + return $this; + } + + /** + * Overwrite many events at once + * + * @param array $events + * @return Zend_Dojo_Form_Element_Editor + */ + public function setEvents(array $events) + { + $this->clearEvents(); + $this->addEvents($events); + return $this; + } + + /** + * Get all events + * + * @return array + */ + public function getEvents() + { + if (!$this->hasDijitParam('events')) { + return array(); + } + return $this->getDijitParam('events'); + } + + /** + * Is a given event registered? + * + * @param string $event + * @return bool + */ + public function hasEvent($event) + { + $events = $this->getEvents(); + return in_array((string) $event, $events); + } + + /** + * Remove a given event + * + * @param string $event + * @return Zend_Dojo_Form_Element_Editor + */ + public function removeEvent($event) + { + $events = $this->getEvents(); + if (false === ($index = array_search($event, $events))) { + return $this; + } + unset($events[$index]); + $this->setDijitParam('events', $events); + return $this; + } + + /** + * Clear all events + * + * @return Zend_Dojo_Form_Element_Editor + */ + public function clearEvents() + { + return $this->removeDijitParam('events'); + } + + /** + * Add a single editor plugin + * + * @param string $plugin + * @return Zend_Dojo_Form_Element_Editor + */ + public function addPlugin($plugin) + { + $plugin = (string) $plugin; + $plugins = $this->getPlugins(); + if (in_array($plugin, $plugins)) { + return $this; + } + + $plugins[] = (string) $plugin; + $this->setDijitParam('plugins', $plugins); + return $this; + } + + /** + * Add multiple plugins + * + * @param array $plugins + * @return Zend_Dojo_Form_Element_Editor + */ + public function addPlugins(array $plugins) + { + foreach ($plugins as $plugin) { + $this->addPlugin($plugin); + } + return $this; + } + + /** + * Overwrite many plugins at once + * + * @param array $plugins + * @return Zend_Dojo_Form_Element_Editor + */ + public function setPlugins(array $plugins) + { + $this->clearPlugins(); + $this->addPlugins($plugins); + return $this; + } + + /** + * Get all plugins + * + * @return array + */ + public function getPlugins() + { + if (!$this->hasDijitParam('plugins')) { + return array(); + } + return $this->getDijitParam('plugins'); + } + + /** + * Is a given plugin registered? + * + * @param string $plugin + * @return bool + */ + public function hasPlugin($plugin) + { + $plugins = $this->getPlugins(); + return in_array((string) $plugin, $plugins); + } + + /** + * Remove a given plugin + * + * @param string $plugin + * @return Zend_Dojo_Form_Element_Editor + */ + public function removePlugin($plugin) + { + $plugins = $this->getPlugins(); + if (false === ($index = array_search($plugin, $plugins))) { + return $this; + } + unset($plugins[$index]); + $this->setDijitParam('plugins', $plugins); + return $this; + } + + /** + * Clear all plugins + * + * @return Zend_Dojo_Form_Element_Editor + */ + public function clearPlugins() + { + return $this->removeDijitParam('plugins'); + } + + /** + * Set edit action interval + * + * @param int $interval + * @return Zend_Dojo_Form_Element_Editor + */ + public function setEditActionInterval($interval) + { + return $this->setDijitParam('editActionInterval', (int) $interval); + } + + /** + * Get edit action interval; defaults to 3 + * + * @return int + */ + public function getEditActionInterval() + { + if (!$this->hasDijitParam('editActionInterval')) { + $this->setEditActionInterval(3); + } + return $this->getDijitParam('editActionInterval'); + } + + /** + * Set focus on load flag + * + * @param bool $flag + * @return Zend_Dojo_Form_Element_Editor + */ + public function setFocusOnLoad($flag) + { + return $this->setDijitParam('focusOnLoad', (bool) $flag); + } + + /** + * Retrieve focus on load flag + * + * @return bool + */ + public function getFocusOnLoad() + { + if (!$this->hasDijitParam('focusOnLoad')) { + return false; + } + return $this->getDijitParam('focusOnLoad'); + } + + /** + * Set editor height + * + * @param string|int $height + * @return Zend_Dojo_Form_Element_Editor + */ + public function setHeight($height) + { + if (!preg_match('/^\d+(em|px|%)?$/i', $height)) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception('Invalid height provided; must be integer or CSS measurement'); + } + if (!preg_match('/(em|px|%)$/', $height)) { + $height .= 'px'; + } + return $this->setDijitParam('height', $height); + } + + /** + * Retrieve height + * + * @return string + */ + public function getHeight() + { + if (!$this->hasDijitParam('height')) { + return '300px'; + } + return $this->getDijitParam('height'); + } + + /** + * Set whether or not to inherit parent's width + * + * @param bool $flag + * @return Zend_Dojo_Form_Element_Editor + */ + public function setInheritWidth($flag) + { + return $this->setDijitParam('inheritWidth', (bool) $flag); + } + + /** + * Whether or not to inherit the parent's width + * + * @return bool + */ + public function getInheritWidth() + { + if (!$this->hasDijitParam('inheritWidth')) { + return false; + } + return $this->getDijitParam('inheritWidth'); + } + + /** + * Set minimum height of editor + * + * @param string|int $minHeight + * @return Zend_Dojo_Form_Element_Editor + */ + public function setMinHeight($minHeight) + { + if (!preg_match('/^\d+(em)?$/i', $minHeight)) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception('Invalid minHeight provided; must be integer or CSS measurement'); + } + if ('em' != substr($minHeight, -2)) { + $minHeight .= 'em'; + } + return $this->setDijitParam('minHeight', $minHeight); + } + + /** + * Get minimum height of editor + * + * @return string + */ + public function getMinHeight() + { + if (!$this->hasDijitParam('minHeight')) { + return '1em'; + } + return $this->getDijitParam('minHeight'); + } + + /** + * Add a custom stylesheet + * + * @param string $styleSheet + * @return Zend_Dojo_Form_Element_Editor + */ + public function addStyleSheet($styleSheet) + { + $stylesheets = $this->getStyleSheets(); + if (strstr($stylesheets, ';')) { + $stylesheets = explode(';', $stylesheets); + } elseif (!empty($stylesheets)) { + $stylesheets = (array) $stylesheets; + } else { + $stylesheets = array(); + } + if (!in_array($styleSheet, $stylesheets)) { + $stylesheets[] = (string) $styleSheet; + } + return $this->setDijitParam('styleSheets', implode(';', $stylesheets)); + } + + /** + * Add multiple custom stylesheets + * + * @param array $styleSheets + * @return Zend_Dojo_Form_Element_Editor + */ + public function addStyleSheets(array $styleSheets) + { + foreach ($styleSheets as $styleSheet) { + $this->addStyleSheet($styleSheet); + } + return $this; + } + + /** + * Overwrite all stylesheets + * + * @param array $styleSheets + * @return Zend_Dojo_Form_Element_Editor + */ + public function setStyleSheets(array $styleSheets) + { + $this->clearStyleSheets(); + return $this->addStyleSheets($styleSheets); + } + + /** + * Get all stylesheets + * + * @return string + */ + public function getStyleSheets() + { + if (!$this->hasDijitParam('styleSheets')) { + return ''; + } + return $this->getDijitParam('styleSheets'); + } + + /** + * Is a given stylesheet registered? + * + * @param string $styleSheet + * @return bool + */ + public function hasStyleSheet($styleSheet) + { + $styleSheets = $this->getStyleSheets(); + $styleSheets = explode(';', $styleSheets); + return in_array($styleSheet, $styleSheets); + } + + /** + * Remove a single stylesheet + * + * @param string $styleSheet + * @return Zend_Dojo_Form_Element_Editor + */ + public function removeStyleSheet($styleSheet) + { + $styleSheets = $this->getStyleSheets(); + $styleSheets = explode(';', $styleSheets); + if (false !== ($index = array_search($styleSheet, $styleSheets))) { + unset($styleSheets[$index]); + $this->setDijitParam('styleSheets', implode(';', $styleSheets)); + } + return $this; + } + + /** + * Clear all stylesheets + * + * @return Zend_Dojo_Form_Element_Editor + */ + public function clearStyleSheets() + { + if ($this->hasDijitParam('styleSheets')) { + $this->removeDijitParam('styleSheets'); + } + return $this; + } + + /** + * Set update interval + * + * @param int $interval + * @return Zend_Dojo_Form_Element_Editor + */ + public function setUpdateInterval($interval) + { + return $this->setDijitParam('updateInterval', (int) $interval); + } + + /** + * Get update interval + * + * @return int + */ + public function getUpdateInterval() + { + if (!$this->hasDijitParam('updateInterval')) { + return 200; + } + return $this->getDijitParam('updateInterval'); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/FilteringSelect.php b/lib/zend/Zend/Dojo/Form/Element/FilteringSelect.php new file mode 100644 index 0000000000..2a70c44cb1 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/FilteringSelect.php @@ -0,0 +1,48 @@ +hasDijitParam('topDecoration')) { + return $this->getDijitParam('topDecoration'); + } + return array(); + } + + /** + * Set dijit to use with top decoration + * + * @param mixed $dijit + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setTopDecorationDijit($dijit) + { + $decoration = $this->getTopDecoration(); + $decoration['dijit'] = (string) $dijit; + $this->setDijitParam('topDecoration', $decoration); + return $this; + } + + /** + * Set container to use with top decoration + * + * @param mixed $container + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setTopDecorationContainer($container) + { + $decoration = $this->getTopDecoration(); + $decoration['container'] = (string) $container; + $this->setDijitParam('topDecoration', $decoration); + return $this; + } + + /** + * Set labels to use with top decoration + * + * @param array $labels + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setTopDecorationLabels(array $labels) + { + $decoration = $this->getTopDecoration(); + $decoration['labels'] = array_values($labels); + $this->setDijitParam('topDecoration', $decoration); + return $this; + } + + /** + * Set params to use with top decoration + * + * @param array $params + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setTopDecorationParams(array $params) + { + $decoration = $this->getTopDecoration(); + $decoration['params'] = $params; + $this->setDijitParam('topDecoration', $decoration); + return $this; + } + + /** + * Set attribs to use with top decoration + * + * @param array $attribs + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setTopDecorationAttribs(array $attribs) + { + $decoration = $this->getTopDecoration(); + $decoration['attribs'] = $attribs; + $this->setDijitParam('topDecoration', $decoration); + return $this; + } + + /** + * Get bottom decoration data + * + * @return array + */ + public function getBottomDecoration() + { + if ($this->hasDijitParam('bottomDecoration')) { + return $this->getDijitParam('bottomDecoration'); + } + return array(); + } + + /** + * Set dijit to use with bottom decoration + * + * @param mixed $dijit + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setBottomDecorationDijit($dijit) + { + $decoration = $this->getBottomDecoration(); + $decoration['dijit'] = (string) $dijit; + $this->setDijitParam('bottomDecoration', $decoration); + return $this; + } + + /** + * Set container to use with bottom decoration + * + * @param mixed $container + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setBottomDecorationContainer($container) + { + $decoration = $this->getBottomDecoration(); + $decoration['container'] = (string) $container; + $this->setDijitParam('bottomDecoration', $decoration); + return $this; + } + + /** + * Set labels to use with bottom decoration + * + * @param array $labels + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setBottomDecorationLabels(array $labels) + { + $decoration = $this->getBottomDecoration(); + $decoration['labels'] = array_values($labels); + $this->setDijitParam('bottomDecoration', $decoration); + return $this; + } + + /** + * Set params to use with bottom decoration + * + * @param array $params + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setBottomDecorationParams(array $params) + { + $decoration = $this->getBottomDecoration(); + $decoration['params'] = $params; + $this->setDijitParam('bottomDecoration', $decoration); + return $this; + } + + /** + * Set attribs to use with bottom decoration + * + * @param array $attribs + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setBottomDecorationAttribs(array $attribs) + { + $decoration = $this->getBottomDecoration(); + $decoration['attribs'] = $attribs; + $this->setDijitParam('bottomDecoration', $decoration); + return $this; + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/NumberSpinner.php b/lib/zend/Zend/Dojo/Form/Element/NumberSpinner.php new file mode 100644 index 0000000000..5cb4c2c7bc --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/NumberSpinner.php @@ -0,0 +1,245 @@ +setDijitParam('defaultTimeout', (int) $timeout); + return $this; + } + + /** + * Retrieve defaultTimeout + * + * @return int|null + */ + public function getDefaultTimeout() + { + return $this->getDijitParam('defaultTimeout'); + } + + /** + * Set timeoutChangeRate + * + * @param int $rate + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setTimeoutChangeRate($rate) + { + $this->setDijitParam('timeoutChangeRate', (int) $rate); + return $this; + } + + /** + * Retrieve timeoutChangeRate + * + * @return int|null + */ + public function getTimeoutChangeRate() + { + return $this->getDijitParam('timeoutChangeRate'); + } + + /** + * Set largeDelta + * + * @param int $delta + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setLargeDelta($delta) + { + $this->setDijitParam('largeDelta', (int) $delta); + return $this; + } + + /** + * Retrieve largeDelta + * + * @return int|null + */ + public function getLargeDelta() + { + return $this->getDijitParam('largeDelta'); + } + + /** + * Set smallDelta + * + * @param int $delta + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setSmallDelta($delta) + { + $this->setDijitParam('smallDelta', (int) $delta); + return $this; + } + + /** + * Retrieve smallDelta + * + * @return int|null + */ + public function getSmallDelta() + { + return $this->getDijitParam('smallDelta'); + } + + /** + * Set intermediateChanges flag + * + * @param bool $flag + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setIntermediateChanges($flag) + { + $this->setDijitParam('intermediateChanges', (bool) $flag); + return $this; + } + + /** + * Retrieve intermediateChanges flag + * + * @return bool + */ + public function getIntermediateChanges() + { + if (!$this->hasDijitParam('intermediateChanges')) { + return false; + } + return $this->getDijitParam('intermediateChanges'); + } + + /** + * Set rangeMessage + * + * @param string $message + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setRangeMessage($message) + { + $this->setDijitParam('rangeMessage', (string) $message); + return $this; + } + + /** + * Retrieve rangeMessage + * + * @return string|null + */ + public function getRangeMessage() + { + return $this->getDijitParam('rangeMessage'); + } + + /** + * Set minimum value + * + * @param int $value + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setMin($value) + { + $constraints = array(); + if ($this->hasDijitParam('constraints')) { + $constraints = $this->getDijitParam('constraints'); + } + $constraints['min'] = (int) $value; + $this->setDijitParam('constraints', $constraints); + return $this; + } + + /** + * Get minimum value + * + * @return null|int + */ + public function getMin() + { + if (!$this->hasDijitParam('constraints')) { + return null; + } + $constraints = $this->getDijitParam('constraints'); + if (!array_key_exists('min', $constraints)) { + return null; + } + return $constraints['min']; + } + + /** + * Set maximum value + * + * @param int $value + * @return Zend_Dojo_Form_Element_NumberSpinner + */ + public function setMax($value) + { + $constraints = array(); + if ($this->hasDijitParam('constraints')) { + $constraints = $this->getDijitParam('constraints'); + } + $constraints['max'] = (int) $value; + $this->setDijitParam('constraints', $constraints); + return $this; + } + + /** + * Get maximum value + * + * @return null|int + */ + public function getMax() + { + if (!$this->hasDijitParam('constraints')) { + return null; + } + $constraints = $this->getDijitParam('constraints'); + if (!array_key_exists('max', $constraints)) { + return null; + } + return $constraints['max']; + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/NumberTextBox.php b/lib/zend/Zend/Dojo/Form/Element/NumberTextBox.php new file mode 100644 index 0000000000..66ec1f0724 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/NumberTextBox.php @@ -0,0 +1,173 @@ +setConstraint('locale', (string) $locale); + return $this; + } + + /** + * Retrieve locale + * + * @return string|null + */ + public function getLocale() + { + return $this->getConstraint('locale'); + } + + /** + * Set numeric format pattern + * + * @param string $pattern + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setPattern($pattern) + { + $this->setConstraint('pattern', (string) $pattern); + return $this; + } + + /** + * Retrieve numeric format pattern + * + * @return string|null + */ + public function getPattern() + { + return $this->getConstraint('pattern'); + } + + /** + * Set numeric format type + * + * @see $_allowedTypes + * @param string $type + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setType($type) + { + $type = strtolower($type); + if (!in_array($type, $this->_allowedTypes)) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception(sprintf('Invalid numeric type "%s" specified', $type)); + } + + $this->setConstraint('type', $type); + return $this; + } + + /** + * Retrieve type + * + * @return string|null + */ + public function getType() + { + return $this->getConstraint('type'); + } + + /** + * Set decimal places + * + * @param int $places + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setPlaces($places) + { + $this->setConstraint('places', (int) $places); + return $this; + } + + /** + * Retrieve decimal places + * + * @return int|null + */ + public function getPlaces() + { + return $this->getConstraint('places'); + } + + /** + * Set strict flag + * + * @param bool $strict + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setStrict($flag) + { + $this->setConstraint('strict', (bool) $flag); + return $this; + } + + /** + * Retrieve strict flag + * + * @return bool + */ + public function getStrict() + { + if (!$this->hasConstraint('strict')) { + return false; + } + return ('true' == $this->getConstraint('strict')); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/PasswordTextBox.php b/lib/zend/Zend/Dojo/Form/Element/PasswordTextBox.php new file mode 100644 index 0000000000..0aed3b2d38 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/PasswordTextBox.php @@ -0,0 +1,42 @@ +setDijitParam('clickSelect', (bool) $flag); + return $this; + } + + /** + * Retrieve clickSelect flag + * + * @return bool + */ + public function getClickSelect() + { + if (!$this->hasDijitParam('clickSelect')) { + return false; + } + return $this->getDijitParam('clickSelect'); + } + + /** + * Set intermediateChanges flag + * + * @param bool $intermediateChanges + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setIntermediateChanges($flag) + { + $this->setDijitParam('intermediateChanges', (bool) $flag); + return $this; + } + + /** + * Retrieve intermediateChanges flag + * + * @return bool + */ + public function getIntermediateChanges() + { + if (!$this->hasDijitParam('intermediateChanges')) { + return false; + } + return $this->getDijitParam('intermediateChanges'); + } + + /** + * Set showButtons flag + * + * @param bool $showButtons + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setShowButtons($flag) + { + $this->setDijitParam('showButtons', (bool) $flag); + return $this; + } + + /** + * Retrieve showButtons flag + * + * @return bool + */ + public function getShowButtons() + { + if (!$this->hasDijitParam('showButtons')) { + return false; + } + return $this->getDijitParam('showButtons'); + } + + /** + * Set discreteValues + * + * @param int $value + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setDiscreteValues($value) + { + $this->setDijitParam('discreteValues', (int) $value); + return $this; + } + + /** + * Retrieve discreteValues + * + * @return int|null + */ + public function getDiscreteValues() + { + return $this->getDijitParam('discreteValues'); + } + + /** + * Set maximum + * + * @param int $value + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setMaximum($value) + { + $this->setDijitParam('maximum', (int) $value); + return $this; + } + + /** + * Retrieve maximum + * + * @return int|null + */ + public function getMaximum() + { + return $this->getDijitParam('maximum'); + } + + /** + * Set minimum + * + * @param int $value + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setMinimum($value) + { + $this->setDijitParam('minimum', (int) $value); + return $this; + } + + /** + * Retrieve minimum + * + * @return int|null + */ + public function getMinimum() + { + return $this->getDijitParam('minimum'); + } + + /** + * Set pageIncrement + * + * @param int $value + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setPageIncrement($value) + { + $this->setDijitParam('pageIncrement', (int) $value); + return $this; + } + + /** + * Retrieve pageIncrement + * + * @return int|null + */ + public function getPageIncrement() + { + return $this->getDijitParam('pageIncrement'); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/SubmitButton.php b/lib/zend/Zend/Dojo/Form/Element/SubmitButton.php new file mode 100644 index 0000000000..3816b39949 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/SubmitButton.php @@ -0,0 +1,42 @@ +setDijitParam('lowercase', (bool) $flag); + return $this; + } + + /** + * Retrieve lowercase flag + * + * @return bool + */ + public function getLowercase() + { + if (!$this->hasDijitParam('lowercase')) { + return false; + } + return $this->getDijitParam('lowercase'); + } + + /** + * Set propercase flag + * + * @param bool $propercase + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setPropercase($flag) + { + $this->setDijitParam('propercase', (bool) $flag); + return $this; + } + + /** + * Retrieve propercase flag + * + * @return bool + */ + public function getPropercase() + { + if (!$this->hasDijitParam('propercase')) { + return false; + } + return $this->getDijitParam('propercase'); + } + + /** + * Set uppercase flag + * + * @param bool $uppercase + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setUppercase($flag) + { + $this->setDijitParam('uppercase', (bool) $flag); + return $this; + } + + /** + * Retrieve uppercase flag + * + * @return bool + */ + public function getUppercase() + { + if (!$this->hasDijitParam('uppercase')) { + return false; + } + return $this->getDijitParam('uppercase'); + } + + /** + * Set trim flag + * + * @param bool $trim + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setTrim($flag) + { + $this->setDijitParam('trim', (bool) $flag); + return $this; + } + + /** + * Retrieve trim flag + * + * @return bool + */ + public function getTrim() + { + if (!$this->hasDijitParam('trim')) { + return false; + } + return $this->getDijitParam('trim'); + } + + /** + * Set maxLength + * + * @param int $length + * @return Zend_Dojo_Form_Element_TextBox + */ + public function setMaxLength($length) + { + $this->setDijitParam('maxLength', (int) $length); + return $this; + } + + /** + * Retrieve maxLength + * + * @return int|null + */ + public function getMaxLength() + { + return $this->getDijitParam('maxLength'); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/Textarea.php b/lib/zend/Zend/Dojo/Form/Element/Textarea.php new file mode 100644 index 0000000000..34cc494e4b --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/Textarea.php @@ -0,0 +1,42 @@ +setConstraint('timePattern', (string) $pattern); + return $this; + } + + /** + * Retrieve time format pattern + * + * @return string|null + */ + public function getTimePattern() + { + return $this->getConstraint('timePattern'); + } + + /** + * Set clickableIncrement + * + * @param string $format + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setClickableIncrement($format) + { + $format = (string) $format; + $this->_validateIso8601($format); + $this->setConstraint('clickableIncrement', $format); + return $this; + } + + /** + * Retrieve clickableIncrement + * + * @return string|null + */ + public function getClickableIncrement() + { + return $this->getConstraint('clickableIncrement'); + } + + /** + * Set visibleIncrement + * + * @param string $format + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setVisibleIncrement($format) + { + $format = (string) $format; + $this->_validateIso8601($format); + $this->setConstraint('visibleIncrement', $format); + return $this; + } + + /** + * Retrieve visibleIncrement + * + * @return string|null + */ + public function getVisibleIncrement() + { + return $this->getConstraint('visibleIncrement'); + } + + /** + * Set visibleRange + * + * @param string $format + * @return Zend_Dojo_Form_Element_NumberTextBox + */ + public function setVisibleRange($format) + { + $format = (string) $format; + $this->_validateIso8601($format); + $this->setConstraint('visibleRange', $format); + return $this; + } + + /** + * Retrieve visibleRange + * + * @return string|null + */ + public function getVisibleRange() + { + return $this->getConstraint('visibleRange'); + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/ValidationTextBox.php b/lib/zend/Zend/Dojo/Form/Element/ValidationTextBox.php new file mode 100644 index 0000000000..005078c5fd --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/ValidationTextBox.php @@ -0,0 +1,218 @@ +setDijitParam('invalidMessage', (string) $message); + return $this; + } + + /** + * Retrieve invalidMessage + * + * @return string|null + */ + public function getInvalidMessage() + { + return $this->getDijitParam('invalidMessage'); + } + + /** + * Set promptMessage + * + * @param string $message + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function setPromptMessage($message) + { + $this->setDijitParam('promptMessage', (string) $message); + return $this; + } + + /** + * Retrieve promptMessage + * + * @return string|null + */ + public function getPromptMessage() + { + return $this->getDijitParam('promptMessage'); + } + + /** + * Set regExp + * + * @param string $regexp + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function setRegExp($regexp) + { + $this->setDijitParam('regExp', (string) $regexp); + return $this; + } + + /** + * Retrieve regExp + * + * @return string|null + */ + public function getRegExp() + { + return $this->getDijitParam('regExp'); + } + + /** + * Set an individual constraint + * + * @param string $key + * @param mixed $value + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function setConstraint($key, $value) + { + $constraints = $this->getConstraints(); + $constraints[(string) $key] = $value; + $this->setConstraints($constraints); + return $this; + } + + /** + * Set validation constraints + * + * Refer to Dojo dijit.form.ValidationTextBox documentation for valid + * structure. + * + * @param array $constraints + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function setConstraints(array $constraints) + { + array_walk_recursive($constraints, array($this, '_castBoolToString')); + $this->setDijitParam('constraints', $constraints); + return $this; + } + + /** + * Is the given constraint set? + * + * @param string $key + * @return bool + */ + public function hasConstraint($key) + { + $constraints = $this->getConstraints(); + return array_key_exists((string)$key, $constraints); + } + + /** + * Get an individual constraint + * + * @param string $key + * @return mixed + */ + public function getConstraint($key) + { + $key = (string) $key; + if (!$this->hasConstraint($key)) { + return null; + } + return $this->dijitParams['constraints'][$key]; + } + + /** + * Get constraints + * + * @return array + */ + public function getConstraints() + { + if ($this->hasDijitParam('constraints')) { + return $this->getDijitParam('constraints'); + } + return array(); + } + + /** + * Remove a single constraint + * + * @param string $key + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function removeConstraint($key) + { + $key = (string) $key; + if ($this->hasConstraint($key)) { + unset($this->dijitParams['constraints'][$key]); + } + return $this; + } + + /** + * Clear all constraints + * + * @return Zend_Dojo_Form_Element_ValidationTextBox + */ + public function clearConstraints() + { + return $this->removeDijitParam('constraints'); + } + + /** + * Cast a boolean value to a string + * + * @param mixed $item + * @param string $key + * @return void + */ + protected function _castBoolToString(&$item, $key) + { + if (is_bool($item)) { + $item = ($item) ? 'true' : 'false'; + } + } +} diff --git a/lib/zend/Zend/Dojo/Form/Element/VerticalSlider.php b/lib/zend/Zend/Dojo/Form/Element/VerticalSlider.php new file mode 100644 index 0000000000..a971cb8e81 --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/Element/VerticalSlider.php @@ -0,0 +1,208 @@ +hasDijitParam('leftDecoration')) { + return $this->getDijitParam('leftDecoration'); + } + return array(); + } + + /** + * Set dijit to use with left decoration + * + * @param mixed $dijit + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setLeftDecorationDijit($dijit) + { + $decoration = $this->getLeftDecoration(); + $decoration['dijit'] = (string) $dijit; + $this->setDijitParam('leftDecoration', $decoration); + return $this; + } + + /** + * Set container to use with left decoration + * + * @param mixed $container + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setLeftDecorationContainer($container) + { + $decoration = $this->getLeftDecoration(); + $decoration['container'] = (string) $container; + $this->setDijitParam('leftDecoration', $decoration); + return $this; + } + + /** + * Set labels to use with left decoration + * + * @param array $labels + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setLeftDecorationLabels(array $labels) + { + $decoration = $this->getLeftDecoration(); + $decoration['labels'] = array_values($labels); + $this->setDijitParam('leftDecoration', $decoration); + return $this; + } + + /** + * Set params to use with left decoration + * + * @param array $params + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setLeftDecorationParams(array $params) + { + $decoration = $this->getLeftDecoration(); + $decoration['params'] = $params; + $this->setDijitParam('leftDecoration', $decoration); + return $this; + } + + /** + * Set attribs to use with left decoration + * + * @param array $attribs + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setLeftDecorationAttribs(array $attribs) + { + $decoration = $this->getLeftDecoration(); + $decoration['attribs'] = $attribs; + $this->setDijitParam('leftDecoration', $decoration); + return $this; + } + + /** + * Get right decoration data + * + * @return array + */ + public function getRightDecoration() + { + if ($this->hasDijitParam('rightDecoration')) { + return $this->getDijitParam('rightDecoration'); + } + return array(); + } + + /** + * Set dijit to use with right decoration + * + * @param mixed $dijit + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setRightDecorationDijit($dijit) + { + $decoration = $this->getRightDecoration(); + $decoration['dijit'] = (string) $dijit; + $this->setDijitParam('rightDecoration', $decoration); + return $this; + } + + /** + * Set container to use with right decoration + * + * @param mixed $container + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setRightDecorationContainer($container) + { + $decoration = $this->getRightDecoration(); + $decoration['container'] = (string) $container; + $this->setDijitParam('rightDecoration', $decoration); + return $this; + } + + /** + * Set labels to use with right decoration + * + * @param array $labels + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setRightDecorationLabels(array $labels) + { + $decoration = $this->getRightDecoration(); + $decoration['labels'] = array_values($labels); + $this->setDijitParam('rightDecoration', $decoration); + return $this; + } + + /** + * Set params to use with right decoration + * + * @param array $params + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setRightDecorationParams(array $params) + { + $decoration = $this->getRightDecoration(); + $decoration['params'] = $params; + $this->setDijitParam('rightDecoration', $decoration); + return $this; + } + + /** + * Set attribs to use with right decoration + * + * @param array $attribs + * @return Zend_Dojo_Form_Element_HorizontalSlider + */ + public function setRightDecorationAttribs(array $attribs) + { + $decoration = $this->getRightDecoration(); + $decoration['attribs'] = $attribs; + $this->setDijitParam('rightDecoration', $decoration); + return $this; + } +} diff --git a/lib/zend/Zend/Dojo/Form/SubForm.php b/lib/zend/Zend/Dojo/Form/SubForm.php new file mode 100644 index 0000000000..19b99962fb --- /dev/null +++ b/lib/zend/Zend/Dojo/Form/SubForm.php @@ -0,0 +1,94 @@ +addPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator') + ->addPrefixPath('Zend_Dojo_Form_Element', 'Zend/Dojo/Form/Element', 'element') + ->addElementPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator', 'decorator') + ->addDisplayGroupPrefixPath('Zend_Dojo_Form_Decorator', 'Zend/Dojo/Form/Decorator') + ->setDefaultDisplayGroupClass('Zend_Dojo_Form_DisplayGroup'); + parent::__construct($options); + } + + /** + * Load the default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('FormElements') + ->addDecorator('HtmlTag', array('tag' => 'dl')) + ->addDecorator('ContentPane'); + } + } + + /** + * Get view + * + * @return Zend_View_Interface + */ + public function getView() + { + $view = parent::getView(); + if (!$this->_dojoViewPathRegistered) { + if (false === $view->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) { + $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper'); + } + $this->_dojoViewPathRegistered = true; + } + return $view; + } +} diff --git a/lib/zend/Zend/Dojo/View/Exception.php b/lib/zend/Zend/Dojo/View/Exception.php new file mode 100644 index 0000000000..88ed680c6f --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Exception.php @@ -0,0 +1,37 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/AccordionPane.php b/lib/zend/Zend/Dojo/View/Helper/AccordionPane.php new file mode 100644 index 0000000000..6815317777 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/AccordionPane.php @@ -0,0 +1,66 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/BorderContainer.php b/lib/zend/Zend/Dojo/View/Helper/BorderContainer.php new file mode 100644 index 0000000000..d8eea86214 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/BorderContainer.php @@ -0,0 +1,79 @@ +_styleIsRegistered) { + $this->view->headStyle()->appendStyle('html, body { height: 100%; width: 100%; margin: 0; padding: 0; }'); + $this->_styleIsRegistered = true; + } + + // and now we create it: + return $this->_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/Button.php b/lib/zend/Zend/Dojo/View/Helper/Button.php new file mode 100644 index 0000000000..bbe8fb5c51 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/Button.php @@ -0,0 +1,68 @@ +_prepareDijit($attribs, $params, 'element'); + + return $this->view->formButton($id, $value, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/CheckBox.php b/lib/zend/Zend/Dojo/View/Helper/CheckBox.php new file mode 100644 index 0000000000..f7b7139ba6 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/CheckBox.php @@ -0,0 +1,100 @@ +_prepareDijit($attribs, $params, 'element'); + + // strip options so they don't show up in markup + if (array_key_exists('options', $attribs)) { + unset($attribs['options']); + } + + // and now we create it: + $html = ''; + if (!strstr($id, '[]')) { + // hidden element for unchecked value + $html .= $this->_renderHiddenElement($id, $checkboxInfo['uncheckedValue']); + } + + // and final element + $html .= $this->_createFormElement($id, $checkboxInfo['checkedValue'], $params, $attribs); + + return $html; + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/ComboBox.php b/lib/zend/Zend/Dojo/View/Helper/ComboBox.php new file mode 100644 index 0000000000..f853714c95 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/ComboBox.php @@ -0,0 +1,158 @@ +_renderStore($params['store'], $id))) { + $params['store'] = $params['store']['store']; + if ($this->_useProgrammatic()) { + unset($params['store']); + } + if (is_string($store)) { + $html .= $store; + } + $html .= $this->_createFormElement($id, $value, $params, $attribs); + return $html; + } + unset($params['store']); + } elseif (array_key_exists('store', $params)) { + if (array_key_exists('storeType', $params)) { + $storeParams = array( + 'store' => $params['store'], + 'type' => $params['storeType'], + ); + unset($params['storeType']); + if (array_key_exists('storeParams', $params)) { + $storeParams['params'] = $params['storeParams']; + unset($params['storeParams']); + } + if (false !== ($store = $this->_renderStore($storeParams, $id))) { + if (is_string($store)) { + $html .= $store; + } + } + } + if ($this->_useProgrammatic()) { + unset($params['store']); + } + $html .= $this->_createFormElement($id, $value, $params, $attribs); + return $html; + } + + // do as normal select + $attribs = $this->_prepareDijit($attribs, $params, 'element'); + return $this->view->formSelect($id, $value, $attribs, $options); + } + + /** + * Render data store element + * + * Renders to dojo view helper + * + * @param array $params + * @return string|false + */ + protected function _renderStore(array $params, $id) + { + if (!array_key_exists('store', $params) || !array_key_exists('type', $params)) { + return false; + } + + $this->dojo->requireModule($params['type']); + + $extraParams = array(); + $storeParams = array( + 'dojoType' => $params['type'], + 'jsId' => $params['store'], + ); + + if (array_key_exists('params', $params)) { + $storeParams = array_merge($storeParams, $params['params']); + $extraParams = $params['params']; + } + + if ($this->_useProgrammatic()) { + if (!$this->_useProgrammaticNoScript()) { + require_once 'Zend/Json.php'; + $js = 'var ' . $storeParams['jsId'] . ' = ' + . 'new ' . $storeParams['dojoType'] . '(' + . Zend_Json::encode($extraParams) + . ");\n" + . 'dijit.byId("' . $id . '").attr("store", ' + . $storeParams['jsId'] . ');'; + $js = "function() {\n$js\n}"; + $this->dojo->prependOnLoad($js); + } + return true; + } + + return '_htmlAttribs($storeParams) . '>'; + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/ContentPane.php b/lib/zend/Zend/Dojo/View/Helper/ContentPane.php new file mode 100644 index 0000000000..cbd231b211 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/ContentPane.php @@ -0,0 +1,66 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/CurrencyTextBox.php b/lib/zend/Zend/Dojo/View/Helper/CurrencyTextBox.php new file mode 100644 index 0000000000..bb092828db --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/CurrencyTextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/CustomDijit.php b/lib/zend/Zend/Dojo/View/Helper/CustomDijit.php new file mode 100644 index 0000000000..833b105826 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/CustomDijit.php @@ -0,0 +1,107 @@ +_defaultDojoType) + ) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('No dojoType specified; cannot create dijit'); + } elseif (array_key_exists('dojoType', $params)) { + $this->_dijit = $params['dojoType']; + $this->_module = $params['dojoType']; + unset($params['dojoType']); + } else { + $this->_dijit = $this->_defaultDojoType; + $this->_module = $this->_defaultDojoType; + } + + return $this->_createLayoutContainer($id, $value, $params, $attribs); + } + + /** + * Begin capturing content. + * + * Requires that either the {@link $_defaultDojotype} property is set, or + * that you pass a value to the "dojoType" key of the $params argument. + * + * @param string $id + * @param array $params + * @param array $attribs + * @return void + */ + public function captureStart($id, array $params = array(), array $attribs = array()) + { + if (!array_key_exists('dojoType', $params) + && (null === $this->_defaultDojoType) + ) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('No dojoType specified; cannot create dijit'); + } elseif (array_key_exists('dojoType', $params)) { + $this->_dijit = $params['dojoType']; + $this->_module = $params['dojoType']; + unset($params['dojoType']); + } else { + $this->_dijit = $this->_defaultDojoType; + $this->_module = $this->_defaultDojoType; + } + + return parent::captureStart($id, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/DateTextBox.php b/lib/zend/Zend/Dojo/View/Helper/DateTextBox.php new file mode 100644 index 0000000000..b388b304cd --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/DateTextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/Dijit.php b/lib/zend/Zend/Dojo/View/Helper/Dijit.php new file mode 100644 index 0000000000..096a8b7382 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/Dijit.php @@ -0,0 +1,311 @@ +dojo = $this->view->dojo(); + $this->dojo->enable(); + return $this; + } + + /** + * Whether or not to use declarative dijit creation + * + * @return bool + */ + protected function _useDeclarative() + { + return Zend_Dojo_View_Helper_Dojo::useDeclarative(); + } + + /** + * Whether or not to use programmatic dijit creation + * + * @return bool + */ + protected function _useProgrammatic() + { + return Zend_Dojo_View_Helper_Dojo::useProgrammatic(); + } + + /** + * Whether or not to use programmatic dijit creation w/o script creation + * + * @return bool + */ + protected function _useProgrammaticNoScript() + { + return Zend_Dojo_View_Helper_Dojo::useProgrammaticNoScript(); + } + + /** + * Create a layout container + * + * @param int $id + * @param string $content + * @param array $params + * @param array $attribs + * @param string|null $dijit + * @return string + */ + protected function _createLayoutContainer($id, $content, array $params, array $attribs, $dijit = null) + { + $attribs['id'] = $id; + $attribs = $this->_prepareDijit($attribs, $params, 'layout', $dijit); + + $html = '_htmlAttribs($attribs) . '>' + . $content + . "\n"; + + return $html; + } + + /** + * Create HTML representation of a dijit form element + * + * @param string $id + * @param string $value + * @param array $params + * @param array $attribs + * @param string|null $dijit + * @return string + */ + public function _createFormElement($id, $value, array $params, array $attribs, $dijit = null) + { + if (!array_key_exists('id', $attribs)) { + $attribs['id'] = $id; + } + $attribs['name'] = $id; + $attribs['value'] = (string) $value; + $attribs['type'] = $this->_elementType; + + $attribs = $this->_prepareDijit($attribs, $params, 'element', $dijit); + + $html = '_htmlAttribs($attribs) + . $this->getClosingBracket(); + return $html; + } + + /** + * Merge attributes and parameters + * + * Also sets up requires + * + * @param array $attribs + * @param array $params + * @param string $type + * @param string $dijit Dijit type to use (otherwise, pull from $_dijit) + * @return array + */ + protected function _prepareDijit(array $attribs, array $params, $type, $dijit = null) + { + $this->dojo->requireModule($this->_module); + + switch ($type) { + case 'layout': + $stripParams = array('id'); + break; + case 'element': + $stripParams = array('id', 'name', 'value', 'type'); + foreach (array('checked', 'disabled', 'readonly') as $attrib) { + if (array_key_exists($attrib, $attribs)) { + if ($attribs[$attrib]) { + $attribs[$attrib] = $attrib; + } else { + unset($attribs[$attrib]); + } + } + } + break; + case 'textarea': + $stripParams = array('id', 'name', 'type'); + break; + default: + } + + foreach ($stripParams as $param) { + if (array_key_exists($param, $params)) { + unset($params[$param]); + } + } + + // Normalize constraints, if present + foreach ($this->_jsonParams as $param) { + if (array_key_exists($param, $params)) { + require_once 'Zend/Json.php'; + + if (is_array($params[$param])) { + $values = array(); + foreach ($params[$param] as $key => $value) { + if (!is_scalar($value)) { + continue; + } + $values[$key] = $value; + } + } elseif (is_string($params[$param])) { + $values = (array) $params[$param]; + } else { + $values = array(); + } + $values = Zend_Json::encode($values); + if ($this->_useDeclarative()) { + $values = str_replace('"', "'", $values); + } + $params[$param] = $values; + } + } + + $dijit = (null === $dijit) ? $this->_dijit : $dijit; + if ($this->_useDeclarative()) { + $attribs = array_merge($attribs, $params); + $attribs['dojoType'] = $dijit; + } elseif (!$this->_useProgrammaticNoScript()) { + $this->_createDijit($dijit, $attribs['id'], $params); + } + + return $attribs; + } + + /** + * Create a dijit programmatically + * + * @param string $dijit + * @param string $id + * @param array $params + * @return void + */ + protected function _createDijit($dijit, $id, array $params) + { + $params['dojoType'] = $dijit; + + array_walk_recursive($params, array($this, '_castBoolToString')); + + $this->dojo->setDijit($id, $params); + } + + /** + * Cast a boolean to a string value + * + * @param mixed $item + * @param string $key + * @return void + */ + protected function _castBoolToString(&$item, $key) + { + if (!is_bool($item)) { + return; + } + $item = ($item) ? "true" : "false"; + } + + /** + * Render a hidden element to hold a value + * + * @param string $id + * @param string|int|float $value + * @return string + */ + protected function _renderHiddenElement($id, $value) + { + $hiddenAttribs = array( + 'name' => $id, + 'value' => (string) $value, + 'type' => 'hidden', + ); + return '_htmlAttribs($hiddenAttribs) . $this->getClosingBracket(); + } + + /** + * Create JS function for retrieving parent form + * + * @return void + */ + protected function _createGetParentFormFunction() + { + $function =<<dojo->addJavascript($function); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/DijitContainer.php b/lib/zend/Zend/Dojo/View/Helper/DijitContainer.php new file mode 100644 index 0000000000..7c98f61d0f --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/DijitContainer.php @@ -0,0 +1,92 @@ +_captureLock)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception(sprintf('Lock already exists for id "%s"', $id)); + } + + $this->_captureLock[$id] = true; + $this->_captureInfo[$id] = array( + 'params' => $params, + 'attribs' => $attribs, + ); + + ob_start(); + return; + } + + /** + * Finish capturing content for layout container + * + * @param string $id + * @return string + */ + public function captureEnd($id) + { + if (!array_key_exists($id, $this->_captureLock)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception(sprintf('No capture lock exists for id "%s"; nothing to capture', $id)); + } + + $content = ob_get_clean(); + extract($this->_captureInfo[$id]); + unset($this->_captureLock[$id], $this->_captureInfo[$id]); + return $this->_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/Dojo.php b/lib/zend/Zend/Dojo/View/Helper/Dojo.php new file mode 100644 index 0000000000..d1d9e1ee87 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/Dojo.php @@ -0,0 +1,176 @@ +_container = $registry[__CLASS__]; + } + + /** + * Set view object + * + * @param Zend_Dojo_View_Interface $view + * @return void + */ + public function setView(Zend_View_Interface $view) + { + $this->view = $view; + $this->_container->setView($view); + } + + /** + * Return dojo container + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function dojo() + { + return $this->_container; + } + + /** + * Proxy to container methods + * + * @param string $method + * @param array $args + * @return mixed + * @throws Zend_Dojo_View_Exception For invalid method calls + */ + public function __call($method, $args) + { + if (!method_exists($this->_container, $method)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception(sprintf('Invalid method "%s" called on dojo view helper', $method)); + } + + return call_user_func_array(array($this->_container, $method), $args); + } + + /** + * Set whether or not dijits should be created declaratively + * + * @return void + */ + public static function setUseDeclarative() + { + self::$_useProgrammatic = false; + } + + /** + * Set whether or not dijits should be created programmatically + * + * Optionally, specifiy whether or not dijit helpers should generate the + * programmatic dojo. + * + * @param int $style + * @return void + */ + public static function setUseProgrammatic($style = self::PROGRAMMATIC_SCRIPT) + { + if (!in_array($style, array(self::PROGRAMMATIC_SCRIPT, self::PROGRAMMATIC_NOSCRIPT))) { + $style = self::PROGRAMMATIC_SCRIPT; + } + self::$_useProgrammatic = $style; + } + + /** + * Should dijits be created declaratively? + * + * @return bool + */ + public static function useDeclarative() + { + return (false === self::$_useProgrammatic); + } + + /** + * Should dijits be created programmatically? + * + * @return bool + */ + public static function useProgrammatic() + { + return (false !== self::$_useProgrammatic); + } + + /** + * Should dijits be created programmatically but without scripts? + * + * @return bool + */ + public static function useProgrammaticNoScript() + { + return (self::PROGRAMMATIC_NOSCRIPT === self::$_useProgrammatic); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/Dojo/Container.php b/lib/zend/Zend/Dojo/View/Helper/Dojo/Container.php new file mode 100644 index 0000000000..4c3943c679 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/Dojo/Container.php @@ -0,0 +1,1084 @@ +view = $view; + } + + /** + * Enable dojo + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function enable() + { + $this->_enabled = true; + return $this; + } + + /** + * Disable dojo + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function disable() + { + $this->_enabled = false; + return $this; + } + + /** + * Is dojo enabled? + * + * @return bool + */ + public function isEnabled() + { + return $this->_enabled; + } + + /** + * Specify a module to require + * + * @param string $module + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function requireModule($module) + { + if (!is_string($module) && !is_array($module)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('Invalid module name specified; must be a string or an array of strings'); + } + + $module = (array) $module; + + foreach ($module as $mod) { + if (!preg_match('/^[a-z][a-z0-9._-]+$/i', $mod)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception(sprintf('Module name specified, "%s", contains invalid characters', (string) $mod)); + } + + if (!in_array($mod, $this->_modules)) { + $this->_modules[] = $mod; + } + } + + return $this; + } + + /** + * Retrieve list of modules to require + * + * @return array + */ + public function getModules() + { + return $this->_modules; + } + + /** + * Register a module path + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function registerModulePath($module, $path) + { + $path = (string) $path; + if (!in_array($module, $this->_modulePaths)) { + $this->_modulePaths[$module] = $path; + } + + return $this; + } + + /** + * List registered module paths + * + * @return array + */ + public function getModulePaths() + { + return $this->_modulePaths; + } + + /** + * Add layer (custom build) path + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addLayer($path) + { + $path = (string) $path; + if (!in_array($path, $this->_layers)) { + $this->_layers[] = $path; + } + return $this; + } + + /** + * Get registered layers + * + * @return array + */ + public function getLayers() + { + return $this->_layers; + } + + /** + * Remove a registered layer + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function removeLayer($path) + { + $path = (string) $path; + $layers = array_flip($this->_layers); + if (array_key_exists($path, $layers)) { + unset($layers[$path]); + $this->_layers = array_keys($layers); + } + return $this; + } + + /** + * Clear all registered layers + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function clearLayers() + { + $this->_layers = array(); + return $this; + } + + /** + * Set CDN base path + * + * @param string $url + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setCdnBase($url) + { + $this->_cdnBase = (string) $url; + return $this; + } + + /** + * Return CDN base URL + * + * @return string + */ + public function getCdnBase() + { + return $this->_cdnBase; + } + + /** + * Use CDN, using version specified + * + * @param string $version + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setCdnVersion($version = null) + { + $this->enable(); + if (preg_match('/^[1-9]\.[0-9](\.[0-9])?$/', $version)) { + $this->_cdnVersion = $version; + } + return $this; + } + + /** + * Get CDN version + * + * @return string + */ + public function getCdnVersion() + { + return $this->_cdnVersion; + } + + /** + * Set CDN path to dojo (relative to CDN base + version) + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setCdnDojoPath($path) + { + $this->_cdnDojoPath = (string) $path; + return $this; + } + + /** + * Get CDN path to dojo (relative to CDN base + version) + * + * @return string + */ + public function getCdnDojoPath() + { + return $this->_cdnDojoPath; + } + + /** + * Are we using the CDN? + * + * @return bool + */ + public function useCdn() + { + return !$this->useLocalPath(); + } + + /** + * Set path to local dojo + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setLocalPath($path) + { + $this->enable(); + $this->_localPath = (string) $path; + return $this; + } + + /** + * Get local path to dojo + * + * @return string + */ + public function getLocalPath() + { + return $this->_localPath; + } + + /** + * Are we using a local path? + * + * @return bool + */ + public function useLocalPath() + { + return (null === $this->_localPath) ? false : true; + } + + /** + * Set Dojo configuration + * + * @param string $option + * @param mixed $value + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setDjConfig(array $config) + { + $this->_djConfig = $config; + return $this; + } + + /** + * Set Dojo configuration option + * + * @param string $option + * @param mixed $value + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setDjConfigOption($option, $value) + { + $option = (string) $option; + $this->_djConfig[$option] = $value; + return $this; + } + + /** + * Retrieve dojo configuration values + * + * @return array + */ + public function getDjConfig() + { + return $this->_djConfig; + } + + /** + * Get dojo configuration value + * + * @param string $option + * @param mixed $default + * @return mixed + */ + public function getDjConfigOption($option, $default = null) + { + $option = (string) $option; + if (array_key_exists($option, $this->_djConfig)) { + return $this->_djConfig[$option]; + } + return $default; + } + + /** + * Add a stylesheet by module name + * + * @param string $module + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addStylesheetModule($module) + { + if (!preg_match('/^[a-z0-9]+\.[a-z0-9_-]+(\.[a-z0-9_-]+)*$/i', $module)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('Invalid stylesheet module specified'); + } + if (in_array($module, $this->_stylesheetModules)) { + return $this; + } + $this->_stylesheetModules[] = $module; + return $this; + } + + /** + * Get all stylesheet modules currently registered + * + * @return array + */ + public function getStylesheetModules() + { + return $this->_stylesheetModules; + } + + /** + * Add a stylesheet + * + * @param string $path + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addStylesheet($path) + { + $path = (string) $path; + if (!in_array($path, $this->_stylesheets)) { + $this->_stylesheets[] = (string) $path; + } + return $this; + } + + /** + * Register the dojo.css stylesheet? + * + * With no arguments, returns the status of the flag; with arguments, sets + * the flag and returns the object. + * + * @param null|bool $flag + * @return Zend_Dojo_View_Helper_Dojo_Container|bool + */ + public function registerDojoStylesheet($flag = null) + { + if (null === $flag) { + return $this->_registerDojoStylesheet; + } + + $this->_registerDojoStylesheet = (bool) $flag; + return $this; + } + + /** + * Retrieve registered stylesheets + * + * @return array + */ + public function getStylesheets() + { + return $this->_stylesheets; + } + + /** + * Add a script to execute onLoad + * + * dojo.addOnLoad accepts: + * - function name + * - lambda + * + * @param string $callback Lambda + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addOnLoad($callback) + { + if (!in_array($callback, $this->_onLoadActions, true)) { + $this->_onLoadActions[] = $callback; + } + return $this; + } + + /** + * Prepend an onLoad event to the list of onLoad actions + * + * @param string $callback Lambda + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function prependOnLoad($callback) + { + if (!in_array($callback, $this->_onLoadActions, true)) { + array_unshift($this->_onLoadActions, $callback); + } + return $this; + } + + /** + * Retrieve all registered onLoad actions + * + * @return array + */ + public function getOnLoadActions() + { + return $this->_onLoadActions; + } + + /** + * Start capturing routines to run onLoad + * + * @return bool + */ + public function onLoadCaptureStart() + { + if ($this->_captureLock) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('Cannot nest onLoad captures'); + } + + $this->_captureLock = true; + ob_start(); + return; + } + + /** + * Stop capturing routines to run onLoad + * + * @return bool + */ + public function onLoadCaptureEnd() + { + $data = ob_get_clean(); + $this->_captureLock = false; + + $this->addOnLoad($data); + return true; + } + + /** + * Add a programmatic dijit + * + * @param string $id + * @param array $params + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addDijit($id, array $params) + { + if (array_key_exists($id, $this->_dijits)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception(sprintf('Duplicate dijit with id "%s" already registered', $id)); + } + + $this->_dijits[$id] = array( + 'id' => $id, + 'params' => $params, + ); + + return $this; + } + + /** + * Set a programmatic dijit (overwrites) + * + * @param string $id + * @param array $params + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setDijit($id, array $params) + { + $this->removeDijit($id); + return $this->addDijit($id, $params); + } + + /** + * Add multiple dijits at once + * + * Expects an array of id => array $params pairs + * + * @param array $dijits + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addDijits(array $dijits) + { + foreach ($dijits as $id => $params) { + $this->addDijit($id, $params); + } + return $this; + } + + /** + * Set multiple dijits at once (overwrites) + * + * Expects an array of id => array $params pairs + * + * @param array $dijits + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function setDijits(array $dijits) + { + $this->clearDijits(); + return $this->addDijits($dijits); + } + + /** + * Is the given programmatic dijit already registered? + * + * @param string $id + * @return bool + */ + public function hasDijit($id) + { + return array_key_exists($id, $this->_dijits); + } + + /** + * Retrieve a dijit by id + * + * @param string $id + * @return array|null + */ + public function getDijit($id) + { + if ($this->hasDijit($id)) { + return $this->_dijits[$id]['params']; + } + return null; + } + + /** + * Retrieve all dijits + * + * Returns dijits as an array of assoc arrays + * + * @return array + */ + public function getDijits() + { + return array_values($this->_dijits); + } + + /** + * Remove a programmatic dijit if it exists + * + * @param string $id + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function removeDijit($id) + { + if (array_key_exists($id, $this->_dijits)) { + unset($this->_dijits[$id]); + } + + return $this; + } + + /** + * Clear all dijits + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function clearDijits() + { + $this->_dijits = array(); + return $this; + } + + /** + * Render dijits as JSON structure + * + * @return string + */ + public function dijitsToJson() + { + require_once 'Zend/Json.php'; + return Zend_Json::encode($this->getDijits()); + } + + /** + * Create dijit loader functionality + * + * @return void + */ + public function registerDijitLoader() + { + if (!$this->_dijitLoaderRegistered) { + $js =<<requireModule('dojo.parser'); + $this->prependOnLoad($js); + $this->addJavascript('var zendDijits = ' . $this->dijitsToJson() . ';'); + $this->_dijitLoaderRegistered = true; + } + } + + /** + * Add arbitrary javascript to execute in dojo JS container + * + * @param string $js + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function addJavascript($js) + { + $js = preg_replace('/^\s*(.*?)\s*$/s', '$1', $js); + if (!in_array(substr($js, -1), array(';', '}'))) { + $js .= ';'; + } + + if (in_array($js, $this->_javascriptStatements)) { + return $this; + } + + $this->_javascriptStatements[] = $js; + return $this; + } + + /** + * Return all registered javascript statements + * + * @return array + */ + public function getJavascript() + { + return $this->_javascriptStatements; + } + + /** + * Clear arbitrary javascript stack + * + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function clearJavascript() + { + $this->_javascriptStatements = array(); + return $this; + } + + /** + * Capture arbitrary javascript to include in dojo script + * + * @return void + */ + public function javascriptCaptureStart() + { + if ($this->_captureLock) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('Cannot nest captures'); + } + + $this->_captureLock = true; + ob_start(); + return; + } + + /** + * Finish capturing arbitrary javascript to include in dojo script + * + * @return true + */ + public function javascriptCaptureEnd() + { + $data = ob_get_clean(); + $this->_captureLock = false; + + $this->addJavascript($data); + return true; + } + + /** + * String representation of dojo environment + * + * @return string + */ + public function __toString() + { + if (!$this->isEnabled()) { + return ''; + } + + $this->_isXhtml = $this->view->doctype()->isXhtml(); + + if (Zend_Dojo_View_Helper_Dojo::useDeclarative()) { + if (null === $this->getDjConfigOption('parseOnLoad')) { + $this->setDjConfigOption('parseOnLoad', true); + } + } + + if (!empty($this->_dijits)) { + $this->registerDijitLoader(); + } + + $html = $this->_renderStylesheets() . PHP_EOL + . $this->_renderDjConfig() . PHP_EOL + . $this->_renderDojoScriptTag() . PHP_EOL + . $this->_renderLayers() . PHP_EOL + . $this->_renderExtras(); + return $html; + } + + /** + * Retrieve local path to dojo resources for building relative paths + * + * @return string + */ + protected function _getLocalRelativePath() + { + if (null === $this->_localRelativePath) { + $localPath = $this->getLocalPath(); + $localPath = preg_replace('|[/\\\\]dojo[/\\\\]dojo.js[^/\\\\]*$|i', '', $localPath); + $this->_localRelativePath = $localPath; + } + return $this->_localRelativePath; + } + + /** + * Render dojo stylesheets + * + * @return string + */ + protected function _renderStylesheets() + { + if ($this->useCdn()) { + $base = $this->getCdnBase() + . $this->getCdnVersion(); + } else { + $base = $this->_getLocalRelativePath(); + } + + $registeredStylesheets = $this->getStylesheetModules(); + foreach ($registeredStylesheets as $stylesheet) { + $themeName = substr($stylesheet, strrpos($stylesheet, '.') + 1); + $stylesheet = str_replace('.', '/', $stylesheet); + $stylesheets[] = $base . '/' . $stylesheet . '/' . $themeName . '.css'; + } + + foreach ($this->getStylesheets() as $stylesheet) { + $stylesheets[] = $stylesheet; + } + + if ($this->_registerDojoStylesheet) { + $stylesheets[] = $base . '/dojo/resources/dojo.css'; + } + + if (empty($stylesheets)) { + return ''; + } + + array_reverse($stylesheets); + $style = ''; + + return $style; + } + + /** + * Render DjConfig values + * + * @return string + */ + protected function _renderDjConfig() + { + $djConfigValues = $this->getDjConfig(); + if (empty($djConfigValues)) { + return ''; + } + + require_once 'Zend/Json.php'; + $scriptTag = ''; + + return $scriptTag; + } + + /** + * Render dojo script tag + * + * Renders Dojo script tag by utilizing either local path provided or the + * CDN. If any djConfig values were set, they will be serialized and passed + * with that attribute. + * + * @return string + */ + protected function _renderDojoScriptTag() + { + if ($this->useCdn()) { + $source = $this->getCdnBase() + . $this->getCdnVersion() + . $this->getCdnDojoPath(); + } else { + $source = $this->getLocalPath(); + } + + $scriptTag = ''; + return $scriptTag; + } + + /** + * Render layers (custom builds) as script tags + * + * @return string + */ + protected function _renderLayers() + { + $layers = $this->getLayers(); + if (empty($layers)) { + return ''; + } + + $html = array(); + foreach ($layers as $path) { + $html[] = sprintf( + '', + htmlentities($path, ENT_QUOTES) + ); + } + + return implode("\n", $html); + } + + /** + * Render dojo module paths and requires + * + * @return string + */ + protected function _renderExtras() + { + $js = array(); + $modulePaths = $this->getModulePaths(); + if (!empty($modulePaths)) { + foreach ($modulePaths as $module => $path) { + $js[] = 'dojo.registerModulePath("' . $this->view->escape($module) . '", "' . $this->view->escape($path) . '");'; + } + } + + $modules = $this->getModules(); + if (!empty($modules)) { + foreach ($modules as $module) { + $js[] = 'dojo.require("' . $this->view->escape($module) . '");'; + } + } + + $onLoadActions = array(); + foreach ($this->getOnLoadActions() as $callback) { + $onLoadActions[] = 'dojo.addOnLoad(' . $callback . ');'; + } + + $javascript = implode("\n ", $this->getJavascript()); + + $content = ''; + if (!empty($js)) { + $content .= implode("\n ", $js) . "\n"; + } + + if (!empty($onLoadActions)) { + $content .= implode("\n ", $onLoadActions) . "\n"; + } + + if (!empty($javascript)) { + $content .= $javascript . "\n"; + } + + if (preg_match('/^\s*$/s', $content)) { + return ''; + } + + $html = ''; + return $html; + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/Editor.php b/lib/zend/Zend/Dojo/View/Helper/Editor.php new file mode 100644 index 0000000000..5444c6364c --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/Editor.php @@ -0,0 +1,132 @@ +_normalizeId($hiddenId); + + $textareaName = $this->_normalizeEditorName($hiddenName); + $textareaId = $hiddenId . '-Editor'; + + $hiddenAttribs = array( + 'id' => $hiddenId, + 'name' => $hiddenName, + 'value' => $value, + 'type' => 'hidden', + ); + $attribs['id'] = $textareaId; + + $this->_createGetParentFormFunction(); + $this->_createEditorOnSubmit($hiddenId, $textareaId); + + $html = '_htmlAttribs($hiddenAttribs) . $this->getClosingBracket() + . $this->textarea($textareaName, $value, $params, $attribs); + + return $html; + } + + /** + * Normalize editor element name + * + * @param string $name + * @return string + */ + protected function _normalizeEditorName($name) + { + if ('[]' == substr($name, -2)) { + $name = substr($name, 0, strlen($name) - 2); + $name .= '[Editor][]'; + } else { + $name .= '[Editor]'; + } + return $name; + } + + /** + * Create onSubmit binding for element + * + * @param string $hiddenId + * @param string $editorId + * @return void + */ + protected function _createEditorOnSubmit($hiddenId, $editorId) + { + $this->dojo->onLoadCaptureStart(); + echo <<dojo->onLoadCaptureEnd(); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/FilteringSelect.php b/lib/zend/Zend/Dojo/View/Helper/FilteringSelect.php new file mode 100644 index 0000000000..4541c5f4c8 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/FilteringSelect.php @@ -0,0 +1,63 @@ +comboBox($id, $value, $params, $attribs, $options); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/Form.php b/lib/zend/Zend/Dojo/View/Helper/Form.php new file mode 100644 index 0000000000..174ead20f8 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/Form.php @@ -0,0 +1,96 @@ +_prepareDijit($attribs, array(), 'layout'); + + return $this->getFormHelper()->form($id, $attribs, $content); + } + + /** + * Get standard form helper + * + * @return Zend_View_Helper_Form + */ + public function getFormHelper() + { + if (null === $this->_helper) { + require_once 'Zend/View/Helper/Form.php'; + $this->_helper = new Zend_View_Helper_Form; + $this->_helper->setView($this->view); + } + return $this->_helper; + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/HorizontalSlider.php b/lib/zend/Zend/Dojo/View/Helper/HorizontalSlider.php new file mode 100644 index 0000000000..2fb6efcd5a --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/HorizontalSlider.php @@ -0,0 +1,62 @@ +prepareSlider($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/NumberSpinner.php b/lib/zend/Zend/Dojo/View/Helper/NumberSpinner.php new file mode 100644 index 0000000000..115d0a49a8 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/NumberSpinner.php @@ -0,0 +1,90 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/NumberTextBox.php b/lib/zend/Zend/Dojo/View/Helper/NumberTextBox.php new file mode 100644 index 0000000000..c1f7d3d1e4 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/NumberTextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/PasswordTextBox.php b/lib/zend/Zend/Dojo/View/Helper/PasswordTextBox.php new file mode 100644 index 0000000000..6d88111733 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/PasswordTextBox.php @@ -0,0 +1,56 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/RadioButton.php b/lib/zend/Zend/Dojo/View/Helper/RadioButton.php new file mode 100644 index 0000000000..9f89d1c6ec --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/RadioButton.php @@ -0,0 +1,89 @@ +\n" + ) { + $attribs['name'] = $id; + if (!array_key_exists('id', $attribs)) { + $attribs['id'] = $id; + } + $attribs = $this->_prepareDijit($attribs, $params, 'element'); + + if (is_array($options) && $this->_useProgrammatic() && !$this->_useProgrammaticNoScript()) { + $baseId = $id; + if (array_key_exists('id', $attribs)) { + $baseId = $attribs['id']; + } + require_once 'Zend/Filter/Alnum.php'; + $filter = new Zend_Filter_Alnum(); + foreach (array_keys($options) as $key) { + $optId = $baseId . '-' . $filter->filter($key); + $this->_createDijit($this->_dijit, $optId, array()); + } + } + + return $this->view->formRadio($id, $value, $attribs, $options, $listsep); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/SimpleTextarea.php b/lib/zend/Zend/Dojo/View/Helper/SimpleTextarea.php new file mode 100644 index 0000000000..eb5a3170b0 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/SimpleTextarea.php @@ -0,0 +1,78 @@ +_elementType; + + $attribs = $this->_prepareDijit($attribs, $params, 'textarea'); + + $html = '_htmlAttribs($attribs) . '>' + . $this->view->escape($value) + . "\n"; + + return $html; + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/Slider.php b/lib/zend/Zend/Dojo/View/Helper/Slider.php new file mode 100644 index 0000000000..06b4d6e9e8 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/Slider.php @@ -0,0 +1,251 @@ +_sliderType = strtolower($this->_sliderType); + + // Prepare two items: a hidden element to store the value, and the slider + $hidden = $this->_renderHiddenElement($id, $value); + $hidden = preg_replace('/(name=")([^"]*)"/', 'id="$2" $1$2"', $hidden); + + foreach ($this->_requiredParams as $param) { + if (!array_key_exists($param, $params)) { + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('prepareSlider() requires minimally the "minimum", "maximum", and "discreteValues" parameters'); + } + } + + $content = ''; + $params['value'] = $value; + + if (!array_key_exists('onChange', $attribs)) { + $attribs['onChange'] = "dojo.byId('" . $id . "').value = arguments[0];"; + } + + $id = str_replace('][', '-', $id); + $id = str_replace(array('[', ']'), '-', $id); + $id = rtrim($id, '-'); + $id .= '-slider'; + + switch ($this->_sliderType) { + case 'horizontal': + if (array_key_exists('topDecoration', $params)) { + $content .= $this->_prepareDecoration('topDecoration', $id, $params['topDecoration']); + unset($params['topDecoration']); + } + + if (array_key_exists('bottomDecoration', $params)) { + $content .= $this->_prepareDecoration('bottomDecoration', $id, $params['bottomDecoration']); + unset($params['bottomDecoration']); + } + + if (array_key_exists('leftDecoration', $params)) { + unset($params['leftDecoration']); + } + + if (array_key_exists('rightDecoration', $params)) { + unset($params['rightDecoration']); + } + break; + case 'vertical': + if (array_key_exists('leftDecoration', $params)) { + $content .= $this->_prepareDecoration('leftDecoration', $id, $params['leftDecoration']); + unset($params['leftDecoration']); + } + + if (array_key_exists('rightDecoration', $params)) { + $content .= $this->_prepareDecoration('rightDecoration', $id, $params['rightDecoration']); + unset($params['rightDecoration']); + } + + if (array_key_exists('topDecoration', $params)) { + unset($params['topDecoration']); + } + + if (array_key_exists('bottomDecoration', $params)) { + unset($params['bottomDecoration']); + } + break; + default: + require_once 'Zend/Dojo/View/Exception.php'; + throw new Zend_Dojo_View_Exception('Invalid slider type; slider must be horizontal or vertical'); + } + + return $hidden . $this->_createLayoutContainer($id, $content, $params, $attribs); + } + + /** + * Prepare slider decoration + * + * @param string $position + * @param string $id + * @param array $decInfo + * @return string + */ + protected function _prepareDecoration($position, $id, $decInfo) + { + if (!in_array($position, array('topDecoration', 'bottomDecoration', 'leftDecoration', 'rightDecoration'))) { + return ''; + } + + if (!is_array($decInfo) + || !array_key_exists('labels', $decInfo) + || !is_array($decInfo['labels']) + ) { + return ''; + } + + $id .= '-' . $position; + + if (!array_key_exists('dijit', $decInfo)) { + $dijit = 'dijit.form.' . ucfirst($this->_sliderType) . 'Rule'; + } else { + $dijit = $decInfo['dijit']; + if ('dijit.form.' != substr($dijit, 0, 10)) { + $dijit = 'dijit.form.' . $dijit; + } + } + + $params = array(); + $attribs = array(); + $labels = $decInfo['labels']; + if (array_key_exists('params', $decInfo)) { + $params = $decInfo['params']; + } + if (array_key_exists('attribs', $decInfo)) { + $attribs = $decInfo['attribs']; + } + + $containerParams = null; + if (array_key_exists('container', $params)) { + $containerParams = $params['container']; + unset($params['container']); + } + + if (array_key_exists('labels', $params)) { + $labelsParams = $params['labels']; + unset($params['labels']); + } else { + $labelsParams = $params; + } + + if (null === $containerParams) { + $containerParams = $params; + } + + $containerAttribs = null; + if (array_key_exists('container', $attribs)) { + $containerAttribs = $attribs['container']; + unset($attribs['container']); + } + + if (array_key_exists('labels', $attribs)) { + $labelsAttribs = $attribs['labels']; + unset($attribs['labels']); + } else { + $labelsAttribs = $attribs; + } + + if (null === $containerAttribs) { + $containerAttribs = $attribs; + } + + $containerParams['container'] = $position; + $labelsParams['container'] = $position; + + $labelList = $this->_prepareLabelsList($id, $labelsParams, $labelsAttribs, $labels); + + $dijit = 'dijit.form.' . ucfirst($this->_sliderType) . 'Rule'; + $containerAttribs['id'] = $id; + $containerAttribs = $this->_prepareDijit($containerAttribs, $containerParams, 'layout', $dijit); + $containerHtml = '_htmlAttribs($containerAttribs) . ">\n"; + + switch ($position) { + case 'topDecoration': + case 'leftDecoration': + return $labelList . $containerHtml; + case 'bottomDecoration': + case 'rightDecoration': + return $containerHtml . $labelList; + } + } + + /** + * Prepare slider label list + * + * @param string $id + * @param array $params + * @param array $attribs + * @param array $labels + * @return string + */ + protected function _prepareLabelsList($id, array $params, array $attribs, array $labels) + { + $attribs['id'] = $id . '-labels'; + $dijit = 'dijit.form.' . ucfirst($this->_sliderType) . 'RuleLabels'; + $attribs = $this->_prepareDijit($attribs, $params, 'layout', $dijit); + + return $this->view->htmlList($labels, true, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/SplitContainer.php b/lib/zend/Zend/Dojo/View/Helper/SplitContainer.php new file mode 100644 index 0000000000..e0b9d4f423 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/SplitContainer.php @@ -0,0 +1,66 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/StackContainer.php b/lib/zend/Zend/Dojo/View/Helper/StackContainer.php new file mode 100644 index 0000000000..13a6008e19 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/StackContainer.php @@ -0,0 +1,66 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/SubmitButton.php b/lib/zend/Zend/Dojo/View/Helper/SubmitButton.php new file mode 100644 index 0000000000..45e83927a4 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/SubmitButton.php @@ -0,0 +1,67 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/TabContainer.php b/lib/zend/Zend/Dojo/View/Helper/TabContainer.php new file mode 100644 index 0000000000..c19ae941f6 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/TabContainer.php @@ -0,0 +1,66 @@ +_createLayoutContainer($id, $content, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/TextBox.php b/lib/zend/Zend/Dojo/View/Helper/TextBox.php new file mode 100644 index 0000000000..1059677ef9 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/TextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/Textarea.php b/lib/zend/Zend/Dojo/View/Helper/Textarea.php new file mode 100644 index 0000000000..323e817076 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/Textarea.php @@ -0,0 +1,80 @@ +_elementType; + + $attribs = $this->_prepareDijit($attribs, $params, 'textarea'); + + $html = '_htmlAttribs($attribs) . '>' + . $value + . "\n"; + + return $html; + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/TimeTextBox.php b/lib/zend/Zend/Dojo/View/Helper/TimeTextBox.php new file mode 100644 index 0000000000..d156d54e43 --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/TimeTextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/ValidationTextBox.php b/lib/zend/Zend/Dojo/View/Helper/ValidationTextBox.php new file mode 100644 index 0000000000..5d8346582b --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/ValidationTextBox.php @@ -0,0 +1,68 @@ +_createFormElement($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dojo/View/Helper/VerticalSlider.php b/lib/zend/Zend/Dojo/View/Helper/VerticalSlider.php new file mode 100644 index 0000000000..ba8b155fab --- /dev/null +++ b/lib/zend/Zend/Dojo/View/Helper/VerticalSlider.php @@ -0,0 +1,62 @@ +prepareSlider($id, $value, $params, $attribs); + } +} diff --git a/lib/zend/Zend/Dom/Exception.php b/lib/zend/Zend/Dom/Exception.php new file mode 100644 index 0000000000..1cac3fba34 --- /dev/null +++ b/lib/zend/Zend/Dom/Exception.php @@ -0,0 +1,35 @@ +setDocument($document); + } + + /** + * Set document to query + * + * @param string $document + * @return Zend_Dom_Query + */ + public function setDocument($document) + { + if (0 === strlen($document)) { + return $this; + } + if ('setDocumentXml($document); + } + if (strstr($document, 'DTD XHTML')) { + return $this->setDocumentXhtml($document); + } + return $this->setDocumentHtml($document); + } + + /** + * Register HTML document + * + * @param string $document + * @return Zend_Dom_Query + */ + public function setDocumentHtml($document) + { + $this->_document = (string) $document; + $this->_docType = self::DOC_HTML; + return $this; + } + + /** + * Register XHTML document + * + * @param string $document + * @return Zend_Dom_Query + */ + public function setDocumentXhtml($document) + { + $this->_document = (string) $document; + $this->_docType = self::DOC_XHTML; + return $this; + } + + /** + * Register XML document + * + * @param string $document + * @return Zend_Dom_Query + */ + public function setDocumentXml($document) + { + $this->_document = (string) $document; + $this->_docType = self::DOC_XML; + return $this; + } + + /** + * Retrieve current document + * + * @return string + */ + public function getDocument() + { + return $this->_document; + } + + /** + * Get document type + * + * @return string + */ + public function getDocumentType() + { + return $this->_docType; + } + + /** + * Perform a CSS selector query + * + * @param string $query + * @return Zend_Dom_Query_Result + */ + public function query($query) + { + $xpathQuery = Zend_Dom_Query_Css2Xpath::transform($query); + return $this->queryXpath($xpathQuery, $query); + } + + /** + * Perform an XPath query + * + * @param string|array $xpathQuery + * @param string $query CSS selector query + * @return Zend_Dom_Query_Result + */ + public function queryXpath($xpathQuery, $query = null) + { + if (null === ($document = $this->getDocument())) { + require_once 'Zend/Dom/Exception.php'; + throw new Zend_Dom_Exception('Cannot query; no document registered'); + } + + $domDoc = new DOMDocument; + $type = $this->getDocumentType(); + switch ($type) { + case self::DOC_XML: + $success = @$domDoc->loadXML($document); + break; + case self::DOC_HTML: + case self::DOC_XHTML: + default: + $success = @$domDoc->loadHTML($document); + break; + } + + if (!$success) { + require_once 'Zend/Dom/Exception.php'; + throw new Zend_Dom_Exception(sprintf('Error parsing document (type == %s)', $type)); + } + + $nodeList = $this->_getNodeList($domDoc, $xpathQuery); + return new Zend_Dom_Query_Result($query, $xpathQuery, $domDoc, $nodeList); + } + + /** + * Prepare node list + * + * @param DOMDocument $document + * @param string|array $xpathQuery + * @return array + */ + protected function _getNodeList($document, $xpathQuery) + { + $xpath = new DOMXPath($document); + $xpathQuery = (string) $xpathQuery; + if (preg_match_all('|\[contains\((@[a-z0-9_-]+),\s?\' |i', $xpathQuery, $matches)) { + foreach ($matches[1] as $attribute) { + $queryString = '//*[' . $attribute . ']'; + $attributeName = substr($attribute, 1); + $nodes = $xpath->query($queryString); + foreach ($nodes as $node) { + $attr = $node->attributes->getNamedItem($attributeName); + $attr->value = ' ' . $attr->value . ' '; + } + } + } + return $xpath->query($xpathQuery); + } +} diff --git a/lib/zend/Zend/Dom/Query/Css2Xpath.php b/lib/zend/Zend/Dom/Query/Css2Xpath.php new file mode 100644 index 0000000000..ad5802aa3c --- /dev/null +++ b/lib/zend/Zend/Dom/Query/Css2Xpath.php @@ -0,0 +1,141 @@ + $segment) { + $pathSegment = self::_tokenize($segment); + if (0 == $key) { + if (0 === strpos($pathSegment, '[contains(@class')) { + $paths[0] .= '*' . $pathSegment; + } else { + $paths[0] .= $pathSegment; + } + continue; + } + if (0 === strpos($pathSegment, '[contains(@class')) { + foreach ($paths as $key => $xpath) { + $paths[$key] .= '//*' . $pathSegment; + $paths[] = $xpath . $pathSegment; + } + } else { + foreach ($paths as $key => $xpath) { + $paths[$key] .= '//' . $pathSegment; + } + } + } + + if (1 == count($paths)) { + return $paths[0]; + } + return implode(' | ', $paths); + } + + /** + * Tokenize CSS expressions to XPath + * + * @param string $expression + * @return string + */ + protected static function _tokenize($expression) + { + // Child selectors + $expression = str_replace('>', '/', $expression); + + // IDs + $expression = preg_replace('|#([a-z][a-z0-9_-]*)|i', '[@id=\'$1\']', $expression); + $expression = preg_replace('|(?_cssQuery = $cssQuery; + $this->_xpathQuery = $xpathQuery; + $this->_document = $document; + $this->_nodeList = $nodeList; + } + + /** + * Retrieve CSS Query + * + * @return string + */ + public function getCssQuery() + { + return $this->_cssQuery; + } + + /** + * Retrieve XPath query + * + * @return string + */ + public function getXpathQuery() + { + return $this->_xpathQuery; + } + + /** + * Retrieve DOMDocument + * + * @return DOMDocument + */ + public function getDocument() + { + return $this->_document; + } + + /** + * Iterator: rewind to first element + * + * @return void + */ + public function rewind() + { + $this->_position = 0; + return $this->_nodeList->item(0); + } + + /** + * Iterator: is current position valid? + * + * @return bool + */ + public function valid() + { + if (in_array($this->_position, range(0, $this->_nodeList->length - 1)) && $this->_nodeList->length > 0) { + return true; + } + return false; + } + + /** + * Iterator: return current element + * + * @return DOMElement + */ + public function current() + { + return $this->_nodeList->item($this->_position); + } + + /** + * Iterator: return key of current element + * + * @return int + */ + public function key() + { + return $this->_position; + } + + /** + * Iterator: move to next element + * + * @return void + */ + public function next() + { + ++$this->_position; + return $this->_nodeList->item($this->_position); + } + + /** + * Countable: get count + * + * @return int + */ + public function count() + { + return $this->_nodeList->length; + } +} diff --git a/lib/zend/Zend/Feed/Abstract.php b/lib/zend/Zend/Feed/Abstract.php new file mode 100644 index 0000000000..4c5be182af --- /dev/null +++ b/lib/zend/Zend/Feed/Abstract.php @@ -0,0 +1,259 @@ +setUri($uri); + $response = $client->request('GET'); + if ($response->getStatus() !== 200) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus()); + } + $this->_element = $response->getBody(); + $this->__wakeup(); + } elseif ($string !== null) { + // Retrieve the feed from $string + $this->_element = $string; + $this->__wakeup(); + } else { + // Generate the feed from the array + $header = $builder->getHeader(); + $this->_element = new DOMDocument('1.0', $header['charset']); + $root = $this->_mapFeedHeaders($header); + $this->_mapFeedEntries($root, $builder->getEntries()); + $this->_element = $root; + $this->_buildEntryCache(); + } + } + + + /** + * Load the feed as an XML DOMDocument object + * + * @return void + * @throws Zend_Feed_Exception + */ + public function __wakeup() + { + @ini_set('track_errors', 1); + $doc = new DOMDocument; + $status = @$doc->loadXML($this->_element); + @ini_restore('track_errors'); + + if (!$status) { + // prevent the class to generate an undefined variable notice (ZF-2590) + if (!isset($php_errormsg)) { + if (function_exists('xdebug_is_enabled')) { + $php_errormsg = '(error message not available, when XDebug is running)'; + } else { + $php_errormsg = '(error message not available)'; + } + } + + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + + $this->_element = $doc; + } + + + /** + * Prepare for serialiation + * + * @return array + */ + public function __sleep() + { + $this->_element = $this->saveXML(); + + return array('_element'); + } + + + /** + * Cache the individual feed elements so they don't need to be + * searched for on every operation. + * + * @return void + */ + protected function _buildEntryCache() + { + $this->_entries = array(); + foreach ($this->_element->childNodes as $child) { + if ($child->localName == $this->_entryElementName) { + $this->_entries[] = $child; + } + } + } + + + /** + * Get the number of entries in this feed object. + * + * @return integer Entry count. + */ + public function count() + { + return count($this->_entries); + } + + + /** + * Required by the Iterator interface. + * + * @return void + */ + public function rewind() + { + $this->_entryIndex = 0; + } + + + /** + * Required by the Iterator interface. + * + * @return mixed The current row, or null if no rows. + */ + public function current() + { + return new $this->_entryClassName( + null, + $this->_entries[$this->_entryIndex]); + } + + + /** + * Required by the Iterator interface. + * + * @return mixed The current row number (starts at 0), or NULL if no rows + */ + public function key() + { + return $this->_entryIndex; + } + + + /** + * Required by the Iterator interface. + * + * @return mixed The next row, or null if no more rows. + */ + public function next() + { + ++$this->_entryIndex; + } + + + /** + * Required by the Iterator interface. + * + * @return boolean Whether the iteration is valid + */ + public function valid() + { + return 0 <= $this->_entryIndex && $this->_entryIndex < $this->count(); + } + + /** + * Generate the header of the feed when working in write mode + * + * @param array $array the data to use + * @return DOMElement root node + */ + abstract protected function _mapFeedHeaders($array); + + /** + * Generate the entries of the feed when working in write mode + * + * @param DOMElement $root the root node to use + * @param array $array the data to use + * @return DOMElement root node + */ + abstract protected function _mapFeedEntries(DOMElement $root, $array); + + /** + * Send feed to a http client with the correct header + * + * @throws Zend_Feed_Exception if headers have already been sent + * @return void + */ + abstract public function send(); +} diff --git a/lib/zend/Zend/Feed/Atom.php b/lib/zend/Zend/Feed/Atom.php new file mode 100644 index 0000000000..a083bf2eb3 --- /dev/null +++ b/lib/zend/Zend/Feed/Atom.php @@ -0,0 +1,390 @@ + + * elements). + * + * @var string + */ + protected $_entryElementName = 'entry'; + + /** + * The default namespace for Atom feeds. + * + * @var string + */ + protected $_defaultNamespace = 'atom'; + + + /** + * Override Zend_Feed_Abstract to set up the $_element and $_entries aliases. + * + * @return void + * @throws Zend_Feed_Exception + */ + public function __wakeup() + { + parent::__wakeup(); + + // Find the base feed element and create an alias to it. + $element = $this->_element->getElementsByTagName('feed')->item(0); + if (!$element) { + // Try to find a single instead. + $element = $this->_element->getElementsByTagName($this->_entryElementName)->item(0); + if (!$element) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('No root or <' . $this->_entryElementName + . '> element found, cannot parse feed.'); + } + + $doc = new DOMDocument($this->_element->version, + $this->_element->actualEncoding); + $feed = $doc->appendChild($doc->createElement('feed')); + $feed->appendChild($doc->importNode($element, true)); + $element = $feed; + } + + $this->_element = $element; + + // Find the entries and save a pointer to them for speed and + // simplicity. + $this->_buildEntryCache(); + } + + + /** + * Easy access to tags keyed by "rel" attributes. + * + * If $elt->link() is called with no arguments, we will attempt to + * return the value of the tag(s) like all other + * method-syntax attribute access. If an argument is passed to + * link(), however, then we will return the "href" value of the + * first tag that has a "rel" attribute matching $rel: + * + * $elt->link(): returns the value of the link tag. + * $elt->link('self'): returns the href from the first in the entry. + * + * @param string $rel The "rel" attribute to look for. + * @return mixed + */ + public function link($rel = null) + { + if ($rel === null) { + return parent::__call('link', null); + } + + // index link tags by their "rel" attribute. + $links = parent::__get('link'); + if (!is_array($links)) { + if ($links instanceof Zend_Feed_Element) { + $links = array($links); + } else { + return $links; + } + } + + foreach ($links as $link) { + if (empty($link['rel'])) { + continue; + } + if ($rel == $link['rel']) { + return $link['href']; + } + } + + return null; + } + + + /** + * Make accessing some individual elements of the feed easier. + * + * Special accessors 'entry' and 'entries' are provided so that if + * you wish to iterate over an Atom feed's entries, you can do so + * using foreach ($feed->entries as $entry) or foreach + * ($feed->entry as $entry). + * + * @param string $var The property to access. + * @return mixed + */ + public function __get($var) + { + switch ($var) { + case 'entry': + // fall through to the next case + case 'entries': + return $this; + + default: + return parent::__get($var); + } + } + + /** + * Generate the header of the feed when working in write mode + * + * @param array $array the data to use + * @return DOMElement root node + */ + protected function _mapFeedHeaders($array) + { + $feed = $this->_element->createElement('feed'); + $feed->setAttribute('xmlns', 'http://www.w3.org/2005/Atom'); + + $id = $this->_element->createElement('id', $array->link); + $feed->appendChild($id); + + $title = $this->_element->createElement('title'); + $title->appendChild($this->_element->createCDATASection($array->title)); + $feed->appendChild($title); + + if (isset($array->author)) { + $author = $this->_element->createElement('author'); + $name = $this->_element->createElement('name', $array->author); + $author->appendChild($name); + if (isset($array->email)) { + $email = $this->_element->createElement('email', $array->email); + $author->appendChild($email); + } + $feed->appendChild($author); + } + + $updated = isset($array->lastUpdate) ? $array->lastUpdate : time(); + $updated = $this->_element->createElement('updated', date(DATE_ATOM, $updated)); + $feed->appendChild($updated); + + if (isset($array->published)) { + $published = $this->_element->createElement('published', date(DATE_ATOM, $array->published)); + $feed->appendChild($published); + } + + $link = $this->_element->createElement('link'); + $link->setAttribute('rel', 'self'); + $link->setAttribute('href', $array->link); + if (isset($array->language)) { + $link->setAttribute('hreflang', $array->language); + } + $feed->appendChild($link); + + if (isset($array->description)) { + $subtitle = $this->_element->createElement('subtitle'); + $subtitle->appendChild($this->_element->createCDATASection($array->description)); + $feed->appendChild($subtitle); + } + + if (isset($array->copyright)) { + $copyright = $this->_element->createElement('rights', $array->copyright); + $feed->appendChild($copyright); + } + + if (isset($array->image)) { + $image = $this->_element->createElement('logo', $array->image); + $feed->appendChild($image); + } + + $generator = !empty($array->generator) ? $array->generator : 'Zend_Feed'; + $generator = $this->_element->createElement('generator', $generator); + $feed->appendChild($generator); + + return $feed; + } + + /** + * Generate the entries of the feed when working in write mode + * + * The following nodes are constructed for each feed entry + * + * url to feed entry + * entry title + * last update + * + * short text + * long version, can contain html + * + * + * @param array $array the data to use + * @param DOMElement $root the root node to use + * @return void + */ + protected function _mapFeedEntries(DOMElement $root, $array) + { + foreach ($array as $dataentry) { + $entry = $this->_element->createElement('entry'); + + $id = $this->_element->createElement('id', isset($dataentry->guid) ? $dataentry->guid : $dataentry->link); + $entry->appendChild($id); + + $title = $this->_element->createElement('title'); + $title->appendChild($this->_element->createCDATASection($dataentry->title)); + $entry->appendChild($title); + + $updated = isset($dataentry->lastUpdate) ? $dataentry->lastUpdate : time(); + $updated = $this->_element->createElement('updated', date(DATE_ATOM, $updated)); + $entry->appendChild($updated); + + $link = $this->_element->createElement('link'); + $link->setAttribute('rel', 'alternate'); + $link->setAttribute('href', $dataentry->link); + $entry->appendChild($link); + + $summary = $this->_element->createElement('summary'); + $summary->appendChild($this->_element->createCDATASection($dataentry->description)); + $entry->appendChild($summary); + + if (isset($dataentry->content)) { + $content = $this->_element->createElement('content'); + $content->setAttribute('type', 'html'); + $content->appendChild($this->_element->createCDATASection($dataentry->content)); + $entry->appendChild($content); + } + + if (isset($dataentry->category)) { + foreach ($dataentry->category as $category) { + $node = $this->_element->createElement('category'); + $node->setAttribute('term', $category['term']); + if (isset($category['scheme'])) { + $node->setAttribute('scheme', $category['scheme']); + } + $entry->appendChild($node); + } + } + + if (isset($dataentry->source)) { + $source = $this->_element->createElement('source'); + $title = $this->_element->createElement('title', $dataentry->source['title']); + $source->appendChild($title); + $link = $this->_element->createElement('link', $dataentry->source['title']); + $link->setAttribute('rel', 'alternate'); + $link->setAttribute('href', $dataentry->source['url']); + $source->appendChild($link); + } + + if (isset($dataentry->enclosure)) { + foreach ($dataentry->enclosure as $enclosure) { + $node = $this->_element->createElement('link'); + $node->setAttribute('rel', 'enclosure'); + $node->setAttribute('href', $enclosure['url']); + if (isset($enclosure['type'])) { + $node->setAttribute('type', $enclosure['type']); + } + if (isset($enclosure['length'])) { + $node->setAttribute('length', $enclosure['length']); + } + $entry->appendChild($node); + } + } + + if (isset($dataentry->comments)) { + $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/', + 'wfw:comment', + $dataentry->comments); + $entry->appendChild($comments); + } + if (isset($dataentry->commentRss)) { + $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/', + 'wfw:commentRss', + $dataentry->commentRss); + $entry->appendChild($comments); + } + + $root->appendChild($entry); + } + } + + /** + * Override Zend_Feed_Element to allow formated feeds + * + * @return string + */ + public function saveXml() + { + // Return a complete document including XML prologue. + $doc = new DOMDocument($this->_element->ownerDocument->version, + $this->_element->ownerDocument->actualEncoding); + $doc->appendChild($doc->importNode($this->_element, true)); + $doc->formatOutput = true; + + return $doc->saveXML(); + } + + /** + * Send feed to a http client with the correct header + * + * @return void + * @throws Zend_Feed_Exception if headers have already been sent + */ + public function send() + { + if (headers_sent()) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Cannot send ATOM because headers have already been sent.'); + } + + header('Content-Type: application/atom+xml; charset=' . $this->_element->ownerDocument->actualEncoding); + + echo $this->saveXML(); + } +} diff --git a/lib/zend/Zend/Feed/Builder.php b/lib/zend/Zend/Feed/Builder.php new file mode 100644 index 0000000000..5139d59e43 --- /dev/null +++ b/lib/zend/Zend/Feed/Builder.php @@ -0,0 +1,398 @@ + + * array( + * 'title' => 'title of the feed', //required + * 'link' => 'canonical url to the feed', //required + * 'lastUpdate' => 'timestamp of the update date', // optional + * 'published' => 'timestamp of the publication date', //optional + * 'charset' => 'charset', // required + * 'description' => 'short description of the feed', //optional + * 'author' => 'author/publisher of the feed', //optional + * 'email' => 'email of the author', //optional + * 'webmaster' => 'email address for person responsible for technical issues' // optional, ignored if atom is used + * 'copyright' => 'copyright notice', //optional + * 'image' => 'url to image', //optional + * 'generator' => 'generator', // optional + * 'language' => 'language the feed is written in', // optional + * 'ttl' => 'how long in minutes a feed can be cached before refreshing', // optional, ignored if atom is used + * 'rating' => 'The PICS rating for the channel.', // optional, ignored if atom is used + * 'cloud' => array( + * 'domain' => 'domain of the cloud, e.g. rpc.sys.com' // required + * 'port' => 'port to connect to' // optional, default to 80 + * 'path' => 'path of the cloud, e.g. /RPC2 //required + * 'registerProcedure' => 'procedure to call, e.g. myCloud.rssPleaseNotify' // required + * 'protocol' => 'protocol to use, e.g. soap or xml-rpc' // required + * ), a cloud to be notified of updates // optional, ignored if atom is used + * 'textInput' => array( + * 'title' => 'the label of the Submit button in the text input area' // required, + * 'description' => 'explains the text input area' // required + * 'name' => 'the name of the text object in the text input area' // required + * 'link' => 'the URL of the CGI script that processes text input requests' // required + * ) // a text input box that can be displayed with the feed // optional, ignored if atom is used + * 'skipHours' => array( + * 'hour in 24 format', // e.g 13 (1pm) + * // up to 24 rows whose value is a number between 0 and 23 + * ) // Hint telling aggregators which hours they can skip // optional, ignored if atom is used + * 'skipDays ' => array( + * 'a day to skip', // e.g Monday + * // up to 7 rows whose value is a Monday, Tuesday, Wednesday, Thursday, Friday, Saturday or Sunday + * ) // Hint telling aggregators which days they can skip // optional, ignored if atom is used + * 'itunes' => array( + * 'author' => 'Artist column' // optional, default to the main author value + * 'owner' => array( + * 'name' => 'name of the owner' // optional, default to main author value + * 'email' => 'email of the owner' // optional, default to main email value + * ) // Owner of the podcast // optional + * 'image' => 'album/podcast art' // optional, default to the main image value + * 'subtitle' => 'short description' // optional, default to the main description value + * 'summary' => 'longer description' // optional, default to the main description value + * 'block' => 'Prevent an episode from appearing (yes|no)' // optional + * 'category' => array( + * array('main' => 'main category', // required + * 'sub' => 'sub category' // optional + * ), + * // up to 3 rows + * ) // 'Category column and in iTunes Music Store Browse' // required + * 'explicit' => 'parental advisory graphic (yes|no|clean)' // optional + * 'keywords' => 'a comma separated list of 12 keywords maximum' // optional + * 'new-feed-url' => 'used to inform iTunes of new feed URL location' // optional + * ) // Itunes extension data // optional, ignored if atom is used + * 'entries' => array( + * array( + * 'title' => 'title of the feed entry', //required + * 'link' => 'url to a feed entry', //required + * 'description' => 'short version of a feed entry', // only text, no html, required + * 'guid' => 'id of the article, if not given link value will used', //optional + * 'content' => 'long version', // can contain html, optional + * 'lastUpdate' => 'timestamp of the publication date', // optional + * 'comments' => 'comments page of the feed entry', // optional + * 'commentRss' => 'the feed url of the associated comments', // optional + * 'source' => array( + * 'title' => 'title of the original source' // required, + * 'url' => 'url of the original source' // required + * ) // original source of the feed entry // optional + * 'category' => array( + * array( + * 'term' => 'first category label' // required, + * 'scheme' => 'url that identifies a categorization scheme' // optional + * ), + * array( + * //data for the second category and so on + * ) + * ) // list of the attached categories // optional + * 'enclosure' => array( + * array( + * 'url' => 'url of the linked enclosure' // required + * 'type' => 'mime type of the enclosure' // optional + * 'length' => 'length of the linked content in octets' // optional + * ), + * array( + * //data for the second enclosure and so on + * ) + * ) // list of the enclosures of the feed entry // optional + * ), + * array( + * //data for the second entry and so on + * ) + * ) + * ); + * + * + * @param array $data + * @return void + */ + public function __construct(array $data) + { + $this->_data = $data; + $this->_createHeader($data); + if (isset($data['entries'])) { + $this->_createEntries($data['entries']); + } + } + + /** + * Returns an instance of Zend_Feed_Builder_Header + * describing the header of the feed + * + * @return Zend_Feed_Builder_Header + */ + public function getHeader() + { + return $this->_header; + } + + /** + * Returns an array of Zend_Feed_Builder_Entry instances + * describing the entries of the feed + * + * @return array of Zend_Feed_Builder_Entry + */ + public function getEntries() + { + return $this->_entries; + } + + /** + * Create the Zend_Feed_Builder_Header instance + * + * @param array $data + * @throws Zend_Feed_Builder_Exception + * @return void + */ + private function _createHeader(array $data) + { + $mandatories = array('title', 'link', 'charset'); + foreach ($mandatories as $mandatory) { + if (!isset($data[$mandatory])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("$mandatory key is missing"); + } + } + $this->_header = new Zend_Feed_Builder_Header($data['title'], $data['link'], $data['charset']); + if (isset($data['lastUpdate'])) { + $this->_header->setLastUpdate($data['lastUpdate']); + } + if (isset($data['published'])) { + $this->_header->setPublishedDate($data['published']); + } + if (isset($data['description'])) { + $this->_header->setDescription($data['description']); + } + if (isset($data['author'])) { + $this->_header->setAuthor($data['author']); + } + if (isset($data['email'])) { + $this->_header->setEmail($data['email']); + } + if (isset($data['webmaster'])) { + $this->_header->setWebmaster($data['webmaster']); + } + if (isset($data['copyright'])) { + $this->_header->setCopyright($data['copyright']); + } + if (isset($data['image'])) { + $this->_header->setImage($data['image']); + } + if (isset($data['generator'])) { + $this->_header->setGenerator($data['generator']); + } + if (isset($data['language'])) { + $this->_header->setLanguage($data['language']); + } + if (isset($data['ttl'])) { + $this->_header->setTtl($data['ttl']); + } + if (isset($data['rating'])) { + $this->_header->setRating($data['rating']); + } + if (isset($data['cloud'])) { + $mandatories = array('domain', 'path', 'registerProcedure', 'protocol'); + foreach ($mandatories as $mandatory) { + if (!isset($data['cloud'][$mandatory])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to define $mandatory property of your cloud"); + } + } + $uri_str = 'http://' . $data['cloud']['domain'] . $data['cloud']['path']; + $this->_header->setCloud($uri_str, $data['cloud']['registerProcedure'], $data['cloud']['protocol']); + } + if (isset($data['textInput'])) { + $mandatories = array('title', 'description', 'name', 'link'); + foreach ($mandatories as $mandatory) { + if (!isset($data['textInput'][$mandatory])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to define $mandatory property of your textInput"); + } + } + $this->_header->setTextInput($data['textInput']['title'], + $data['textInput']['description'], + $data['textInput']['name'], + $data['textInput']['link']); + } + if (isset($data['skipHours'])) { + $this->_header->setSkipHours($data['skipHours']); + } + if (isset($data['skipDays'])) { + $this->_header->setSkipDays($data['skipDays']); + } + if (isset($data['itunes'])) { + $itunes = new Zend_Feed_Builder_Header_Itunes($data['itunes']['category']); + if (isset($data['itunes']['author'])) { + $itunes->setAuthor($data['itunes']['author']); + } + if (isset($data['itunes']['owner'])) { + $name = isset($data['itunes']['owner']['name']) ? $data['itunes']['owner']['name'] : ''; + $email = isset($data['itunes']['owner']['email']) ? $data['itunes']['owner']['email'] : ''; + $itunes->setOwner($name, $email); + } + if (isset($data['itunes']['image'])) { + $itunes->setImage($data['itunes']['image']); + } + if (isset($data['itunes']['subtitle'])) { + $itunes->setSubtitle($data['itunes']['subtitle']); + } + if (isset($data['itunes']['summary'])) { + $itunes->setSummary($data['itunes']['summary']); + } + if (isset($data['itunes']['block'])) { + $itunes->setBlock($data['itunes']['block']); + } + if (isset($data['itunes']['explicit'])) { + $itunes->setExplicit($data['itunes']['explicit']); + } + if (isset($data['itunes']['keywords'])) { + $itunes->setKeywords($data['itunes']['keywords']); + } + if (isset($data['itunes']['new-feed-url'])) { + $itunes->setNewFeedUrl($data['itunes']['new-feed-url']); + } + + $this->_header->setITunes($itunes); + } + } + + /** + * Create the array of article entries + * + * @param array $data + * @throws Zend_Feed_Builder_Exception + * @return void + */ + private function _createEntries(array $data) + { + foreach ($data as $row) { + $mandatories = array('title', 'link', 'description'); + foreach ($mandatories as $mandatory) { + if (!isset($row[$mandatory])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("$mandatory key is missing"); + } + } + $entry = new Zend_Feed_Builder_Entry($row['title'], $row['link'], $row['description']); + if (isset($row['author'])) { + $entry->setAuthor($row['author']); + } + if (isset($row['guid'])) { + $entry->setId($row['guid']); + } + if (isset($row['content'])) { + $entry->setContent($row['content']); + } + if (isset($row['lastUpdate'])) { + $entry->setLastUpdate($row['lastUpdate']); + } + if (isset($row['comments'])) { + $entry->setCommentsUrl($row['comments']); + } + if (isset($row['commentRss'])) { + $entry->setCommentsRssUrl($row['commentRss']); + } + if (isset($row['source'])) { + $mandatories = array('title', 'url'); + foreach ($mandatories as $mandatory) { + if (!isset($row['source'][$mandatory])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("$mandatory key of source property is missing"); + } + } + $entry->setSource($row['source']['title'], $row['source']['url']); + } + if (isset($row['category'])) { + $entry->setCategories($row['category']); + } + if (isset($row['enclosure'])) { + $entry->setEnclosures($row['enclosure']); + } + + $this->_entries[] = $entry; + } + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Feed/Builder/Entry.php b/lib/zend/Zend/Feed/Builder/Entry.php new file mode 100644 index 0000000000..0a218d140c --- /dev/null +++ b/lib/zend/Zend/Feed/Builder/Entry.php @@ -0,0 +1,297 @@ +offsetSet('title', $title); + $this->offsetSet('link', $link); + $this->offsetSet('description', $description); + $this->setLastUpdate(time()); + } + + /** + * Read only properties accessor + * + * @param string $name property to read + * @return mixed + */ + public function __get($name) + { + if (!$this->offsetExists($name)) { + return NULL; + } + + return $this->offsetGet($name); + } + + /** + * Write properties accessor + * + * @param string $name name of the property to set + * @param mixed $value value to set + * @return void + */ + public function __set($name, $value) + { + $this->offsetSet($name, $value); + } + + /** + * Isset accessor + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + return $this->offsetExists($key); + } + + /** + * Unset accessor + * + * @param string $key + * @return void + */ + public function __unset($key) + { + if ($this->offsetExists($key)) { + $this->offsetUnset($key); + } + } + + /** + * Sets the author of the entry + * + * @param string $author + * @return Zend_Feed_Builder_Entry + */ + public function setAuthor($author) + { + $this->offsetSet('author', $author); + return $this; + } + + /** + * Sets the id/guid of the entry + * + * @param string $id + * @return Zend_Feed_Builder_Entry + */ + public function setId($id) + { + $this->offsetSet('guid', $id); + return $this; + } + + /** + * Sets the full html content of the entry + * + * @param string $content + * @return Zend_Feed_Builder_Entry + */ + public function setContent($content) + { + $this->offsetSet('content', $content); + return $this; + } + + /** + * Timestamp of the update date + * + * @param int $lastUpdate + * @return Zend_Feed_Builder_Entry + */ + public function setLastUpdate($lastUpdate) + { + $this->offsetSet('lastUpdate', $lastUpdate); + return $this; + } + + /** + * Sets the url of the commented page associated to the entry + * + * @param string $comments + * @return Zend_Feed_Builder_Entry + */ + public function setCommentsUrl($comments) + { + $this->offsetSet('comments', $comments); + return $this; + } + + /** + * Sets the url of the comments feed link + * + * @param string $commentRss + * @return Zend_Feed_Builder_Entry + */ + public function setCommentsRssUrl($commentRss) + { + $this->offsetSet('commentRss', $commentRss); + return $this; + } + + /** + * Defines a reference to the original source + * + * @param string $title + * @param string $url + * @return Zend_Feed_Builder_Entry + */ + public function setSource($title, $url) + { + $this->offsetSet('source', array('title' => $title, + 'url' => $url)); + return $this; + } + + /** + * Sets the categories of the entry + * Format of the array: + * + * array( + * array( + * 'term' => 'first category label', + * 'scheme' => 'url that identifies a categorization scheme' // optional + * ), + * // second category and so one + * ) + * + * + * @param array $categories + * @return Zend_Feed_Builder_Entry + */ + public function setCategories(array $categories) + { + foreach ($categories as $category) { + $this->addCategory($category); + } + return $this; + } + + /** + * Add a category to the entry + * + * @param array $category see Zend_Feed_Builder_Entry::setCategories() for format + * @return Zend_Feed_Builder_Entry + * @throws Zend_Feed_Builder_Exception + */ + public function addCategory(array $category) + { + if (empty($category['term'])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to define the name of the category"); + } + + if (!$this->offsetExists('category')) { + $categories = array($category); + } else { + $categories = $this->offsetGet('category'); + $categories[] = $category; + } + $this->offsetSet('category', $categories); + return $this; + } + + /** + * Sets the enclosures of the entry + * Format of the array: + * + * array( + * array( + * 'url' => 'url of the linked enclosure', + * 'type' => 'mime type of the enclosure' // optional + * 'length' => 'length of the linked content in octets' // optional + * ), + * // second enclosure and so one + * ) + * + * + * @param array $enclosures + * @return Zend_Feed_Builder_Entry + * @throws Zend_Feed_Builder_Exception + */ + public function setEnclosures(array $enclosures) + { + foreach ($enclosures as $enclosure) { + if (empty($enclosure['url'])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to supply an url for your enclosure"); + } + $type = isset($enclosure['type']) ? $enclosure['type'] : ''; + $length = isset($enclosure['length']) ? $enclosure['length'] : ''; + $this->addEnclosure($enclosure['url'], $type, $length); + } + return $this; + } + + /** + * Add an enclosure to the entry + * + * @param string $url + * @param string $type + * @param string $length + * @return Zend_Feed_Builder_Entry + */ + public function addEnclosure($url, $type = '', $length = '') + { + if (!$this->offsetExists('enclosure')) { + $enclosure = array(); + } else { + $enclosure = $this->offsetGet('enclosure'); + } + $enclosure[] = array('url' => $url, + 'type' => $type, + 'length' => $length); + $this->offsetSet('enclosure', $enclosure); + return $this; + } +} diff --git a/lib/zend/Zend/Feed/Builder/Exception.php b/lib/zend/Zend/Feed/Builder/Exception.php new file mode 100644 index 0000000000..c5fedeb19c --- /dev/null +++ b/lib/zend/Zend/Feed/Builder/Exception.php @@ -0,0 +1,40 @@ +offsetSet('title', $title); + $this->offsetSet('link', $link); + $this->offsetSet('charset', $charset); + $this->setLastUpdate(time()) + ->setGenerator('Zend_Feed'); + } + + /** + * Read only properties accessor + * + * @param string $name property to read + * @return mixed + */ + public function __get($name) + { + if (!$this->offsetExists($name)) { + return NULL; + } + + return $this->offsetGet($name); + } + + /** + * Write properties accessor + * + * @param string $name name of the property to set + * @param mixed $value value to set + * @return void + */ + public function __set($name, $value) + { + $this->offsetSet($name, $value); + } + + /** + * Isset accessor + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + return $this->offsetExists($key); + } + + /** + * Unset accessor + * + * @param string $key + * @return void + */ + public function __unset($key) + { + if ($this->offsetExists($key)) { + $this->offsetUnset($key); + } + } + + /** + * Timestamp of the update date + * + * @param int $lastUpdate + * @return Zend_Feed_Builder_Header + */ + public function setLastUpdate($lastUpdate) + { + $this->offsetSet('lastUpdate', $lastUpdate); + return $this; + } + + /** + * Timestamp of the publication date + * + * @param int $published + * @return Zend_Feed_Builder_Header + */ + public function setPublishedDate($published) + { + $this->offsetSet('published', $published); + return $this; + } + + /** + * Short description of the feed + * + * @param string $description + * @return Zend_Feed_Builder_Header + */ + public function setDescription($description) + { + $this->offsetSet('description', $description); + return $this; + } + + /** + * Sets the author of the feed + * + * @param string $author + * @return Zend_Feed_Builder_Header + */ + public function setAuthor($author) + { + $this->offsetSet('author', $author); + return $this; + } + + /** + * Sets the author's email + * + * @param string $email + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setEmail($email) + { + /** + * @see Zend_Validate_EmailAddress + */ + require_once 'Zend/Validate/EmailAddress.php'; + $validate = new Zend_Validate_EmailAddress(); + if (!$validate->isValid($email)) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the email property"); + } + $this->offsetSet('email', $email); + return $this; + } + + /** + * Sets the copyright notice + * + * @param string $copyright + * @return Zend_Feed_Builder_Header + */ + public function setCopyright($copyright) + { + $this->offsetSet('copyright', $copyright); + return $this; + } + + /** + * Sets the image of the feed + * + * @param string $image + * @return Zend_Feed_Builder_Header + */ + public function setImage($image) + { + $this->offsetSet('image', $image); + return $this; + } + + /** + * Sets the generator of the feed + * + * @param string $generator + * @return Zend_Feed_Builder_Header + */ + public function setGenerator($generator) + { + $this->offsetSet('generator', $generator); + return $this; + } + + /** + * Sets the language of the feed + * + * @param string $language + * @return Zend_Feed_Builder_Header + */ + public function setLanguage($language) + { + $this->offsetSet('language', $language); + return $this; + } + + /** + * Email address for person responsible for technical issues + * Ignored if atom is used + * + * @param string $webmaster + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setWebmaster($webmaster) + { + /** + * @see Zend_Validate_EmailAddress + */ + require_once 'Zend/Validate/EmailAddress.php'; + $validate = new Zend_Validate_EmailAddress(); + if (!$validate->isValid($webmaster)) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the webmaster property"); + } + $this->offsetSet('webmaster', $webmaster); + return $this; + } + + /** + * How long in minutes a feed can be cached before refreshing + * Ignored if atom is used + * + * @param int $ttl + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setTtl($ttl) + { + /** + * @see Zend_Validate_Int + */ + require_once 'Zend/Validate/Int.php'; + $validate = new Zend_Validate_Int(); + if (!$validate->isValid($ttl)) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set an integer value to the ttl property"); + } + $this->offsetSet('ttl', $ttl); + return $this; + } + + /** + * PICS rating for the feed + * Ignored if atom is used + * + * @param string $rating + * @return Zend_Feed_Builder_Header + */ + public function setRating($rating) + { + $this->offsetSet('rating', $rating); + return $this; + } + + /** + * Cloud to be notified of updates of the feed + * Ignored if atom is used + * + * @param string|Zend_Uri_Http $uri + * @param string $procedure procedure to call, e.g. myCloud.rssPleaseNotify + * @param string $protocol protocol to use, e.g. soap or xml-rpc + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setCloud($uri, $procedure, $protocol) + { + if (is_string($uri) && Zend_Uri_Http::check($uri)) { + $uri = Zend_Uri::factory($uri); + } + if (!$uri instanceof Zend_Uri_Http) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception('Passed parameter is not a valid HTTP URI'); + } + if (!$uri->getPort()) { + $uri->setPort(80); + } + $this->offsetSet('cloud', array('uri' => $uri, + 'procedure' => $procedure, + 'protocol' => $protocol)); + return $this; + } + + /** + * A text input box that can be displayed with the feed + * Ignored if atom is used + * + * @param string $title the label of the Submit button in the text input area + * @param string $description explains the text input area + * @param string $name the name of the text object in the text input area + * @param string $link the URL of the CGI script that processes text input requests + * @return Zend_Feed_Builder_Header + */ + public function setTextInput($title, $description, $name, $link) + { + $this->offsetSet('textInput', array('title' => $title, + 'description' => $description, + 'name' => $name, + 'link' => $link)); + return $this; + } + + /** + * Hint telling aggregators which hours they can skip + * Ignored if atom is used + * + * @param array $hours list of hours in 24 format + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setSkipHours(array $hours) + { + if (count($hours) > 24) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you can not have more than 24 rows in the skipHours property"); + } + foreach ($hours as $hour) { + if ($hour < 0 || $hour > 23) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("$hour has te be between 0 and 23"); + } + } + $this->offsetSet('skipHours', $hours); + return $this; + } + + /** + * Hint telling aggregators which days they can skip + * Ignored if atom is used + * + * @param array $days list of days to skip, e.g. Monday + * @return Zend_Feed_Builder_Header + * @throws Zend_Feed_Builder_Exception + */ + public function setSkipDays(array $days) + { + if (count($days) > 7) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you can not have more than 7 days in the skipDays property"); + } + $valid = array('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'); + foreach ($days as $day) { + if (!in_array(strtolower($day), $valid)) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("$day is not a valid day"); + } + } + $this->offsetSet('skipDays', $days); + return $this; + } + + /** + * Sets the iTunes rss extension + * + * @param Zend_Feed_Builder_Header_Itunes $itunes + * @return Zend_Feed_Builder_Header + */ + public function setITunes(Zend_Feed_Builder_Header_Itunes $itunes) + { + $this->offsetSet('itunes', $itunes); + return $this; + } +} diff --git a/lib/zend/Zend/Feed/Builder/Header/Itunes.php b/lib/zend/Zend/Feed/Builder/Header/Itunes.php new file mode 100644 index 0000000000..52c9177130 --- /dev/null +++ b/lib/zend/Zend/Feed/Builder/Header/Itunes.php @@ -0,0 +1,288 @@ +setCategories($categories); + } + + /** + * Sets the categories column and in iTunes Music Store Browse + * $categories must conform to the following format: + * + * array(array('main' => 'main category', + * 'sub' => 'sub category' // optionnal + * ), + * // up to 3 rows + * ) + * + * + * @param array $categories + * @return Zend_Feed_Builder_Header_Itunes + * @throws Zend_Feed_Builder_Exception + */ + public function setCategories(array $categories) + { + $nb = count($categories); + if (0 === $nb) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set at least one itunes category"); + } + if ($nb > 3) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set at most three itunes categories"); + } + foreach ($categories as $i => $category) { + if (empty($category['main'])) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set the main category (category #$i)"); + } + } + $this->offsetSet('category', $categories); + return $this; + } + + /** + * Sets the artist value, default to the feed's author value + * + * @param string $author + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setAuthor($author) + { + $this->offsetSet('author', $author); + return $this; + } + + /** + * Sets the owner of the postcast + * + * @param string $name default to the feed's author value + * @param string $email default to the feed's email value + * @return Zend_Feed_Builder_Header_Itunes + * @throws Zend_Feed_Builder_Exception + */ + public function setOwner($name = '', $email = '') + { + if (!empty($email)) { + /** + * @see Zend_Validate_EmailAddress + */ + require_once 'Zend/Validate/EmailAddress.php'; + $validate = new Zend_Validate_EmailAddress(); + if (!$validate->isValid($email)) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the itunes owner's email property"); + } + } + $this->offsetSet('owner', array('name' => $name, 'email' => $email)); + return $this; + } + + /** + * Sets the album/podcast art picture + * Default to the feed's image value + * + * @param string $image + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setImage($image) + { + $this->offsetSet('image', $image); + return $this; + } + + /** + * Sets the short description of the podcast + * Default to the feed's description + * + * @param string $subtitle + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setSubtitle($subtitle) + { + $this->offsetSet('subtitle', $subtitle); + return $this; + } + + /** + * Sets the longer description of the podcast + * Default to the feed's description + * + * @param string $summary + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setSummary($summary) + { + $this->offsetSet('summary', $summary); + return $this; + } + + /** + * Prevent a feed from appearing + * + * @param string $block can be 'yes' or 'no' + * @return Zend_Feed_Builder_Header_Itunes + * @throws Zend_Feed_Builder_Exception + */ + public function setBlock($block) + { + $block = strtolower($block); + if (!in_array($block, array('yes', 'no'))) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set yes or no to the itunes block property"); + } + $this->offsetSet('block', $block); + return $this; + } + + /** + * Configuration of the parental advisory graphic + * + * @param string $explicit can be 'yes', 'no' or 'clean' + * @return Zend_Feed_Builder_Header_Itunes + * @throws Zend_Feed_Builder_Exception + */ + public function setExplicit($explicit) + { + $explicit = strtolower($explicit); + if (!in_array($explicit, array('yes', 'no', 'clean'))) { + /** + * @see Zend_Feed_Builder_Exception + */ + require_once 'Zend/Feed/Builder/Exception.php'; + throw new Zend_Feed_Builder_Exception("you have to set yes, no or clean to the itunes explicit property"); + } + $this->offsetSet('explicit', $explicit); + return $this; + } + + /** + * Sets a comma separated list of 12 keywords maximum + * + * @param string $keywords + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setKeywords($keywords) + { + $this->offsetSet('keywords', $keywords); + return $this; + } + + /** + * Sets the new feed URL location + * + * @param string $url + * @return Zend_Feed_Builder_Header_Itunes + */ + public function setNewFeedUrl($url) + { + $this->offsetSet('new_feed_url', $url); + return $this; + } + + /** + * Read only properties accessor + * + * @param string $name property to read + * @return mixed + */ + public function __get($name) + { + if (!$this->offsetExists($name)) { + return NULL; + } + + return $this->offsetGet($name); + } + + /** + * Write properties accessor + * + * @param string $name name of the property to set + * @param mixed $value value to set + * @return void + */ + public function __set($name, $value) + { + $this->offsetSet($name, $value); + } + + /** + * Isset accessor + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + return $this->offsetExists($key); + } + + /** + * Unset accessor + * + * @param string $key + * @return void + */ + public function __unset($key) + { + if ($this->offsetExists($key)) { + $this->offsetUnset($key); + } + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Feed/Builder/Interface.php b/lib/zend/Zend/Feed/Builder/Interface.php new file mode 100644 index 0000000000..f03f0f2312 --- /dev/null +++ b/lib/zend/Zend/Feed/Builder/Interface.php @@ -0,0 +1,52 @@ +_element = $element; + } + + + /** + * Get a DOM representation of the element + * + * Returns the underlying DOM object, which can then be + * manipulated with full DOM methods. + * + * @return DOMDocument + */ + public function getDOM() + { + return $this->_element; + } + + + /** + * Update the object from a DOM element + * + * Take a DOMElement object, which may be originally from a call + * to getDOM() or may be custom created, and use it as the + * DOM tree for this Zend_Feed_Element. + * + * @param DOMElement $element + * @return void + */ + public function setDOM(DOMElement $element) + { + $this->_element = $this->_element->ownerDocument->importNode($element, true); + } + + /** + * Set the parent element of this object to another + * Zend_Feed_Element. + * + * @param Zend_Feed_Element $element + * @return void + */ + public function setParent(Zend_Feed_Element $element) + { + $this->_parentElement = $element; + $this->_appended = false; + } + + + /** + * Appends this element to its parent if necessary. + * + * @return void + */ + protected function ensureAppended() + { + if (!$this->_appended) { + $this->_parentElement->getDOM()->appendChild($this->_element); + $this->_appended = true; + $this->_parentElement->ensureAppended(); + } + } + + + /** + * Get an XML string representation of this element + * + * Returns a string of this element's XML, including the XML + * prologue. + * + * @return string + */ + public function saveXml() + { + // Return a complete document including XML prologue. + $doc = new DOMDocument($this->_element->ownerDocument->version, + $this->_element->ownerDocument->actualEncoding); + $doc->appendChild($doc->importNode($this->_element, true)); + return $doc->saveXML(); + } + + + /** + * Get the XML for only this element + * + * Returns a string of this element's XML without prologue. + * + * @return string + */ + public function saveXmlFragment() + { + return $this->_element->ownerDocument->saveXML($this->_element); + } + + + /** + * Map variable access onto the underlying entry representation. + * + * Get-style access returns a Zend_Feed_Element representing the + * child element accessed. To get string values, use method syntax + * with the __call() overriding. + * + * @param string $var The property to access. + * @return mixed + */ + public function __get($var) + { + $nodes = $this->_children($var); + $length = count($nodes); + + if ($length == 1) { + return new Zend_Feed_Element($nodes[0]); + } elseif ($length > 1) { + return array_map(create_function('$e', 'return new Zend_Feed_Element($e);'), $nodes); + } else { + // When creating anonymous nodes for __set chaining, don't + // call appendChild() on them. Instead we pass the current + // element to them as an extra reference; the child is + // then responsible for appending itself when it is + // actually set. This way "if ($foo->bar)" doesn't create + // a phantom "bar" element in our tree. + if (strpos($var, ':') !== false) { + list($ns, $elt) = explode(':', $var, 2); + $node = $this->_element->ownerDocument->createElementNS(Zend_Feed::lookupNamespace($ns), $elt); + } else { + $node = $this->_element->ownerDocument->createElement($var); + } + $node = new self($node); + $node->setParent($this); + return $node; + } + } + + + /** + * Map variable sets onto the underlying entry representation. + * + * @param string $var The property to change. + * @param string $val The property's new value. + * @return void + * @throws Zend_Feed_Exception + */ + public function __set($var, $val) + { + $this->ensureAppended(); + + $nodes = $this->_children($var); + if (!$nodes) { + if (strpos($var, ':') !== false) { + list($ns, $elt) = explode(':', $var, 2); + $node = $this->_element->ownerDocument->createElementNS(Zend_Feed::lookupNamespace($ns), $var, $val); + $this->_element->appendChild($node); + } else { + $node = $this->_element->ownerDocument->createElement($var, $val); + $this->_element->appendChild($node); + } + } elseif (count($nodes) > 1) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Cannot set the value of multiple tags simultaneously.'); + } else { + $nodes[0]->nodeValue = $val; + } + } + + + /** + * Map isset calls onto the underlying entry representation. + * + * @param string $var + * @return boolean + */ + public function __isset($var) + { + // Look for access of the form {ns:var}. We don't use + // _children() here because we can break out of the loop + // immediately once we find something. + if (strpos($var, ':') !== false) { + list($ns, $elt) = explode(':', $var, 2); + foreach ($this->_element->childNodes as $child) { + if ($child->localName == $elt && $child->prefix == $ns) { + return true; + } + } + } else { + foreach ($this->_element->childNodes as $child) { + if ($child->localName == $var) { + return true; + } + } + } + } + + + /** + * Get the value of an element with method syntax. + * + * Map method calls to get the string value of the requested + * element. If there are multiple elements that match, this will + * return an array of those objects. + * + * @param string $var The element to get the string value of. + * @param mixed $unused This parameter is not used. + * @return mixed The node's value, null, or an array of nodes. + */ + public function __call($var, $unused) + { + $nodes = $this->_children($var); + + if (!$nodes) { + return null; + } elseif (count($nodes) > 1) { + return $nodes; + } else { + return $nodes[0]->nodeValue; + } + } + + + /** + * Remove all children matching $var. + * + * @param string $var + * @return void + */ + public function __unset($var) + { + $nodes = $this->_children($var); + foreach ($nodes as $node) { + $parent = $node->parentNode; + $parent->removeChild($node); + } + } + + + /** + * Returns the nodeValue of this element when this object is used + * in a string context. + * + * @return string + */ + public function __toString() + { + return $this->_element->nodeValue; + } + + + /** + * Finds children with tagnames matching $var + * + * Similar to SimpleXML's children() method. + * + * @param string $var Tagname to match, can be either namespace:tagName or just tagName. + * @return array + */ + protected function _children($var) + { + $found = array(); + + // Look for access of the form {ns:var}. + if (strpos($var, ':') !== false) { + list($ns, $elt) = explode(':', $var, 2); + foreach ($this->_element->childNodes as $child) { + if ($child->localName == $elt && $child->prefix == $ns) { + $found[] = $child; + } + } + } else { + foreach ($this->_element->childNodes as $child) { + if ($child->localName == $var) { + $found[] = $child; + } + } + } + + return $found; + } + + + /** + * Required by the ArrayAccess interface. + * + * @param string $offset + * @return boolean + */ + public function offsetExists($offset) + { + if (strpos($offset, ':') !== false) { + list($ns, $attr) = explode(':', $offset, 2); + return $this->_element->hasAttributeNS(Zend_Feed::lookupNamespace($ns), $attr); + } else { + return $this->_element->hasAttribute($offset); + } + } + + + /** + * Required by the ArrayAccess interface. + * + * @param string $offset + * @return string + */ + public function offsetGet($offset) + { + if (strpos($offset, ':') !== false) { + list($ns, $attr) = explode(':', $offset, 2); + return $this->_element->getAttributeNS(Zend_Feed::lookupNamespace($ns), $attr); + } else { + return $this->_element->getAttribute($offset); + } + } + + + /** + * Required by the ArrayAccess interface. + * + * @param string $offset + * @param string $value + * @return string + */ + public function offsetSet($offset, $value) + { + $this->ensureAppended(); + + if (strpos($offset, ':') !== false) { + list($ns, $attr) = explode(':', $offset, 2); + return $this->_element->setAttributeNS(Zend_Feed::lookupNamespace($ns), $attr, $value); + } else { + return $this->_element->setAttribute($offset, $value); + } + } + + + /** + * Required by the ArrayAccess interface. + * + * @param string $offset + * @return boolean + */ + public function offsetUnset($offset) + { + if (strpos($offset, ':') !== false) { + list($ns, $attr) = explode(':', $offset, 2); + return $this->_element->removeAttributeNS(Zend_Feed::lookupNamespace($ns), $attr); + } else { + return $this->_element->removeAttribute($offset); + } + } + +} diff --git a/lib/zend/Zend/Feed/Entry/Abstract.php b/lib/zend/Zend/Feed/Entry/Abstract.php new file mode 100644 index 0000000000..d6573bc1c6 --- /dev/null +++ b/lib/zend/Zend/Feed/Entry/Abstract.php @@ -0,0 +1,124 @@ +loadXML($element); + @ini_restore('track_errors'); + + if (!$status) { + // prevent the class to generate an undefined variable notice (ZF-2590) + if (!isset($php_errormsg)) { + if (function_exists('xdebug_is_enabled')) { + $php_errormsg = '(error message not available, when XDebug is running)'; + } else { + $php_errormsg = '(error message not available)'; + } + } + + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + + $element = $doc->getElementsByTagName($this->_rootElement)->item(0); + if (!$element) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('No root <' . $this->_rootElement . '> element found, cannot parse feed.'); + } + } else { + $doc = new DOMDocument('1.0', 'utf-8'); + if ($this->_rootNamespace !== null) { + $element = $doc->createElementNS(Zend_Feed::lookupNamespace($this->_rootNamespace), $this->_rootElement); + } else { + $element = $doc->createElement($this->_rootElement); + } + } + } + + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Feed/Entry/Atom.php b/lib/zend/Zend/Feed/Entry/Atom.php new file mode 100644 index 0000000000..4382480a12 --- /dev/null +++ b/lib/zend/Zend/Feed/Entry/Atom.php @@ -0,0 +1,280 @@ +link('edit'); + if (!$deleteUri) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Cannot delete entry; no link rel="edit" is present.'); + } + + // DELETE + $client = Zend_Feed::getHttpClient(); + do { + $client->setUri($deleteUri); + if (Zend_Feed::getHttpMethodOverride()) { + $client->setHeader('X-HTTP-Method-Override', 'DELETE'); + $response = $client->request('POST'); + } else { + $response = $client->request('DELETE'); + } + $httpStatus = $response->getStatus(); + switch ((int) $httpStatus / 100) { + // Success + case 2: + return true; + // Redirect + case 3: + $deleteUri = $response->getHeader('Location'); + continue; + // Error + default: + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("Expected response code 2xx, got $httpStatus"); + } + } while (true); + } + + + /** + * Save a new or updated Atom entry. + * + * Save is used to either create new entries or to save changes to + * existing ones. If we have a link rel="edit", we are changing + * an existing entry. In this case we re-serialize the entry and + * PUT it to the edit URI, checking for a 200 OK result. + * + * For posting new entries, you must specify the $postUri + * parameter to save() to tell the object where to post itself. + * We use $postUri and POST the serialized entry there, checking + * for a 201 Created response. If the insert is successful, we + * then parse the response from the POST to get any values that + * the server has generated: an id, an updated time, and its new + * link rel="edit". + * + * @param string $postUri Location to POST for creating new entries. + * @return void + * @throws Zend_Feed_Exception + */ + public function save($postUri = null) + { + if ($this->id()) { + // If id is set, look for link rel="edit" in the + // entry object and PUT. + $editUri = $this->link('edit'); + if (!$editUri) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Cannot edit entry; no link rel="edit" is present.'); + } + + $client = Zend_Feed::getHttpClient(); + $client->setUri($editUri); + if (Zend_Feed::getHttpMethodOverride()) { + $client->setHeaders(array('X-HTTP-Method-Override: PUT', + 'Content-Type: ' . self::CONTENT_TYPE)); + $client->setRawData($this->saveXML()); + $response = $client->request('POST'); + } else { + $client->setHeaders('Content-Type', self::CONTENT_TYPE); + $client->setRawData($this->saveXML()); + $response = $client->request('PUT'); + } + if ($response->getStatus() !== 200) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Expected response code 200, got ' . $response->getStatus()); + } + } else { + if ($postUri === null) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('PostURI must be specified to save new entries.'); + } + $client = Zend_Feed::getHttpClient(); + $client->setUri($postUri); + $client->setHeaders('Content-Type', self::CONTENT_TYPE); + $client->setRawData($this->saveXML()); + $response = $client->request('POST'); + + if ($response->getStatus() !== 201) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Expected response code 201, got ' + . $response->getStatus()); + } + } + + // Update internal properties using $client->responseBody; + @ini_set('track_errors', 1); + $newEntry = new DOMDocument; + $status = @$newEntry->loadXML($response->getBody()); + @ini_restore('track_errors'); + + if (!$status) { + // prevent the class to generate an undefined variable notice (ZF-2590) + if (!isset($php_errormsg)) { + if (function_exists('xdebug_is_enabled')) { + $php_errormsg = '(error message not available, when XDebug is running)'; + } else { + $php_errormsg = '(error message not available)'; + } + } + + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('XML cannot be parsed: ' . $php_errormsg); + } + + $newEntry = $newEntry->getElementsByTagName($this->_rootElement)->item(0); + if (!$newEntry) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('No root element found in server response:' + . "\n\n" . $client->responseBody); + } + + if ($this->_element->parentNode) { + $oldElement = $this->_element; + $this->_element = $oldElement->ownerDocument->importNode($newEntry, true); + $oldElement->parentNode->replaceChild($this->_element, $oldElement); + } else { + $this->_element = $newEntry; + } + } + + + /** + * Easy access to tags keyed by "rel" attributes. + * + * If $elt->link() is called with no arguments, we will attempt to + * return the value of the tag(s) like all other + * method-syntax attribute access. If an argument is passed to + * link(), however, then we will return the "href" value of the + * first tag that has a "rel" attribute matching $rel: + * + * $elt->link(): returns the value of the link tag. + * $elt->link('self'): returns the href from the first in the entry. + * + * @param string $rel The "rel" attribute to look for. + * @return mixed + */ + public function link($rel = null) + { + if ($rel === null) { + return parent::__call('link', null); + } + + // index link tags by their "rel" attribute. + $links = parent::__get('link'); + if (!is_array($links)) { + if ($links instanceof Zend_Feed_Element) { + $links = array($links); + } else { + return $links; + } + } + + foreach ($links as $link) { + if (empty($link['rel'])) { + $link['rel'] = 'alternate'; // see Atom 1.0 spec + } + if ($rel == $link['rel']) { + return $link['href']; + } + } + + return null; + } + +} diff --git a/lib/zend/Zend/Feed/Entry/Rss.php b/lib/zend/Zend/Feed/Entry/Rss.php new file mode 100644 index 0000000000..96c66df400 --- /dev/null +++ b/lib/zend/Zend/Feed/Entry/Rss.php @@ -0,0 +1,122 @@ +_element->lookupPrefix('http://purl.org/rss/1.0/modules/content/'); + return parent::__get("$prefix:encoded"); + default: + return parent::__get($var); + } + } + + /** + * Overwrites parent::_set method to enable write access + * to content:encoded element. + * + * @param string $var The property to change. + * @param string $val The property's new value. + * @return void + */ + public function __set($var, $value) + { + switch ($var) { + case 'content': + parent::__set('content:encoded', $value); + break; + default: + parent::__set($var, $value); + } + } + + /** + * Overwrites parent::_isset method to enable access + * to content:encoded element. + * + * @param string $var + * @return boolean + */ + public function __isset($var) + { + switch ($var) { + case 'content': + // don't use other callback to prevent invalid returned value + return $this->content() !== null; + default: + return parent::__isset($var); + } + } + + /** + * Overwrites parent::_call method to enable read access + * to content:encoded element. + * Please note that method-style write access is not currently supported + * by parent method, consequently this method doesn't as well. + * + * @param string $var The element to get the string value of. + * @param mixed $unused This parameter is not used. + * @return mixed The node's value, null, or an array of nodes. + */ + public function __call($var, $unused) + { + switch ($var) { + case 'content': + $prefix = $this->_element->lookupPrefix('http://purl.org/rss/1.0/modules/content/'); + return parent::__call("$prefix:encoded", $unused); + default: + return parent::__call($var, $unused); + } + } +} diff --git a/lib/zend/Zend/Feed/Exception.php b/lib/zend/Zend/Feed/Exception.php new file mode 100644 index 0000000000..ec8ca94941 --- /dev/null +++ b/lib/zend/Zend/Feed/Exception.php @@ -0,0 +1,42 @@ + array( + 'DublinCore_Feed', + 'Atom_Feed' + ), + 'entry' => array( + 'Content_Entry', + 'DublinCore_Entry', + 'Atom_Entry' + ), + 'core' => array( + 'DublinCore_Feed', + 'Atom_Feed', + 'Content_Entry', + 'DublinCore_Entry', + 'Atom_Entry' + ) + ); + + /** + * Get the Feed cache + * + * @return Zend_Cache_Core + */ + public static function getCache() + { + return self::$_cache; + } + + /** + * Set the feed cache + * + * @param Zend_Cache_Core $cache + * @return void + */ + public static function setCache(Zend_Cache_Core $cache) + { + self::$_cache = $cache; + } + + /** + * Set the HTTP client instance + * + * Sets the HTTP client object to use for retrieving the feeds. + * + * @param Zend_Http_Client $httpClient + * @return void + */ + public static function setHttpClient(Zend_Http_Client $httpClient) + { + self::$_httpClient = $httpClient; + } + + + /** + * Gets the HTTP client object. If none is set, a new Zend_Http_Client will be used. + * + * @return Zend_Http_Client_Abstract + */ + public static function getHttpClient() + { + if (!self::$_httpClient instanceof Zend_Http_Client) { + /** + * @see Zend_Http_Client + */ + require_once 'Zend/Http/Client.php'; + self::$_httpClient = new Zend_Http_Client(); + } + + return self::$_httpClient; + } + + /** + * Toggle using POST instead of PUT and DELETE HTTP methods + * + * Some feed implementations do not accept PUT and DELETE HTTP + * methods, or they can't be used because of proxies or other + * measures. This allows turning on using POST where PUT and + * DELETE would normally be used; in addition, an + * X-Method-Override header will be sent with a value of PUT or + * DELETE as appropriate. + * + * @param boolean $override Whether to override PUT and DELETE. + * @return void + */ + public static function setHttpMethodOverride($override = true) + { + self::$_httpMethodOverride = $override; + } + + /** + * Get the HTTP override state + * + * @return boolean + */ + public static function getHttpMethodOverride() + { + return self::$_httpMethodOverride; + } + + /** + * Set the flag indicating whether or not to use HTTP conditional GET + * + * @param bool $bool + * @return void + */ + public static function useHttpConditionalGet($bool = true) + { + self::$_httpConditionalGet = $bool; + } + + /** + * Import a feed by providing a URL + * + * @param string $url The URL to the feed + * @param string $etag OPTIONAL Last received ETag for this resource + * @param string $lastModified OPTIONAL Last-Modified value for this resource + * @return Zend_Feed_Reader_Feed_Interface + */ + public static function import($uri, $etag = null, $lastModified = null) + { + $cache = self::getCache(); + $feed = null; + $responseXml = ''; + $client = self::getHttpClient(); + $client->resetParameters(); + $client->setHeaders('If-None-Match', null); + $client->setHeaders('If-Modified-Since', null); + $client->setUri($uri); + $cacheId = 'Zend_Feed_Reader_' . md5($uri); + + if (self::$_httpConditionalGet && $cache) { + $data = $cache->load($cacheId); + if ($data) { + if (is_null($etag)) { + $etag = $cache->load($cacheId.'_etag'); + } + if (is_null($lastModified)) { + $lastModified = $cache->load($cacheId.'_lastmodified');; + } + if ($etag) { + $client->setHeaders('If-None-Match', $etag); + } + if ($lastModified) { + $client->setHeaders('If-Modified-Since', $lastModified); + } + } + $response = $client->request('GET'); + if ($response->getStatus() !== 200 && $response->getStatus() !== 304) { + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus()); + } + if ($response->getStatus() == 304) { + $responseXml = $data; + } else { + $responseXml = $response->getBody(); + $cache->save($responseXml, $cacheId); + if ($response->getHeader('ETag')) { + $cache->save($response->getHeader('ETag'), $cacheId.'_etag'); + } + if ($response->getHeader('Last-Modified')) { + $cache->save($response->getHeader('Last-Modified'), $cacheId.'_lastmodified'); + } + } + return self::importString($responseXml); + } elseif ($cache) { + $data = $cache->load($cacheId); + if ($data !== false) { + return self::importString($data); + } + $response = $client->request('GET'); + if ($response->getStatus() !== 200) { + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus()); + } + $responseXml = $response->getBody(); + $cache->save($responseXml, $cacheId); + return self::importString($responseXml); + } else { + $response = $client->request('GET'); + if ($response->getStatus() !== 200) { + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Feed failed to load, got response code ' . $response->getStatus()); + } + return self::importString($response->getBody()); + } + } + + /** + * Import a feed by providing a Zend_Feed_Abstract object + * + * @param Zend_Feed_Abstract $feed A fully instantiated Zend_Feed object + * @return Zend_Feed_Reader_Feed_Interface + */ + public static function importFeed(Zend_Feed_Abstract $feed) + { + $dom = $feed->getDOM()->ownerDocument; + $type = self::detectType($dom); + self::_registerCoreExtensions(); + if (substr($type, 0, 3) == 'rss') { + $reader = new Zend_Feed_Reader_Feed_Rss($dom, $type); + } else { + $reader = new Zend_Feed_Reader_Feed_Atom($dom, $type); + } + + return $reader; + } + + /** + * Import a feed froma string + * + * @param string $string + * @return Zend_Feed_Reader_Feed_Interface + */ + public static function importString($string) + { + $libxml_errflag = libxml_use_internal_errors(true); + $dom = new DOMDocument; + $status = $dom->loadXML($string); + libxml_use_internal_errors($libxml_errflag); + + if (!$status) { + // Build error message + $error = libxml_get_last_error(); + if ($error && $error->message) { + $errormsg = "DOMDocument cannot parse XML: {$error->message}"; + } else { + $errormsg = "DOMDocument cannot parse XML: Please check the XML document's validity"; + } + + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception($errormsg); + } + + $type = self::detectType($dom); + + self::_registerCoreExtensions(); + + if (substr($type, 0, 3) == 'rss') { + $reader = new Zend_Feed_Reader_Feed_Rss($dom, $type); + } else { + $reader = new Zend_Feed_Reader_Feed_Atom($dom, $type); + } + return $reader; + } + + /** + * Imports a feed from a file located at $filename. + * + * @param string $filename + * @throws Zend_Feed_Exception + * @return Zend_Feed_Reader_FeedInterface + */ + public static function importFile($filename) + { + @ini_set('track_errors', 1); + $feed = @file_get_contents($filename); + @ini_restore('track_errors'); + if ($feed === false) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("File could not be loaded: $php_errormsg"); + } + return self::importString($feed); + } + + public static function findFeedLinks($uri) + { + // Get the HTTP response from $uri and save the contents + $client = self::getHttpClient(); + $client->setUri($uri); + $response = $client->request(); + if ($response->getStatus() !== 200) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("Failed to access $uri, got response code " . $response->getStatus()); + } + $responseHtml = $response->getBody(); + @ini_set('track_errors', 1); + $dom = new DOMDocument; + $status = @$dom->loadHTML($responseHtml); + @ini_restore('track_errors'); + if (!$status) { + if (!isset($php_errormsg)) { + if (function_exists('xdebug_is_enabled')) { + $php_errormsg = '(error message not available, when XDebug is running)'; + } else { + $php_errormsg = '(error message not available)'; + } + } + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + $feedLinks = new stdClass; + $links = $dom->getElementsByTagName('link'); + foreach ($links as $link) { + if (strtolower($link->getAttribute('rel')) !== 'alternate' + || !$link->getAttribute('type') || !$link->getAttribute('href')) { + continue; + } + if (!isset($feedLinks->rss) && $link->getAttribute('type') == 'application/rss+xml') { + $feedLinks->rss = $link->getAttribute('href'); + } elseif(!isset($feedLinks->atom) && $link->getAttribute('type') == 'application/atom+xml') { + $feedLinks->atom = $link->getAttribute('href'); + } elseif(!isset($feedLinks->rdf) && $link->getAttribute('type') == 'application/rdf+xml') { + $feedLinks->rdf = $link->getAttribute('href'); + } + if (isset($feedLinks->rss) && isset($feedLinks->atom) && isset($feedLinks->rdf)) { + break; + } + } + return $feedLinks; + } + + /** + * Detect the feed type of the provided feed + * + * @param Zend_Feed_Abstract $feed A fully instantiated Zend_Feed object + * @return string + */ + public static function detectType($feed) + { + if ($feed instanceof Zend_Feed_Reader_FeedInterface) { + $dom = $feed->getDomDocument(); + } elseif($feed instanceof DomDocument) { + $dom = $feed; + } elseif(is_string($feed) && !empty($feed)) { + @ini_set('track_errors', 1); + $dom = new DOMDocument; + $status = @$doc->loadXML($string); + @ini_restore('track_errors'); + if (!$status) { + if (!isset($php_errormsg)) { + if (function_exists('xdebug_is_enabled')) { + $php_errormsg = '(error message not available, when XDebug is running)'; + } else { + $php_errormsg = '(error message not available)'; + } + } + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + } else { + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Invalid object/scalar provided: must be of type Zend_Feed_Reader_FeedInterface, DomDocument or string'); + } + $xpath = new DOMXPath($dom); + + if ($xpath->query('/rss')->length) { + $type = self::TYPE_RSS_ANY; + $version = $xpath->evaluate('string(/rss/@version)'); + + if (strlen($version) > 0) { + switch($version) { + case '2.0': + $type = self::TYPE_RSS_20; + break; + + case '0.94': + $type = self::TYPE_RSS_094; + break; + + case '0.93': + $type = self::TYPE_RSS_093; + break; + + case '0.92': + $type = self::TYPE_RSS_092; + break; + + case '0.91': + $type = self::TYPE_RSS_091; + break; + } + } + + return $type; + } + + $xpath->registerNamespace('rdf', self::NAMESPACE_RDF); + + if ($xpath->query('/rdf:RDF')->length) { + $xpath->registerNamespace('rss', self::NAMESPACE_RSS_10); + + if ($xpath->query('/rdf:RDF/rss:channel')->length + || $xpath->query('/rdf:RDF/rss:image')->length + || $xpath->query('/rdf:RDF/rss:item')->length + || $xpath->query('/rdf:RDF/rss:textinput')->length + ) { + return self::TYPE_RSS_10; + } + + $xpath->registerNamespace('rss', self::NAMESPACE_RSS_090); + + if ($xpath->query('/rdf:RDF/rss:channel')->length + || $xpath->query('/rdf:RDF/rss:image')->length + || $xpath->query('/rdf:RDF/rss:item')->length + || $xpath->query('/rdf:RDF/rss:textinput')->length + ) { + return self::TYPE_RSS_090; + } + } + + $type = self::TYPE_ATOM_ANY; + $xpath->registerNamespace('atom', self::NAMESPACE_ATOM_10); + + if ($xpath->query('//atom:feed')->length) { + return self::TYPE_ATOM_10; + } + + $xpath->registerNamespace('atom', self::NAMESPACE_ATOM_03); + + if ($xpath->query('//atom:feed')->length) { + return self::TYPE_ATOM_03; + } + + return self::TYPE_ANY; + } + + /** + * Set plugin loader for use with Extensions + * + * @param Zend_Loader_PluginLoader_Interface $loader + */ + public static function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader) + { + self::$_pluginLoader = $loader; + } + + /** + * Get plugin loader for use with Extensions + * + * @return Zend_Loader_PluginLoader_Interface $loader + */ + public static function getPluginLoader() + { + if (!isset(self::$_pluginLoader)) { + require_once 'Zend/Loader/PluginLoader.php'; + self::$_pluginLoader = new Zend_Loader_PluginLoader(array( + 'Zend_Feed_Reader_Extension_' => 'Zend/Feed/Reader/Extension/', + )); + } + return self::$_pluginLoader; + } + + /** + * Add prefix path for loading Extensions + * + * @param string $prefix + * @param string $path + * @return void + */ + public static function addPrefixPath($prefix, $path) + { + $prefix = rtrim($prefix, '_'); + $path = rtrim($path, DIRECTORY_SEPARATOR); + self::getPluginLoader()->addPrefixPath($prefix, $path); + } + + /** + * Add multiple Extension prefix paths at once + * + * @param array $spec + * @return void + */ + public static function addPrefixPaths(array $spec) + { + if (isset($spec['prefix']) && isset($spec['path'])) { + self::addPrefixPath($spec['prefix'], $spec['path']); + } + foreach ($spec as $prefixPath) { + if (isset($prefixPath['prefix']) && isset($prefixPath['path'])) { + self::addPrefixPath($prefixPath['prefix'], $prefixPath['path']); + } + } + } + + /** + * Register an Extension by name + * + * @param string $name + * @return void + * @throws Zend_Feed_Exception if unable to resolve Extension class + */ + public static function registerExtension($name) + { + $feedName = $name . '_Feed'; + $entryName = $name . '_Entry'; + if (self::isRegistered($name)) { + if (self::getPluginLoader()->isLoaded($feedName) || + self::getPluginLoader()->isLoaded($entryName)) { + return; + } + } + try { + self::getPluginLoader()->load($feedName); + self::$_extensions['feed'][] = $feedName; + } catch (Zend_Loader_PluginLoader_Exception $e) { + } + try { + self::getPluginLoader()->load($entryName); + self::$_extensions['entry'][] = $entryName; + } catch (Zend_Loader_PluginLoader_Exception $e) { + } + if (!self::getPluginLoader()->isLoaded($feedName) + && !self::getPluginLoader()->isLoaded($entryName) + ) { + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Could not load extension: ' . $name + . 'using Plugin Loader. Check prefix paths are configured and extension exists.'); + } + } + + /** + * Is a given named Extension registered? + * + * @param string $extensionName + * @return boolean + */ + public static function isRegistered($extensionName) + { + $feedName = $extensionName . '_Feed'; + $entryName = $extensionName . '_Entry'; + if (in_array($feedName, self::$_extensions['feed']) + || in_array($entryName, self::$_extensions['entry']) + ) { + return true; + } + return false; + } + + /** + * Get a list of extensions + * + * @return array + */ + public static function getExtensions() + { + return self::$_extensions; + } + + /** + * Reset class state to defaults + * + * @return void + */ + public static function reset() + { + self::$_cache = null; + self::$_httpClient = null; + self::$_httpMethodOverride = false; + self::$_httpConditionalGet = false; + self::$_pluginLoader = null; + self::$_prefixPaths = array(); + self::$_extensions = array( + 'feed' => array( + 'DublinCore_Feed', + 'Atom_Feed' + ), + 'entry' => array( + 'Content_Entry', + 'DublinCore_Entry', + 'Atom_Entry' + ), + 'core' => array( + 'DublinCore_Feed', + 'Atom_Feed', + 'Content_Entry', + 'DublinCore_Entry', + 'Atom_Entry' + ) + ); + } + + /** + * Register core (default) extensions + * + * @return void + */ + protected static function _registerCoreExtensions() + { + self::registerExtension('DublinCore'); + self::registerExtension('Content'); + self::registerExtension('Atom'); + self::registerExtension('Slash'); + self::registerExtension('WellFormedWeb'); + self::registerExtension('Thread'); + self::registerExtension('Podcast'); + } +} diff --git a/lib/zend/Zend/Feed/Reader/Entry/Atom.php b/lib/zend/Zend/Feed/Reader/Entry/Atom.php new file mode 100644 index 0000000000..d2556a0a4b --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Entry/Atom.php @@ -0,0 +1,357 @@ +_xpathQuery = '//atom:entry[' . ($this->_entryKey + 1) . ']'; + + $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Atom_Entry'); + $this->_extensions['Atom_Entry'] = new $atomClass($entry, $entryKey, $type); + + $threadClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Thread_Entry'); + $this->_extensions['Thread_Entry'] = new $threadClass($entry, $entryKey, $type); + } + + /** + * Get the specified author + * + * @param int $index + * @return string|null + */ + public function getAuthor($index = 0) + { + $authors = $this->getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->_data)) { + return $this->_data['authors']; + } + + $people = $this->getExtension('Atom')->getAuthors(); + + $this->_data['authors'] = $people; + + return $this->_data['authors']; + } + + /** + * Get the entry content + * + * @return string + */ + public function getContent() + { + if (array_key_exists('content', $this->_data)) { + return $this->_data['content']; + } + + $content = $this->getExtension('Atom')->getContent(); + + $this->_data['content'] = $content; + + return $this->_data['content']; + } + + /** + * Get the entry creation date + * + * @return string + */ + public function getDateCreated() + { + if (array_key_exists('datecreated', $this->_data)) { + return $this->_data['datecreated']; + } + + $dateCreated = $this->getExtension('Atom')->getDateCreated(); + + $this->_data['datecreated'] = $dateCreated; + + return $this->_data['datecreated']; + } + + /** + * Get the entry modification date + * + * @return string + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->_data)) { + return $this->_data['datemodified']; + } + + $dateModified = $this->getExtension('Atom')->getDateModified(); + + $this->_data['datemodified'] = $dateModified; + + return $this->_data['datemodified']; + } + + /** + * Get the entry description + * + * @return string + */ + public function getDescription() + { + if (array_key_exists('description', $this->_data)) { + return $this->_data['description']; + } + + $description = $this->getExtension('Atom')->getDescription(); + + $this->_data['description'] = $description; + + return $this->_data['description']; + } + + /** + * Get the entry enclosure + * + * @return string + */ + public function getEnclosure() + { + if (array_key_exists('enclosure', $this->_data)) { + return $this->_data['enclosure']; + } + + $enclosure = $this->getExtension('Atom')->getEnclosure(); + + $this->_data['enclosure'] = $enclosure; + + return $this->_data['enclosure']; + } + + /** + * Get the entry ID + * + * @return string + */ + public function getId() + { + if (array_key_exists('id', $this->_data)) { + return $this->_data['id']; + } + + $id = $this->getExtension('Atom')->getId(); + + $this->_data['id'] = $id; + + return $this->_data['id']; + } + + /** + * Get a specific link + * + * @param int $index + * @return string + */ + public function getLink($index = 0) + { + if (!array_key_exists('links', $this->_data)) { + $this->getLinks(); + } + + if (isset($this->_data['links'][$index])) { + return $this->_data['links'][$index]; + } + + return null; + } + + /** + * Get all links + * + * @return array + */ + public function getLinks() + { + if (array_key_exists('links', $this->_data)) { + return $this->_data['links']; + } + + $links = $this->getExtension('Atom')->getLinks(); + + $this->_data['links'] = $links; + + return $this->_data['links']; + } + + /** + * Get a permalink to the entry + * + * @return string + */ + public function getPermalink() + { + return $this->getLink(0); + } + + /** + * Get the entry title + * + * @return string + */ + public function getTitle() + { + if (array_key_exists('title', $this->_data)) { + return $this->_data['title']; + } + + $title = $this->getExtension('Atom')->getTitle(); + + $this->_data['title'] = $title; + + return $this->_data['title']; + } + + /** + * Get the number of comments/replies for current entry + * + * @return integer + */ + public function getCommentCount() + { + if (array_key_exists('commentcount', $this->_data)) { + return $this->_data['commentcount']; + } + + $commentcount = $this->getExtension('Thread')>getCommentCount(); + + if (!$commentcount) { + $commentcount = $this->getExtension('Atom')->getCommentCount(); + } + + $this->_data['commentcount'] = $commentcount; + + return $this->_data['commentcount']; + } + + /** + * Returns a URI pointing to the HTML page where comments can be made on this entry + * + * @return string + */ + public function getCommentLink() + { + if (array_key_exists('commentlink', $this->_data)) { + return $this->_data['commentlink']; + } + + $commentlink = $this->getExtension('Atom')->getCommentLink(); + + $this->_data['commentlink'] = $commentlink; + + return $this->_data['commentlink']; + } + + /** + * Returns a URI pointing to a feed of all comments for this entry + * + * @return string + */ + public function getCommentFeedLink() + { + if (array_key_exists('commentfeedlink', $this->_data)) { + return $this->_data['commentfeedlink']; + } + + $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink(); + + $this->_data['commentfeedlink'] = $commentfeedlink; + + return $this->_data['commentfeedlink']; + } + + /** + * Set the XPath query (incl. on all Extensions) + * + * @param DOMXPath $xpath + */ + public function setXpath(DOMXPath $xpath) + { + parent::setXpath($xpath); + foreach ($this->_extensions as $extension) { + $extension->setXpath($this->_xpath); + } + } +} diff --git a/lib/zend/Zend/Feed/Reader/Entry/Rss.php b/lib/zend/Zend/Feed/Reader/Entry/Rss.php new file mode 100644 index 0000000000..0a3463225c --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Entry/Rss.php @@ -0,0 +1,614 @@ +_xpathQueryRss = '//item[' . ($this->_entryKey+1) . ']'; + $this->_xpathQueryRdf = '//rss:item[' . ($this->_entryKey+1) . ']'; + + $pluginLoader = Zend_Feed_Reader::getPluginLoader(); + + $dublinCoreClass = $pluginLoader->getClassName('DublinCore_Entry'); + $this->_extensions['DublinCore_Entry'] = new $dublinCoreClass($entry, $entryKey, $type); + + $contentClass = $pluginLoader->getClassName('Content_Entry'); + $this->_extensions['Content_Entry'] = new $contentClass($entry, $entryKey, $type); + + $atomClass = $pluginLoader->getClassName('Atom_Entry'); + $this->_extensions['Atom_Entry'] = new $atomClass($entry, $entryKey, $type); + + $wfwClass = $pluginLoader->getClassName('WellFormedWeb_Entry'); + $this->_extensions['WellFormedWeb_Entry'] = new $wfwClass($entry, $entryKey, $type); + + $slashClass = $pluginLoader->getClassName('Slash_Entry'); + $this->_extensions['Slash_Entry'] = new $slashClass($entry, $entryKey, $type); + + $threadClass = $pluginLoader->getClassName('Thread_Entry'); + $this->_extensions['Thread_Entry'] = new $threadClass($entry, $entryKey, $type); + } + + /** + * Get an author entry + * + * @param DOMElement $element + * @return string + */ + public function getAuthor($index = 0) + { + $authors = $this->getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->_data)) { + return $this->_data['authors']; + } + + $authors = array(); + // @todo: create a list from all potential sources rather than from alternatives + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $list = $this->_xpath->evaluate($this->_xpathQueryRss.'//author'); + } else { + $list = $this->_xpath->evaluate($this->_xpathQueryRdf.'//rss:author'); + } + if (!$list->length) { + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $list = $this->_xpath->query('//author'); + } else { + $list = $this->_xpath->query('//rss:author'); + } + } + + if ($list->length) { + foreach ($list as $author) { + if ($this->getType() == Zend_Feed_Reader::TYPE_RSS_20 + && preg_match("/\(([^\)]+)\)/", $author->nodeValue, $matches, PREG_OFFSET_CAPTURE) + ) { + // source name from RSS 2.0 + // format "joe@example.com (Joe Bloggs)" + $authors[] = $matches[1][0]; + } else { + $authors[] = $author->nodeValue; + } + } + + $authors = array_unique($authors); + } + + if (empty($authors)) { + $authors = $this->getExtension('DublinCore')->getAuthors(); + } + + if (empty($authors)) { + $authors = $this->getExtension('Atom')->getAuthors(); + } + + $this->_data['authors'] = $authors; + + return $this->_data['authors']; + } + + /** + * Get the entry content + * + * @return string + */ + public function getContent() + { + if (array_key_exists('content', $this->_data)) { + return $this->_data['content']; + } + + $content = $this->getExtension('Content')->getContent(); + + if (!$content) { + $content = $this->getDescription(); + } + + if (empty($content)) { + $content = $this->getExtension('Atom')->getContent(); + } + + $this->_data['content'] = $content; + + return $this->_data['content']; + } + + /** + * Get the entry's date of creation + * + * @return string + */ + public function getDateCreated() + { + return $this->getDateModified(); + } + + /** + * Get the entry's date of modification + * + * @return string + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->_data)) { + return $this->_data['datemodified']; + } + + $dateModified = null; + $date = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 + && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 + ) { + $dateModified = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/pubDate)'); + if ($dateModified) { + $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822, + Zend_Date::RFC_2822, Zend_Date::DATES); + $date = new Zend_Date; + foreach ($dateStandards as $standard) { + try { + $date->set($dateModified, $standard); + break; + } catch (Zend_Date_Exception $e) { + if ($standard == Zend_Date::DATES) { + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception( + 'Could not load date due to unrecognised' + .' format (should follow RFC 822 or 2822):' + . $e->getMessage() + ); + } + } + } + } + } + + if (!$date) { + $date = $this->getExtension('DublinCore')->getDate(); + } + + if (!$date) { + $date = $this->getExtension('Atom')->getDateModified(); + } + + if (!$date) { + $date = null; + } + + $this->_data['datemodified'] = $date; + + return $this->_data['datemodified']; + } + + /** + * Get the entry description + * + * @return string + */ + public function getDescription() + { + if (array_key_exists('description', $this->_data)) { + return $this->_data['description']; + } + + $description = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 + && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 + ) { + $description = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/description)'); + } else { + $description = $this->_xpath->evaluate('string('.$this->_xpathQueryRdf.'/rss:description)'); + } + + if (!$description) { + $description = $this->getExtension('DublinCore')->getDescription(); + } + + if (empty($description)) { + $description = $this->getExtension('Atom')->getDescription(); + } + + if (!$description) { + $description = null; + } else { + $description = html_entity_decode($description, ENT_QUOTES, $this->getEncoding()); + } + + $this->_data['description'] = $description; + + return $this->_data['description']; + } + + /** + * Get the entry enclosure + * @return string + */ + public function getEnclosure() + { + if (array_key_exists('enclosure', $this->_data)) { + return $this->_data['enclosure']; + } + + $enclosure = null; + + if ($this->getType() == Zend_Feed_Reader::TYPE_RSS_20) { + $nodeList = $this->_xpath->query($this->_xpathQueryRss . '/enclosure'); + + if ($nodeList->length > 0) { + $enclosure = new stdClass(); + $enclosure->url = $nodeList->item(0)->getAttribute('url'); + $enclosure->length = $nodeList->item(0)->getAttribute('length'); + $enclosure->type = $nodeList->item(0)->getAttribute('type'); + } + } + + if (!$enclosure) { + $enclosure = $this->getExtension('Atom')->getEnclosure(); + } + + $this->_data['enclosure'] = $enclosure; + + return $this->_data['enclosure']; + } + + /** + * Get the entry ID + * + * @return string + */ + public function getId() + { + if (array_key_exists('id', $this->_data)) { + return $this->_data['id']; + } + + $id = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 + && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 + ) { + $id = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/guid)'); + } + + if (!$id) { + $id = $this->getExtension('DublinCore')->getId(); + } + + if (empty($id)) { + $id = $this->getExtension('Atom')->getId(); + } + + if (!$id) { + if ($this->getPermalink()) { + $id = $this->getPermalink(); + } elseif ($this->getTitle()) { + $id = $this->getTitle(); + } else { + $id = null; + } + } + + $this->_data['id'] = $id; + + return $this->_data['id']; + } + + /** + * Get a specific link + * + * @param int $index + * @return string + */ + public function getLink($index = 0) + { + if (!array_key_exists('links', $this->_data)) { + $this->getLinks(); + } + + if (isset($this->_data['links'][$index])) { + return $this->_data['links'][$index]; + } + + return null; + } + + /** + * Get all links + * + * @return array + */ + public function getLinks() + { + if (array_key_exists('links', $this->_data)) { + return $this->_data['links']; + } + + $links = array(); + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $list = $this->_xpath->query($this->_xpathQueryRss.'//link'); + } else { + $list = $this->_xpath->query($this->_xpathQueryRdf.'//rss:link'); + } + + if (!$list->length) { + $links = $this->getExtension('Atom')->getLinks(); + } else { + foreach ($list as $link) { + $links[] = $link->nodeValue; + } + } + + $this->_data['links'] = $links; + + return $this->_data['links']; + } + + /** + * Get a permalink to the entry + * + * @return string + */ + public function getPermalink() + { + return $this->getLink(0); + } + + /** + * Get the entry title + * + * @return string + */ + public function getTitle() + { + if (array_key_exists('title', $this->_data)) { + return $this->_data['title']; + } + + $title = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 + && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 + ) { + $title = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/title)'); + } else { + $title = $this->_xpath->evaluate('string('.$this->_xpathQueryRdf.'/rss:title)'); + } + + if (!$title) { + $title = $this->getExtension('DublinCore')->getTitle(); + } + + if (!$title) { + $title = $this->getExtension('Atom')->getTitle(); + } + + if (!$title) { + $title = null; + } + + $this->_data['title'] = $title; + + return $this->_data['title']; + } + + /** + * Get the number of comments/replies for current entry + * + * @return string|null + */ + public function getCommentCount() + { + if (array_key_exists('commentcount', $this->_data)) { + return $this->_data['commentcount']; + } + + $commentcount = $this->getExtension('Slash')->getCommentCount(); + + if (!$commentcount) { + $commentcount = $this->getExtension('Thread')->getCommentCount(); + } + + if (!$commentcount) { + $commentcount = $this->getExtension('Atom')->getCommentCount(); + } + + if (!$commentcount) { + $commentcount = null; + } + + $this->_data['commentcount'] = $commentcount; + + return $this->_data['commentcount']; + } + + /** + * Returns a URI pointing to the HTML page where comments can be made on this entry + * + * @return string + */ + public function getCommentLink() + { + if (array_key_exists('commentlink', $this->_data)) { + return $this->_data['commentlink']; + } + + $commentlink = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 + && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 + ) { + $commentlink = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/comments)'); + } + + if (!$commentlink) { + $commentlink = $this->getExtension('Atom')->getCommentLink(); + } + + if (!$commentlink) { + $commentlink = null; + } + + $this->_data['commentlink'] = $commentlink; + + return $this->_data['commentlink']; + } + + /** + * Returns a URI pointing to a feed of all comments for this entry + * + * @return string + */ + public function getCommentFeedLink() + { + if (array_key_exists('commentfeedlink', $this->_data)) { + return $this->_data['commentfeedlink']; + } + + $commentfeedlink = $this->getExtension('WellFormedWeb')->getCommentFeedLink(); + + if (!$commentfeedlink) { + $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink('rss'); + } + + if (!$commentfeedlink) { + $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink('rdf'); + } + + if (!$commentfeedlink) { + $commentfeedlink = null; + } + + $this->_data['commentfeedlink'] = $commentfeedlink; + + return $this->_data['commentfeedlink']; + } + + /** + * Set the XPath query (incl. on all Extensions) + * + * @param DOMXPath $xpath + */ + public function setXpath(DOMXPath $xpath) + { + parent::setXpath($xpath); + foreach ($this->_extensions as $extension) { + $extension->setXpath($this->_xpath); + } + } +} diff --git a/lib/zend/Zend/Feed/Reader/EntryAbstract.php b/lib/zend/Zend/Feed/Reader/EntryAbstract.php new file mode 100644 index 0000000000..2c04d99fd5 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/EntryAbstract.php @@ -0,0 +1,242 @@ +_entry = $entry; + $this->_entryKey = $entryKey; + $this->_domDocument = $entry->ownerDocument; + if ($type !== null) { + $this->_data['type'] = $type; + } else { + $this->_data['type'] = Zend_Feed_Reader::detectType($feed); + } + $this->_loadExtensions(); + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->_domDocument; + } + + /** + * Get the entry element + * + * @return DOMElement + */ + public function getElement() + { + return $this->_entry; + } + + /** + * Get the Entry's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + return $assumed; + } + + /** + * Get entry as xml + * + * @return string + */ + public function saveXml() + { + $dom = new DOMDocument('1.0', $this->getEncoding()); + $entry = $dom->importNode($this->getElement(), true); + $dom->appendChild($entry); + return $dom->saveXml(); + } + + /** + * Get the entry type + * + * @return string + */ + public function getType() + { + return $this->_data['type']; + } + + /** + * Get the XPath query object + * + * @return DOMXPath + */ + public function getXpath() + { + return $this->_xpath; + } + + /** + * Set the XPath query + * + * @param DOMXPath $xpath + * @return Zend_Feed_Reader_Entry_EntryAbstract + */ + public function setXpath(DOMXPath $xpath) + { + $this->_xpath = $xpath; + return $this; + } + + /** + * Serialize the entry to an array + * + * @return array + */ + public function toArray() + { + return $this->_data; + } + + /** + * Get registered extensions + * + * @return array + */ + public function getExtensions() + { + return $this->_extensions; + } + + /** + * Return an Extension object with the matching name (postfixed with _Entry) + * + * @param string $name + * @return Zend_Feed_Reader_Extension_EntryAbstract + */ + public function getExtension($name) + { + if (array_key_exists($name . '_Entry', $this->_extensions)) { + return $this->_extensions[$name . '_Entry']; + } + return null; + } + + /** + * Method overloading: call given method on first extension implementing it + * + * @param string $method + * @param array $args + * @return mixed + * @throws Zend_Feed_Exception if no extensions implements the method + */ + public function __call($method, $args) + { + foreach ($this->_extensions as $extension) { + if (method_exists($extension, $method)) { + return call_user_func_array(array($extension, $method), $args); + } + } + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Method: ' . $method + . 'does not exist and could not be located on a registered Extension'); + } + + /** + * Load extensions from Zend_Feed_Reader + * + * @return void + */ + protected function _loadExtensions() + { + $all = Zend_Feed_Reader::getExtensions(); + $feed = $all['entry']; + foreach ($feed as $extension) { + if (in_array($extension, $all['core'])) { + continue; + } + $className = Zend_Feed_Reader::getPluginLoader()->getClassName($extension); + $this->_extensions[$extension] = new $className( + $this->getElement(), $this->_entryKey, $this->_data['type'] + ); + } + } +} diff --git a/lib/zend/Zend/Feed/Reader/EntryInterface.php b/lib/zend/Zend/Feed/Reader/EntryInterface.php new file mode 100644 index 0000000000..db3d26dc54 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/EntryInterface.php @@ -0,0 +1,136 @@ +getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->_data)) { + return $this->_data['authors']; + } + + $authors = $this->_xpath->query( + $this->getXpathPrefix() . '//atom:author' . '|' + . $this->getXpathPrefix(). '//atom:contributor' + ); + + if (!$authors->length) { + $authors = $this->_xpath->query( + '//atom:author' . '|' . '//atom:contributor' + ); + } + + $people = array(); + + if ($authors->length) { + foreach ($authors as $author) { + $author = $this->_getAuthor($author); + + if (!empty($author)) { + $people[] = $author; + } + } + } + + $people = array_unique($people); + + $this->_data['authors'] = $people; + + return $this->_data['authors']; + } + + /** + * Get the entry content + * + * @return string + */ + public function getContent() + { + if (array_key_exists('content', $this->_data)) { + return $this->_data['content']; + } + + $content = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:content)'); + + if ($content) { + $content = html_entity_decode($content, ENT_QUOTES, $this->getEncoding()); + } + + if (!$content) { + $content = $this->getDescription(); + } + + $this->_data['content'] = $content; + + return $this->_data['content']; + } + + /** + * Get the entry creation date + * + * @return string + */ + public function getDateCreated() + { + if (array_key_exists('datecreated', $this->_data)) { + return $this->_data['datecreated']; + } + + $date = null; + + if ($this->getType() === Zend_Feed_Reader::TYPE_ATOM_03) { + $dateCreated = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:created)'); + } else { + $dateCreated = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:published)'); + } + + if ($dateCreated) { + $date = new Zend_Date; + $date->set($dateCreated, Zend_Date::ISO_8601); + } + + $this->_data['datecreated'] = $date; + + return $this->_data['datecreated']; + } + + /** + * Get the entry modification date + * + * @return string + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->_data)) { + return $this->_data['datemodified']; + } + + $date = null; + + if ($this->getType() === Zend_Feed_Reader::TYPE_ATOM_03) { + $dateModified = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:modified)'); + } else { + $dateModified = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:updated)'); + } + + if ($dateModified) { + $date = new Zend_Date; + $date->set($dateModified, Zend_Date::ISO_8601); + } + + $this->_data['datemodified'] = $date; + + return $this->_data['datemodified']; + } + + /** + * Get the entry description + * + * @return string + */ + public function getDescription() + { + if (array_key_exists('description', $this->_data)) { + return $this->_data['description']; + } + + $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:summary)'); + + if (!$description) { + $description = null; + } else { + $description = html_entity_decode($description, ENT_QUOTES, $this->getEncoding()); + } + + $this->_data['description'] = $description; + + return $this->_data['description']; + } + + /** + * Get the entry enclosure + * + * @return string + */ + public function getEnclosure() + { + if (array_key_exists('enclosure', $this->_data)) { + return $this->_data['enclosure']; + } + + $enclosure = null; + + $nodeList = $this->_xpath->query($this->getXpathPrefix() . '/atom:link[@rel="enclosure"]'); + + if ($nodeList->length > 0) { + $enclosure = new stdClass(); + $enclosure->url = $nodeList->item(0)->getAttribute('href'); + $enclosure->length = $nodeList->item(0)->getAttribute('length'); + $enclosure->type = $nodeList->item(0)->getAttribute('type'); + } + + $this->_data['enclosure'] = $enclosure; + + return $this->_data['enclosure']; + } + + /** + * Get the entry ID + * + * @return string + */ + public function getId() + { + if (array_key_exists('id', $this->_data)) { + return $this->_data['id']; + } + + $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:id)'); + + if (!$id) { + if ($this->getPermalink()) { + $id = $this->getPermalink(); + } elseif ($this->getTitle()) { + $id = $this->getTitle(); + } else { + $id = null; + } + } + + $this->_data['id'] = $id; + + return $this->_data['id']; + } + + /** + * Get a specific link + * + * @param int $index + * @return string + */ + public function getLink($index = 0) + { + if (!array_key_exists('links', $this->_data)) { + $this->getLinks(); + } + + if (isset($this->_data['links'][$index])) { + return $this->_data['links'][$index]; + } + + return null; + } + + /** + * Get all links + * + * @return array + */ + public function getLinks() + { + if (array_key_exists('links', $this->_data)) { + return $this->_data['links']; + } + + $links = array(); + + $list = $this->_xpath->query( + $this->getXpathPrefix() . '//atom:link[@rel="alternate"]/@href' . '|' . + $this->getXpathPrefix() . '//atom:link[not(@rel)]/@href' + ); + + if ($list->length) { + foreach ($list as $link) { + $links[] = $link->value; + } + } + + $this->_data['links'] = $links; + + return $this->_data['links']; + } + + /** + * Get a permalink to the entry + * + * @return string + */ + public function getPermalink() + { + return $this->getLink(0); + } + + /** + * Get the entry title + * + * @return string + */ + public function getTitle() + { + if (array_key_exists('title', $this->_data)) { + return $this->_data['title']; + } + + $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:title)'); + + if (!$title) { + $title = null; + } else { + $title = html_entity_decode($title, ENT_QUOTES, $this->getEncoding()); + } + + $this->_data['title'] = $title; + + return $this->_data['title']; + } + + /** + * Get the number of comments/replies for current entry + * + * @return integer + */ + public function getCommentCount() + { + if (array_key_exists('commentcount', $this->_data)) { + return $this->_data['commentcount']; + } + + $count = null; + + $this->_xpath->registerNamespace('thread10', 'http://purl.org/syndication/thread/1.0'); + $list = $this->_xpath->query( + $this->getXpathPrefix() . '//atom:link[@rel="replies"]/@thread10:count' + ); + + if ($list->length) { + $count = $list->item(0)->value; + } + + $this->_data['commentcount'] = $count; + + return $this->_data['commentcount']; + } + + /** + * Returns a URI pointing to the HTML page where comments can be made on this entry + * + * @return string + */ + public function getCommentLink() + { + if (array_key_exists('commentlink', $this->_data)) { + return $this->_data['commentlink']; + } + + $link = null; + + $list = $this->_xpath->query( + $this->getXpathPrefix() . '//atom:link[@rel="replies" and @type="text/html"]/@href' + ); + + if ($list->length) { + $link = $list->item(0)->value; + } + + $this->_data['commentlink'] = $link; + + return $this->_data['commentlink']; + } + + /** + * Returns a URI pointing to a feed of all comments for this entry + * + * @return string + */ + public function getCommentFeedLink($type = 'atom') + { + if (array_key_exists('commentfeedlink', $this->_data)) { + return $this->_data['commentfeedlink']; + } + + $link = null; + + $list = $this->_xpath->query( + $this->getXpathPrefix() . '//atom:link[@rel="replies" and @type="application/'.$type.'+xml"]/@href' + ); + + if ($list->length) { + $link = $list->item(0)->value; + } + + $this->_data['commentfeedlink'] = $link; + + return $this->_data['commentfeedlink']; + } + + /** + * Get an author entry + * + * @param DOMElement $element + * @return string + */ + protected function _getAuthor(DOMElement $element) + { + $email = null; + $name = null; + $uri = null; + + $emailNode = $element->getElementsByTagName('email'); + $nameNode = $element->getElementsByTagName('name'); + $uriNode = $element->getElementsByTagName('uri'); + + if ($emailNode->length) { + $email = $emailNode->item(0)->nodeValue; + } + + if ($nameNode->length) { + $name = $nameNode->item(0)->nodeValue; + } + + if ($uriNode->length) { + $uri = $uriNode->item(0)->nodeValue; + } + + if (!empty($email)) { + return $email . (empty($name) ? '' : ' (' . $name . ')'); + } else if (!empty($name)) { + return $name; + } else if (!empty($uri)) { + return $uri; + } + + return null; + } + + /** + * Register the default namespaces for the current feed format + */ + protected function _registerNamespaces() + { + if ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 + || $this->getType() == Zend_Feed_Reader::TYPE_ATOM_03 + ) { + return; // pre-registered at Feed level + } + $atomDetected = $this->_getAtomType(); + switch ($atomDetected) { + case Zend_Feed_Reader::TYPE_ATOM_03: + $this->_xpath->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_03); + break; + default: + $this->_xpath->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_10); + break; + } + } + + /** + * Detect the presence of any Atom namespaces in use + */ + protected function _getAtomType() + { + $nslist = $this->getDomDocument()->documentElement->attributes; + if (!$nslist->length) { + return null; + } + foreach ($nslist as $ns) { + if ($ns->value == Zend_Feed_Reader::NAMESPACE_ATOM_10) { + return Zend_Feed_Reader::TYPE_ATOM_10; + } + if ($ns->value == Zend_Feed_Reader::NAMESPACE_ATOM_03) { + return Zend_Feed_Reader::TYPE_ATOM_03; + } + } + } +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/Atom/Feed.php b/lib/zend/Zend/Feed/Reader/Extension/Atom/Feed.php new file mode 100644 index 0000000000..10b665297c --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/Atom/Feed.php @@ -0,0 +1,441 @@ +getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->_data)) { + return $this->_data['authors']; + } + + $authors = $this->_xpath->query('//atom:author'); + $contributors = $this->_xpath->query('//atom:contributor'); + + $people = array(); + + if ($authors->length) { + foreach ($authors as $author) { + $author = $this->_getAuthor($author); + + if (!empty($author)) { + $people[] = $author; + } + } + } + + if ($contributors->length) { + foreach ($contributors as $contributor) { + $contributor = $this->_getAuthor($contributor); + + if (!empty($contributor)) { + $people[] = $contributor; + } + } + } + + if (empty($people)) { + $people = null; + } else { + $people = array_unique($people); + } + + $this->_data['authors'] = $people; + + return $this->_data['authors']; + } + + /** + * Get the copyright entry + * + * @return string|null + */ + public function getCopyright() + { + if (array_key_exists('copyright', $this->_data)) { + return $this->_data['copyright']; + } + + $copyright = null; + + if ($this->getType() === Zend_Feed_Reader::TYPE_ATOM_03) { + $copyright = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:copyright)'); + } else { + $copyright = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:rights)'); + } + + if (!$copyright) { + $copyright = null; + } + + $this->_data['copyright'] = $copyright; + + return $this->_data['copyright']; + } + + /** + * Get the feed creation date + * + * @return Zend_Date|null + */ + public function getDateCreated() + { + if (array_key_exists('datecreated', $this->_data)) { + return $this->_data['datecreated']; + } + + $date = null; + + if ($this->getType() === Zend_Feed_Reader::TYPE_ATOM_03) { + $dateCreated = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:created)'); + } else { + $dateCreated = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:published)'); + } + + if ($dateCreated) { + $date = new Zend_Date; + $date->set($dateCreated, Zend_Date::ISO_8601); + } + + $this->_data['datecreated'] = $date; + + return $this->_data['datecreated']; + } + + /** + * Get the feed modification date + * + * @return Zend_Date|null + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->_data)) { + return $this->_data['datemodified']; + } + + $date = null; + + if ($this->getType() === Zend_Feed_Reader::TYPE_ATOM_03) { + $dateModified = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:modified)'); + } else { + $dateModified = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:updated)'); + } + + if ($dateModified) { + $date = new Zend_Date; + $date->set($dateModified, Zend_Date::ISO_8601); + } + + $this->_data['datemodified'] = $date; + + return $this->_data['datemodified']; + } + + /** + * Get the feed description + * + * @return string|null + */ + public function getDescription() + { + if (array_key_exists('description', $this->_data)) { + return $this->_data['description']; + } + + $description = null; + + if ($this->getType() === Zend_Feed_Reader::TYPE_ATOM_03) { + $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:tagline)'); // TODO: Is this the same as subtitle? + } else { + $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:subtitle)'); + } + + if (!$description) { + $description = null; + } + + $this->_data['description'] = $description; + + return $this->_data['description']; + } + + /** + * Get the feed generator entry + * + * @return string|null + */ + public function getGenerator() + { + if (array_key_exists('generator', $this->_data)) { + return $this->_data['generator']; + } + // TODO: Add uri support + $generator = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:generator)'); + + if (!$generator) { + $generator = null; + } else { + $generator = html_entity_decode($generator, ENT_QUOTES, $this->getEncoding()); + } + + $this->_data['generator'] = $generator; + + return $this->_data['generator']; + } + + /** + * Get the feed ID + * + * @return string|null + */ + public function getId() + { + if (array_key_exists('id', $this->_data)) { + return $this->_data['id']; + } + + $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:id)'); + + if (!$id) { + if ($this->getLink()) { + $id = $this->getLink(); + } elseif ($this->getTitle()) { + $id = $this->getTitle(); + } else { + $id = null; + } + } + + $this->_data['id'] = $id; + + return $this->_data['id']; + } + + /** + * Get the feed language + * + * @return string|null + */ + public function getLanguage() + { + if (array_key_exists('language', $this->_data)) { + return $this->_data['language']; + } + + $language = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:lang)'); + + if (!$language) { + $language = $this->_xpath->evaluate('string(//@xml:lang[1])'); + } + + if (!$language) { + $language = null; + } + + $this->_data['language'] = $language; + + return $this->_data['language']; + } + + /** + * Get a link to the source website + * + * @return string|null + */ + public function getLink() + { + if (array_key_exists('link', $this->_data)) { + return $this->_data['link']; + } + + $link = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:link/@href)'); + + if (!$link) { + $link = null; + } + + $this->_data['link'] = $link; + + return $this->_data['link']; + } + + /** + * Get a link to the feed's XML Url + * + * @return string|null + */ + public function getFeedLink() + { + if (array_key_exists('feedlink', $this->_data)) { + return $this->_data['feedlink']; + } + + $link = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:link[@rel="self"]/@href)'); + + if (!$link) { + $link = null; + } + + $this->_data['feedlink'] = $link; + + return $this->_data['feedlink']; + } + + /** + * Get the feed title + * + * @return string|null + */ + public function getTitle() + { + if (array_key_exists('title', $this->_data)) { + return $this->_data['title']; + } + + $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:title)'); + + if (!$title) { + $title = null; + } + + $this->_data['title'] = $title; + + return $this->_data['title']; + } + + /** + * Get an author entry in RSS format + * + * @param DOMElement $element + * @return string + */ + protected function _getAuthor(DOMElement $element) + { + $email = null; + $name = null; + $uri = null; + + $emailNode = $element->getElementsByTagName('email'); + $nameNode = $element->getElementsByTagName('name'); + $uriNode = $element->getElementsByTagName('uri'); + + if ($emailNode->length) { + $email = $emailNode->item(0)->nodeValue; + } + + if ($nameNode->length) { + $name = $nameNode->item(0)->nodeValue; + } + + if ($uriNode->length) { + $uri = $uriNode->item(0)->nodeValue; + } + + if (!empty($email)) { + return $email . (empty($name) ? '' : ' (' . $name . ')'); + } else if (!empty($name)) { + return $name; + } else if (!empty($uri)) { + return $uri; + } + + return null; + } + + /** + * Register the default namespaces for the current feed format + */ + protected function _registerNamespaces() + { + if ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 + || $this->getType() == Zend_Feed_Reader::TYPE_ATOM_03 + ) { + return; // pre-registered at Feed level + } + $atomDetected = $this->_getAtomType(); + switch ($atomDetected) { + case Zend_Feed_Reader::TYPE_ATOM_03: + $this->_xpath->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_03); + break; + default: + $this->_xpath->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_10); + break; + } + } + + /** + * Detect the presence of any Atom namespaces in use + */ + protected function _getAtomType() + { + $nslist = $this->getDomDocument()->documentElement->attributes; + if (!$nslist->length) { + return null; + } + foreach ($nslist as $ns) { + if ($ns->value == Zend_Feed_Reader::NAMESPACE_ATOM_10) { + return Zend_Feed_Reader::TYPE_ATOM_10; + } + if ($ns->value == Zend_Feed_Reader::NAMESPACE_ATOM_03) { + return Zend_Feed_Reader::TYPE_ATOM_03; + } + } + } +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/Content/Entry.php b/lib/zend/Zend/Feed/Reader/Extension/Content/Entry.php new file mode 100644 index 0000000000..e3f4556368 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/Content/Entry.php @@ -0,0 +1,64 @@ +getType() !== Zend_Feed_Reader::TYPE_RSS_10 + && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 + ) { + $content = $this->_xpath->evaluate('string('.$this->getXpathPrefix().'/content:encoded)'); + } else { + $content = $this->_xpath->evaluate('string('.$this->getXpathPrefix().'/content:encoded)'); + } + if ($content) { + $content = html_entity_decode($content, ENT_QUOTES, $this->getEncoding()); + } + return $content; + } + + /** + * Register RSS Content Module namespace + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('content', 'http://purl.org/rss/1.0/modules/content/'); + } +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php b/lib/zend/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php new file mode 100644 index 0000000000..5f63618a16 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/CreativeCommons/Entry.php @@ -0,0 +1,97 @@ +getLicenses(); + + if (isset($licenses[$index])) { + return $licenses[$index]; + } + + return null; + } + + /** + * Get the entry licenses + * + * @return array + */ + public function getLicenses() + { + $name = 'licenses'; + if (array_key_exists($name, $this->_data)) { + return $this->_data[$name]; + } + + $licenses = array(); + $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//cc:license'); + + if ($list->length) { + foreach ($list as $license) { + $licenses[] = $license->nodeValue; + } + + $licenses = array_unique($licenses); + } else { + $cc = new Zend_Feed_Reader_Extension_CreativeCommons_Feed( + $this->_domDocument, $this->_data['type'], $this->_xpath + ); + $licenses = $cc->getLicenses(); + } + + $this->_data[$name] = $licenses; + + return $this->_data[$name]; + } + + /** + * Register Creative Commons namespaces + * + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('cc', 'http://backend.userland.com/creativeCommonsRssModule'); + } +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php b/lib/zend/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php new file mode 100644 index 0000000000..e6e8f517ca --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php @@ -0,0 +1,89 @@ +getLicenses(); + + if (isset($licenses[$index])) { + return $licenses[$index]; + } + + return null; + } + + /** + * Get the entry licenses + * + * @return array + */ + public function getLicenses() + { + $name = 'licenses'; + if (array_key_exists($name, $this->_data)) { + return $this->_data[$name]; + } + + $licenses = array(); + $list = $this->_xpath->evaluate('channel/cc:license'); + + if ($list->length) { + foreach ($list as $license) { + $licenses[] = $license->nodeValue; + } + + $licenses = array_unique($licenses); + } + + $this->_data[$name] = $licenses; + + return $this->_data[$name]; + } + + /** + * Register Creative Commons namespaces + * + * @return void + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('cc', 'http://backend.userland.com/creativeCommonsRssModule'); + } +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/DublinCore/Entry.php b/lib/zend/Zend/Feed/Reader/Extension/DublinCore/Entry.php new file mode 100644 index 0000000000..441d0e58f7 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/DublinCore/Entry.php @@ -0,0 +1,232 @@ +getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->_data)) { + return $this->_data['authors']; + } + + $authors = array(); + $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc11:creator'); + + if (!$list->length) { + $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc10:creator'); + } + if (!$list->length) { + $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc11:publisher'); + + if (!$list->length) { + $list = $this->_xpath->evaluate($this->getXpathPrefix() . '//dc10:publisher'); + } + } + + if ($list->length) { + foreach ($list as $author) { + if ($this->getType() == Zend_Feed_Reader::TYPE_RSS_20 + && preg_match("/\(([^\)]+)\)/", $author->nodeValue, $matches, PREG_OFFSET_CAPTURE) + ) { + $authors[] = $matches[1][0]; + } else { + $authors[] = $author->nodeValue; + } + } + + $authors = array_unique($authors); + } + + $this->_data['authors'] = $authors; + + return $this->_data['authors']; + } + + /** + * Get the entry content + * + * @return string + */ + public function getContent() + { + return $this->getDescription(); + } + + /** + * Get the entry description + * + * @return string + */ + public function getDescription() + { + if (array_key_exists('description', $this->_data)) { + return $this->_data['description']; + } + + $description = null; + $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:description)'); + + if (!$description) { + $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:description)'); + } + + if (!$description) { + $description = null; + } + + $this->_data['description'] = $description; + + return $this->_data['description']; + } + + /** + * Get the entry ID + * + * @return string + */ + public function getId() + { + if (array_key_exists('id', $this->_data)) { + return $this->_data['id']; + } + + $id = null; + $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:identifier)'); + + if (!$id) { + $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:identifier)'); + } + + $this->_data['id'] = $id; + + return $this->_data['id']; + } + + /** + * Get the entry title + * + * @return string + */ + public function getTitle() + { + if (array_key_exists('title', $this->_data)) { + return $this->_data['title']; + } + + $title = null; + $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:title)'); + + if (!$title) { + $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:title)'); + } + + if (!$title) { + $title = null; + } + + $this->_data['title'] = $title; + + return $this->_data['title']; + } + + /** + * + * + * @return Zend_Date|null + */ + public function getDate() + { + if (array_key_exists('date', $this->_data)) { + return $this->_data['date']; + } + + $d = null; + $date = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:date)'); + + if (!$date) { + $date = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:date)'); + } + + if ($date) { + $d = new Zend_Date; + $d->set($date, Zend_Date::ISO_8601); + } + + $this->_data['date'] = $d; + + return $this->_data['date']; + } + + /** + * Register DC namespaces + * + * @return void + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('dc10', 'http://purl.org/dc/elements/1.0/'); + $this->_xpath->registerNamespace('dc11', 'http://purl.org/dc/elements/1.1/'); + } +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/DublinCore/Feed.php b/lib/zend/Zend/Feed/Reader/Extension/DublinCore/Feed.php new file mode 100644 index 0000000000..6ba99c254f --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/DublinCore/Feed.php @@ -0,0 +1,265 @@ +getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->_data)) { + return $this->_data['authors']; + } + + $authors = array(); + $list = $this->_xpath->query('//dc11:creator'); + + if (!$list->length) { + $list = $this->_xpath->query('//dc10:creator'); + } + if (!$list->length) { + $list = $this->_xpath->query('//dc11:publisher'); + + if (!$list->length) { + $list = $this->_xpath->query('//dc10:publisher'); + } + } + + foreach ($list as $authorObj) { + $authors[] = $authorObj->nodeValue; + } + + if (!empty($authors)) { + $authors = array_unique($authors); + } + + $this->_data['authors'] = $authors; + + return $this->_data['authors']; + } + + /** + * Get the copyright entry + * + * @return string|null + */ + public function getCopyright() + { + if (array_key_exists('copyright', $this->_data)) { + return $this->_data['copyright']; + } + + $copyright = null; + $copyright = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:rights)'); + + if (!$copyright) { + $copyright = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:rights)'); + } + + if (!$copyright) { + $copyright = null; + } + + $this->_data['copyright'] = $copyright; + + return $this->_data['copyright']; + } + + /** + * Get the feed description + * + * @return string|null + */ + public function getDescription() + { + if (array_key_exists('description', $this->_data)) { + return $this->_data['description']; + } + + $description = null; + $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:description)'); + + if (!$description) { + $description = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:description)'); + } + + if (!$description) { + $description = null; + } + + $this->_data['description'] = $description; + + return $this->_data['description']; + } + + /** + * Get the feed ID + * + * @return string|null + */ + public function getId() + { + if (array_key_exists('id', $this->_data)) { + return $this->_data['id']; + } + + $id = null; + $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:identifier)'); + + if (!$id) { + $id = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:identifier)'); + } + + $this->_data['id'] = $id; + + return $this->_data['id']; + } + + /** + * Get the feed language + * + * @return string|null + */ + public function getLanguage() + { + if (array_key_exists('language', $this->_data)) { + return $this->_data['language']; + } + + $language = null; + $language = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:language)'); + + if (!$language) { + $language = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:language)'); + } + + if (!$language) { + $language = null; + } + + $this->_data['language'] = $language; + + return $this->_data['language']; + } + + /** + * Get the feed title + * + * @return string|null + */ + public function getTitle() + { + if (array_key_exists('title', $this->_data)) { + return $this->_data['title']; + } + + $title = null; + $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:title)'); + + if (!$title) { + $title = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:title)'); + } + + if (!$title) { + $title = null; + } + + $this->_data['title'] = $title; + + return $this->_data['title']; + } + + /** + * + * + * @return Zend_Date|null + */ + public function getDate() + { + if (array_key_exists('date', $this->_data)) { + return $this->_data['date']; + } + + $d = null; + $date = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc11:date)'); + + if (!$date) { + $date = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/dc10:date)'); + } + + if ($date) { + $d = new Zend_Date; + $d->set($date, Zend_Date::ISO_8601); + } + + $this->_data['date'] = $d; + + return $this->_data['date']; + } + + /** + * Register the default namespaces for the current feed format + * + * @return void + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('dc10', 'http://purl.org/dc/elements/1.0/'); + $this->_xpath->registerNamespace('dc11', 'http://purl.org/dc/elements/1.1/'); + } +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/EntryAbstract.php b/lib/zend/Zend/Feed/Reader/Extension/EntryAbstract.php new file mode 100644 index 0000000000..249259e762 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/EntryAbstract.php @@ -0,0 +1,197 @@ +_entry = $entry; + $this->_entryKey = $entryKey; + $this->_domDocument = $entry->ownerDocument; + + if (!is_null($type)) { + $this->_data['type'] = $type; + } else { + $this->_data['type'] = Zend_Feed_Reader::detectType($feed); + } + // set the XPath query prefix for the entry being queried + if ($this->getType() == Zend_Feed_Reader::TYPE_RSS_10 + || $this->getType() == Zend_Feed_Reader::TYPE_RSS_090 + ) { + $this->setXpathPrefix('//rss:item[' . ($this->_entryKey+1) . ']'); + } elseif ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 + || $this->getType() == Zend_Feed_Reader::TYPE_ATOM_03 + ) { + $this->setXpathPrefix('//atom:entry[' . ($this->_entryKey+1) . ']'); + } else { + $this->setXpathPrefix('//item[' . ($this->_entryKey+1) . ']'); + } + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->_domDocument; + } + + /** + * Get the Entry's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + return $assumed; + } + + /** + * Get the entry type + * + * @return string + */ + public function getType() + { + return $this->_data['type']; + } + + /** + * Set the XPath query + * + * @param DOMXPath $xpath + * @return Zend_Feed_Reader_Extension_EntryAbstract + */ + public function setXpath(DOMXPath $xpath) + { + $this->_xpath = $xpath; + $this->_registerNamespaces(); + return $this; + } + + /** + * Get the XPath query object + * + * @return DOMXPath + */ + public function getXpath() + { + return $this->_xpath; + } + + /** + * Serialize the entry to an array + * + * @return array + */ + public function toArray() + { + return $this->_data; + } + + /** + * Get the XPath prefix + * + * @return string + */ + public function getXpathPrefix() + { + return $this->_xpathPrefix; + } + + /** + * Set the XPath prefix + * + * @param string $prefix + * @return Zend_Feed_Reader_Extension_EntryAbstract + */ + public function setXpathPrefix($prefix) + { + $this->_xpathPrefix = $prefix; + return $this; + } + + /** + * Register XML namespaces + * + * @return void + */ + protected abstract function _registerNamespaces(); +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/FeedAbstract.php b/lib/zend/Zend/Feed/Reader/Extension/FeedAbstract.php new file mode 100644 index 0000000000..c82e8ae014 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/FeedAbstract.php @@ -0,0 +1,166 @@ +_domDocument = $dom; + + if ($type !== null) { + $this->_data['type'] = $type; + } else { + $this->_data['type'] = Zend_Feed_Reader::detectType($dom); + } + + if ($xpath !== null) { + $this->_xpath = $xpath; + } else { + $this->_xpath = new DOMXPath($this->_domDocument); + } + + $this->_registerNamespaces(); + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->_domDocument; + } + + /** + * Get the Feed's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + return $assumed; + } + + /** + * Get the feed type + * + * @return string + */ + public function getType() + { + return $this->_data['type']; + } + + + /** + * Return the feed as an array + * + * @return array + */ + public function toArray() // untested + { + return $this->_data; + } + + /** + * Get the XPath prefix + * + * @return string + */ + public function getXpathPrefix() + { + return $this->_xpathPrefix; + } + + /** + * Set the XPath prefix + * + * @return Zend_Feed_Reader_Feed_Atom + */ + public function setXpathPrefix($prefix) + { + $this->_xpathPrefix = $prefix; + } + + /** + * Register the default namespaces for the current feed format + */ + abstract protected function _registerNamespaces(); +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/Podcast/Entry.php b/lib/zend/Zend/Feed/Reader/Extension/Podcast/Entry.php new file mode 100644 index 0000000000..b93193c548 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/Podcast/Entry.php @@ -0,0 +1,202 @@ +_data['author'])) { + return $this->_data['author']; + } + + $author = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:author)'); + + if (!$author) { + $author = null; + } + + $this->_data['author'] = $author; + + return $this->_data['author']; + } + + /** + * Get the entry block + * + * @return string + */ + public function getBlock() + { + if (isset($this->_data['block'])) { + return $this->_data['block']; + } + + $block = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:block)'); + + if (!$block) { + $block = null; + } + + $this->_data['block'] = $block; + + return $this->_data['block']; + } + + /** + * Get the entry duration + * + * @return string + */ + public function getDuration() + { + if (isset($this->_data['duration'])) { + return $this->_data['duration']; + } + + $duration = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:duration)'); + + if (!$duration) { + $duration = null; + } + + $this->_data['duration'] = $duration; + + return $this->_data['duration']; + } + + /** + * Get the entry explicit + * + * @return string + */ + public function getExplicit() + { + if (isset($this->_data['explicit'])) { + return $this->_data['explicit']; + } + + $explicit = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:explicit)'); + + if (!$explicit) { + $explicit = null; + } + + $this->_data['explicit'] = $explicit; + + return $this->_data['explicit']; + } + + /** + * Get the entry keywords + * + * @return string + */ + public function getKeywords() + { + if (isset($this->_data['keywords'])) { + return $this->_data['keywords']; + } + + $keywords = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:keywords)'); + + if (!$keywords) { + $keywords = null; + } + + $this->_data['keywords'] = $keywords; + + return $this->_data['keywords']; + } + + /** + * Get the entry subtitle + * + * @return string + */ + public function getSubtitle() + { + if (isset($this->_data['subtitle'])) { + return $this->_data['subtitle']; + } + + $subtitle = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:subtitle)'); + + if (!$subtitle) { + $subtitle = null; + } + + $this->_data['subtitle'] = $subtitle; + + return $this->_data['subtitle']; + } + + /** + * Get the entry summary + * + * @return string + */ + public function getSummary() + { + if (isset($this->_data['summary'])) { + return $this->_data['summary']; + } + + $summary = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:summary)'); + + if (!$summary) { + $summary = null; + } + + $this->_data['summary'] = $summary; + + return $this->_data['summary']; + } + + /** + * Register iTunes namespace + * + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('itunes', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Feed/Reader/Extension/Podcast/Feed.php b/lib/zend/Zend/Feed/Reader/Extension/Podcast/Feed.php new file mode 100644 index 0000000000..ae747d81d7 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/Podcast/Feed.php @@ -0,0 +1,293 @@ +_data['author'])) { + return $this->_data['author']; + } + + $author = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:author)'); + + if (!$author) { + $author = null; + } + + $this->_data['author'] = $author; + + return $this->_data['author']; + } + + /** + * Get the entry block + * + * @return string + */ + public function getBlock() + { + if (isset($this->_data['block'])) { + return $this->_data['block']; + } + + $block = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:block)'); + + if (!$block) { + $block = null; + } + + $this->_data['block'] = $block; + + return $this->_data['block']; + } + + /** + * Get the entry category + * + * @return string + */ + public function getCategories() + { + if (isset($this->_data['categories'])) { + return $this->_data['categories']; + } + + $categoryList = $this->_xpath->query($this->getXpathPrefix() . '/itunes:category'); + + $categories = array(); + + if ($categoryList->length > 0) { + foreach ($categoryList as $node) { + $children = null; + + if ($node->childNodes->length > 0) { + $children = array(); + + foreach ($node->childNodes as $childNode) { + if (!($childNode instanceof DOMText)) { + $children[$childNode->getAttribute('text')] = null; + } + } + } + + $categories[$node->getAttribute('text')] = $children; + } + } + + + if (!$categories) { + $categories = null; + } + + $this->_data['categories'] = $categories; + + return $this->_data['categories']; + } + + /** + * Get the entry explicit + * + * @return string + */ + public function getExplicit() + { + if (isset($this->_data['explicit'])) { + return $this->_data['explicit']; + } + + $explicit = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:explicit)'); + + if (!$explicit) { + $explicit = null; + } + + $this->_data['explicit'] = $explicit; + + return $this->_data['explicit']; + } + + /** + * Get the entry image + * + * @return string + */ + public function getImage() + { + if (isset($this->_data['image'])) { + return $this->_data['image']; + } + + $image = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:image/@href)'); + + if (!$image) { + $image = null; + } + + $this->_data['image'] = $image; + + return $this->_data['image']; + } + + /** + * Get the entry keywords + * + * @return string + */ + public function getKeywords() + { + if (isset($this->_data['keywords'])) { + return $this->_data['keywords']; + } + + $keywords = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:keywords)'); + + if (!$keywords) { + $keywords = null; + } + + $this->_data['keywords'] = $keywords; + + return $this->_data['keywords']; + } + + /** + * Get the entry's new feed url + * + * @return string + */ + public function getNewFeedUrl() + { + if (isset($this->_data['new-feed-url'])) { + return $this->_data['new-feed-url']; + } + + $newFeedUrl = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:new-feed-url)'); + + if (!$newFeedUrl) { + $newFeedUrl = null; + } + + $this->_data['new-feed-url'] = $newFeedUrl; + + return $this->_data['new-feed-url']; + } + + /** + * Get the entry owner + * + * @return string + */ + public function getOwner() + { + if (isset($this->_data['owner'])) { + return $this->_data['owner']; + } + + $owner = null; + + $email = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:owner/itunes:email)'); + $name = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:owner/itunes:name)'); + + if (!empty($email)) { + $owner = $email . (empty($name) ? '' : ' (' . $name . ')'); + } else if (!empty($name)) { + $owner = $name; + } + + if (!$owner) { + $owner = null; + } + + $this->_data['owner'] = $owner; + + return $this->_data['owner']; + } + + /** + * Get the entry subtitle + * + * @return string + */ + public function getSubtitle() + { + if (isset($this->_data['subtitle'])) { + return $this->_data['subtitle']; + } + + $subtitle = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:subtitle)'); + + if (!$subtitle) { + $subtitle = null; + } + + $this->_data['subtitle'] = $subtitle; + + return $this->_data['subtitle']; + } + + /** + * Get the entry summary + * + * @return string + */ + public function getSummary() + { + if (isset($this->_data['summary'])) { + return $this->_data['summary']; + } + + $summary = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/itunes:summary)'); + + if (!$summary) { + $summary = null; + } + + $this->_data['summary'] = $summary; + + return $this->_data['summary']; + } + + /** + * Register iTunes namespace + * + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('itunes', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Feed/Reader/Extension/Slash/Entry.php b/lib/zend/Zend/Feed/Reader/Extension/Slash/Entry.php new file mode 100644 index 0000000000..1ad449c3cc --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/Slash/Entry.php @@ -0,0 +1,144 @@ +_getData('section'); + } + + /** + * Get the entry department + * + * @return string|null + */ + public function getDepartment() + { + return $this->_getData('department'); + } + + /** + * Get the entry hit_parade + * + * @return array + */ + public function getHitParade() + { + $name = 'hit_parade'; + + if (isset($this->_data[$name])) { + return $this->_data[$name]; + } + + $stringParade = $this->_getData($name); + $hitParade = array(); + + if (!empty($stringParade)) { + $stringParade = explode(',', $stringParade); + + foreach ($stringParade as $hit) + $hitParade[] = $hit + 0; //cast to integer + } + + $this->_data[$name] = $hitParade; + return $hitParade; + } + + /** + * Get the entry comments + * + * @return int + */ + public function getCommentCount() + { + $name = 'comments'; + + if (isset($this->_data[$name])) { + return $this->_data[$name]; + } + + $comments = $this->_getData($name, 'string'); + + if (!$comments) { + $this->_data[$name] = null; + return $this->_data[$name]; + } + + return $comments; + } + + /** + * Get the entry data specified by name + * @param string $name + * @param string $type + * + * @return mixed|null + */ + protected function _getData($name, $type = 'string') + { + if (array_key_exists($name, $this->_data)) { + return $this->_data[$name]; + } + + $data = $this->_xpath->evaluate($type . '(' . $this->getXpathPrefix() . '/slash10:' . $name . ')'); + + if (!$data) { + $data = null; + } + + $this->_data[$name] = $data; + + return $data; + } + + /** + * Register Slash namespaces + * + * @return void + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('slash10', 'http://purl.org/rss/1.0/modules/slash/'); + } +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/Syndication/Feed.php b/lib/zend/Zend/Feed/Reader/Extension/Syndication/Feed.php new file mode 100644 index 0000000000..1839f70350 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/Syndication/Feed.php @@ -0,0 +1,168 @@ +_getData($name); + + if ($period === null) { + $this->_data[$name] = 'daily'; + return 'daily'; //Default specified by spec + } + + switch ($period) + { + case 'hourly': + case 'daily': + case 'weekly': + case 'yearly': + return $period; + default: + throw new Zend_Feed_Exception("Feed specified invalid update period: '$period'." + . " Must be one of hourly, daily, weekly or yearly" + ); + } + } + + /** + * Get update frequency + * @return int + */ + public function getUpdateFrequency() + { + $name = 'updateFrequency'; + $freq = $this->_getData($name, 'number'); + + if (!$freq || $freq < 1) { + $this->_data[$name] = 1; + return 1; + } + + return $freq; + } + + /** + * Get update frequency as ticks + * @return int + */ + public function getUpdateFrequencyAsTicks() + { + $name = 'updateFrequency'; + $freq = $this->_getData($name, 'number'); + + if (!$freq || $freq < 1) { + $this->_data[$name] = 1; + $freq = 1; + } + + $period = $this->getUpdatePeriod(); + $ticks = 1; + + switch ($period) + { + //intentional fall through + case 'yearly': + $ticks *= 52; //TODO: fix generalisation, how? + case 'weekly': + $ticks *= 7; + case 'daily': + $ticks *= 24; + case 'hourly': + $ticks *= 3600; + break; + default: //Never arrive here, exception thrown in getPeriod() + break; + } + + return $ticks / $freq; + } + + /** + * Get update base + * + * @return Zend_Date|null + */ + public function getUpdateBase() + { + $updateBase = $this->_getData('updateBase'); + $date = null; + if ($updateBase) { + $date = new Zend_Date; + $date->set($updateBase, Zend_Date::W3C); + } + return $date; + } + + /** + * Get the entry data specified by name + * + * @param string $name + * @param string $type + * @return mixed|null + */ + private function _getData($name, $type = 'string') + { + if (array_key_exists($name, $this->_data)) { + return $this->_data[$name]; + } + + $data = $this->_xpath->evaluate($type . '(' . $this->getXpathPrefix() . '/syn10:' . $name . ')'); + + if (!$data) { + $data = null; + } + + $this->_data[$name] = $data; + + return $data; + } + + /** + * Register Syndication namespaces + * + * @return void + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('syn10', 'http://purl.org/rss/1.0/modules/syndication/'); + } +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/Thread/Entry.php b/lib/zend/Zend/Feed/Reader/Extension/Thread/Entry.php new file mode 100644 index 0000000000..cef345a563 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/Thread/Entry.php @@ -0,0 +1,91 @@ +_getData('total'); + } + + /** + * Get the entry data specified by name + * + * @param string $name + * @param string $type + * @return mixed|null + */ + protected function _getData($name) + { + if (array_key_exists($name, $this->_data)) { + return $this->_data[$name]; + } + + $data = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/thread10:' . $name . ')'); + + if (!$data) { + $data = null; + } + + $this->_data[$name] = $data; + + return $data; + } + + /** + * Register Atom Thread Extension 1.0 namespace + * + * @return void + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('thread10', 'http://purl.org/syndication/thread/1.0'); + } +} diff --git a/lib/zend/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php b/lib/zend/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php new file mode 100644 index 0000000000..4feb016d24 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php @@ -0,0 +1,73 @@ +_data)) { + return $this->_data[$name]; + } + + $data = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/wfw:' . $name . ')'); + + if (!$data) { + $data = null; + } + + $this->_data[$name] = $data; + + return $data; + } + + /** + * Register Slash namespaces + * + * @return void + */ + protected function _registerNamespaces() + { + $this->_xpath->registerNamespace('wfw', 'http://wellformedweb.org/CommentAPI/'); + } +} diff --git a/lib/zend/Zend/Feed/Reader/Feed/Atom.php b/lib/zend/Zend/Feed/Reader/Feed/Atom.php new file mode 100644 index 0000000000..f9080efa06 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Feed/Atom.php @@ -0,0 +1,329 @@ +getClassName('Atom_Feed'); + $this->_extensions['Atom_Feed'] = new $atomClass($dom, $this->_data['type'], $this->_xpath); + foreach ($this->_extensions as $extension) { + $extension->setXpathPrefix('/atom:feed'); + } + } + + /** + * Get a single author + * + * @param int $index + * @return string|null + */ + public function getAuthor($index = 0) + { + $authors = $this->getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->_data)) { + return $this->_data['authors']; + } + + $people = $this->getExtension('Atom')->getAuthors(); + + $this->_data['authors'] = $people; + + return $this->_data['authors']; + } + + /** + * Get the copyright entry + * + * @return string|null + */ + public function getCopyright() + { + if (array_key_exists('copyright', $this->_data)) { + return $this->_data['copyright']; + } + + $copyright = $this->getExtension('Atom')->getCopyright(); + + if (!$copyright) { + $copyright = null; + } + + $this->_data['copyright'] = $copyright; + + return $this->_data['copyright']; + } + + /** + * Get the feed creation date + * + * @return string|null + */ + public function getDateCreated() + { + if (array_key_exists('datecreated', $this->_data)) { + return $this->_data['datecreated']; + } + + $dateCreated = $this->getExtension('Atom')->getDateCreated(); + + if (!$dateCreated) { + $dateCreated = null; + } + + $this->_data['datecreated'] = $dateCreated; + + return $this->_data['datecreated']; + } + + /** + * Get the feed modification date + * + * @return string|null + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->_data)) { + return $this->_data['datemodified']; + } + + $dateModified = $this->getExtension('Atom')->getDateModified(); + + if (!$dateModified) { + $dateModified = null; + } + + $this->_data['datemodified'] = $dateModified; + + return $this->_data['datemodified']; + } + + /** + * Get the feed description + * + * @return string|null + */ + public function getDescription() + { + if (array_key_exists('description', $this->_data)) { + return $this->_data['description']; + } + + $description = $this->getExtension('Atom')->getDescription(); + + if (!$description) { + $description = null; + } + + $this->_data['description'] = $description; + + return $this->_data['description']; + } + + /** + * Get the feed generator entry + * + * @return string|null + */ + public function getGenerator() + { + if (array_key_exists('generator', $this->_data)) { + return $this->_data['generator']; + } + + $generator = $this->getExtension('Atom')->getGenerator(); + + $this->_data['generator'] = $generator; + + return $this->_data['generator']; + } + + /** + * Get the feed ID + * + * @return string|null + */ + public function getId() + { + if (array_key_exists('id', $this->_data)) { + return $this->_data['id']; + } + + $id = $this->getExtension('Atom')->getId(); + + $this->_data['id'] = $id; + + return $this->_data['id']; + } + + /** + * Get the feed language + * + * @return string|null + */ + public function getLanguage() + { + if (array_key_exists('language', $this->_data)) { + return $this->_data['language']; + } + + $language = $this->getExtension('Atom')->getLanguage(); + + if (!$language) { + $language = $this->_xpath->evaluate('string(//@xml:lang[1])'); + } + + if (!$language) { + $language = null; + } + + $this->_data['language'] = $language; + + return $this->_data['language']; + } + + /** + * Get a link to the source website + * + * @return string|null + */ + public function getLink() + { + if (array_key_exists('link', $this->_data)) { + return $this->_data['link']; + } + + $link = $this->getExtension('Atom')->getLink(); + + $this->_data['link'] = $link; + + return $this->_data['link']; + } + + /** + * Get a link to the feed's XML Url + * + * @return string|null + */ + public function getFeedLink() + { + if (array_key_exists('feedlink', $this->_data)) { + return $this->_data['feedlink']; + } + + $link = $this->getExtension('Atom')->getFeedLink(); + + $this->_data['feedlink'] = $link; + + return $this->_data['feedlink']; + } + + /** + * Get the feed title + * + * @return string|null + */ + public function getTitle() + { + if (array_key_exists('title', $this->_data)) { + return $this->_data['title']; + } + + $title = $this->getExtension('Atom')->getTitle(); + + $this->_data['title'] = $title; + + return $this->_data['title']; + } + + /** + * Read all entries to the internal entries array + * + */ + protected function _indexEntries() + { + if ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 || + $this->getType() == Zend_Feed_Reader::TYPE_ATOM_03) { + $entries = array(); + $entries = $this->_xpath->evaluate('//atom:entry'); + + foreach($entries as $index=>$entry) { + $this->_entries[$index] = $entry; + } + } + } + + /** + * Register the default namespaces for the current feed format + * + */ + protected function _registerNamespaces() + { + switch ($this->_data['type']) { + case Zend_Feed_Reader::TYPE_ATOM_03: + $this->_xpath->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_03); + break; + case Zend_Feed_Reader::TYPE_ATOM_10: + default: + $this->_xpath->registerNamespace('atom', Zend_Feed_Reader::NAMESPACE_ATOM_10); + } + } +} diff --git a/lib/zend/Zend/Feed/Reader/Feed/Rss.php b/lib/zend/Zend/Feed/Reader/Feed/Rss.php new file mode 100644 index 0000000000..489a6a67ba --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/Feed/Rss.php @@ -0,0 +1,533 @@ +getClassName('DublinCore_Feed'); + $this->_extensions['DublinCore_Feed'] = new $dublinCoreClass($dom, $this->_data['type'], $this->_xpath); + $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Atom_Feed'); + $this->_extensions['Atom_Feed'] = new $atomClass($dom, $this->_data['type'], $this->_xpath); + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $xpathPrefix = '/rss/channel'; + } else { + $xpathPrefix = '/rdf:RDF/rss:channel'; + } + foreach ($this->_extensions as $extension) { + $extension->setXpathPrefix($xpathPrefix); + } + } + + /** + * Get a single author + * + * @param int $index + * @return string|null + */ + public function getAuthor($index = 0) + { + $authors = $this->getAuthors(); + + if (isset($authors[$index])) { + return $authors[$index]; + } + + return null; + } + + /** + * Get an array with feed authors + * + * @return array + */ + public function getAuthors() + { + if (array_key_exists('authors', $this->_data)) { + return $this->_data['authors']; + } + + $authors = array(); + + if (empty($authors)) { + $authors = $this->getExtension('DublinCore')->getAuthors(); + } + + if (empty($authors)) { + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $list = $this->_xpath->query('//author'); + } else { + $list = $this->_xpath->query('//rss:author'); + } + + foreach ($list as $authorObj) { + $authors[] = $authorObj->nodeValue; + } + } + + if (empty($authors)) { + $authors = $this->getExtension('Atom')->getAuthors(); + } + + if (empty($authors)) { + $authors = null; + } else { + $authors = array_unique($authors); + } + + $this->_data['authors'] = $authors; + + return $this->_data['authors']; + } + + /** + * Get the copyright entry + * + * @return string|null + */ + public function getCopyright() + { + if (array_key_exists('copyright', $this->_data)) { + return $this->_data['copyright']; + } + + $copyright = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $copyright = $this->_xpath->evaluate('string(/rss/channel/copyright)'); + } + + if (!$copyright && !is_null($this->getExtension('DublinCore'))) { + $copyright = $this->getExtension('DublinCore')->getCopyright(); + } + + if (empty($copyright)) { + $copyright = $this->getExtension('Atom')->getCopyright(); + } + + if (!$copyright) { + $copyright = null; + } + + $this->_data['copyright'] = $copyright; + + return $this->_data['copyright']; + } + + /** + * Get the feed creation date + * + * @return string|null + */ + public function getDateCreated() + { + return $this->getDateModified(); + } + + /** + * Get the feed modification date + * + * @return Zend_Date + */ + public function getDateModified() + { + if (array_key_exists('datemodified', $this->_data)) { + return $this->_data['datemodified']; + } + + $dateModified = null; + $date = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $dateModified = $this->_xpath->evaluate('string(/rss/channel/pubDate)'); + if (!$dateModified) { + $dateModified = $this->_xpath->evaluate('string(/rss/channel/lastBuildDate)'); + } + if ($dateModified) { + $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822, + Zend_Date::RFC_2822, Zend_Date::DATES); + $date = new Zend_Date; + foreach ($dateStandards as $standard) { + try { + $date->set($dateModified, $standard); + break; + } catch (Zend_Date_Exception $e) { + if ($standard == Zend_Date::DATES) { + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception( + 'Could not load date due to unrecognised' + .' format (should follow RFC 822 or 2822):' + . $e->getMessage() + ); + } + } + } + } + } + + if (!$date) { + $date = $this->getExtension('DublinCore')->getDate(); + } + + if (!$date) { + $date = $this->getExtension('Atom')->getDateModified(); + } + + if (!$date) { + $date = null; + } + + $this->_data['datemodified'] = $date; + + return $this->_data['datemodified']; + } + + /** + * Get the feed description + * + * @return string|null + */ + public function getDescription() + { + if (array_key_exists('description', $this->_data)) { + return $this->_data['description']; + } + + $description = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $description = $this->_xpath->evaluate('string(/rss/channel/description)'); + } else { + $description = $this->_xpath->evaluate('string(/rdf:RDF/rss:channel/rss:description)'); + } + + if (!$description && !is_null($this->getExtension('DublinCore'))) { + $description = $this->getExtension('DublinCore')->getDescription(); + } + + if (empty($description)) { + $description = $this->getExtension('Atom')->getDescription(); + } + + if (!$description) { + $description = null; + } + + $this->_data['description'] = $description; + + return $this->_data['description']; + } + + /** + * Get the feed ID + * + * @return string|null + */ + public function getId() + { + if (array_key_exists('id', $this->_data)) { + return $this->_data['id']; + } + + $id = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $id = $this->_xpath->evaluate('string(/rss/channel/guid)'); + } + + if (!$id && !is_null($this->getExtension('DublinCore'))) { + $id = $this->getExtension('DublinCore')->getId(); + } + + if (empty($id)) { + $id = $this->getExtension('Atom')->getId(); + } + + if (!$id) { + if ($this->getLink()) { + $id = $this->getLink(); + } elseif ($this->getTitle()) { + $id = $this->getTitle(); + } else { + $id = null; + } + } + + $this->_data['id'] = $id; + + return $this->_data['id']; + } + + /** + * Get the feed language + * + * @return string|null + */ + public function getLanguage() + { + if (array_key_exists('language', $this->_data)) { + return $this->_data['language']; + } + + $language = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $language = $this->_xpath->evaluate('string(/rss/channel/language)'); + } + + if (!$language && !is_null($this->getExtension('DublinCore'))) { + $language = $this->getExtension('DublinCore')->getLanguage(); + } + + if (empty($language)) { + $language = $this->getExtension('Atom')->getLanguage(); + } + + if (!$language) { + $language = $this->_xpath->evaluate('string(//@xml:lang[1])'); + } + + if (!$language) { + $language = null; + } + + $this->_data['language'] = $language; + + return $this->_data['language']; + } + + /** + * Get a link to the feed + * + * @return string|null + */ + public function getLink() + { + if (array_key_exists('link', $this->_data)) { + return $this->_data['link']; + } + + $link = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $link = $this->_xpath->evaluate('string(/rss/channel/link)'); + } else { + $link = $this->_xpath->evaluate('string(/rdf:RDF/rss:channel/rss:link)'); + } + + if (empty($link)) { + $link = $this->getExtension('Atom')->getLink(); + } + + if (!$link) { + $link = null; + } + + $this->_data['link'] = $link; + + return $this->_data['link']; + } + + /** + * Get a link to the feed XML + * + * @return string|null + */ + public function getFeedLink() + { + if (array_key_exists('feedlink', $this->_data)) { + return $this->_data['feedlink']; + } + + $link = null; + + $link = $this->getExtension('Atom')->getFeedLink(); + + if (!$link) { + $link = null; + } + + $this->_data['feedlink'] = $link; + + return $this->_data['feedlink']; + } + + /** + * Get the feed generator entry + * + * @return string|null + */ + public function getGenerator() + { + if (array_key_exists('generator', $this->_data)) { + return $this->_data['generator']; + } + + $generator = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $generator = $this->_xpath->evaluate('string(/rss/channel/generator)'); + } + + if (!$generator) { + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $generator = $this->_xpath->evaluate('string(/rss/channel/atom:generator)'); + } else { + $generator = $this->_xpath->evaluate('string(/rdf:RDF/rss:channel/atom:generator)'); + } + if ($generator) { + $generator = html_entity_decode($generator, ENT_QUOTES, $this->getEncoding()); + } + } + + if (empty($generator)) { + $generator = $this->getExtension('Atom')->getGenerator(); + } + + if (!$generator) { + $generator = null; + } + + $this->_data['generator'] = $generator; + + return $this->_data['generator']; + } + + /** + * Get the feed title + * + * @return string|null + */ + public function getTitle() + { + if (array_key_exists('title', $this->_data)) { + return $this->_data['title']; + } + + $title = null; + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && + $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $title = $this->_xpath->evaluate('string(/rss/channel/title)'); + } else { + $title = $this->_xpath->evaluate('string(/rdf:RDF/rss:channel/rss:title)'); + } + + if (!$title && !is_null($this->getExtension('DublinCore'))) { + $title = $this->getExtension('DublinCore')->getTitle(); + } + + if (!$title) { + $title = $this->getExtension('Atom')->getTitle(); + } + + if (!$title) { + $title = null; + } + + $this->_data['title'] = $title; + + return $this->_data['title']; + } + + /** + * Read all entries to the internal entries array + * + */ + protected function _indexEntries() + { + $entries = array(); + + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090) { + $entries = $this->_xpath->evaluate('//item'); + } else { + $entries = $this->_xpath->evaluate('//rss:item'); + } + + foreach($entries as $index=>$entry) { + $this->_entries[$index] = $entry; + } + } + + /** + * Register the default namespaces for the current feed format + * + */ + protected function _registerNamespaces() + { + switch ($this->_data['type']) { + case Zend_Feed_Reader::TYPE_RSS_10: + $this->_xpath->registerNamespace('rdf', Zend_Feed_Reader::NAMESPACE_RDF); + $this->_xpath->registerNamespace('rss', Zend_Feed_Reader::NAMESPACE_RSS_10); + break; + + case Zend_Feed_Reader::TYPE_RSS_090: + $this->_xpath->registerNamespace('rdf', Zend_Feed_Reader::NAMESPACE_RDF); + $this->_xpath->registerNamespace('rss', Zend_Feed_Reader::NAMESPACE_RSS_090); + break; + } + } +} diff --git a/lib/zend/Zend/Feed/Reader/FeedAbstract.php b/lib/zend/Zend/Feed/Reader/FeedAbstract.php new file mode 100644 index 0000000000..0158165733 --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/FeedAbstract.php @@ -0,0 +1,304 @@ +_domDocument = $domDocument; + $this->_xpath = new DOMXPath($this->_domDocument); + + if ($type !== null) { + $this->_data['type'] = $type; + } else { + $this->_data['type'] = Zend_Feed_Reader::detectType($this->_domDocument); + } + $this->_registerNamespaces(); + $this->_indexEntries(); + $this->_loadExtensions(); + } + + /** + * Get the number of feed entries. + * Required by the Iterator interface. + * + * @return int + */ + public function count() + { + return count($this->_entries); + } + + /** + * Return the current entry + * + * @return Zend_Feed_Reader_Entry_Interface + */ + public function current() + { + if (substr($this->getType(), 0, 3) == 'rss') { + $reader = new Zend_Feed_Reader_Entry_Rss($this->_entries[$this->key()], $this->key(), $this->getType()); + } else { + $reader = new Zend_Feed_Reader_Entry_Atom($this->_entries[$this->key()], $this->key(), $this->getType()); + } + + $reader->setXpath($this->_xpath); + + return $reader; + } + + /** + * Get the DOM + * + * @return DOMDocument + */ + public function getDomDocument() + { + return $this->_domDocument; + } + + /** + * Get the Feed's encoding + * + * @return string + */ + public function getEncoding() + { + $assumed = $this->getDomDocument()->encoding; + return $assumed; + } + + /** + * Get feed as xml + * + * @return string + */ + public function saveXml() + { + return $this->getDomDocument()->saveXml(); + } + + /** + * Get the DOMElement representing the items/feed element + * + * @return DOMElement + */ + public function getElement() + { + return $this->getDomDocument()->documentElement; + } + + /** + * Get the DOMXPath object for this feed + * + * @return DOMXPath + */ + public function getXpath() + { + return $this->_xpath; + } + + /** + * Get the feed type + * + * @return string + */ + public function getType() + { + return $this->_data['type']; + } + + /** + * Return the current feed key + * + * @return unknown + */ + public function key() + { + return $this->_entriesKey; + } + + /** + * Move the feed pointer forward + * + */ + public function next() + { + ++$this->_entriesKey; + } + + /** + * Reset the pointer in the feed object + * + */ + public function rewind() + { + $this->_entriesKey = 0; + } + + /** + * Return the feed as an array + * + * @return array + */ + public function toArray() // untested + { + return $this->_data; + } + + /** + * Check to see if the iterator is still valid + * + * @return boolean + */ + public function valid() + { + return 0 <= $this->_entriesKey && $this->_entriesKey < $this->count(); + } + + public function getExtensions() + { + return $this->_extensions; + } + + public function __call($method, $args) + { + foreach ($this->_extensions as $extension) { + if (method_exists($extension, $method)) { + return call_user_func_array(array($extension, $method), $args); + } + } + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Method: ' . $method + . 'does not exist and could not be located on a registered Extension'); + } + + /** + * Return an Extension object with the matching name (postfixed with _Feed) + * + * @param string $name + * @return Zend_Feed_Reader_Extension_FeedAbstract + */ + public function getExtension($name) + { + if (array_key_exists($name . '_Feed', $this->_extensions)) { + return $this->_extensions[$name . '_Feed']; + } + return null; + } + + protected function _loadExtensions() + { + $all = Zend_Feed_Reader::getExtensions(); + $feed = $all['feed']; + foreach ($feed as $extension) { + if (in_array($extension, $all['core'])) { + continue; + } + $className = Zend_Feed_Reader::getPluginLoader()->getClassName($extension); + $this->_extensions[$extension] = new $className( + $this->getDomDocument(), $this->_data['type'], $this->_xpath + ); + } + } + + /** + * Read all entries to the internal entries array + * + */ + abstract protected function _indexEntries(); + + /** + * Register the default namespaces for the current feed format + * + */ + abstract protected function _registerNamespaces(); +} diff --git a/lib/zend/Zend/Feed/Reader/FeedInterface.php b/lib/zend/Zend/Feed/Reader/FeedInterface.php new file mode 100644 index 0000000000..f8fc6d719e --- /dev/null +++ b/lib/zend/Zend/Feed/Reader/FeedInterface.php @@ -0,0 +1,115 @@ +s). + * + * @var string + */ + protected $_entryElementName = 'item'; + + /** + * The default namespace for RSS channels. + * + * @var string + */ + protected $_defaultNamespace = 'rss'; + + /** + * Override Zend_Feed_Abstract to set up the $_element and $_entries aliases. + * + * @return void + * @throws Zend_Feed_Exception + */ + public function __wakeup() + { + parent::__wakeup(); + + // Find the base channel element and create an alias to it. + $rdfTags = $this->_element->getElementsByTagNameNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'RDF'); + if ($rdfTags->length != 0) { + $this->_element = $rdfTags->item(0); + } else { + $this->_element = $this->_element->getElementsByTagName('channel')->item(0); + } + if (!$this->_element) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('No root element found, cannot parse channel.'); + } + + // Find the entries and save a pointer to them for speed and + // simplicity. + $this->_buildEntryCache(); + } + + + /** + * Make accessing some individual elements of the channel easier. + * + * Special accessors 'item' and 'items' are provided so that if + * you wish to iterate over an RSS channel's items, you can do so + * using foreach ($channel->items as $item) or foreach + * ($channel->item as $item). + * + * @param string $var The property to access. + * @return mixed + */ + public function __get($var) + { + switch ($var) { + case 'item': + // fall through to the next case + case 'items': + return $this; + + default: + return parent::__get($var); + } + } + + /** + * Generate the header of the feed when working in write mode + * + * @param array $array the data to use + * @return DOMElement root node + */ + protected function _mapFeedHeaders($array) + { + $channel = $this->_element->createElement('channel'); + + $title = $this->_element->createElement('title'); + $title->appendChild($this->_element->createCDATASection($array->title)); + $channel->appendChild($title); + + $link = $this->_element->createElement('link', $array->link); + $channel->appendChild($link); + + $desc = isset($array->description) ? $array->description : ''; + $description = $this->_element->createElement('description'); + $description->appendChild($this->_element->createCDATASection($desc)); + $channel->appendChild($description); + + $pubdate = isset($array->lastUpdate) ? $array->lastUpdate : time(); + $pubdate = $this->_element->createElement('pubDate', date(DATE_RSS, $pubdate)); + $channel->appendChild($pubdate); + + if (isset($array->published)) { + $lastBuildDate = $this->_element->createElement('lastBuildDate', date(DATE_RSS, $array->published)); + $channel->appendChild($lastBuildDate); + } + + $editor = ''; + if (!empty($array->email)) { + $editor .= $array->email; + } + if (!empty($array->author)) { + $editor .= ' (' . $array->author . ')'; + } + if (!empty($editor)) { + $author = $this->_element->createElement('managingEditor', ltrim($editor)); + $channel->appendChild($author); + } + if (isset($array->webmaster)) { + $channel->appendChild($this->_element->createElement('webMaster', $array->webmaster)); + } + + if (!empty($array->copyright)) { + $copyright = $this->_element->createElement('copyright', $array->copyright); + $channel->appendChild($copyright); + } + + if (isset($array->category)) { + $category = $this->_element->createElement('category', $array->category); + $channel->appendChild($category); + } + + if (!empty($array->image)) { + $image = $this->_element->createElement('image'); + $url = $this->_element->createElement('url', $array->image); + $image->appendChild($url); + $imagetitle = $this->_element->createElement('title'); + $imagetitle->appendChild($this->_element->createCDATASection($array->title)); + $image->appendChild($imagetitle); + $imagelink = $this->_element->createElement('link', $array->link); + $image->appendChild($imagelink); + + $channel->appendChild($image); + } + + $generator = !empty($array->generator) ? $array->generator : 'Zend_Feed'; + $generator = $this->_element->createElement('generator', $generator); + $channel->appendChild($generator); + + if (!empty($array->language)) { + $language = $this->_element->createElement('language', $array->language); + $channel->appendChild($language); + } + + $doc = $this->_element->createElement('docs', 'http://blogs.law.harvard.edu/tech/rss'); + $channel->appendChild($doc); + + if (isset($array->cloud)) { + $cloud = $this->_element->createElement('cloud'); + $cloud->setAttribute('domain', $array->cloud['uri']->getHost()); + $cloud->setAttribute('port', $array->cloud['uri']->getPort()); + $cloud->setAttribute('path', $array->cloud['uri']->getPath()); + $cloud->setAttribute('registerProcedure', $array->cloud['procedure']); + $cloud->setAttribute('protocol', $array->cloud['protocol']); + $channel->appendChild($cloud); + } + + if (isset($array->ttl)) { + $ttl = $this->_element->createElement('ttl', $array->ttl); + $channel->appendChild($ttl); + } + + if (isset($array->rating)) { + $rating = $this->_element->createElement('rating', $array->rating); + $channel->appendChild($rating); + } + + if (isset($array->textInput)) { + $textinput = $this->_element->createElement('textInput'); + $textinput->appendChild($this->_element->createElement('title', $array->textInput['title'])); + $textinput->appendChild($this->_element->createElement('description', $array->textInput['description'])); + $textinput->appendChild($this->_element->createElement('name', $array->textInput['name'])); + $textinput->appendChild($this->_element->createElement('link', $array->textInput['link'])); + $channel->appendChild($textinput); + } + + if (isset($array->skipHours)) { + $skipHours = $this->_element->createElement('skipHours'); + foreach ($array->skipHours as $hour) { + $skipHours->appendChild($this->_element->createElement('hour', $hour)); + } + $channel->appendChild($skipHours); + } + + if (isset($array->skipDays)) { + $skipDays = $this->_element->createElement('skipDays'); + foreach ($array->skipDays as $day) { + $skipDays->appendChild($this->_element->createElement('day', $day)); + } + $channel->appendChild($skipDays); + } + + if (isset($array->itunes)) { + $this->_buildiTunes($channel, $array); + } + + return $channel; + } + + /** + * Adds the iTunes extensions to a root node + * + * @param DOMElement $root + * @param array $array + * @return void + */ + private function _buildiTunes(DOMElement $root, $array) + { + /* author node */ + $author = ''; + if (isset($array->itunes->author)) { + $author = $array->itunes->author; + } elseif (isset($array->author)) { + $author = $array->author; + } + if (!empty($author)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:author', $author); + $root->appendChild($node); + } + + /* owner node */ + $author = ''; + $email = ''; + if (isset($array->itunes->owner)) { + if (isset($array->itunes->owner['name'])) { + $author = $array->itunes->owner['name']; + } + if (isset($array->itunes->owner['email'])) { + $email = $array->itunes->owner['email']; + } + } + if (empty($author) && isset($array->author)) { + $author = $array->author; + } + if (empty($email) && isset($array->email)) { + $email = $array->email; + } + if (!empty($author) || !empty($email)) { + $owner = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:owner'); + if (!empty($author)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:name', $author); + $owner->appendChild($node); + } + if (!empty($email)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:email', $email); + $owner->appendChild($node); + } + $root->appendChild($owner); + } + $image = ''; + if (isset($array->itunes->image)) { + $image = $array->itunes->image; + } elseif (isset($array->image)) { + $image = $array->image; + } + if (!empty($image)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:image'); + $node->setAttribute('href', $image); + $root->appendChild($node); + } + $subtitle = ''; + if (isset($array->itunes->subtitle)) { + $subtitle = $array->itunes->subtitle; + } elseif (isset($array->description)) { + $subtitle = $array->description; + } + if (!empty($subtitle)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:subtitle', $subtitle); + $root->appendChild($node); + } + $summary = ''; + if (isset($array->itunes->summary)) { + $summary = $array->itunes->summary; + } elseif (isset($array->description)) { + $summary = $array->description; + } + if (!empty($summary)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:summary', $summary); + $root->appendChild($node); + } + if (isset($array->itunes->block)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:block', $array->itunes->block); + $root->appendChild($node); + } + if (isset($array->itunes->explicit)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:explicit', $array->itunes->explicit); + $root->appendChild($node); + } + if (isset($array->itunes->keywords)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:keywords', $array->itunes->keywords); + $root->appendChild($node); + } + if (isset($array->itunes->new_feed_url)) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:new-feed-url', $array->itunes->new_feed_url); + $root->appendChild($node); + } + if (isset($array->itunes->category)) { + foreach ($array->itunes->category as $i => $category) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category'); + $node->setAttribute('text', $category['main']); + $root->appendChild($node); + $add_end_category = false; + if (!empty($category['sub'])) { + $add_end_category = true; + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category'); + $node->setAttribute('text', $category['sub']); + $root->appendChild($node); + } + if ($i > 0 || $add_end_category) { + $node = $this->_element->createElementNS('http://www.itunes.com/DTDs/Podcast-1.0.dtd', 'itunes:category'); + $root->appendChild($node); + } + } + } + } + + /** + * Generate the entries of the feed when working in write mode + * + * The following nodes are constructed for each feed entry + * + * entry title + * url to feed entry + * url to feed entry + * short text + * long version, can contain html + * + * + * @param DOMElement $root the root node to use + * @param array $array the data to use + * @return void + */ + protected function _mapFeedEntries(DOMElement $root, $array) + { + Zend_Feed::registerNamespace('content', 'http://purl.org/rss/1.0/modules/content/'); + + foreach ($array as $dataentry) { + $item = $this->_element->createElement('item'); + + $title = $this->_element->createElement('title'); + $title->appendChild($this->_element->createCDATASection($dataentry->title)); + $item->appendChild($title); + + if (isset($dataentry->author)) { + $author = $this->_element->createElement('author', $dataentry->author); + $item->appendChild($author); + } + + $link = $this->_element->createElement('link', $dataentry->link); + $item->appendChild($link); + + if (isset($dataentry->guid)) { + $guid = $this->_element->createElement('guid', $dataentry->guid); + $item->appendChild($guid); + } + + $description = $this->_element->createElement('description'); + $description->appendChild($this->_element->createCDATASection($dataentry->description)); + $item->appendChild($description); + + if (isset($dataentry->content)) { + $content = $this->_element->createElement('content:encoded'); + $content->appendChild($this->_element->createCDATASection($dataentry->content)); + $item->appendChild($content); + } + + $pubdate = isset($dataentry->lastUpdate) ? $dataentry->lastUpdate : time(); + $pubdate = $this->_element->createElement('pubDate', date(DATE_RSS, $pubdate)); + $item->appendChild($pubdate); + + if (isset($dataentry->category)) { + foreach ($dataentry->category as $category) { + $node = $this->_element->createElement('category', $category['term']); + if (isset($category['scheme'])) { + $node->setAttribute('domain', $category['scheme']); + } + $item->appendChild($node); + } + } + + if (isset($dataentry->source)) { + $source = $this->_element->createElement('source', $dataentry->source['title']); + $source->setAttribute('url', $dataentry->source['url']); + $item->appendChild($source); + } + + if (isset($dataentry->comments)) { + $comments = $this->_element->createElement('comments', $dataentry->comments); + $item->appendChild($comments); + } + if (isset($dataentry->commentRss)) { + $comments = $this->_element->createElementNS('http://wellformedweb.org/CommentAPI/', + 'wfw:commentRss', + $dataentry->commentRss); + $item->appendChild($comments); + } + + + if (isset($dataentry->enclosure)) { + foreach ($dataentry->enclosure as $enclosure) { + $node = $this->_element->createElement('enclosure'); + $node->setAttribute('url', $enclosure['url']); + if (isset($enclosure['type'])) { + $node->setAttribute('type', $enclosure['type']); + } + if (isset($enclosure['length'])) { + $node->setAttribute('length', $enclosure['length']); + } + $item->appendChild($node); + } + } + + $root->appendChild($item); + } + } + + /** + * Override Zend_Feed_Element to include root node + * + * @return string + */ + public function saveXml() + { + // Return a complete document including XML prologue. + $doc = new DOMDocument($this->_element->ownerDocument->version, + $this->_element->ownerDocument->actualEncoding); + $root = $doc->createElement('rss'); + + // Use rss version 2.0 + $root->setAttribute('version', '2.0'); + + // Content namespace + $root->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:content', 'http://purl.org/rss/1.0/modules/content/'); + $root->appendChild($doc->importNode($this->_element, true)); + + // Append root node + $doc->appendChild($root); + + // Format output + $doc->formatOutput = true; + + return $doc->saveXML(); + } + + /** + * Send feed to a http client with the correct header + * + * @return void + * @throws Zend_Feed_Exception if headers have already been sent + */ + public function send() + { + if (headers_sent()) { + /** + * @see Zend_Feed_Exception + */ + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Cannot send RSS because headers have already been sent.'); + } + + header('Content-Type: application/rss+xml; charset=' . $this->_element->ownerDocument->actualEncoding); + + echo $this->saveXml(); + } + +} diff --git a/lib/zend/Zend/File/Transfer.php b/lib/zend/Zend/File/Transfer.php new file mode 100644 index 0000000000..ee6c17bdea --- /dev/null +++ b/lib/zend/Zend/File/Transfer.php @@ -0,0 +1,61 @@ +_adapter = new $adapter(); + if (!$this->_adapter instanceof Zend_File_Transfer_Adapter) { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception("Adapter " . $adapter . " does not extend Zend_File_Transfer_Adapter'"); + } + + return $this->_adapter; + } +} diff --git a/lib/zend/Zend/File/Transfer/Adapter/Abstract.php b/lib/zend/Zend/File/Transfer/Adapter/Abstract.php new file mode 100644 index 0000000000..d6eb513356 --- /dev/null +++ b/lib/zend/Zend/File/Transfer/Adapter/Abstract.php @@ -0,0 +1,1503 @@ + array( - Form is the name within the form or, if not set the filename + * name, - Original name of this file + * type, - Mime type of this file + * size, - Filesize in bytes + * tmp_name, - Internalally temporary filename for uploaded files + * error, - Error which has occured + * destination, - New destination for this file + * validators, - Set validator names for this file + * files - Set file names for this file + * )) + * + * @var array + */ + protected $_files = array(); + + /** + * TMP directory + * @var string + */ + protected $_tmpDir; + + /** + * Available options for file transfers + */ + protected $_options = array( + 'ignoreNoFile' => false, + 'useByteString' => true, + 'magicFile' => null + ); + + /** + * Send file + * + * @param mixed $options + * @return bool + */ + abstract public function send($options = null); + + /** + * Receive file + * + * @param mixed $options + * @return bool + */ + abstract public function receive($options = null); + + /** + * Is file sent? + * + * @param array|string|null $files + * @return bool + */ + abstract public function isSent($files = null); + + /** + * Is file received? + * + * @param array|string|null $files + * @return bool + */ + abstract public function isReceived($files = null); + + /** + * Has a file been uploaded ? + * + * @param array|string|null $files + * @return bool + */ + abstract public function isUploaded($files = null); + + /** + * Has the file been filtered ? + * + * @param array|string|null $files + * @return bool + */ + abstract public function isFiltered($files = null); + + /** + * Retrieve progress of transfer + * + * @return float + */ + public static function getProgress() + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method must be implemented within the adapter'); + } + + /** + * Set plugin loader to use for validator or filter chain + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @param string $type 'filter', or 'validate' + * @return Zend_File_Transfer_Adapter_Abstract + * @throws Zend_File_Transfer_Exception on invalid type + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type) + { + $type = strtoupper($type); + switch ($type) { + case self::FILTER: + case self::VALIDATE: + $this->_loaders[$type] = $loader; + return $this; + default: + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception(sprintf('Invalid type "%s" provided to setPluginLoader()', $type)); + } + } + + /** + * Retrieve plugin loader for validator or filter chain + * + * Instantiates with default rules if none available for that type. Use + * 'filter' or 'validate' for $type. + * + * @param string $type + * @return Zend_Loader_PluginLoader + * @throws Zend_File_Transfer_Exception on invalid type. + */ + public function getPluginLoader($type) + { + $type = strtoupper($type); + switch ($type) { + case self::FILTER: + case self::VALIDATE: + $prefixSegment = ucfirst(strtolower($type)); + $pathSegment = $prefixSegment; + if (!isset($this->_loaders[$type])) { + $paths = array( + 'Zend_' . $prefixSegment . '_' => 'Zend/' . $pathSegment . '/', + 'Zend_' . $prefixSegment . '_File' => 'Zend/' . $pathSegment . '/File', + ); + + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loaders[$type] = new Zend_Loader_PluginLoader($paths); + } else { + $loader = $this->_loaders[$type]; + $prefix = 'Zend_' . $prefixSegment . '_File_'; + if (!$loader->getPaths($prefix)) { + $loader->addPrefixPath($prefix, str_replace('_', '/', $prefix)); + } + } + return $this->_loaders[$type]; + default: + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + } + + /** + * Add prefix path for plugin loader + * + * If no $type specified, assumes it is a base path for both filters and + * validators, and sets each according to the following rules: + * - filters: $prefix = $prefix . '_Filter' + * - validators: $prefix = $prefix . '_Validate' + * + * Otherwise, the path prefix is set on the appropriate plugin loader. + * + * @param string $prefix + * @param string $path + * @param string $type + * @return Zend_File_Transfer_Adapter_Abstract + * @throws Zend_File_Transfer_Exception for invalid type + */ + public function addPrefixPath($prefix, $path, $type = null) + { + $type = strtoupper($type); + switch ($type) { + case self::FILTER: + case self::VALIDATE: + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($prefix, $path); + return $this; + case null: + $prefix = rtrim($prefix, '_'); + $path = rtrim($path, DIRECTORY_SEPARATOR); + foreach (array(self::FILTER, self::VALIDATE) as $type) { + $cType = ucfirst(strtolower($type)); + $pluginPath = $path . DIRECTORY_SEPARATOR . $cType . DIRECTORY_SEPARATOR; + $pluginPrefix = $prefix . '_' . $cType; + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($pluginPrefix, $pluginPath); + } + return $this; + default: + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + } + + /** + * Add many prefix paths at once + * + * @param array $spec + * @return Zend_File_Transfer_Exception + */ + public function addPrefixPaths(array $spec) + { + if (isset($spec['prefix']) && isset($spec['path'])) { + return $this->addPrefixPath($spec['prefix'], $spec['path']); + } + foreach ($spec as $type => $paths) { + if (is_numeric($type) && is_array($paths)) { + $type = null; + if (isset($paths['prefix']) && isset($paths['path'])) { + if (isset($paths['type'])) { + $type = $paths['type']; + } + $this->addPrefixPath($paths['prefix'], $paths['path'], $type); + } + } elseif (!is_numeric($type)) { + if (!isset($paths['prefix']) || !isset($paths['path'])) { + foreach ($paths as $prefix => $spec) { + if (is_array($spec)) { + foreach ($spec as $path) { + if (!is_string($path)) { + continue; + } + $this->addPrefixPath($prefix, $path, $type); + } + } elseif (is_string($spec)) { + $this->addPrefixPath($prefix, $spec, $type); + } + } + } else { + $this->addPrefixPath($paths['prefix'], $paths['path'], $type); + } + } + } + return $this; + } + + /** + * Adds a new validator for this class + * + * @param string|array $validator Type of validator to add + * @param boolean $breakChainOnFailure If the validation chain should stop an failure + * @param string|array $options Options to set for the validator + * @param string|array $files Files to limit this validator to + * @return Zend_File_Transfer_Adapter + */ + public function addValidator($validator, $breakChainOnFailure = false, $options = null, $files = null) + { + if ($validator instanceof Zend_Validate_Interface) { + $name = get_class($validator); + } elseif (is_string($validator)) { + $name = $this->getPluginLoader(self::VALIDATE)->load($validator); + $validator = new $name($options); + if (is_array($options) && isset($options['messages'])) { + if (is_array($options['messages'])) { + $validator->setMessages($options['messages']); + } elseif (is_string($options['messages'])) { + $validator->setMessage($options['messages']); + } + + unset($options['messages']); + } + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Invalid validator provided to addValidator; must be string or Zend_Validate_Interface'); + } + + $this->_validators[$name] = $validator; + $this->_break[$name] = $breakChainOnFailure; + $files = $this->_getFiles($files, true, true); + foreach ($files as $file) { + $this->_files[$file]['validators'][] = $name; + $this->_files[$file]['validated'] = false; + } + + return $this; + } + + /** + * Add Multiple validators at once + * + * @param array $validators + * @param string|array $files + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function addValidators(array $validators, $files = null) + { + foreach ($validators as $name => $validatorInfo) { + if ($validatorInfo instanceof Zend_Validate_Interface) { + $this->addValidator($validatorInfo, null, null, $files); + } else if (is_string($validatorInfo)) { + if (!is_int($name)) { + $this->addValidator($name, null, $validatorInfo, $files); + } else { + $this->addValidator($validatorInfo, null, null, $files); + } + } else if (is_array($validatorInfo)) { + $argc = count($validatorInfo); + $breakChainOnFailure = false; + $options = array(); + if (isset($validatorInfo['validator'])) { + $validator = $validatorInfo['validator']; + if (isset($validatorInfo['breakChainOnFailure'])) { + $breakChainOnFailure = $validatorInfo['breakChainOnFailure']; + } + + if (isset($validatorInfo['options'])) { + $options = $validatorInfo['options']; + } + + $this->addValidator($validator, $breakChainOnFailure, $options, $files); + } else { + if (is_string($name)) { + $validator = $name; + $options = $validatorInfo; + $this->addValidator($validator, $breakChainOnFailure, $options, $files); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $validator = array_shift($validatorInfo); + case (2 <= $argc): + $breakChainOnFailure = array_shift($validatorInfo); + case (3 <= $argc): + $options = array_shift($validatorInfo); + case (4 <= $argc): + $files = array_shift($validatorInfo); + default: + $this->addValidator($validator, $breakChainOnFailure, $options, $files); + break; + } + } + } + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Invalid validator passed to addValidators()'); + } + } + + return $this; + } + + /** + * Sets a validator for the class, erasing all previous set + * + * @param string|array $validator Validator to set + * @param string|array $files Files to limit this validator to + * @return Zend_File_Transfer_Adapter + */ + public function setValidators(array $validators, $files = null) + { + $this->clearValidators(); + return $this->addValidators($validators, $files); + } + + /** + * Determine if a given validator has already been registered + * + * @param string $name + * @return bool + */ + public function hasValidator($name) + { + return (false !== $this->_getValidatorIdentifier($name)); + } + + /** + * Retrieve individual validator + * + * @param string $name + * @return Zend_Validate_Interface|null + */ + public function getValidator($name) + { + if (false === ($identifier = $this->_getValidatorIdentifier($name))) { + return null; + } + return $this->_validators[$identifier]; + } + + /** + * Returns all set validators + * + * @param string|array $files (Optional) Returns the validator for this files + * @return null|array List of set validators + */ + public function getValidators($files = null) + { + $files = $this->_getFiles($files, true, true); + + if (empty($files)) { + return $this->_validators; + } + + $validators = array(); + foreach ($files as $file) { + if (!empty($this->_files[$file]['validators'])) { + $validators += $this->_files[$file]['validators']; + } + } + $validators = array_unique($validators); + + $result = array(); + foreach ($validators as $validator) { + $result[$validator] = $this->_validators[$validator]; + } + + return $result; + } + + /** + * Remove an individual validator + * + * @param string $name + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function removeValidator($name) + { + if (false === ($key = $this->_getValidatorIdentifier($name))) { + return $this; + } + + unset($this->_validators[$key]); + foreach (array_keys($this->_files) as $file) { + if (empty($this->_files[$file]['validators'])) { + continue; + } + + $index = array_search($key, $this->_files[$file]['validators']); + if ($index === false) { + continue; + } + + unset($this->_files[$file]['validators'][$index]); + $this->_files[$file]['validated'] = false; + } + + return $this; + } + + /** + * Remove all validators + * + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function clearValidators() + { + $this->_validators = array(); + foreach (array_keys($this->_files) as $file) { + $this->_files[$file]['validators'] = array(); + $this->_files[$file]['validated'] = false; + } + + return $this; + } + + /** + * Sets Options for adapters + * + * @param array $options Options to set + * @param array $files (Optional) Files to set the options for + */ + public function setOptions($options = array(), $files = null) { + $file = $this->_getFiles($files, false, true); + + if (is_array($options)) { + foreach ($options as $name => $value) { + foreach ($file as $key => $content) { + switch ($name) { + case 'magicFile' : + $this->_files[$key]['options'][$name] = (string) $value; + break; + + case 'ignoreNoFile' : + case 'useByteString' : + $this->_files[$key]['options'][$name] = (boolean) $value; + break; + + default: + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception("Unknown option: $name = $value"); + } + } + } + } + + return $this; + } + + /** + * Returns set options for adapters or files + * + * @param array $files (Optional) Files to return the options for + * @return array Options for given files + */ + public function getOptions($files = null) { + $file = $this->_getFiles($files, false, true); + + foreach ($file as $key => $content) { + if (isset($this->_files[$key]['options'])) { + $options[$key] = $this->_files[$key]['options']; + } else { + $options[$key] = array(); + } + } + + return $options; + } + + /** + * Checks if the files are valid + * + * @param string|array $files (Optional) Files to check + * @return boolean True if all checks are valid + */ + public function isValid($files = null) + { + $check = $this->_getFiles($files, false, true); + if (empty($check)) { + return false; + } + + $translator = $this->getTranslator(); + $this->_messages = array(); + $break = false; + foreach($check as $key => $content) { + if (array_key_exists('validators', $content) && + in_array('Zend_Validate_File_Count', $content['validators'])) { + $validator = $this->_validators['Zend_Validate_File_Count']; + $validator->addFile($content['tmp_name']); + $count = $content; + } + } + + if (isset($count)) { + if (!$validator->isValid($count['tmp_name'], $count)) { + $this->_messages += $validator->getMessages(); + } + } + + foreach ($check as $key => $content) { + $fileerrors = array(); + if (array_key_exists('validators', $content) && $content['validated']) { + continue; + } + + if (array_key_exists('validators', $content)) { + foreach ($content['validators'] as $class) { + $validator = $this->_validators[$class]; + if (method_exists($validator, 'setTranslator')) { + $validator->setTranslator($translator); + } + + if (($class === 'Zend_Validate_File_Upload') and (empty($content['tmp_name']))) { + $tocheck = $key; + } else { + $tocheck = $content['tmp_name']; + } + + if (!$validator->isValid($tocheck, $content)) { + $fileerrors += $validator->getMessages(); + } + + if (!empty($content['options']['ignoreNoFile']) and (isset($fileerrors['fileUploadErrorNoFile']))) { + unset($fileerrors['fileUploadErrorNoFile']); + break; + } + + if (($class === 'Zend_Validate_File_Upload') and (count($fileerrors) > 0)) { + break; + } + + if (($this->_break[$class]) and (count($fileerrors) > 0)) { + $break = true; + break; + } + } + } + + if (count($fileerrors) > 0) { + $this->_files[$key]['validated'] = false; + } else { + $this->_files[$key]['validated'] = true; + } + + $this->_messages += $fileerrors; + if ($break) { + break; + } + } + + if (count($this->_messages) > 0) { + return false; + } + + return true; + } + + /** + * Returns found validation messages + * + * @return array + */ + public function getMessages() + { + return $this->_messages; + } + + /** + * Retrieve error codes + * + * @return array + */ + public function getErrors() + { + return array_keys($this->_messages); + } + + /** + * Are there errors registered? + * + * @return boolean + */ + public function hasErrors() + { + return (!empty($this->_messages)); + } + + /** + * Adds a new filter for this class + * + * @param string|array $filter Type of filter to add + * @param string|array $options Options to set for the filter + * @param string|array $files Files to limit this filter to + * @return Zend_File_Transfer_Adapter + */ + public function addFilter($filter, $options = null, $files = null) + { + if ($filter instanceof Zend_Filter_Interface) { + $class = get_class($filter); + } elseif (is_string($filter)) { + $class = $this->getPluginLoader(self::FILTER)->load($filter); + $filter = new $class($options); + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Invalid filter specified'); + } + + $this->_filters[$class] = $filter; + $files = $this->_getFiles($files, true, true); + foreach ($files as $file) { + $this->_files[$file]['filters'][] = $class; + } + + return $this; + } + + /** + * Add Multiple filters at once + * + * @param array $filters + * @param string|array $files + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function addFilters(array $filters, $files = null) + { + foreach ($filters as $key => $spec) { + if ($spec instanceof Zend_Filter_Interface) { + $this->addFilter($spec, null, $files); + continue; + } + + if (is_string($key)) { + $this->addFilter($key, $spec, $files); + continue; + } + + if (is_int($key)) { + if (is_string($spec)) { + $this->addFilter($spec, null, $files); + continue; + } + + if (is_array($spec)) { + if (!array_key_exists('filter', $spec)) { + continue; + } + + $filter = $spec['filter']; + unset($spec['filter']); + $this->addFilter($filter, $spec, $files); + continue; + } + + continue; + } + } + + return $this; + } + + /** + * Sets a filter for the class, erasing all previous set + * + * @param string|array $filter Filter to set + * @param string|array $files Files to limit this filter to + * @return Zend_File_Transfer_Adapter + */ + public function setFilters(array $filters, $files = null) + { + $this->clearFilters(); + return $this->addFilters($filters, $files); + } + + /** + * Determine if a given filter has already been registered + * + * @param string $name + * @return bool + */ + public function hasFilter($name) + { + return (false !== $this->_getFilterIdentifier($name)); + } + + /** + * Retrieve individual filter + * + * @param string $name + * @return Zend_Filter_Interface|null + */ + public function getFilter($name) + { + if (false === ($identifier = $this->_getFilterIdentifier($name))) { + return null; + } + return $this->_filters[$identifier]; + } + + /** + * Returns all set filters + * + * @param string|array $files (Optional) Returns the filter for this files + * @return array List of set filters + * @throws Zend_File_Transfer_Exception When file not found + */ + public function getFilters($files = null) + { + if ($files === null) { + return $this->_filters; + } + + $files = $this->_getFiles($files, true, true); + $filters = array(); + foreach ($files as $file) { + if (!empty($this->_files[$file]['filters'])) { + $filters += $this->_files[$file]['filters']; + } + } + + $filters = array_unique($filters); + $result = array(); + foreach ($filters as $filter) { + $result[] = $this->_filters[$filter]; + } + + return $result; + } + + /** + * Remove an individual filter + * + * @param string $name + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function removeFilter($name) + { + if (false === ($key = $this->_getFilterIdentifier($name))) { + return $this; + } + + unset($this->_filters[$key]); + foreach (array_keys($this->_files) as $file) { + if (empty($this->_files[$file]['filters'])) { + continue; + } + + $index = array_search($key, $this->_files[$file]['filters']); + if ($index === false) { + continue; + } + + unset($this->_files[$file]['filters'][$index]); + } + return $this; + } + + /** + * Remove all filters + * + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function clearFilters() + { + $this->_filters = array(); + foreach (array_keys($this->_files) as $file) { + $this->_files[$file]['filters'] = array(); + } + return $this; + } + + /** + * Returns all set files + * + * @return array List of set files + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function getFile() + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Retrieves the filename of transferred files. + * + * @param string $fileelement (Optional) Element to return the filename for + * @param boolean $path (Optional) Should the path also be returned ? + * @return string|array + */ + public function getFileName($file = null, $path = true) + { + $files = $this->_getFiles($file, true, true); + $result = array(); + $directory = ""; + foreach($files as $file) { + if (empty($this->_files[$file]['name'])) { + continue; + } + + if ($path === true) { + $directory = $this->getDestination($file) . DIRECTORY_SEPARATOR; + } + + $result[$file] = $directory . $this->_files[$file]['name']; + } + + if (count($result) == 1) { + return current($result); + } + + return $result; + } + + /** + * Retrieve additional internal file informations for files + * + * @param string $file (Optional) File to get informations for + * @return array + */ + public function getFileInfo($file = null) + { + return $this->_getFiles($file); + } + + /** + * Adds one or more files + * + * @param string|array $file File to add + * @param string|array $validator Validators to use for this file, must be set before + * @param string|array $filter Filters to use for this file, must be set before + * @return Zend_File_Transfer_Adapter_Abstract + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function addFile($file, $validator = null, $filter = null) + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Returns all set types + * + * @return array List of set types + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function getType() + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Adds one or more type of files + * + * @param string|array $type Type of files to add + * @param string|array $validator Validators to use for this file, must be set before + * @param string|array $filter Filters to use for this file, must be set before + * @return Zend_File_Transfer_Adapter_Abstract + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function addType($type, $validator = null, $filter = null) + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Sets a new destination for the given files + * + * @deprecated Will be changed to be a filter!!! + * @param string $destination New destination directory + * @param string|array $files Files to set the new destination for + * @return Zend_File_Transfer_Abstract + * @throws Zend_File_Transfer_Exception when the given destination is not a directory or does not exist + */ + public function setDestination($destination, $files = null) + { + $orig = $files; + $destination = rtrim($destination, "/\\"); + if (!is_dir($destination)) { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('The given destination is no directory or does not exist'); + } + + if (!is_writable($destination)) { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('The given destination is not writeable'); + } + + if ($files === null) { + foreach ($this->_files as $file => $content) { + $this->_files[$file]['destination'] = $destination; + } + } else { + $files = $this->_getFiles($files, true, true); + if (empty($files) and is_string($orig)) { + $this->_files[$orig]['destination'] = $destination; + } + + foreach ($files as $file) { + $this->_files[$file]['destination'] = $destination; + } + } + + return $this; + } + + /** + * Retrieve destination directory value + * + * @param null|string|array $files + * @return null|string|array + */ + public function getDestination($files = null) + { + $orig = $files; + $files = $this->_getFiles($files, false, true); + $destinations = array(); + if (empty($files) and is_string($orig)) { + if (isset($this->_files[$orig]['destination'])) { + $destinations[$orig] = $this->_files[$orig]['destination']; + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception(sprintf('"%s" not found by file transfer adapter', $orig)); + } + } + + foreach ($files as $key => $content) { + if (isset($this->_files[$key]['destination'])) { + $destinations[$key] = $this->_files[$key]['destination']; + } else { + $tmpdir = $this->_getTmpDir(); + $this->setDestination($tmpdir, $key); + $destinations[$key] = $tmpdir; + } + } + + if (empty($destinations)) { + $destinations = $this->_getTmpDir(); + } else if (count($destinations) == 1) { + $destinations = current($destinations); + } + + return $destinations; + } + + /** + * Set translator object for localization + * + * @param Zend_Translate|null $translator + * @return Zend_File_Transfer_Abstract + */ + public function setTranslator($translator = null) + { + if (null === $translator) { + $this->_translator = null; + } elseif ($translator instanceof Zend_Translate_Adapter) { + $this->_translator = $translator; + } elseif ($translator instanceof Zend_Translate) { + $this->_translator = $translator->getAdapter(); + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Invalid translator specified'); + } + + return $this; + } + + /** + * Retrieve localization translator object + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if ($this->translatorIsDisabled()) { + return null; + } + + return $this->_translator; + } + + /** + * Indicate whether or not translation should be disabled + * + * @param bool $flag + * @return Zend_File_Transfer_Abstract + */ + public function setDisableTranslator($flag) + { + $this->_translatorDisabled = (bool) $flag; + return $this; + } + + /** + * Is translation disabled? + * + * @return bool + */ + public function translatorIsDisabled() + { + return $this->_translatorDisabled; + } + + /** + * Returns the hash for a given file + * + * @param string $hash Hash algorithm to use + * @param string|array $files Files to return the hash for + * @return string|array Hashstring + * @throws Zend_File_Transfer_Exception On unknown hash algorithm + */ + public function getHash($hash = 'crc32', $files = null) + { + if (!in_array($hash, hash_algos())) { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Unknown hash algorithm'); + } + + $files = $this->_getFiles($files); + $result = array(); + foreach($files as $key => $value) { + if (file_exists($value['name'])) { + $result[$key] = hash_file($hash, $value['name']); + } else if (file_exists($value['tmp_name'])) { + $result[$key] = hash_file($hash, $value['tmp_name']); + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception("File '{$value['name']}' does not exist"); + } + } + + if (count($result) == 1) { + return current($result); + } + + return $result; + } + + /** + * Returns the real filesize of the file + * + * @param string|array $files Files to get the filesize from + * @throws Zend_File_Transfer_Exception When the file does not exist + * @return string|array Filesize + */ + public function getFileSize($files = null) + { + $files = $this->_getFiles($files); + $result = array(); + foreach($files as $key => $value) { + if (file_exists($value['name'])) { + $size = sprintf("%u", @filesize($value['name'])); + } else if (file_exists($value['tmp_name'])) { + $size = sprintf("%u", @filesize($value['tmp_name'])); + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception("File '{$value['name']}' does not exist"); + } + + if ($value['options']['useByteString']) { + $result[$key] = self::_toByteString($size); + } else { + $result[$key] = $size; + } + } + + if (count($result) == 1) { + return current($result); + } + + return $result; + } + + /** + * Returns the real mimetype of the file + * Uses fileinfo, when not available mime_magic and as last fallback a manual given mimetype + * + * @param string|array $files Files to get the mimetype from + * @throws Zend_File_Transfer_Exception When the file does not exist + * @return string|array MimeType + */ + public function getMimeType($files = null) + { + $files = $this->_getFiles($files); + $result = array(); + foreach($files as $key => $value) { + if (file_exists($value['name'])) { + $file = $value['name']; + } else if (file_exists($value['tmp_name'])) { + $file = $value['tmp_name']; + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception("File '{$value['name']}' does not exist"); + } + + if (class_exists('finfo', false)) { + $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME; + if (!empty($value['options']['magicFile'])) { + $mime = new finfo($const, $value['options']['magicFile']); + } else { + $mime = new finfo($const); + } + + if ($mime !== false) { + $result[$key] = $mime->file($file); + } + + unset($mime); + } + + if (empty($result[$key])) { + if (function_exists('mime_content_type') && ini_get('mime_magic.magicfile')) { + $result[$key] = mime_content_type($file); + } else { + $result[$key] = $value['type']; + } + } + + if (empty($result[$key])) { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception("The mimetype of file '{$value['name']}' could not been detected"); + } + } + + if (count($result) == 1) { + return current($result); + } + + return $result; + } + + /** + * Returns the formatted size + * + * @param integer $size + * @return string + */ + protected static function _toByteString($size) + { + $sizes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); + for ($i=0; $size >= 1024 && $i < 9; $i++) { + $size /= 1024; + } + + return round($size, 2) . $sizes[$i]; + } + + /** + * Internal function to filter all given files + * + * @param string|array $files (Optional) Files to check + * @return boolean False on error + */ + protected function _filter($files = null) + { + $check = $this->_getFiles($files); + foreach ($check as $name => $content) { + if (array_key_exists('filters', $content)) { + foreach ($content['filters'] as $class) { + $filter = $this->_filters[$class]; + try { + $result = $filter->filter($this->getFileName($name)); + + $this->_files[$name]['destination'] = dirname($result); + $this->_files[$name]['name'] = basename($result); + } catch (Zend_Filter_Exception $e) { + $this->_messages += array($e->getMessage()); + } + } + } + } + + if (count($this->_messages) > 0) { + return false; + } + + return true; + } + + /** + * Determine system TMP directory and detect if we have read access + * + * @return string + * @throws Zend_File_Transfer_Exception if unable to determine directory + */ + protected function _getTmpDir() + { + if (null === $this->_tmpDir) { + $tmpdir = array(); + if (function_exists('sys_get_temp_dir')) { + $tmpdir[] = sys_get_temp_dir(); + } + + if (!empty($_ENV['TMP'])) { + $tmpdir[] = realpath($_ENV['TMP']); + } + + if (!empty($_ENV['TMPDIR'])) { + $tmpdir[] = realpath($_ENV['TMPDIR']); + } + + if (!empty($_ENV['TEMP'])) { + $tmpdir[] = realpath($_ENV['TEMP']); + } + + $upload = ini_get('upload_tmp_dir'); + if ($upload) { + $tmpdir[] = realpath($upload); + } + + foreach($tmpdir as $directory) { + if ($this->_isPathWriteable($directory)) { + $this->_tmpDir = $directory; + } + } + + if (empty($this->_tmpDir)) { + // Attemp to detect by creating a temporary file + $tempFile = tempnam(md5(uniqid(rand(), TRUE)), ''); + if ($tempFile) { + $this->_tmpDir = realpath(dirname($tempFile)); + unlink($tempFile); + } else { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Could not determine temp directory'); + } + } + + $this->_tmpDir = rtrim($this->_tmpDir, "/\\"); + } + return $this->_tmpDir; + } + + /** + * Tries to detect if we can read and write to the given path + * + * @param string $path + */ + protected function _isPathWriteable($path) + { + $tempFile = rtrim($path, "/\\"); + $tempFile .= '/' . 'test.1'; + + $result = @file_put_contents($tempFile, 'TEST'); + + if ($result == false) { + return false; + } + + $result = @unlink($tempFile); + + if ($result == false) { + return false; + } + + return true; + } + + /** + * Returns found files based on internal file array and given files + * + * @param string|array $files (Optional) Files to return + * @param boolean $names (Optional) Returns only names on true, else complete info + * @param boolean $noexception (Optional) Allows throwing an exception, otherwise returns an empty array + * @return array Found files + * @throws Zend_File_Transfer_Exception On false filename + */ + protected function _getFiles($files, $names = false, $noexception = false) + { + $check = array(); + + if (is_string($files)) { + $files = array($files); + } + + if (is_array($files)) { + foreach ($files as $find) { + $found = array(); + foreach ($this->_files as $file => $content) { + if (!isset($content['name'])) { + continue; + } + + if (($content['name'] === $find) && isset($content['multifiles'])) { + foreach ($content['multifiles'] as $multifile) { + $found[] = $multifile; + } + break; + } + + if ($file === $find) { + $found[] = $file; + break; + } + + if ($content['name'] === $find) { + $found[] = $file; + break; + } + } + + if (empty($found)) { + if ($noexception !== false) { + return array(); + } + + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception(sprintf('"%s" not found by file transfer adapter', $find)); + } + + foreach ($found as $checked) { + $check[$checked] = $this->_files[$checked]; + } + } + } + + if ($files === null) { + $check = $this->_files; + $keys = array_keys($check); + foreach ($keys as $key) { + if (isset($check[$key]['multifiles'])) { + unset($check[$key]); + } + } + } + + if ($names) { + $check = array_keys($check); + } + + return $check; + } + + /** + * Retrieve internal identifier for a named validator + * + * @param string $name + * @return string + */ + protected function _getValidatorIdentifier($name) + { + if (array_key_exists($name, $this->_validators)) { + return $name; + } + + foreach (array_keys($this->_validators) as $test) { + if (preg_match('/' . preg_quote($name) . '$/i', $test)) { + return $test; + } + } + + return false; + } + + /** + * Retrieve internal identifier for a named filter + * + * @param string $name + * @return string + */ + protected function _getFilterIdentifier($name) + { + if (array_key_exists($name, $this->_filters)) { + return $name; + } + + foreach (array_keys($this->_filters) as $test) { + if (preg_match('/' . preg_quote($name) . '$/i', $test)) { + return $test; + } + } + + return false; + } +} diff --git a/lib/zend/Zend/File/Transfer/Adapter/Http.php b/lib/zend/Zend/File/Transfer/Adapter/Http.php new file mode 100644 index 0000000000..a6954d55d1 --- /dev/null +++ b/lib/zend/Zend/File/Transfer/Adapter/Http.php @@ -0,0 +1,453 @@ +_files = $this->_prepareFiles($_FILES); + $this->addValidator('Upload', false, $this->_files); + + if (is_array($options)) { + $this->setOptions($options); + } + } + + /** + * Sets a validator for the class, erasing all previous set + * + * @param string|array $validator Validator to set + * @param string|array $files Files to limit this validator to + * @return Zend_File_Transfer_Adapter + */ + public function setValidators(array $validators, $files = null) + { + $this->clearValidators(); + return $this->addValidators($validators, $files); + } + + /** + * Remove an individual validator + * + * @param string $name + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function removeValidator($name) + { + if ($name == 'Upload') { + return $this; + } + + return parent::removeValidator($name); + } + + /** + * Remove an individual validator + * + * @param string $name + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function clearValidators() + { + parent::clearValidators(); + $this->addValidator('Upload', false, $this->_files); + + return $this; + } + + /** + * Send the file to the client (Download) + * + * @param string|array $options Options for the file(s) to send + * @return void + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function send($options = null) + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Checks if the files are valid + * + * @param string|array $files (Optional) Files to check + * @return boolean True if all checks are valid + */ + public function isValid($files = null) + { + // Workaround for a PHP error returning empty $_FILES when form data exceeds php settings + if (empty($this->_files) && ($_SERVER['CONTENT_LENGTH'] > 0)) { + if (is_array($files)) { + $files = current($files); + } + + $temp = array($files => array( + 'name' => $files, + 'error' => 1)); + $validator = $this->_validators['Zend_Validate_File_Upload']; + $validator->setFiles($temp) + ->isValid($files, null); + $this->_messages += $validator->getMessages(); + return false; + } + + return parent::isValid($files); + } + + /** + * Receive the file from the client (Upload) + * + * @param string|array $files (Optional) Files to receive + * @return bool + */ + public function receive($files = null) + { + if (!$this->isValid($files)) { + return false; + } + + $check = $this->_getFiles($files); + foreach ($check as $file => $content) { + if (!$content['received']) { + $directory = ''; + $destination = $this->getDestination($file); + if ($destination !== null) { + $directory = $destination . DIRECTORY_SEPARATOR; + } + + $filename = $directory . $content['name']; + $rename = $this->getFilter('Rename'); + if ($rename !== null) { + $tmp = $rename->getNewName($content['tmp_name']); + if ($tmp != $content['tmp_name']) { + $filename = $tmp; + } + + if (dirname($filename) == '.') { + $filename = $directory . $filename; + } + + $key = array_search(get_class($rename), $this->_files[$file]['filters']); + unset($this->_files[$file]['filters'][$key]); + } + + // Should never return false when it's tested by the upload validator + if (!move_uploaded_file($content['tmp_name'], $filename)) { + if ($content['options']['ignoreNoFile']) { + $this->_files[$file]['received'] = true; + $this->_files[$file]['filtered'] = true; + continue; + } + + $this->_files[$file]['received'] = false; + return false; + } + + if ($rename !== null) { + $this->_files[$file]['destination'] = dirname($filename); + $this->_files[$file]['name'] = basename($filename); + } + + $this->_files[$file]['tmp_name'] = $filename; + $this->_files[$file]['received'] = true; + } + + if (!$content['filtered']) { + if (!$this->_filter($file)) { + $this->_files[$file]['filtered'] = false; + return false; + } + + $this->_files[$file]['filtered'] = true; + } + } + + return true; + } + + /** + * Checks if the file was already sent + * + * @param string|array $file Files to check + * @return bool + * @throws Zend_File_Transfer_Exception Not implemented + */ + public function isSent($files = null) + { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Method not implemented'); + } + + /** + * Checks if the file was already received + * + * @param string|array $files (Optional) Files to check + * @return bool + */ + public function isReceived($files = null) + { + $files = $this->_getFiles($files, false, true); + if (empty($files)) { + return false; + } + + foreach ($files as $content) { + if ($content['received'] !== true) { + return false; + } + } + + return true; + } + + /** + * Checks if the file was already filtered + * + * @param string|array $files (Optional) Files to check + * @return bool + */ + public function isFiltered($files = null) + { + $files = $this->_getFiles($files, false, true); + if (empty($files)) { + return false; + } + + foreach ($files as $content) { + if ($content['filtered'] !== true) { + return false; + } + } + + return true; + } + + /** + * Has a file been uploaded ? + * + * @param array|string|null $file + * @return bool + */ + public function isUploaded($files = null) + { + $files = $this->_getFiles($files, false, true); + if (empty($files)) { + return false; + } + + foreach ($files as $file) { + if (empty($file['name'])) { + return false; + } + } + + return true; + } + + /** + * Returns the actual progress of file up-/downloads + * + * @param string $id The upload to get the progress for + * @return array|null + */ + public static function getProgress($id = null) + { + if (!function_exists('apc_fetch') and !function_exists('uploadprogress_get_info')) { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Wether APC nor uploadprogress extension installed'); + } + + $session = 'Zend_File_Transfer_Adapter_Http_ProgressBar'; + $status = array( + 'total' => 0, + 'current' => 0, + 'rate' => 0, + 'message' => '', + 'done' => false + ); + + if (is_array($id)) { + if (isset($id['progress'])) { + $adapter = $id['progress']; + } + + if (isset($id['session'])) { + $session = $id['session']; + } + + if (isset($id['id'])) { + $id = $id['id']; + } else { + unset($id); + } + } + + if (!empty($id) && (($id instanceof Zend_ProgressBar_Adapter) || ($id instanceof Zend_ProgressBar))) { + $adapter = $id; + unset($id); + } + + if (empty($id)) { + if (!isset($_GET['progress_key'])) { + $status['message'] = 'No upload in progress'; + $status['done'] = true; + } else { + $id = $_GET['progress_key']; + } + } + + if (!empty($id)) { + if (self::isApcAvailable()) { + + $call = call_user_func(self::$_callbackApc, 'upload_' . $id); + if (is_array($call)) { + $status = $call + $status; + } + } else if (self::isUploadProgressAvailable()) { + $call = call_user_func(self::$_callbackUploadProgress, $id); + if (is_array($call)) { + $status = $call + $status; + $status['total'] = $status['bytes_total']; + $status['current'] = $status['bytes_uploaded']; + $status['rate'] = $status['speed_average']; + if ($status['total'] == $status['current']) { + $status['done'] = true; + } + } + } + + if (!is_array($call)) { + $status['done'] = true; + $status['message'] = 'Failure while retrieving the upload progress'; + } else if (!empty($status['cancel_upload'])) { + $status['done'] = true; + $status['message'] = 'The upload has been canceled'; + } else { + $status['message'] = self::_toByteString($status['current']) . " - " . self::_toByteString($status['total']); + } + + $status['id'] = $id; + } + + if (isset($adapter) && isset($status['id'])) { + if ($adapter instanceof Zend_ProgressBar_Adapter) { + require_once 'Zend/ProgressBar.php'; + $adapter = new Zend_ProgressBar($adapter, 0, $status['total'], $session); + } + + if (!($adapter instanceof Zend_ProgressBar)) { + require_once 'Zend/File/Transfer/Exception.php'; + throw new Zend_File_Transfer_Exception('Unknown Adapter given'); + } + + if ($status['done']) { + $adapter->finish(); + } else { + $adapter->update($status['current'], $status['message']); + } + + $status['progress'] = $adapter; + } + + return $status; + } + + /** + * Checks the APC extension for progress information + * + * @return boolean + */ + public static function isApcAvailable() + { + return (bool) ini_get('apc.enabled') && (bool) ini_get('apc.rfc1867') && is_callable(self::$_callbackApc); + } + + /** + * Checks the UploadProgress extension for progress information + * + * @return boolean + */ + public static function isUploadProgressAvailable() + { + return is_callable(self::$_callbackUploadProgress); + } + + /** + * Prepare the $_FILES array to match the internal syntax of one file per entry + * + * @param array $files + * @return array + */ + protected function _prepareFiles(array $files = array()) + { + $result = array(); + foreach ($files as $form => $content) { + if (is_array($content['name'])) { + foreach ($content as $param => $file) { + foreach ($file as $number => $target) { + $result[$form . '_' . $number . '_'][$param] = $target; + $result[$form . '_' . $number . '_']['options'] = $this->_options; + $result[$form . '_' . $number . '_']['validated'] = false; + $result[$form . '_' . $number . '_']['received'] = false; + $result[$form . '_' . $number . '_']['filtered'] = false; + $result[$form]['multifiles'][$number] = $form . '_' . $number . '_'; + $result[$form]['name'] = $form; + } + } + } else { + $result[$form] = $content; + $result[$form]['options'] = $this->_options; + $result[$form]['validated'] = false; + $result[$form]['received'] = false; + $result[$form]['filtered'] = false; + } + } + + return $result; + } +} diff --git a/lib/zend/Zend/File/Transfer/Exception.php b/lib/zend/Zend/File/Transfer/Exception.php new file mode 100644 index 0000000000..e94c88c6cc --- /dev/null +++ b/lib/zend/Zend/File/Transfer/Exception.php @@ -0,0 +1,55 @@ +_fileerror = $fileerror; + parent::__construct($message); + } + + /** + * Returns the transfer error code for the exception + * This is not the exception code !!! + * + * @return integer + */ + public function getFileError() + { + return $this->_fileerror; + } +} diff --git a/lib/zend/Zend/Filter/Alnum.php b/lib/zend/Zend/Filter/Alnum.php new file mode 100644 index 0000000000..304a6877a2 --- /dev/null +++ b/lib/zend/Zend/Filter/Alnum.php @@ -0,0 +1,136 @@ +allowWhiteSpace = (boolean) $allowWhiteSpace; + if (null === self::$_unicodeEnabled) { + self::$_unicodeEnabled = (@preg_match('/\pL/u', 'a')) ? true : false; + } + + if (null === self::$_meansEnglishAlphabet) { + $this->_locale = new Zend_Locale('auto'); + self::$_meansEnglishAlphabet = in_array($this->_locale->getLanguage(), + array('ja', 'ko', 'zh') + ); + } + + } + + /** + * Returns the allowWhiteSpace option + * + * @return boolean + */ + public function getAllowWhiteSpace() + { + return $this->allowWhiteSpace; + } + + /** + * Sets the allowWhiteSpace option + * + * @param boolean $allowWhiteSpace + * @return Zend_Filter_Alnum Provides a fluent interface + */ + public function setAllowWhiteSpace($allowWhiteSpace) + { + $this->allowWhiteSpace = (boolean) $allowWhiteSpace; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, removing all but alphabetic and digit characters + * + * @param string $value + * @return string + */ + public function filter($value) + { + $whiteSpace = $this->allowWhiteSpace ? '\s' : ''; + if (!self::$_unicodeEnabled) { + // POSIX named classes are not supported, use alternative a-zA-Z0-9 match + $pattern = '/[^a-zA-Z0-9' . $whiteSpace . ']/'; + } else if (self::$_meansEnglishAlphabet) { + //The Alphabet means english alphabet. + $pattern = '/[^a-zA-Z0-9' . $whiteSpace . ']/u'; + } else { + //The Alphabet means each language's alphabet. + $pattern = '/[^\p{L}\p{N}' . $whiteSpace . ']/u'; + } + + return preg_replace($pattern, '', (string) $value); + } +} diff --git a/lib/zend/Zend/Filter/Alpha.php b/lib/zend/Zend/Filter/Alpha.php new file mode 100644 index 0000000000..5d918c6fbe --- /dev/null +++ b/lib/zend/Zend/Filter/Alpha.php @@ -0,0 +1,136 @@ +allowWhiteSpace = (boolean) $allowWhiteSpace; + if (null === self::$_unicodeEnabled) { + self::$_unicodeEnabled = (@preg_match('/\pL/u', 'a')) ? true : false; + } + + if (null === self::$_meansEnglishAlphabet) { + $this->_locale = new Zend_Locale('auto'); + self::$_meansEnglishAlphabet = in_array($this->_locale->getLanguage(), + array('ja', 'ko', 'zh') + ); + } + + } + + /** + * Returns the allowWhiteSpace option + * + * @return boolean + */ + public function getAllowWhiteSpace() + { + return $this->allowWhiteSpace; + } + + /** + * Sets the allowWhiteSpace option + * + * @param boolean $allowWhiteSpace + * @return Zend_Filter_Alpha Provides a fluent interface + */ + public function setAllowWhiteSpace($allowWhiteSpace) + { + $this->allowWhiteSpace = (boolean) $allowWhiteSpace; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, removing all but alphabetic characters + * + * @param string $value + * @return string + */ + public function filter($value) + { + $whiteSpace = $this->allowWhiteSpace ? '\s' : ''; + if (!self::$_unicodeEnabled) { + // POSIX named classes are not supported, use alternative a-zA-Z match + $pattern = '/[^a-zA-Z' . $whiteSpace . ']/'; + } else if (self::$_meansEnglishAlphabet) { + //The Alphabet means english alphabet. + $pattern = '/[^a-zA-Z' . $whiteSpace . ']/u'; + } else { + //The Alphabet means each language's alphabet. + $pattern = '/[^\p{L}' . $whiteSpace . ']/u'; + } + + return preg_replace($pattern, '', (string) $value); + } +} diff --git a/lib/zend/Zend/Filter/BaseName.php b/lib/zend/Zend/Filter/BaseName.php new file mode 100644 index 0000000000..5189a49e60 --- /dev/null +++ b/lib/zend/Zend/Filter/BaseName.php @@ -0,0 +1,50 @@ +setCallback($callback); + $this->setOptions($options); + } + + /** + * Returns the set callback + * + * @return string|array Set callback + */ + public function getCallback() + { + return $this->_callback; + } + + /** + * Sets a new callback for this filter + * + * @param unknown_type $callback + * @return unknown + */ + public function setCallback($callback, $options = null) + { + if (!is_callable($callback)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Callback can not be accessed'); + } + + $this->_callback = $callback; + $this->setOptions($options); + return $this; + } + + /** + * Returns the set default options + * + * @return mixed + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Sets new default options to the callback filter + * + * @param mixed $options Default options to set + * @return Zend_Filter_Callback + */ + public function setOptions($options) + { + $this->_options = $options; + return $this; + } + + /** + * Calls the filter per callback + * + * @param $value mixed Options for the set callback + * @return mixed Result from the filter which was callbacked + */ + public function filter($value) + { + $options = array(); + + if ($this->_options !== null) { + if (!is_array($this->_options)) { + $options = array($this->_options); + } else { + $options = $this->_options; + } + } + + array_unshift($options, $value); + + return call_user_func_array($this->_callback, $options); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Filter/Decrypt.php b/lib/zend/Zend/Filter/Decrypt.php new file mode 100644 index 0000000000..84a6bc8640 --- /dev/null +++ b/lib/zend/Zend/Filter/Decrypt.php @@ -0,0 +1,49 @@ +_adapter->decrypt($value); + } +} diff --git a/lib/zend/Zend/Filter/Digits.php b/lib/zend/Zend/Filter/Digits.php new file mode 100644 index 0000000000..97a6744d7a --- /dev/null +++ b/lib/zend/Zend/Filter/Digits.php @@ -0,0 +1,82 @@ +setAdapter($options); + } + + /** + * Returns the name of the set adapter + * + * @return string + */ + public function getAdapter() + { + return $this->_adapter->toString(); + } + + /** + * Sets new encryption options + * + * @param string|array $options (Optional) Encryption options + * @return Zend_Filter_Encrypt + */ + public function setAdapter($options = null) + { + if (is_string($options)) { + $adapter = $options; + } else if (isset($options['adapter'])) { + $adapter = $options['adapter']; + unset($options['adapter']); + } else { + $adapter = 'Mcrypt'; + } + + if (!is_array($options)) { + $options = array(); + } + + if (Zend_Loader::isReadable('Zend/Filter/Encrypt/' . ucfirst($adapter). '.php')) { + $adapter = 'Zend_Filter_Encrypt_' . ucfirst($adapter); + } + + if (!class_exists($adapter)) { + Zend_Loader::loadClass($adapter); + } + + $this->_adapter = new $adapter($options); + if (!$this->_adapter instanceof Zend_Filter_Encrypt_Interface) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Encoding adapter '" . $adapter . "' does not implement Zend_Filter_Encrypt_Interface"); + } + + return $this; + } + + /** + * Calls adapter methods + * + * @param string $method Method to call + * @param string|array $options Options for this method + */ + public function __call($method, $options) + { + $part = substr($method, 0, 3); + if ((($part != 'get') and ($part != 'set')) or !method_exists($this->_adapter, $method)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Unknown method '{$method}'"); + } + + return call_user_func_array(array($this->_adapter, $method), $options); + } + + /** + * Defined by Zend_Filter_Interface + * + * Encrypts the content $value with the defined settings + * + * @param string $value Content to encrypt + * @return string The encrypted content + */ + public function filter($value) + { + return $this->_adapter->encrypt($value); + } +} diff --git a/lib/zend/Zend/Filter/Encrypt/Interface.php b/lib/zend/Zend/Filter/Encrypt/Interface.php new file mode 100644 index 0000000000..7b29161778 --- /dev/null +++ b/lib/zend/Zend/Filter/Encrypt/Interface.php @@ -0,0 +1,47 @@ + encryption key string + * 'algorithm' => algorithm to use + * 'algorithm_directory' => directory where to find the algorithm + * 'mode' => encryption mode to use + * 'modedirectory' => directory where to find the mode + * ) + */ + protected $_encryption = array( + 'key' => 'ZendFramework', + 'algorithm' => 'blowfish', + 'algorithm_directory' => '', + 'mode' => 'cbc', + 'mode_directory' => '', + 'vector' => null, + 'salt' => false + ); + + /** + * Class constructor + * + * @param string|array|Zend_Config $options Cryption Options + */ + public function __construct($options) + { + if (!extension_loaded('mcrypt')) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('This filter needs the mcrypt extension'); + } + + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_string($options)) { + $options = array('key' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Invalid options argument provided to filter'); + } + + $this->setEncryption($options); + } + + /** + * Returns the set encryption options + * + * @return array + */ + public function getEncryption() + { + return $this->_encryption; + } + + /** + * Sets new encryption options + * + * @param string|array $options Encryption options + * @return Zend_Filter_File_Encryption + */ + public function setEncryption($options) + { + if (is_string($options)) { + $options = array('key' => $options); + } + + if (!is_array($options)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Invalid options argument provided to filter'); + } + + $options = $options + $this->getEncryption(); + $algorithms = mcrypt_list_algorithms($options['algorithm_directory']); + if (!in_array($options['algorithm'], $algorithms)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("The algorithm '{$options['algorithm']}' is not supported"); + } + + $modes = mcrypt_list_modes($options['mode_directory']); + if (!in_array($options['mode'], $modes)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("The mode '{$options['mode']}' is not supported"); + } + + if (!mcrypt_module_self_test($options['algorithm'], $options['algorithm_directory'])) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('The given algorithm can not be used due an internal mcrypt problem'); + } + + if (!isset($options['vector'])) { + $options['vector'] = null; + } + + $this->_encryption = $options; + $this->setVector($options['vector']); + + return $this; + } + + /** + * Returns the set vector + * + * @return string + */ + public function getVector() + { + return $this->_encryption['vector']; + } + + /** + * Sets the initialization vector + * + * @param string $vector (Optional) Vector to set + * @return Zend_Filter_Encrypt_Mcrypt + */ + public function setVector($vector = null) + { + $cipher = $this->_openCipher(); + $size = mcrypt_enc_get_iv_size($cipher); + if (empty($vector)) { + srand(); + $vector = mcrypt_create_iv($size, MCRYPT_RAND); + } else if (strlen($vector) != $size) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('The given vector has a wrong size for the set algorithm'); + } + + $this->_encryption['vector'] = $vector; + $this->_closeCipher($cipher); + + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Encrypts the file $value with the defined settings + * + * @param string $value Full path of file to change + * @return string The filename which has been set, or false when there were errors + */ + public function encrypt($value) + { + $cipher = $this->_openCipher(); + $this->_initCipher($cipher); + $encrypted = mcrypt_generic($cipher, $value); + mcrypt_generic_deinit($cipher); + $this->_closeCipher($cipher); + + return $encrypted; + } + + /** + * Defined by Zend_Filter_Interface + * + * Decrypts the file $value with the defined settings + * + * @param string $value Full path of file to change + * @return string The filename which has been set, or false when there were errors + */ + public function decrypt($value) + { + $cipher = $this->_openCipher(); + $this->_initCipher($cipher); + $decrypted = mdecrypt_generic($cipher, $value); + mcrypt_generic_deinit($cipher); + $this->_closeCipher($cipher); + + return $decrypted; + } + + /** + * Returns the adapter name + * + * @return string + */ + public function toString() + { + return 'Mcrypt'; + } + + /** + * Open a cipher + * + * @throws Zend_Filter_Exception When the cipher can not be opened + * @return resource Returns the opened cipher + */ + protected function _openCipher() + { + $cipher = mcrypt_module_open( + $this->_encryption['algorithm'], + $this->_encryption['algorithm_directory'], + $this->_encryption['mode'], + $this->_encryption['mode_directory']); + + if ($cipher === false) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Mcrypt can not be opened with your settings'); + } + + return $cipher; + } + + /** + * Close a cipher + * + * @param resource $cipher Cipher to close + * @return Zend_Filter_Encrypt_Mcrypt + */ + protected function _closeCipher($cipher) + { + mcrypt_module_close($cipher); + + return $this; + } + + /** + * Initialises the cipher with the set key + * + * @param resource $cipher + * @throws + * @return resource + */ + protected function _initCipher($cipher) + { + $key = $this->_encryption['key']; + + $keysizes = mcrypt_enc_get_supported_key_sizes($cipher); + if (empty($keysizes) || ($this->_encryption['salt'] == true)) { + srand(); + $keysize = mcrypt_enc_get_key_size($cipher); + $key = substr(md5($key), 0, $keysize); + } else if (!in_array(strlen($key), $keysizes)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('The given key has a wrong size for the set algorithm'); + } + + $result = mcrypt_generic_init($cipher, $key, $this->_encryption['vector']); + if ($result < 0) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Mcrypt could not be initialize with the given setting'); + } + + return $this; + } +} diff --git a/lib/zend/Zend/Filter/Encrypt/Openssl.php b/lib/zend/Zend/Filter/Encrypt/Openssl.php new file mode 100644 index 0000000000..8345de1515 --- /dev/null +++ b/lib/zend/Zend/Filter/Encrypt/Openssl.php @@ -0,0 +1,343 @@ + public keys + * 'private' => private keys + * 'envelope' => resulting envelope keys + * ) + */ + protected $_keys = array( + 'public' => array(), + 'private' => array(), + 'envelope' => array() + ); + + /** + * Internal passphrase + * + * @var string + */ + protected $_passphrase; + + /** + * Class constructor + * + * @param string|array $oldfile File which should be renamed/moved + * @param string|array $newfile New filename, when not set $oldfile will be used as new filename + * for $value when filtering + * @param boolean $overwrite If set to true, it will overwrite existing files + */ + public function __construct($options = array()) + { + if (!extension_loaded('openssl')) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('This filter needs the openssl extension'); + } + + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + + $this->setPublicKey($options); + } + + /** + * Returns the set encryption options + * + * @param string|array $keys Key with type association + * @return Zend_Filter_Encrypt_Openssl + */ + protected function setKeys($keys) + { + if (!is_array($keys)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Invalid options argument provided to filter'); + } + + foreach ($keys as $type => $key) { + if (is_file($key) and is_readable($key)) { + $file = fopen($key, 'r'); + $cert = fread($file, 8192); + fclose($file); + } else { + $cert = $key; + $key = count($this->_keys[$type]); + } + + switch ($type) { + case 'public': + $test = openssl_pkey_get_public($cert); + if ($test === false) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Public key '{$cert}' not valid"); + } + + openssl_free_key($test); + $this->_keys['public'][$key] = $cert; + break; + case 'private': + $test = openssl_pkey_get_private($cert, $this->_passphrase); + if ($test === false) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Private key '{$cert}' not valid"); + } + + openssl_free_key($test); + $this->_keys['private'][$key] = $cert; + break; + case 'envelope': + $this->_keys['envelope'][$key] = $cert; + break; + default: + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Unknown key type '{$type}'"); + } + } + + return $this; + } + + /** + * Returns all public keys + * + * @return array + */ + public function getPublicKey() + { + return $this->_keys['public']; + } + + /** + * Sets public keys + * + * @param string|array $key Public keys + * @return Zend_Filter_Encrypt_Openssl + */ + public function setPublicKey($key) + { + if (is_array($key)) { + foreach($key as $type => $option) { + if ($type !== 'public') { + $key['public'] = $option; + unset($key[$type]); + } + } + } else { + $key = array('public' => $key); + } + + return $this->setKeys($key); + } + + /** + * Returns all private keys + * + * @return array + */ + public function getPrivateKey() + { + return $this->_keys['private']; + } + + /** + * Sets private keys + * + * @param string $key Private key + * @param string $passphrase + * @return Zend_Filter_Encrypt_Openssl + */ + public function setPrivateKey($key, $passphrase = null) + { + if (is_array($key)) { + foreach($key as $type => $option) { + if ($type !== 'private') { + $key['private'] = $option; + unset($key[$type]); + } + } + } else { + $key = array('private' => $key); + } + + if ($passphrase !== null) { + $this->setPassphrase($passphrase); + } + + return $this->setKeys($key); + } + + /** + * Returns all envelope keys + * + * @return array + */ + public function getEnvelopeKey() + { + return $this->_keys['envelope']; + } + + /** + * Sets envelope keys + * + * @param string|array $options Envelope keys + * @return Zend_Filter_Encrypt_Openssl + */ + public function setEnvelopeKey($key) + { + if (is_array($key)) { + foreach($key as $type => $option) { + if ($type !== 'envelope') { + $key['envelope'] = $option; + unset($key[$type]); + } + } + } else { + $key = array('envelope' => $key); + } + + return $this->setKeys($key); + } + + /** + * Returns the passphrase + * + * @return string + */ + public function getPassphrase() + { + return $this->_passphrase; + } + + /** + * Sets a new passphrase + * + * @param string $passphrase + * @return Zend_Filter_Encrypt_Openssl + */ + public function setPassphrase($passphrase) + { + $this->_passphrase = $passphrase; + return $this; + } + + /** + * Encrypts the file $value with the defined settings + * Note that you also need the "encrypted" keys to be able to decrypt + * + * @param string $value Content to encrypt + * @return string The encrypted content + * @throws Zend_Filter_Exception + */ + public function encrypt($value) + { + $encrypted = array(); + $encryptedkeys = array(); + + if (count($this->_keys['public']) == 0) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Openssl can not encrypt without public keys'); + } + + foreach($this->_keys['public'] as $key => $cert) { + $keys[$key] = openssl_pkey_get_public($cert); + } + + $crypt = openssl_seal($value, $encrypted, $encryptedkeys, $keys); + foreach ($keys as $key) { + openssl_free_key($key); + } + + if ($crypt === false) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Openssl was not able to encrypt you content with the given options'); + } + + $this->_keys['envelope'] = $encryptedkeys; + return $encrypted; + } + + /** + * Defined by Zend_Filter_Interface + * + * Decrypts the file $value with the defined settings + * + * @param string $value Content to decrypt + * @return string The decrypted content + * @throws Zend_Filter_Exception + */ + public function decrypt($value) + { + $decrypted = ""; + $envelope = current($this->getEnvelopeKey()); + + if (count($this->_keys['private']) !== 1) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Openssl can only decrypt with one private key'); + } + + if (empty($envelope)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Openssl can only decrypt with one envelope key'); + } + + foreach($this->_keys['private'] as $key => $cert) { + $keys = openssl_pkey_get_private($cert, $this->getPassphrase()); + } + + $crypt = openssl_open($value, $decrypted, $envelope, $keys); + openssl_free_key($keys); + + if ($crypt === false) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Openssl was not able to decrypt you content with the given options'); + } + + return $decrypted; + } + + /** + * Returns the adapter name + * + * @return string + */ + public function toString() + { + return 'Openssl'; + } +} diff --git a/lib/zend/Zend/Filter/Exception.php b/lib/zend/Zend/Filter/Exception.php new file mode 100644 index 0000000000..c851531c5e --- /dev/null +++ b/lib/zend/Zend/Filter/Exception.php @@ -0,0 +1,37 @@ +_filename; + } + + /** + * Sets the new filename where the content will be stored + * + * @param string $filename (Optional) New filename to set + * @return Zend_Filter_File_Encryt + */ + public function setFilename($filename = null) + { + $this->_filename = $filename; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Decrypts the file $value with the defined settings + * + * @param string $value Full path of file to change + * @return string The filename which has been set, or false when there were errors + */ + public function filter($value) + { + if (!file_exists($value)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("File '$value' not found"); + } + + if (!isset($this->_filename)) { + $this->_filename = $value; + } + + if (file_exists($this->_filename) and !is_writable($this->_filename)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("File '{$this->_filename}' is not writable"); + } + + $content = file_get_contents($value); + if (!$content) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Problem while reading file '$value'"); + } + + $decrypted = parent::filter($content); + $result = file_put_contents($this->_filename, $decrypted); + + if (!$result) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Problem while writing file '{$this->_filename}'"); + } + + return $this->_filename; + } +} diff --git a/lib/zend/Zend/Filter/File/Encrypt.php b/lib/zend/Zend/Filter/File/Encrypt.php new file mode 100644 index 0000000000..22834bcf93 --- /dev/null +++ b/lib/zend/Zend/Filter/File/Encrypt.php @@ -0,0 +1,106 @@ +_filename; + } + + /** + * Sets the new filename where the content will be stored + * + * @param string $filename (Optional) New filename to set + * @return Zend_Filter_File_Encryt + */ + public function setFilename($filename = null) + { + $this->_filename = $filename; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Encrypts the file $value with the defined settings + * + * @param string $value Full path of file to change + * @return string The filename which has been set, or false when there were errors + */ + public function filter($value) + { + if (!file_exists($value)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("File '$value' not found"); + } + + if (!isset($this->_filename)) { + $this->_filename = $value; + } + + if (file_exists($this->_filename) and !is_writable($this->_filename)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("File '{$this->_filename}' is not writable"); + } + + $content = file_get_contents($value); + if (!$content) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Problem while reading file '$value'"); + } + + $encrypted = parent::filter($content); + $result = file_put_contents($this->_filename, $encrypted); + + if (!$result) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Problem while writing file '{$this->_filename}'"); + } + + return $this->_filename; + } +} diff --git a/lib/zend/Zend/Filter/File/LowerCase.php b/lib/zend/Zend/Filter/File/LowerCase.php new file mode 100644 index 0000000000..6939e7cf68 --- /dev/null +++ b/lib/zend/Zend/Filter/File/LowerCase.php @@ -0,0 +1,84 @@ +setEncoding($options); + } + } + + /** + * Defined by Zend_Filter_Interface + * + * Does a lowercase on the content of the given file + * + * @param string $value Full path of file to change + * @return string The given $value + * @throws Zend_Filter_Exception + */ + public function filter($value) + { + if (!file_exists($value)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("File '$value' not found"); + } + + if (!is_writable($value)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("File '$value' is not writable"); + } + + $content = file_get_contents($value); + if (!$content) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Problem while reading file '$value'"); + } + + $content = parent::filter($content); + $result = file_put_contents($value, $content); + + if (!$result) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Problem while writing file '$value'"); + } + + return $value; + } +} diff --git a/lib/zend/Zend/Filter/File/Rename.php b/lib/zend/Zend/Filter/File/Rename.php new file mode 100644 index 0000000000..664410e2f5 --- /dev/null +++ b/lib/zend/Zend/Filter/File/Rename.php @@ -0,0 +1,305 @@ + Source filename or directory which will be renamed + * 'target' => Target filename or directory, the new name of the sourcefile + * 'overwrite' => Shall existing files be overwritten ? + * + * @param string|array $options Target file or directory to be renamed + * @param string $target Source filename or directory (deprecated) + * @param bool $overwrite Should existing files be overwritten (deprecated) + * @return void + */ + public function __construct($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_string($options)) { + $options = array('target' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Invalid options argument provided to filter'); + } + + if (1 < func_num_args()) { + trigger_error('Support for multiple arguments is deprecated in favor of a single options array', E_USER_NOTICE); + $argv = func_get_args(); + array_shift($argv); + $source = array_shift($argv); + $overwrite = false; + if (!empty($argv)) { + $overwrite = array_shift($argv); + } + $options['source'] = $source; + $options['overwrite'] = $overwrite; + } + + $this->setFile($options); + } + + /** + * Returns the files to rename and their new name and location + * + * @return array + */ + public function getFile() + { + return $this->_files; + } + + /** + * Sets a new file or directory as target, deleting existing ones + * + * Array accepts the following keys: + * 'source' => Source filename or directory which will be renamed + * 'target' => Target filename or directory, the new name of the sourcefile + * 'overwrite' => Shall existing files be overwritten ? + * + * @param string|array $options Old file or directory to be rewritten + * @return Zend_Filter_File_Rename + */ + public function setFile($options) + { + $this->_files = array(); + $this->addFile($options); + + return $this; + } + + /** + * Adds a new file or directory as target to the existing ones + * + * Array accepts the following keys: + * 'source' => Source filename or directory which will be renamed + * 'target' => Target filename or directory, the new name of the sourcefile + * 'overwrite' => Shall existing files be overwritten ? + * + * @param string|array $options Old file or directory to be rewritten + * @return Zend_Filter_File_Rename + */ + public function addFile($options) + { + if (is_string($options)) { + $options = array('target' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception ('Invalid options to rename filter provided'); + } + + $this->_convertOptions($options); + + return $this; + } + + /** + * Returns only the new filename without moving it + * But existing files will be erased when the overwrite option is true + * + * @param string $value Full path of file to change + * @param boolean $source Return internal informations + * @return string The new filename which has been set + */ + public function getNewName($value, $source = false) + { + $file = $this->_getFileName($value); + if ($file['source'] == $file['target']) { + return $value; + } + + if (!file_exists($file['source'])) { + return $value; + } + + if (($file['overwrite'] == true) && (file_exists($file['target']))) { + unlink($file['target']); + } + + if (file_exists($file['target'])) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception(sprintf("File '%s' could not be renamed. It already exists.", $value)); + } + + if ($source) { + return $file; + } + + return $file['target']; + } + + /** + * Defined by Zend_Filter_Interface + * + * Renames the file $value to the new name set before + * Returns the file $value, removing all but digit characters + * + * @param string $value Full path of file to change + * @throws Zend_Filter_Exception + * @return string The new filename which has been set, or false when there were errors + */ + public function filter($value) + { + $file = $this->getNewName($value, true); + if (is_string($file)) { + return $file; + } + + $result = rename($file['source'], $file['target']); + + if ($result === true) { + return $file['target']; + } + + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception(sprintf("File '%s' could not be renamed. An error occured while processing the file.", $value)); + } + + /** + * Internal method for creating the file array + * Supports single and nested arrays + * + * @param array $options + * @return array + */ + protected function _convertOptions($options) { + $files = array(); + foreach ($options as $key => $value) { + if (is_array($value)) { + $this->_convertOptions($value); + continue; + } + + switch ($key) { + case "source": + $files['source'] = (string) $value; + break; + + case 'target' : + $files['target'] = (string) $value; + break; + + case 'overwrite' : + $files['overwrite'] = (boolean) $value; + break; + + default: + break; + } + } + + if (empty($files)) { + return $this; + } + + if (empty($files['source'])) { + $files['source'] = '*'; + } + + if (empty($files['target'])) { + $files['target'] = '*'; + } + + if (empty($files['overwrite'])) { + $files['overwrite'] = false; + } + + $found = false; + foreach ($this->_files as $key => $value) { + if ($value['source'] == $files['source']) { + $this->_files[$key] = $files; + $found = true; + } + } + + if (!$found) { + $count = count($this->_files); + $this->_files[$count] = $files; + } + + return $this; + } + + /** + * Internal method to resolve the requested source + * and return all other related parameters + * + * @param string $file Filename to get the informations for + * @return array + */ + protected function _getFileName($file) + { + $rename = array(); + foreach ($this->_files as $value) { + if ($value['source'] == '*') { + if (!isset($rename['source'])) { + $rename = $value; + $rename['source'] = $file; + } + } + + if ($value['source'] == $file) { + $rename = $value; + } + } + + if (!isset($rename['source'])) { + return $file; + } + + if (!isset($rename['target']) or ($rename['target'] == '*')) { + $rename['target'] = $rename['source']; + } + + if (is_dir($rename['target'])) { + $name = basename($rename['source']); + $last = $rename['target'][strlen($rename['target']) - 1]; + if (($last != '/') and ($last != '\\')) { + $rename['target'] .= DIRECTORY_SEPARATOR; + } + + $rename['target'] .= $name; + } + + return $rename; + } +} diff --git a/lib/zend/Zend/Filter/File/UpperCase.php b/lib/zend/Zend/Filter/File/UpperCase.php new file mode 100644 index 0000000000..17b5a904c7 --- /dev/null +++ b/lib/zend/Zend/Filter/File/UpperCase.php @@ -0,0 +1,84 @@ +setEncoding($options); + } + } + + /** + * Defined by Zend_Filter_Interface + * + * Does a lowercase on the content of the given file + * + * @param string $value Full path of file to change + * @return string The given $value + * @throws Zend_Filter_Exception + */ + public function filter($value) + { + if (!file_exists($value)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("File '$value' not found"); + } + + if (!is_writable($value)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("File '$value' is not writable"); + } + + $content = file_get_contents($value); + if (!$content) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Problem while reading file '$value'"); + } + + $content = parent::filter($content); + $result = file_put_contents($value, $content); + + if (!$result) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Problem while writing file '$value'"); + } + + return $value; + } +} diff --git a/lib/zend/Zend/Filter/HtmlEntities.php b/lib/zend/Zend/Filter/HtmlEntities.php new file mode 100644 index 0000000000..60aeed5818 --- /dev/null +++ b/lib/zend/Zend/Filter/HtmlEntities.php @@ -0,0 +1,172 @@ +setQuoteStyle($options['quotestyle']); + $this->setCharSet($options['charset']); + $this->setDoubleQuote($options['doublequote']); + } + + /** + * Returns the quoteStyle option + * + * @return integer + */ + public function getQuoteStyle() + { + return $this->_quoteStyle; + } + + /** + * Sets the quoteStyle option + * + * @param integer $quoteStyle + * @return Zend_Filter_HtmlEntities Provides a fluent interface + */ + public function setQuoteStyle($quoteStyle) + { + $this->_quoteStyle = $quoteStyle; + return $this; + } + + /** + * Returns the charSet option + * + * @return string + */ + public function getCharSet() + { + return $this->_charSet; + } + + /** + * Sets the charSet option + * + * @param string $charSet + * @return Zend_Filter_HtmlEntities Provides a fluent interface + */ + public function setCharSet($charSet) + { + $this->_charSet = $charSet; + return $this; + } + + /** + * Returns the doubleQuote option + * + * @return boolean + */ + public function getDoubleQuote() + { + return $this->_doubleQuote; + } + + /** + * Sets the doubleQuote option + * + * @param boolean $doubleQuote + * @return Zend_Filter_HtmlEntities Provides a fluent interface + */ + public function setDoubleQuote($doubleQuote) + { + $this->_doubleQuote = (boolean) $doubleQuote; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, converting characters to their corresponding HTML entity + * equivalents where they exist + * + * @param string $value + * @return string + */ + public function filter($value) + { + return htmlentities((string) $value, $this->_quoteStyle, $this->_charSet, $this->_doubleQuote); + } +} diff --git a/lib/zend/Zend/Filter/Inflector.php b/lib/zend/Zend/Filter/Inflector.php new file mode 100644 index 0000000000..a776f080fe --- /dev/null +++ b/lib/zend/Zend/Filter/Inflector.php @@ -0,0 +1,506 @@ +setConfig($target); + } else { + if ((null !== $target) && is_string($target)) { + $this->setTarget($target); + } + + if (null !== $rules) { + $this->addRules($rules); + } + + if ($throwTargetExceptionsOn !== null) { + $this->setThrowTargetExceptionsOn($throwTargetExceptionsOn); + } + + if ($targetReplacementIdentifer != '') { + $this->setTargetReplacementIdentifier($targetReplacementIdentifer); + } + } + } + + /** + * Retreive PluginLoader + * + * @return Zend_Loader_PluginLoader_Interface + */ + public function getPluginLoader() + { + if (!$this->_pluginLoader instanceof Zend_Loader_PluginLoader_Interface) { + $this->_pluginLoader = new Zend_Loader_PluginLoader(array('Zend_Filter_' => 'Zend/Filter/'), __CLASS__); + } + + return $this->_pluginLoader; + } + + /** + * Set PluginLoader + * + * @param Zend_Loader_PluginLoader_Interface $pluginLoader + * @return Zend_Filter_Inflector + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $pluginLoader) + { + $this->_pluginLoader = $pluginLoader; + return $this; + } + + /** + * Use Zend_Config object to set object state + * + * @param Zend_Config $config + * @return Zend_Filter_Inflector + */ + public function setConfig(Zend_Config $config) + { + foreach ($config as $key => $value) { + switch ($key) { + case 'target': + $this->setTarget($value); + break; + case 'filterPrefixPath': + if (is_scalar($value)) { + break; + } + $paths = $value->toArray(); + foreach ($paths as $prefix => $path) { + $this->addFilterPrefixPath($prefix, $path); + } + break; + case 'throwTargetExceptionsOn': + $this->setThrowTargetExceptionsOn($value); + break; + case 'targetReplacementIdentifier': + $this->setTargetReplacementIdentifier($value); + break; + case 'rules': + $this->addRules($value->toArray()); + break; + default: + break; + } + } + return $this; + } + + /** + * Convienence method to add prefix and path to PluginLoader + * + * @param string $prefix + * @param string $path + * @return Zend_Filter_Inflector + */ + public function addFilterPrefixPath($prefix, $path) + { + $this->getPluginLoader()->addPrefixPath($prefix, $path); + return $this; + } + + /** + * Set Whether or not the inflector should throw an exception when a replacement + * identifier is still found within an inflected target. + * + * @param bool $throwTargetExceptions + * @return Zend_Filter_Inflector + */ + public function setThrowTargetExceptionsOn($throwTargetExceptionsOn) + { + $this->_throwTargetExceptionsOn = ($throwTargetExceptionsOn == true) ? true : false; + return $this; + } + + /** + * Will exceptions be thrown? + * + * @return bool + */ + public function isThrowTargetExceptionsOn() + { + return $this->_throwTargetExceptionsOn; + } + + /** + * Set the Target Replacement Identifier, by default ':' + * + * @param string $targetReplacementIdentifier + * @return Zend_Filter_Inflector + */ + public function setTargetReplacementIdentifier($targetReplacementIdentifier) + { + $this->_targetReplacementIdentifier = (string) $targetReplacementIdentifier; + return $this; + } + + /** + * Get Target Replacement Identifier + * + * @return string + */ + public function getTargetReplacementIdentifier() + { + return $this->_targetReplacementIdentifier; + } + + /** + * Set a Target + * ex: 'scripts/:controller/:action.:suffix' + * + * @param string + * @return Zend_Filter_Inflector + */ + public function setTarget($target) + { + $this->_target = (string) $target; + return $this; + } + + /** + * Retrieve target + * + * @return string + */ + public function getTarget() + { + return $this->_target; + } + + /** + * Set Target Reference + * + * @param reference $target + * @return Zend_Filter_Inflector + */ + public function setTargetReference(&$target) + { + $this->_target =& $target; + return $this; + } + + /** + * SetRules() is the same as calling addRules() with the exception that it + * clears the rules before adding them. + * + * @param array $rules + * @return Zend_Filter_Inflector + */ + public function setRules(Array $rules) + { + $this->clearRules(); + $this->addRules($rules); + return $this; + } + + /** + * AddRules(): multi-call to setting filter rules. + * + * If prefixed with a ":" (colon), a filter rule will be added. If not + * prefixed, a static replacement will be added. + * + * ex: + * array( + * ':controller' => array('CamelCaseToUnderscore','StringToLower'), + * ':action' => array('CamelCaseToUnderscore','StringToLower'), + * 'suffix' => 'phtml' + * ); + * + * @param array + * @return Zend_Filter_Inflector + */ + public function addRules(Array $rules) + { + $keys = array_keys($rules); + foreach ($keys as $spec) { + if ($spec[0] == ':') { + $this->addFilterRule($spec, $rules[$spec]); + } else { + $this->setStaticRule($spec, $rules[$spec]); + } + } + + return $this; + } + + /** + * Get rules + * + * By default, returns all rules. If a $spec is provided, will return those + * rules if found, false otherwise. + * + * @param string $spec + * @return array|false + */ + public function getRules($spec = null) + { + if (null !== $spec) { + $spec = $this->_normalizeSpec($spec); + if (isset($this->_rules[$spec])) { + return $this->_rules[$spec]; + } + return false; + } + + return $this->_rules; + } + + /** + * getRule() returns a rule set by setFilterRule(), a numeric index must be provided + * + * @param string $spec + * @param int $index + * @return Zend_Filter_Interface|false + */ + public function getRule($spec, $index) + { + $spec = $this->_normalizeSpec($spec); + if (isset($this->_rules[$spec]) && is_array($this->_rules[$spec])) { + if (isset($this->_rules[$spec][$index])) { + return $this->_rules[$spec][$index]; + } + } + return false; + } + + /** + * ClearRules() clears the rules currently in the inflector + * + * @return Zend_Filter_Inflector + */ + public function clearRules() + { + $this->_rules = array(); + return $this; + } + + /** + * Set a filtering rule for a spec. $ruleSet can be a string, Filter object + * or an array of strings or filter objects. + * + * @param string $spec + * @param array|string|Zend_Filter_Interface $ruleSet + * @return Zend_Filter_Inflector + */ + public function setFilterRule($spec, $ruleSet) + { + $spec = $this->_normalizeSpec($spec); + $this->_rules[$spec] = array(); + return $this->addFilterRule($spec, $ruleSet); + } + + /** + * Add a filter rule for a spec + * + * @param mixed $spec + * @param mixed $ruleSet + * @return void + */ + public function addFilterRule($spec, $ruleSet) + { + $spec = $this->_normalizeSpec($spec); + if (!isset($this->_rules[$spec])) { + $this->_rules[$spec] = array(); + } + + if (!is_array($ruleSet)) { + $ruleSet = array($ruleSet); + } + + if (is_string($this->_rules[$spec])) { + $temp = $this->_rules[$spec]; + $this->_rules[$spec] = array(); + $this->_rules[$spec][] = $temp; + } + + foreach ($ruleSet as $rule) { + $this->_rules[$spec][] = $this->_getRule($rule); + } + + return $this; + } + + /** + * Set a static rule for a spec. This is a single string value + * + * @param string $name + * @param string $value + * @return Zend_Filter_Inflector + */ + public function setStaticRule($name, $value) + { + $name = $this->_normalizeSpec($name); + $this->_rules[$name] = (string) $value; + return $this; + } + + /** + * Set Static Rule Reference. + * + * This allows a consuming class to pass a property or variable + * in to be referenced when its time to build the output string from the + * target. + * + * @param string $name + * @param mixed $reference + * @return Zend_Filter_Inflector + */ + public function setStaticRuleReference($name, &$reference) + { + $name = $this->_normalizeSpec($name); + $this->_rules[$name] =& $reference; + return $this; + } + + /** + * Inflect + * + * @param string|array $source + * @return string + */ + public function filter($source) + { + // clean source + foreach ( (array) $source as $sourceName => $sourceValue) { + $source[ltrim($sourceName, ':')] = $sourceValue; + } + + $pregQuotedTargetReplacementIdentifier = preg_quote($this->_targetReplacementIdentifier, '#'); + $processedParts = array(); + + foreach ($this->_rules as $ruleName => $ruleValue) { + if (isset($source[$ruleName])) { + if (is_string($ruleValue)) { + // overriding the set rule + $processedParts['#'.$pregQuotedTargetReplacementIdentifier.$ruleName.'#'] = str_replace('\\', '\\\\', $source[$ruleName]); + } elseif (is_array($ruleValue)) { + $processedPart = $source[$ruleName]; + foreach ($ruleValue as $ruleFilter) { + $processedPart = $ruleFilter->filter($processedPart); + } + $processedParts['#'.$pregQuotedTargetReplacementIdentifier.$ruleName.'#'] = str_replace('\\', '\\\\', $processedPart); + } + } elseif (is_string($ruleValue)) { + $processedParts['#'.$pregQuotedTargetReplacementIdentifier.$ruleName.'#'] = str_replace('\\', '\\\\', $ruleValue); + } + } + + // all of the values of processedParts would have been str_replace('\\', '\\\\', ..)'d to disable preg_replace backreferences + $inflectedTarget = preg_replace(array_keys($processedParts), array_values($processedParts), $this->_target); + + if ($this->_throwTargetExceptionsOn && (preg_match('#(?='.$pregQuotedTargetReplacementIdentifier.'[A-Za-z]{1})#', $inflectedTarget) == true)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('A replacement identifier ' . $this->_targetReplacementIdentifier . ' was found inside the inflected target, perhaps a rule was not satisfied with a target source? Unsatisfied inflected target: ' . $inflectedTarget); + } + + return $inflectedTarget; + } + + /** + * Normalize spec string + * + * @param string $spec + * @return string + */ + protected function _normalizeSpec($spec) + { + return ltrim((string) $spec, ':&'); + } + + /** + * Resolve named filters and convert them to filter objects. + * + * @param string $rule + * @return Zend_Filter_Interface + */ + protected function _getRule($rule) + { + if ($rule instanceof Zend_Filter_Interface) { + return $rule; + } + + $rule = (string) $rule; + + $className = $this->getPluginLoader()->load($rule); + $ruleObject = new $className(); + if (!$ruleObject instanceof Zend_Filter_Interface) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('No class named ' . $rule . ' implementing Zend_Filter_Interface could be found'); + } + + return $ruleObject; + } + +} diff --git a/lib/zend/Zend/Filter/Input.php b/lib/zend/Zend/Filter/Input.php new file mode 100644 index 0000000000..4eb442a80c --- /dev/null +++ b/lib/zend/Zend/Filter/Input.php @@ -0,0 +1,1028 @@ + false, + self::BREAK_CHAIN => false, + self::ESCAPE_FILTER => 'HtmlEntities', + self::MISSING_MESSAGE => "Field '%field%' is required by rule '%rule%', but the field is missing", + self::NOT_EMPTY_MESSAGE => "You must give a non-empty value for field '%field%'", + self::PRESENCE => self::PRESENCE_OPTIONAL + ); + + /** + * @var boolean Set to False initially, this is set to True after the + * input data have been processed. Reset to False in setData() method. + */ + protected $_processed = false; + + /** + * @param array $filterRules + * @param array $validatorRules + * @param array $data OPTIONAL + * @param array $options OPTIONAL + */ + public function __construct($filterRules, $validatorRules, array $data = null, array $options = null) + { + if ($options) { + $this->setOptions($options); + } + + $this->_filterRules = (array) $filterRules; + $this->_validatorRules = (array) $validatorRules; + + if ($data) { + $this->setData($data); + } + } + + /** + * @param mixed $namespaces + * @return Zend_Filter_Input + * @deprecated since 1.5.0RC1 - use addFilterPrefixPath() or addValidatorPrefixPath instead. + */ + public function addNamespace($namespaces) + { + if (!is_array($namespaces)) { + $namespaces = array($namespaces); + } + + foreach ($namespaces as $namespace) { + $prefix = $namespace; + $path = str_replace('_', DIRECTORY_SEPARATOR, $prefix); + $this->addFilterPrefixPath($prefix, $path); + $this->addValidatorPrefixPath($prefix, $path); + } + + return $this; + } + + /** + * Add prefix path for all elements + * + * @param string $prefix + * @param string $path + * @return Zend_Filter_Input + */ + public function addFilterPrefixPath($prefix, $path) + { + $this->getPluginLoader(self::FILTER)->addPrefixPath($prefix, $path); + + return $this; + } + + /** + * Add prefix path for all elements + * + * @param string $prefix + * @param string $path + * @return Zend_Filter_Input + */ + public function addValidatorPrefixPath($prefix, $path) + { + $this->getPluginLoader(self::VALIDATE)->addPrefixPath($prefix, $path); + + return $this; + } + + /** + * Set plugin loaders for use with decorators and elements + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @param string $type 'filter' or 'validate' + * @return Zend_Filter_Input + * @throws Zend_Filter_Exception on invalid type + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type) + { + $type = strtolower($type); + switch ($type) { + case self::FILTER: + case self::VALIDATE: + $this->_loaders[$type] = $loader; + return $this; + default: + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception(sprintf('Invalid type "%s" provided to setPluginLoader()', $type)); + } + + return $this; + } + + /** + * Retrieve plugin loader for given type + * + * $type may be one of: + * - filter + * - validator + * + * If a plugin loader does not exist for the given type, defaults are + * created. + * + * @param string $type 'filter' or 'validate' + * @return Zend_Loader_PluginLoader_Interface + * @throws Zend_Filter_Exception on invalid type + */ + public function getPluginLoader($type) + { + $type = strtolower($type); + if (!isset($this->_loaders[$type])) { + switch ($type) { + case self::FILTER: + $prefixSegment = 'Zend_Filter_'; + $pathSegment = 'Zend/Filter/'; + break; + case self::VALIDATE: + $prefixSegment = 'Zend_Validate_'; + $pathSegment = 'Zend/Validate/'; + break; + default: + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loaders[$type] = new Zend_Loader_PluginLoader( + array($prefixSegment => $pathSegment) + ); + } + + return $this->_loaders[$type]; + } + + /** + * @return array + */ + public function getMessages() + { + $this->_process(); + return array_merge($this->_invalidMessages, $this->_missingFields); + } + + /** + * @return array + */ + public function getErrors() + { + $this->_process(); + return $this->_invalidErrors; + } + + /** + * @return array + */ + public function getInvalid() + { + $this->_process(); + return $this->_invalidMessages; + } + + /** + * @return array + */ + public function getMissing() + { + $this->_process(); + return $this->_missingFields; + } + + /** + * @return array + */ + public function getUnknown() + { + $this->_process(); + return $this->_unknownFields; + } + + /** + * @param string $fieldName OPTIONAL + * @return mixed + */ + public function getEscaped($fieldName = null) + { + $this->_process(); + $this->_getDefaultEscapeFilter(); + + if ($fieldName === null) { + return $this->_escapeRecursive($this->_validFields); + } + if (array_key_exists($fieldName, $this->_validFields)) { + return $this->_escapeRecursive($this->_validFields[$fieldName]); + } + return null; + } + + /** + * @param mixed $value + * @return mixed + */ + protected function _escapeRecursive($data) + { + if($data === null) { + return $data; + } + + if (!is_array($data)) { + return $this->_getDefaultEscapeFilter()->filter($data); + } + foreach ($data as &$element) { + $element = $this->_escapeRecursive($element); + } + return $data; + } + + /** + * @param string $fieldName OPTIONAL + * @return mixed + */ + public function getUnescaped($fieldName = null) + { + $this->_process(); + if ($fieldName === null) { + return $this->_validFields; + } + if (array_key_exists($fieldName, $this->_validFields)) { + return $this->_validFields[$fieldName]; + } + return null; + } + + /** + * @param string $fieldName + * @return mixed + */ + public function __get($fieldName) + { + return $this->getEscaped($fieldName); + } + + /** + * @return boolean + */ + public function hasInvalid() + { + $this->_process(); + return !(empty($this->_invalidMessages)); + } + + /** + * @return boolean + */ + public function hasMissing() + { + $this->_process(); + return !(empty($this->_missingFields)); + } + + /** + * @return boolean + */ + public function hasUnknown() + { + $this->_process(); + return !(empty($this->_unknownFields)); + } + + /** + * @return boolean + */ + public function hasValid() + { + $this->_process(); + return !(empty($this->_validFields)); + } + + /** + * @param string $fieldName + * @return boolean + */ + public function isValid($fieldName = null) + { + $this->_process(); + if ($fieldName === null) { + return !($this->hasMissing() || $this->hasInvalid()); + } + return array_key_exists($fieldName, $this->_validFields); + } + + /** + * @param string $fieldName + * @return boolean + */ + public function __isset($fieldName) + { + $this->_process(); + return isset($this->_validFields[$fieldName]); + } + + /** + * @return Zend_Filter_Input + * @throws Zend_Filter_Exception + */ + public function process() + { + $this->_process(); + if ($this->hasInvalid()) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Input has invalid fields"); + } + if ($this->hasMissing()) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Input has missing fields"); + } + + return $this; + } + + /** + * @param array $data + * @return Zend_Filter_Input + */ + public function setData(array $data) + { + $this->_data = $data; + + /** + * Reset to initial state + */ + $this->_validFields = array(); + $this->_invalidMessages = array(); + $this->_invalidErrors = array(); + $this->_missingFields = array(); + $this->_unknownFields = array(); + + $this->_processed = false; + + return $this; + } + + /** + * @param mixed $escapeFilter + * @return Zend_Filter_Interface + */ + public function setDefaultEscapeFilter($escapeFilter) + { + if (is_string($escapeFilter) || is_array($escapeFilter)) { + $escapeFilter = $this->_getFilter($escapeFilter); + } + if (!$escapeFilter instanceof Zend_Filter_Interface) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('Escape filter specified does not implement Zend_Filter_Interface'); + } + $this->_defaultEscapeFilter = $escapeFilter; + return $escapeFilter; + } + + /** + * @param array $options + * @return Zend_Filter_Input + * @throws Zend_Filter_Exception if an unknown option is given + */ + public function setOptions(array $options) + { + foreach ($options as $option => $value) { + switch ($option) { + case self::ESCAPE_FILTER: + $this->setDefaultEscapeFilter($value); + break; + case self::INPUT_NAMESPACE: + $this->addNamespace($value); + break; + case self::VALIDATOR_NAMESPACE: + if(is_string($value)) { + $value = array($value); + } + + foreach($value AS $prefix) { + $this->addValidatorPrefixPath( + $prefix, + str_replace('_', DIRECTORY_SEPARATOR, $prefix) + ); + } + break; + case self::FILTER_NAMESPACE: + if(is_string($value)) { + $value = array($value); + } + + foreach($value AS $prefix) { + $this->addFilterPrefixPath( + $prefix, + str_replace('_', DIRECTORY_SEPARATOR, $prefix) + ); + } + break; + case self::ALLOW_EMPTY: + case self::BREAK_CHAIN: + case self::MISSING_MESSAGE: + case self::NOT_EMPTY_MESSAGE: + case self::PRESENCE: + $this->_defaults[$option] = $value; + break; + default: + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Unknown option '$option'"); + break; + } + } + + return $this; + } + + /* + * Protected methods + */ + + /** + * @return void + */ + protected function _filter() + { + foreach ($this->_filterRules as $ruleName => &$filterRule) { + /** + * Make sure we have an array representing this filter chain. + * Don't typecast to (array) because it might be a Zend_Filter object + */ + if (!is_array($filterRule)) { + $filterRule = array($filterRule); + } + + /** + * Filters are indexed by integer, metacommands are indexed by string. + * Pick out the filters. + */ + $filterList = array(); + foreach ($filterRule as $key => $value) { + if (is_int($key)) { + $filterList[] = $value; + } + } + + /** + * Use defaults for filter metacommands. + */ + $filterRule[self::RULE] = $ruleName; + if (!isset($filterRule[self::FIELDS])) { + $filterRule[self::FIELDS] = $ruleName; + } + + /** + * Load all the filter classes and add them to the chain. + */ + if (!isset($filterRule[self::FILTER_CHAIN])) { + $filterRule[self::FILTER_CHAIN] = new Zend_Filter(); + foreach ($filterList as $filter) { + if (is_string($filter) || is_array($filter)) { + $filter = $this->_getFilter($filter); + } + $filterRule[self::FILTER_CHAIN]->addFilter($filter); + } + } + + /** + * If the ruleName is the special wildcard rule, + * then apply the filter chain to all input data. + * Else just process the field named by the rule. + */ + if ($ruleName == self::RULE_WILDCARD) { + foreach (array_keys($this->_data) as $field) { + $this->_filterRule(array_merge($filterRule, array(self::FIELDS => $field))); + } + } else { + $this->_filterRule($filterRule); + } + } + } + + /** + * @param array $filterRule + * @return void + */ + protected function _filterRule(array $filterRule) + { + $field = $filterRule[self::FIELDS]; + if (!array_key_exists($field, $this->_data)) { + return; + } + if (is_array($this->_data[$field])) { + foreach ($this->_data[$field] as $key => $value) { + $this->_data[$field][$key] = $filterRule[self::FILTER_CHAIN]->filter($value); + } + } else { + $this->_data[$field] = + $filterRule[self::FILTER_CHAIN]->filter($this->_data[$field]); + } + } + + /** + * @return Zend_Filter_Interface + */ + protected function _getDefaultEscapeFilter() + { + if ($this->_defaultEscapeFilter !== null) { + return $this->_defaultEscapeFilter; + } + return $this->setDefaultEscapeFilter($this->_defaults[self::ESCAPE_FILTER]); + } + + /** + * @param string $rule + * @param string $field + * @return string + */ + protected function _getMissingMessage($rule, $field) + { + $message = $this->_defaults[self::MISSING_MESSAGE]; + $message = str_replace('%rule%', $rule, $message); + $message = str_replace('%field%', $field, $message); + return $message; + } + + /** + * @return string + */ + protected function _getNotEmptyMessage($rule, $field) + { + $message = $this->_defaults[self::NOT_EMPTY_MESSAGE]; + $message = str_replace('%rule%', $rule, $message); + $message = str_replace('%field%', $field, $message); + return $message; + } + + /** + * @return void + */ + protected function _process() + { + if ($this->_processed === false) { + $this->_filter(); + $this->_validate(); + $this->_processed = true; + } + } + + /** + * @return void + */ + protected function _validate() + { + /** + * Special case: if there are no validators, treat all fields as valid. + */ + if (!$this->_validatorRules) { + $this->_validFields = $this->_data; + $this->_data = array(); + return; + } + + foreach ($this->_validatorRules as $ruleName => &$validatorRule) { + /** + * Make sure we have an array representing this validator chain. + * Don't typecast to (array) because it might be a Zend_Validate object + */ + if (!is_array($validatorRule)) { + $validatorRule = array($validatorRule); + } + + /** + * Validators are indexed by integer, metacommands are indexed by string. + * Pick out the validators. + */ + $validatorList = array(); + foreach ($validatorRule as $key => $value) { + if (is_int($key)) { + $validatorList[$key] = $value; + } + } + + /** + * Use defaults for validation metacommands. + */ + $validatorRule[self::RULE] = $ruleName; + if (!isset($validatorRule[self::FIELDS])) { + $validatorRule[self::FIELDS] = $ruleName; + } + if (!isset($validatorRule[self::BREAK_CHAIN])) { + $validatorRule[self::BREAK_CHAIN] = $this->_defaults[self::BREAK_CHAIN]; + } + if (!isset($validatorRule[self::PRESENCE])) { + $validatorRule[self::PRESENCE] = $this->_defaults[self::PRESENCE]; + } + if (!isset($validatorRule[self::ALLOW_EMPTY])) { + $validatorRule[self::ALLOW_EMPTY] = $this->_defaults[self::ALLOW_EMPTY]; + } + + if (!isset($validatorRule[self::MESSAGES])) { + $validatorRule[self::MESSAGES] = array(); + } else if (!is_array($validatorRule[self::MESSAGES])) { + $validatorRule[self::MESSAGES] = array($validatorRule[self::MESSAGES]); + } else if (array_intersect_key($validatorList, $validatorRule[self::MESSAGES])) { + // There are now corresponding numeric keys in the validation rule messages array + // Treat it as a named messages list for all rule validators + $unifiedMessages = $validatorRule[self::MESSAGES]; + $validatorRule[self::MESSAGES] = array(); + + foreach ($validatorList as $key => $validator) { + if (array_key_exists($key, $unifiedMessages)) { + $validatorRule[self::MESSAGES][$key] = $unifiedMessages[$key]; + } + } + } + + /** + * Load all the validator classes and add them to the chain. + */ + if (!isset($validatorRule[self::VALIDATOR_CHAIN])) { + $validatorRule[self::VALIDATOR_CHAIN] = new Zend_Validate(); + + foreach ($validatorList as $key => $validator) { + if (is_string($validator) || is_array($validator)) { + $validator = $this->_getValidator($validator); + } + + if (isset($validatorRule[self::MESSAGES][$key])) { + $value = $validatorRule[self::MESSAGES][$key]; + if (is_array($value)) { + $validator->setMessages($value); + } else { + $validator->setMessage($value); + } + + if ($validator instanceof Zend_Validate_NotEmpty) { + $this->_defaults[self::NOT_EMPTY_MESSAGE] = $value; + } + } + + $validatorRule[self::VALIDATOR_CHAIN]->addValidator($validator, $validatorRule[self::BREAK_CHAIN]); + } + $validatorRule[self::VALIDATOR_CHAIN_COUNT] = count($validatorList); + } + + /** + * If the ruleName is the special wildcard rule, + * then apply the validator chain to all input data. + * Else just process the field named by the rule. + */ + if ($ruleName == self::RULE_WILDCARD) { + foreach (array_keys($this->_data) as $field) { + $this->_validateRule(array_merge($validatorRule, array(self::FIELDS => $field))); + } + } else { + $this->_validateRule($validatorRule); + } + } + + /** + * Unset fields in $_data that have been added to other arrays. + * We have to wait until all rules have been processed because + * a given field may be referenced by multiple rules. + */ + foreach (array_merge(array_keys($this->_missingFields), array_keys($this->_invalidMessages)) as $rule) { + foreach ((array) $this->_validatorRules[$rule][self::FIELDS] as $field) { + unset($this->_data[$field]); + } + } + foreach ($this->_validFields as $field => $value) { + unset($this->_data[$field]); + } + + /** + * Anything left over in $_data is an unknown field. + */ + $this->_unknownFields = $this->_data; + } + + /** + * @param array $validatorRule + * @return void + */ + protected function _validateRule(array $validatorRule) + { + /** + * Get one or more data values from input, and check for missing fields. + * Apply defaults if fields are missing. + */ + $data = array(); + foreach ((array) $validatorRule[self::FIELDS] as $key => $field) { + if (array_key_exists($field, $this->_data)) { + $data[$field] = $this->_data[$field]; + } else if (isset($validatorRule[self::DEFAULT_VALUE])) { + /** @todo according to this code default value can't be an array. It has to be reviewed */ + if (!is_array($validatorRule[self::DEFAULT_VALUE])) { + // Default value is a scalar + $data[$field] = $validatorRule[self::DEFAULT_VALUE]; + } else { + // Default value is an array. Search for corresponding key + if (isset($validatorRule[self::DEFAULT_VALUE][$key])) { + $data[$field] = $validatorRule[self::DEFAULT_VALUE][$key]; + } else if ($validatorRule[self::PRESENCE] == self::PRESENCE_REQUIRED) { + // Default value array is provided, but it doesn't have an entry for current field + // and presence is required + $this->_missingFields[$validatorRule[self::RULE]][] = + $this->_getMissingMessage($validatorRule[self::RULE], $field); + } + } + } else if ($validatorRule[self::PRESENCE] == self::PRESENCE_REQUIRED) { + $this->_missingFields[$validatorRule[self::RULE]][] = + $this->_getMissingMessage($validatorRule[self::RULE], $field); + } + } + + /** + * If any required fields are missing, break the loop. + */ + if (isset($this->_missingFields[$validatorRule[self::RULE]]) && count($this->_missingFields[$validatorRule[self::RULE]]) > 0) { + return; + } + + /** + * Evaluate the inputs against the validator chain. + */ + if (count((array) $validatorRule[self::FIELDS]) > 1) { + if (!$validatorRule[self::ALLOW_EMPTY]) { + $emptyFieldsFound = false; + $errorsList = array(); + $messages = array(); + + foreach ($data as $fieldKey => $field) { + $notEmptyValidator = $this->_getValidator('NotEmpty'); + $notEmptyValidator->setMessage($this->_getNotEmptyMessage($validatorRule[self::RULE], $fieldKey)); + + if (!$notEmptyValidator->isValid($field)) { + foreach ($notEmptyValidator->getMessages() as $messageKey => $message) { + if (!isset($messages[$messageKey])) { + $messages[$messageKey] = $message; + } else { + $messages[] = $message; + } + } + $errorsList[] = $notEmptyValidator->getErrors(); + $emptyFieldsFound = true; + } + } + + if ($emptyFieldsFound) { + $this->_invalidMessages[$validatorRule[self::RULE]] = $messages; + $this->_invalidErrors[$validatorRule[self::RULE]] = array_unique(call_user_func_array('array_merge', $errorsList)); + return; + } + } + + if (!$validatorRule[self::VALIDATOR_CHAIN]->isValid($data)) { + $this->_invalidMessages[$validatorRule[self::RULE]] = $validatorRule[self::VALIDATOR_CHAIN]->getMessages(); + $this->_invalidErrors[$validatorRule[self::RULE]] = $validatorRule[self::VALIDATOR_CHAIN]->getErrors(); + return; + } + } else if (count($data) > 0) { + // $data is actually a one element array + $fieldNames = array_keys($data); + $fieldName = reset($fieldNames); + $field = reset($data); + + $failed = false; + if (!is_array($field)) { + $field = array($field); + } + + $notEmptyValidator = $this->_getValidator('NotEmpty'); + $notEmptyValidator->setMessage($this->_getNotEmptyMessage($validatorRule[self::RULE], $fieldName)); + if ($validatorRule[self::ALLOW_EMPTY]) { + $validatorChain = $validatorRule[self::VALIDATOR_CHAIN]; + } else { + $validatorChain = new Zend_Validate(); + $validatorChain->addValidator($notEmptyValidator, true /* Always break on failure */); + $validatorChain->addValidator($validatorRule[self::VALIDATOR_CHAIN]); + } + + foreach ($field as $value) { + if ($validatorRule[self::ALLOW_EMPTY] && !$notEmptyValidator->isValid($value)) { + // Field is empty AND it's allowed. Do nothing. + continue; + } + + if (!$validatorChain->isValid($value)) { + if (isset($this->_invalidMessages[$validatorRule[self::RULE]])) { + $collectedMessages = $this->_invalidMessages[$validatorRule[self::RULE]]; + } else { + $collectedMessages = array(); + } + + foreach ($validatorChain->getMessages() as $messageKey => $message) { + if (!isset($collectedMessages[$messageKey])) { + $collectedMessages[$messageKey] = $message; + } else { + $collectedMessages[] = $message; + } + } + + $this->_invalidMessages[$validatorRule[self::RULE]] = $collectedMessages; + if (isset($this->_invalidErrors[$validatorRule[self::RULE]])) { + $this->_invalidErrors[$validatorRule[self::RULE]] = array_merge($this->_invalidErrors[$validatorRule[self::RULE]], + $validatorChain->getErrors()); + } else { + $this->_invalidErrors[$validatorRule[self::RULE]] = $validatorChain->getErrors(); + } + unset($this->_validFields[$fieldName]); + $failed = true; + if ($validatorRule[self::BREAK_CHAIN]) { + return; + } + } + } + if ($failed) { + return; + } + } + + /** + * If we got this far, the inputs for this rule pass validation. + */ + foreach ((array) $validatorRule[self::FIELDS] as $field) { + if (array_key_exists($field, $data)) { + $this->_validFields[$field] = $data[$field]; + } + } + } + + /** + * @param mixed $classBaseName + * @return Zend_Filter_Interface + */ + protected function _getFilter($classBaseName) + { + return $this->_getFilterOrValidator(self::FILTER, $classBaseName); + } + + /** + * @param mixed $classBaseName + * @return Zend_Validate_Interface + */ + protected function _getValidator($classBaseName) + { + return $this->_getFilterOrValidator(self::VALIDATE, $classBaseName); + } + + /** + * @param string $type + * @param mixed $classBaseName + * @return Zend_Filter_Interface|Zend_Validate_Interface + * @throws Zend_Filter_Exception + */ + protected function _getFilterOrValidator($type, $classBaseName) + { + $args = array(); + + if (is_array($classBaseName)) { + $args = $classBaseName; + $classBaseName = array_shift($args); + } + + $interfaceName = 'Zend_' . ucfirst($type) . '_Interface'; + $className = $this->getPluginLoader($type)->load(ucfirst($classBaseName)); + + $class = new ReflectionClass($className); + + if (!$class->implementsInterface($interfaceName)) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception("Class '$className' based on basename '$classBaseName' must implement the '$interfaceName' interface"); + } + + if ($class->hasMethod('__construct')) { + $object = $class->newInstanceArgs($args); + } else { + $object = $class->newInstance(); + } + + return $object; + } + +} diff --git a/lib/zend/Zend/Filter/Int.php b/lib/zend/Zend/Filter/Int.php new file mode 100644 index 0000000000..e9f7c98900 --- /dev/null +++ b/lib/zend/Zend/Filter/Int.php @@ -0,0 +1,50 @@ + null, + 'date_format' => null, + 'precision' => null + ); + + /** + * Class constructor + * + * @param string|Zend_Locale $locale (Optional) Locale to set + */ + public function __construct($options = null) + { + if (null !== $options) { + $this->setOptions($options); + } + } + + /** + * Returns the set options + * + * @return array + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Sets options to use + * + * @param array $options (Optional) Options to use + * @return Zend_Filter_LocalizedToNormalized + */ + public function setOptions(array $options = null) + { + $this->_options = $options + $this->_options; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Normalizes the given input + * + * @param string $value Value to normalized + * @return string|array The normalized value + */ + public function filter($value) + { + if (Zend_Locale_Format::isNumber($value, $this->_options)) { + return Zend_Locale_Format::getNumber($value, $this->_options); + } else if (($this->_options['date_format'] === null) && (strpos($value, ':') !== false)) { + // Special case, no date format specified, detect time input + return Zend_Locale_Format::getTime($value, $this->_options); + } else if (Zend_Locale_Format::checkDateFormat($value, $this->_options)) { + // Detect date or time input + return Zend_Locale_Format::getDate($value, $this->_options); + } + + return $value; + } +} diff --git a/lib/zend/Zend/Filter/NormalizedToLocalized.php b/lib/zend/Zend/Filter/NormalizedToLocalized.php new file mode 100644 index 0000000000..7672d1fa9a --- /dev/null +++ b/lib/zend/Zend/Filter/NormalizedToLocalized.php @@ -0,0 +1,107 @@ + null, + 'date_format' => null, + 'precision' => null + ); + + /** + * Class constructor + * + * @param string|Zend_Locale $locale (Optional) Locale to set + */ + public function __construct($options = null) + { + if (null !== $options) { + $this->setOptions($options); + } + } + + /** + * Returns the set options + * + * @return array + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Sets options to use + * + * @param array $options (Optional) Options to use + * @return Zend_Filter_LocalizedToNormalized + */ + public function setOptions(array $options = null) + { + $this->_options = $options + $this->_options; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Normalizes the given input + * + * @param string $value Value to normalized + * @return string|array The normalized value + */ + public function filter($value) + { + if (is_array($value)) { + require_once 'Zend/Date.php'; + $date = new Zend_Date($value, $this->_options['locale']); + return $date->toString($this->_options['date_format']); + } else if ($this->_options['precision'] === 0) { + return Zend_Locale_Format::toInteger($value, $this->_options); + } else if ($this->_options['precision'] === null) { + return Zend_Locale_Format::toFloat($value, $this->_options); + } + + return Zend_Locale_Format::toNumber($value, $this->_options); + } +} diff --git a/lib/zend/Zend/Filter/PregReplace.php b/lib/zend/Zend/Filter/PregReplace.php new file mode 100644 index 0000000000..43efca8cfe --- /dev/null +++ b/lib/zend/Zend/Filter/PregReplace.php @@ -0,0 +1,156 @@ +setMatchPattern($matchPattern); + } + + if ($replacement) { + $this->setReplacement($replacement); + } + } + + /** + * Set the match pattern for the regex being called within filter() + * + * @param mixed $match - same as the first argument of preg_replace + * @return Zend_Filter_PregReplace + */ + public function setMatchPattern($match) + { + $this->_matchPattern = $match; + return $this; + } + + /** + * Get currently set match pattern + * + * @return string + */ + public function getMatchPattern() + { + return $this->_matchPattern; + } + + /** + * Set the Replacement pattern/string for the preg_replace called in filter + * + * @param mixed $replacement - same as the second argument of preg_replace + * @return Zend_Filter_PregReplace + */ + public function setReplacement($replacement) + { + $this->_replacement = $replacement; + return $this; + } + + /** + * Get currently set replacement value + * + * @return string + */ + public function getReplacement() + { + return $this->_replacement; + } + + /** + * Perform regexp replacement as filter + * + * @param string $value + * @return string + */ + public function filter($value) + { + if ($this->_matchPattern == null) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception(get_class($this) . ' does not have a valid MatchPattern set.'); + } + + return preg_replace($this->_matchPattern, $this->_replacement, $value); + } + +} diff --git a/lib/zend/Zend/Filter/RealPath.php b/lib/zend/Zend/Filter/RealPath.php new file mode 100644 index 0000000000..4580b745f0 --- /dev/null +++ b/lib/zend/Zend/Filter/RealPath.php @@ -0,0 +1,134 @@ +setExists($options); + } + + /** + * Returns true if the filtered path must exist + * + * @return boolean + */ + public function getExists() + { + return $this->_exists; + } + + /** + * Sets if the path has to exist + * TRUE when the path must exist + * FALSE when not existing paths can be given + * + * @param boolean|Zend_Config $exists Path must exist + * @return Zend_Filter_RealPath + */ + public function setExists($exists) + { + if ($exists instanceof Zend_Config) { + $exists = $exists->toArray(); + } + + if (is_array($exists)) { + if (isset($exists['exists'])) { + $exists = (boolean) $exists['exists']; + } + } + + $this->_exists = (boolean) $exists; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns realpath($value) + * + * @param string $value + * @return string + */ + public function filter($value) + { + $path = (string) $value; + if ($this->_exists) { + return realpath($path); + } + + $realpath = @realpath($path); + if ($realpath) { + return $realpath; + } + + $drive = ''; + if (substr(PHP_OS, 0, 3) == 'WIN') { + $path = preg_replace('/[\\\\\/]/', DIRECTORY_SEPARATOR, $path); + if (preg_match('/([a-zA-Z]\:)(.*)/', $path, $matches)) { + list($fullMatch, $drive, $path) = $matches; + } else { + $cwd = getcwd(); + $drive = substr($cwd, 0, 2); + if (substr($path, 0, 1) != DIRECTORY_SEPARATOR) { + $path = substr($cwd, 3) . DIRECTORY_SEPARATOR . $path; + } + } + } elseif (substr($path, 0, 1) != DIRECTORY_SEPARATOR) { + $path = getcwd() . DIRECTORY_SEPARATOR . $path; + } + + $stack = array(); + $parts = explode(DIRECTORY_SEPARATOR, $path); + foreach ($parts as $dir) { + if (strlen($dir) && $dir !== '.') { + if ($dir == '..') { + array_pop($stack); + } else { + array_push($stack, $dir); + } + } + } + + return $drive . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $stack); + } +} diff --git a/lib/zend/Zend/Filter/StringToLower.php b/lib/zend/Zend/Filter/StringToLower.php new file mode 100644 index 0000000000..bb091fe662 --- /dev/null +++ b/lib/zend/Zend/Filter/StringToLower.php @@ -0,0 +1,76 @@ +_encoding = $encoding; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, converting characters to lowercase as necessary + * + * @param string $value + * @return string + */ + public function filter($value) + { + if ($this->_encoding) { + return mb_strtolower((string) $value, $this->_encoding); + } + + return strtolower((string) $value); + } +} diff --git a/lib/zend/Zend/Filter/StringToUpper.php b/lib/zend/Zend/Filter/StringToUpper.php new file mode 100644 index 0000000000..6ba8247744 --- /dev/null +++ b/lib/zend/Zend/Filter/StringToUpper.php @@ -0,0 +1,76 @@ +_encoding = $encoding; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, converting characters to uppercase as necessary + * + * @param string $value + * @return string + */ + public function filter($value) + { + if ($this->_encoding) { + return mb_strtoupper((string) $value, $this->_encoding); + } + + return strtoupper((string) $value); + } +} diff --git a/lib/zend/Zend/Filter/StringTrim.php b/lib/zend/Zend/Filter/StringTrim.php new file mode 100644 index 0000000000..87e6266d50 --- /dev/null +++ b/lib/zend/Zend/Filter/StringTrim.php @@ -0,0 +1,114 @@ +_charList = $charList; + } + + /** + * Returns the charList option + * + * @return string|null + */ + public function getCharList() + { + return $this->_charList; + } + + /** + * Sets the charList option + * + * @param string|null $charList + * @return Zend_Filter_StringTrim Provides a fluent interface + */ + public function setCharList($charList) + { + $this->_charList = $charList; + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value with characters stripped from the beginning and end + * + * @param string $value + * @return string + */ + public function filter($value) + { + if (null === $this->_charList) { + return $this->_unicodeTrim((string) $value); + } else { + return $this->_unicodeTrim((string) $value, $this->_charList); + } + } + + /** + * Unicode aware trim method + * Fixes a PHP problem + * + * @param string $value + * @param string $charlist + * @return string + */ + protected function _unicodeTrim($value, $charlist = '\\\\s') + { + $chars = preg_replace( + array( '/[\^\-\]\\\]/S', '/\\\{4}/S' ), + array( '\\\\\\0', '\\' ), + $charlist + ); + + $pattern = '^[' . $chars . ']*|[' . $chars . ']*$'; + return preg_replace("/$pattern/sSD", '', $value); + } +} diff --git a/lib/zend/Zend/Filter/StripNewlines.php b/lib/zend/Zend/Filter/StripNewlines.php new file mode 100644 index 0000000000..c6fa3cf81c --- /dev/null +++ b/lib/zend/Zend/Filter/StripNewlines.php @@ -0,0 +1,48 @@ +setTagsAllowed($tagsAllowed); + $this->setAttributesAllowed($attributesAllowed); + $this->setCommentsAllowed($commentsAllowed); + } + + /** + * Returns the commentsAllowed option + */ + public function getCommentsAllowed() + { + return $this->commentsAllowed; + } + + /** + * Sets the commentsAllowed option + * + * @param boolean $commentsAllowed + * @return Zend_Filter_StripTags Provides a fluent interface + */ + public function setCommentsAllowed($commentsAllowed) + { + $this->commentsAllowed = (boolean) $commentsAllowed; + return $this; + } + + /** + * Returns the tagsAllowed option + * + * @return array + */ + public function getTagsAllowed() + { + return $this->_tagsAllowed; + } + + /** + * Sets the tagsAllowed option + * + * @param array|string $tagsAllowed + * @return Zend_Filter_StripTags Provides a fluent interface + */ + public function setTagsAllowed($tagsAllowed) + { + if (!is_array($tagsAllowed)) { + $tagsAllowed = array($tagsAllowed); + } + + foreach ($tagsAllowed as $index => $element) { + // If the tag was provided without attributes + if (is_int($index) && is_string($element)) { + // Canonicalize the tag name + $tagName = strtolower($element); + // Store the tag as allowed with no attributes + $this->_tagsAllowed[$tagName] = array(); + } + // Otherwise, if a tag was provided with attributes + else if (is_string($index) && (is_array($element) || is_string($element))) { + // Canonicalize the tag name + $tagName = strtolower($index); + // Canonicalize the attributes + if (is_string($element)) { + $element = array($element); + } + // Store the tag as allowed with the provided attributes + $this->_tagsAllowed[$tagName] = array(); + foreach ($element as $attribute) { + if (is_string($attribute)) { + // Canonicalize the attribute name + $attributeName = strtolower($attribute); + $this->_tagsAllowed[$tagName][$attributeName] = null; + } + } + } + } + + return $this; + } + + /** + * Returns the attributesAllowed option + * + * @return array + */ + public function getAttributesAllowed() + { + return $this->_attributesAllowed; + } + + /** + * Sets the attributesAllowed option + * + * @param array|string $attributesAllowed + * @return Zend_Filter_StripTags Provides a fluent interface + */ + public function setAttributesAllowed($attributesAllowed) + { + if (!is_array($attributesAllowed)) { + $attributesAllowed = array($attributesAllowed); + } + + // Store each attribute as allowed + foreach ($attributesAllowed as $attribute) { + if (is_string($attribute)) { + // Canonicalize the attribute name + $attributeName = strtolower($attribute); + $this->_attributesAllowed[$attributeName] = null; + } + } + + return $this; + } + + /** + * Defined by Zend_Filter_Interface + * + * @todo improve docblock descriptions + * + * @param string $value + * @return string + */ + public function filter($value) + { + $valueCopy = (string) $value; + + // If comments are allowed, then replace them with unique identifiers + if ($this->getCommentsAllowed()) { + preg_match_all('/<\!--.*?--\s*>/s' , (string) $valueCopy, $matches); + $comments = array_unique($matches[0]); + foreach ($comments as $k => $v) { + $valueCopy = str_replace($v, self::UNIQUE_ID_PREFIX . $k, $valueCopy); + } + } + + // Initialize accumulator for filtered data + $dataFiltered = ''; + // Parse the input data iteratively as regular pre-tag text followed by a + // tag; either may be empty strings + preg_match_all('/([^<]*)(]*>?)/', (string) $valueCopy, $matches); + // Iterate over each set of matches + foreach ($matches[1] as $index => $preTag) { + // If the pre-tag text is non-empty, strip any ">" characters from it + if (strlen($preTag)) { + $preTag = str_replace('>', '', $preTag); + } + // If a tag exists in this match, then filter the tag + $tag = $matches[2][$index]; + if (strlen($tag)) { + $tagFiltered = $this->_filterTag($tag); + } else { + $tagFiltered = ''; + } + // Add the filtered pre-tag text and filtered tag to the data buffer + $dataFiltered .= $preTag . $tagFiltered; + } + + // If comments are allowed, then replace the unique identifiers with the corresponding comments + if ($this->getCommentsAllowed()) { + foreach ($comments as $k => $v) { + $dataFiltered = str_replace(self::UNIQUE_ID_PREFIX . $k, $v, $dataFiltered); + } + } + + // Return the filtered data + return $dataFiltered; + } + + /** + * Filters a single tag against the current option settings + * + * @param string $tag + * @return string + */ + protected function _filterTag($tag) + { + // Parse the tag into: + // 1. a starting delimiter (mandatory) + // 2. a tag name (if available) + // 3. a string of attributes (if available) + // 4. an ending delimiter (if available) + $isMatch = preg_match('~()|[^/>])*)(/?>)~', $tag, $matches); + + // If the tag does not match, then strip the tag entirely + if (!$isMatch) { + return ''; + } + + // Save the matches to more meaningfully named variables + $tagStart = $matches[1]; + $tagName = strtolower($matches[2]); + $tagAttributes = $matches[3]; + $tagEnd = $matches[5]; + + // If the tag is not an allowed tag, then remove the tag entirely + if (!isset($this->_tagsAllowed[$tagName])) { + return ''; + } + + // Trim the attribute string of whitespace at the ends + $tagAttributes = trim($tagAttributes); + + // If there are non-whitespace characters in the attribute string + if (strlen($tagAttributes)) { + // Parse iteratively for well-formed attributes + preg_match_all('/(\w+)\s*=\s*(?:(")(.*?)"|(\')(.*?)\')/s', $tagAttributes, $matches); + + // Initialize valid attribute accumulator + $tagAttributes = ''; + + // Iterate over each matched attribute + foreach ($matches[1] as $index => $attributeName) { + $attributeName = strtolower($attributeName); + $attributeDelimiter = $matches[2][$index]; + $attributeValue = $matches[3][$index]; + + // If the attribute is not allowed, then remove it entirely + if (!array_key_exists($attributeName, $this->_tagsAllowed[$tagName]) + && !array_key_exists($attributeName, $this->_attributesAllowed)) { + continue; + } + // Add the attribute to the accumulator + $tagAttributes .= " $attributeName=" . $attributeDelimiter + . $attributeValue . $attributeDelimiter; + } + } + + // Reconstruct tags ending with "/>" as backwards-compatible XHTML tag + if (strpos($tagEnd, '/') !== false) { + $tagEnd = " $tagEnd"; + } + + // Return the filtered tag + return $tagStart . $tagName . $tagAttributes . $tagEnd; + } +} diff --git a/lib/zend/Zend/Filter/Word/CamelCaseToDash.php b/lib/zend/Zend/Filter/Word/CamelCaseToDash.php new file mode 100644 index 0000000000..4f47b195e2 --- /dev/null +++ b/lib/zend/Zend/Filter/Word/CamelCaseToDash.php @@ -0,0 +1,44 @@ +_separator . '\1', $this->_separator . '\1')); + } else { + parent::setMatchPattern(array('#(?<=(?:[A-Z]))([A-Z]+)([A-Z][A-z])#', '#(?<=(?:[a-z]))([A-Z])#')); + parent::setReplacement(array('\1' . $this->_separator . '\2', $this->_separator . '\1')); + } + + return parent::filter($value); + } + +} diff --git a/lib/zend/Zend/Filter/Word/CamelCaseToUnderscore.php b/lib/zend/Zend/Filter/Word/CamelCaseToUnderscore.php new file mode 100644 index 0000000000..4c4b584505 --- /dev/null +++ b/lib/zend/Zend/Filter/Word/CamelCaseToUnderscore.php @@ -0,0 +1,44 @@ +setMatchPattern('#-#'); + $this->setReplacement($this->_separator); + return parent::filter($value); + } +} diff --git a/lib/zend/Zend/Filter/Word/DashToUnderscore.php b/lib/zend/Zend/Filter/Word/DashToUnderscore.php new file mode 100644 index 0000000000..b52bed38a4 --- /dev/null +++ b/lib/zend/Zend/Filter/Word/DashToUnderscore.php @@ -0,0 +1,45 @@ +setSeparator($separator); + } + + /** + * Sets a new seperator + * + * @param string $separator Seperator + * @return $this + */ + public function setSeparator($separator) + { + if ($separator == null) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('"' . $separator . '" is not a valid separator.'); + } + $this->_separator = $separator; + return $this; + } + + /** + * Returns the actual set seperator + * + * @return string + */ + public function getSeparator() + { + return $this->_separator; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Filter/Word/SeparatorToCamelCase.php b/lib/zend/Zend/Filter/Word/SeparatorToCamelCase.php new file mode 100644 index 0000000000..70ceea73ab --- /dev/null +++ b/lib/zend/Zend/Filter/Word/SeparatorToCamelCase.php @@ -0,0 +1,52 @@ +_separator, '#'); + + if (self::isUnicodeSupportEnabled()) { + parent::setMatchPattern(array('#('.$pregQuotedSeparator.')(\p{L}{1})#e','#(^\p{Ll}{1})#e')); + parent::setReplacement(array("strtoupper('\\2')","strtoupper('\\1')")); + } else { + parent::setMatchPattern(array('#('.$pregQuotedSeparator.')([A-Za-z]{1})#e','#(^[A-Za-z]{1})#e')); + parent::setReplacement(array("strtoupper('\\2')","strtoupper('\\1')")); + } + + return parent::filter($value); + } + +} diff --git a/lib/zend/Zend/Filter/Word/SeparatorToDash.php b/lib/zend/Zend/Filter/Word/SeparatorToDash.php new file mode 100644 index 0000000000..a660dc9a3b --- /dev/null +++ b/lib/zend/Zend/Filter/Word/SeparatorToDash.php @@ -0,0 +1,46 @@ +setSearchSeparator($searchSeparator); + $this->setReplacementSeparator($replacementSeparator); + } + + /** + * Sets a new seperator to search for + * + * @param string $separator Seperator to search for + * @return $this + */ + public function setSearchSeparator($separator) + { + $this->_searchSeparator = $separator; + return $this; + } + + /** + * Returns the actual set seperator to search for + * + * @return string + */ + public function getSearchSeparator() + { + return $this->_searchSeparator; + } + + /** + * Sets a new seperator which replaces the searched one + * + * @param string $separator Seperator which replaces the searched one + * @return $this + */ + public function setReplacementSeparator($separator) + { + $this->_replacementSeparator = $separator; + return $this; + } + + /** + * Returns the actual set seperator which replaces the searched one + * + * @return string + */ + public function getReplacementSeparator() + { + return $this->_replacementSeparator; + } + + /** + * Defined by Zend_Filter_Interface + * + * Returns the string $value, replacing the searched seperators with the defined ones + * + * @param string $value + * @return string + */ + public function filter($value) + { + return $this->_separatorToSeparatorFilter($value); + } + + /** + * Do the real work, replaces the seperator to search for with the replacement seperator + * + * Returns the replaced string + * + * @param string $value + * @return string + */ + protected function _separatorToSeparatorFilter($value) + { + if ($this->_searchSeparator == null) { + require_once 'Zend/Filter/Exception.php'; + throw new Zend_Filter_Exception('You must provide a search separator for this filter to work.'); + } + + $this->setMatchPattern('#' . preg_quote($this->_searchSeparator, '#') . '#'); + $this->setReplacement($this->_replacementSeparator); + return parent::filter($value); + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Filter/Word/UnderscoreToCamelCase.php b/lib/zend/Zend/Filter/Word/UnderscoreToCamelCase.php new file mode 100644 index 0000000000..cba5285d50 --- /dev/null +++ b/lib/zend/Zend/Filter/Word/UnderscoreToCamelCase.php @@ -0,0 +1,44 @@ +setOptions($options); + } elseif ($options instanceof Zend_Config) { + $this->setConfig($options); + } + } + + /** + * Set options + * + * @param array $options + * @return Zend_Form_Decorator_Abstract + */ + public function setOptions(array $options) + { + $this->_options = $options; + return $this; + } + + /** + * Set options from config object + * + * @param Zend_Config $config + * @return Zend_Form_Decorator_Abstract + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Set option + * + * @param string $key + * @param mixed $value + * @return Zend_Form_Decorator_Abstract + */ + public function setOption($key, $value) + { + $this->_options[(string) $key] = $value; + return $this; + } + + /** + * Get option + * + * @param string $key + * @return mixed + */ + public function getOption($key) + { + $key = (string) $key; + if (isset($this->_options[$key])) { + return $this->_options[$key]; + } + + return null; + } + + /** + * Retrieve options + * + * @return array + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Remove single option + * + * @param mixed $key + * @return void + */ + public function removeOption($key) + { + if (null !== $this->getOption($key)) { + unset($this->_options[$key]); + return true; + } + + return false; + } + + /** + * Clear all options + * + * @return Zend_Form_Decorator_Abstract + */ + public function clearOptions() + { + $this->_options = array(); + return $this; + } + + /** + * Set current form element + * + * @param Zend_Form_Element|Zend_Form $element + * @return Zend_Form_Decorator_Abstract + * @throws Zend_Form_Decorator_Exception on invalid element type + */ + public function setElement($element) + { + if ((!$element instanceof Zend_Form_Element) + && (!$element instanceof Zend_Form) + && (!$element instanceof Zend_Form_DisplayGroup)) + { + require_once 'Zend/Form/Decorator/Exception.php'; + throw new Zend_Form_Decorator_Exception('Invalid element type passed to decorator'); + } + + $this->_element = $element; + return $this; + } + + /** + * Retrieve current element + * + * @return Zend_Form_Element|Zend_Form + */ + public function getElement() + { + return $this->_element; + } + + /** + * Determine if decorator should append or prepend content + * + * @return string + */ + public function getPlacement() + { + $placement = $this->_placement; + if (null !== ($placementOpt = $this->getOption('placement'))) { + $placementOpt = strtoupper($placementOpt); + switch ($placementOpt) { + case self::APPEND: + case self::PREPEND: + $placement = $this->_placement = $placementOpt; + break; + case false: + $placement = $this->_placement = null; + break; + default: + break; + } + $this->removeOption('placement'); + } + + return $placement; + } + + /** + * Retrieve separator to use between old and new content + * + * @return string + */ + public function getSeparator() + { + $separator = $this->_separator; + if (null !== ($separatorOpt = $this->getOption('separator'))) { + $separator = $this->_separator = (string) $separatorOpt; + $this->removeOption('separator'); + } + return $separator; + } + + /** + * Decorate content and/or element + * + * @param string $content + * @return string + * @throws Zend_Dorm_Decorator_Exception when unimplemented + */ + public function render($content) + { + require_once 'Zend/Form/Decorator/Exception.php'; + throw new Zend_Form_Decorator_Exception('render() not implemented'); + } +} diff --git a/lib/zend/Zend/Form/Decorator/Callback.php b/lib/zend/Zend/Form/Decorator/Callback.php new file mode 100644 index 0000000000..1e26f00554 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Callback.php @@ -0,0 +1,128 @@ +_callback = $callback; + return $this; + } + + /** + * Get registered callback + * + * If not previously registered, checks to see if it exists in registered + * options. + * + * @return null|string|array + */ + public function getCallback() + { + if (null === $this->_callback) { + if (null !== ($callback = $this->getOption('callback'))) { + $this->setCallback($callback); + $this->removeOption('callback'); + } + } + + return $this->_callback; + } + + /** + * Render + * + * If no callback registered, returns callback. Otherwise, gets return + * value of callback and either appends, prepends, or replaces passed in + * content. + * + * @param string $content + * @return string + */ + public function render($content) + { + $callback = $this->getCallback(); + if (null === $callback) { + return $content; + } + + $placement = $this->getPlacement(); + $separator = $this->getSeparator(); + + $response = call_user_func($callback, $content, $this->getElement(), $this->getOptions()); + + switch ($placement) { + case self::APPEND: + return $content . $separator . $response; + case self::PREPEND: + return $response . $separator . $content; + default: + // replace content + return $response; + } + } +} diff --git a/lib/zend/Zend/Form/Decorator/Captcha.php b/lib/zend/Zend/Form/Decorator/Captcha.php new file mode 100644 index 0000000000..111d1b3bd3 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Captcha.php @@ -0,0 +1,72 @@ +getElement(); + if (!method_exists($element, 'getCaptcha')) { + return $content; + } + + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $placement = $this->getPlacement(); + $separator = $this->getSeparator(); + + $captcha = $element->getCaptcha(); + $markup = $captcha->render($view, $element); + switch ($placement) { + case 'PREPEND': + $content = $markup . $separator . $content; + break; + case 'APPEND': + default: + $content = $content . $separator . $markup; + } + return $content; + } +} diff --git a/lib/zend/Zend/Form/Decorator/Captcha/Word.php b/lib/zend/Zend/Form/Decorator/Captcha/Word.php new file mode 100644 index 0000000000..ab53481a9c --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Captcha/Word.php @@ -0,0 +1,78 @@ +getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $name = $element->getFullyQualifiedName(); + + $hiddenName = $name . '[id]'; + $textName = $name . '[input]'; + + $label = $element->getDecorator("Label"); + if($label) { + $label->setOption("id", "$name-input"); + } + + $placement = $this->getPlacement(); + $separator = $this->getSeparator(); + + $hidden = $view->formHidden($hiddenName, $element->getValue(), $element->getAttribs()); + $text = $view->formText($textName, '', $element->getAttribs()); + switch ($placement) { + case 'PREPEND': + $content = $hidden . $separator . $text . $separator . $content; + break; + case 'APPEND': + default: + $content = $content . $separator . $hidden . $separator . $text; + } + return $content; + } +} diff --git a/lib/zend/Zend/Form/Decorator/Description.php b/lib/zend/Zend/Form/Decorator/Description.php new file mode 100644 index 0000000000..69e6365c25 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Description.php @@ -0,0 +1,199 @@ +_tag = (string) $tag; + return $this; + } + + /** + * Get HTML tag, if any, with which to surround description + * + * @return string + */ + public function getTag() + { + if (null === $this->_tag) { + $tag = $this->getOption('tag'); + if (null !== $tag) { + $this->removeOption('tag'); + } else { + $tag = 'p'; + } + + $this->setTag($tag); + return $tag; + } + + return $this->_tag; + } + + /** + * Get class with which to define description + * + * Defaults to 'hint' + * + * @return string + */ + public function getClass() + { + $class = $this->getOption('class'); + if (null === $class) { + $class = 'hint'; + $this->setOption('class', $class); + } + + return $class; + } + + /** + * Set whether or not to escape description + * + * @param bool $flag + * @return Zend_Form_Decorator_Description + */ + public function setEscape($flag) + { + $this->_escape = (bool) $flag; + return $this; + } + + /** + * Get escape flag + * + * @return true + */ + public function getEscape() + { + if (null === $this->_escape) { + if (null !== ($escape = $this->getOption('escape'))) { + $this->setEscape($escape); + $this->removeOption('escape'); + } else { + $this->setEscape(true); + } + } + + return $this->_escape; + } + + /** + * Render a description + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $description = $element->getDescription(); + $description = trim($description); + + if (!empty($description) && (null !== ($translator = $element->getTranslator()))) { + $description = $translator->translate($description); + } + + if (empty($description)) { + return $content; + } + + $separator = $this->getSeparator(); + $placement = $this->getPlacement(); + $tag = $this->getTag(); + $class = $this->getClass(); + $escape = $this->getEscape(); + + $options = $this->getOptions(); + + if ($escape) { + $description = $view->escape($description); + } + + if (!empty($tag)) { + require_once 'Zend/Form/Decorator/HtmlTag.php'; + $options['tag'] = $tag; + $decorator = new Zend_Form_Decorator_HtmlTag($options); + $description = $decorator->render($description); + } + + switch ($placement) { + case self::PREPEND: + return $description . $separator . $content; + case self::APPEND: + default: + return $content . $separator . $description; + } + } +} diff --git a/lib/zend/Zend/Form/Decorator/DtDdWrapper.php b/lib/zend/Zend/Form/Decorator/DtDdWrapper.php new file mode 100644 index 0000000000..772548fdde --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/DtDdWrapper.php @@ -0,0 +1,63 @@ + item, and wraps the content in a
. Used as a + * default decorator for subforms and display groups. + * + * @category Zend + * @package Zend_Form + * @subpackage Decorator + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +class Zend_Form_Decorator_DtDdWrapper extends Zend_Form_Decorator_Abstract +{ + /** + * Default placement: surround content + * @var string + */ + protected $_placement = null; + + /** + * Render + * + * Renders as the following: + *
+ *
$content
+ * + * @param string $content + * @return string + */ + public function render($content) + { + $elementName = $this->getElement()->getName(); + + return '
 
' . + '
' . $content . '
'; + } +} diff --git a/lib/zend/Zend/Form/Decorator/Errors.php b/lib/zend/Zend/Form/Decorator/Errors.php new file mode 100644 index 0000000000..8d4830854c --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Errors.php @@ -0,0 +1,69 @@ +getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $errors = $element->getMessages(); + if (empty($errors)) { + return $content; + } + + $separator = $this->getSeparator(); + $placement = $this->getPlacement(); + $errors = $view->formErrors($errors, $this->getOptions()); + + switch ($placement) { + case self::APPEND: + return $content . $separator . $errors; + case self::PREPEND: + return $errors . $separator . $content; + } + } +} diff --git a/lib/zend/Zend/Form/Decorator/Exception.php b/lib/zend/Zend/Form/Decorator/Exception.php new file mode 100644 index 0000000000..617fd74bd4 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Exception.php @@ -0,0 +1,37 @@ +getElement())) { + $attribs = $element->getAttribs(); + $options = array_merge($options, $attribs); + $this->setOptions($options); + } + return $options; + } + + /** + * Set legend + * + * @param string $value + * @return Zend_Form_Decorator_Fieldset + */ + public function setLegend($value) + { + $this->_legend = (string) $value; + return $this; + } + + /** + * Get legend + * + * @return string + */ + public function getLegend() + { + $legend = $this->_legend; + if ((null === $legend) && (null !== ($element = $this->getElement()))) { + if (method_exists($element, 'getLegend')) { + $legend = $element->getLegend(); + $this->setLegend($legend); + } + } + if ((null === $legend) && (null !== ($legend = $this->getOption('legend')))) { + $this->setLegend($legend); + $this->removeOption('legend'); + } + + return $legend; + } + + /** + * Render a fieldset + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $legend = $this->getLegend(); + $attribs = $this->getOptions(); + $name = $element->getFullyQualifiedName(); + + $id = $element->getId(); + if (!empty($id)) { + $attribs['id'] = 'fieldset-' . $id; + } + + if (null !== $legend) { + if (null !== ($translator = $element->getTranslator())) { + $legend = $translator->translate($legend); + } + + $attribs['legend'] = $legend; + } + + foreach (array_keys($attribs) as $attrib) { + $testAttrib = strtolower($attrib); + if (in_array($testAttrib, $this->stripAttribs)) { + unset($attribs[$attrib]); + } + } + + return $view->fieldset($name, $content, $attribs); + } +} diff --git a/lib/zend/Zend/Form/Decorator/File.php b/lib/zend/Zend/Form/Decorator/File.php new file mode 100644 index 0000000000..5f6a4385d9 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/File.php @@ -0,0 +1,142 @@ +getOptions(); + + if (null !== ($element = $this->getElement())) { + $attribs = array_merge($attribs, $element->getAttribs()); + } + + foreach ($this->_attribBlacklist as $key) { + if (array_key_exists($key, $attribs)) { + unset($attribs[$key]); + } + } + + return $attribs; + } + + /** + * Render a form file + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + if (!$element instanceof Zend_Form_Element) { + return $content; + } + + $view = $element->getView(); + if (!$view instanceof Zend_View_Interface) { + return $content; + } + + $name = $element->getName(); + $attribs = $this->getAttribs(); + if (!array_key_exists('id', $attribs)) { + $attribs['id'] = $name; + } + + $separator = $this->getSeparator(); + $placement = $this->getPlacement(); + $markup = array(); + $size = $element->getMaxFileSize(); + if ($size > 0) { + $element->setMaxFileSize(0); + $markup[] = $view->formHidden('MAX_FILE_SIZE', $size); + } + + if (Zend_File_Transfer_Adapter_Http::isApcAvailable()) { + $markup[] = $view->formHidden('APC_UPLOAD_PROGRESS', uniqid(), array('id' => 'progress_key')); + } else if (Zend_File_Transfer_Adapter_Http::isUploadProgressAvailable()) { + $markup[] = $view->formHidden('UPLOAD_IDENTIFIER', uniqid(), array('id' => 'progress_key')); + } + + if ($element->isArray()) { + $name .= "[]"; + $count = $element->getMultiFile(); + for ($i = 0; $i < $count; ++$i) { + $htmlAttribs = $attribs; + $htmlAttribs['id'] .= '-' . $i; + $markup[] = $view->formFile($name, $htmlAttribs); + } + } else { + $markup[] = $view->formFile($name, $attribs); + } + + $markup = implode($separator, $markup); + + switch ($placement) { + case self::PREPEND: + return $markup . $separator . $content; + case self::APPEND: + default: + return $content . $separator . $markup; + } + } +} diff --git a/lib/zend/Zend/Form/Decorator/Form.php b/lib/zend/Zend/Form/Decorator/Form.php new file mode 100644 index 0000000000..cc13c115f8 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Form.php @@ -0,0 +1,134 @@ +_helper = (string) $helper; + return $this; + } + + /** + * Get view helper for rendering form + * + * @return string + */ + public function getHelper() + { + if (null !== ($helper = $this->getOption('helper'))) { + $this->setHelper($helper); + $this->removeOption('helper'); + } + return $this->_helper; + } + + /** + * Retrieve decorator options + * + * Assures that form action and method are set, and sets appropriate + * encoding type if current method is POST. + * + * @return array + */ + public function getOptions() + { + if (null !== ($element = $this->getElement())) { + if ($element instanceof Zend_Form) { + $element->getAction(); + $method = $element->getMethod(); + if ($method == Zend_Form::METHOD_POST) { + $this->setOption('enctype', 'application/x-www-form-urlencoded'); + } + foreach ($element->getAttribs() as $key => $value) { + $this->setOption($key, $value); + } + } elseif ($element instanceof Zend_Form_DisplayGroup) { + foreach ($element->getAttribs() as $key => $value) { + $this->setOption($key, $value); + } + } + } + + if (isset($this->_options['method'])) { + $this->_options['method'] = strtolower($this->_options['method']); + } + + return $this->_options; + } + + /** + * Render a form + * + * Replaces $content entirely from currently set element. + * + * @param string $content + * @return string + */ + public function render($content) + { + $form = $this->getElement(); + $view = $form->getView(); + if (null === $view) { + return $content; + } + + $helper = $this->getHelper(); + $attribs = $this->getOptions(); + $name = $form->getFullyQualifiedName(); + $attribs['id'] = $form->getId(); + return $view->$helper($name, $attribs, $content); + } +} diff --git a/lib/zend/Zend/Form/Decorator/FormElements.php b/lib/zend/Zend/Form/Decorator/FormElements.php new file mode 100644 index 0000000000..c2328ce645 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/FormElements.php @@ -0,0 +1,126 @@ +getElement(); + if ((!$form instanceof Zend_Form) && (!$form instanceof Zend_Form_DisplayGroup)) { + return $content; + } + + $belongsTo = ($form instanceof Zend_Form) ? $form->getElementsBelongTo() : null; + $elementContent = ''; + $separator = $this->getSeparator(); + $translator = $form->getTranslator(); + $items = array(); + $view = $form->getView(); + foreach ($form as $item) { + $item->setView($view) + ->setTranslator($translator); + if ($item instanceof Zend_Form_Element) { + $item->setBelongsTo($belongsTo); + } elseif (!empty($belongsTo) && ($item instanceof Zend_Form)) { + if ($item->isArray()) { + $name = $this->mergeBelongsTo($belongsTo, $item->getElementsBelongTo()); + $item->setElementsBelongTo($name, true); + } else { + $item->setElementsBelongTo($belongsTo, true); + } + } elseif (!empty($belongsTo) && ($item instanceof Zend_Form_DisplayGroup)) { + foreach ($item as $element) { + $element->setBelongsTo($belongsTo); + } + } + + $items[] = $item->render(); + + if (($item instanceof Zend_Form_Element_File) + || (($item instanceof Zend_Form) + && (Zend_Form::ENCTYPE_MULTIPART == $item->getEnctype())) + || (($item instanceof Zend_Form_DisplayGroup) + && (Zend_Form::ENCTYPE_MULTIPART == $item->getAttrib('enctype'))) + ) { + if ($form instanceof Zend_Form) { + $form->setEnctype(Zend_Form::ENCTYPE_MULTIPART); + } elseif ($form instanceof Zend_Form_DisplayGroup) { + $form->setAttrib('enctype', Zend_Form::ENCTYPE_MULTIPART); + } + } + } + $elementContent = implode($separator, $items); + + switch ($this->getPlacement()) { + case self::PREPEND: + return $elementContent . $separator . $content; + case self::APPEND: + default: + return $content . $separator . $elementContent; + } + } +} diff --git a/lib/zend/Zend/Form/Decorator/FormErrors.php b/lib/zend/Zend/Form/Decorator/FormErrors.php new file mode 100644 index 0000000000..d6d417de10 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/FormErrors.php @@ -0,0 +1,397 @@ + false, + 'markupElementLabelEnd' => '', + 'markupElementLabelStart' => '', + 'markupListEnd' => '', + 'markupListItemEnd' => '', + 'markupListItemStart' => '
  • ', + 'markupListStart' => '
      ', + ); + + /**#@+ + * Markup options + * @var string + */ + protected $_ignoreSubForms; + protected $_markupElementLabelEnd; + protected $_markupElementLabelStart; + protected $_markupListEnd; + protected $_markupListItemEnd; + protected $_markupListItemStart; + protected $_markupListStart; + /**#@-*/ + + /** + * Render errors + * + * @param string $content + * @return string + */ + public function render($content) + { + $form = $this->getElement(); + if (!$form instanceof Zend_Form) { + return $content; + } + + $view = $form->getView(); + if (null === $view) { + return $content; + } + + $this->initOptions(); + $markup = $this->_recurseForm($form, $view); + + if (empty($markup)) { + return $content; + } + + $markup = $this->getMarkupListStart() + . $markup + . $this->getMarkupListEnd(); + + switch ($this->getPlacement()) { + case self::APPEND: + return $content . $this->getSeparator() . $markup; + case self::PREPEND: + return $markup . $this->getSeparator() . $content; + } + } + + /** + * Initialize options + * + * @return void + */ + public function initOptions() + { + $this->getMarkupElementLabelEnd(); + $this->getMarkupElementLabelStart(); + $this->getMarkupListEnd(); + $this->getMarkupListItemEnd(); + $this->getMarkupListItemStart(); + $this->getMarkupListStart(); + $this->getPlacement(); + $this->getSeparator(); + $this->ignoreSubForms(); + } + + /** + * Retrieve markupElementLabelStart + * + * @return string + */ + public function getMarkupElementLabelStart() + { + if (null === $this->_markupElementLabelStart) { + if (null === ($markupElementLabelStart = $this->getOption('markupElementLabelStart'))) { + $this->setMarkupElementLabelStart($this->_defaults['markupElementLabelStart']); + } else { + $this->setMarkupElementLabelStart($markupElementLabelStart); + $this->removeOption('markupElementLabelStart'); + } + } + + return $this->_markupElementLabelStart; + } + + /** + * Set markupElementLabelStart + * + * @param string $markupElementLabelStart + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupElementLabelStart($markupElementLabelStart) + { + $this->_markupElementLabelStart = $markupElementLabelStart; + return $this; + } + + /** + * Retrieve markupElementLabelEnd + * + * @return string + */ + public function getMarkupElementLabelEnd() + { + if (null === $this->_markupElementLabelEnd) { + if (null === ($markupElementLabelEnd = $this->getOption('markupElementLabelEnd'))) { + $this->setMarkupElementLabelEnd($this->_defaults['markupElementLabelEnd']); + } else { + $this->setMarkupElementLabelEnd($markupElementLabelEnd); + $this->removeOption('markupElementLabelEnd'); + } + } + + return $this->_markupElementLabelEnd; + } + + /** + * Set markupElementLabelEnd + * + * @param string $markupElementLabelEnd + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupElementLabelEnd($markupElementLabelEnd) + { + $this->_markupElementLabelEnd = $markupElementLabelEnd; + return $this; + } + + /** + * Retrieve markupListStart + * + * @return string + */ + public function getMarkupListStart() + { + if (null === $this->_markupListStart) { + if (null === ($markupListStart = $this->getOption('markupListStart'))) { + $this->setMarkupListStart($this->_defaults['markupListStart']); + } else { + $this->setMarkupListStart($markupListStart); + $this->removeOption('markupListStart'); + } + } + + return $this->_markupListStart; + } + + /** + * Set markupListStart + * + * @param string $markupListStart + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupListStart($markupListStart) + { + $this->_markupListStart = $markupListStart; + return $this; + } + + /** + * Retrieve markupListEnd + * + * @return string + */ + public function getMarkupListEnd() + { + if (null === $this->_markupListEnd) { + if (null === ($markupListEnd = $this->getOption('markupListEnd'))) { + $this->setMarkupListEnd($this->_defaults['markupListEnd']); + } else { + $this->setMarkupListEnd($markupListEnd); + $this->removeOption('markupListEnd'); + } + } + + return $this->_markupListEnd; + } + + /** + * Set markupListEnd + * + * @param string $markupListEnd + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupListEnd($markupListEnd) + { + $this->_markupListEnd = $markupListEnd; + return $this; + } + + /** + * Retrieve markupListItemStart + * + * @return string + */ + public function getMarkupListItemStart() + { + if (null === $this->_markupListItemStart) { + if (null === ($markupListItemStart = $this->getOption('markupListItemStart'))) { + $this->setMarkupListItemStart($this->_defaults['markupListItemStart']); + } else { + $this->setMarkupListItemStart($markupListItemStart); + $this->removeOption('markupListItemStart'); + } + } + + return $this->_markupListItemStart; + } + + /** + * Set markupListItemStart + * + * @param string $markupListItemStart + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupListItemStart($markupListItemStart) + { + $this->_markupListItemStart = $markupListItemStart; + return $this; + } + + /** + * Retrieve markupListItemEnd + * + * @return string + */ + public function getMarkupListItemEnd() + { + if (null === $this->_markupListItemEnd) { + if (null === ($markupListItemEnd = $this->getOption('markupListItemEnd'))) { + $this->setMarkupListItemEnd($this->_defaults['markupListItemEnd']); + } else { + $this->setMarkupListItemEnd($markupListItemEnd); + $this->removeOption('markupListItemEnd'); + } + } + + return $this->_markupListItemEnd; + } + + /** + * Set markupListItemEnd + * + * @param string $markupListItemEnd + * @return Zend_Form_Decorator_FormErrors + */ + public function setMarkupListItemEnd($markupListItemEnd) + { + $this->_markupListItemEnd = $markupListItemEnd; + return $this; + } + + /** + * Retrieve ignoreSubForms + * + * @return bool + */ + public function ignoreSubForms() + { + if (null === $this->_ignoreSubForms) { + if (null === ($ignoreSubForms = $this->getOption('ignoreSubForms'))) { + $this->setIgnoreSubForms($this->_defaults['ignoreSubForms']); + } else { + $this->setIgnoreSubForms($ignoreSubForms); + $this->removeOption('ignoreSubForms'); + } + } + + return $this->_ignoreSubForms; + } + + /** + * Set ignoreSubForms + * + * @param bool $ignoreSubForms + * @return Zend_Form_Decorator_FormErrors + */ + public function setIgnoreSubForms($ignoreSubForms) + { + $this->_ignoreSubForms = (bool) $ignoreSubForms; + return $this; + } + + /** + * Render element label + * + * @param Zend_Form_Element $element + * @param Zend_View_Interface $view + * @return string + */ + public function renderLabel(Zend_Form_Element $element, Zend_View_Interface $view) + { + $label = $element->getLabel(); + if (empty($label)) { + $label = $element->getName(); + } + + return $this->getMarkupElementLabelStart() + . $view->escape($label) + . $this->getMarkupElementLabelEnd(); + } + + /** + * Recurse through a form object, rendering errors + * + * @param Zend_Form $form + * @param Zend_View_Interface $view + * @return string + */ + protected function _recurseForm(Zend_Form $form, Zend_View_Interface $view) + { + $content = ''; + $errors = $form->getMessages(); + if ($form instanceof Zend_Form_SubForm) { + $name = $form->getName(); + if ((1 == count($errors)) && array_key_exists($name, $errors)) { + $errors = $errors[$name]; + } + } + if (empty($errors)) { + return $content; + } + + foreach ($errors as $name => $list) { + $element = $form->$name; + if ($element instanceof Zend_Form_Element) { + $element->setView($view); + $content .= $this->getMarkupListItemStart() + . $this->renderLabel($element, $view) + . $view->formErrors($list, $this->getOptions()) + . $this->getMarkupListItemEnd(); + } elseif (!$this->ignoreSubForms() && ($element instanceof Zend_Form)) { + $content .= $this->getMarkupListStart() + . $this->_recurseForm($element, $view) + . $this->getMarkupListEnd(); + } + } + + return $content; + } +} diff --git a/lib/zend/Zend/Form/Decorator/HtmlTag.php b/lib/zend/Zend/Form/Decorator/HtmlTag.php new file mode 100644 index 0000000000..eeb7e5698a --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/HtmlTag.php @@ -0,0 +1,219 @@ + $val) { + $key = htmlspecialchars($key, ENT_COMPAT, 'UTF-8'); + if (is_array($val)) { + $val = implode(' ', $val); + } + $val = htmlspecialchars($val, ENT_COMPAT, 'UTF-8'); + $xhtml .= " $key=\"$val\""; + } + return $xhtml; + } + + /** + * Normalize tag + * + * Ensures tag is alphanumeric characters only, and all lowercase. + * + * @param string $tag + * @return string + */ + public function normalizeTag($tag) + { + if (!isset($this->_tagFilter)) { + require_once 'Zend/Filter.php'; + require_once 'Zend/Filter/Alnum.php'; + require_once 'Zend/Filter/StringToLower.php'; + $this->_tagFilter = new Zend_Filter(); + $this->_tagFilter->addFilter(new Zend_Filter_Alnum()) + ->addFilter(new Zend_Filter_StringToLower()); + } + return $this->_tagFilter->filter($tag); + } + + /** + * Set tag to use + * + * @param string $tag + * @return Zend_Form_Decorator_HtmlTag + */ + public function setTag($tag) + { + $this->_tag = $this->normalizeTag($tag); + return $this; + } + + /** + * Get tag + * + * If no tag is registered, either via setTag() or as an option, uses 'div'. + * + * @return string + */ + public function getTag() + { + if (null === $this->_tag) { + if (null === ($tag = $this->getOption('tag'))) { + $this->setTag('div'); + } else { + $this->setTag($tag); + $this->removeOption('tag'); + } + } + + return $this->_tag; + } + + /** + * Get the formatted open tag + * + * @param string $tag + * @param array $attribs + * @return string + */ + protected function _getOpenTag($tag, array $attribs = null) + { + $html = '<' . $tag; + if (null !== $attribs) { + $html .= $this->_htmlAttribs($attribs); + } + $html .= '>'; + return $html; + } + + /** + * Get formatted closing tag + * + * @param string $tag + * @return string + */ + protected function _getCloseTag($tag) + { + return ''; + } + + /** + * Render content wrapped in an HTML tag + * + * @param string $content + * @return string + */ + public function render($content) + { + $tag = $this->getTag(); + $placement = $this->getPlacement(); + $noAttribs = $this->getOption('noAttribs'); + $openOnly = $this->getOption('openOnly'); + $closeOnly = $this->getOption('closeOnly'); + $this->removeOption('noAttribs'); + $this->removeOption('openOnly'); + $this->removeOption('closeOnly'); + + $attribs = null; + if (!$noAttribs) { + $attribs = $this->getOptions(); + } + + switch ($placement) { + case self::APPEND: + if ($closeOnly) { + return $content . $this->_getCloseTag($tag); + } + if ($openOnly) { + return $content . $this->_getOpenTag($tag, $attribs); + } + return $content + . $this->_getOpenTag($tag, $attribs) + . $this->_getCloseTag($tag); + case self::PREPEND: + if ($closeOnly) { + return $this->_getCloseTag($tag) . $content; + } + if ($openOnly) { + return $this->_getOpenTag($tag, $attribs) . $content; + } + return $this->_getOpenTag($tag, $attribs) + . $this->_getCloseTag($tag) + . $content; + default: + return (($openOnly || !$closeOnly) ? $this->_getOpenTag($tag, $attribs) : '') + . $content + . (($closeOnly || !$openOnly) ? $this->_getCloseTag($tag) : ''); + } + } +} diff --git a/lib/zend/Zend/Form/Decorator/Image.php b/lib/zend/Zend/Form/Decorator/Image.php new file mode 100644 index 0000000000..f53ca072ef --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Image.php @@ -0,0 +1,154 @@ +_tag = (string) $tag; + return $this; + } + + /** + * Get HTML tag, if any, with which to surround label + * + * @return void + */ + public function getTag() + { + if (null === $this->_tag) { + $tag = $this->getOption('tag'); + if (null !== $tag) { + $this->removeOption('tag'); + $this->setTag($tag); + } + return $tag; + } + + return $this->_tag; + } + + /** + * Get attributes to pass to image helper + * + * @return array + */ + public function getAttribs() + { + $attribs = $this->getOptions(); + + if (null !== ($element = $this->getElement())) { + $attribs['alt'] = $element->getLabel(); + $attribs = array_merge($attribs, $element->getAttribs()); + } + + foreach ($this->_attribBlacklist as $key) { + if (array_key_exists($key, $attribs)) { + unset($attribs[$key]); + } + } + + return $attribs; + } + + /** + * Render a form image + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $tag = $this->getTag(); + $placement = $this->getPlacement(); + $separator = $this->getSeparator(); + $name = $element->getFullyQualifiedName(); + $attribs = $this->getAttribs(); + $attribs['id'] = $element->getId(); + + $image = $view->formImage($name, $element->getImageValue(), $attribs); + + if (null !== $tag) { + require_once 'Zend/Form/Decorator/HtmlTag.php'; + $decorator = new Zend_Form_Decorator_HtmlTag(); + $decorator->setOptions(array('tag' => $tag)); + $image = $decorator->render($image); + } + + switch ($placement) { + case self::PREPEND: + return $image . $separator . $content; + case self::APPEND: + default: + return $content . $separator . $image; + } + } +} diff --git a/lib/zend/Zend/Form/Decorator/Interface.php b/lib/zend/Zend/Form/Decorator/Interface.php new file mode 100644 index 0000000000..e2c6d20d55 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Interface.php @@ -0,0 +1,123 @@ +setOption('id', $id); + return $this; + } + + /** + * Retrieve element ID (used in 'for' attribute) + * + * If none set in decorator, looks first for element 'id' attribute, and + * defaults to element name. + * + * @return string + */ + public function getId() + { + $id = $this->getOption('id'); + if (null === $id) { + if (null !== ($element = $this->getElement())) { + $id = $element->getId(); + $this->setId($id); + } + } + + return $id; + } + + /** + * Set HTML tag with which to surround label + * + * @param string $tag + * @return Zend_Form_Decorator_Label + */ + public function setTag($tag) + { + if (empty($tag)) { + $this->_tag = null; + } else { + $this->_tag = (string) $tag; + } + return $this; + } + + /** + * Get HTML tag, if any, with which to surround label + * + * @return void + */ + public function getTag() + { + if (null === $this->_tag) { + $tag = $this->getOption('tag'); + if (null !== $tag) { + $this->removeOption('tag'); + $this->setTag($tag); + } + return $tag; + } + + return $this->_tag; + } + + /** + * Get class with which to define label + * + * Appends either 'optional' or 'required' to class, depending on whether + * or not the element is required. + * + * @return string + */ + public function getClass() + { + $class = ''; + $element = $this->getElement(); + + $decoratorClass = $this->getOption('class'); + if (!empty($decoratorClass)) { + $class .= ' ' . $decoratorClass; + } + + $type = $element->isRequired() ? 'required' : 'optional'; + + if (!strstr($class, $type)) { + $class .= ' ' . $type; + $class = trim($class); + } + + return $class; + } + + /** + * Load an optional/required suffix/prefix key + * + * @param string $key + * @return void + */ + protected function _loadOptReqKey($key) + { + if (!isset($this->$key)) { + $value = $this->getOption($key); + $this->$key = (string) $value; + if (null !== $value) { + $this->removeOption($key); + } + } + } + + /** + * Overloading + * + * Currently overloads: + * + * - getOpt(ional)Prefix() + * - getOpt(ional)Suffix() + * - getReq(uired)Prefix() + * - getReq(uired)Suffix() + * - setOpt(ional)Prefix() + * - setOpt(ional)Suffix() + * - setReq(uired)Prefix() + * - setReq(uired)Suffix() + * + * @param string $method + * @param array $args + * @return mixed + * @throws Zend_Form_Exception for unsupported methods + */ + public function __call($method, $args) + { + $tail = substr($method, -6); + $head = substr($method, 0, 3); + if (in_array($head, array('get', 'set')) + && (('Prefix' == $tail) || ('Suffix' == $tail)) + ) { + $position = substr($method, -6); + $type = strtolower(substr($method, 3, 3)); + switch ($type) { + case 'req': + $key = 'required' . $position; + break; + case 'opt': + $key = 'optional' . $position; + break; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid method "%s" called in Label decorator, and detected as type %s', $method, $type)); + } + + switch ($head) { + case 'set': + if (0 === count($args)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Method "%s" requires at least one argument; none provided', $method)); + } + $value = array_shift($args); + $this->$key = $value; + return $this; + case 'get': + default: + if (null === ($element = $this->getElement())) { + $this->_loadOptReqKey($key); + } elseif (isset($element->$key)) { + $this->$key = (string) $element->$key; + } else { + $this->_loadOptReqKey($key); + } + return $this->$key; + } + } + + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid method "%s" called in Label decorator', $method)); + } + + /** + * Get label to render + * + * @return void + */ + public function getLabel() + { + if (null === ($element = $this->getElement())) { + return ''; + } + + $label = $element->getLabel(); + $label = trim($label); + + if (empty($label)) { + return ''; + } + + if (null !== ($translator = $element->getTranslator())) { + $label = $translator->translate($label); + } + + $optPrefix = $this->getOptPrefix(); + $optSuffix = $this->getOptSuffix(); + $reqPrefix = $this->getReqPrefix(); + $reqSuffix = $this->getReqSuffix(); + $separator = $this->getSeparator(); + + if (!empty($label)) { + if ($element->isRequired()) { + $label = $reqPrefix . $label . $reqSuffix; + } else { + $label = $optPrefix . $label . $optSuffix; + } + } + + return $label; + } + + + /** + * Render a label + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $label = $this->getLabel(); + $separator = $this->getSeparator(); + $placement = $this->getPlacement(); + $tag = $this->getTag(); + $id = $this->getId(); + $class = $this->getClass(); + $options = $this->getOptions(); + + + if (empty($label) && empty($tag)) { + return $content; + } + + if (!empty($label)) { + $options['class'] = $class; + $label = $view->formLabel($element->getFullyQualifiedName(), trim($label), $options); + } else { + $label = ' '; + } + + if (null !== $tag) { + require_once 'Zend/Form/Decorator/HtmlTag.php'; + $decorator = new Zend_Form_Decorator_HtmlTag(); + $decorator->setOptions(array('tag' => $tag, + 'id' => $this->getElement()->getName() . '-label')); + + $label = $decorator->render($label); + } + + switch ($placement) { + case self::APPEND: + return $content . $separator . $label; + case self::PREPEND: + return $label . $separator . $content; + } + } +} diff --git a/lib/zend/Zend/Form/Decorator/Marker/File/Interface.php b/lib/zend/Zend/Form/Decorator/Marker/File/Interface.php new file mode 100644 index 0000000000..ef51a9f023 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Marker/File/Interface.php @@ -0,0 +1,33 @@ +getElement(); + if ((!$form instanceof Zend_Form) && (!$form instanceof Zend_Form_DisplayGroup)) { + return $content; + } + + $this->_recursivelyPrepareForm($form); + + return $content; + } + + protected function _recursivelyPrepareForm(Zend_Form $form) + { + $belongsTo = ($form instanceof Zend_Form) ? $form->getElementsBelongTo() : null; + $elementContent = ''; + $separator = $this->getSeparator(); + $translator = $form->getTranslator(); + $view = $form->getView(); + + foreach ($form as $item) { + $item->setView($view) + ->setTranslator($translator); + if ($item instanceof Zend_Form_Element) { + $item->setBelongsTo($belongsTo); + } elseif (!empty($belongsTo) && ($item instanceof Zend_Form)) { + if ($item->isArray()) { + $name = $this->mergeBelongsTo($belongsTo, $item->getElementsBelongTo()); + $item->setElementsBelongTo($name, true); + } else { + $item->setElementsBelongTo($belongsTo, true); + } + $this->_recursivelyPrepareForm($item); + } elseif (!empty($belongsTo) && ($item instanceof Zend_Form_DisplayGroup)) { + foreach ($item as $element) { + $element->setBelongsTo($belongsTo); + } + } + } + } +} diff --git a/lib/zend/Zend/Form/Decorator/Tooltip.php b/lib/zend/Zend/Form/Decorator/Tooltip.php new file mode 100644 index 0000000000..1ea94d4383 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/Tooltip.php @@ -0,0 +1,58 @@ +getElement()->getAttrib('title'))) { + if (null !== ($translator = $this->getElement()->getTranslator())) { + $title = $translator->translate($title); + } + } + + $this->getElement()->setAttrib('title', $title); + return $content; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Form/Decorator/ViewHelper.php b/lib/zend/Zend/Form/Decorator/ViewHelper.php new file mode 100644 index 0000000000..8647fd6693 --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/ViewHelper.php @@ -0,0 +1,256 @@ +_helper = (string) $helper; + return $this; + } + + /** + * Retrieve view helper for rendering element + * + * @return string + */ + public function getHelper() + { + if (null === $this->_helper) { + $options = $this->getOptions(); + if (isset($options['helper'])) { + $this->setHelper($options['helper']); + $this->removeOption('helper'); + } else { + $element = $this->getElement(); + if (null !== $element) { + if (null !== ($helper = $element->getAttrib('helper'))) { + $this->setHelper($helper); + } else { + $type = $element->getType(); + if ($pos = strrpos($type, '_')) { + $type = substr($type, $pos + 1); + } + $this->setHelper('form' . ucfirst($type)); + } + } + } + } + + return $this->_helper; + } + + /** + * Get name + * + * If element is a Zend_Form_Element, will attempt to namespace it if the + * element belongs to an array. + * + * @return string + */ + public function getName() + { + if (null === ($element = $this->getElement())) { + return ''; + } + + $name = $element->getName(); + + if (!$element instanceof Zend_Form_Element) { + return $name; + } + + if (null !== ($belongsTo = $element->getBelongsTo())) { + $name = $belongsTo . '[' + . $name + . ']'; + } + + if ($element->isArray()) { + $name .= '[]'; + } + + return $name; + } + + /** + * Retrieve element attributes + * + * Set id to element name and/or array item. + * + * @return array + */ + public function getElementAttribs() + { + if (null === ($element = $this->getElement())) { + return null; + } + + $attribs = $element->getAttribs(); + if (isset($attribs['helper'])) { + unset($attribs['helper']); + } + + if (method_exists($element, 'getSeparator')) { + if (null !== ($listsep = $element->getSeparator())) { + $attribs['listsep'] = $listsep; + } + } + + if (isset($attribs['id'])) { + return $attribs; + } + + $id = $element->getName(); + + if ($element instanceof Zend_Form_Element) { + if (null !== ($belongsTo = $element->getBelongsTo())) { + $belongsTo = preg_replace('/\[([^\]]+)\]/', '-$1', $belongsTo); + $id = $belongsTo . '-' . $id; + } + } + + $element->setAttrib('id', $id); + $attribs['id'] = $id; + + return $attribs; + } + + /** + * Get value + * + * If element type is one of the button types, returns the label. + * + * @param Zend_Form_Element $element + * @return string|null + */ + public function getValue($element) + { + if (!$element instanceof Zend_Form_Element) { + return null; + } + + foreach ($this->_buttonTypes as $type) { + if ($element instanceof $type) { + if (stristr($type, 'button')) { + $element->content = $element->getLabel(); + return null; + } + return $element->getLabel(); + } + } + + return $element->getValue(); + } + + /** + * Render an element using a view helper + * + * Determine view helper from 'viewHelper' option, or, if none set, from + * the element type. Then call as + * helper($element->getName(), $element->getValue(), $element->getAttribs()) + * + * @param string $content + * @return string + * @throws Zend_Form_Decorator_Exception if element or view are not registered + */ + public function render($content) + { + $element = $this->getElement(); + + $view = $element->getView(); + if (null === $view) { + require_once 'Zend/Form/Decorator/Exception.php'; + throw new Zend_Form_Decorator_Exception('ViewHelper decorator cannot render without a registered view object'); + } + + if (method_exists($element, 'getMultiOptions')) { + $element->getMultiOptions(); + } + + $helper = $this->getHelper(); + $separator = $this->getSeparator(); + $value = $this->getValue($element); + $attribs = $this->getElementAttribs(); + $name = $element->getFullyQualifiedName(); + $id = $element->getId(); + $attribs['id'] = $id; + + $helperObject = $view->getHelper($helper); + if (method_exists($helperObject, 'setTranslator')) { + $helperObject->setTranslator($element->getTranslator()); + } + + $elementContent = $view->$helper($name, $value, $attribs, $element->options); + switch ($this->getPlacement()) { + case self::APPEND: + return $content . $separator . $elementContent; + case self::PREPEND: + return $elementContent . $separator . $content; + default: + return $elementContent; + } + } +} diff --git a/lib/zend/Zend/Form/Decorator/ViewScript.php b/lib/zend/Zend/Form/Decorator/ViewScript.php new file mode 100644 index 0000000000..73702905fe --- /dev/null +++ b/lib/zend/Zend/Form/Decorator/ViewScript.php @@ -0,0 +1,144 @@ + + * // in view script: + * echo $this->element->getLabel(); + * + * + * Any options other than separator, placement, and viewScript are passed to + * the partial as local variables. + * + * @category Zend + * @package Zend_Form + * @subpackage Decorator + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ +class Zend_Form_Decorator_ViewScript extends Zend_Form_Decorator_Abstract +{ + /** + * Default placement: append + * @var string + */ + protected $_placement = 'APPEND'; + + /** + * View script to render + * @var string + */ + protected $_viewScript; + + /** + * Set view script + * + * @param string $script + * @return Zend_Form_Decorator_ViewScript + */ + public function setViewScript($script) + { + $this->_viewScript = (string) $script; + return $this; + } + + /** + * Get view script + * + * @return string|null + */ + public function getViewScript() + { + if (null === $this->_viewScript) { + if (null !== ($element = $this->getElement())) { + if (null !== ($viewScript = $element->getAttrib('viewScript'))) { + $this->setViewScript($viewScript); + return $viewScript; + } + } + + if (null !== ($viewScript = $this->getOption('viewScript'))) { + $this->setViewScript($viewScript) + ->removeOption('viewScript'); + } + } + + return $this->_viewScript; + } + + /** + * Render a view script + * + * @param string $content + * @return string + */ + public function render($content) + { + $element = $this->getElement(); + $view = $element->getView(); + if (null === $view) { + return $content; + } + + $viewScript = $this->getViewScript(); + if (empty($viewScript)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('No view script registered with ViewScript decorator'); + } + + $separator = $this->getSeparator(); + $placement = $this->getPlacement(); + + $vars = $this->getOptions(); + $vars['element'] = $element; + $vars['content'] = $content; + $vars['decorator'] = $this; + + $renderedContent = $view->partial($viewScript, $vars); + + // Get placement again to see if it has changed + $placement = $this->getPlacement(); + + switch ($placement) { + case self::PREPEND: + return $renderedContent . $separator . $content; + case self::APPEND: + return $content . $separator . $renderedContent; + default: + return $renderedContent; + } + } +} diff --git a/lib/zend/Zend/Form/DisplayGroup.php b/lib/zend/Zend/Form/DisplayGroup.php new file mode 100644 index 0000000000..fea4f01035 --- /dev/null +++ b/lib/zend/Zend/Form/DisplayGroup.php @@ -0,0 +1,1126 @@ +setName($name); + + $this->setPluginLoader($loader); + + if (is_array($options)) { + $this->setOptions($options); + } elseif ($options instanceof Zend_Config) { + $this->setConfig($options); + } + + // Extensions... + $this->init(); + + $this->loadDefaultDecorators(); + } + + /** + * Initialize object; used by extending classes + * + * @return void + */ + public function init() + { + } + + /** + * Set options + * + * @param array $options + * @return Zend_Form_DisplayGroup + */ + public function setOptions(array $options) + { + $forbidden = array( + 'Options', 'Config', 'PluginLoader', 'View', + 'Translator', 'Attrib' + ); + foreach ($options as $key => $value) { + $normalized = ucfirst($key); + + if (in_array($normalized, $forbidden)) { + continue; + } + + $method = 'set' . $normalized; + if (method_exists($this, $method)) { + $this->$method($value); + } else { + $this->setAttrib($key, $value); + } + } + return $this; + } + + /** + * Set options from config object + * + * @param Zend_Config $config + * @return Zend_Form_DisplayGroup + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Set group attribute + * + * @param string $key + * @param mixed $value + * @return Zend_Form_DisplayGroup + */ + public function setAttrib($key, $value) + { + $key = (string) $key; + $this->_attribs[$key] = $value; + return $this; + } + + /** + * Add multiple form attributes at once + * + * @param array $attribs + * @return Zend_Form_DisplayGroup + */ + public function addAttribs(array $attribs) + { + foreach ($attribs as $key => $value) { + $this->setAttrib($key, $value); + } + return $this; + } + + /** + * Set multiple form attributes at once + * + * Overwrites any previously set attributes. + * + * @param array $attribs + * @return Zend_Form_DisplayGroup + */ + public function setAttribs(array $attribs) + { + $this->clearAttribs(); + return $this->addAttribs($attribs); + } + + /** + * Retrieve a single form attribute + * + * @param string $key + * @return mixed + */ + public function getAttrib($key) + { + $key = (string) $key; + if (!isset($this->_attribs[$key])) { + return null; + } + + return $this->_attribs[$key]; + } + + /** + * Retrieve all form attributes/metadata + * + * @return array + */ + public function getAttribs() + { + return $this->_attribs; + } + + /** + * Remove attribute + * + * @param string $key + * @return bool + */ + public function removeAttrib($key) + { + if (array_key_exists($key, $this->_attribs)) { + unset($this->_attribs[$key]); + return true; + } + + return false; + } + + /** + * Clear all form attributes + * + * @return Zend_Form + */ + public function clearAttribs() + { + $this->_attribs = array(); + return $this; + } + + /** + * Filter a name to only allow valid variable characters + * + * @param string $value + * @return string + */ + public function filterName($value) + { + return preg_replace('/[^a-zA-Z0-9_\x7f-\xff]/', '', (string) $value); + } + + /** + * Set group name + * + * @param string $name + * @return Zend_Form_DisplayGroup + */ + public function setName($name) + { + $name = $this->filtername($name); + if (('0' !== $name) && empty($name)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid name provided; must contain only valid variable characters and be non-empty'); + } + + $this->_name = $name; + return $this; + } + + /** + * Retrieve group name + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Get fully qualified name + * + * Places name as subitem of array and/or appends brackets. + * + * @return string + */ + public function getFullyQualifiedName() + { + return $this->getName(); + } + + /** + * Get element id + * + * @return string + */ + public function getId() + { + if (isset($this->id)) { + return $this->id; + } + + $id = $this->getFullyQualifiedName(); + + // Bail early if no array notation detected + if (!strstr($id, '[')) { + return $id; + } + + // Strip array notation + if ('[]' == substr($id, -2)) { + $id = substr($id, 0, strlen($id) - 2); + } + $id = str_replace('][', '-', $id); + $id = str_replace(array(']', '['), '-', $id); + $id = trim($id, '-'); + + return $id; + } + + /** + * Set group legend + * + * @param string $legend + * @return Zend_Form_DisplayGroup + */ + public function setLegend($legend) + { + return $this->setAttrib('legend', (string) $legend); + } + + /** + * Retrieve group legend + * + * @return string + */ + public function getLegend() + { + return $this->getAttrib('legend'); + } + + /** + * Set description + * + * @param string $value + * @return Zend_Form_DisplayGroup + */ + public function setDescription($value) + { + $this->_description = (string) $value; + return $this; + } + + /** + * Get description + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Set group order + * + * @param int $order + * @return Zend_Form_Element + */ + public function setOrder($order) + { + $this->_order = (int) $order; + return $this; + } + + /** + * Retrieve group order + * + * @return int + */ + public function getOrder() + { + return $this->_order; + } + + // Elements + + /** + * Add element to stack + * + * @param Zend_Form_Element $element + * @return Zend_Form_DisplayGroup + */ + public function addElement(Zend_Form_Element $element) + { + $this->_elements[$element->getName()] = $element; + $this->_groupUpdated = true; + return $this; + } + + /** + * Add multiple elements at once + * + * @param array $elements + * @return Zend_Form_DisplayGroup + * @throws Zend_Form_Exception if any element is not a Zend_Form_Element + */ + public function addElements(array $elements) + { + foreach ($elements as $element) { + if (!$element instanceof Zend_Form_Element) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('elements passed via array to addElements() must be Zend_Form_Elements only'); + } + $this->addElement($element); + } + return $this; + } + + /** + * Set multiple elements at once (overwrites) + * + * @param array $elements + * @return Zend_Form_DisplayGroup + */ + public function setElements(array $elements) + { + $this->clearElements(); + return $this->addElements($elements); + } + + /** + * Retrieve element + * + * @param string $name + * @return Zend_Form_Element|null + */ + public function getElement($name) + { + $name = (string) $name; + if (isset($this->_elements[$name])) { + return $this->_elements[$name]; + } + + return null; + } + + /** + * Retrieve elements + * @return array + */ + public function getElements() + { + return $this->_elements; + } + + /** + * Remove a single element + * + * @param string $name + * @return boolean + */ + public function removeElement($name) + { + $name = (string) $name; + if (array_key_exists($name, $this->_elements)) { + unset($this->_elements[$name]); + $this->_groupUpdated = true; + return true; + } + + return false; + } + + /** + * Remove all elements + * + * @return Zend_Form_DisplayGroup + */ + public function clearElements() + { + $this->_elements = array(); + $this->_groupUpdated = true; + return $this; + } + + // Plugin loader (for decorators) + + /** + * Set plugin loader + * + * @param Zend_Loader_PluginLoader $loader + * @return Zend_Form_DisplayGroup + */ + public function setPluginLoader(Zend_Loader_PluginLoader $loader) + { + $this->_loader = $loader; + return $this; + } + + /** + * Retrieve plugin loader + * + * @return Zend_Loader_PluginLoader + */ + public function getPluginLoader() + { + return $this->_loader; + } + + /** + * Add a prefix path for the plugin loader + * + * @param string $prefix + * @param string $path + * @return Zend_Form_DisplayGroup + */ + public function addPrefixPath($prefix, $path) + { + $this->getPluginLoader()->addPrefixPath($prefix, $path); + return $this; + } + + /** + * Add several prefix paths at once + * + * @param array $spec + * @return Zend_Form_DisplayGroup + */ + public function addPrefixPaths(array $spec) + { + if (isset($spec['prefix']) && isset($spec['path'])) { + return $this->addPrefixPath($spec['prefix'], $spec['path']); + } + foreach ($spec as $prefix => $paths) { + if (is_numeric($prefix) && is_array($paths)) { + $prefix = null; + if (isset($paths['prefix']) && isset($paths['path'])) { + $this->addPrefixPath($paths['prefix'], $paths['path']); + } + } elseif (!is_numeric($prefix)) { + if (is_string($paths)) { + $this->addPrefixPath($prefix, $paths); + } elseif (is_array($paths)) { + foreach ($paths as $path) { + $this->addPrefixPath($prefix, $path); + } + } + } + } + return $this; + } + + // Decorators + + /** + * Set flag to disable loading default decorators + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setDisableLoadDefaultDecorators($flag) + { + $this->_disableLoadDefaultDecorators = (bool) $flag; + return $this; + } + + /** + * Should we load the default decorators? + * + * @return bool + */ + public function loadDefaultDecoratorsIsDisabled() + { + return $this->_disableLoadDefaultDecorators; + } + + /** + * Load default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('FormElements') + ->addDecorator('HtmlTag', array('tag' => 'dl')) + ->addDecorator('Fieldset') + ->addDecorator('DtDdWrapper'); + } + } + + /** + * Instantiate a decorator based on class name or class name fragment + * + * @param string $name + * @param null|array $options + * @return Zend_Form_Decorator_Interface + */ + protected function _getDecorator($name, $options = null) + { + $class = $this->getPluginLoader()->load($name); + if (null === $options) { + $decorator = new $class; + } else { + $decorator = new $class($options); + } + + return $decorator; + } + + /** + * Add a decorator for rendering the group + * + * @param string|Zend_Form_Decorator_Interface $decorator + * @param array|Zend_Config $options Options with which to initialize decorator + * @return Zend_Form_DisplayGroup + */ + public function addDecorator($decorator, $options = null) + { + if ($decorator instanceof Zend_Form_Decorator_Interface) { + $name = get_class($decorator); + } elseif (is_string($decorator)) { + $name = $decorator; + $decorator = array( + 'decorator' => $name, + 'options' => $options, + ); + } elseif (is_array($decorator)) { + foreach ($decorator as $name => $spec) { + break; + } + if (is_numeric($name)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid alias provided to addDecorator; must be alphanumeric string'); + } + if (is_string($spec)) { + $decorator = array( + 'decorator' => $spec, + 'options' => $options, + ); + } elseif ($spec instanceof Zend_Form_Decorator_Interface) { + $decorator = $spec; + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid decorator provided to addDecorator; must be string or Zend_Form_Decorator_Interface'); + } + + $this->_decorators[$name] = $decorator; + + return $this; + } + + /** + * Add many decorators at once + * + * @param array $decorators + * @return Zend_Form_DisplayGroup + */ + public function addDecorators(array $decorators) + { + foreach ($decorators as $decoratorInfo) { + if (is_string($decoratorInfo)) { + $this->addDecorator($decoratorInfo); + } elseif ($decoratorInfo instanceof Zend_Form_Decorator_Interface) { + $this->addDecorator($decoratorInfo); + } elseif (is_array($decoratorInfo)) { + $argc = count($decoratorInfo); + $options = array(); + if (isset($decoratorInfo['decorator'])) { + $decorator = $decoratorInfo['decorator']; + if (isset($decoratorInfo['options'])) { + $options = $decoratorInfo['options']; + } + $this->addDecorator($decorator, $options); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $decorator = array_shift($decoratorInfo); + case (2 <= $argc): + $options = array_shift($decoratorInfo); + default: + $this->addDecorator($decorator, $options); + break; + } + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid decorator passed to addDecorators()'); + } + } + + return $this; + } + + /** + * Overwrite all decorators + * + * @param array $decorators + * @return Zend_Form_DisplayGroup + */ + public function setDecorators(array $decorators) + { + $this->clearDecorators(); + return $this->addDecorators($decorators); + } + + /** + * Retrieve a registered decorator + * + * @param string $name + * @return false|Zend_Form_Decorator_Abstract + */ + public function getDecorator($name) + { + if (!isset($this->_decorators[$name])) { + $len = strlen($name); + foreach ($this->_decorators as $localName => $decorator) { + if ($len > strlen($localName)) { + continue; + } + + if (0 === substr_compare($localName, $name, -$len, $len, true)) { + if (is_array($decorator)) { + return $this->_loadDecorator($decorator, $localName); + } + return $decorator; + } + } + return false; + } + + if (is_array($this->_decorators[$name])) { + return $this->_loadDecorator($this->_decorators[$name], $name); + } + + return $this->_decorators[$name]; + } + + /** + * Retrieve all decorators + * + * @return array + */ + public function getDecorators() + { + foreach ($this->_decorators as $key => $value) { + if (is_array($value)) { + $this->_loadDecorator($value, $key); + } + } + return $this->_decorators; + } + + /** + * Remove a single decorator + * + * @param string $name + * @return bool + */ + public function removeDecorator($name) + { + $decorator = $this->getDecorator($name); + if ($decorator) { + if (array_key_exists($name, $this->_decorators)) { + unset($this->_decorators[$name]); + } else { + $class = get_class($decorator); + unset($this->_decorators[$class]); + } + return true; + } + + return false; + } + + /** + * Clear all decorators + * + * @return Zend_Form_DisplayGroup + */ + public function clearDecorators() + { + $this->_decorators = array(); + return $this; + } + + /** + * Set view + * + * @param Zend_View_Interface $view + * @return Zend_Form_DisplayGroup + */ + public function setView(Zend_View_Interface $view = null) + { + $this->_view = $view; + return $this; + } + + /** + * Retrieve view + * + * @return Zend_View_Interface + */ + public function getView() + { + if (null === $this->_view) { + require_once 'Zend/Controller/Action/HelperBroker.php'; + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + $this->setView($viewRenderer->view); + } + + return $this->_view; + } + + /** + * Render display group + * + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + if (null !== $view) { + $this->setView($view); + } + $content = ''; + foreach ($this->getDecorators() as $decorator) { + $decorator->setElement($this); + $content = $decorator->render($content); + } + return $content; + } + + /** + * String representation of group + * + * @return string + */ + public function __toString() + { + try { + $return = $this->render(); + return $return; + } catch (Exception $e) { + trigger_error($e->getMessage(), E_USER_WARNING); + return ''; + } + } + + /** + * Set translator object + * + * @param Zend_Translate|Zend_Translate_Adapter|null $translator + * @return Zend_Form_DisplayGroup + */ + public function setTranslator($translator = null) + { + if ((null === $translator) || ($translator instanceof Zend_Translate_Adapter)) { + $this->_translator = $translator; + } elseif ($translator instanceof Zend_Translate) { + $this->_translator = $translator->getAdapter(); + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid translator specified'); + } + return $this; + } + + /** + * Retrieve translator object + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if ($this->translatorIsDisabled()) { + return null; + } + + if (null === $this->_translator) { + require_once 'Zend/Form.php'; + return Zend_Form::getDefaultTranslator(); + } + + return $this->_translator; + } + + /** + * Indicate whether or not translation should be disabled + * + * @param bool $flag + * @return Zend_Form_DisplayGroup + */ + public function setDisableTranslator($flag) + { + $this->_translatorDisabled = (bool) $flag; + return $this; + } + + /** + * Is translation disabled? + * + * @return bool + */ + public function translatorIsDisabled() + { + return $this->_translatorDisabled; + } + + /** + * Overloading: allow rendering specific decorators + * + * Call renderDecoratorName() to render a specific decorator. + * + * @param string $method + * @param array $args + * @return string + * @throws Zend_Form_Exception for invalid decorator or invalid method call + */ + public function __call($method, $args) + { + if ('render' == substr($method, 0, 6)) { + $decoratorName = substr($method, 6); + if (false !== ($decorator = $this->getDecorator($decoratorName))) { + $decorator->setElement($this); + $seed = ''; + if (0 < count($args)) { + $seed = array_shift($args); + } + return $decorator->render($seed); + } + + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Decorator by name %s does not exist', $decoratorName)); + } + + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Method %s does not exist', $method)); + } + + // Interfaces: Iterator, Countable + + /** + * Current element + * + * @return Zend_Form_Element + */ + public function current() + { + $this->_sort(); + current($this->_elementOrder); + $key = key($this->_elementOrder); + return $this->getElement($key); + } + + /** + * Current element + * + * @return string + */ + public function key() + { + $this->_sort(); + return key($this->_elementOrder); + } + + /** + * Move pointer to next element + * + * @return void + */ + public function next() + { + $this->_sort(); + next($this->_elementOrder); + } + + /** + * Move pointer to beginning of element loop + * + * @return void + */ + public function rewind() + { + $this->_sort(); + reset($this->_elementOrder); + } + + /** + * Determine if current element/subform/display group is valid + * + * @return bool + */ + public function valid() + { + $this->_sort(); + return (current($this->_elementOrder) !== false); + } + + /** + * Count of elements/subforms that are iterable + * + * @return int + */ + public function count() + { + return count($this->_elements); + } + + /** + * Sort items according to their order + * + * @return void + */ + protected function _sort() + { + if ($this->_groupUpdated || !is_array($this->_elementOrder)) { + $elementOrder = array(); + foreach ($this->getElements() as $key => $element) { + $elementOrder[$key] = $element->getOrder(); + } + + $items = array(); + $index = 0; + foreach ($elementOrder as $key => $order) { + if (null === $order) { + while (array_search($index, $elementOrder, true)) { + ++$index; + } + $items[$index] = $key; + ++$index; + } else { + $items[$order] = $key; + } + } + + $items = array_flip($items); + asort($items); + $this->_elementOrder = $items; + $this->_groupUpdated = false; + } + } + + /** + * Lazy-load a decorator + * + * @param array $decorator Decorator type and options + * @param mixed $name Decorator name or alias + * @return Zend_Form_Decorator_Interface + */ + protected function _loadDecorator(array $decorator, $name) + { + $sameName = false; + if ($name == $decorator['decorator']) { + $sameName = true; + } + + $instance = $this->_getDecorator($decorator['decorator'], $decorator['options']); + if ($sameName) { + $newName = get_class($instance); + $decoratorNames = array_keys($this->_decorators); + $order = array_flip($decoratorNames); + $order[$newName] = $order[$name]; + $decoratorsExchange = array(); + unset($order[$name]); + asort($order); + foreach ($order as $key => $index) { + if ($key == $newName) { + $decoratorsExchange[$key] = $instance; + continue; + } + $decoratorsExchange[$key] = $this->_decorators[$key]; + } + $this->_decorators = $decoratorsExchange; + } else { + $this->_decorators[$name] = $instance; + } + + return $instance; + } +} diff --git a/lib/zend/Zend/Form/Element.php b/lib/zend/Zend/Form/Element.php new file mode 100644 index 0000000000..6a1681425a --- /dev/null +++ b/lib/zend/Zend/Form/Element.php @@ -0,0 +1,2136 @@ +setName($spec); + } elseif (is_array($spec)) { + $this->setOptions($spec); + } elseif ($spec instanceof Zend_Config) { + $this->setConfig($spec); + } + + if (is_string($spec) && is_array($options)) { + $this->setOptions($options); + } elseif (is_string($spec) && ($options instanceof Zend_Config)) { + $this->setConfig($options); + } + + if (null === $this->getName()) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Zend_Form_Element requires each element to have a name'); + } + + /** + * Extensions + */ + $this->init(); + + /** + * Register ViewHelper decorator by default + */ + $this->loadDefaultDecorators(); + } + + /** + * Initialize object; used by extending classes + * + * @return void + */ + public function init() + { + } + + /** + * Set flag to disable loading default decorators + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setDisableLoadDefaultDecorators($flag) + { + $this->_disableLoadDefaultDecorators = (bool) $flag; + return $this; + } + + /** + * Should we load the default decorators? + * + * @return bool + */ + public function loadDefaultDecoratorsIsDisabled() + { + return $this->_disableLoadDefaultDecorators; + } + + /** + * Load default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('ViewHelper') + ->addDecorator('Errors') + ->addDecorator('Description', array('tag' => 'p', 'class' => 'description')) + ->addDecorator('HtmlTag', array('tag' => 'dd', + 'id' => $this->getName() . '-element')) + ->addDecorator('Label', array('tag' => 'dt')); + } + } + + /** + * Set object state from options array + * + * @param array $options + * @return Zend_Form_Element + */ + public function setOptions(array $options) + { + if (isset($options['prefixPath'])) { + $this->addPrefixPaths($options['prefixPath']); + unset($options['prefixPath']); + } + + if (isset($options['disableTranslator'])) { + $this->setDisableTranslator($options['disableTranslator']); + unset($options['disableTranslator']); + } + + unset($options['options']); + unset($options['config']); + + foreach ($options as $key => $value) { + $method = 'set' . ucfirst($key); + + if (in_array($method, array('setTranslator', 'setPluginLoader', 'setView'))) { + if (!is_object($value)) { + continue; + } + } + + if (method_exists($this, $method)) { + // Setter exists; use it + $this->$method($value); + } else { + // Assume it's metadata + $this->setAttrib($key, $value); + } + } + return $this; + } + + /** + * Set object state from Zend_Config object + * + * @param Zend_Config $config + * @return Zend_Form_Element + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + + // Localization: + + /** + * Set translator object for localization + * + * @param Zend_Translate|null $translator + * @return Zend_Form_Element + */ + public function setTranslator($translator = null) + { + if (null === $translator) { + $this->_translator = null; + } elseif ($translator instanceof Zend_Translate_Adapter) { + $this->_translator = $translator; + } elseif ($translator instanceof Zend_Translate) { + $this->_translator = $translator->getAdapter(); + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid translator specified'); + } + return $this; + } + + /** + * Retrieve localization translator object + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if ($this->translatorIsDisabled()) { + return null; + } + + if (null === $this->_translator) { + require_once 'Zend/Form.php'; + return Zend_Form::getDefaultTranslator(); + } + return $this->_translator; + } + + /** + * Indicate whether or not translation should be disabled + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setDisableTranslator($flag) + { + $this->_translatorDisabled = (bool) $flag; + return $this; + } + + /** + * Is translation disabled? + * + * @return bool + */ + public function translatorIsDisabled() + { + return $this->_translatorDisabled; + } + + // Metadata + + /** + * Filter a name to only allow valid variable characters + * + * @param string $value + * @param bool $allowBrackets + * @return string + */ + public function filterName($value, $allowBrackets = false) + { + $charset = '^a-zA-Z0-9_\x7f-\xff'; + if ($allowBrackets) { + $charset .= '\[\]'; + } + return preg_replace('/[' . $charset . ']/', '', (string) $value); + } + + /** + * Set element name + * + * @param string $name + * @return Zend_Form_Element + */ + public function setName($name) + { + $name = $this->filterName($name); + if ('' === $name) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid name provided; must contain only valid variable characters and be non-empty'); + } + + $this->_name = $name; + return $this; + } + + /** + * Return element name + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Get fully qualified name + * + * Places name as subitem of array and/or appends brackets. + * + * @return string + */ + public function getFullyQualifiedName() + { + $name = $this->getName(); + + if (null !== ($belongsTo = $this->getBelongsTo())) { + $name = $belongsTo . '[' . $name . ']'; + } + + if ($this->isArray()) { + $name .= '[]'; + } + + return $name; + } + + /** + * Get element id + * + * @return string + */ + public function getId() + { + if (isset($this->id)) { + return $this->id; + } + + $id = $this->getFullyQualifiedName(); + + // Bail early if no array notation detected + if (!strstr($id, '[')) { + return $id; + } + + // Strip array notation + if ('[]' == substr($id, -2)) { + $id = substr($id, 0, strlen($id) - 2); + } + $id = str_replace('][', '-', $id); + $id = str_replace(array(']', '['), '-', $id); + $id = trim($id, '-'); + + return $id; + } + + /** + * Set element value + * + * @param mixed $value + * @return Zend_Form_Element + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Filter a value + * + * @param string $value + * @param string $key + * @return void + */ + protected function _filterValue(&$value, &$key) + { + foreach ($this->getFilters() as $filter) { + $value = $filter->filter($value); + } + } + + /** + * Retrieve filtered element value + * + * @return mixed + */ + public function getValue() + { + $valueFiltered = $this->_value; + + if ($this->isArray() && is_array($valueFiltered)) { + array_walk_recursive($valueFiltered, array($this, '_filterValue')); + } else { + $this->_filterValue($valueFiltered, $valueFiltered); + } + + return $valueFiltered; + } + + /** + * Retrieve unfiltered element value + * + * @return mixed + */ + public function getUnfilteredValue() + { + return $this->_value; + } + + /** + * Set element label + * + * @param string $label + * @return Zend_Form_Element + */ + public function setLabel($label) + { + $this->_label = (string) $label; + return $this; + } + + /** + * Retrieve element label + * + * @return string + */ + public function getLabel() + { + return $this->_label; + } + + /** + * Set element order + * + * @param int $order + * @return Zend_Form_Element + */ + public function setOrder($order) + { + $this->_order = (int) $order; + return $this; + } + + /** + * Retrieve element order + * + * @return int + */ + public function getOrder() + { + return $this->_order; + } + + /** + * Set required flag + * + * @param bool $flag Default value is true + * @return Zend_Form_Element + */ + public function setRequired($flag = true) + { + $this->_required = (bool) $flag; + return $this; + } + + /** + * Is the element required? + * + * @return bool + */ + public function isRequired() + { + return $this->_required; + } + + /** + * Set flag indicating whether a NotEmpty validator should be inserted when element is required + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setAutoInsertNotEmptyValidator($flag) + { + $this->_autoInsertNotEmptyValidator = (bool) $flag; + return $this; + } + + /** + * Get flag indicating whether a NotEmpty validator should be inserted when element is required + * + * @return bool + */ + public function autoInsertNotEmptyValidator() + { + return $this->_autoInsertNotEmptyValidator; + } + + /** + * Set element description + * + * @param string $description + * @return Zend_Form_Element + */ + public function setDescription($description) + { + $this->_description = (string) $description; + return $this; + } + + /** + * Retrieve element description + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Set 'allow empty' flag + * + * When the allow empty flag is enabled and the required flag is false, the + * element will validate with empty values. + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setAllowEmpty($flag) + { + $this->_allowEmpty = (bool) $flag; + return $this; + } + + /** + * Get 'allow empty' flag + * + * @return bool + */ + public function getAllowEmpty() + { + return $this->_allowEmpty; + } + + /** + * Set ignore flag (used when retrieving values at form level) + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setIgnore($flag) + { + $this->_ignore = (bool) $flag; + return $this; + } + + /** + * Get ignore flag (used when retrieving values at form level) + * + * @return bool + */ + public function getIgnore() + { + return $this->_ignore; + } + + /** + * Set flag indicating if element represents an array + * + * @param bool $flag + * @return Zend_Form_Element + */ + public function setIsArray($flag) + { + $this->_isArray = (bool) $flag; + return $this; + } + + /** + * Is the element representing an array? + * + * @return bool + */ + public function isArray() + { + return $this->_isArray; + } + + /** + * Set array to which element belongs + * + * @param string $array + * @return Zend_Form_Element + */ + public function setBelongsTo($array) + { + $array = $this->filterName($array, true); + if (!empty($array)) { + $this->_belongsTo = $array; + } + + return $this; + } + + /** + * Return array name to which element belongs + * + * @return string + */ + public function getBelongsTo() + { + return $this->_belongsTo; + } + + /** + * Return element type + * + * @return string + */ + public function getType() + { + if (null === $this->_type) { + $this->_type = get_class($this); + } + + return $this->_type; + } + + /** + * Set element attribute + * + * @param string $name + * @param mixed $value + * @return Zend_Form_Element + * @throws Zend_Form_Exception for invalid $name values + */ + public function setAttrib($name, $value) + { + $name = (string) $name; + if ('_' == $name[0]) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid attribute "%s"; must not contain a leading underscore', $name)); + } + + if (null === $value) { + unset($this->$name); + } else { + $this->$name = $value; + } + + return $this; + } + + /** + * Set multiple attributes at once + * + * @param array $attribs + * @return Zend_Form_Element + */ + public function setAttribs(array $attribs) + { + foreach ($attribs as $key => $value) { + $this->setAttrib($key, $value); + } + + return $this; + } + + /** + * Retrieve element attribute + * + * @param string $name + * @return string + */ + public function getAttrib($name) + { + $name = (string) $name; + if (isset($this->$name)) { + return $this->$name; + } + + return null; + } + + /** + * Return all attributes + * + * @return array + */ + public function getAttribs() + { + $attribs = get_object_vars($this); + foreach ($attribs as $key => $value) { + if ('_' == substr($key, 0, 1)) { + unset($attribs[$key]); + } + } + + return $attribs; + } + + /** + * Overloading: retrieve object property + * + * Prevents access to properties beginning with '_'. + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + if ('_' == $key[0]) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Cannot retrieve value for protected/private property "%s"', $key)); + } + + if (!isset($this->$key)) { + return null; + } + + return $this->$key; + } + + /** + * Overloading: set object property + * + * @param string $key + * @param mixed $value + * @return voide + */ + public function __set($key, $value) + { + $this->setAttrib($key, $value); + } + + /** + * Overloading: allow rendering specific decorators + * + * Call renderDecoratorName() to render a specific decorator. + * + * @param string $method + * @param array $args + * @return string + * @throws Zend_Form_Exception for invalid decorator or invalid method call + */ + public function __call($method, $args) + { + if ('render' == substr($method, 0, 6)) { + $decoratorName = substr($method, 6); + if (false !== ($decorator = $this->getDecorator($decoratorName))) { + $decorator->setElement($this); + $seed = ''; + if (0 < count($args)) { + $seed = array_shift($args); + } + return $decorator->render($seed); + } + + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception(sprintf('Decorator by name %s does not exist', $decoratorName)); + } + + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception(sprintf('Method %s does not exist', $method)); + } + + // Loaders + + /** + * Set plugin loader to use for validator or filter chain + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @param string $type 'decorator', 'filter', or 'validate' + * @return Zend_Form_Element + * @throws Zend_Form_Exception on invalid type + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type) + { + $type = strtoupper($type); + switch ($type) { + case self::DECORATOR: + case self::FILTER: + case self::VALIDATE: + $this->_loaders[$type] = $loader; + return $this; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid type "%s" provided to setPluginLoader()', $type)); + } + } + + /** + * Retrieve plugin loader for validator or filter chain + * + * Instantiates with default rules if none available for that type. Use + * 'decorator', 'filter', or 'validate' for $type. + * + * @param string $type + * @return Zend_Loader_PluginLoader + * @throws Zend_Loader_Exception on invalid type. + */ + public function getPluginLoader($type) + { + $type = strtoupper($type); + switch ($type) { + case self::FILTER: + case self::VALIDATE: + $prefixSegment = ucfirst(strtolower($type)); + $pathSegment = $prefixSegment; + case self::DECORATOR: + if (!isset($prefixSegment)) { + $prefixSegment = 'Form_Decorator'; + $pathSegment = 'Form/Decorator'; + } + if (!isset($this->_loaders[$type])) { + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loaders[$type] = new Zend_Loader_PluginLoader( + array('Zend_' . $prefixSegment . '_' => 'Zend/' . $pathSegment . '/') + ); + } + return $this->_loaders[$type]; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + } + + /** + * Add prefix path for plugin loader + * + * If no $type specified, assumes it is a base path for both filters and + * validators, and sets each according to the following rules: + * - decorators: $prefix = $prefix . '_Decorator' + * - filters: $prefix = $prefix . '_Filter' + * - validators: $prefix = $prefix . '_Validate' + * + * Otherwise, the path prefix is set on the appropriate plugin loader. + * + * @param string $prefix + * @param string $path + * @param string $type + * @return Zend_Form_Element + * @throws Zend_Form_Exception for invalid type + */ + public function addPrefixPath($prefix, $path, $type = null) + { + $type = strtoupper($type); + switch ($type) { + case self::DECORATOR: + case self::FILTER: + case self::VALIDATE: + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($prefix, $path); + return $this; + case null: + $prefix = rtrim($prefix, '_'); + $path = rtrim($path, DIRECTORY_SEPARATOR); + foreach (array(self::DECORATOR, self::FILTER, self::VALIDATE) as $type) { + $cType = ucfirst(strtolower($type)); + $pluginPath = $path . DIRECTORY_SEPARATOR . $cType . DIRECTORY_SEPARATOR; + $pluginPrefix = $prefix . '_' . $cType; + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($pluginPrefix, $pluginPath); + } + return $this; + default: + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Invalid type "%s" provided to getPluginLoader()', $type)); + } + } + + /** + * Add many prefix paths at once + * + * @param array $spec + * @return Zend_Form_Element + */ + public function addPrefixPaths(array $spec) + { + if (isset($spec['prefix']) && isset($spec['path'])) { + return $this->addPrefixPath($spec['prefix'], $spec['path']); + } + foreach ($spec as $type => $paths) { + if (is_numeric($type) && is_array($paths)) { + $type = null; + if (isset($paths['prefix']) && isset($paths['path'])) { + if (isset($paths['type'])) { + $type = $paths['type']; + } + $this->addPrefixPath($paths['prefix'], $paths['path'], $type); + } + } elseif (!is_numeric($type)) { + if (!isset($paths['prefix']) || !isset($paths['path'])) { + foreach ($paths as $prefix => $spec) { + if (is_array($spec)) { + foreach ($spec as $path) { + if (!is_string($path)) { + continue; + } + $this->addPrefixPath($prefix, $path, $type); + } + } elseif (is_string($spec)) { + $this->addPrefixPath($prefix, $spec, $type); + } + } + } else { + $this->addPrefixPath($paths['prefix'], $paths['path'], $type); + } + } + } + return $this; + } + + // Validation + + /** + * Add validator to validation chain + * + * Note: will overwrite existing validators if they are of the same class. + * + * @param string|Zend_Validate_Interface $validator + * @param bool $breakChainOnFailure + * @param array $options + * @return Zend_Form_Element + * @throws Zend_Form_Exception if invalid validator type + */ + public function addValidator($validator, $breakChainOnFailure = false, $options = array()) + { + if ($validator instanceof Zend_Validate_Interface) { + $name = get_class($validator); + + if (!isset($validator->zfBreakChainOnFailure)) { + $validator->zfBreakChainOnFailure = $breakChainOnFailure; + } + } elseif (is_string($validator)) { + $name = $validator; + $validator = array( + 'validator' => $validator, + 'breakChainOnFailure' => $breakChainOnFailure, + 'options' => $options, + ); + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid validator provided to addValidator; must be string or Zend_Validate_Interface'); + } + + + $this->_validators[$name] = $validator; + + return $this; + } + + /** + * Add multiple validators + * + * @param array $validators + * @return Zend_Form_Element + */ + public function addValidators(array $validators) + { + foreach ($validators as $validatorInfo) { + if (is_string($validatorInfo)) { + $this->addValidator($validatorInfo); + } elseif ($validatorInfo instanceof Zend_Validate_Interface) { + $this->addValidator($validatorInfo); + } elseif (is_array($validatorInfo)) { + $argc = count($validatorInfo); + $breakChainOnFailure = false; + $options = array(); + if (isset($validatorInfo['validator'])) { + $validator = $validatorInfo['validator']; + if (isset($validatorInfo['breakChainOnFailure'])) { + $breakChainOnFailure = $validatorInfo['breakChainOnFailure']; + } + if (isset($validatorInfo['options'])) { + $options = $validatorInfo['options']; + } + $this->addValidator($validator, $breakChainOnFailure, $options); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $validator = array_shift($validatorInfo); + case (2 <= $argc): + $breakChainOnFailure = array_shift($validatorInfo); + case (3 <= $argc): + $options = array_shift($validatorInfo); + default: + $this->addValidator($validator, $breakChainOnFailure, $options); + break; + } + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid validator passed to addValidators()'); + } + } + + return $this; + } + + /** + * Set multiple validators, overwriting previous validators + * + * @param array $validators + * @return Zend_Form_Element + */ + public function setValidators(array $validators) + { + $this->clearValidators(); + return $this->addValidators($validators); + } + + /** + * Retrieve a single validator by name + * + * @param string $name + * @return Zend_Validate_Interface|false False if not found, validator otherwise + */ + public function getValidator($name) + { + if (!isset($this->_validators[$name])) { + $len = strlen($name); + foreach ($this->_validators as $localName => $validator) { + if ($len > strlen($localName)) { + continue; + } + if (0 === substr_compare($localName, $name, -$len, $len, true)) { + if (is_array($validator)) { + return $this->_loadValidator($validator); + } + return $validator; + } + } + return false; + } + + if (is_array($this->_validators[$name])) { + return $this->_loadValidator($this->_validators[$name]); + } + + return $this->_validators[$name]; + } + + /** + * Retrieve all validators + * + * @return array + */ + public function getValidators() + { + $validators = array(); + foreach ($this->_validators as $key => $value) { + if ($value instanceof Zend_Validate_Interface) { + $validators[$key] = $value; + continue; + } + $validator = $this->_loadValidator($value); + $validators[get_class($validator)] = $validator; + } + return $validators; + } + + /** + * Remove a single validator by name + * + * @param string $name + * @return bool + */ + public function removeValidator($name) + { + if (isset($this->_validators[$name])) { + unset($this->_validators[$name]); + } else { + $len = strlen($name); + foreach (array_keys($this->_validators) as $validator) { + if ($len > strlen($validator)) { + continue; + } + if (0 === substr_compare($validator, $name, -$len, $len, true)) { + unset($this->_validators[$validator]); + break; + } + } + } + + return $this; + } + + /** + * Clear all validators + * + * @return Zend_Form_Element + */ + public function clearValidators() + { + $this->_validators = array(); + return $this; + } + + /** + * Validate element value + * + * If a translation adapter is registered, any error messages will be + * translated according to the current locale, using the given error code; + * if no matching translation is found, the original message will be + * utilized. + * + * Note: The *filtered* value is validated. + * + * @param mixed $value + * @param mixed $context + * @return boolean + */ + public function isValid($value, $context = null) + { + $this->setValue($value); + $value = $this->getValue(); + + if ((('' === $value) || (null === $value)) + && !$this->isRequired() + && $this->getAllowEmpty() + ) { + return true; + } + + if ($this->isRequired() + && $this->autoInsertNotEmptyValidator() + && !$this->getValidator('NotEmpty')) + { + $validators = $this->getValidators(); + $notEmpty = array('validator' => 'NotEmpty', 'breakChainOnFailure' => true); + array_unshift($validators, $notEmpty); + $this->setValidators($validators); + } + + $this->_messages = array(); + $this->_errors = array(); + $result = true; + $translator = $this->getTranslator(); + $isArray = $this->isArray(); + foreach ($this->getValidators() as $key => $validator) { + if (method_exists($validator, 'setTranslator')) { + $validator->setTranslator($translator); + } + + if ($isArray && is_array($value)) { + $messages = array(); + $errors = array(); + foreach ($value as $val) { + if (!$validator->isValid($val, $context)) { + $result = false; + if ($this->_hasErrorMessages()) { + $messages = $this->_getErrorMessages(); + $errors = $messages; + } else { + $messages = array_merge($messages, $validator->getMessages()); + $errors = array_merge($errors, $validator->getErrors()); + } + } + } + if ($result) { + continue; + } + } elseif ($validator->isValid($value, $context)) { + continue; + } else { + $result = false; + if ($this->_hasErrorMessages()) { + $messages = $this->_getErrorMessages(); + $errors = $messages; + } else { + $messages = $validator->getMessages(); + $errors = array_keys($messages); + } + } + + $result = false; + $this->_messages = array_merge($this->_messages, $messages); + $this->_errors = array_merge($this->_errors, $errors); + + if ($validator->zfBreakChainOnFailure) { + break; + } + } + + // If element manually flagged as invalid, return false + if ($this->_isErrorForced) { + return false; + } + + return $result; + } + + /** + * Add a custom error message to return in the event of failed validation + * + * @param string $message + * @return Zend_Form_Element + */ + public function addErrorMessage($message) + { + $this->_errorMessages[] = (string) $message; + return $this; + } + + /** + * Add multiple custom error messages to return in the event of failed validation + * + * @param array $messages + * @return Zend_Form_Element + */ + public function addErrorMessages(array $messages) + { + foreach ($messages as $message) { + $this->addErrorMessage($message); + } + return $this; + } + + /** + * Same as addErrorMessages(), but clears custom error message stack first + * + * @param array $messages + * @return Zend_Form_Element + */ + public function setErrorMessages(array $messages) + { + $this->clearErrorMessages(); + return $this->addErrorMessages($messages); + } + + /** + * Retrieve custom error messages + * + * @return array + */ + public function getErrorMessages() + { + return $this->_errorMessages; + } + + /** + * Clear custom error messages stack + * + * @return Zend_Form_Element + */ + public function clearErrorMessages() + { + $this->_errorMessages = array(); + return $this; + } + + /** + * Mark the element as being in a failed validation state + * + * @return Zend_Form_Element + */ + public function markAsError() + { + $messages = $this->getMessages(); + $customMessages = $this->_getErrorMessages(); + $messages = $messages + $customMessages; + if (empty($messages)) { + $this->_isError = true; + } else { + $this->_messages = $messages; + } + $this->_isErrorForced = true; + return $this; + } + + /** + * Add an error message and mark element as failed validation + * + * @param string $message + * @return Zend_Form_Element + */ + public function addError($message) + { + $this->addErrorMessage($message); + $this->markAsError(); + return $this; + } + + /** + * Add multiple error messages and flag element as failed validation + * + * @param array $messages + * @return Zend_Form_Element + */ + public function addErrors(array $messages) + { + foreach ($messages as $message) { + $this->addError($message); + } + return $this; + } + + /** + * Overwrite any previously set error messages and flag as failed validation + * + * @param array $messages + * @return Zend_Form_Element + */ + public function setErrors(array $messages) + { + $this->clearErrorMessages(); + return $this->addErrors($messages); + } + + /** + * Are there errors registered? + * + * @return bool + */ + public function hasErrors() + { + return (!empty($this->_messages) || $this->_isError); + } + + /** + * Retrieve validator chain errors + * + * @return array + */ + public function getErrors() + { + return $this->_errors; + } + + /** + * Retrieve error messages + * + * @return array + */ + public function getMessages() + { + return $this->_messages; + } + + + // Filtering + + /** + * Add a filter to the element + * + * @param string|Zend_Filter_Interface $filter + * @return Zend_Form_Element + */ + public function addFilter($filter, $options = array()) + { + if ($filter instanceof Zend_Filter_Interface) { + $name = get_class($filter); + } elseif (is_string($filter)) { + $name = $filter; + $filter = array( + 'filter' => $filter, + 'options' => $options, + ); + $this->_filters[$name] = $filter; + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid filter provided to addFilter; must be string or Zend_Filter_Interface'); + } + + $this->_filters[$name] = $filter; + + return $this; + } + + /** + * Add filters to element + * + * @param array $filters + * @return Zend_Form_Element + */ + public function addFilters(array $filters) + { + foreach ($filters as $filterInfo) { + if (is_string($filterInfo)) { + $this->addFilter($filterInfo); + } elseif ($filterInfo instanceof Zend_Filter_Interface) { + $this->addFilter($filterInfo); + } elseif (is_array($filterInfo)) { + $argc = count($filterInfo); + $options = array(); + if (isset($filterInfo['filter'])) { + $filter = $filterInfo['filter']; + if (isset($filterInfo['options'])) { + $options = $filterInfo['options']; + } + $this->addFilter($filter, $options); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $filter = array_shift($filterInfo); + case (2 <= $argc): + $options = array_shift($filterInfo); + default: + $this->addFilter($filter, $options); + break; + } + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid filter passed to addFilters()'); + } + } + + return $this; + } + + /** + * Add filters to element, overwriting any already existing + * + * @param array $filters + * @return Zend_Form_Element + */ + public function setFilters(array $filters) + { + $this->clearFilters(); + return $this->addFilters($filters); + } + + /** + * Retrieve a single filter by name + * + * @param string $name + * @return Zend_Filter_Interface + */ + public function getFilter($name) + { + if (!isset($this->_filters[$name])) { + $len = strlen($name); + foreach ($this->_filters as $localName => $filter) { + if ($len > strlen($localName)) { + continue; + } + + if (0 === substr_compare($localName, $name, -$len, $len, true)) { + if (is_array($filter)) { + return $this->_loadFilter($filter); + } + return $filter; + } + } + return false; + } + + if (is_array($this->_filters[$name])) { + return $this->_loadFilter($this->_filters[$name]); + } + + return $this->_filters[$name]; + } + + /** + * Get all filters + * + * @return array + */ + public function getFilters() + { + $filters = array(); + foreach ($this->_filters as $key => $value) { + if ($value instanceof Zend_Filter_Interface) { + $filters[$key] = $value; + continue; + } + $filter = $this->_loadFilter($value); + $filters[get_class($filter)] = $filter; + } + return $filters; + } + + /** + * Remove a filter by name + * + * @param string $name + * @return Zend_Form_Element + */ + public function removeFilter($name) + { + if (isset($this->_filters[$name])) { + unset($this->_filters[$name]); + } else { + $len = strlen($name); + foreach (array_keys($this->_filters) as $filter) { + if ($len > strlen($filter)) { + continue; + } + if (0 === substr_compare($filter, $name, -$len, $len, true)) { + unset($this->_filters[$filter]); + break; + } + } + } + + return $this; + } + + /** + * Clear all filters + * + * @return Zend_Form_Element + */ + public function clearFilters() + { + $this->_filters = array(); + return $this; + } + + // Rendering + + /** + * Set view object + * + * @param Zend_View_Interface $view + * @return Zend_Form_Element + */ + public function setView(Zend_View_Interface $view = null) + { + $this->_view = $view; + return $this; + } + + /** + * Retrieve view object + * + * Retrieves from ViewRenderer if none previously set. + * + * @return null|Zend_View_Interface + */ + public function getView() + { + if (null === $this->_view) { + require_once 'Zend/Controller/Action/HelperBroker.php'; + $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + $this->setView($viewRenderer->view); + } + return $this->_view; + } + + /** + * Instantiate a decorator based on class name or class name fragment + * + * @param string $name + * @param null|array $options + * @return Zend_Form_Decorator_Interface + */ + protected function _getDecorator($name, $options) + { + $class = $this->getPluginLoader(self::DECORATOR)->load($name); + if (null === $options) { + $decorator = new $class; + } else { + $decorator = new $class($options); + } + + return $decorator; + } + + /** + * Add a decorator for rendering the element + * + * @param string|Zend_Form_Decorator_Interface $decorator + * @param array|Zend_Config $options Options with which to initialize decorator + * @return Zend_Form_Element + */ + public function addDecorator($decorator, $options = null) + { + if ($decorator instanceof Zend_Form_Decorator_Interface) { + $name = get_class($decorator); + } elseif (is_string($decorator)) { + $name = $decorator; + $decorator = array( + 'decorator' => $name, + 'options' => $options, + ); + } elseif (is_array($decorator)) { + foreach ($decorator as $name => $spec) { + break; + } + if (is_numeric($name)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid alias provided to addDecorator; must be alphanumeric string'); + } + if (is_string($spec)) { + $decorator = array( + 'decorator' => $spec, + 'options' => $options, + ); + } elseif ($spec instanceof Zend_Form_Decorator_Interface) { + $decorator = $spec; + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid decorator provided to addDecorator; must be string or Zend_Form_Decorator_Interface'); + } + + $this->_decorators[$name] = $decorator; + + return $this; + } + + /** + * Add many decorators at once + * + * @param array $decorators + * @return Zend_Form_Element + */ + public function addDecorators(array $decorators) + { + foreach ($decorators as $decoratorInfo) { + if (is_string($decoratorInfo)) { + $this->addDecorator($decoratorInfo); + } elseif ($decoratorInfo instanceof Zend_Form_Decorator_Interface) { + $this->addDecorator($decoratorInfo); + } elseif (is_array($decoratorInfo)) { + $argc = count($decoratorInfo); + $options = array(); + if (isset($decoratorInfo['decorator'])) { + $decorator = $decoratorInfo['decorator']; + if (isset($decoratorInfo['options'])) { + $options = $decoratorInfo['options']; + } + $this->addDecorator($decorator, $options); + } else { + switch (true) { + case (0 == $argc): + break; + case (1 <= $argc): + $decorator = array_shift($decoratorInfo); + case (2 <= $argc): + $options = array_shift($decoratorInfo); + default: + $this->addDecorator($decorator, $options); + break; + } + } + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid decorator passed to addDecorators()'); + } + } + + return $this; + } + + /** + * Overwrite all decorators + * + * @param array $decorators + * @return Zend_Form_Element + */ + public function setDecorators(array $decorators) + { + $this->clearDecorators(); + return $this->addDecorators($decorators); + } + + /** + * Retrieve a registered decorator + * + * @param string $name + * @return false|Zend_Form_Decorator_Abstract + */ + public function getDecorator($name) + { + if (!isset($this->_decorators[$name])) { + $len = strlen($name); + foreach ($this->_decorators as $localName => $decorator) { + if ($len > strlen($localName)) { + continue; + } + + if (0 === substr_compare($localName, $name, -$len, $len, true)) { + if (is_array($decorator)) { + return $this->_loadDecorator($decorator, $localName); + } + return $decorator; + } + } + return false; + } + + if (is_array($this->_decorators[$name])) { + return $this->_loadDecorator($this->_decorators[$name], $name); + } + + return $this->_decorators[$name]; + } + + /** + * Retrieve all decorators + * + * @return array + */ + public function getDecorators() + { + foreach ($this->_decorators as $key => $value) { + if (is_array($value)) { + $this->_loadDecorator($value, $key); + } + } + return $this->_decorators; + } + + /** + * Remove a single decorator + * + * @param string $name + * @return Zend_Form_Element + */ + public function removeDecorator($name) + { + if (isset($this->_decorators[$name])) { + unset($this->_decorators[$name]); + } else { + $len = strlen($name); + foreach (array_keys($this->_decorators) as $decorator) { + if ($len > strlen($decorator)) { + continue; + } + if (0 === substr_compare($decorator, $name, -$len, $len, true)) { + unset($this->_decorators[$decorator]); + break; + } + } + } + + return $this; + } + + /** + * Clear all decorators + * + * @return Zend_Form_Element + */ + public function clearDecorators() + { + $this->_decorators = array(); + return $this; + } + + /** + * Render form element + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + if (null !== $view) { + $this->setView($view); + } + + $content = ''; + foreach ($this->getDecorators() as $decorator) { + $decorator->setElement($this); + $content = $decorator->render($content); + } + return $content; + } + + /** + * String representation of form element + * + * Proxies to {@link render()}. + * + * @return string + */ + public function __toString() + { + try { + $return = $this->render(); + return $return; + } catch (Exception $e) { + trigger_error($e->getMessage(), E_USER_WARNING); + return ''; + } + } + + /** + * Lazy-load a filter + * + * @param array $filter + * @return Zend_Filter_Interface + */ + protected function _loadFilter(array $filter) + { + $origName = $filter['filter']; + $name = $this->getPluginLoader(self::FILTER)->load($filter['filter']); + + if (array_key_exists($name, $this->_filters)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Filter instance already exists for filter "%s"', $origName)); + } + + if (empty($filter['options'])) { + $instance = new $name; + } else { + $r = new ReflectionClass($name); + if ($r->hasMethod('__construct')) { + $instance = $r->newInstanceArgs((array) $filter['options']); + } else { + $instance = $r->newInstance(); + } + } + + if ($origName != $name) { + $filterNames = array_keys($this->_filters); + $order = array_flip($filterNames); + $order[$name] = $order[$origName]; + $filtersExchange = array(); + unset($order[$origName]); + asort($order); + foreach ($order as $key => $index) { + if ($key == $name) { + $filtersExchange[$key] = $instance; + continue; + } + $filtersExchange[$key] = $this->_filters[$key]; + } + $this->_filters = $filtersExchange; + } else { + $this->_filters[$name] = $instance; + } + + return $instance; + } + + /** + * Lazy-load a validator + * + * @param array $validator Validator definition + * @return Zend_Validate_Interface + */ + protected function _loadValidator(array $validator) + { + $origName = $validator['validator']; + $name = $this->getPluginLoader(self::VALIDATE)->load($validator['validator']); + + if (array_key_exists($name, $this->_validators)) { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception(sprintf('Validator instance already exists for validator "%s"', $origName)); + } + + if (empty($validator['options'])) { + $instance = new $name; + } else { + $messages = false; + if (isset($validator['options']['messages'])) { + $messages = $validator['options']['messages']; + unset($validator['options']['messages']); + } + + $r = new ReflectionClass($name); + if ($r->hasMethod('__construct')) { + $instance = $r->newInstanceArgs((array) $validator['options']); + } else { + $instance = $r->newInstance(); + } + + if ($messages) { + if (is_array($messages)) { + $instance->setMessages($messages); + } elseif (is_string($messages)) { + $instance->setMessage($messages); + } + } + } + + $instance->zfBreakChainOnFailure = $validator['breakChainOnFailure']; + + if ($origName != $name) { + $validatorNames = array_keys($this->_validators); + $order = array_flip($validatorNames); + $order[$name] = $order[$origName]; + $validatorsExchange = array(); + unset($order[$origName]); + asort($order); + foreach ($order as $key => $index) { + if ($key == $name) { + $validatorsExchange[$key] = $instance; + continue; + } + $validatorsExchange[$key] = $this->_validators[$key]; + } + $this->_validators = $validatorsExchange; + } else { + $this->_validators[$name] = $instance; + } + + return $instance; + } + + /** + * Lazy-load a decorator + * + * @param array $decorator Decorator type and options + * @param mixed $name Decorator name or alias + * @return Zend_Form_Decorator_Interface + */ + protected function _loadDecorator(array $decorator, $name) + { + $sameName = false; + if ($name == $decorator['decorator']) { + $sameName = true; + } + + $instance = $this->_getDecorator($decorator['decorator'], $decorator['options']); + if ($sameName) { + $newName = get_class($instance); + $decoratorNames = array_keys($this->_decorators); + $order = array_flip($decoratorNames); + $order[$newName] = $order[$name]; + $decoratorsExchange = array(); + unset($order[$name]); + asort($order); + foreach ($order as $key => $index) { + if ($key == $newName) { + $decoratorsExchange[$key] = $instance; + continue; + } + $decoratorsExchange[$key] = $this->_decorators[$key]; + } + $this->_decorators = $decoratorsExchange; + } else { + $this->_decorators[$name] = $instance; + } + + return $instance; + } + + /** + * Retrieve error messages and perform translation and value substitution + * + * @return array + */ + protected function _getErrorMessages() + { + $translator = $this->getTranslator(); + $messages = $this->getErrorMessages(); + $value = $this->getValue(); + foreach ($messages as $key => $message) { + if (null !== $translator) { + $message = $translator->translate($message); + } + if ($this->isArray() || is_array($value)) { + $aggregateMessages = array(); + foreach ($value as $val) { + $aggregateMessages[] = str_replace('%value%', $val, $message); + } + $messages[$key] = $aggregateMessages; + } else { + $messages[$key] = str_replace('%value%', $value, $message); + } + } + return $messages; + } + + /** + * Are there custom error messages registered? + * + * @return bool + */ + protected function _hasErrorMessages() + { + return !empty($this->_errorMessages); + } +} diff --git a/lib/zend/Zend/Form/Element/Button.php b/lib/zend/Zend/Form/Element/Button.php new file mode 100644 index 0000000000..b69e6871f9 --- /dev/null +++ b/lib/zend/Zend/Form/Element/Button.php @@ -0,0 +1,42 @@ +_captcha; + } + + /** + * Set captcha adapter + * + * @param string|array|Zend_Captcha_Adapter $captcha + * @param array $options + */ + public function setCaptcha($captcha, $options = array()) + { + if ($captcha instanceof Zend_Captcha_Adapter) { + $instance = $captcha; + } else { + if (is_array($captcha)) { + if (array_key_exists('captcha', $captcha)) { + $name = $captcha['captcha']; + unset($captcha['captcha']); + } else { + $name = array_shift($captcha); + } + $options = array_merge($options, $captcha); + } else { + $name = $captcha; + } + + $name = $this->getPluginLoader(self::CAPTCHA)->load($name); + if (empty($options)) { + $instance = new $name; + } else { + $r = new ReflectionClass($name); + if ($r->hasMethod('__construct')) { + $instance = $r->newInstanceArgs(array($options)); + } else { + $instance = $r->newInstance(); + } + } + } + + $this->_captcha = $instance; + $this->_captcha->setName($this->getName()); + return $this; + } + + /** + * Constructor + * + * $spec may be: + * - string: name of element + * - array: options with which to configure element + * - Zend_Config: Zend_Config with options for configuring element + * + * @param string|array|Zend_Config $spec + * @return void + */ + public function __construct($spec, $options = null) + { + parent::__construct($spec, $options); + $this->setAllowEmpty(true) + ->setRequired(true) + ->setAutoInsertNotEmptyValidator(false) + ->addValidator($this->getCaptcha(), true); + } + + /** + * Return all attributes + * + * @return array + */ + public function getAttribs() + { + $attribs = get_object_vars($this); + unset($attribs['helper']); + foreach ($attribs as $key => $value) { + if ('_' == substr($key, 0, 1)) { + unset($attribs[$key]); + } + } + + return $attribs; + } + + /** + * Set options + * + * Overrides to allow passing captcha options + * + * @param array $options + * @return Zend_Form_Element_Captcha + */ + public function setOptions(array $options) + { + if (array_key_exists('captcha', $options)) { + if (array_key_exists('captchaOptions', $options)) { + $this->setCaptcha($options['captcha'], $options['captchaOptions']); + unset($options['captchaOptions']); + } else { + $this->setCaptcha($options['captcha']); + } + unset($options['captcha']); + } + return parent::setOptions($options); + } + + /** + * Render form element + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + $captcha = $this->getCaptcha(); + $captcha->setName($this->getFullyQualifiedName()); + + $decorators = $this->getDecorators(); + + $decorator = $captcha->getDecorator(); + if (!empty($decorator)) { + array_unshift($decorators, $decorator); + } + + $decorator = array('Captcha', array('captcha' => $captcha)); + array_unshift($decorators, $decorator); + + $this->setDecorators($decorators); + + $this->setValue($this->getCaptcha()->generate()); + + return parent::render($view); + } + + /** + * Retrieve plugin loader for validator or filter chain + * + * Support for plugin loader for Captcha adapters + * + * @param string $type + * @return Zend_Loader_PluginLoader + * @throws Zend_Loader_Exception on invalid type. + */ + public function getPluginLoader($type) + { + $type = strtoupper($type); + if ($type == self::CAPTCHA) { + if (!isset($this->_loaders[$type])) { + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loaders[$type] = new Zend_Loader_PluginLoader( + array('Zend_Captcha' => 'Zend/Captcha/') + ); + } + return $this->_loaders[$type]; + } else { + return parent::getPluginLoader($type); + } + } + + /** + * Add prefix path for plugin loader for captcha adapters + * + * This method handles the captcha type, the rest is handled by + * the parent + * @param string $prefix + * @param string $path + * @param string $type + * @return Zend_Form_Element + * @see Zend_Form_Element::addPrefixPath + */ + public function addPrefixPath($prefix, $path, $type = null) + { + $type = strtoupper($type); + switch ($type) { + case null: + $loader = $this->getPluginLoader(self::CAPTCHA); + $cPrefix = rtrim($prefix, '_') . '_Captcha'; + $cPath = rtrim($path, '/\\') . '/Captcha'; + $loader->addPrefixPath($cPrefix, $cPath); + return parent::addPrefixPath($prefix, $path); + case self::CAPTCHA: + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($prefix, $path); + return $this; + default: + return parent::addPrefixPath($prefix, $path, $type); + } + } + + /** + * Load default decorators + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('Errors') + ->addDecorator('Description', array('tag' => 'p', 'class' => 'description')) + ->addDecorator('HtmlTag', array('tag' => 'dd')) + ->addDecorator('Label', array('tag' => 'dt')); + } + } + + /** + * Is the captcha valid? + * + * @param mixed $value + * @param mixed $context + * @return boolean + */ + public function isValid($value, $context = null) + { + $this->getCaptcha()->setName($this->getName()); + $belongsTo = $this->getBelongsTo(); + if (empty($belongsTo) || !is_array($context)) { + return parent::isValid($value, $context); + } + + $name = $this->getFullyQualifiedName(); + $root = substr($name, 0, strpos($name, '[')); + $segments = substr($name, strpos($name, '[')); + $segments = ltrim($segments, '['); + $segments = rtrim($segments, ']'); + $segments = explode('][', $segments); + array_unshift($segments, $root); + array_pop($segments); + $newContext = $context; + foreach ($segments as $segment) { + if (array_key_exists($segment, $newContext)) { + $newContext = $newContext[$segment]; + } + } + + return parent::isValid($value, $newContext); + } +} diff --git a/lib/zend/Zend/Form/Element/Checkbox.php b/lib/zend/Zend/Form/Element/Checkbox.php new file mode 100644 index 0000000000..fe691d07dd --- /dev/null +++ b/lib/zend/Zend/Form/Element/Checkbox.php @@ -0,0 +1,203 @@ + '1', + 'uncheckedValue' => '0', + ); + + /** + * Value when checked + * @var string + */ + protected $_checkedValue = '1'; + + /** + * Value when not checked + * @var string + */ + protected $_uncheckedValue = '0'; + + /** + * Current value + * @var string 0 or 1 + */ + protected $_value = '0'; + + /** + * Set options + * + * Intercept checked and unchecked values and set them early; test stored + * value against checked and unchecked values after configuration. + * + * @param array $options + * @return Zend_Form_Element_Checkbox + */ + public function setOptions(array $options) + { + if (array_key_exists('checkedValue', $options)) { + $this->setCheckedValue($options['checkedValue']); + unset($options['checkedValue']); + } + if (array_key_exists('uncheckedValue', $options)) { + $this->setUncheckedValue($options['uncheckedValue']); + unset($options['uncheckedValue']); + } + parent::setOptions($options); + + $curValue = $this->getValue(); + $test = array($this->getCheckedValue(), $this->getUncheckedValue()); + if (!in_array($curValue, $test)) { + $this->setValue($curValue); + } + + return $this; + } + + /** + * Set value + * + * If value matches checked value, sets to that value, and sets the checked + * flag to true. + * + * Any other value causes the unchecked value to be set as the current + * value, and the checked flag to be set as false. + * + * + * @param mixed $value + * @return Zend_Form_Element_Checkbox + */ + public function setValue($value) + { + if ($value == $this->getCheckedValue()) { + parent::setValue($value); + $this->checked = true; + } else { + parent::setValue($this->getUncheckedValue()); + $this->checked = false; + } + return $this; + } + + /** + * Set checked value + * + * @param string $value + * @return Zend_Form_Element_Checkbox + */ + public function setCheckedValue($value) + { + $this->_checkedValue = (string) $value; + $this->options['checkedValue'] = $value; + return $this; + } + + /** + * Get value when checked + * + * @return string + */ + public function getCheckedValue() + { + return $this->_checkedValue; + } + + /** + * Set unchecked value + * + * @param string $value + * @return Zend_Form_Element_Checkbox + */ + public function setUncheckedValue($value) + { + $this->_uncheckedValue = (string) $value; + $this->options['uncheckedValue'] = $value; + return $this; + } + + /** + * Get value when not checked + * + * @return string + */ + public function getUncheckedValue() + { + return $this->_uncheckedValue; + } + + /** + * Set checked flag + * + * @param bool $flag + * @return Zend_Form_Element_Checkbox + */ + public function setChecked($flag) + { + $this->checked = (bool) $flag; + if ($this->checked) { + $this->setValue($this->getCheckedValue()); + } else { + $this->setValue($this->getUncheckedValue()); + } + return $this; + } + + /** + * Get checked flag + * + * @return bool + */ + public function isChecked() + { + return $this->checked; + } +} diff --git a/lib/zend/Zend/Form/Element/Exception.php b/lib/zend/Zend/Form/Element/Exception.php new file mode 100644 index 0000000000..32e9e71e1e --- /dev/null +++ b/lib/zend/Zend/Form/Element/Exception.php @@ -0,0 +1,37 @@ +loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('File') + ->addDecorator('Errors') + ->addDecorator('Description') + ->addDecorator('HtmlTag', array('tag' => 'dd')) + ->addDecorator('Label', array('tag' => 'dt')); + } + } + + /** + * Set plugin loader + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @param string $type + * @return Zend_Form_Element_File + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader, $type) + { + $type = strtoupper($type); + + if ($type != self::TRANSFER_ADAPTER) { + return parent::setPluginLoader($loader, $type); + } + + $this->_loaders[$type] = $loader; + return $this; + } + + /** + * Get Plugin Loader + * + * @param string $type + * @return Zend_Loader_PluginLoader_Interface + */ + public function getPluginLoader($type) + { + $type = strtoupper($type); + + if ($type != self::TRANSFER_ADAPTER) { + return parent::getPluginLoader($type); + } + + if (!array_key_exists($type, $this->_loaders)) { + require_once 'Zend/Loader/PluginLoader.php'; + $loader = new Zend_Loader_PluginLoader(array( + 'Zend_File_Transfer_Adapter' => 'Zend/File/Transfer/Adapter/', + )); + $this->setPluginLoader($loader, self::TRANSFER_ADAPTER); + } + + return $this->_loaders[$type]; + } + + /** + * Add prefix path for plugin loader + * + * @param string $prefix + * @param string $path + * @param string $type + * @return Zend_Form_Element_File + */ + public function addPrefixPath($prefix, $path, $type = null) + { + $type = strtoupper($type); + if (!empty($type) && ($type != self::TRANSFER_ADAPTER)) { + return parent::addPrefixPath($prefix, $path, $type); + } + + if (empty($type)) { + $pluginPrefix = rtrim($prefix, '_') . '_Transfer_Adapter'; + $pluginPath = rtrim($path, DIRECTORY_SEPARATOR) . '/Transfer/Adapter/'; + $loader = $this->getPluginLoader(self::TRANSFER_ADAPTER); + $loader->addPrefixPath($pluginPrefix, $pluginPath); + return parent::addPrefixPath($prefix, $path, null); + } + + $loader = $this->getPluginLoader($type); + $loader->addPrefixPath($prefix, $path); + return $this; + } + + /** + * Set transfer adapter + * + * @param string|Zend_File_Transfer_Adapter_Abstract $adapter + * @return Zend_Form_Element_File + */ + public function setTransferAdapter($adapter) + { + if ($adapter instanceof Zend_File_Transfer_Adapter_Abstract) { + $this->_adapter = $adapter; + } elseif (is_string($adapter)) { + $loader = $this->getPluginLoader(self::TRANSFER_ADAPTER); + $class = $loader->load($adapter); + $this->_adapter = new $class; + } else { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception('Invalid adapter specified'); + } + + foreach (array('filter', 'validate') as $type) { + $loader = $this->getPluginLoader($type); + $this->_adapter->setPluginLoader($loader, $type); + } + + return $this; + } + + /** + * Get transfer adapter + * + * Lazy loads HTTP transfer adapter when no adapter registered. + * + * @return Zend_File_Transfer_Adapter_Abstract + */ + public function getTransferAdapter() + { + if (null === $this->_adapter) { + $this->setTransferAdapter('Http'); + } + return $this->_adapter; + } + + /** + * Add Validator; proxy to adapter + * + * @param string|Zend_Validate_Interface $validator + * @param bool $breakChainOnFailure + * @param mixed $options + * @return Zend_Form_Element_File + */ + public function addValidator($validator, $breakChainOnFailure = false, $options = array()) + { + $adapter = $this->getTransferAdapter(); + $adapter->addValidator($validator, $breakChainOnFailure, $options, $this->getName()); + $this->_validated = false; + + return $this; + } + + /** + * Add multiple validators at once; proxy to adapter + * + * @param array $validators + * @return Zend_Form_Element_File + */ + public function addValidators(array $validators) + { + $adapter = $this->getTransferAdapter(); + $adapter->addValidators($validators, $this->getName()); + $this->_validated = false; + + return $this; + } + + /** + * Add multiple validators at once, overwriting; proxy to adapter + * + * @param array $validators + * @return Zend_Form_Element_File + */ + public function setValidators(array $validators) + { + $adapter = $this->getTransferAdapter(); + $adapter->setValidators($validators, $this->getName()); + $this->_validated = false; + + return $this; + } + + /** + * Retrieve validator by name; proxy to adapter + * + * @param string $name + * @return Zend_Validate_Interface|null + */ + public function getValidator($name) + { + $adapter = $this->getTransferAdapter(); + return $adapter->getValidator($name); + } + + /** + * Retrieve all validators; proxy to adapter + * + * @return array + */ + public function getValidators() + { + $adapter = $this->getTransferAdapter(); + $validators = $adapter->getValidators($this->getName()); + if ($validators === null) { + $validators = array(); + } + + return $validators; + } + + /** + * Remove validator by name; proxy to adapter + * + * @param string $name + * @return Zend_Form_Element_File + */ + public function removeValidator($name) + { + $adapter = $this->getTransferAdapter(); + $adapter->removeValidator($name); + $this->_validated = false; + + return $this; + } + + /** + * Remove all validators; proxy to adapter + * + * @return Zend_Form_Element_File + */ + public function clearValidators() + { + $adapter = $this->getTransferAdapter(); + $adapter->clearValidators(); + $this->_validated = false; + + return $this; + } + + /** + * Add Filter; proxy to adapter + * + * @param string|array $filter Type of filter to add + * @param string|array $options Options to set for the filter + * @return Zend_Form_Element_File + */ + public function addFilter($filter, $options = null) + { + $adapter = $this->getTransferAdapter(); + $adapter->addFilter($filter, $options, $this->getName()); + + return $this; + } + + /** + * Add Multiple filters at once; proxy to adapter + * + * @param array $filters + * @return Zend_Form_Element_File + */ + public function addFilters(array $filters) + { + $adapter = $this->getTransferAdapter(); + $adapter->addFilters($filters, $this->getName()); + + return $this; + } + + /** + * Sets a filter for the class, erasing all previous set; proxy to adapter + * + * @param string|array $filter Filter to set + * @return Zend_Form_Element_File + */ + public function setFilters(array $filters) + { + $adapter = $this->getTransferAdapter(); + $adapter->setFilters($filters, $this->getName()); + + return $this; + } + + /** + * Retrieve individual filter; proxy to adapter + * + * @param string $name + * @return Zend_Filter_Interface|null + */ + public function getFilter($name) + { + $adapter = $this->getTransferAdapter(); + return $adapter->getFilter($name); + } + + /** + * Returns all set filters; proxy to adapter + * + * @return array List of set filters + */ + public function getFilters() + { + $adapter = $this->getTransferAdapter(); + $filters = $adapter->getFilters($this->getName()); + + if ($filters === null) { + $filters = array(); + } + return $filters; + } + + /** + * Remove an individual filter; proxy to adapter + * + * @param string $name + * @return Zend_Form_Element_File + */ + public function removeFilter($name) + { + $adapter = $this->getTransferAdapter(); + $adapter->removeFilter($name); + + return $this; + } + + /** + * Remove all filters; proxy to adapter + * + * @return Zend_Form_Element_File + */ + public function clearFilters() + { + $adapter = $this->getTransferAdapter(); + $adapter->clearFilters(); + + return $this; + } + + /** + * Validate upload + * + * @param string $value File, can be optional, give null to validate all files + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + if ($this->_validated) { + return true; + } + + $adapter = $this->getTransferAdapter(); + $translator = $this->getTranslator(); + if ($translator !== null) { + $adapter->setTranslator($translator); + } + + if (!$this->isRequired()) { + $adapter->setOptions(array('ignoreNoFile' => true), $this->getName()); + } else { + $adapter->setOptions(array('ignoreNoFile' => false), $this->getName()); + if ($this->autoInsertNotEmptyValidator() and + !$this->getValidator('NotEmpty')) + { + $validators = $this->getValidators(); + $notEmpty = array('validator' => 'NotEmpty', 'breakChainOnFailure' => true); + array_unshift($validators, $notEmpty); + $this->setValidators($validators); + } + } + + if($adapter->isValid($this->getName())) { + $this->_validated = true; + return true; + } + + $this->_validated = false; + return false; + } + + /** + * Receive the uploaded file + * + * @return boolean + */ + public function receive() + { + if (!$this->_validated) { + if (!$this->isValid($this->getName())) { + return false; + } + } + + $adapter = $this->getTransferAdapter(); + if ($adapter->receive($this->getName())) { + return true; + } + + return false; + } + + /** + * Retrieve error codes; proxy to transfer adapter + * + * @return array + */ + public function getErrors() + { + return parent::getErrors() + $this->getTransferAdapter()->getErrors(); + } + + /** + * Are there errors registered? + * + * @return bool + */ + public function hasErrors() + { + return (parent::hasErrors() || $this->getTransferAdapter()->hasErrors()); + } + + /** + * Retrieve error messages; proxy to transfer adapter + * + * @return array + */ + public function getMessages() + { + return parent::getMessages() + $this->getTransferAdapter()->getMessages(); + } + + /** + * Set the upload destination + * + * @param string $path + * @return Zend_Form_Element_File + */ + public function setDestination($path) + { + $this->getTransferAdapter()->setDestination($path, $this->getName()); + return $this; + } + + /** + * Get the upload destination + * + * @return string + */ + public function getDestination() + { + return $this->getTransferAdapter()->getDestination($this->getName()); + } + + /** + * Get the final filename + * + * @param string $value (Optional) Element or file to return + * @param boolean $path (Optional) Return also the path, defaults to true + * @return string + */ + public function getFileName($value = null, $path = true) + { + if (empty($value)) { + $value = $this->getName(); + } + + return $this->getTransferAdapter()->getFileName($value, $path); + } + + /** + * Get internal file informations + * + * @param string $value (Optional) Element or file to return + * @return array + */ + public function getFileInfo($value = null) + { + if (empty($value)) { + $value = $this->getName(); + } + + return $this->getTransferAdapter()->getFileInfo($value); + } + + /** + * Set a multifile element + * + * @param integer $count Number of file elements + * @return Zend_Form_Element_File Provides fluent interface + */ + public function setMultiFile($count) + { + if ((integer) $count < 2) { + $this->setIsArray(false); + $this->_counter = 1; + } else { + $this->setIsArray(true); + $this->_counter = (integer) $count; + } + + return $this; + } + + /** + * Returns the multifile element number + * + * @return integer + */ + public function getMultiFile() + { + return $this->_counter; + } + + /** + * Sets the maximum file size of the form + * + * @return integer + */ + public function getMaxFileSize() + { + if (self::$_maxFileSize < 0) { + $ini = $this->_convertIniToInteger(trim(ini_get('post_max_size'))); + $max = $this->_convertIniToInteger(trim(ini_get('upload_max_filesize'))); + $min = max($ini, $max); + if ($ini > 0) { + $min = min($min, $ini); + } + + if ($max > 0) { + $min = min($min, $max); + } + + self::$_maxFileSize = $min; + } + + return self::$_maxFileSize; + } + + /** + * Sets the maximum file size of the form + * + * @param integer $size + * @return integer + */ + public function setMaxFileSize($size) + { + $ini = $this->_convertIniToInteger(trim(ini_get('post_max_size'))); + $max = $this->_convertIniToInteger(trim(ini_get('upload_max_filesize'))); + + if (($max > -1) && ($size > $max)) { + trigger_error("Your 'upload_max_filesize' config setting limits the maximum filesize to '$max'. You tried to set '$size'.", E_USER_NOTICE); + $size = $max; + } + + if (($ini > -1) && ($size > $ini)) { + trigger_error("Your 'post_max_size' config setting limits the maximum filesize to '$ini'. You tried to set '$size'.", E_USER_NOTICE); + $size = $ini; + } + + self::$_maxFileSize = $size; + return $this; + } + + /** + * Converts a ini setting to a integer value + * + * @param string $setting + * @return integer + */ + private function _convertIniToInteger($setting) + { + if (!is_numeric($setting)) { + $type = strtoupper(substr($setting, -1)); + $setting = (integer) substr($setting, 0, -1); + + switch ($type) { + case 'K' : + $setting *= 1024; + break; + + case 'M' : + $setting *= 1024 * 1024; + break; + + case 'G' : + $setting *= 1024 * 1024 * 1024; + break; + + default : + break; + } + } + + return (integer) $setting; + } + + /** + * Set if the file will be uploaded when getting the value + * This defaults to false which will force receive() when calling getValues() + * + * @param boolean $flag Sets if the file is handled as the elements value + * @return Zend_Form_Element_File + */ + public function setValueDisabled($flag) + { + $this->_valueDisabled = (bool) $flag; + return $this; + } + + /** + * Returns if the file will be uploaded when calling getValues() + * + * @return boolean Receive the file on calling getValues()? + */ + public function isValueDisabled() + { + return $this->_valueDisabled; + } + + /** + * Processes the file, returns null or the filename only + * For the complete path, use getFileName + * + * @return null|string + */ + public function getValue() + { + if ($this->_value !== null) { + return $this->_value; + } + + $content = $this->getTransferAdapter()->getFileName($this->getName()); + if (empty($content)) { + return null; + } + + if (!$this->isValid(null)) { + return null; + } + + if (!$this->_valueDisabled && !$this->receive()) { + return null; + } + + return $this->getFileName(null, false); + } + + /** + * Disallow setting the value + * + * @param mixed $value + * @return Zend_Form_Element_File + */ + public function setValue($value) + { + return $this; + } + + /** + * Set translator object for localization + * + * @param Zend_Translate|null $translator + * @return Zend_Form_Element_File + */ + public function setTranslator($translator = null) + { + $adapter = $this->getTransferAdapter(); + $adapter->setTranslator($translator); + parent::setTranslator($translator); + + return $this; + } + + /** + * Retrieve localization translator object + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + $adapter = $this->getTransferAdapter(); + return $adapter->getTranslator(); + } + + /** + * Indicate whether or not translation should be disabled + * + * @param bool $flag + * @return Zend_Form_Element_File + */ + public function setDisableTranslator($flag) + { + $adapter = $this->getTransferAdapter(); + $adapter->setDisableTranslator($flag); + $this->_translatorDisabled = (bool) $flag; + + return $this; + } + + /** + * Is translation disabled? + * + * @return bool + */ + public function translatorIsDisabled() + { + $adapter = $this->getTransferAdapter(); + return $adapter->translatorIsDisabled(); + } + + /** + * Was the file received? + * + * @return bool + */ + public function isReceived() + { + $adapter = $this->getTransferAdapter(); + return $adapter->isReceived($this->getName()); + } + + /** + * Was the file uploaded? + * + * @return bool + */ + public function isUploaded() + { + $adapter = $this->getTransferAdapter(); + return $adapter->isUploaded($this->getName()); + } + + /** + * Has the file been filtered? + * + * @return bool + */ + public function isFiltered() + { + $adapter = $this->getTransferAdapter(); + return $adapter->isFiltered($this->getName()); + } + + /** + * Returns the hash for this file element + * + * @param string $hash (Optional) Hash algorithm to use + * @return string|array Hashstring + */ + public function getHash($hash = 'crc32') + { + $adapter = $this->getTransferAdapter(); + return $adapter->getHash($hash, $this->getName()); + } + + /** + * Returns the filesize for this file element + * + * @return string|array Filesize + */ + public function getFileSize() + { + $adapter = $this->getTransferAdapter(); + return $adapter->getFileSize($this->getName()); + } + + /** + * Returns the mimetype for this file element + * + * @return string|array Mimetype + */ + public function getMimeType() + { + $adapter = $this->getTransferAdapter(); + return $adapter->getMimeType($this->getName()); + } + + /** + * Render form element + * Checks for decorator interface to prevent errors + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + $marker = false; + foreach ($this->getDecorators() as $decorator) { + if ($decorator instanceof Zend_Form_Decorator_Marker_File_Interface) { + $marker = true; + } + } + + if (!$marker) { + require_once 'Zend/Form/Element/Exception.php'; + throw new Zend_Form_Element_Exception('No file decorator found... unable to render file element'); + } + + return parent::render($view); + } + + /** + * Retrieve error messages and perform translation and value substitution + * + * @return array + */ + protected function _getErrorMessages() + { + $translator = $this->getTranslator(); + $messages = $this->getErrorMessages(); + $value = $this->getFileName(); + foreach ($messages as $key => $message) { + if (null !== $translator) { + $message = $translator->translate($message); + } + + if ($this->isArray() || is_array($value)) { + $aggregateMessages = array(); + foreach ($value as $val) { + $aggregateMessages[] = str_replace('%value%', $val, $message); + } + + if (!empty($aggregateMessages)) { + $messages[$key] = $aggregateMessages; + } + } else { + $messages[$key] = str_replace('%value%', $value, $message); + } + } + + return $messages; + } +} diff --git a/lib/zend/Zend/Form/Element/Hash.php b/lib/zend/Zend/Form/Element/Hash.php new file mode 100644 index 0000000000..4e089632a3 --- /dev/null +++ b/lib/zend/Zend/Form/Element/Hash.php @@ -0,0 +1,259 @@ +setAllowEmpty(false) + ->setRequired(true) + ->initCsrfValidator(); + } + + /** + * Set session object + * + * @param Zend_Session_Namespace $session + * @return Zend_Form_Element_Hash + */ + public function setSession($session) + { + $this->_session = $session; + return $this; + } + + /** + * Get session object + * + * Instantiate session object if none currently exists + * + * @return Zend_Session_Namespace + */ + public function getSession() + { + if (null === $this->_session) { + require_once 'Zend/Session/Namespace.php'; + $this->_session = new Zend_Session_Namespace($this->getSessionName()); + } + return $this->_session; + } + + /** + * Initialize CSRF validator + * + * Creates Session namespace, and initializes CSRF token in session. + * Additionally, adds validator for validating CSRF token. + * + * @return Zend_Form_Element_Hash + */ + public function initCsrfValidator() + { + $session = $this->getSession(); + if (isset($session->hash)) { + $rightHash = $session->hash; + } else { + $rightHash = null; + } + + $this->addValidator('Identical', true, array($rightHash)); + return $this; + } + + /** + * Salt for CSRF token + * + * @param string $salt + * @return Zend_Form_Element_Hash + */ + public function setSalt($salt) + { + $this->_salt = (string) $salt; + return $this; + } + + /** + * Retrieve salt for CSRF token + * + * @return string + */ + public function getSalt() + { + return $this->_salt; + } + + /** + * Retrieve CSRF token + * + * If no CSRF token currently exists, generates one. + * + * @return string + */ + public function getHash() + { + if (null === $this->_hash) { + $this->_generateHash(); + } + return $this->_hash; + } + + /** + * Get session namespace for CSRF token + * + * Generates a session namespace based on salt, element name, and class. + * + * @return string + */ + public function getSessionName() + { + return __CLASS__ . '_' . $this->getSalt() . '_' . $this->getName(); + } + + /** + * Set timeout for CSRF session token + * + * @param int $ttl + * @return Zend_Form_Element_Hash + */ + public function setTimeout($ttl) + { + $this->_timeout = (int) $ttl; + return $this; + } + + /** + * Get CSRF session token timeout + * + * @return int + */ + public function getTimeout() + { + return $this->_timeout; + } + + /** + * Override getLabel() to always be empty + * + * @return null + */ + public function getLabel() + { + return null; + } + + /** + * Initialize CSRF token in session + * + * @return void + */ + public function initCsrfToken() + { + $session = $this->getSession(); + $session->setExpirationHops(1, null, true); + $session->setExpirationSeconds($this->getTimeout()); + $session->hash = $this->getHash(); + } + + /** + * Render CSRF token in form + * + * @param Zend_View_Interface $view + * @return string + */ + public function render(Zend_View_Interface $view = null) + { + $this->initCsrfToken(); + return parent::render($view); + } + + /** + * Generate CSRF token + * + * Generates CSRF token and stores both in {@link $_hash} and element + * value. + * + * @return void + */ + protected function _generateHash() + { + $this->_hash = md5( + mt_rand(1,1000000) + . $this->getSalt() + . $this->getName() + . mt_rand(1,1000000) + ); + $this->setValue($this->_hash); + } +} diff --git a/lib/zend/Zend/Form/Element/Hidden.php b/lib/zend/Zend/Form/Element/Hidden.php new file mode 100644 index 0000000000..e00d97272b --- /dev/null +++ b/lib/zend/Zend/Form/Element/Hidden.php @@ -0,0 +1,42 @@ +loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('Tooltip') + ->addDecorator('Image') + ->addDecorator('Errors') + ->addDecorator('HtmlTag', array('tag' => 'dd')) + ->addDecorator('Label', array('tag' => 'dt')); + } + } + + /** + * Set image path + * + * @param string $path + * @return Zend_Form_Element_Image + */ + public function setImage($path) + { + $this->src = (string) $path; + return $this; + } + + /** + * Get image path + * + * @return string + */ + public function getImage() + { + return $this->src; + } + + /** + * Set image value to use when submitted + * + * @param mixed $value + * @return Zend_Form_Element_Image + */ + public function setImageValue($value) + { + $this->_imageValue = $value; + return $this; + } + + /** + * Get image value to use when submitted + * + * @return mixed + */ + public function getImageValue() + { + return $this->_imageValue; + } + + /** + * Was this element used to submit the form? + * + * @return bool + */ + public function isChecked() + { + $imageValue = $this->getImageValue(); + return ((null !== $imageValue) && ($this->getValue() == $imageValue)); + } + +} diff --git a/lib/zend/Zend/Form/Element/Multi.php b/lib/zend/Zend/Form/Element/Multi.php new file mode 100644 index 0000000000..6d0fb2d27f --- /dev/null +++ b/lib/zend/Zend/Form/Element/Multi.php @@ -0,0 +1,318 @@ +'. + * @var string + */ + protected $_separator = '
      '; + + /** + * Which values are translated already? + * @var array + */ + protected $_translated = array(); + + /** + * Retrieve separator + * + * @return mixed + */ + public function getSeparator() + { + return $this->_separator; + } + + /** + * Set separator + * + * @param mixed $separator + * @return self + */ + public function setSeparator($separator) + { + $this->_separator = $separator; + return $this; + } + + /** + * Retrieve options array + * + * @return array + */ + protected function _getMultiOptions() + { + if (null === $this->options || !is_array($this->options)) { + $this->options = array(); + } + + return $this->options; + } + + /** + * Add an option + * + * @param string $option + * @param string $value + * @return Zend_Form_Element_Multi + */ + public function addMultiOption($option, $value = '') + { + $option = (string) $option; + $this->_getMultiOptions(); + if (!$this->_translateOption($option, $value)) { + $this->options[$option] = $value; + } + + return $this; + } + + /** + * Add many options at once + * + * @param array $options + * @return Zend_Form_Element_Multi + */ + public function addMultiOptions(array $options) + { + foreach ($options as $option => $value) { + if (is_array($value) + && array_key_exists('key', $value) + && array_key_exists('value', $value) + ) { + $this->addMultiOption($value['key'], $value['value']); + } else { + $this->addMultiOption($option, $value); + } + } + return $this; + } + + /** + * Set all options at once (overwrites) + * + * @param array $options + * @return Zend_Form_Element_Multi + */ + public function setMultiOptions(array $options) + { + $this->clearMultiOptions(); + return $this->addMultiOptions($options); + } + + /** + * Retrieve single multi option + * + * @param string $option + * @return mixed + */ + public function getMultiOption($option) + { + $option = (string) $option; + $this->_getMultiOptions(); + if (isset($this->options[$option])) { + $this->_translateOption($option, $this->options[$option]); + return $this->options[$option]; + } + + return null; + } + + /** + * Retrieve options + * + * @return array + */ + public function getMultiOptions() + { + $this->_getMultiOptions(); + foreach ($this->options as $option => $value) { + $this->_translateOption($option, $value); + } + return $this->options; + } + + /** + * Remove a single multi option + * + * @param string $option + * @return bool + */ + public function removeMultiOption($option) + { + $option = (string) $option; + $this->_getMultiOptions(); + if (isset($this->options[$option])) { + unset($this->options[$option]); + if (isset($this->_translated[$option])) { + unset($this->_translated[$option]); + } + return true; + } + + return false; + } + + /** + * Clear all options + * + * @return Zend_Form_Element_Multi + */ + public function clearMultiOptions() + { + $this->options = array(); + $this->_translated = array(); + return $this; + } + + /** + * Set flag indicating whether or not to auto-register inArray validator + * + * @param bool $flag + * @return Zend_Form_Element_Multi + */ + public function setRegisterInArrayValidator($flag) + { + $this->_registerInArrayValidator = (bool) $flag; + return $this; + } + + /** + * Get status of auto-register inArray validator flag + * + * @return bool + */ + public function registerInArrayValidator() + { + return $this->_registerInArrayValidator; + } + + /** + * Is the value provided valid? + * + * Autoregisters InArray validator if necessary. + * + * @param string $value + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + if ($this->registerInArrayValidator()) { + if (!$this->getValidator('InArray')) { + $multiOptions = $this->getMultiOptions(); + $options = array(); + + foreach ($multiOptions as $opt_value => $opt_label) { + // optgroup instead of option label + if (is_array($opt_label)) { + $options = array_merge($options, array_keys($opt_label)); + } + else { + $options[] = $opt_value; + } + } + + $this->addValidator( + 'InArray', + true, + array($options) + ); + } + } + return parent::isValid($value, $context); + } + + /** + * Translate an option + * + * @param string $option + * @param string $value + * @return bool + */ + protected function _translateOption($option, $value) + { + if ($this->translatorIsDisabled()) { + return false; + } + + if (!isset($this->_translated[$option]) && !empty($value)) { + $this->options[$option] = $this->_translateValue($value); + if ($this->options[$option] === $value) { + return false; + } + $this->_translated[$option] = true; + return true; + } + + return false; + } + + /** + * Translate a multi option value + * + * @param string $value + * @return string + */ + protected function _translateValue($value) + { + if (is_array($value)) { + foreach ($value as $key => $val) { + $value[$key] = $this->_translateValue($val); + } + return $value; + } else { + if (null !== ($translator = $this->getTranslator())) { + if ($translator->isTranslated($value)) { + return $translator->translate($value); + } + } + return $value; + } + } +} diff --git a/lib/zend/Zend/Form/Element/MultiCheckbox.php b/lib/zend/Zend/Form/Element/MultiCheckbox.php new file mode 100644 index 0000000000..f3f1fcbe8d --- /dev/null +++ b/lib/zend/Zend/Form/Element/MultiCheckbox.php @@ -0,0 +1,52 @@ +renderPassword = (bool) $flag; + return $this; + } + + /** + * Get value of renderPassword flag + * + * @return bool + */ + public function renderPassword() + { + return $this->renderPassword; + } + + /** + * Override isValid() + * + * Ensure that validation error messages mask password value. + * + * @param string $value + * @param mixed $context + * @return bool + */ + public function isValid($value, $context = null) + { + foreach ($this->getValidators() as $validator) { + if ($validator instanceof Zend_Validate_Abstract) { + $validator->setObscureValue(true); + } + } + return parent::isValid($value, $context); + } +} diff --git a/lib/zend/Zend/Form/Element/Radio.php b/lib/zend/Zend/Form/Element/Radio.php new file mode 100644 index 0000000000..a1ba3acdaa --- /dev/null +++ b/lib/zend/Zend/Form/Element/Radio.php @@ -0,0 +1,42 @@ + $options); + } + + parent::__construct($spec, $options); + } + + /** + * Return label + * + * If no label is present, returns the currently set name. + * + * If a translator is present, returns the translated label. + * + * @return string + */ + public function getLabel() + { + $value = parent::getLabel(); + + if (null === $value) { + $value = $this->getName(); + } + + if (null !== ($translator = $this->getTranslator())) { + return $translator->translate($value); + } + + return $value; + } + + /** + * Has this submit button been selected? + * + * @return bool + */ + public function isChecked() + { + $value = $this->getValue(); + + if (empty($value)) { + return false; + } + if ($value != $this->getLabel()) { + return false; + } + + return true; + } + + /** + * Default decorators + * + * Uses only 'Submit' and 'DtDdWrapper' decorators by default. + * + * @return void + */ + public function loadDefaultDecorators() + { + if ($this->loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('Tooltip') + ->addDecorator('ViewHelper') + ->addDecorator('DtDdWrapper'); + } + } +} diff --git a/lib/zend/Zend/Form/Element/Text.php b/lib/zend/Zend/Form/Element/Text.php new file mode 100644 index 0000000000..a98c3124d1 --- /dev/null +++ b/lib/zend/Zend/Form/Element/Text.php @@ -0,0 +1,42 @@ +loadDefaultDecoratorsIsDisabled()) { + return; + } + + $decorators = $this->getDecorators(); + if (empty($decorators)) { + $this->addDecorator('FormElements') + ->addDecorator('HtmlTag', array('tag' => 'dl')) + ->addDecorator('Fieldset') + ->addDecorator('DtDdWrapper'); + } + } +} diff --git a/lib/zend/Zend/Gdata/App.php b/lib/zend/Zend/Gdata/App.php index 9d826c4e18..f2b6924027 100644 --- a/lib/zend/Zend/Gdata/App.php +++ b/lib/zend/Zend/Gdata/App.php @@ -15,14 +15,16 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** * Zend_Gdata_Feed */ -require_once 'Zend/Gdata/Feed.php'; +require_once 'Zend/Gdata/App/Feed.php'; /** * Zend_Gdata_Http_Client @@ -46,12 +48,25 @@ require_once 'Zend/Gdata/App/MediaSource.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App { + /** Default major protocol version. + * + * @see _majorProtocolVersion + */ + const DEFAULT_MAJOR_PROTOCOL_VERSION = 1; + + /** Default minor protocol version. + * + * @see _minorProtocolVersion + */ + const DEFAULT_MINOR_PROTOCOL_VERSION = null; + /** * Client object used to communicate * @@ -111,6 +126,42 @@ class Zend_Gdata_App */ protected static $_maxRedirects = 5; + /** + * Indicates the major protocol version that should be used. + * At present, recognized values are either 1 or 2. However, any integer + * value >= 1 is considered valid. + * + * Under most circumtances, this will be automatically set by + * Zend_Gdata_App subclasses. + * + * @see setMajorProtocolVersion() + * @see getMajorProtocolVersion() + */ + protected $_majorProtocolVersion; + + /** + * Indicates the minor protocol version that should be used. Can be set + * to either an integer >= 0, or NULL if no minor version should be sent + * to the server. + * + * At present, this field is not used by any Google services, but may be + * used in the future. + * + * Under most circumtances, this will be automatically set by + * Zend_Gdata_App subclasses. + * + * @see setMinorProtocolVersion() + * @see getMinorProtocolVersion() + */ + protected $_minorProtocolVersion; + + /** + * Whether we want to use XML to object mapping when fetching data. + * + * @var boolean + */ + protected $_useObjectMapping = true; + /** * Create Gdata object * @@ -120,6 +171,10 @@ class Zend_Gdata_App public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0') { $this->setHttpClient($client, $applicationId); + // Set default protocol version. Subclasses should override this as + // needed once a given service supports a new version. + $this->setMajorProtocolVersion(self::DEFAULT_MAJOR_PROTOCOL_VERSION); + $this->setMinorProtocolVersion(self::DEFAULT_MINOR_PROTOCOL_VERSION); } /** @@ -136,27 +191,33 @@ class Zend_Gdata_App } /** - * Retreive feed object + * Retrieve feed as string or object * * @param string $uri The uri from which to retrieve the feed * @param string $className The class which is used as the return type - * @return Zend_Gdata_App_Feed + * @return string|Zend_Gdata_App_Feed Returns string only if the object + * mapping has been disabled explicitly + * by passing false to the + * useObjectMapping() function. */ public function getFeed($uri, $className='Zend_Gdata_App_Feed') { - return $this->importUrl($uri, $className); + return $this->importUrl($uri, $className, null); } /** - * Retreive entry object + * Retrieve entry as string or object * * @param string $uri * @param string $className The class which is used as the return type - * @return Zend_Gdata_App_Entry + * @return string|Zend_Gdata_App_Entry Returns string only if the object + * mapping has been disabled explicitly + * by passing false to the + * useObjectMapping() function. */ public function getEntry($uri, $className='Zend_Gdata_App_Entry') { - return $this->importUrl($uri, $className); + return $this->importUrl($uri, $className, null); } /** @@ -176,16 +237,19 @@ class Zend_Gdata_App * @throws Zend_Gdata_App_HttpException * @return Zend_Gdata_App Provides a fluent interface */ - public function setHttpClient($client, $applicationId = 'MyCompany-MyApp-1.0') + public function setHttpClient($client, + $applicationId = 'MyCompany-MyApp-1.0') { if ($client === null) { $client = new Zend_Http_Client(); } if (!$client instanceof Zend_Http_Client) { require_once 'Zend/Gdata/App/HttpException.php'; - throw new Zend_Gdata_App_HttpException('Argument is not an instance of Zend_Http_Client.'); + throw new Zend_Gdata_App_HttpException( + 'Argument is not an instance of Zend_Http_Client.'); } - $userAgent = $applicationId . ' Zend_Framework_Gdata/' . Zend_Version::VERSION; + $userAgent = $applicationId . ' Zend_Framework_Gdata/' . + Zend_Version::VERSION; $client->setHeaders('User-Agent', $userAgent); $client->setConfig(array( 'strictredirects' => true @@ -196,7 +260,6 @@ class Zend_Gdata_App return $this; } - /** * Set the static HTTP client instance * @@ -272,7 +335,7 @@ class Zend_Gdata_App throw new Zend_Gdata_App_InvalidArgumentException( 'You cannot enable gzipped responses if the zlib module ' . 'is not enabled in your PHP installation.'); - + } self::$_gzipEnabled = $enabled; } @@ -290,7 +353,7 @@ class Zend_Gdata_App /** * Get whether to use verbose exception messages * - * In the case of HTTP errors, use the body of the HTTP response + * In the case of HTTP errors, use the body of the HTTP response * in the exception message. * * @return boolean @@ -303,7 +366,7 @@ class Zend_Gdata_App /** * Set whether to use verbose exception messages * - * In the case of HTTP errors, use the body of the HTTP response + * In the case of HTTP errors, use the body of the HTTP response * in the exception message. * * @param boolean $verbose Whether to use verbose exception messages @@ -335,30 +398,100 @@ class Zend_Gdata_App } /** - * Provides pre-processing for HTTP requests to APP services. + * Set the major protocol version that should be used. Values < 1 will + * cause a Zend_Gdata_App_InvalidArgumentException to be thrown. + * + * @see _majorProtocolVersion + * @param int $value The major protocol version to use. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setMajorProtocolVersion($value) + { + if (!($value >= 1)) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException( + 'Major protocol version must be >= 1'); + } + $this->_majorProtocolVersion = $value; + } + + /** + * Get the major protocol version that is in use. + * + * @see _majorProtocolVersion + * @return int The major protocol version in use. + */ + public function getMajorProtocolVersion() + { + return $this->_majorProtocolVersion; + } + + /** + * Set the minor protocol version that should be used. If set to NULL, no + * minor protocol version will be sent to the server. Values < 0 will + * cause a Zend_Gdata_App_InvalidArgumentException to be thrown. + * + * @see _minorProtocolVersion + * @param (int|NULL) $value The minor protocol version to use. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setMinorProtocolVersion($value) + { + if (!($value >= 0)) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException( + 'Minor protocol version must be >= 0'); + } + $this->_minorProtocolVersion = $value; + } + + /** + * Get the minor protocol version that is in use. + * + * @see _minorProtocolVersion + * @return (int|NULL) The major protocol version in use, or NULL if no + * minor version is specified. + */ + public function getMinorProtocolVersion() + { + return $this->_minorProtocolVersion; + } + + /** + * Provides pre-processing for HTTP requests to APP services. * - * 1. Checks the $data element and, if it's an entry, extracts the XML, + * 1. Checks the $data element and, if it's an entry, extracts the XML, * multipart data, edit link (PUT,DELETE), etc. - * 2. If $data is a string, sets the default content-type header as + * 2. If $data is a string, sets the default content-type header as * 'application/atom+xml' if it's not already been set. - * 3. Adds a x-http-method override header and changes the HTTP method + * 3. Adds a x-http-method override header and changes the HTTP method * to 'POST' if necessary as per getHttpMethodOverride() * - * @param string $method The HTTP method for the request - 'GET', 'POST', + * @param string $method The HTTP method for the request - 'GET', 'POST', * 'PUT', 'DELETE' - * @param string $url The URL to which this request is being performed, + * @param string $url The URL to which this request is being performed, * or null if found in $data - * @param array $headers An associative array of HTTP headers for this + * @param array $headers An associative array of HTTP headers for this * request - * @param mixed $data The Zend_Gdata_App_Entry or XML for the + * @param mixed $data The Zend_Gdata_App_Entry or XML for the * body of the request - * @param string $contentTypeOverride The override value for the + * @param string $contentTypeOverride The override value for the * content type of the request body - * @return array An associative array containing the determined + * @return array An associative array containing the determined * 'method', 'url', 'data', 'headers', 'contentType' */ - public function prepareRequest($method, $url = null, $headers = array(), $data = null, $contentTypeOverride = null) + public function prepareRequest($method, + $url = null, + $headers = array(), + $data = null, + $contentTypeOverride = null) { + // As a convenience, if $headers is null, we'll convert it back to + // an empty array. + if ($headers === null) { + $headers = array(); + } + $rawData = null; $finalContentType = null; if ($url == null) { @@ -373,15 +506,15 @@ class Zend_Gdata_App } elseif ($data instanceof Zend_Gdata_App_MediaEntry) { $rawData = $data->encode(); if ($data->getMediaSource() !== null) { - $finalContentType = 'multipart/related; boundary="' . $data->getBoundary() . '"'; - $headers['MIME-version'] = '1.0'; + $finalContentType = $rawData->getContentType(); + $headers['MIME-version'] = '1.0'; $headers['Slug'] = $data->getMediaSource()->getSlug(); } else { $finalContentType = 'application/atom+xml'; } if ($method == 'PUT' || $method == 'DELETE') { $editLink = $data->getEditLink(); - if ($editLink != null) { + if ($editLink != null && $url == null) { $url = $editLink->getHref(); } } @@ -401,9 +534,27 @@ class Zend_Gdata_App } $finalContentType = $data->getContentType(); } + if ($method == 'DELETE') { $rawData = null; } + + // Set an If-Match header if: + // - This isn't a DELETE + // - If this isn't a GET, the Etag isn't weak + // - A similar header (If-Match/If-None-Match) hasn't already been + // set. + if ($method != 'DELETE' && ( + !array_key_exists('If-Match', $headers) && + !array_key_exists('If-None-Match', $headers) + ) ) { + $allowWeak = $method == 'GET'; + if ($ifMatchHeader = $this->generateIfMatchHeaderData( + $data, $allowWeak)) { + $headers['If-Match'] = $ifMatchHeader; + } + } + if ($method != 'POST' && $method != 'GET' && Zend_Gdata_App::getHttpMethodOverride()) { $headers['x-http-method-override'] = $method; $method = 'POST'; @@ -415,25 +566,28 @@ class Zend_Gdata_App $finalContentType = $contentTypeOverride; } - return array('method' => $method, 'url' => $url, 'data' => $rawData, 'headers' => $headers, 'contentType' => $finalContentType); + return array('method' => $method, 'url' => $url, + 'data' => $rawData, 'headers' => $headers, + 'contentType' => $finalContentType); } /** * Performs a HTTP request using the specified method * - * @param string $method The HTTP method for the request - 'GET', 'POST', + * @param string $method The HTTP method for the request - 'GET', 'POST', * 'PUT', 'DELETE' * @param string $url The URL to which this request is being performed - * @param array $headers An associative array of HTTP headers + * @param array $headers An associative array of HTTP headers * for this request * @param string $body The body of the HTTP request - * @param string $contentType The value for the content type + * @param string $contentType The value for the content type * of the request body * @param int $remainingRedirects Number of redirects to follow if request * s results in one * @return Zend_Http_Response The response object */ - public function performHttpRequest($method, $url, $headers = null, $body = null, $contentType = null, $remainingRedirects = null) + public function performHttpRequest($method, $url, $headers = null, + $body = null, $contentType = null, $remainingRedirects = null) { require_once 'Zend/Http/Client/Exception.php'; if ($remainingRedirects === null) { @@ -442,23 +596,36 @@ class Zend_Gdata_App if ($headers === null) { $headers = array(); } + // Append a Gdata version header if protocol v2 or higher is in use. + // (Protocol v1 does not use this header.) + $major = $this->getMajorProtocolVersion(); + $minor = $this->getMinorProtocolVersion(); + if ($major >= 2) { + $headers['GData-Version'] = $major + + (($minor === null) ? '.' + $minor : ''); + } + // check the overridden method - if (($method == 'POST' || $method == 'PUT') && $body === null && $headers['x-http-method-override'] != 'DELETE') { + if (($method == 'POST' || $method == 'PUT') && $body === null && + $headers['x-http-method-override'] != 'DELETE') { require_once 'Zend/Gdata/App/InvalidArgumentException.php'; throw new Zend_Gdata_App_InvalidArgumentException( - 'You must specify the data to post as either a ' . + 'You must specify the data to post as either a ' . 'string or a child of Zend_Gdata_App_Entry'); } if ($url === null) { require_once 'Zend/Gdata/App/InvalidArgumentException.php'; - throw new Zend_Gdata_App_InvalidArgumentException('You must specify an URI to which to post.'); + throw new Zend_Gdata_App_InvalidArgumentException( + 'You must specify an URI to which to post.'); } $headers['Content-Type'] = $contentType; if (Zend_Gdata_App::getGzipEnabled()) { - // some services require the word 'gzip' to be in the user-agent header - // in addition to the accept-encoding header - if (strpos($this->_httpClient->getHeader('User-Agent'), 'gzip') === false) { - $headers['User-Agent'] = $this->_httpClient->getHeader('User-Agent') . ' (gzip)'; + // some services require the word 'gzip' to be in the user-agent + // header in addition to the accept-encoding header + if (strpos($this->_httpClient->getHeader('User-Agent'), + 'gzip') === false) { + $headers['User-Agent'] = + $this->_httpClient->getHeader('User-Agent') . ' (gzip)'; } $headers['Accept-encoding'] = 'gzip, deflate'; } else { @@ -466,7 +633,7 @@ class Zend_Gdata_App } // Make sure the HTTP client object is 'clean' before making a request - // In addition to standard headers to reset via resetParameters(), + // In addition to standard headers to reset via resetParameters(), // also reset the Slug header $this->_httpClient->resetParameters(); $this->_httpClient->setHeaders('Slug', null); @@ -475,17 +642,48 @@ class Zend_Gdata_App $this->_httpClient->setHeaders($headers); $this->_httpClient->setUri($url); $this->_httpClient->setConfig(array('maxredirects' => 0)); - $this->_httpClient->setRawData($body, $contentType); + + // Set the proper adapter if we are handling a streaming upload + $usingMimeStream = false; + $oldHttpAdapter = null; + + if ($body instanceof Zend_Gdata_MediaMimeStream) { + $usingMimeStream = true; + $this->_httpClient->setRawDataStream($body, $contentType); + $oldHttpAdapter = $this->_httpClient->getAdapter(); + + if ($oldHttpAdapter instanceof Zend_Http_Client_Adapter_Proxy) { + require_once 'Zend/Gdata/HttpAdapterStreamingProxy.php'; + $newAdapter = new Zend_Gdata_HttpAdapterStreamingProxy(); + } else { + require_once 'Zend/Gdata/HttpAdapterStreamingSocket.php'; + $newAdapter = new Zend_Gdata_HttpAdapterStreamingSocket(); + } + $this->_httpClient->setAdapter($newAdapter); + } else { + $this->_httpClient->setRawData($body, $contentType); + } + try { $response = $this->_httpClient->request($method); + // reset adapter + if ($usingMimeStream) { + $this->_httpClient->setAdapter($oldHttpAdapter); + } } catch (Zend_Http_Client_Exception $e) { + // reset adapter + if ($usingMimeStream) { + $this->_httpClient->setAdapter($oldHttpAdapter); + } require_once 'Zend/Gdata/App/HttpException.php'; throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); } - if ($response->isRedirect()) { + if ($response->isRedirect() && $response->getStatus() != '304') { if ($remainingRedirects > 0) { $newUrl = $response->getHeader('Location'); - $response = $this->performHttpRequest($method, $newUrl, $headers, $body, $contentType, $remainingRedirects); + $response = $this->performHttpRequest( + $method, $newUrl, $headers, $body, + $contentType, $remainingRedirects); } else { require_once 'Zend/Gdata/App/HttpException.php'; throw new Zend_Gdata_App_HttpException( @@ -494,7 +692,8 @@ class Zend_Gdata_App } if (!$response->isSuccessful()) { require_once 'Zend/Gdata/App/HttpException.php'; - $exceptionMessage = 'Expected response code 200, got ' . $response->getStatus(); + $exceptionMessage = 'Expected response code 200, got ' . + $response->getStatus(); if (self::getVerboseExceptionMessages()) { $exceptionMessage .= "\n" . $response->getBody(); } @@ -512,15 +711,23 @@ class Zend_Gdata_App * @param Zend_Http_Client $client The client used for communication * @param string $className The class which is used as the return type * @throws Zend_Gdata_App_Exception - * @return Zend_Gdata_App_Feed + * @return string|Zend_Gdata_App_Feed Returns string only if the object + * mapping has been disabled explicitly + * by passing false to the + * useObjectMapping() function. */ - public static function import($uri, $client = null, $className='Zend_Gdata_App_Feed') + public static function import($uri, $client = null, + $className='Zend_Gdata_App_Feed') { $app = new Zend_Gdata_App($client); $requestData = $app->prepareRequest('GET', $uri); - $response = $app->performHttpRequest($requestData['method'], $requestData['url']); + $response = $app->performHttpRequest( + $requestData['method'], $requestData['url']); $feedContent = $response->getBody(); + if (!$this->_useObjectMapping) { + return $feedContent; + } $feed = self::importString($feedContent, $className); if ($client != null) { $feed->setHttpClient($client); @@ -533,31 +740,65 @@ class Zend_Gdata_App * * @param string $url The URL to import * @param string $className The class which is used as the return type + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. * @throws Zend_Gdata_App_Exception - * @return Zend_Gdata_App_Feed + * @return string|Zend_Gdata_App_Feed Returns string only if the object + * mapping has been disabled explicitly + * by passing false to the + * useObjectMapping() function. */ - public function importUrl($url, $className='Zend_Gdata_App_Feed') + public function importUrl($url, $className='Zend_Gdata_App_Feed', + $extraHeaders = array()) { - $response = $this->get($url); - + $response = $this->get($url, $extraHeaders); + $feedContent = $response->getBody(); - $feed = self::importString($feedContent, $className); + if (!$this->_useObjectMapping) { + return $feedContent; + } + + $protocolVersionStr = $response->getHeader('GData-Version'); + $majorProtocolVersion = null; + $minorProtocolVersion = null; + if ($protocolVersionStr !== null) { + // Extract protocol major and minor version from header + $delimiterPos = strpos($protocolVersionStr, '.'); + $length = strlen($protocolVersionStr); + $major = substr($protocolVersionStr, 0, $delimiterPos); + $minor = substr($protocolVersionStr, $delimiterPos + 1, $length); + $majorProtocolVersion = $major; + $minorProtocolVersion = $minor; + } + + $feed = self::importString($feedContent, $className, + $majorProtocolVersion, $minorProtocolVersion); if ($this->getHttpClient() != null) { $feed->setHttpClient($this->getHttpClient()); - } + } + $etag = $response->getHeader('ETag'); + if ($etag !== null) { + $feed->setEtag($etag); + } return $feed; - } + } /** * Imports a feed represented by $string. * - * @param string $string - * @param string $className The class which is used as the return type + * @param string $string + * @param string $className The class which is used as the return type + * @param integer $majorProcolVersion (optional) The major protocol version + * of the data model object that is to be created. + * @param integer $minorProcolVersion (optional) The minor protocol version + * of the data model object that is to be created. * @throws Zend_Gdata_App_Exception * @return Zend_Gdata_App_Feed */ - public static function importString($string, $className='Zend_Gdata_App_Feed') + public static function importString($string, + $className='Zend_Gdata_App_Feed', $majorProtocolVersion = null, + $minorProtocolVersion = null) { // Load the feed as an XML DOMDocument object @ini_set('track_errors', 1); @@ -567,9 +808,14 @@ class Zend_Gdata_App if (!$success) { require_once 'Zend/Gdata/App/Exception.php'; - throw new Zend_Gdata_App_Exception("DOMDocument cannot parse XML: $php_errormsg"); + throw new Zend_Gdata_App_Exception( + "DOMDocument cannot parse XML: $php_errormsg"); } - $feed = new $className($string); + + $feed = new $className(); + $feed->setMajorProtocolVersion($majorProtocolVersion); + $feed->setMinorProtocolVersion($minorProtocolVersion); + $feed->transferFromXML($string); $feed->setHttpClient(self::getstaticHttpClient()); return $feed; } @@ -582,7 +828,7 @@ class Zend_Gdata_App * @param string $className The class which is used as the return type * @param string $useIncludePath Whether the include_path should be searched * @throws Zend_Gdata_App_Exception - * @return Zend_Gdata_Feed + * @return Zend_Gdata_App_Feed */ public static function importFile($filename, $className='Zend_Gdata_App_Feed', $useIncludePath = false) @@ -592,22 +838,27 @@ class Zend_Gdata_App @ini_restore('track_errors'); if ($feed === false) { require_once 'Zend/Gdata/App/Exception.php'; - throw new Zend_Gdata_App_Exception("File could not be loaded: $php_errormsg"); + throw new Zend_Gdata_App_Exception( + "File could not be loaded: $php_errormsg"); } return self::importString($feed, $className); } /** - * GET a uri using client object + * GET a URI using client object. * - * @param string $uri + * @param string $uri GET URI + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. * @throws Zend_Gdata_App_HttpException * @return Zend_Http_Response */ - public function get($uri) + public function get($uri, $extraHeaders = array()) { - $requestData = $this->prepareRequest('GET', $uri); - return $this->performHttpRequest($requestData['method'], $requestData['url']); + $requestData = $this->prepareRequest('GET', $uri, $extraHeaders); + return $this->performHttpRequest( + $requestData['method'], $requestData['url'], + $requestData['headers']); } /** @@ -617,7 +868,8 @@ class Zend_Gdata_App * @param string $uri POST URI * @param array $headers Additional HTTP headers to insert. * @param string $contentType Content-type of the data - * @param array $extraHaders Extra headers to add to the request + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. * @return Zend_Http_Response * @throws Zend_Gdata_App_Exception * @throws Zend_Gdata_App_HttpException @@ -626,11 +878,11 @@ class Zend_Gdata_App public function post($data, $uri = null, $remainingRedirects = null, $contentType = null, $extraHeaders = null) { - $requestData = $this->prepareRequest('POST', $uri, $extraHeaders, - $data, $contentType); + $requestData = $this->prepareRequest( + 'POST', $uri, $extraHeaders, $data, $contentType); return $this->performHttpRequest( - $requestData['method'], $requestData['url'], - $requestData['headers'], $requestData['data'], + $requestData['method'], $requestData['url'], + $requestData['headers'], $requestData['data'], $requestData['contentType']); } @@ -641,7 +893,8 @@ class Zend_Gdata_App * @param string $uri PUT URI * @param array $headers Additional HTTP headers to insert. * @param string $contentType Content-type of the data - * @param array $extraHaders Extra headers to add to the request + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. * @return Zend_Http_Response * @throws Zend_Gdata_App_Exception * @throws Zend_Gdata_App_HttpException @@ -650,10 +903,11 @@ class Zend_Gdata_App public function put($data, $uri = null, $remainingRedirects = null, $contentType = null, $extraHeaders = null) { - $requestData = $this->prepareRequest('PUT', $uri, $extraHeaders, $data, $contentType); + $requestData = $this->prepareRequest( + 'PUT', $uri, $extraHeaders, $data, $contentType); return $this->performHttpRequest( - $requestData['method'], $requestData['url'], - $requestData['headers'], $requestData['data'], + $requestData['method'], $requestData['url'], + $requestData['headers'], $requestData['data'], $requestData['contentType']); } @@ -671,26 +925,44 @@ class Zend_Gdata_App if (is_string($data)) { $requestData = $this->prepareRequest('DELETE', $data); } else { - $requestData = $this->prepareRequest('DELETE', null, null, $data); + $headers = array(); + + $requestData = $this->prepareRequest( + 'DELETE', null, $headers, $data); } - return $this->performHttpRequest($requestData['method'], $requestData['url'], - $requestData['headers'], '', $requestData['contentType'], + return $this->performHttpRequest($requestData['method'], + $requestData['url'], + $requestData['headers'], + '', + $requestData['contentType'], $remainingRedirects); } /** - * Inserts an entry to a given URI and returns the response as a fully formed Entry. + * Inserts an entry to a given URI and returns the response as a + * fully formed Entry. + * * @param mixed $data The Zend_Gdata_App_Entry or XML to post * @param string $uri POST URI * @param string $className The class of entry to be returned. - * @return Zend_Gdata_App_Entry The entry returned by the service after insertion. + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return Zend_Gdata_App_Entry The entry returned by the service after + * insertion. */ - public function insertEntry($data, $uri, $className='Zend_Gdata_App_Entry') + public function insertEntry($data, $uri, $className='Zend_Gdata_App_Entry', + $extraHeaders = array()) { - $response = $this->post($data, $uri); + $response = $this->post($data, $uri, null, null, $extraHeaders); $returnEntry = new $className($response->getBody()); $returnEntry->setHttpClient(self::getstaticHttpClient()); + + $etag = $response->getHeader('ETag'); + if ($etag !== null) { + $returnEntry->setEtag($etag); + } + return $returnEntry; } @@ -698,20 +970,34 @@ class Zend_Gdata_App * Update an entry * * @param mixed $data Zend_Gdata_App_Entry or XML (w/ID and link rel='edit') + * @param string|null The URI to send requests to, or null if $data + * contains the URI. + * @param string|null The name of the class that should be deserialized + * from the server response. If null, then 'Zend_Gdata_App_Entry' + * will be used. + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. * @return Zend_Gdata_App_Entry The entry returned from the server * @throws Zend_Gdata_App_Exception */ - public function updateEntry($data, $uri = null, $className = null) + public function updateEntry($data, $uri = null, $className = null, + $extraHeaders = array()) { if ($className === null && $data instanceof Zend_Gdata_App_Entry) { $className = get_class($data); } elseif ($className === null) { $className = 'Zend_Gdata_App_Entry'; } - - $response = $this->put($data, $uri); + + $response = $this->put($data, $uri, null, null, $extraHeaders); $returnEntry = new $className($response->getBody()); $returnEntry->setHttpClient(self::getstaticHttpClient()); + + $etag = $response->getHeader('ETag'); + if ($etag !== null) { + $returnEntry->setEtag($etag); + } + return $returnEntry; } @@ -735,8 +1021,13 @@ class Zend_Gdata_App $foundClassName = null; foreach ($this->_registeredPackages as $name) { try { - @Zend_Loader::loadClass("${name}_${class}"); - $foundClassName = "${name}_${class}"; + // Autoloading disabled on next line for compatibility + // with magic factories. See ZF-6660. + if (!class_exists($name . '_' . $class, false)) { + require_once 'Zend/Loader.php'; + @Zend_Loader::loadClass($name . '_' . $class); + } + $foundClassName = $name . '_' . $class; break; } catch (Zend_Exception $e) { // package wasn't here- continue searching @@ -744,7 +1035,17 @@ class Zend_Gdata_App } if ($foundClassName != null) { $reflectionObj = new ReflectionClass($foundClassName); - return $reflectionObj->newInstanceArgs($args); + $instance = $reflectionObj->newInstanceArgs($args); + if ($instance instanceof Zend_Gdata_App_FeedEntryParent) { + $instance->setHttpClient($this->_httpClient); + + // Propogate version data + $instance->setMajorProtocolVersion( + $this->_majorProtocolVersion); + $instance->setMinorProtocolVersion( + $this->_minorProtocolVersion); + } + return $instance; } else { require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception( @@ -758,12 +1059,12 @@ class Zend_Gdata_App /** * Retrieve all entries for a feed, iterating through pages as necessary. - * Be aware that calling this function on a large dataset will take a - * significant amount of time to complete. In some cases this may cause + * Be aware that calling this function on a large dataset will take a + * significant amount of time to complete. In some cases this may cause * execution to timeout without proper precautions in place. * * @param $feed The feed to iterate through. - * @return mixed A new feed of the same type as the one originally + * @return mixed A new feed of the same type as the one originally * passed in, containing all relevent entries. */ public function retrieveAllEntriesForFeed($feed) { @@ -774,7 +1075,7 @@ class Zend_Gdata_App foreach ($feed as $entry) { $result->addEntry($entry); } - + $next = $feed->getLink('next'); if ($next !== null) { $feed = $this->getFeed($next->href, $feedClass); @@ -791,14 +1092,120 @@ class Zend_Gdata_App * Zend_Http_Client_Adapter used for performing the requests. * NOTE: This will not work if you have customized the adapter * already to use a proxy server or other interface. - * + * * @param $logfile The logfile to use when logging the requests */ - public function enableRequestDebugLogging($logfile) + public function enableRequestDebugLogging($logfile) { $this->_httpClient->setConfig(array( 'adapter' => 'Zend_Gdata_App_LoggingHttpClientAdapterSocket', 'logfile' => $logfile )); } + + /** + * Retrieve next set of results based on a given feed. + * + * @param Zend_Gdata_App_Feed $feed The feed from which to + * retreive the next set of results. + * @param string $className (optional) The class of feed to be returned. + * If null, the next feed (if found) will be the same class as + * the feed that was given as the first argument. + * @return Zend_Gdata_App_Feed|null Returns a + * Zend_Gdata_App_Feed or null if no next set of results + * exists. + */ + public function getNextFeed($feed, $className = null) + { + $nextLink = $feed->getNextLink(); + if (!$nextLink) { + return null; + } + $nextLinkHref = $nextLink->getHref(); + + if ($className === null) { + $className = get_class($feed); + } + + return $this->getFeed($nextLinkHref, $className); + } + + /** + * Retrieve previous set of results based on a given feed. + * + * @param Zend_Gdata_App_Feed $feed The feed from which to + * retreive the previous set of results. + * @param string $className (optional) The class of feed to be returned. + * If null, the previous feed (if found) will be the same class as + * the feed that was given as the first argument. + * @return Zend_Gdata_App_Feed|null Returns a + * Zend_Gdata_App_Feed or null if no previous set of results + * exists. + */ + public function getPreviousFeed($feed, $className = null) + { + $previousLink = $feed->getPreviousLink(); + if (!$previousLink) { + return null; + } + $previousLinkHref = $previousLink->getHref(); + + if ($className === null) { + $className = get_class($feed); + } + + return $this->getFeed($previousLinkHref, $className); + } + + /** + * Returns the data for an If-Match header based on the current Etag + * property. If Etags are not supported by the server or cannot be + * extracted from the data, then null will be returned. + * + * @param boolean $allowWeak If false, then if a weak Etag is detected, + * then return null rather than the Etag. + * @return string|null $data + */ + public function generateIfMatchHeaderData($data, $allowWeek) + { + $result = ''; + // Set an If-Match header if an ETag has been set (version >= 2 only) + if ($this->_majorProtocolVersion >= 2 && + $data instanceof Zend_Gdata_App_Entry) { + $etag = $data->getEtag(); + if (($etag !== null) && + ($allowWeek || substr($etag, 0, 2) != 'W/')) { + $result = $data->getEtag(); + } + } + return $result; + } + + /** + * Determine whether service object is using XML to object mapping. + * + * @return boolean True if service object is using XML to object mapping, + * false otherwise. + */ + public function usingObjectMapping() + { + return $this->_useObjectMapping; + } + + /** + * Enable/disable the use of XML to object mapping. + * + * @param boolean $value Pass in true to use the XML to object mapping. + * Pass in false or null to disable it. + * @return void + */ + public function useObjectMapping($value) + { + if ($value === True) { + $this->_useObjectMapping = true; + } else { + $this->_useObjectMapping = false; + } + } + } diff --git a/lib/zend/Zend/Gdata/App/AuthException.php b/lib/zend/Zend/Gdata/App/AuthException.php new file mode 100644 index 0000000000..d852f2a4ce --- /dev/null +++ b/lib/zend/Zend/Gdata/App/AuthException.php @@ -0,0 +1,41 @@ + 'http://www.w3.org/2005/Atom', - 'app' => 'http://purl.org/atom/app#' - ); + protected $_namespaces = array( + 'atom' => array( + 1 => array( + 0 => 'http://www.w3.org/2005/Atom' + ) + ), + 'app' => array( + 1 => array( + 0 => 'http://purl.org/atom/app#' + ), + 2 => array( + 0 => 'http://www.w3.org/2007/app' + ) + ) + ); public function __construct() { @@ -129,8 +167,8 @@ abstract class Zend_Gdata_App_Base /** * Returns an array of all extension attributes not transformed into data - * model properties during parsing of the XML. Each element of the array - * is a hashed array of the format: + * model properties during parsing of the XML. Each element of the array + * is a hashed array of the format: * array('namespaceUri' => string, 'name' => string, 'value' => string); * * @return array All extension attributes @@ -142,8 +180,8 @@ abstract class Zend_Gdata_App_Base /** * Sets an array of all extension attributes not transformed into data - * model properties during parsing of the XML. Each element of the array - * is a hashed array of the format: + * model properties during parsing of the XML. Each element of the array + * is a hashed array of the format: * array('namespaceUri' => string, 'name' => string, 'value' => string); * This can be used to add arbitrary attributes to any data model element * @@ -166,9 +204,9 @@ abstract class Zend_Gdata_App_Base * @return DOMElement The DOMElement representing this element and all * child properties. */ - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - if (is_null($doc)) { + if ($doc === null) { $doc = new DOMDocument('1.0', 'utf-8'); } if ($this->_rootNamespaceURI != null) { @@ -302,7 +340,7 @@ abstract class Zend_Gdata_App_Base { return $this->saveXML(); } - + /** * Alias for saveXML() * @@ -324,15 +362,45 @@ abstract class Zend_Gdata_App_Base * available. Returns the prefix, unmodified, if it's not * registered. * + * @param string $prefix The namespace prefix to lookup. + * @param integer $majorVersion The major protocol version in effect. + * Defaults to '1'. + * @param integer $minorVersion The minor protocol version in effect. + * Defaults to null (use latest). * @return string */ - public function lookupNamespace($prefix) + public function lookupNamespace($prefix, + $majorVersion = 1, + $minorVersion = null) { - return isset($this->_namespaces[$prefix]) ? - $this->_namespaces[$prefix] : - $prefix; - } + // Check for a memoized result + $key = $prefix . ' ' . + (is_null($majorVersion) ? 'NULL' : $majorVersion) . + ' '. (is_null($minorVersion) ? 'NULL' : $minorVersion); + if (array_key_exists($key, self::$_namespaceLookupCache)) + return self::$_namespaceLookupCache[$key]; + // If no match, return the prefix by default + $result = $prefix; + + // Find tuple of keys that correspond to the namespace we should use + if (isset($this->_namespaces[$prefix])) { + // Major version search + $nsData = $this->_namespaces[$prefix]; + $foundMajorV = Zend_Gdata_App_Util::findGreatestBoundedValue( + $majorVersion, $nsData); + // Minor version search + $nsData = $nsData[$foundMajorV]; + $foundMinorV = Zend_Gdata_App_Util::findGreatestBoundedValue( + $minorVersion, $nsData); + // Extract NS + $result = $nsData[$foundMinorV]; + } + // Memoize result + self::$_namespaceLookupCache[$key] = $result; + + return $result; + } /** * Add a namespace and prefix to the registered list @@ -341,17 +409,62 @@ abstract class Zend_Gdata_App_Base * list of registered namespaces for use by * $this->lookupNamespace(). * + * WARNING: Currently, registering a namespace will NOT invalidate any + * memoized data stored in $_namespaceLookupCache. Under normal + * use, this behavior is acceptable. If you are adding + * contradictory data to the namespace lookup table, you must + * call flushNamespaceLookupCache(). + * * @param string $prefix The namespace prefix * @param string $namespaceUri The full namespace URI + * @param integer $majorVersion The major protocol version in effect. + * Defaults to '1'. + * @param integer $minorVersion The minor protocol version in effect. + * Defaults to null (use latest). * @return void */ - public function registerNamespace($prefix, $namespaceUri) + public function registerNamespace($prefix, + $namespaceUri, + $majorVersion = 1, + $minorVersion = 0) { - $this->_namespaces[$prefix] = $namespaceUri; + $this->_namespaces[$prefix][$majorVersion][$minorVersion] = + $namespaceUri; } /** - * Magic getter to allow acces like $entry->foo to call $entry->getFoo() + * Flush namespace lookup cache. + * + * Empties the namespace lookup cache. Call this function if you have + * added data to the namespace lookup table that contradicts values that + * may have been cached during a previous call to lookupNamespace(). + */ + public static function flushNamespaceLookupCache() + { + self::$_namespaceLookupCache = array(); + } + + /** + * Add an array of namespaces to the registered list. + * + * Takes an array in the format of: + * namespace prefix, namespace URI, major protocol version, + * minor protocol version and adds them with calls to ->registerNamespace() + * + * @param array $namespaceArray An array of namespaces. + * @return void + */ + public function registerAllNamespaces($namespaceArray) + { + foreach($namespaceArray as $namespace) { + $this->registerNamespace( + $namespace[0], $namespace[1], $namespace[2], $namespace[3]); + } + } + + + /** + * Magic getter to allow access like $entry->foo to call $entry->getFoo() * Alternatively, if no getFoo() is defined, but a $_foo protected variable * is defined, this is returned. * @@ -390,7 +503,7 @@ abstract class Zend_Gdata_App_Base $method = 'set'.ucfirst($name); if (method_exists($this, $method)) { return call_user_func(array(&$this, $method), $val); - } else if (isset($this->{'_' . $name}) || is_null($this->{'_' . $name})) { + } else if (isset($this->{'_' . $name}) || ($this->{'_' . $name} === null)) { $this->{'_' . $name} = $val; } else { require_once 'Zend/Gdata/App/InvalidArgumentException.php'; diff --git a/lib/zend/Zend/Gdata/App/BaseMediaSource.php b/lib/zend/Zend/Gdata/App/BaseMediaSource.php index 772f589cd0..cbec12ed5c 100644 --- a/lib/zend/Zend/Gdata/App/BaseMediaSource.php +++ b/lib/zend/Zend/Gdata/App/BaseMediaSource.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/MediaSource.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_Gdata_App_BaseMediaSource implements Zend_Gdata_App_MediaSource @@ -50,8 +53,8 @@ abstract class Zend_Gdata_App_BaseMediaSource implements Zend_Gdata_App_MediaSou * @var string */ protected $_slug = null; - - /** + + /** * The content type for the attached file (example image/png) * * @return string The content type @@ -61,7 +64,7 @@ abstract class Zend_Gdata_App_BaseMediaSource implements Zend_Gdata_App_MediaSou return $this->_contentType; } - /** + /** * Set the content type for the file attached (example image/png) * * @param string $value The content type @@ -74,7 +77,7 @@ abstract class Zend_Gdata_App_BaseMediaSource implements Zend_Gdata_App_MediaSou } /** - * Returns the Slug header value. Used by some services to determine the + * Returns the Slug header value. Used by some services to determine the * title for the uploaded file. Returns null if no slug should be used. * * @return string @@ -84,7 +87,7 @@ abstract class Zend_Gdata_App_BaseMediaSource implements Zend_Gdata_App_MediaSou } /** - * Sets the Slug header value. Used by some services to determine the + * Sets the Slug header value. Used by some services to determine the * title for the uploaded file. A null value indicates no slug header. * * @var string The slug value @@ -134,7 +137,7 @@ abstract class Zend_Gdata_App_BaseMediaSource implements Zend_Gdata_App_MediaSou $method = 'set'.ucfirst($name); if (method_exists($this, $method)) { return call_user_func(array(&$this, $method), $val); - } else if (isset($this->{'_' . $name}) || is_null($this->{'_' . $name})) { + } else if (isset($this->{'_' . $name}) || ($this->{'_' . $name} === null)) { $this->{'_' . $name} = $val; } else { require_once 'Zend/Gdata/App/InvalidArgumentException.php'; @@ -172,5 +175,5 @@ abstract class Zend_Gdata_App_BaseMediaSource implements Zend_Gdata_App_MediaSou } } } - + } diff --git a/lib/zend/Zend/Gdata/App/CaptchaRequiredException.php b/lib/zend/Zend/Gdata/App/CaptchaRequiredException.php new file mode 100644 index 0000000000..85db881a19 --- /dev/null +++ b/lib/zend/Zend/Gdata/App/CaptchaRequiredException.php @@ -0,0 +1,94 @@ +captchaToken = $captchaToken; + $this->captchaUrl = Zend_Gdata_App_CaptchaRequiredException::ACCOUNTS_URL . $captchaUrl; + parent::__construct('CAPTCHA challenge issued by server'); + } + + /** + * Retrieves the token identifier as provided by the server. + * + * @return string + */ + public function getCaptchaToken() { + return $this->captchaToken; + } + + /** + * Retrieves the URL CAPTCHA image as provided by the server. + * + * @return string + */ + public function getCaptchaUrl() { + return $this->captchaUrl; + } + +} diff --git a/lib/zend/Zend/Gdata/App/Entry.php b/lib/zend/Zend/Gdata/App/Entry.php index 2fe1740a91..4f15c3e3f2 100644 --- a/lib/zend/Zend/Gdata/App/Entry.php +++ b/lib/zend/Zend/Gdata/App/Entry.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,6 +31,11 @@ require_once 'Zend/Gdata/App/FeedEntryParent.php'; */ require_once 'Zend/Gdata/App/Extension/Content.php'; +/** + * @see Zend_Gdata_App_Extension_Edited + */ +require_once 'Zend/Gdata/App/Extension/Edited.php'; + /** * @see Zend_Gdata_App_Extension_Published */ @@ -54,7 +61,8 @@ require_once 'Zend/Gdata/App/Extension/Control.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Entry extends Zend_Gdata_App_FeedEntryParent @@ -109,9 +117,16 @@ class Zend_Gdata_App_Entry extends Zend_Gdata_App_FeedEntryParent */ protected $_control = null; - public function getDOM($doc = null) + /** + * app:edited element + * + * @var Zend_Gdata_App_Extension_Edited + */ + protected $_edited = null; + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); + $element = parent::getDOM($doc, $majorVersion, $minorVersion); if ($this->_content != null) { $element->appendChild($this->_content->getDOM($element->ownerDocument)); } @@ -127,6 +142,9 @@ class Zend_Gdata_App_Entry extends Zend_Gdata_App_FeedEntryParent if ($this->_control != null) { $element->appendChild($this->_control->getDOM($element->ownerDocument)); } + if ($this->_edited != null) { + $element->appendChild($this->_edited->getDOM($element->ownerDocument)); + } return $element; } @@ -159,6 +177,11 @@ class Zend_Gdata_App_Entry extends Zend_Gdata_App_FeedEntryParent $control->transferFromDOM($child); $this->_control = $control; break; + case $this->lookupNamespace('app') . ':' . 'edited': + $edited = new Zend_Gdata_App_Extension_Edited(); + $edited->transferFromDOM($child); + $this->_edited = $edited; + break; default: parent::takeChildFromDOM($child); break; @@ -168,13 +191,22 @@ class Zend_Gdata_App_Entry extends Zend_Gdata_App_FeedEntryParent /** * Uploads changes in this entry to the server using Zend_Gdata_App * - * @return Zend_Gdata_App_Entry The updated entry + * @param string|null $uri The URI to send requests to, or null if $data + * contains the URI. + * @param string|null $className The name of the class that should we + * deserializing the server response. If null, then + * 'Zend_Gdata_App_Entry' will be used. + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return Zend_Gdata_App_Entry The updated entry. * @throws Zend_Gdata_App_Exception */ - public function save() + public function save($uri = null, $className = null, $extraHeaders = array()) { - $service = new Zend_Gdata_App($this->getHttpClient()); - return $service->updateEntry($this); + return $this->getService()->updateEntry($this, + $uri, + $className, + $extraHeaders); } /** @@ -187,8 +219,57 @@ class Zend_Gdata_App_Entry extends Zend_Gdata_App_FeedEntryParent */ public function delete() { - $service = new Zend_Gdata_App($this->getHttpClient()); - $service->delete($this); + $this->getService()->delete($this); + } + + /** + * Reload the current entry. Returns a new copy of the entry as returned + * by the server, or null if no changes exist. This does not + * modify the current entry instance. + * + * @param string|null The URI to send requests to, or null if $data + * contains the URI. + * @param string|null The name of the class that should we deserializing + * the server response. If null, then 'Zend_Gdata_App_Entry' will + * be used. + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return mixed A new instance of the current entry with updated data, or + * null if the server reports that no changes have been made. + * @throws Zend_Gdata_App_Exception + */ + public function reload($uri = null, $className = null, $extraHeaders = array()) + { + // Get URI + $editLink = $this->getEditLink(); + if (($uri === null) && $editLink != null) { + $uri = $editLink->getHref(); + } + + // Set classname to current class, if not otherwise set + if ($className === null) { + $className = get_class($this); + } + + // Append ETag, if present (Gdata v2 and above, only) and doesn't + // conflict with existing headers + if ($this->_etag != null + && !array_key_exists('If-Match', $extraHeaders) + && !array_key_exists('If-None-Match', $extraHeaders)) { + $extraHeaders['If-None-Match'] = $this->_etag; + } + + // If an HTTP 304 status (Not Modified)is returned, then we return + // null. + $result = null; + try { + $result = $this->service->importUrl($uri, $className, $extraHeaders); + } catch (Zend_Gdata_App_HttpException $e) { + if ($e->getResponse()->getStatus() != '304') + throw $e; + } + + return $result; } /** @@ -304,4 +385,5 @@ class Zend_Gdata_App_Entry extends Zend_Gdata_App_FeedEntryParent $this->_control = $value; return $this; } + } diff --git a/lib/zend/Zend/Gdata/App/Exception.php b/lib/zend/Zend/Gdata/App/Exception.php new file mode 100644 index 0000000000..44773c479c --- /dev/null +++ b/lib/zend/Zend/Gdata/App/Exception.php @@ -0,0 +1,43 @@ +_label = $label; } - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); - if ($this->_term != null) { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_term !== null) { $element->setAttribute('term', $this->_term); } - if ($this->_scheme != null) { + if ($this->_scheme !== null) { $element->setAttribute('scheme', $this->_scheme); } - if ($this->_label != null) { + if ($this->_label !== null) { $element->setAttribute('label', $this->_label); } return $element; @@ -81,7 +84,7 @@ class Zend_Gdata_App_Extension_Category extends Zend_Gdata_App_Extension } /** - * @return Zend_Gdata_App_Extension_Term + * @return string|null */ public function getTerm() { @@ -89,7 +92,7 @@ class Zend_Gdata_App_Extension_Category extends Zend_Gdata_App_Extension } /** - * @param Zend_Gdata_App_Extension_Term $value + * @param string|null $value * @return Zend_Gdata_App_Extension_Category Provides a fluent interface */ public function setTerm($value) @@ -99,7 +102,7 @@ class Zend_Gdata_App_Extension_Category extends Zend_Gdata_App_Extension } /** - * @return Zend_Gdata_App_Extension_Scheme + * @return string|null */ public function getScheme() { @@ -107,7 +110,7 @@ class Zend_Gdata_App_Extension_Category extends Zend_Gdata_App_Extension } /** - * @param Zend_Gdata_App_Extension_Scheme $value + * @param string|null $value * @return Zend_Gdata_App_Extension_Category Provides a fluent interface */ public function setScheme($value) @@ -117,9 +120,7 @@ class Zend_Gdata_App_Extension_Category extends Zend_Gdata_App_Extension } /** - - /** - * @return Zend_Gdata_App_Extension_Label + * @return string|null */ public function getLabel() { @@ -127,7 +128,7 @@ class Zend_Gdata_App_Extension_Category extends Zend_Gdata_App_Extension } /** - * @param Zend_Gdata_App_Extension_Label $value + * @param string|null $value * @return Zend_Gdata_App_Extension_Category Provides a fluent interface */ public function setLabel($value) diff --git a/lib/zend/Zend/Gdata/App/Extension/Content.php b/lib/zend/Zend/Gdata/App/Extension/Content.php index e42dbf7d6f..42a38f7a6c 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Content.php +++ b/lib/zend/Zend/Gdata/App/Extension/Content.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension/Text.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Content extends Zend_Gdata_App_Extension_Text @@ -44,10 +47,10 @@ class Zend_Gdata_App_Extension_Content extends Zend_Gdata_App_Extension_Text $this->_src = $src; } - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); - if ($this->_src != null) { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_src !== null) { $element->setAttribute('src', $this->_src); } return $element; @@ -65,7 +68,7 @@ class Zend_Gdata_App_Extension_Content extends Zend_Gdata_App_Extension_Text } /** - * @return Zend_Gdata_App_Extension_Src + * @return string */ public function getSrc() { @@ -73,7 +76,7 @@ class Zend_Gdata_App_Extension_Content extends Zend_Gdata_App_Extension_Text } /** - * @param Zend_Gdata_App_Extension_Src $value + * @param string $value * @return Zend_Gdata_App_Entry Provides a fluent interface */ public function setSrc($value) diff --git a/lib/zend/Zend/Gdata/App/Extension/Contributor.php b/lib/zend/Zend/Gdata/App/Extension/Contributor.php index 9c219dc719..b9509487e4 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Contributor.php +++ b/lib/zend/Zend/Gdata/App/Extension/Contributor.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension/Person.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Contributor extends Zend_Gdata_App_Extension_Person diff --git a/lib/zend/Zend/Gdata/App/Extension/Control.php b/lib/zend/Zend/Gdata/App/Extension/Control.php index 90c42029fc..702c55b0ca 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Control.php +++ b/lib/zend/Zend/Gdata/App/Extension/Control.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -34,7 +36,8 @@ require_once 'Zend/Gdata/App/Extension/Draft.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Control extends Zend_Gdata_App_Extension @@ -50,9 +53,9 @@ class Zend_Gdata_App_Extension_Control extends Zend_Gdata_App_Extension $this->_draft = $draft; } - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); + $element = parent::getDOM($doc, $majorVersion, $minorVersion); if ($this->_draft != null) { $element->appendChild($this->_draft->getDOM($element->ownerDocument)); } diff --git a/lib/zend/Zend/Gdata/App/Extension/Draft.php b/lib/zend/Zend/Gdata/App/Extension/Draft.php index c002bffefa..46ff8bae85 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Draft.php +++ b/lib/zend/Zend/Gdata/App/Extension/Draft.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Draft extends Zend_Gdata_App_Extension diff --git a/lib/zend/Zend/Gdata/App/Extension/Edited.php b/lib/zend/Zend/Gdata/App/Extension/Edited.php new file mode 100644 index 0000000000..dce479e1c6 --- /dev/null +++ b/lib/zend/Zend/Gdata/App/Extension/Edited.php @@ -0,0 +1,49 @@ +_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/App/Extension/Element.php b/lib/zend/Zend/Gdata/App/Extension/Element.php index b936124756..e983ec5f89 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Element.php +++ b/lib/zend/Zend/Gdata/App/Extension/Element.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -30,7 +32,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Element extends Zend_Gdata_App_Extension diff --git a/lib/zend/Zend/Gdata/App/Extension/Email.php b/lib/zend/Zend/Gdata/App/Extension/Email.php index 953679d0c1..05b01c0725 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Email.php +++ b/lib/zend/Zend/Gdata/App/Extension/Email.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Email extends Zend_Gdata_App_Extension diff --git a/lib/zend/Zend/Gdata/App/Extension/Generator.php b/lib/zend/Zend/Gdata/App/Extension/Generator.php index b8d15492b8..576a46750a 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Generator.php +++ b/lib/zend/Zend/Gdata/App/Extension/Generator.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Generator extends Zend_Gdata_App_Extension @@ -47,13 +50,13 @@ class Zend_Gdata_App_Extension_Generator extends Zend_Gdata_App_Extension $this->_version = $version; } - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); - if ($this->_uri != null) { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_uri !== null) { $element->setAttribute('uri', $this->_uri); } - if ($this->_version != null) { + if ($this->_version !== null) { $element->setAttribute('version', $this->_version); } return $element; diff --git a/lib/zend/Zend/Gdata/App/Extension/Icon.php b/lib/zend/Zend/Gdata/App/Extension/Icon.php index 44324b7bb8..ef769d096b 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Icon.php +++ b/lib/zend/Zend/Gdata/App/Extension/Icon.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Icon extends Zend_Gdata_App_Extension diff --git a/lib/zend/Zend/Gdata/App/Extension/Id.php b/lib/zend/Zend/Gdata/App/Extension/Id.php index 446489c2e3..cdfc8e7907 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Id.php +++ b/lib/zend/Zend/Gdata/App/Extension/Id.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Id extends Zend_Gdata_App_Extension diff --git a/lib/zend/Zend/Gdata/App/Extension/Link.php b/lib/zend/Zend/Gdata/App/Extension/Link.php index 829e61443c..a50609832e 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Link.php +++ b/lib/zend/Zend/Gdata/App/Extension/Link.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension @@ -55,25 +58,25 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension $this->_length = $length; } - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); - if ($this->_href != null) { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_href !== null) { $element->setAttribute('href', $this->_href); } - if ($this->_rel != null) { + if ($this->_rel !== null) { $element->setAttribute('rel', $this->_rel); } - if ($this->_type != null) { + if ($this->_type !== null) { $element->setAttribute('type', $this->_type); } - if ($this->_hrefLang != null) { + if ($this->_hrefLang !== null) { $element->setAttribute('hreflang', $this->_hrefLang); } - if ($this->_title != null) { + if ($this->_title !== null) { $element->setAttribute('title', $this->_title); } - if ($this->_length != null) { + if ($this->_length !== null) { $element->setAttribute('length', $this->_length); } return $element; @@ -106,7 +109,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @return Zend_Gdata_App_Extension_Href + * @return string|null */ public function getHref() { @@ -114,7 +117,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @param Zend_Gdata_App_Extension_Href $value + * @param string|null $value * @return Zend_Gdata_App_Entry Provides a fluent interface */ public function setHref($value) @@ -124,7 +127,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @return Zend_Gdata_App_Extension_Rel + * @return string|null */ public function getRel() { @@ -132,7 +135,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @param Zend_Gdata_App_Extension_Rel $value + * @param string|null $value * @return Zend_Gdata_App_Entry Provides a fluent interface */ public function setRel($value) @@ -142,7 +145,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @return Zend_Gdata_App_Extension_Type + * @return string|null */ public function getType() { @@ -150,7 +153,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @param Zend_Gdata_App_Extension_Type $value + * @param string|null $value * @return Zend_Gdata_App_Entry Provides a fluent interface */ public function setType($value) @@ -160,7 +163,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @return Zend_Gdata_App_Extension_HrefLang + * @return string|null */ public function getHrefLang() { @@ -168,7 +171,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @param Zend_Gdata_App_Extension_HrefLang $value + * @param string|null $value * @return Zend_Gdata_App_Entry Provides a fluent interface */ public function setHrefLang($value) @@ -178,7 +181,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @return Zend_Gdata_App_Extension_Title + * @return string|null */ public function getTitle() { @@ -186,7 +189,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @param Zend_Gdata_App_Extension_Title $value + * @param string|null $value * @return Zend_Gdata_App_Entry Provides a fluent interface */ public function setTitle($value) @@ -196,7 +199,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @return Zend_Gdata_App_Extension_Length + * @return string|null */ public function getLength() { @@ -204,7 +207,7 @@ class Zend_Gdata_App_Extension_Link extends Zend_Gdata_App_Extension } /** - * @param Zend_Gdata_App_Extension_Length $value + * @param string|null $value * @return Zend_Gdata_App_Entry Provides a fluent interface */ public function setLength($value) diff --git a/lib/zend/Zend/Gdata/App/Extension/Logo.php b/lib/zend/Zend/Gdata/App/Extension/Logo.php index 9d19e59df4..23bcf85ea9 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Logo.php +++ b/lib/zend/Zend/Gdata/App/Extension/Logo.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Logo extends Zend_Gdata_App_Extension diff --git a/lib/zend/Zend/Gdata/App/Extension/Name.php b/lib/zend/Zend/Gdata/App/Extension/Name.php index c726072790..f0a85b6707 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Name.php +++ b/lib/zend/Zend/Gdata/App/Extension/Name.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Name extends Zend_Gdata_App_Extension diff --git a/lib/zend/Zend/Gdata/App/Extension/Person.php b/lib/zend/Zend/Gdata/App/Extension/Person.php index 294125d5c0..7dd74788b1 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Person.php +++ b/lib/zend/Zend/Gdata/App/Extension/Person.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -44,7 +46,8 @@ require_once 'Zend/Gdata/App/Extension/Uri.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_Gdata_App_Extension_Person extends Zend_Gdata_App_Extension @@ -63,9 +66,9 @@ abstract class Zend_Gdata_App_Extension_Person extends Zend_Gdata_App_Extension $this->_uri = $uri; } - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); + $element = parent::getDOM($doc, $majorVersion, $minorVersion); if ($this->_name != null) { $element->appendChild($this->_name->getDOM($element->ownerDocument)); } diff --git a/lib/zend/Zend/Gdata/App/Extension/Published.php b/lib/zend/Zend/Gdata/App/Extension/Published.php index 7072538668..55c1105e80 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Published.php +++ b/lib/zend/Zend/Gdata/App/Extension/Published.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Published extends Zend_Gdata_App_Extension diff --git a/lib/zend/Zend/Gdata/App/Extension/Rights.php b/lib/zend/Zend/Gdata/App/Extension/Rights.php index a050d5da27..a0c34e8f12 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Rights.php +++ b/lib/zend/Zend/Gdata/App/Extension/Rights.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension/Text.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Rights extends Zend_Gdata_App_Extension_Text diff --git a/lib/zend/Zend/Gdata/App/Extension/Source.php b/lib/zend/Zend/Gdata/App/Extension/Source.php index 5df072fe0e..9bc1d4966d 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Source.php +++ b/lib/zend/Zend/Gdata/App/Extension/Source.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -32,7 +34,8 @@ require_once 'Zend/Gdata/App/FeedSourceParent.php'; /** * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Source extends Zend_Gdata_App_FeedSourceParent diff --git a/lib/zend/Zend/Gdata/App/Extension/Subtitle.php b/lib/zend/Zend/Gdata/App/Extension/Subtitle.php index f82d5b64bd..dd1435509e 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Subtitle.php +++ b/lib/zend/Zend/Gdata/App/Extension/Subtitle.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension/Text.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Subtitle extends Zend_Gdata_App_Extension_Text diff --git a/lib/zend/Zend/Gdata/App/Extension/Summary.php b/lib/zend/Zend/Gdata/App/Extension/Summary.php index 7b61eb2560..8c84086262 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Summary.php +++ b/lib/zend/Zend/Gdata/App/Extension/Summary.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension/Text.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Summary extends Zend_Gdata_App_Extension_Text diff --git a/lib/zend/Zend/Gdata/App/Extension/Text.php b/lib/zend/Zend/Gdata/App/Extension/Text.php index 3780665351..4dedfe81a3 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Text.php +++ b/lib/zend/Zend/Gdata/App/Extension/Text.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -30,7 +32,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_Gdata_App_Extension_Text extends Zend_Gdata_App_Extension @@ -46,10 +49,10 @@ abstract class Zend_Gdata_App_Extension_Text extends Zend_Gdata_App_Extension $this->_type = $type; } - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); - if ($this->_type != null) { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_type !== null) { $element->setAttribute('type', $this->_type); } return $element; diff --git a/lib/zend/Zend/Gdata/App/Extension/Title.php b/lib/zend/Zend/Gdata/App/Extension/Title.php index de0856b26a..977e38be15 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Title.php +++ b/lib/zend/Zend/Gdata/App/Extension/Title.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension/Text.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Title extends Zend_Gdata_App_Extension_Text diff --git a/lib/zend/Zend/Gdata/App/Extension/Updated.php b/lib/zend/Zend/Gdata/App/Extension/Updated.php index f081d2ba17..f939319b1c 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Updated.php +++ b/lib/zend/Zend/Gdata/App/Extension/Updated.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Updated extends Zend_Gdata_App_Extension diff --git a/lib/zend/Zend/Gdata/App/Extension/Uri.php b/lib/zend/Zend/Gdata/App/Extension/Uri.php index 03a0d32c7c..0844a5d1e4 100644 --- a/lib/zend/Zend/Gdata/App/Extension/Uri.php +++ b/lib/zend/Zend/Gdata/App/Extension/Uri.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Extension_Uri extends Zend_Gdata_App_Extension diff --git a/lib/zend/Zend/Gdata/App/Feed.php b/lib/zend/Zend/Gdata/App/Feed.php index 4e2900c392..780dc7f77a 100644 --- a/lib/zend/Zend/Gdata/App/Feed.php +++ b/lib/zend/Zend/Gdata/App/Feed.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -34,7 +36,8 @@ require_once 'Zend/Gdata/App/FeedSourceParent.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_Feed extends Zend_Gdata_App_FeedSourceParent @@ -89,9 +92,9 @@ class Zend_Gdata_App_Feed extends Zend_Gdata_App_FeedSourceParent * @param DOMDocument $doc * @return DOMElement */ - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); + $element = parent::getDOM($doc, $majorVersion, $minorVersion); foreach ($this->_entry as $entry) { $element->appendChild($entry->getDOM($element->ownerDocument)); } @@ -111,6 +114,8 @@ class Zend_Gdata_App_Feed extends Zend_Gdata_App_FeedSourceParent case $this->lookupNamespace('atom') . ':' . 'entry': $newEntry = new $this->_entryClassName($child); $newEntry->setHttpClient($this->getHttpClient()); + $newEntry->setMajorProtocolVersion($this->getMajorProtocolVersion()); + $newEntry->setMinorProtocolVersion($this->getMinorProtocolVersion()); $this->_entry[] = $newEntry; break; default: @@ -223,7 +228,8 @@ class Zend_Gdata_App_Feed extends Zend_Gdata_App_FeedSourceParent * @param Zend_Gdata_App_Entry $value The value to set * @return void */ - public function offsetSet($key, $value) { + public function offsetSet($key, $value) + { $this->_entry[$key] = $value; } @@ -233,7 +239,8 @@ class Zend_Gdata_App_Feed extends Zend_Gdata_App_FeedSourceParent * @param int $key The index to get * @param Zend_Gdata_App_Entry $value The value to set */ - public function offsetGet($key) { + public function offsetGet($key) + { if (array_key_exists($key, $this->_entry)) { return $this->_entry[$key]; } @@ -245,7 +252,8 @@ class Zend_Gdata_App_Feed extends Zend_Gdata_App_FeedSourceParent * @param int $key The index to set * @param Zend_Gdata_App_Entry $value The value to set */ - public function offsetUnset($key) { + public function offsetUnset($key) + { if (array_key_exists($key, $this->_entry)) { unset($this->_entry[$key]); } @@ -257,8 +265,88 @@ class Zend_Gdata_App_Feed extends Zend_Gdata_App_FeedSourceParent * @param int $key The index to check for existence * @return boolean */ - public function offsetExists($offset) { + public function offsetExists($key) + { return (array_key_exists($key, $this->_entry)); } + /** + * Retrieve the next set of results from this feed. + * + * @throws Zend_Gdata_App_Exception + * @return mixed|null Returns the next set of results as a feed of the same + * class as this feed, or null if no results exist. + */ + public function getNextFeed() + { + $nextLink = $this->getNextLink(); + if (!$nextLink) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_Exception('No link to next set ' . + 'of results found.'); + } + $nextLinkHref = $nextLink->getHref(); + $service = new Zend_Gdata_App($this->getHttpClient()); + + return $service->getFeed($nextLinkHref, get_class($this)); + } + + /** + * Retrieve the previous set of results from this feed. + * + * @throws Zend_Gdata_App_Exception + * @return mixed|null Returns the previous set of results as a feed of + * the same class as this feed, or null if no results exist. + */ + public function getPreviousFeed() + { + $previousLink = $this->getPreviousLink(); + if (!$previousLink) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_Exception('No link to previous set ' . + 'of results found.'); + } + $previousLinkHref = $previousLink->getHref(); + $service = new Zend_Gdata_App($this->getHttpClient()); + + return $service->getFeed($previousLinkHref, get_class($this)); + } + + /** + * Set the major protocol version that should be used. Values < 1 will + * cause a Zend_Gdata_App_InvalidArgumentException to be thrown. + * + * This value will be propogated to all child entries. + * + * @see _majorProtocolVersion + * @param (int|NULL) $value The major protocol version to use. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setMajorProtocolVersion($value) + { + parent::setMajorProtocolVersion($value); + foreach ($this->entries as $entry) { + $entry->setMajorProtocolVersion($value); + } + } + + /** + * Set the minor protocol version that should be used. If set to NULL, no + * minor protocol version will be sent to the server. Values < 0 will + * cause a Zend_Gdata_App_InvalidArgumentException to be thrown. + * + * This value will be propogated to all child entries. + * + * @see _minorProtocolVersion + * @param (int|NULL) $value The minor protocol version to use. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setMinorProtocolVersion($value) + { + parent::setMinorProtocolVersion($value); + foreach ($this->entries as $entry) { + $entry->setMinorProtocolVersion($value); + } + } + } diff --git a/lib/zend/Zend/Gdata/App/FeedEntryParent.php b/lib/zend/Zend/Gdata/App/FeedEntryParent.php index 64ce5c5c34..a8cf8c6018 100644 --- a/lib/zend/Zend/Gdata/App/FeedEntryParent.php +++ b/lib/zend/Zend/Gdata/App/FeedEntryParent.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -74,18 +76,26 @@ require_once 'Zend/Version.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base { + /** + * Service instance used to make network requests. + * + * @see setService(), getService() + */ + protected $_service = null; /** - * HTTP client object to use for retrieving feeds + * The HTTP ETag associated with this entry. Used for optimistic + * concurrency in protoco v2 or greater. * - * @var Zend_Http_Client + * @var string|null */ - protected $_httpClient = null; + protected $_etag = NULL; protected $_author = array(); protected $_category = array(); @@ -96,6 +106,26 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base protected $_title = null; protected $_updated = null; + /** + * Indicates the major protocol version that should be used. + * At present, recognized values are either 1 or 2. However, any integer + * value >= 1 is considered valid. + * + * @see setMajorProtocolVersion() + * @see getMajorProtocolVersion() + */ + protected $_majorProtocolVersion = 1; + + /** + * Indicates the minor protocol version that should be used. Can be set + * to either an integer >= 0, or NULL if no minor version should be sent + * to the server. + * + * @see setMinorProtocolVersion() + * @see getMinorProtocolVersion() + */ + protected $_minorProtocolVersion = null; + /** * Constructs a Feed or Entry */ @@ -103,25 +133,11 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base { if (!($element instanceof DOMElement)) { if ($element) { - // Load the feed as an XML DOMDocument object - @ini_set('track_errors', 1); - $doc = new DOMDocument(); - $success = @$doc->loadXML($element); - @ini_restore('track_errors'); - if (!$success) { - require_once 'Zend/Gdata/App/Exception.php'; - throw new Zend_Gdata_App_Exception("DOMDocument cannot parse XML: $php_errormsg"); - } - $element = $doc->getElementsByTagName($this->_rootElement)->item(0); - if (!$element) { - require_once 'Zend/Gdata/App/Exception.php'; - throw new Zend_Gdata_App_Exception('No root <' . $this->_rootElement . '> element found, cannot parse feed.'); - } - $this->transferFromDOM($element); + $this->transferFromXML($element); } } else { $this->transferFromDOM($element); - } + } } /** @@ -129,43 +145,65 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base * * Sets the HTTP client object to use for retrieving the feed. * + * @deprecated Deprecated as of Zend Framework 1.7. Use + * setService() instead. * @param Zend_Http_Client $httpClient * @return Zend_Gdata_App_Feed Provides a fluent interface */ public function setHttpClient(Zend_Http_Client $httpClient) { - $this->_httpClient = $httpClient; + if (!$this->_service) { + $this->_service = new Zend_Gdata_App(); + } + $this->_service->setHttpClient($httpClient); return $this; } - /** - * Gets the HTTP client object. If none is set, a new Zend_Http_Client will be used. + * Gets the HTTP client object. If none is set, a new Zend_Http_Client + * will be used. * + * @deprecated Deprecated as of Zend Framework 1.7. Use + * getService() instead. * @return Zend_Http_Client_Abstract */ public function getHttpClient() { - if (!$this->_httpClient instanceof Zend_Http_Client) { - /** - * @see Zend_Http_Client - */ - require_once 'Zend/Http/Client.php'; - $this->_httpClient = new Zend_Http_Client(); - $useragent = 'Zend_Framework_Gdata/' . Zend_Version::VERSION; - $this->_httpClient->setConfig(array( - 'strictredirects' => true, - 'useragent' => $useragent - ) - ); + if (!$this->_service) { + $this->_service = new Zend_Gdata_App(); } - return $this->_httpClient; + $client = $this->_service->getHttpClient(); + return $client; } + /** + * Set the active service instance for this object. This will be used to + * perform network requests, such as when calling save() and delete(). + * + * @param Zend_Gdata_App $instance The new service instance. + * @return Zend_Gdata_App_FeedEntryParent Provides a fluent interface. + */ + public function setService($instance) + { + $this->_service = $instance; + return $this; + } - public function getDOM($doc = null) + /** + * Get the active service instance for this object. This will be used to + * perform network requests, such as when calling save() and delete(). + * + * @return Zend_Gdata_App|null The current service instance, or null if + * not set. + */ + public function getService() + { + return $this->_service; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); + $element = parent::getDOM($doc, $majorVersion, $minorVersion); foreach ($this->_author as $author) { $element->appendChild($author->getDOM($element->ownerDocument)); } @@ -332,8 +370,8 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base /** * Given a particular 'rel' value, this method returns a matching - * Zend_Gdata_App_Extension_Link element. If the 'rel' value - * is not provided, the full array of Zend_Gdata_App_Extension_Link + * Zend_Gdata_App_Extension_Link element. If the 'rel' value + * is not provided, the full array of Zend_Gdata_App_Extension_Link * elements is returned. In an atom feed, each link is represented * by an atom:link element. The 'rel' value passed to this function * is the atom:link/@rel attribute. Example rel values include 'self', @@ -362,7 +400,7 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base /** * Returns the Zend_Gdata_App_Extension_Link element which represents * the URL used to edit this resource. This link is in the atom feed/entry - * as an atom:link with a rel attribute value of 'edit'. + * as an atom:link with a rel attribute value of 'edit'. * * @return Zend_Gdata_App_Extension_Link The link, or null if not found */ @@ -374,8 +412,8 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base /** * Returns the Zend_Gdata_App_Extension_Link element which represents * the URL used to retrieve the next chunk of results when paging through - * a feed. This link is in the atom feed as an atom:link with a - * rel attribute value of 'next'. + * a feed. This link is in the atom feed as an atom:link with a + * rel attribute value of 'next'. * * @return Zend_Gdata_App_Extension_Link The link, or null if not found */ @@ -386,9 +424,9 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base /** * Returns the Zend_Gdata_App_Extension_Link element which represents - * the URL used to retrieve the previous chunk of results when paging - * through a feed. This link is in the atom feed as an atom:link with a - * rel attribute value of 'previous'. + * the URL used to retrieve the previous chunk of results when paging + * through a feed. This link is in the atom feed as an atom:link with a + * rel attribute value of 'previous'. * * @return Zend_Gdata_App_Extension_Link The link, or null if not found */ @@ -408,8 +446,8 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base /** * Returns the Zend_Gdata_App_Extension_Link element which represents * the URL used to retrieve the entry or feed represented by this object - * This link is in the atom feed/entry as an atom:link with a - * rel attribute value of 'self'. + * This link is in the atom feed/entry as an atom:link with a + * rel attribute value of 'self'. * * @return Zend_Gdata_App_Extension_Link The link, or null if not found */ @@ -421,11 +459,11 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base /** * Returns the Zend_Gdata_App_Extension_Link element which represents * the URL for an alternate view of the data represented by this feed or - * entry. This alternate view is commonly a user-facing webpage, blog + * entry. This alternate view is commonly a user-facing webpage, blog * post, etc. The MIME type for the data at the URL is available from the - * returned Zend_Gdata_App_Extension_Link element. - * This link is in the atom feed/entry as an atom:link with a - * rel attribute value of 'self'. + * returned Zend_Gdata_App_Extension_Link element. + * This link is in the atom feed/entry as an atom:link with a + * rel attribute value of 'self'. * * @return Zend_Gdata_App_Extension_Link The link, or null if not found */ @@ -475,8 +513,8 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base } /** - * Returns a string representation of the title of this feed or entry. - * The title is an extremely short textual representation of this + * Returns a string representation of the title of this feed or entry. + * The title is an extremely short textual representation of this * resource and is found as an atom:title element in a feed or entry * * @return string @@ -522,4 +560,122 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base return $this; } + /** + * Set the Etag for the current entry to $value. Setting $value to null + * unsets the Etag. + * + * @param string|null $value + * @return Zend_Gdata_App_Entry Provides a fluent interface + */ + public function setEtag($value) { + $this->_etag = $value; + return $this; + } + + /** + * Return the Etag for the current entry, or null if not set. + * + * @return string|null + */ + public function getEtag() { + return $this->_etag; + } + + /** + * Set the major protocol version that should be used. Values < 1 + * (excluding NULL) will cause a Zend_Gdata_App_InvalidArgumentException + * to be thrown. + * + * @see _majorProtocolVersion + * @param (int|NULL) $value The major protocol version to use. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setMajorProtocolVersion($value) + { + if (!($value >= 1) && ($value !== null)) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException( + 'Major protocol version must be >= 1'); + } + $this->_majorProtocolVersion = $value; + } + + /** + * Get the major protocol version that is in use. + * + * @see _majorProtocolVersion + * @return (int|NULL) The major protocol version in use. + */ + public function getMajorProtocolVersion() + { + return $this->_majorProtocolVersion; + } + + /** + * Set the minor protocol version that should be used. If set to NULL, no + * minor protocol version will be sent to the server. Values < 0 will + * cause a Zend_Gdata_App_InvalidArgumentException to be thrown. + * + * @see _minorProtocolVersion + * @param (int|NULL) $value The minor protocol version to use. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setMinorProtocolVersion($value) + { + if (!($value >= 0)) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException( + 'Minor protocol version must be >= 0 or null'); + } + $this->_minorProtocolVersion = $value; + } + + /** + * Get the minor protocol version that is in use. + * + * @see _minorProtocolVersion + * @return (int|NULL) The major protocol version in use, or NULL if no + * minor version is specified. + */ + public function getMinorProtocolVersion() + { + return $this->_minorProtocolVersion; + } + + /** + * Get the full version of a namespace prefix + * + * Looks up a prefix (atom:, etc.) in the list of registered + * namespaces and returns the full namespace URI if + * available. Returns the prefix, unmodified, if it's not + * registered. + * + * The current entry or feed's version will be used when performing the + * namespace lookup unless overridden using $majorVersion and + * $minorVersion. If the entry/fee has a null version, then the latest + * protocol version will be used by default. + * + * @param string $prefix The namespace prefix to lookup. + * @param integer $majorVersion The major protocol version in effect. + * Defaults to null (auto-select). + * @param integer $minorVersion The minor protocol version in effect. + * Defaults to null (auto-select). + * @return string + */ + public function lookupNamespace($prefix, + $majorVersion = null, + $minorVersion = null) + { + // Auto-select current version + if ($majorVersion === null) { + $majorVersion = $this->getMajorProtocolVersion(); + } + if ($minorVersion === null) { + $minorVersion = $this->getMinorProtocolVersion(); + } + + // Perform lookup + return parent::lookupNamespace($prefix, $majorVersion, $minorVersion); + } + } diff --git a/lib/zend/Zend/Gdata/App/FeedSourceParent.php b/lib/zend/Zend/Gdata/App/FeedSourceParent.php index d4e52a89bd..9cdc6fafae 100644 --- a/lib/zend/Zend/Gdata/App/FeedSourceParent.php +++ b/lib/zend/Zend/Gdata/App/FeedSourceParent.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -54,7 +56,8 @@ require_once 'Zend/Gdata/App/Extension/Subtitle.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_Gdata_App_FeedSourceParent extends Zend_Gdata_App_FeedEntryParent @@ -84,18 +87,37 @@ abstract class Zend_Gdata_App_FeedSourceParent extends Zend_Gdata_App_FeedEntryP * * Sets the HTTP client object to use for retrieving the feed. * + * @deprecated Deprecated as of Zend Framework 1.7. Use + * setService() instead. * @param Zend_Http_Client $httpClient * @return Zend_Gdata_App_FeedSourceParent Provides a fluent interface */ public function setHttpClient(Zend_Http_Client $httpClient) { - $this->_httpClient = $httpClient; + parent::setHttpClient($httpClient); foreach ($this->_entry as $entry) { $entry->setHttpClient($httpClient); } return $this; } - + + /** + * Set the active service instance for this feed and all enclosed entries. + * This will be used to perform network requests, such as when calling + * save() and delete(). + * + * @param Zend_Gdata_App $instance The new service instance. + * @return Zend_Gdata_App_FeedEntryParent Provides a fluent interface. + */ + public function setService($instance) + { + parent::setService($instance); + foreach ($this->_entry as $entry) { + $entry->setService($instance); + } + return $this; + } + /** * Make accessing some individual elements of the feed easier. * @@ -116,9 +138,9 @@ abstract class Zend_Gdata_App_FeedSourceParent extends Zend_Gdata_App_FeedEntryP } - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); + $element = parent::getDOM($doc, $majorVersion, $minorVersion); if ($this->_generator != null) { $element->appendChild($this->_generator->getDOM($element->ownerDocument)); } diff --git a/lib/zend/Zend/Gdata/App/HttpException.php b/lib/zend/Zend/Gdata/App/HttpException.php new file mode 100644 index 0000000000..70c29566a6 --- /dev/null +++ b/lib/zend/Zend/Gdata/App/HttpException.php @@ -0,0 +1,121 @@ +_httpClientException = $e; + $this->_response = $response; + parent::__construct($message); + } + + /** + * Get the Zend_Http_Client_Exception. + * + * @return Zend_Http_Client_Exception + */ + public function getHttpClientException() + { + return $this->_httpClientException; + } + + /** + * Set the Zend_Http_Client_Exception. + * + * @param Zend_Http_Client_Exception $value + */ + public function setHttpClientException($value) + { + $this->_httpClientException = $value; + return $this; + } + + /** + * Set the Zend_Http_Response. + * + * @param Zend_Http_Response $response + */ + public function setResponse($response) + { + $this->_response = $response; + return $this; + } + + /** + * Get the Zend_Http_Response. + * + * @return Zend_Http_Response + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Get the body of the Zend_Http_Response + * + * @return string + */ + public function getRawResponseBody() + { + if ($this->getResponse()) { + $response = $this->getResponse(); + return $response->getRawBody(); + } + return null; + } + +} diff --git a/lib/zend/Zend/Gdata/App/IOException.php b/lib/zend/Zend/Gdata/App/IOException.php new file mode 100644 index 0000000000..e91f2da77b --- /dev/null +++ b/lib/zend/Zend/Gdata/App/IOException.php @@ -0,0 +1,43 @@ +log_handle == null) { + $this->log_handle = fopen($this->config['logfile'], 'a'); + } + fwrite($this->log_handle, $message); + } + + /** + * Connect to the remote server + * + * @param string $host + * @param int $port + * @param boolean $secure + * @param int $timeout + */ + public function connect($host, $port = 80, $secure = false) + { + $this->log("Connecting to: ${host}:${port}"); + return parent::connect($host, $port, $secure); + } + + /** + * Send request to the remote server + * + * @param string $method + * @param Zend_Uri_Http $uri + * @param string $http_ver + * @param array $headers + * @param string $body + * @return string Request as string + */ + public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') + { + $request = parent::write($method, $uri, $http_ver, $headers, $body); + $this->log("\n\n" . $request); + return $request; + } + + /** + * Read response from server + * + * @return string + */ + public function read() + { + $response = parent::read(); + $this->log("${response}\n\n"); + return $response; + } + + /** + * Close the connection to the server + * + */ + public function close() + { + $this->log("Closing socket\n\n"); + parent::close(); + } + +} diff --git a/lib/zend/Zend/Gdata/App/MediaEntry.php b/lib/zend/Zend/Gdata/App/MediaEntry.php index fe57438e47..d93269d8f5 100644 --- a/lib/zend/Zend/Gdata/App/MediaEntry.php +++ b/lib/zend/Zend/Gdata/App/MediaEntry.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -30,22 +32,17 @@ require_once 'Zend/Gdata/App/Entry.php'; require_once 'Zend/Gdata/App/MediaSource.php'; /** - * @see Zend_Mime + * @see Zend_Gdata_MediaMimeStream */ -require_once 'Zend/Mime.php'; - -/** - * @see Zend_Mime_Message - */ -require_once 'Zend/Mime/Message.php'; - +require_once 'Zend/Gdata/MediaMimeStream.php'; /** * Concrete class for working with Atom entries containing multi-part data. * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_MediaEntry extends Zend_Gdata_App_Entry @@ -53,17 +50,10 @@ class Zend_Gdata_App_MediaEntry extends Zend_Gdata_App_Entry /** * The attached MediaSource/file * - * @var Zend_Gdata_App_MediaSource + * @var Zend_Gdata_App_MediaSource */ protected $_mediaSource = null; - /** - * The Zend_Mime object used to generate the boundary - * - * @var Zend_Mime - */ - protected $_mime = null; - /** * Constructs a new MediaEntry, representing XML data and optional * file to upload @@ -74,50 +64,29 @@ class Zend_Gdata_App_MediaEntry extends Zend_Gdata_App_Entry public function __construct($element = null, $mediaSource = null) { parent::__construct($element); - $this->_mime = new Zend_Mime(); $this->_mediaSource = $mediaSource; } - - /** - * Return the Zend_Mime object associated with this MediaEntry. This - * object is used to generate the media boundaries. - * - * @return Zend_Mime The Zend_Mime object associated with this MediaEntry. - */ - public function getMime() - { - return $this->_mime; - } - + /** * Return the MIME multipart representation of this MediaEntry. * - * @return string The MIME multipart representation of this MediaEntry + * @return string|Zend_Gdata_MediaMimeStream The MIME multipart + * representation of this MediaEntry. If the entry consisted only + * of XML, a string is returned. */ public function encode() { $xmlData = $this->saveXML(); - if ($this->getMediaSource() === null) { + $mediaSource = $this->getMediaSource(); + if ($mediaSource === null) { // No attachment, just send XML for entry return $xmlData; } else { - $mimeMessage = new Zend_Mime_Message(); - $mimeMessage->setMime($this->_mime); - - $xmlPart = new Zend_Mime_Part($xmlData); - $xmlPart->type = 'application/atom+xml'; - $xmlPart->encoding = null; - $mimeMessage->addPart($xmlPart); - - $binaryPart = new Zend_Mime_Part($this->getMediaSource()->encode()); - $binaryPart->type = $this->getMediaSource()->getContentType(); - $binaryPart->encoding = null; - $mimeMessage->addPart($binaryPart); - - return $mimeMessage->generateMessage(); + return new Zend_Gdata_MediaMimeStream($xmlData, + $mediaSource->getFilename(), $mediaSource->getContentType()); } } - + /** * Return the MediaSource object representing the file attached to this * MediaEntry. @@ -146,15 +115,5 @@ class Zend_Gdata_App_MediaEntry extends Zend_Gdata_App_Entry } return $this; } - - /** - * Return the boundary used in the MIME multipart message - * - * @return string The boundary used in the MIME multipart message - */ - public function getBoundary() - { - return $this->_mime->boundary(); - } } diff --git a/lib/zend/Zend/Gdata/App/MediaFileSource.php b/lib/zend/Zend/Gdata/App/MediaFileSource.php index 2970d764bb..f569d6f029 100644 --- a/lib/zend/Zend/Gdata/App/MediaFileSource.php +++ b/lib/zend/Zend/Gdata/App/MediaFileSource.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/App/BaseMediaSource.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource diff --git a/lib/zend/Zend/Gdata/App/MediaSource.php b/lib/zend/Zend/Gdata/App/MediaSource.php index c92e15a69c..5cab24f9ad 100644 --- a/lib/zend/Zend/Gdata/App/MediaSource.php +++ b/lib/zend/Zend/Gdata/App/MediaSource.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -24,7 +26,8 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage App + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ interface Zend_Gdata_App_MediaSource diff --git a/lib/zend/Zend/Gdata/App/Util.php b/lib/zend/Zend/Gdata/App/Util.php new file mode 100644 index 0000000000..eb117522bf --- /dev/null +++ b/lib/zend/Zend/Gdata/App/Util.php @@ -0,0 +1,112 @@ + 0) { + // timestamp is already properly formatted + return $timestamp; + } else { + $ts = strtotime($timestamp); + if ($ts === false) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException("Invalid timestamp: $timestamp."); + } + return date('Y-m-d\TH:i:s', $ts); + } + } + + /** Find the greatest key that is less than or equal to a given upper + * bound, and return the value associated with that key. + * + * @param integer|null $maximumKey The upper bound for keys. If null, the + * maxiumum valued key will be found. + * @param array $collection An two-dimensional array of key/value pairs + * to search through. + * @returns mixed The value corresponding to the located key. + * @throws Zend_Gdata_App_Exception Thrown if $collection is empty. + */ + public static function findGreatestBoundedValue($maximumKey, $collection) + { + $found = false; + $foundKey = $maximumKey; + + // Sanity check: Make sure that the collection isn't empty + if (sizeof($collection) == 0) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("Empty namespace collection encountered."); + } + + if ($maximumKey === null) { + // If the key is null, then we return the maximum available + $keys = array_keys($collection); + sort($keys); + $found = true; + $foundKey = end($keys); + } else { + // Otherwise, we optimistically guess that the current version + // will have a matching namespce. If that fails, we decrement the + // version until we find a match. + while (!$found && $foundKey >= 0) { + if (array_key_exists($foundKey, $collection)) + $found = true; + else + $foundKey--; + } + } + + // Guard: A namespace wasn't found. Either none were registered, or + // the current protcol version is lower than the maximum namespace. + if (!$found) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("Namespace compatible with current protocol not found."); + } + + return $foundKey; + } + +} diff --git a/lib/zend/Zend/Gdata/App/VersionException.php b/lib/zend/Zend/Gdata/App/VersionException.php new file mode 100644 index 0000000000..a9e683d4d9 --- /dev/null +++ b/lib/zend/Zend/Gdata/App/VersionException.php @@ -0,0 +1,42 @@ +setUri($request_uri); + + if ($client instanceof Zend_Gdata_HttpClient) { + $filterResult = $client->filterHttpRequest('GET', $request_uri); + $url = $filterResult['url']; + $headers = $filterResult['headers']; + $client->setHeaders($headers); + $client->setUri($url); + $client->resetParameters(); + } else { + $client->setUri($request_uri); + } + ob_start(); try { $response = $client->request('GET'); @@ -181,7 +195,17 @@ class Zend_Gdata_AuthSub $token, $client = null, $request_uri = self::AUTHSUB_TOKEN_INFO_URI) { $client = self::getHttpClient($token, $client); - $client->setUri($request_uri); + + if ($client instanceof Zend_Gdata_HttpClient) { + $filterResult = $client->filterHttpRequest('GET', $request_uri); + $url = $filterResult['url']; + $headers = $filterResult['headers']; + $client->setHeaders($headers); + $client->setUri($url); + } else { + $client->setUri($request_uri); + } + ob_start(); try { $response = $client->request('GET'); diff --git a/lib/zend/Zend/Gdata/Books.php b/lib/zend/Zend/Gdata/Books.php new file mode 100755 index 0000000000..f23e31e8d2 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books.php @@ -0,0 +1,204 @@ +registerPackage('Zend_Gdata_Books'); + $this->registerPackage('Zend_Gdata_Books_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + } + + /** + * Retrieves a feed of volumes. + * + * @param Zend_Gdata_Query|string|null $location (optional) The URL to + * query or a Zend_Gdata_Query object from which a URL can be + * determined. + * @return Zend_Gdata_Books_VolumeFeed The feed of volumes found at the + * specified URL. + */ + public function getVolumeFeed($location = null) + { + if ($location == null) { + $uri = self::VOLUME_FEED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Books_VolumeFeed'); + } + + /** + * Retrieves a specific volume entry. + * + * @param string|null $volumeId The volumeId of interest. + * @param Zend_Gdata_Query|string|null $location (optional) The URL to + * query or a Zend_Gdata_Query object from which a URL can be + * determined. + * @return Zend_Gdata_Books_VolumeEntry The feed of volumes found at the + * specified URL. + */ + public function getVolumeEntry($volumeId = null, $location = null) + { + if ($volumeId !== null) { + $uri = self::VOLUME_FEED_URI . "/" . $volumeId; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Books_VolumeEntry'); + } + + /** + * Retrieves a feed of volumes, by default the User library feed. + * + * @param Zend_Gdata_Query|string|null $location (optional) The URL to + * query. + * @return Zend_Gdata_Books_VolumeFeed The feed of volumes found at the + * specified URL. + */ + public function getUserLibraryFeed($location = null) + { + if ($location == null) { + $uri = self::MY_LIBRARY_FEED_URI; + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Books_VolumeFeed'); + } + + /** + * Retrieves a feed of volumes, by default the User annotation feed + * + * @param Zend_Gdata_Query|string|null $location (optional) The URL to + * query. + * @return Zend_Gdata_Books_VolumeFeed The feed of volumes found at the + * specified URL. + */ + public function getUserAnnotationFeed($location = null) + { + if ($location == null) { + $uri = self::MY_ANNOTATION_FEED_URI; + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Books_VolumeFeed'); + } + + /** + * Insert a Volume / Annotation + * + * @param Zend_Gdata_Books_VolumeEntry $entry + * @param Zend_Gdata_Query|string|null $location (optional) The URL to + * query + * @return Zend_Gdata_Books_VolumeEntry The inserted volume entry. + */ + public function insertVolume($entry, $location = null) + { + if ($location == null) { + $uri = self::MY_LIBRARY_FEED_URI; + } else { + $uri = $location; + } + return parent::insertEntry( + $entry, $uri, 'Zend_Gdata_Books_VolumeEntry'); + } + + /** + * Delete a Volume + * + * @param Zend_Gdata_Books_VolumeEntry $entry + * @return void + */ + public function deleteVolume($entry) + { + $entry->delete(); + } + +} diff --git a/lib/zend/Zend/Gdata/Books/CollectionEntry.php b/lib/zend/Zend/Gdata/Books/CollectionEntry.php new file mode 100644 index 0000000000..615e309010 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/CollectionEntry.php @@ -0,0 +1,56 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct($element); + } + + +} + diff --git a/lib/zend/Zend/Gdata/Books/CollectionFeed.php b/lib/zend/Zend/Gdata/Books/CollectionFeed.php new file mode 100644 index 0000000000..dda6e97197 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/CollectionFeed.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct($element); + } + + /** + * The classname for individual feed elements. + * + * @var string + */ + protected $_entryClassName = 'Zend_Gdata_Books_CollectionEntry'; + +} + diff --git a/lib/zend/Zend/Gdata/Books/Extension/AnnotationLink.php b/lib/zend/Zend/Gdata/Books/Extension/AnnotationLink.php new file mode 100644 index 0000000000..25820ad9c6 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/Extension/AnnotationLink.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + } + +} + diff --git a/lib/zend/Zend/Gdata/Books/Extension/BooksCategory.php b/lib/zend/Zend/Gdata/Books/Extension/BooksCategory.php new file mode 100644 index 0000000000..bca2eeb763 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/Extension/BooksCategory.php @@ -0,0 +1,59 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct($term, $scheme, $label); + } + +} diff --git a/lib/zend/Zend/Gdata/Books/Extension/BooksLink.php b/lib/zend/Zend/Gdata/Books/Extension/BooksLink.php new file mode 100644 index 0000000000..6230a60115 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/Extension/BooksLink.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + } + + +} + diff --git a/lib/zend/Zend/Gdata/Books/Extension/Embeddability.php b/lib/zend/Zend/Gdata/Books/Extension/Embeddability.php new file mode 100644 index 0000000000..71bbd1465f --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/Extension/Embeddability.php @@ -0,0 +1,122 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves DOMElement which corresponds to this element and all + * child properties. This is used to build this object back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistance. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Extracts XML attributes from the DOM and converts them to the + * appropriate object members. + * + * @param DOMNode $attribute The DOMNode attribute to be handled. + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the programmatic value that describes the embeddability of a + * volume in Google Book Search + * + * @return string|null The value + */ + public function getValue() + { + return $this->_value; + } + + /** + * Sets the programmatic value that describes the embeddability of a + * volume in Google Book Search + * + * @param string|null $value Programmatic value that describes the + * embeddability of a volume in Google Book Search + * @return Zend_Gdata_Books_Extension_Embeddability Provides a fluent + * interface + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + +} + diff --git a/lib/zend/Zend/Gdata/Books/Extension/InfoLink.php b/lib/zend/Zend/Gdata/Books/Extension/InfoLink.php new file mode 100644 index 0000000000..6691f31280 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/Extension/InfoLink.php @@ -0,0 +1,59 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + } + +} diff --git a/lib/zend/Zend/Gdata/Books/Extension/PreviewLink.php b/lib/zend/Zend/Gdata/Books/Extension/PreviewLink.php new file mode 100644 index 0000000000..854c63c83d --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/Extension/PreviewLink.php @@ -0,0 +1,60 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + } + +} diff --git a/lib/zend/Zend/Gdata/Books/Extension/Review.php b/lib/zend/Zend/Gdata/Books/Extension/Review.php new file mode 100644 index 0000000000..660cbeb7a4 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/Extension/Review.php @@ -0,0 +1,152 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct(); + $this->_lang = $lang; + $this->_type = $type; + $this->_text = $value; + } + + /** + * Retrieves DOMElement which corresponds to this element and all + * child properties. This is used to build this object back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistance. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc); + if ($this->_lang !== null) { + $element->setAttribute('lang', $this->_lang); + } + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + return $element; + } + + /** + * Extracts XML attributes from the DOM and converts them to the + * appropriate object members. + * + * @param DOMNode $attribute The DOMNode attribute to be handled. + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'lang': + $this->_lang = $attribute->nodeValue; + break; + case 'type': + $this->_type = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the language of link title + * + * @return string The lang + */ + public function getLang() + { + return $this->_lang; + } + + /** + * Returns the type of text construct (typically 'text', 'html' or 'xhtml') + * + * @return string The type + */ + public function getType() + { + return $this->_type; + } + + /** + * Sets the language of link title + * + * @param string $lang language of link title + * @return Zend_Gdata_Books_Extension_Review Provides a fluent interface + */ + public function setLang($lang) + { + $this->_lang = $lang; + return $this; + } + + /** + * Sets the type of text construct (typically 'text', 'html' or 'xhtml') + * + * @param string $type type of text construct (typically 'text', 'html' or 'xhtml') + * @return Zend_Gdata_Books_Extension_Review Provides a fluent interface + */ + public function setType($type) + { + $this->_type = $type; + return $this; + } + + +} + diff --git a/lib/zend/Zend/Gdata/Books/Extension/ThumbnailLink.php b/lib/zend/Zend/Gdata/Books/Extension/ThumbnailLink.php new file mode 100644 index 0000000000..21f36dc5bf --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/Extension/ThumbnailLink.php @@ -0,0 +1,60 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + } + +} diff --git a/lib/zend/Zend/Gdata/Books/Extension/Viewability.php b/lib/zend/Zend/Gdata/Books/Extension/Viewability.php new file mode 100644 index 0000000000..df7a51e3a7 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/Extension/Viewability.php @@ -0,0 +1,123 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves DOMElement which corresponds to this element and all + * child properties. This is used to build this object back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistance. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Extracts XML attributes from the DOM and converts them to the + * appropriate object members. + * + * @param DOMNode $attribute The DOMNode attribute to be handled. + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the programmatic value that describes the viewability of a volume + * in Google Book Search + * + * @return string The value + */ + public function getValue() + { + return $this->_value; + } + + /** + * Sets the programmatic value that describes the viewability of a volume in + * Google Book Search + * + * @param string $value programmatic value that describes the viewability + * of a volume in Googl eBook Search + * @return Zend_Gdata_Books_Extension_Viewability Provides a fluent + * interface + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + +} + diff --git a/lib/zend/Zend/Gdata/Books/VolumeEntry.php b/lib/zend/Zend/Gdata/Books/VolumeEntry.php new file mode 100644 index 0000000000..9481121740 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/VolumeEntry.php @@ -0,0 +1,687 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves DOMElement which corresponds to this element and all + * child properties. This is used to build this object back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistance. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc); + if ($this->_creators !== null) { + foreach ($this->_creators as $creators) { + $element->appendChild($creators->getDOM( + $element->ownerDocument)); + } + } + if ($this->_dates !== null) { + foreach ($this->_dates as $dates) { + $element->appendChild($dates->getDOM($element->ownerDocument)); + } + } + if ($this->_descriptions !== null) { + foreach ($this->_descriptions as $descriptions) { + $element->appendChild($descriptions->getDOM( + $element->ownerDocument)); + } + } + if ($this->_formats !== null) { + foreach ($this->_formats as $formats) { + $element->appendChild($formats->getDOM( + $element->ownerDocument)); + } + } + if ($this->_identifiers !== null) { + foreach ($this->_identifiers as $identifiers) { + $element->appendChild($identifiers->getDOM( + $element->ownerDocument)); + } + } + if ($this->_languages !== null) { + foreach ($this->_languages as $languages) { + $element->appendChild($languages->getDOM( + $element->ownerDocument)); + } + } + if ($this->_publishers !== null) { + foreach ($this->_publishers as $publishers) { + $element->appendChild($publishers->getDOM( + $element->ownerDocument)); + } + } + if ($this->_subjects !== null) { + foreach ($this->_subjects as $subjects) { + $element->appendChild($subjects->getDOM( + $element->ownerDocument)); + } + } + if ($this->_titles !== null) { + foreach ($this->_titles as $titles) { + $element->appendChild($titles->getDOM($element->ownerDocument)); + } + } + if ($this->_comments !== null) { + $element->appendChild($this->_comments->getDOM( + $element->ownerDocument)); + } + if ($this->_embeddability !== null) { + $element->appendChild($this->_embeddability->getDOM( + $element->ownerDocument)); + } + if ($this->_rating !== null) { + $element->appendChild($this->_rating->getDOM( + $element->ownerDocument)); + } + if ($this->_review !== null) { + $element->appendChild($this->_review->getDOM( + $element->ownerDocument)); + } + if ($this->_viewability !== null) { + $element->appendChild($this->_viewability->getDOM( + $element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual objects of the appropriate type and stores + * them in this object based upon DOM data. + * + * @param DOMNode $child The DOMNode to process. + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('dc') . ':' . 'creator': + $creators = new Zend_Gdata_DublinCore_Extension_Creator(); + $creators->transferFromDOM($child); + $this->_creators[] = $creators; + break; + case $this->lookupNamespace('dc') . ':' . 'date': + $dates = new Zend_Gdata_DublinCore_Extension_Date(); + $dates->transferFromDOM($child); + $this->_dates[] = $dates; + break; + case $this->lookupNamespace('dc') . ':' . 'description': + $descriptions = new Zend_Gdata_DublinCore_Extension_Description(); + $descriptions->transferFromDOM($child); + $this->_descriptions[] = $descriptions; + break; + case $this->lookupNamespace('dc') . ':' . 'format': + $formats = new Zend_Gdata_DublinCore_Extension_Format(); + $formats->transferFromDOM($child); + $this->_formats[] = $formats; + break; + case $this->lookupNamespace('dc') . ':' . 'identifier': + $identifiers = new Zend_Gdata_DublinCore_Extension_Identifier(); + $identifiers->transferFromDOM($child); + $this->_identifiers[] = $identifiers; + break; + case $this->lookupNamespace('dc') . ':' . 'language': + $languages = new Zend_Gdata_DublinCore_Extension_Language(); + $languages->transferFromDOM($child); + $this->_languages[] = $languages; + break; + case $this->lookupNamespace('dc') . ':' . 'publisher': + $publishers = new Zend_Gdata_DublinCore_Extension_Publisher(); + $publishers->transferFromDOM($child); + $this->_publishers[] = $publishers; + break; + case $this->lookupNamespace('dc') . ':' . 'subject': + $subjects = new Zend_Gdata_DublinCore_Extension_Subject(); + $subjects->transferFromDOM($child); + $this->_subjects[] = $subjects; + break; + case $this->lookupNamespace('dc') . ':' . 'title': + $titles = new Zend_Gdata_DublinCore_Extension_Title(); + $titles->transferFromDOM($child); + $this->_titles[] = $titles; + break; + case $this->lookupNamespace('gd') . ':' . 'comments': + $comments = new Zend_Gdata_Extension_Comments(); + $comments->transferFromDOM($child); + $this->_comments = $comments; + break; + case $this->lookupNamespace('gbs') . ':' . 'embeddability': + $embeddability = new Zend_Gdata_Books_Extension_Embeddability(); + $embeddability->transferFromDOM($child); + $this->_embeddability = $embeddability; + break; + case $this->lookupNamespace('gd') . ':' . 'rating': + $rating = new Zend_Gdata_Extension_Rating(); + $rating->transferFromDOM($child); + $this->_rating = $rating; + break; + case $this->lookupNamespace('gbs') . ':' . 'review': + $review = new Zend_Gdata_Books_Extension_Review(); + $review->transferFromDOM($child); + $this->_review = $review; + break; + case $this->lookupNamespace('gbs') . ':' . 'viewability': + $viewability = new Zend_Gdata_Books_Extension_Viewability(); + $viewability->transferFromDOM($child); + $this->_viewability = $viewability; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Returns the Comments class + * + * @return Zend_Gdata_Extension_Comments|null The comments + */ + public function getComments() + { + return $this->_comments; + } + + /** + * Returns the creators + * + * @return array The creators + */ + public function getCreators() + { + return $this->_creators; + } + + /** + * Returns the dates + * + * @return array The dates + */ + public function getDates() + { + return $this->_dates; + } + + /** + * Returns the descriptions + * + * @return array The descriptions + */ + public function getDescriptions() + { + return $this->_descriptions; + } + + /** + * Returns the embeddability + * + * @return Zend_Gdata_Books_Extension_Embeddability|null The embeddability + */ + public function getEmbeddability() + { + return $this->_embeddability; + } + + /** + * Returns the formats + * + * @return array The formats + */ + public function getFormats() + { + return $this->_formats; + } + + /** + * Returns the identifiers + * + * @return array The identifiers + */ + public function getIdentifiers() + { + return $this->_identifiers; + } + + /** + * Returns the languages + * + * @return array The languages + */ + public function getLanguages() + { + return $this->_languages; + } + + /** + * Returns the publishers + * + * @return array The publishers + */ + public function getPublishers() + { + return $this->_publishers; + } + + /** + * Returns the rating + * + * @return Zend_Gdata_Extension_Rating|null The rating + */ + public function getRating() + { + return $this->_rating; + } + + /** + * Returns the review + * + * @return Zend_Gdata_Books_Extension_Review|null The review + */ + public function getReview() + { + return $this->_review; + } + + /** + * Returns the subjects + * + * @return array The subjects + */ + public function getSubjects() + { + return $this->_subjects; + } + + /** + * Returns the titles + * + * @return array The titles + */ + public function getTitles() + { + return $this->_titles; + } + + /** + * Returns the viewability + * + * @return Zend_Gdata_Books_Extension_Viewability|null The viewability + */ + public function getViewability() + { + return $this->_viewability; + } + + /** + * Sets the Comments class + * + * @param Zend_Gdata_Extension_Comments|null $comments Comments class + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setComments($comments) + { + $this->_comments = $comments; + return $this; + } + + /** + * Sets the creators + * + * @param array $creators Creators|null + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setCreators($creators) + { + $this->_creators = $creators; + return $this; + } + + /** + * Sets the dates + * + * @param array $dates dates + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setDates($dates) + { + $this->_dates = $dates; + return $this; + } + + /** + * Sets the descriptions + * + * @param array $descriptions descriptions + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setDescriptions($descriptions) + { + $this->_descriptions = $descriptions; + return $this; + } + + /** + * Sets the embeddability + * + * @param Zend_Gdata_Books_Extension_Embeddability|null $embeddability + * embeddability + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setEmbeddability($embeddability) + { + $this->_embeddability = $embeddability; + return $this; + } + + /** + * Sets the formats + * + * @param array $formats formats + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setFormats($formats) + { + $this->_formats = $formats; + return $this; + } + + /** + * Sets the identifiers + * + * @param array $identifiers identifiers + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setIdentifiers($identifiers) + { + $this->_identifiers = $identifiers; + return $this; + } + + /** + * Sets the languages + * + * @param array $languages languages + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setLanguages($languages) + { + $this->_languages = $languages; + return $this; + } + + /** + * Sets the publishers + * + * @param array $publishers publishers + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setPublishers($publishers) + { + $this->_publishers = $publishers; + return $this; + } + + /** + * Sets the rating + * + * @param Zend_Gdata_Extension_Rating|null $rating rating + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setRating($rating) + { + $this->_rating = $rating; + return $this; + } + + /** + * Sets the review + * + * @param Zend_Gdata_Books_Extension_Review|null $review review + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setReview($review) + { + $this->_review = $review; + return $this; + } + + /** + * Sets the subjects + * + * @param array $subjects subjects + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setSubjects($subjects) + { + $this->_subjects = $subjects; + return $this; + } + + /** + * Sets the titles + * + * @param array $titles titles + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setTitles($titles) + { + $this->_titles = $titles; + return $this; + } + + /** + * Sets the viewability + * + * @param Zend_Gdata_Books_Extension_Viewability|null $viewability + * viewability + * @return Zend_Gdata_Books_VolumeEntry Provides a fluent interface + */ + public function setViewability($viewability) + { + $this->_viewability = $viewability; + return $this; + } + + + /** + * Gets the volume ID based upon the atom:id value + * + * @return string The volume ID + * @throws Zend_Gdata_App_Exception + */ + public function getVolumeId() + { + $fullId = $this->getId()->getText(); + $position = strrpos($fullId, '/'); + if ($position === false) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Slash not found in atom:id'); + } else { + return substr($fullId, strrpos($fullId,'/') + 1); + } + } + + /** + * Gets the thumbnail link + * + * @return Zend_Gdata_App_Extension_link|null The thumbnail link + */ + public function getThumbnailLink() + { + return $this->getLink(self::THUMBNAIL_LINK_REL); + } + + /** + * Gets the preview link + * + * @return Zend_Gdata_App_Extension_Link|null The preview link + */ + public function getPreviewLink() + { + return $this->getLink(self::PREVIEW_LINK_REL); + } + + /** + * Gets the info link + * + * @return Zend_Gdata_App_Extension_Link|null The info link + */ + public function getInfoLink() + { + return $this->getLink(self::INFO_LINK_REL); + } + + /** + * Gets the annotations link + * + * @return Zend_Gdata_App_Extension_Link|null The annotations link + */ + public function getAnnotationLink() + { + return $this->getLink(self::ANNOTATION_LINK_REL); + } + +} diff --git a/lib/zend/Zend/Gdata/Books/VolumeFeed.php b/lib/zend/Zend/Gdata/Books/VolumeFeed.php new file mode 100644 index 0000000000..90858143e9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/VolumeFeed.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Books::$namespaces); + parent::__construct($element); + } + + /** + * The classname for individual feed elements. + * + * @var string + */ + protected $_entryClassName = 'Zend_Gdata_Books_VolumeEntry'; + +} + diff --git a/lib/zend/Zend/Gdata/Books/VolumeQuery.php b/lib/zend/Zend/Gdata/Books/VolumeQuery.php new file mode 100755 index 0000000000..5e869d1d4e --- /dev/null +++ b/lib/zend/Zend/Gdata/Books/VolumeQuery.php @@ -0,0 +1,112 @@ +_params['min-viewability'] = 'full'; + break; + case 'partial_view': + $this->_params['min-viewability'] = 'partial'; + break; + case null: + unset($this->_params['min-viewability']); + break; + } + return $this; + } + + /** + * Minimum viewability of volumes to include in search results + * + * @return string|null min-viewability + */ + public function getMinViewability() + { + if (array_key_exists('min-viewability', $this->_params)) { + return $this->_params['min-viewability']; + } else { + return null; + } + } + + /** + * Returns the generated full query URL + * + * @return string The URL + */ + public function getQueryUrl() + { + if (isset($this->_url)) { + $url = $this->_url; + } else { + $url = Zend_Gdata_Books::VOLUME_FEED_URI; + } + if ($this->getCategory() !== null) { + $url .= '/-/' . $this->getCategory(); + } + $url = $url . $this->getQueryString(); + return $url; + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar.php b/lib/zend/Zend/Gdata/Calendar.php new file mode 100644 index 0000000000..fa491e4500 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar.php @@ -0,0 +1,169 @@ +registerPackage('Zend_Gdata_Calendar'); + $this->registerPackage('Zend_Gdata_Calendar_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + } + + /** + * Retreive feed object + * + * @param mixed $location The location for the feed, as a URL or Query + * @return Zend_Gdata_Calendar_EventFeed + */ + public function getCalendarEventFeed($location = null) + { + if ($location == null) { + $uri = self::CALENDAR_EVENT_FEED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Calendar_EventFeed'); + } + + /** + * Retreive entry object + * + * @return Zend_Gdata_Calendar_EventEntry + */ + public function getCalendarEventEntry($location = null) + { + if ($location == null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Calendar_EventEntry'); + } + + + /** + * Retrieve feed object + * + * @return Zend_Gdata_Calendar_ListFeed + */ + public function getCalendarListFeed() + { + $uri = self::CALENDAR_FEED_URI . '/default'; + return parent::getFeed($uri,'Zend_Gdata_Calendar_ListFeed'); + } + + /** + * Retreive entryobject + * + * @return Zend_Gdata_Calendar_ListEntry + */ + public function getCalendarListEntry($location = null) + { + if ($location == null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri,'Zend_Gdata_Calendar_ListEntry'); + } + + public function insertEvent($event, $uri=null) + { + if ($uri == null) { + $uri = $this->_defaultPostUri; + } + $newEvent = $this->insertEntry($event, $uri, 'Zend_Gdata_Calendar_EventEntry'); + return $newEvent; + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/EventEntry.php b/lib/zend/Zend/Gdata/Calendar/EventEntry.php new file mode 100644 index 0000000000..10701656e4 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/EventEntry.php @@ -0,0 +1,164 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_sendEventNotifications != null) { + $element->appendChild($this->_sendEventNotifications->getDOM($element->ownerDocument)); + } + if ($this->_timezone != null) { + $element->appendChild($this->_timezone->getDOM($element->ownerDocument)); + } + if ($this->_quickadd != null) { + $element->appendChild($this->_quickadd->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gCal') . ':' . 'sendEventNotifications'; + $sendEventNotifications = new Zend_Gdata_Calendar_Extension_SendEventNotifications(); + $sendEventNotifications->transferFromDOM($child); + $this->_sendEventNotifications = $sendEventNotifications; + break; + case $this->lookupNamespace('gCal') . ':' . 'timezone'; + $timezone = new Zend_Gdata_Calendar_Extension_Timezone(); + $timezone->transferFromDOM($child); + $this->_timezone = $timezone; + break; + case $this->lookupNamespace('atom') . ':' . 'link'; + $link = new Zend_Gdata_Calendar_Extension_Link(); + $link->transferFromDOM($child); + $this->_link[] = $link; + break; + case $this->lookupNamespace('gCal') . ':' . 'quickadd'; + $quickadd = new Zend_Gdata_Calendar_Extension_QuickAdd(); + $quickadd->transferFromDOM($child); + $this->_quickadd = $quickadd; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getSendEventNotifications() + { + return $this->_sendEventNotifications; + } + + public function setSendEventNotifications($value) + { + $this->_sendEventNotifications = $value; + return $this; + } + + public function getTimezone() + { + return $this->_timezone; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Timezone $value + * @return Zend_Gdata_Extension_EventEntry Provides a fluent interface + */ + public function setTimezone($value) + { + $this->_timezone = $value; + return $this; + } + + public function getQuickAdd() + { + return $this->_quickadd; + } + + /** + * @param Zend_Gdata_Calendar_Extension_QuickAdd $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setQuickAdd($value) + { + $this->_quickadd = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/EventFeed.php b/lib/zend/Zend/Gdata/Calendar/EventFeed.php new file mode 100644 index 0000000000..ac202ea3f5 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/EventFeed.php @@ -0,0 +1,106 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_timezone != null) { + $element->appendChild($this->_timezone->getDOM($element->ownerDocument)); + } + + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gCal') . ':' . 'timezone'; + $timezone = new Zend_Gdata_Calendar_Extension_Timezone(); + $timezone->transferFromDOM($child); + $this->_timezone = $timezone; + break; + + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getTimezone() + { + return $this->_timezone; + } + + public function setTimezone($value) + { + $this->_timezone = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/EventQuery.php b/lib/zend/Zend/Gdata/Calendar/EventQuery.php new file mode 100644 index 0000000000..7d66e8f221 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/EventQuery.php @@ -0,0 +1,447 @@ +_comments = $value; + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setEvent($value) + { + $this->_event = $value; + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setProjection($value) + { + $this->_projection = $value; + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setUser($value) + { + $this->_user = $value; + return $this; + } + + /** + * @param bool $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + /** + * @return string comments + */ + public function getComments() + { + return $this->_comments; + } + + /** + * @return string event + */ + public function getEvent() + { + return $this->_event; + } + + /** + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * @return string user + */ + public function getUser() + { + return $this->_user; + } + + /** + * @return string visibility + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * @param int $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setStartMax($value) + { + if ($value != null) { + $this->_params['start-max'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['start-max']); + } + return $this; + } + + /** + * @param int $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setStartMin($value) + { + if ($value != null) { + $this->_params['start-min'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['start-min']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setOrderBy($value) + { + if ($value != null) { + $this->_params['orderby'] = $value; + } else { + unset($this->_params['orderby']); + } + return $this; + } + + /** + * @return int start-max + */ + public function getStartMax() + { + if (array_key_exists('start-max', $this->_params)) { + return $this->_params['start-max']; + } else { + return null; + } + } + + /** + * @return int start-min + */ + public function getStartMin() + { + if (array_key_exists('start-min', $this->_params)) { + return $this->_params['start-min']; + } else { + return null; + } + } + + /** + * @return string orderby + */ + public function getOrderBy() + { + if (array_key_exists('orderby', $this->_params)) { + return $this->_params['orderby']; + } else { + return null; + } + } + + /** + * @return string sortorder + */ + public function getSortOrder() + { + if (array_key_exists('sortorder', $this->_params)) { + return $this->_params['sortorder']; + } else { + return null; + } + } + + /** + * @return string sortorder + */ + public function setSortOrder($value) + { + if ($value != null) { + $this->_params['sortorder'] = $value; + } else { + unset($this->_params['sortorder']); + } + return $this; + } + + /** + * @return string recurrence-expansion-start + */ + public function getRecurrenceExpansionStart() + { + if (array_key_exists('recurrence-expansion-start', $this->_params)) { + return $this->_params['recurrence-expansion-start']; + } else { + return null; + } + } + + /** + * @return string recurrence-expansion-start + */ + public function setRecurrenceExpansionStart($value) + { + if ($value != null) { + $this->_params['recurrence-expansion-start'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['recurrence-expansion-start']); + } + return $this; + } + + + /** + * @return string recurrence-expansion-end + */ + public function getRecurrenceExpansionEnd() + { + if (array_key_exists('recurrence-expansion-end', $this->_params)) { + return $this->_params['recurrence-expansion-end']; + } else { + return null; + } + } + + /** + * @return string recurrence-expansion-end + */ + public function setRecurrenceExpansionEnd($value) + { + if ($value != null) { + $this->_params['recurrence-expansion-end'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['recurrence-expansion-end']); + } + return $this; + } + + /** + * @param string $value Also accepts bools. + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function getSingleEvents() + { + if (array_key_exists('singleevents', $this->_params)) { + $value = $this->_params['singleevents']; + switch ($value) { + case 'true': + return true; + break; + case 'false': + return false; + break; + default: + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Invalid query param value for futureevents: ' . + $value . ' It must be a boolean.'); + } + } else { + return null; + } + } + + /** + * @param string $value Also accepts bools. If using a string, must be either "true" or "false". + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setSingleEvents($value) + { + if ($value !== null) { + if (is_bool($value)) { + $this->_params['singleevents'] = ($value?'true':'false'); + } elseif ($value == 'true' | $value == 'false') { + $this->_params['singleevents'] = $value; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Invalid query param value for futureevents: ' . + $value . ' It must be a boolean.'); + } + } else { + unset($this->_params['singleevents']); + } + return $this; + } + + /** + * @return string futureevents + */ + public function getFutureEvents() + { + if (array_key_exists('futureevents', $this->_params)) { + $value = $this->_params['futureevents']; + switch ($value) { + case 'true': + return true; + break; + case 'false': + return false; + break; + default: + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Invalid query param value for futureevents: ' . + $value . ' It must be a boolean.'); + } + } else { + return null; + } + } + + /** + * @param string $value Also accepts bools. If using a string, must be either "true" or "false" or + * an exception will be thrown on retrieval. + * @return Zend_Gdata_Calendar_EventQuery Provides a fluent interface + */ + public function setFutureEvents($value) + { + if ($value !== null) { + if (is_bool($value)) { + $this->_params['futureevents'] = ($value?'true':'false'); + } elseif ($value == 'true' | $value == 'false') { + $this->_params['futureevents'] = $value; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Invalid query param value for futureevents: ' . + $value . ' It must be a boolean.'); + } + } else { + unset($this->_params['futureevents']); + } + return $this; + } + + /** + * @return string url + */ + public function getQueryUrl() + { + if (isset($this->_url)) { + $uri = $this->_url; + } else { + $uri = $this->_defaultFeedUri; + } + if ($this->getUser() != null) { + $uri .= '/' . $this->getUser(); + } else { + $uri .= '/default'; + } + if ($this->getVisibility() != null) { + $uri .= '/' . $this->getVisibility(); + } else { + $uri .= '/public'; + } + if ($this->getProjection() != null) { + $uri .= '/' . $this->getProjection(); + } else { + $uri .= '/full'; + } + if ($this->getEvent() != null) { + $uri .= '/' . $this->getEvent(); + if ($this->getComments() != null) { + $uri .= '/comments/' . $this->getComments(); + } + } + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/Extension/AccessLevel.php b/lib/zend/Zend/Gdata/Calendar/Extension/AccessLevel.php new file mode 100644 index 0000000000..784901813f --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/Extension/AccessLevel.php @@ -0,0 +1,125 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value != null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return string The attribute being modified. + */ + public function getValue() + { + return $this->_value; + } + + + /** + * Set the value for this element's value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_Selected The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/Extension/Color.php b/lib/zend/Zend/Gdata/Calendar/Extension/Color.php new file mode 100644 index 0000000000..a8e2f086c9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/Extension/Color.php @@ -0,0 +1,125 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value != null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return string The value associated with this attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_Color The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->_value; + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/Extension/Hidden.php b/lib/zend/Zend/Gdata/Calendar/Extension/Hidden.php new file mode 100644 index 0000000000..feeb38fef7 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/Extension/Hidden.php @@ -0,0 +1,134 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', ($this->_value ? "true" : "false")); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + if ($attribute->nodeValue == "true") { + $this->_value = true; + } + else if ($attribute->nodeValue == "false") { + $this->_value = false; + } + else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return string The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_Hidden The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->_value; + } + +} + diff --git a/lib/zend/Zend/Gdata/Calendar/Extension/Link.php b/lib/zend/Zend/Gdata/Calendar/Extension/Link.php new file mode 100644 index 0000000000..399b236131 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/Extension/Link.php @@ -0,0 +1,125 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + $this->_webContent = $webContent; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_webContent != null) { + $element->appendChild($this->_webContent->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gCal') . ':' . 'webContent': + $webContent = new Zend_Gdata_Calendar_Extension_WebContent(); + $webContent->transferFromDOM($child); + $this->_webContent = $webContent; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's WebContent attribute. + * + * @return Zend_Gdata_Calendar_Extension_Webcontent The WebContent value + */ + public function getWebContent() + { + return $this->_webContent; + } + + /** + * Set the value for this element's WebContent attribute. + * + * @param Zend_Gdata_Calendar_Extension_WebContent $value The desired value for this attribute. + * @return Zend_Calendar_Extension_Link The element being modified. Provides a fluent interface. + */ + public function setWebContent($value) + { + $this->_webContent = $value; + return $this; + } + + +} + diff --git a/lib/zend/Zend/Gdata/Calendar/Extension/QuickAdd.php b/lib/zend/Zend/Gdata/Calendar/Extension/QuickAdd.php new file mode 100644 index 0000000000..4964f9d19b --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/Extension/QuickAdd.php @@ -0,0 +1,132 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', ($this->_value ? "true" : "false")); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + if ($attribute->nodeValue == "true") { + $this->_value = true; + } + else if ($attribute->nodeValue == "false") { + $this->_value = false; + } + else { + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return string The value associated with this attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_QuickAdd The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/Extension/Selected.php b/lib/zend/Zend/Gdata/Calendar/Extension/Selected.php new file mode 100644 index 0000000000..51496a97dc --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/Extension/Selected.php @@ -0,0 +1,133 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', ($this->_value ? "true" : "false")); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + if ($attribute->nodeValue == "true") { + $this->_value = true; + } + else if ($attribute->nodeValue == "false") { + $this->_value = false; + } + else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return bool The value associated with this attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_Selected The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->_value; + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/Extension/SendEventNotifications.php b/lib/zend/Zend/Gdata/Calendar/Extension/SendEventNotifications.php new file mode 100644 index 0000000000..bab5062e36 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/Extension/SendEventNotifications.php @@ -0,0 +1,132 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', ($this->_value ? "true" : "false")); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + if ($attribute->nodeValue == "true") { + $this->_value = true; + } + else if ($attribute->nodeValue == "false") { + $this->_value = false; + } + else { + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return string The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_SendEventNotifications The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/lib/zend/Zend/Gdata/Calendar/Extension/Timezone.php b/lib/zend/Zend/Gdata/Calendar/Extension/Timezone.php new file mode 100644 index 0000000000..eec973e0a5 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/Extension/Timezone.php @@ -0,0 +1,124 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct(); + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value != null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's value attribute. + * + * @return string The value associated with this attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_Timezone The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/Extension/WebContent.php b/lib/zend/Zend/Gdata/Calendar/Extension/WebContent.php new file mode 100644 index 0000000000..27925cb739 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/Extension/WebContent.php @@ -0,0 +1,177 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct(); + $this->_url = $url; + $this->_height = $height; + $this->_width = $width; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->url != null) { + $element->setAttribute('url', $this->_url); + } + if ($this->height != null) { + $element->setAttribute('height', $this->_height); + } + if ($this->width != null) { + $element->setAttribute('width', $this->_width); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'url': + $this->_url = $attribute->nodeValue; + break; + case 'height': + $this->_height = $attribute->nodeValue; + break; + case 'width': + $this->_width = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's URL attribute. + * + * @return string The desired value for this attribute. + */ + public function getURL() + { + return $this->_url; + } + + /** + * Set the value for this element's URL attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_WebContent The element being modified. + */ + public function setURL($value) + { + $this->_url = $value; + return $this; + } + + /** + * Get the value for this element's height attribute. + * + * @return int The desired value for this attribute. + */ + public function getHeight() + { + return $this->_height; + } + + /** + * Set the value for this element's height attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_WebContent The element being modified. + */ + public function setHeight($value) + { + $this->_height = $value; + return $this; + } + + /** + * Get the value for this element's height attribute. + * + * @return int The desired value for this attribute. + */ + public function getWidth() + { + return $this->_width; + } + + /** + * Set the value for this element's height attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_Calendar_Extension_WebContent The element being modified. + */ + public function setWidth($value) + { + $this->_width = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/ListEntry.php b/lib/zend/Zend/Gdata/Calendar/ListEntry.php new file mode 100644 index 0000000000..99750b1350 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/ListEntry.php @@ -0,0 +1,246 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_accessLevel != null) { + $element->appendChild($this->_accessLevel->getDOM($element->ownerDocument)); + } + if ($this->_color != null) { + $element->appendChild($this->_color->getDOM($element->ownerDocument)); + } + if ($this->_hidden != null) { + $element->appendChild($this->_hidden->getDOM($element->ownerDocument)); + } + if ($this->_selected != null) { + $element->appendChild($this->_selected->getDOM($element->ownerDocument)); + } + if ($this->_timezone != null) { + $element->appendChild($this->_timezone->getDOM($element->ownerDocument)); + } + if ($this->_where != null) { + foreach ($this->_where as $where) { + $element->appendChild($where->getDOM($element->ownerDocument)); + } + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gCal') . ':' . 'accesslevel'; + $accessLevel = new Zend_Gdata_Calendar_Extension_AccessLevel(); + $accessLevel->transferFromDOM($child); + $this->_accessLevel = $accessLevel; + break; + case $this->lookupNamespace('gCal') . ':' . 'color'; + $color = new Zend_Gdata_Calendar_Extension_Color(); + $color->transferFromDOM($child); + $this->_color = $color; + break; + case $this->lookupNamespace('gCal') . ':' . 'hidden'; + $hidden = new Zend_Gdata_Calendar_Extension_Hidden(); + $hidden->transferFromDOM($child); + $this->_hidden = $hidden; + break; + case $this->lookupNamespace('gCal') . ':' . 'selected'; + $selected = new Zend_Gdata_Calendar_Extension_Selected(); + $selected->transferFromDOM($child); + $this->_selected = $selected; + break; + case $this->lookupNamespace('gCal') . ':' . 'timezone'; + $timezone = new Zend_Gdata_Calendar_Extension_Timezone(); + $timezone->transferFromDOM($child); + $this->_timezone = $timezone; + break; + case $this->lookupNamespace('gd') . ':' . 'where'; + $where = new Zend_Gdata_Extension_Where(); + $where->transferFromDOM($child); + $this->_where[] = $where; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getAccessLevel() + { + return $this->_accessLevel; + } + + /** + * @param Zend_Gdata_Calendar_Extension_AccessLevel $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setAccessLevel($value) + { + $this->_accessLevel = $value; + return $this; + } + public function getColor() + { + return $this->_color; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Color $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setColor($value) + { + $this->_color = $value; + return $this; + } + + public function getHidden() + { + return $this->_hidden; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Hidden $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setHidden($value) + { + $this->_hidden = $value; + return $this; + } + + public function getSelected() + { + return $this->_selected; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Selected $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setSelected($value) + { + $this->_selected = $value; + return $this; + } + + public function getTimezone() + { + return $this->_timezone; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Timezone $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setTimezone($value) + { + $this->_timezone = $value; + return $this; + } + + public function getWhere() + { + return $this->_where; + } + + /** + * @param Zend_Gdata_Extension_Where $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setWhere($value) + { + $this->_where = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Calendar/ListFeed.php b/lib/zend/Zend/Gdata/Calendar/ListFeed.php new file mode 100644 index 0000000000..8388b97ea9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Calendar/ListFeed.php @@ -0,0 +1,106 @@ +registerAllNamespaces(Zend_Gdata_Calendar::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_timezone != null) { + $element->appendChild($this->_timezone->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gCal') . ':' . 'timezone'; + $timezone = new Zend_Gdata_Calendar_Extension_Timezone(); + $timezone->transferFromDOM($child); + $this->_timezone = $timezone; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getTimezone() + { + return $this->_timezone; + } + + /** + * @param Zend_Gdata_Calendar_Extension_Timezone $value + * @return Zend_Gdata_Extension_ListEntry Provides a fluent interface + */ + public function setTimezone($value) + { + $this->_timezone = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/ClientLogin.php b/lib/zend/Zend/Gdata/ClientLogin.php index 18c4358db4..d017519a0d 100644 --- a/lib/zend/Zend/Gdata/ClientLogin.php +++ b/lib/zend/Zend/Gdata/ClientLogin.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -36,7 +38,8 @@ require_once 'Zend/Version.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_ClientLogin @@ -150,7 +153,6 @@ class Zend_Gdata_ClientLogin } if ($response->getStatus() == 200) { - $client = new Zend_Gdata_HttpClient(); $client->setClientLoginToken($goog_resp['Auth']); $useragent = $source . ' Zend_Framework_Gdata/' . Zend_Version::VERSION; $client->setConfig(array( diff --git a/lib/zend/Zend/Gdata/Docs.php b/lib/zend/Zend/Gdata/Docs.php index cd63e8df80..fd0d234d8f 100755 --- a/lib/zend/Zend/Gdata/Docs.php +++ b/lib/zend/Zend/Gdata/Docs.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Docs + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -40,7 +42,8 @@ require_once 'Zend/Gdata/Docs/DocumentListEntry.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Docs + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_Docs extends Zend_Gdata @@ -219,8 +222,7 @@ class Zend_Gdata_Docs extends Zend_Gdata // Set the mime type of the data. if ($mimeType === null) { - $slugHeader = $fs->getSlug(); - $filenameParts = explode('.', $slugHeader); + $filenameParts = explode('.', $fileLocation); $fileExtension = end($filenameParts); $mimeType = self::lookupMimeType($fileExtension); } diff --git a/lib/zend/Zend/Gdata/Docs/DocumentListEntry.php b/lib/zend/Zend/Gdata/Docs/DocumentListEntry.php index d483e3f8ac..9bd88d8ed2 100755 --- a/lib/zend/Zend/Gdata/Docs/DocumentListEntry.php +++ b/lib/zend/Zend/Gdata/Docs/DocumentListEntry.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Docs + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -30,7 +32,8 @@ require_once 'Zend/Gdata/Entry.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Docs + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_Docs_DocumentListEntry extends Zend_Gdata_Entry @@ -44,9 +47,7 @@ class Zend_Gdata_Docs_DocumentListEntry extends Zend_Gdata_Entry */ public function __construct($element = null) { - foreach (Zend_Gdata_Docs::$namespaces as $nsPrefix => $nsUri) { - $this->registerNamespace($nsPrefix, $nsUri); - } + $this->registerAllNamespaces(Zend_Gdata_Docs::$namespaces); parent::__construct($element); } diff --git a/lib/zend/Zend/Gdata/Docs/DocumentListFeed.php b/lib/zend/Zend/Gdata/Docs/DocumentListFeed.php index 974588d528..2c45e79725 100755 --- a/lib/zend/Zend/Gdata/Docs/DocumentListFeed.php +++ b/lib/zend/Zend/Gdata/Docs/DocumentListFeed.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Docs + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -30,7 +32,8 @@ require_once 'Zend/Gdata/Feed.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Docs + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_Docs_DocumentListFeed extends Zend_Gdata_Feed @@ -58,9 +61,7 @@ class Zend_Gdata_Docs_DocumentListFeed extends Zend_Gdata_Feed */ public function __construct($element = null) { - foreach (Zend_Gdata_Docs::$namespaces as $nsPrefix => $nsUri) { - $this->registerNamespace($nsPrefix, $nsUri); - } + $this->registerAllNamespaces(Zend_Gdata_Docs::$namespaces); parent::__construct($element); } diff --git a/lib/zend/Zend/Gdata/Docs/Query.php b/lib/zend/Zend/Gdata/Docs/Query.php new file mode 100755 index 0000000000..27f3adeec9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Docs/Query.php @@ -0,0 +1,222 @@ +_projection = $value; + return $this; + } + + /** + * Sets the visibility for this query. Common values for visibility + * include 'private'. + * + * @return Zend_Gdata_Docs_Query Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + /** + * Gets the projection for this query. + * + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * Gets the visibility for this query. + * + * @return string visibility + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * Sets the title attribute for this query. The title parameter is used + * to restrict the results to documents whose titles either contain or + * completely match the title. + * + * @param string $value + * @return Zend_Gdata_Docs_Query Provides a fluent interface + */ + public function setTitle($value) + { + if ($value !== null) { + $this->_params['title'] = $value; + } else { + unset($this->_params['title']); + } + return $this; + } + + /** + * Gets the title attribute for this query. + * + * @return string title + */ + public function getTitle() + { + if (array_key_exists('title', $this->_params)) { + return $this->_params['title']; + } else { + return null; + } + } + + /** + * Sets the title-exact attribute for this query. + * If title-exact is set to true, the title query parameter will be used + * in an exact match. Only documents with a title identical to the + * title parameter will be returned. + * + * @param boolean $value Use either true or false + * @return Zend_Gdata_Docs_Query Provides a fluent interface + */ + public function setTitleExact($value) + { + if ($value) { + $this->_params['title-exact'] = $value; + } else { + unset($this->_params['title-exact']); + } + return $this; + } + + /** + * Gets the title-exact attribute for this query. + * + * @return string title-exact + */ + public function getTitleExact() + { + if (array_key_exists('title-exact', $this->_params)) { + return $this->_params['title-exact']; + } else { + return false; + } + } + + /** + * Gets the full query URL for this query. + * + * @return string url + */ + public function getQueryUrl() + { + $uri = $this->_defaultFeedUri; + + if ($this->_visibility !== null) { + $uri .= '/' . $this->_visibility; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'A visibility must be provided for cell queries.'); + } + + if ($this->_projection !== null) { + $uri .= '/' . $this->_projection; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'A projection must be provided for cell queries.'); + } + + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore.php b/lib/zend/Zend/Gdata/DublinCore.php new file mode 100755 index 0000000000..eeec7d6bba --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore.php @@ -0,0 +1,65 @@ +registerPackage('Zend_Gdata_DublinCore'); + $this->registerPackage('Zend_Gdata_DublinCore_Extension'); + parent::__construct($client, $applicationId); + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore/Extension/Creator.php b/lib/zend/Zend/Gdata/DublinCore/Extension/Creator.php new file mode 100644 index 0000000000..82185df6e2 --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore/Extension/Creator.php @@ -0,0 +1,58 @@ +registerAllNamespaces(Zend_Gdata_DublinCore::$namespaces); + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore/Extension/Date.php b/lib/zend/Zend/Gdata/DublinCore/Extension/Date.php new file mode 100644 index 0000000000..30288f4bac --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore/Extension/Date.php @@ -0,0 +1,60 @@ +registerAllNamespaces(Zend_Gdata_DublinCore::$namespaces); + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore/Extension/Description.php b/lib/zend/Zend/Gdata/DublinCore/Extension/Description.php new file mode 100644 index 0000000000..bd517d337a --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore/Extension/Description.php @@ -0,0 +1,58 @@ +registerAllNamespaces(Zend_Gdata_DublinCore::$namespaces); + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore/Extension/Format.php b/lib/zend/Zend/Gdata/DublinCore/Extension/Format.php new file mode 100644 index 0000000000..ebe3c58a3b --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore/Extension/Format.php @@ -0,0 +1,58 @@ +registerAllNamespaces(Zend_Gdata_DublinCore::$namespaces); + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore/Extension/Identifier.php b/lib/zend/Zend/Gdata/DublinCore/Extension/Identifier.php new file mode 100644 index 0000000000..ee2c18a876 --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore/Extension/Identifier.php @@ -0,0 +1,58 @@ +registerAllNamespaces(Zend_Gdata_DublinCore::$namespaces); + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore/Extension/Language.php b/lib/zend/Zend/Gdata/DublinCore/Extension/Language.php new file mode 100644 index 0000000000..3b943e1689 --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore/Extension/Language.php @@ -0,0 +1,58 @@ +registerAllNamespaces(Zend_Gdata_DublinCore::$namespaces); + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore/Extension/Publisher.php b/lib/zend/Zend/Gdata/DublinCore/Extension/Publisher.php new file mode 100644 index 0000000000..edb4b74d91 --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore/Extension/Publisher.php @@ -0,0 +1,58 @@ +registerAllNamespaces(Zend_Gdata_DublinCore::$namespaces); + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore/Extension/Rights.php b/lib/zend/Zend/Gdata/DublinCore/Extension/Rights.php new file mode 100644 index 0000000000..8ec7e166dc --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore/Extension/Rights.php @@ -0,0 +1,58 @@ +registerAllNamespaces(Zend_Gdata_DublinCore::$namespaces); + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore/Extension/Subject.php b/lib/zend/Zend/Gdata/DublinCore/Extension/Subject.php new file mode 100644 index 0000000000..c91bac897d --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore/Extension/Subject.php @@ -0,0 +1,58 @@ +registerAllNamespaces(Zend_Gdata_DublinCore::$namespaces); + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/lib/zend/Zend/Gdata/DublinCore/Extension/Title.php b/lib/zend/Zend/Gdata/DublinCore/Extension/Title.php new file mode 100644 index 0000000000..45946495cb --- /dev/null +++ b/lib/zend/Zend/Gdata/DublinCore/Extension/Title.php @@ -0,0 +1,58 @@ +registerAllNamespaces(Zend_Gdata_DublinCore::$namespaces); + parent::__construct(); + $this->_text = $value; + } + +} diff --git a/lib/zend/Zend/Gdata/Entry.php b/lib/zend/Zend/Gdata/Entry.php index ee53467f2a..2409ea137f 100644 --- a/lib/zend/Zend/Gdata/Entry.php +++ b/lib/zend/Zend/Gdata/Entry.php @@ -15,21 +15,29 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ +/** + * @see Zend_Gdata + */ +require_once 'Zend/Gdata.php'; + /** * @see Zend_Gdata_App_MediaEntry */ require_once 'Zend/Gdata/App/MediaEntry.php'; /** - * Represents the GData flavor of an Atom entry + * Represents the Gdata flavor of an Atom entry * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_Entry extends Zend_Gdata_App_MediaEntry @@ -39,10 +47,86 @@ class Zend_Gdata_Entry extends Zend_Gdata_App_MediaEntry public function __construct($element = null) { - foreach (Zend_Gdata::$namespaces as $nsPrefix => $nsUri) { - $this->registerNamespace($nsPrefix, $nsUri); - } + $this->registerAllNamespaces(Zend_Gdata::$namespaces); parent::__construct($element); } + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + // ETags are special. We only support them in protocol >= 2.X. + // This will be duplicated by the HTTP ETag header. + if ($majorVersion >= 2) { + if ($this->_etag != null) { + $element->setAttributeNS($this->lookupNamespace('gd'), + 'gd:etag', + $this->_etag); + } + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'content': + $content = new Zend_Gdata_App_Extension_Content(); + $content->transferFromDOM($child); + $this->_content = $content; + break; + case $this->lookupNamespace('atom') . ':' . 'published': + $published = new Zend_Gdata_App_Extension_Published(); + $published->transferFromDOM($child); + $this->_published = $published; + break; + case $this->lookupNamespace('atom') . ':' . 'source': + $source = new Zend_Gdata_App_Extension_Source(); + $source->transferFromDOM($child); + $this->_source = $source; + break; + case $this->lookupNamespace('atom') . ':' . 'summary': + $summary = new Zend_Gdata_App_Extension_Summary(); + $summary->transferFromDOM($child); + $this->_summary = $summary; + break; + case $this->lookupNamespace('app') . ':' . 'control': + $control = new Zend_Gdata_App_Extension_Control(); + $control->transferFromDOM($child); + $this->_control = $control; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'etag': + // ETags are special, since they can be conveyed by either the + // HTTP ETag header or as an XML attribute. + $etag = $attribute->nodeValue; + if ($this->_etag === null) { + $this->_etag = $etag; + } + elseif ($this->_etag != $etag) { + require_once('Zend/Gdata/App/IOException.php'); + throw new Zend_Gdata_App_IOException("ETag mismatch"); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + break; + } + } + } diff --git a/lib/zend/Zend/Gdata/Exif.php b/lib/zend/Zend/Gdata/Exif.php new file mode 100755 index 0000000000..1b23bdb890 --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif.php @@ -0,0 +1,65 @@ +registerPackage('Zend_Gdata_Exif'); + $this->registerPackage('Zend_Gdata_Exif_Extension'); + parent::__construct($client, $applicationId); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Entry.php b/lib/zend/Zend/Gdata/Exif/Entry.php new file mode 100755 index 0000000000..56670f993b --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Entry.php @@ -0,0 +1,145 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_tags != null) { + $element->appendChild($this->_tags->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('exif') . ':' . 'tags': + $tags = new Zend_Gdata_Exif_Extension_Tags(); + $tags->transferFromDOM($child); + $this->_tags = $tags; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Retrieve the tags for this entry. + * + * @see setTags + * @return Zend_Gdata_Exif_Extension_Tags The requested object + * or null if not set. + */ + public function getTags() + { + return $this->_tags; + } + + /** + * Set the tags property for this entry. This property contains + * various Exif data. + * + * This corresponds to the property in the Google Data + * protocol. + * + * @param Zend_Gdata_Exif_Extension_Tags $value The desired value + * this element, or null to unset. + * @return Zend_Gdata_Exif_Entry Provides a fluent interface + */ + public function setTags($value) + { + $this->_tags = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/Distance.php b/lib/zend/Zend/Gdata/Exif/Extension/Distance.php new file mode 100755 index 0000000000..60cba0c66b --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/Distance.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/Exposure.php b/lib/zend/Zend/Gdata/Exif/Extension/Exposure.php new file mode 100755 index 0000000000..23927b1793 --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/Exposure.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/FStop.php b/lib/zend/Zend/Gdata/Exif/Extension/FStop.php new file mode 100755 index 0000000000..3a06e6ce20 --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/FStop.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/Flash.php b/lib/zend/Zend/Gdata/Exif/Extension/Flash.php new file mode 100755 index 0000000000..ad238f1a62 --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/Flash.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/FocalLength.php b/lib/zend/Zend/Gdata/Exif/Extension/FocalLength.php new file mode 100755 index 0000000000..d0fa68313d --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/FocalLength.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/ImageUniqueId.php b/lib/zend/Zend/Gdata/Exif/Extension/ImageUniqueId.php new file mode 100755 index 0000000000..b35511df8d --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/ImageUniqueId.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/Iso.php b/lib/zend/Zend/Gdata/Exif/Extension/Iso.php new file mode 100755 index 0000000000..d93df1eef0 --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/Iso.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/Make.php b/lib/zend/Zend/Gdata/Exif/Extension/Make.php new file mode 100755 index 0000000000..c4d2a49ebe --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/Make.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/Model.php b/lib/zend/Zend/Gdata/Exif/Extension/Model.php new file mode 100755 index 0000000000..7ee9e587a1 --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/Model.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/Tags.php b/lib/zend/Zend/Gdata/Exif/Extension/Tags.php new file mode 100755 index 0000000000..42e1bce8ab --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/Tags.php @@ -0,0 +1,549 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setDistance($distance); + $this->setExposure($exposure); + $this->setFlash($flash); + $this->setFocalLength($focalLength); + $this->setFStop($fStop); + $this->setImageUniqueId($imageUniqueId); + $this->setIso($iso); + $this->setMake($make); + $this->setModel($model); + $this->setTime($time); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_distance !== null) { + $element->appendChild($this->_distance->getDOM($element->ownerDocument)); + } + if ($this->_exposure !== null) { + $element->appendChild($this->_exposure->getDOM($element->ownerDocument)); + } + if ($this->_flash !== null) { + $element->appendChild($this->_flash->getDOM($element->ownerDocument)); + } + if ($this->_focalLength !== null) { + $element->appendChild($this->_focalLength->getDOM($element->ownerDocument)); + } + if ($this->_fStop !== null) { + $element->appendChild($this->_fStop->getDOM($element->ownerDocument)); + } + if ($this->_imageUniqueId !== null) { + $element->appendChild($this->_imageUniqueId->getDOM($element->ownerDocument)); + } + if ($this->_iso !== null) { + $element->appendChild($this->_iso->getDOM($element->ownerDocument)); + } + if ($this->_make !== null) { + $element->appendChild($this->_make->getDOM($element->ownerDocument)); + } + if ($this->_model !== null) { + $element->appendChild($this->_model->getDOM($element->ownerDocument)); + } + if ($this->_time !== null) { + $element->appendChild($this->_time->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('exif') . ':' . 'distance'; + $distance = new Zend_Gdata_Exif_Extension_Distance(); + $distance->transferFromDOM($child); + $this->_distance = $distance; + break; + case $this->lookupNamespace('exif') . ':' . 'exposure'; + $exposure = new Zend_Gdata_Exif_Extension_Exposure(); + $exposure->transferFromDOM($child); + $this->_exposure = $exposure; + break; + case $this->lookupNamespace('exif') . ':' . 'flash'; + $flash = new Zend_Gdata_Exif_Extension_Flash(); + $flash->transferFromDOM($child); + $this->_flash = $flash; + break; + case $this->lookupNamespace('exif') . ':' . 'focallength'; + $focalLength = new Zend_Gdata_Exif_Extension_FocalLength(); + $focalLength->transferFromDOM($child); + $this->_focalLength = $focalLength; + break; + case $this->lookupNamespace('exif') . ':' . 'fstop'; + $fStop = new Zend_Gdata_Exif_Extension_FStop(); + $fStop->transferFromDOM($child); + $this->_fStop = $fStop; + break; + case $this->lookupNamespace('exif') . ':' . 'imageUniqueID'; + $imageUniqueId = new Zend_Gdata_Exif_Extension_ImageUniqueId(); + $imageUniqueId->transferFromDOM($child); + $this->_imageUniqueId = $imageUniqueId; + break; + case $this->lookupNamespace('exif') . ':' . 'iso'; + $iso = new Zend_Gdata_Exif_Extension_Iso(); + $iso->transferFromDOM($child); + $this->_iso = $iso; + break; + case $this->lookupNamespace('exif') . ':' . 'make'; + $make = new Zend_Gdata_Exif_Extension_Make(); + $make->transferFromDOM($child); + $this->_make = $make; + break; + case $this->lookupNamespace('exif') . ':' . 'model'; + $model = new Zend_Gdata_Exif_Extension_Model(); + $model->transferFromDOM($child); + $this->_model = $model; + break; + case $this->lookupNamespace('exif') . ':' . 'time'; + $time = new Zend_Gdata_Exif_Extension_Time(); + $time->transferFromDOM($child); + $this->_time = $time; + break; + } + } + + /** + * Get the value for this element's distance attribute. + * + * @see setDistance + * @return Zend_Gdata_Exif_Extension_Distance The requested attribute. + */ + public function getDistance() + { + return $this->_distance; + } + + /** + * Set the value for this element's distance attribute. + * + * @param Zend_Gdata_Exif_Extension_Distance $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setDistance($value) + { + $this->_distance = $value; + return $this; + } + + /** + * Get the value for this element's exposure attribute. + * + * @see setExposure + * @return Zend_Gdata_Exif_Extension_Exposure The requested attribute. + */ + public function getExposure() + { + return $this->_exposure; + } + + /** + * Set the value for this element's exposure attribute. + * + * @param Zend_Gdata_Exif_Extension_Exposure $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setExposure($value) + { + $this->_exposure = $value; + return $this; + } + + /** + * Get the value for this element's flash attribute. + * + * @see setFlash + * @return Zend_Gdata_Exif_Extension_Flash The requested attribute. + */ + public function getFlash() + { + return $this->_flash; + } + + /** + * Set the value for this element's flash attribute. + * + * @param Zend_Gdata_Exif_Extension_Flash $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setFlash($value) + { + $this->_flash = $value; + return $this; + } + + /** + * Get the value for this element's name attribute. + * + * @see setFocalLength + * @return Zend_Gdata_Exif_Extension_FocalLength The requested attribute. + */ + public function getFocalLength() + { + return $this->_focalLength; + } + + /** + * Set the value for this element's focalLength attribute. + * + * @param Zend_Gdata_Exif_Extension_FocalLength $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setFocalLength($value) + { + $this->_focalLength = $value; + return $this; + } + + /** + * Get the value for this element's fStop attribute. + * + * @see setFStop + * @return Zend_Gdata_Exif_Extension_FStop The requested attribute. + */ + public function getFStop() + { + return $this->_fStop; + } + + /** + * Set the value for this element's fStop attribute. + * + * @param Zend_Gdata_Exif_Extension_FStop $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setFStop($value) + { + $this->_fStop = $value; + return $this; + } + + /** + * Get the value for this element's imageUniqueId attribute. + * + * @see setImageUniqueId + * @return Zend_Gdata_Exif_Extension_ImageUniqueId The requested attribute. + */ + public function getImageUniqueId() + { + return $this->_imageUniqueId; + } + + /** + * Set the value for this element's imageUniqueId attribute. + * + * @param Zend_Gdata_Exif_Extension_ImageUniqueId $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setImageUniqueId($value) + { + $this->_imageUniqueId = $value; + return $this; + } + + /** + * Get the value for this element's iso attribute. + * + * @see setIso + * @return Zend_Gdata_Exif_Extension_Iso The requested attribute. + */ + public function getIso() + { + return $this->_iso; + } + + /** + * Set the value for this element's iso attribute. + * + * @param Zend_Gdata_Exif_Extension_Iso $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setIso($value) + { + $this->_iso = $value; + return $this; + } + /** + * Get the value for this element's make attribute. + * + * @see setMake + * @return Zend_Gdata_Exif_Extension_Make The requested attribute. + */ + public function getMake() + { + return $this->_make; + } + + /** + * Set the value for this element's make attribute. + * + * @param Zend_Gdata_Exif_Extension_Make $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setMake($value) + { + $this->_make = $value; + return $this; + } + + /** + * Get the value for this element's model attribute. + * + * @see setModel + * @return Zend_Gdata_Exif_Extension_Model The requested attribute. + */ + public function getModel() + { + return $this->_model; + } + + /** + * Set the value for this element's model attribute. + * + * @param Zend_Gdata_Exif_Extension_Model $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setModel($value) + { + $this->_model = $value; + return $this; + } + + /** + * Get the value for this element's time attribute. + * + * @see setTime + * @return Zend_Gdata_Exif_Extension_Time The requested attribute. + */ + public function getTime() + { + return $this->_time; + } + + /** + * Set the value for this element's time attribute. + * + * @param Zend_Gdata_Exif_Extension_Time $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags Provides a fluent interface + */ + public function setTime($value) + { + $this->_time = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Extension/Time.php b/lib/zend/Zend/Gdata/Exif/Extension/Time.php new file mode 100755 index 0000000000..cc71ccc6e6 --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Extension/Time.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Exif/Feed.php b/lib/zend/Zend/Gdata/Exif/Feed.php new file mode 100755 index 0000000000..7b7233f650 --- /dev/null +++ b/lib/zend/Zend/Gdata/Exif/Feed.php @@ -0,0 +1,70 @@ +registerAllNamespaces(Zend_Gdata_Exif::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/Extension.php b/lib/zend/Zend/Gdata/Extension.php index fdeb173923..cb13b2e7c7 100644 --- a/lib/zend/Zend/Gdata/Extension.php +++ b/lib/zend/Zend/Gdata/Extension.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -25,11 +27,12 @@ require_once 'Zend/Gdata/App/Extension.php'; /** - * Represents a GData extension + * Represents a Gdata extension * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_Extension extends Zend_Gdata_App_Extension @@ -40,12 +43,15 @@ class Zend_Gdata_Extension extends Zend_Gdata_App_Extension public function __construct() { /* NOTE: namespaces must be registered before calling parent */ + $this->registerNamespace('gd', + 'http://schemas.google.com/g/2005'); + $this->registerNamespace('openSearch', + 'http://a9.com/-/spec/opensearchrss/1.0/', 1, 0); $this->registerNamespace('openSearch', - 'http://a9.com/-/spec/opensearchrss/1.0/'); + 'http://a9.com/-/spec/opensearch/1.1/', 2, 0); $this->registerNamespace('rss', 'http://blogs.law.harvard.edu/tech/rss'); - $this->registerNamespace('gd', - 'http://schemas.google.com/g/2005'); + parent::__construct(); } diff --git a/lib/zend/Zend/Gdata/Extension/AttendeeStatus.php b/lib/zend/Zend/Gdata/Extension/AttendeeStatus.php new file mode 100644 index 0000000000..b88898ede7 --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/AttendeeStatus.php @@ -0,0 +1,123 @@ +_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return string The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Visibility The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/lib/zend/Zend/Gdata/Extension/AttendeeType.php b/lib/zend/Zend/Gdata/Extension/AttendeeType.php new file mode 100644 index 0000000000..dedc91f91d --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/AttendeeType.php @@ -0,0 +1,123 @@ +_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return string The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Visibility The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/lib/zend/Zend/Gdata/Extension/Comments.php b/lib/zend/Zend/Gdata/Extension/Comments.php new file mode 100644 index 0000000000..fdc6c8a07c --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/Comments.php @@ -0,0 +1,117 @@ +_rel = $rel; + $this->_feedLink = $feedLink; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_feedLink !== null) { + $element->appendChild($this->_feedLink->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'feedLink'; + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + public function getRel() + { + return $this->_rel; + } + + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + public function getFeedLink() + { + return $this->_feedLink; + } + + public function setFeedLink($value) + { + $this->_feedLink = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Extension/EntryLink.php b/lib/zend/Zend/Gdata/Extension/EntryLink.php new file mode 100644 index 0000000000..ec1098e679 --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/EntryLink.php @@ -0,0 +1,167 @@ +_href = $href; + $this->_readOnly = $readOnly; + $this->_rel = $rel; + $this->_entry = $entry; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_href !== null) { + $element->setAttribute('href', $this->_href); + } + if ($this->_readOnly !== null) { + $element->setAttribute('readOnly', ($this->_readOnly ? "true" : "false")); + } + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_entry !== null) { + $element->appendChild($this->_entry->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'entry'; + $entry = new Zend_Gdata_Entry(); + $entry->transferFromDOM($child); + $this->_entry = $entry; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'href': + $this->_href = $attribute->nodeValue; + break; + case 'readOnly': + if ($attribute->nodeValue == "true") { + $this->_readOnly = true; + } + else if ($attribute->nodeValue == "false") { + $this->_readOnly = false; + } + else { + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getHref() + { + return $this->_href; + } + + public function setHref($value) + { + $this->_href = $value; + return $this; + } + + public function getReadOnly() + { + return $this->_readOnly; + } + + public function setReadOnly($value) + { + $this->_readOnly = $value; + return $this; + } + + public function getRel() + { + return $this->_rel; + } + + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + public function getEntry() + { + return $this->_entry; + } + + public function setEntry($value) + { + $this->_entry = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Extension/EventStatus.php b/lib/zend/Zend/Gdata/Extension/EventStatus.php new file mode 100644 index 0000000000..bf31db9398 --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/EventStatus.php @@ -0,0 +1,101 @@ +_value = $value; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return string The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Visibility The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} diff --git a/lib/zend/Zend/Gdata/Extension/ExtendedProperty.php b/lib/zend/Zend/Gdata/Extension/ExtendedProperty.php new file mode 100644 index 0000000000..3a464aa4a4 --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/ExtendedProperty.php @@ -0,0 +1,106 @@ +_name = $name; + $this->_value = $value; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_name !== null) { + $element->setAttribute('name', $this->_name); + } + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'name': + $this->_name = $attribute->nodeValue; + break; + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + public function __toString() + { + return $this->getName() . '=' . $this->getValue(); + } + + public function getName() + { + return $this->_name; + } + + public function setName($value) + { + $this->_name = $value; + return $this; + } + + public function getValue() + { + return $this->_value; + } + + public function setValue($value) + { + $this->_value = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Extension/FeedLink.php b/lib/zend/Zend/Gdata/Extension/FeedLink.php new file mode 100644 index 0000000000..a590afe302 --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/FeedLink.php @@ -0,0 +1,175 @@ +_countHint = $countHint; + $this->_href = $href; + $this->_readOnly = $readOnly; + $this->_rel = $rel; + $this->_feed = $feed; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_countHint !== null) { + $element->setAttribute('countHint', $this->_countHint); + } + if ($this->_href !== null) { + $element->setAttribute('href', $this->_href); + } + if ($this->_readOnly !== null) { + $element->setAttribute('readOnly', ($this->_readOnly ? "true" : "false")); + } + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_feed !== null) { + $element->appendChild($this->_feed->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('atom') . ':' . 'feed'; + $feed = new Zend_Gdata_Feed(); + $feed->transferFromDOM($child); + $this->_feed = $feed; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'countHint': + $this->_countHint = $attribute->nodeValue; + break; + case 'href': + $this->_href = $attribute->nodeValue; + break; + case 'readOnly': + if ($attribute->nodeValue == "true") { + $this->_readOnly = true; + } + else if ($attribute->nodeValue == "false") { + $this->_readOnly = false; + } + else { + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getHref() + { + return $this->_href; + } + + public function setHref($value) + { + $this->_href = $value; + return $this; + } + + public function getReadOnly() + { + return $this->_readOnly; + } + + public function setReadOnly($value) + { + $this->_readOnly = $value; + return $this; + } + + public function getRel() + { + return $this->_rel; + } + + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + public function getFeed() + { + return $this->_feed; + } + + public function setFeed($value) + { + $this->_feed = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Extension/OpenSearchItemsPerPage.php b/lib/zend/Zend/Gdata/Extension/OpenSearchItemsPerPage.php index 443cb1f107..0fc86a5d50 100644 --- a/lib/zend/Zend/Gdata/Extension/OpenSearchItemsPerPage.php +++ b/lib/zend/Zend/Gdata/Extension/OpenSearchItemsPerPage.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_Extension_OpenSearchItemsPerPage extends Zend_Gdata_Extension diff --git a/lib/zend/Zend/Gdata/Extension/OpenSearchStartIndex.php b/lib/zend/Zend/Gdata/Extension/OpenSearchStartIndex.php index 249bd037c5..9ebdd1d44f 100644 --- a/lib/zend/Zend/Gdata/Extension/OpenSearchStartIndex.php +++ b/lib/zend/Zend/Gdata/Extension/OpenSearchStartIndex.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_Extension_OpenSearchStartIndex extends Zend_Gdata_Extension diff --git a/lib/zend/Zend/Gdata/Extension/OpenSearchTotalResults.php b/lib/zend/Zend/Gdata/Extension/OpenSearchTotalResults.php index fb88012427..ef4d1eee50 100644 --- a/lib/zend/Zend/Gdata/Extension/OpenSearchTotalResults.php +++ b/lib/zend/Zend/Gdata/Extension/OpenSearchTotalResults.php @@ -15,8 +15,10 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -29,7 +31,8 @@ require_once 'Zend/Gdata/Extension.php'; * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_Extension_OpenSearchTotalResults extends Zend_Gdata_Extension diff --git a/lib/zend/Zend/Gdata/Extension/OriginalEvent.php b/lib/zend/Zend/Gdata/Extension/OriginalEvent.php new file mode 100644 index 0000000000..9579f9c141 --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/OriginalEvent.php @@ -0,0 +1,142 @@ +_id = $id; + $this->_href = $href; + $this->_when = $when; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_id !== null) { + $element->setAttribute('id', $this->_id); + } + if ($this->_href !== null) { + $element->setAttribute('href', $this->_href); + } + if ($this->_when !== null) { + $element->appendChild($this->_when->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'id': + $this->_id = $attribute->nodeValue; + break; + case 'href': + $this->_href = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'when'; + $when = new Zend_Gdata_Extension_When(); + $when->transferFromDOM($child); + $this->_when = $when; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getId() + { + return $this->_id; + } + + public function setId($value) + { + $this->_id = $value; + return $this; + } + + public function getHref() + { + return $this->_href; + } + + public function setHref($value) + { + $this->_href = $value; + return $this; + } + + public function getWhen() + { + return $this->_when; + } + + public function setWhen($value) + { + $this->_when = $value; + return $this; + } + + +} diff --git a/lib/zend/Zend/Gdata/Extension/Rating.php b/lib/zend/Zend/Gdata/Extension/Rating.php new file mode 100644 index 0000000000..5cd86d2c7c --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/Rating.php @@ -0,0 +1,240 @@ +_average = $average; + $this->_min = $min; + $this->_max = $max; + $this->_numRaters = $numRaters; + $this->_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_min !== null) { + $element->setAttribute('min', $this->_min); + } + if ($this->_max !== null) { + $element->setAttribute('max', $this->_max); + } + if ($this->_numRaters !== null) { + $element->setAttribute('numRaters', $this->_numRaters); + } + if ($this->_average !== null) { + $element->setAttribute('average', $this->_average); + } + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'min': + $this->_min = $attribute->nodeValue; + break; + case 'max': + $this->_max = $attribute->nodeValue; + break; + case 'numRaters': + $this->_numRaters = $attribute->nodeValue; + break; + case 'average': + $this->_average = $attribute->nodeValue; + break; + case 'value': + $this->_value = $attribute->nodeValue; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's min attribute. + * + * @return integer The requested attribute. + */ + public function getMin() + { + return $this->_min; + } + + /** + * Set the value for this element's min attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Rating The element being modified. + */ + public function setMin($value) + { + $this->_min = $value; + return $this; + } + + /** + * Get the value for this element's numRaters attribute. + * + * @return integer The requested attribute. + */ + public function getNumRaters() + { + return $this->_numRaters; + } + + /** + * Set the value for this element's numRaters attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Rating The element being modified. + */ + public function setNumRaters($value) + { + $this->_numRaters = $value; + return $this; + } + + /** + * Get the value for this element's average attribute. + * + * @return integer The requested attribute. + */ + public function getAverage() + { + return $this->_average; + } + + /** + * Set the value for this element's average attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Rating The element being modified. + */ + public function setAverage($value) + { + $this->_average = $value; + return $this; + } + + /** + * Get the value for this element's max attribute. + * + * @return integer The requested attribute. + */ + public function getMax() + { + return $this->_max; + } + + /** + * Set the value for this element's max attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Rating The element being modified. + */ + public function setMax($value) + { + $this->_max = $value; + return $this; + } + + /** + * Get the value for this element's value attribute. + * + * @return integer The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's value attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Rating The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Extension/Recurrence.php b/lib/zend/Zend/Gdata/Extension/Recurrence.php new file mode 100644 index 0000000000..81aecbbc6b --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/Recurrence.php @@ -0,0 +1,49 @@ +_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/Extension/RecurrenceException.php b/lib/zend/Zend/Gdata/Extension/RecurrenceException.php new file mode 100644 index 0000000000..972c0a7fe6 --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/RecurrenceException.php @@ -0,0 +1,215 @@ +_specialized = $specialized; + $this->_entryLink = $entryLink; + $this->_originalEvent = $originalEvent; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_specialized !== null) { + $element->setAttribute('specialized', ($this->_specialized ? "true" : "false")); + } + if ($this->_entryLink !== null) { + $element->appendChild($this->_entryLink->getDOM($element->ownerDocument)); + } + if ($this->_originalEvent !== null) { + $element->appendChild($this->_originalEvent->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'specialized': + if ($attribute->nodeValue == "true") { + $this->_specialized = true; + } + else if ($attribute->nodeValue == "false") { + $this->_specialized = false; + } + else { + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for gCal:selected#value."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'entryLink': + $entryLink = new Zend_Gdata_Extension_EntryLink(); + $entryLink->transferFromDOM($child); + $this->_entryLink = $entryLink; + break; + case $this->lookupNamespace('gd') . ':' . 'originalEvent': + $originalEvent = new Zend_Gdata_Extension_OriginalEvent(); + $originalEvent->transferFromDOM($child); + $this->_originalEvent = $originalEvent; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's Specialized attribute. + * + * @return bool The requested attribute. + */ + public function getSpecialized() + { + return $this->_specialized; + } + + /** + * Set the value for this element's Specialized attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_RecurrenceException The element being modified. + */ + public function setSpecialized($value) + { + $this->_specialized = $value; + return $this; + } + + /** + * Get the value for this element's EntryLink attribute. + * + * @return Zend_Gdata_Extension_EntryLink The requested attribute. + */ + public function getEntryLink() + { + return $this->_entryLink; + } + + /** + * Set the value for this element's EntryLink attribute. + * + * @param Zend_Gdata_Extension_EntryLink $value The desired value for this attribute. + * @return Zend_Gdata_Extension_RecurrenceException The element being modified. + */ + public function setEntryLink($value) + { + $this->_entryLink = $value; + return $this; + } + + /** + * Get the value for this element's Specialized attribute. + * + * @return Zend_Gdata_Extension_OriginalEvent The requested attribute. + */ + public function getOriginalEvent() + { + return $this->_originalEvent; + } + + /** + * Set the value for this element's Specialized attribute. + * + * @param Zend_Gdata_Extension_OriginalEvent $value The desired value for this attribute. + * @return Zend_Gdata_Extension_RecurrenceException The element being modified. + */ + public function setOriginalEvent($value) + { + $this->_originalEvent = $value; + return $this; + } + +} + diff --git a/lib/zend/Zend/Gdata/Extension/Reminder.php b/lib/zend/Zend/Gdata/Extension/Reminder.php new file mode 100644 index 0000000000..722bc5135b --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/Reminder.php @@ -0,0 +1,171 @@ +_absoluteTime = $absoluteTime; + $this->_method = $method; + $this->_days = $days; + $this->_hours = $hours; + $this->_minutes = $minutes; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_absoluteTime !== null) { + $element->setAttribute('absoluteTime', $this->_absoluteTime); + } + if ($this->_method !== null) { + $element->setAttribute('method', $this->_method); + } + if ($this->_days !== null) { + $element->setAttribute('days', $this->_days); + } + if ($this->_hours !== null) { + $element->setAttribute('hours', $this->_hours); + } + if ($this->_minutes !== null) { + $element->setAttribute('minutes', $this->_minutes); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'absoluteTime': + $this->_absoluteTime = $attribute->nodeValue; + break; + case 'method': + $this->_method = $attribute->nodeValue; + break; + case 'days': + $this->_days = $attribute->nodeValue; + break; + case 'hours': + $this->_hours = $attribute->nodeValue; + break; + case 'minutes': + $this->_minutes = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + public function __toString() + { + $s; + if ($absoluteTime) + $s = "at" . $absoluteTime; + else if ($days) + $s = "in" . $days . "days"; + else if ($hours) + $s = "in" . $hours . "hours"; + else if ($minutes) + $s = "in" . $minutes . "minutes"; + return $method . $s; + } + + public function getAbsoluteTime() + { + return $this->_absoluteTime; + } + + public function setAbsoluteTime($value) + { + $this->_absoluteTime = $value; + return $this; + } + + public function getDays() + { + return $this->_days; + } + + public function setDays($value) + { + $this->_days = $value; + return $this; + } + public function getHours() + { + return $this->_hours; + } + + public function setHours($value) + { + $this->_hours = $value; + return $this; + } + + public function getMinutes() + { + return $this->_minutes; + } + + public function setMinutes($value) + { + $this->_minutes = $value; + return $this; + } + + public function getMethod() + { + return $this->_method; + } + + public function setMethod($value) + { + $this->_method = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Extension/Transparency.php b/lib/zend/Zend/Gdata/Extension/Transparency.php new file mode 100644 index 0000000000..f41281c860 --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/Transparency.php @@ -0,0 +1,123 @@ +_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return bool The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Transparency The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/lib/zend/Zend/Gdata/Extension/Visibility.php b/lib/zend/Zend/Gdata/Extension/Visibility.php new file mode 100644 index 0000000000..39442f440e --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/Visibility.php @@ -0,0 +1,123 @@ +_value = $value; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_value !== null) { + $element->setAttribute('value', $this->_value); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'value': + $this->_value = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's Value attribute. + * + * @return bool The requested attribute. + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the value for this element's Value attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Visibility The element being modified. + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/lib/zend/Zend/Gdata/Extension/When.php b/lib/zend/Zend/Gdata/Extension/When.php new file mode 100644 index 0000000000..dd9eaa5fb6 --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/When.php @@ -0,0 +1,169 @@ +_startTime = $startTime; + $this->_endTime = $endTime; + $this->_valueString = $valueString; + $this->_reminders = $reminders; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_startTime !== null) { + $element->setAttribute('startTime', $this->_startTime); + } + if ($this->_endTime !== null) { + $element->setAttribute('endTime', $this->_endTime); + } + if ($this->_valueString !== null) { + $element->setAttribute('valueString', $this->_valueString); + } + if ($this->_reminders !== null) { + foreach ($this->_reminders as $reminder) { + $element->appendChild( + $reminder->getDOM($element->ownerDocument)); + } + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'reminder'; + $reminder = new Zend_Gdata_Extension_Reminder(); + $reminder->transferFromDOM($child); + $this->_reminders[] = $reminder; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'startTime': + $this->_startTime = $attribute->nodeValue; + break; + case 'endTime': + $this->_endTime = $attribute->nodeValue; + break; + case 'valueString': + $this->_valueString = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + public function __toString() + { + if ($this->_valueString) + return $this->_valueString; + else { + return 'Starts: ' . $this->getStartTime() . ' ' . + 'Ends: ' . $this->getEndTime(); + } + } + + public function getStartTime() + { + return $this->_startTime; + } + + public function setStartTime($value) + { + $this->_startTime = $value; + return $this; + } + + public function getEndTime() + { + return $this->_endTime; + } + + public function setEndTime($value) + { + $this->_endTime = $value; + return $this; + } + + public function getValueString() + { + return $this->_valueString; + } + + public function setValueString($value) + { + $this->_valueString = $value; + return $this; + } + + public function getReminders() + { + return $this->_reminders; + } + + public function setReminders($value) + { + $this->_reminders = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Extension/Where.php b/lib/zend/Zend/Gdata/Extension/Where.php new file mode 100644 index 0000000000..94967adc34 --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/Where.php @@ -0,0 +1,171 @@ +_valueString = $valueString; + $this->_label = $label; + $this->_rel = $rel; + $this->_entryLink = $entryLink; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_label !== null) { + $element->setAttribute('label', $this->_label); + } + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_valueString !== null) { + $element->setAttribute('valueString', $this->_valueString); + } + if ($this->entryLink !== null) { + $element->appendChild($this->_entryLink->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'label': + $this->_label = $attribute->nodeValue; + break; + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + case 'valueString': + $this->_valueString = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'entryLink': + $entryLink = new Zend_Gdata_Extension_EntryLink(); + $entryLink->transferFromDOM($child); + $this->_entryLink = $entryLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function __toString() + { + if ($this->_valueString != null) { + return $this->_valueString; + } + else { + return parent::__toString(); + } + } + + public function getLabel() + { + return $this->_label; + } + + public function setLabel($value) + { + $this->_label = $value; + return $this; + } + + public function getRel() + { + return $this->_rel; + } + + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + public function getValueString() + { + return $this->_valueString; + } + + public function setValueString($value) + { + $this->_valueString = $value; + return $this; + } + + public function getEntryLink() + { + return $this->_entryLink; + } + + public function setEntryLink($value) + { + $this->_entryLink = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Extension/Who.php b/lib/zend/Zend/Gdata/Extension/Who.php new file mode 100644 index 0000000000..6fd66a42cf --- /dev/null +++ b/lib/zend/Zend/Gdata/Extension/Who.php @@ -0,0 +1,299 @@ +_email = $email; + $this->_rel = $rel; + $this->_valueString = $valueString; + $this->_attendeeStatus = $attendeeStatus; + $this->_attendeeType = $attendeeType; + $this->_entryLink = $entryLink; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_email !== null) { + $element->setAttribute('email', $this->_email); + } + if ($this->_rel !== null) { + $element->setAttribute('rel', $this->_rel); + } + if ($this->_valueString !== null) { + $element->setAttribute('valueString', $this->_valueString); + } + if ($this->_attendeeStatus !== null) { + $element->appendChild($this->_attendeeStatus->getDOM($element->ownerDocument)); + } + if ($this->_attendeeType !== null) { + $element->appendChild($this->_attendeeType->getDOM($element->ownerDocument)); + } + if ($this->_entryLink !== null) { + $element->appendChild($this->_entryLink->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'email': + $this->_email = $attribute->nodeValue; + break; + case 'rel': + $this->_rel = $attribute->nodeValue; + break; + case 'valueString': + $this->_valueString = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'attendeeStatus': + $attendeeStatus = new Zend_Gdata_Extension_AttendeeStatus(); + $attendeeStatus->transferFromDOM($child); + $this->_attendeeStatus = $attendeeStatus; + break; + case $this->lookupNamespace('gd') . ':' . 'attendeeType': + $attendeeType = new Zend_Gdata_Extension_AttendeeType(); + $attendeeType->transferFromDOM($child); + $this->_attendeeType = $attendeeType; + break; + case $this->lookupNamespace('gd') . ':' . 'entryLink': + $entryLink = new Zend_Gdata_Extension_EntryLink(); + $entryLink->transferFromDOM($child); + $this->_entryLink = $entryLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Retrieves a human readable string describing this attribute's value. + * + * @return string The attribute value. + */ + public function __toString() + { + if ($this->_valueString != null) { + return $this->_valueString; + } + else { + return parent::__toString(); + } + } + + /** + * Get the value for this element's ValueString attribute. + * + * @return string The requested attribute. + */ + public function getValueString() + { + return $this->_valueString; + } + + /** + * Set the value for this element's ValueString attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setValueString($value) + { + $this->_valueString = $value; + return $this; + } + + /** + * Get the value for this element's Email attribute. + * + * @return string The requested attribute. + */ + public function getEmail() + { + return $this->_email; + } + + /** + * Set the value for this element's Email attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setEmail($value) + { + $this->_email = $value; + return $this; + } + + /** + * Get the value for this element's Rel attribute. + * + * @return string The requested attribute. + */ + public function getRel() + { + return $this->_rel; + } + + /** + * Set the value for this element's Rel attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setRel($value) + { + $this->_rel = $value; + return $this; + } + + /** + * Get this entry's AttendeeStatus element. + * + * @return Zend_Gdata_Extension_AttendeeStatus The requested entry. + */ + public function getAttendeeStatus() + { + return $this->_attendeeStatus; + } + + /** + * Set the child's AttendeeStatus element. + * + * @param Zend_Gdata_Extension_AttendeeStatus $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setAttendeeStatus($value) + { + $this->_attendeeStatus = $value; + return $this; + } + + /** + * Get this entry's AttendeeType element. + * + * @return Zend_Gdata_Extension_AttendeeType The requested entry. + */ + public function getAttendeeType() + { + return $this->_attendeeType; + } + + /** + * Set the child's AttendeeType element. + * + * @param Zend_Gdata_Extension_AttendeeType $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setAttendeeType($value) + { + $this->_attendeeType = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Feed.php b/lib/zend/Zend/Gdata/Feed.php index 25764ecf62..c86735c5e0 100644 --- a/lib/zend/Zend/Gdata/Feed.php +++ b/lib/zend/Zend/Gdata/Feed.php @@ -15,10 +15,17 @@ * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ +/** + * @see Zend_Gdata + */ +require_once 'Zend/Gdata.php'; + /** * @see Zend_Gdata_App_Feed */ @@ -45,11 +52,12 @@ require_once 'Zend/Gdata/Extension/OpenSearchStartIndex.php'; require_once 'Zend/Gdata/Extension/OpenSearchItemsPerPage.php'; /** - * The GData flavor of an Atom Feed + * The Gdata flavor of an Atom Feed * * @category Zend * @package Zend_Gdata - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Gdata + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Gdata_Feed extends Zend_Gdata_App_Feed @@ -65,35 +73,33 @@ class Zend_Gdata_Feed extends Zend_Gdata_App_Feed /** * The openSearch:totalResults element * - * @var string + * @var Zend_Gdata_Extension_OpenSearchTotalResults|null */ protected $_totalResults = null; /** * The openSearch:startIndex element * - * @var string + * @var Zend_Gdata_Extension_OpenSearchStartIndex|null */ protected $_startIndex = null; /** * The openSearch:itemsPerPage element * - * @var string + * @var Zend_Gdata_Extension_OpenSearchItemsPerPage|null */ protected $_itemsPerPage = null; public function __construct($element = null) { - foreach (Zend_Gdata::$namespaces as $nsPrefix => $nsUri) { - $this->registerNamespace($nsPrefix, $nsUri); - } + $this->registerAllNamespaces(Zend_Gdata::$namespaces); parent::__construct($element); } - public function getDOM($doc = null) + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) { - $element = parent::getDOM($doc); + $element = parent::getDOM($doc, $majorVersion, $minorVersion); if ($this->_totalResults != null) { $element->appendChild($this->_totalResults->getDOM($element->ownerDocument)); } @@ -103,6 +109,17 @@ class Zend_Gdata_Feed extends Zend_Gdata_App_Feed if ($this->_itemsPerPage != null) { $element->appendChild($this->_itemsPerPage->getDOM($element->ownerDocument)); } + + // ETags are special. We only support them in protocol >= 2.X. + // This will be duplicated by the HTTP ETag header. + if ($majorVersion >= 2) { + if ($this->_etag != null) { + $element->setAttributeNS($this->lookupNamespace('gd'), + 'gd:etag', + $this->_etag); + } + } + return $element; } @@ -137,29 +154,96 @@ class Zend_Gdata_Feed extends Zend_Gdata_App_Feed } } + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'etag': + // ETags are special, since they can be conveyed by either the + // HTTP ETag header or as an XML attribute. + $etag = $attribute->nodeValue; + if ($this->_etag === null) { + $this->_etag = $etag; + } + elseif ($this->_etag != $etag) { + require_once('Zend/Gdata/App/IOException.php'); + throw new Zend_Gdata_App_IOException("ETag mismatch"); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + break; + } + } + + /** + * Set the value of the totalResults property. + * + * @param Zend_Gdata_Extension_OpenSearchTotalResults|null $value The + * value of the totalResults property. Use null to unset. + * @return Zend_Gdata_Feed Provides a fluent interface. + */ function setTotalResults($value) { $this->_totalResults = $value; return $this; } + /** + * Get the value of the totalResults property. + * + * @return Zend_Gdata_Extension_OpenSearchTotalResults|null The value of + * the totalResults property, or null if unset. + */ function getTotalResults() { return $this->_totalResults; } + /** + * Set the start index property for feed paging. + * + * @param Zend_Gdata_Extension_OpenSearchStartIndex|null $value The value + * for the startIndex property. Use null to unset. + * @return Zend_Gdata_Feed Provides a fluent interface. + */ function setStartIndex($value) { $this->_startIndex = $value; return $this; } + /** + * Get the value of the startIndex property. + * + * @return Zend_Gdata_Extension_OpenSearchStartIndex|null The value of the + * startIndex property, or null if unset. + */ function getStartIndex() { return $this->_startIndex; } + /** + * Set the itemsPerPage property. + * + * @param Zend_Gdata_Extension_OpenSearchItemsPerPage|null $value The + * value for the itemsPerPage property. Use nul to unset. + * @return Zend_Gdata_Feed Provides a fluent interface. + */ function setItemsPerPage($value) { $this->_itemsPerPage = $value; return $this; } + /** + * Get the value of the itemsPerPage property. + * + * @return Zend_Gdata_Extension_OpenSearchItemsPerPage|null The value of + * the itemsPerPage property, or null if unset. + */ function getItemsPerPage() { return $this->_itemsPerPage; } diff --git a/lib/zend/Zend/Gdata/Gapps.php b/lib/zend/Zend/Gdata/Gapps.php new file mode 100644 index 0000000000..cab092d23f --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps.php @@ -0,0 +1,1097 @@ +registerPackage('Zend_Gdata_Gapps'); + $this->registerPackage('Zend_Gdata_Gapps_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + $this->_domain = $domain; + } + + /** + * Convert an exception to an ServiceException if an AppsForYourDomain + * XML document is contained within the original exception's HTTP + * response. If conversion fails, throw the original error. + * + * @param Zend_Gdata_Exception $e The exception to convert. + * @throws Zend_Gdata_Gapps_ServiceException + * @throws mixed + */ + public static function throwServiceExceptionIfDetected($e) { + // Check to make sure that there actually response! + // This can happen if the connection dies before the request + // completes. (See ZF-5949) + $response = $e->getResponse(); + if (!$response) { + require_once('Zend/Gdata/App/IOException.php'); + throw new Zend_Gdata_App_IOException('No HTTP response received (possible connection failure)'); + } + + try { + // Check to see if there is an AppsForYourDomainErrors + // datastructure in the response. If so, convert it to + // an exception and throw it. + require_once 'Zend/Gdata/Gapps/ServiceException.php'; + $error = new Zend_Gdata_Gapps_ServiceException(); + $error->importFromString($response->getBody()); + throw $error; + } catch (Zend_Gdata_App_Exception $e2) { + // Unable to convert the response to a ServiceException, + // most likely because the server didn't return an + // AppsForYourDomainErrors document. Throw the original + // exception. + throw $e; + } + } + + /** + * Imports a feed located at $uri. + * This method overrides the default behavior of Zend_Gdata_App, + * providing support for Zend_Gdata_Gapps_ServiceException. + * + * @param string $uri + * @param Zend_Http_Client $client (optional) The client used for + * communication + * @param string $className (optional) The class which is used as the + * return type + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + * @return Zend_Gdata_App_Feed + */ + public static function import($uri, $client = null, $className='Zend_Gdata_App_Feed') + { + try { + return parent::import($uri, $client, $className); + } catch (Zend_Gdata_App_HttpException $e) { + self::throwServiceExceptionIfDetected($e); + } + } + + /** + * GET a URI using client object. + * This method overrides the default behavior of Zend_Gdata_App, + * providing support for Zend_Gdata_Gapps_ServiceException. + * + * @param string $uri GET URI + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + * @return Zend_Http_Response + */ + public function get($uri, $extraHeaders = array()) + { + try { + return parent::get($uri, $extraHeaders); + } catch (Zend_Gdata_App_HttpException $e) { + self::throwServiceExceptionIfDetected($e); + } + } + + /** + * POST data with client object. + * This method overrides the default behavior of Zend_Gdata_App, + * providing support for Zend_Gdata_Gapps_ServiceException. + * + * @param mixed $data The Zend_Gdata_App_Entry or XML to post + * @param string $uri (optional) POST URI + * @param integer $remainingRedirects (optional) + * @param string $contentType Content-type of the data + * @param array $extraHaders Extra headers to add tot he request + * @return Zend_Http_Response + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_App_InvalidArgumentException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function post($data, $uri = null, $remainingRedirects = null, + $contentType = null, $extraHeaders = null) + { + try { + return parent::post($data, $uri, $remainingRedirects, $contentType, $extraHeaders); + } catch (Zend_Gdata_App_HttpException $e) { + self::throwServiceExceptionIfDetected($e); + } + } + + /** + * PUT data with client object + * This method overrides the default behavior of Zend_Gdata_App, + * providing support for Zend_Gdata_Gapps_ServiceException. + * + * @param mixed $data The Zend_Gdata_App_Entry or XML to post + * @param string $uri (optional) PUT URI + * @param integer $remainingRedirects (optional) + * @param string $contentType Content-type of the data + * @param array $extraHaders Extra headers to add tot he request + * @return Zend_Http_Response + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_App_InvalidArgumentException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function put($data, $uri = null, $remainingRedirects = null, + $contentType = null, $extraHeaders = null) + { + try { + return parent::put($data, $uri, $remainingRedirects, $contentType, $extraHeaders); + } catch (Zend_Gdata_App_HttpException $e) { + self::throwServiceExceptionIfDetected($e); + } + } + + /** + * DELETE entry with client object + * This method overrides the default behavior of Zend_Gdata_App, + * providing support for Zend_Gdata_Gapps_ServiceException. + * + * @param mixed $data The Zend_Gdata_App_Entry or URL to delete + * @param integer $remainingRedirects (optional) + * @return void + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_App_InvalidArgumentException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function delete($data, $remainingRedirects = null) + { + try { + return parent::delete($data, $remainingRedirects); + } catch (Zend_Gdata_App_HttpException $e) { + self::throwServiceExceptionIfDetected($e); + } + } + + /** + * Set domain for this service instance. This should be a fully qualified + * domain, such as 'foo.example.com'. + * + * This value is used when calculating URLs for retrieving and posting + * entries. If no value is specified, a URL will have to be manually + * constructed prior to using any methods which interact with the Google + * Apps provisioning service. + * + * @param string $value The domain to be used for this session. + */ + public function setDomain($value) + { + $this->_domain = $value; + } + + /** + * Get domain for this service instance. This should be a fully qualified + * domain, such as 'foo.example.com'. If no domain is set, null will be + * returned. + * + * @return string The domain to be used for this session, or null if not + * set. + */ + public function getDomain() + { + return $this->_domain; + } + + /** + * Returns the base URL used to access the Google Apps service, based + * on the current domain. The current domain can be temporarily + * overridden by providing a fully qualified domain as $domain. + * + * @param string $domain (optional) A fully-qualified domain to use + * instead of the default domain for this service instance. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getBaseUrl($domain = null) + { + if ($domain !== null) { + return self::APPS_BASE_FEED_URI . '/' . $domain; + } else if ($this->_domain !== null) { + return self::APPS_BASE_FEED_URI . '/' . $this->_domain; + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Domain must be specified.'); + } + } + + /** + * Retrieve a UserFeed containing multiple UserEntry objects. + * + * @param mixed $location (optional) The location for the feed, as a URL + * or Query. + * @return Zend_Gdata_Gapps_UserFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getUserFeed($location = null) + { + if ($location === null) { + $uri = $this->getBaseUrl() . self::APPS_USER_PATH; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gapps_UserFeed'); + } + + /** + * Retreive NicknameFeed object containing multiple NicknameEntry objects. + * + * @param mixed $location (optional) The location for the feed, as a URL + * or Query. + * @return Zend_Gdata_Gapps_NicknameFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getNicknameFeed($location = null) + { + if ($location === null) { + $uri = $this->getBaseUrl() . self::APPS_NICKNAME_PATH; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gapps_NicknameFeed'); + } + + /** + * Retreive EmailListFeed object containing multiple EmailListEntry + * objects. + * + * @param mixed $location (optional) The location for the feed, as a URL + * or Query. + * @return Zend_Gdata_Gapps_EmailListFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getEmailListFeed($location = null) + { + if ($location === null) { + $uri = $this->getBaseUrl() . self::APPS_NICKNAME_PATH; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gapps_EmailListFeed'); + } + + /** + * Retreive EmailListRecipientFeed object containing multiple + * EmailListRecipientEntry objects. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Gapps_EmailListRecipientFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getEmailListRecipientFeed($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gapps_EmailListRecipientFeed'); + } + + /** + * Retreive a single UserEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Gapps_UserEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getUserEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Gapps_UserEntry'); + } + + /** + * Retreive a single NicknameEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Gapps_NicknameEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getNicknameEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Gapps_NicknameEntry'); + } + + /** + * Retreive a single EmailListEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Gapps_EmailListEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getEmailListEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Gapps_EmailListEntry'); + } + + /** + * Retreive a single EmailListRecipientEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Gapps_EmailListRecipientEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function getEmailListRecipientEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Gapps_EmailListRecipientEntry'); + } + + /** + * Create a new user from a UserEntry. + * + * @param Zend_Gdata_Gapps_UserEntry $user The user entry to insert. + * @param string $uri (optional) The URI where the user should be + * uploaded to. If null, the default user creation URI for + * this domain will be used. + * @return Zend_Gdata_Gapps_UserEntry The inserted user entry as + * returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function insertUser($user, $uri = null) + { + if ($uri === null) { + $uri = $this->getBaseUrl() . self::APPS_USER_PATH; + } + $newEntry = $this->insertEntry($user, $uri, 'Zend_Gdata_Gapps_UserEntry'); + return $newEntry; + } + + /** + * Create a new nickname from a NicknameEntry. + * + * @param Zend_Gdata_Gapps_NicknameEntry $nickname The nickname entry to + * insert. + * @param string $uri (optional) The URI where the nickname should be + * uploaded to. If null, the default nickname creation URI for + * this domain will be used. + * @return Zend_Gdata_Gapps_NicknameEntry The inserted nickname entry as + * returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function insertNickname($nickname, $uri = null) + { + if ($uri === null) { + $uri = $this->getBaseUrl() . self::APPS_NICKNAME_PATH; + } + $newEntry = $this->insertEntry($nickname, $uri, 'Zend_Gdata_Gapps_NicknameEntry'); + return $newEntry; + } + + /** + * Create a new email list from an EmailListEntry. + * + * @param Zend_Gdata_Gapps_EmailListEntry $emailList The email list entry + * to insert. + * @param string $uri (optional) The URI where the email list should be + * uploaded to. If null, the default email list creation URI for + * this domain will be used. + * @return Zend_Gdata_Gapps_EmailListEntry The inserted email list entry + * as returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function insertEmailList($emailList, $uri = null) + { + if ($uri === null) { + $uri = $this->getBaseUrl() . self::APPS_EMAIL_LIST_PATH; + } + $newEntry = $this->insertEntry($emailList, $uri, 'Zend_Gdata_Gapps_EmailListEntry'); + return $newEntry; + } + + /** + * Create a new email list recipient from an EmailListRecipientEntry. + * + * @param Zend_Gdata_Gapps_EmailListRecipientEntry $recipient The recipient + * entry to insert. + * @param string $uri (optional) The URI where the recipient should be + * uploaded to. If null, the default recipient creation URI for + * this domain will be used. + * @return Zend_Gdata_Gapps_EmailListRecipientEntry The inserted + * recipient entry as returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function insertEmailListRecipient($recipient, $uri = null) + { + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'URI must not be null'); + } elseif ($uri instanceof Zend_Gdata_Gapps_EmailListEntry) { + $uri = $uri->getLink('edit')->href; + } + $newEntry = $this->insertEntry($recipient, $uri, 'Zend_Gdata_Gapps_EmailListRecipientEntry'); + return $newEntry; + } + + /** + * Provides a magic factory method to instantiate new objects with + * shorter syntax than would otherwise be required by the Zend Framework + * naming conventions. For more information, see Zend_Gdata_App::__call(). + * + * This overrides the default behavior of __call() so that query classes + * do not need to have their domain manually set when created with + * a magic factory method. + * + * @see Zend_Gdata_App::__call() + * @param string $method The method name being called + * @param array $args The arguments passed to the call + * @throws Zend_Gdata_App_Exception + */ + public function __call($method, $args) { + if (preg_match('/^new(\w+Query)/', $method, $matches)) { + $class = $matches[1]; + $foundClassName = null; + foreach ($this->_registeredPackages as $name) { + try { + // Autoloading disabled on next line for compatibility + // with magic factories. See ZF-6660. + if (!class_exists($name . '_' . $class, false)) { + require_once 'Zend/Loader.php'; + @Zend_Loader::loadClass($name . '_' . $class); + } + $foundClassName = $name . '_' . $class; + break; + } catch (Zend_Exception $e) { + // package wasn't here- continue searching + } + } + if ($foundClassName != null) { + $reflectionObj = new ReflectionClass($foundClassName); + // Prepend the domain to the query + $args = array_merge(array($this->getDomain()), $args); + return $reflectionObj->newInstanceArgs($args); + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + "Unable to find '${class}' in registered packages"); + } + } else { + return parent::__call($method, $args); + } + + } + + // Convenience methods + // Specified at http://code.google.com/apis/apps/gdata_provisioning_api_v2.0_reference.html#appendix_e + + /** + * Create a new user entry and send it to the Google Apps servers. + * + * @param string $username The username for the new user. + * @param string $givenName The given name for the new user. + * @param string $familyName The family name for the new user. + * @param string $password The password for the new user as a plaintext string + * (if $passwordHashFunction is null) or a SHA-1 hashed + * value (if $passwordHashFunction = 'SHA-1'). + * @param string $quotaLimitInMB (optional) The quota limit for the new user in MB. + * @return Zend_Gdata_Gapps_UserEntry (optional) The new user entry as returned by + * server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function createUser ($username, $givenName, $familyName, $password, + $passwordHashFunction = null, $quotaLimitInMB = null) { + $user = $this->newUserEntry(); + $user->login = $this->newLogin(); + $user->login->username = $username; + $user->login->password = $password; + $user->login->hashFunctionName = $passwordHashFunction; + $user->name = $this->newName(); + $user->name->givenName = $givenName; + $user->name->familyName = $familyName; + if ($quotaLimitInMB !== null) { + $user->quota = $this->newQuota(); + $user->quota->limit = $quotaLimitInMB; + } + return $this->insertUser($user); + } + + /** + * Retrieve a user based on their username. + * + * @param string $username The username to search for. + * @return Zend_Gdata_Gapps_UserEntry The username to search for, or null + * if no match found. + * @throws Zend_Gdata_App_InvalidArgumentException + * @throws Zend_Gdata_App_HttpException + */ + public function retrieveUser ($username) { + $query = $this->newUserQuery($username); + try { + $user = $this->getUserEntry($query); + } catch (Zend_Gdata_Gapps_ServiceException $e) { + // Set the user to null if not found + if ($e->hasError(Zend_Gdata_Gapps_Error::ENTITY_DOES_NOT_EXIST)) { + $user = null; + } else { + throw $e; + } + } + return $user; + } + + /** + * Retrieve a page of users in alphabetical order, starting with the + * provided username. + * + * @param string $startUsername (optional) The first username to retrieve. + * If null or not declared, the page will begin with the first + * user in the domain. + * @return Zend_Gdata_Gapps_UserFeed Collection of Zend_Gdata_UserEntry + * objects representing all users in the domain. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrievePageOfUsers ($startUsername = null) { + $query = $this->newUserQuery(); + $query->setStartUsername($startUsername); + return $this->getUserFeed($query); + } + + /** + * Retrieve all users in the current domain. Be aware that + * calling this function on a domain with many users will take a + * signifigant amount of time to complete. On larger domains this may + * may cause execution to timeout without proper precautions in place. + * + * @return Zend_Gdata_Gapps_UserFeed Collection of Zend_Gdata_UserEntry + * objects representing all users in the domain. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveAllUsers () { + return $this->retrieveAllEntriesForFeed($this->retrievePageOfUsers()); + } + + /** + * Overwrite a specified username with the provided UserEntry. The + * UserEntry does not need to contain an edit link. + * + * This method is provided for compliance with the Google Apps + * Provisioning API specification. Normally users will instead want to + * call UserEntry::save() instead. + * + * @see Zend_Gdata_App_Entry::save + * @param string $username The username whose data will be overwritten. + * @param Zend_Gdata_Gapps_UserEntry $userEntry The user entry which + * will be overwritten. + * @return Zend_Gdata_Gapps_UserEntry The UserEntry returned by the + * server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function updateUser($username, $userEntry) { + return $this->updateEntry($userEntry, $this->getBaseUrl() . + self::APPS_USER_PATH . '/' . $username); + } + + /** + * Mark a given user as suspended. + * + * @param string $username The username associated with the user who + * should be suspended. + * @return Zend_Gdata_Gapps_UserEntry The UserEntry for the modified + * user. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function suspendUser($username) { + $user = $this->retrieveUser($username); + $user->login->suspended = true; + return $user->save(); + } + + /** + * Mark a given user as not suspended. + * + * @param string $username The username associated with the user who + * should be restored. + * @return Zend_Gdata_Gapps_UserEntry The UserEntry for the modified + * user. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function restoreUser($username) { + $user = $this->retrieveUser($username); + $user->login->suspended = false; + return $user->save(); + } + + /** + * Delete a user by username. + * + * @param string $username The username associated with the user who + * should be deleted. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function deleteUser($username) { + $this->delete($this->getBaseUrl() . self::APPS_USER_PATH . '/' . + $username); + } + + /** + * Create a nickname for a given user. + * + * @param string $username The username to which the new nickname should + * be associated. + * @param string $nickname The new nickname to be created. + * @return Zend_Gdata_Gapps_NicknameEntry The nickname entry which was + * created by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function createNickname($username, $nickname) { + $entry = $this->newNicknameEntry(); + $nickname = $this->newNickname($nickname); + $login = $this->newLogin($username); + $entry->nickname = $nickname; + $entry->login = $login; + return $this->insertNickname($entry); + } + + /** + * Retrieve the entry for a specified nickname. + * + * @param string $nickname The nickname to be retrieved. + * @return Zend_Gdata_Gapps_NicknameEntry The requested nickname entry. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveNickname($nickname) { + $query = $this->newNicknameQuery(); + $query->setNickname($nickname); + try { + $nickname = $this->getNicknameEntry($query); + } catch (Zend_Gdata_Gapps_ServiceException $e) { + // Set the nickname to null if not found + if ($e->hasError(Zend_Gdata_Gapps_Error::ENTITY_DOES_NOT_EXIST)) { + $nickname = null; + } else { + throw $e; + } + } + return $nickname; + } + + /** + * Retrieve all nicknames associated with a specific username. + * + * @param string $username The username whose nicknames should be + * returned. + * @return Zend_Gdata_Gapps_NicknameFeed A feed containing all nicknames + * for the given user, or null if + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveNicknames($username) { + $query = $this->newNicknameQuery(); + $query->setUsername($username); + $nicknameFeed = $this->retrieveAllEntriesForFeed( + $this->getNicknameFeed($query)); + return $nicknameFeed; + } + + /** + * Retrieve a page of nicknames in alphabetical order, starting with the + * provided nickname. + * + * @param string $startNickname (optional) The first nickname to + * retrieve. If null or not declared, the page will begin with + * the first nickname in the domain. + * @return Zend_Gdata_Gapps_NicknameFeed Collection of Zend_Gdata_NicknameEntry + * objects representing all nicknames in the domain. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrievePageOfNicknames ($startNickname = null) { + $query = $this->newNicknameQuery(); + $query->setStartNickname($startNickname); + return $this->getNicknameFeed($query); + } + + /** + * Retrieve all nicknames in the current domain. Be aware that + * calling this function on a domain with many nicknames will take a + * signifigant amount of time to complete. On larger domains this may + * may cause execution to timeout without proper precautions in place. + * + * @return Zend_Gdata_Gapps_NicknameFeed Collection of Zend_Gdata_NicknameEntry + * objects representing all nicknames in the domain. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveAllNicknames () { + return $this->retrieveAllEntriesForFeed($this->retrievePageOfNicknames()); + } + + /** + * Delete a specified nickname. + * + * @param string $nickname The name of the nickname to be deleted. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function deleteNickname($nickname) { + $this->delete($this->getBaseUrl() . self::APPS_NICKNAME_PATH . '/' . $nickname); + } + + /** + * Create a new email list. + * + * @param string $emailList The name of the email list to be created. + * @return Zend_Gdata_Gapps_EmailListEntry The email list entry + * as created on the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function createEmailList($emailList) { + $entry = $this->newEmailListEntry(); + $list = $this->newEmailList(); + $list->name = $emailList; + $entry->emailList = $list; + return $this->insertEmailList($entry); + } + + /** + * Retrieve all email lists associated with a recipient. + * + * @param string $username The recipient whose associated email lists + * should be returned. + * @return Zend_Gdata_Gapps_EmailListFeed The list of email lists found as + * Zend_Gdata_EmailListEntry objects. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveEmailLists($recipient) { + $query = $this->newEmailListQuery(); + $query->recipient = $recipient; + return $this->getEmailListFeed($query); + } + + /** + * Retrieve a page of email lists in alphabetical order, starting with the + * provided email list. + * + * @param string $startEmailListName (optional) The first list to + * retrieve. If null or not defined, the page will begin + * with the first email list in the domain. + * @return Zend_Gdata_Gapps_EmailListFeed Collection of Zend_Gdata_EmailListEntry + * objects representing all nicknames in the domain. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrievePageOfEmailLists ($startNickname = null) { + $query = $this->newEmailListQuery(); + $query->setStartEmailListName($startNickname); + return $this->getEmailListFeed($query); + } + + /** + * Retrieve all email lists associated with the curent domain. Be aware that + * calling this function on a domain with many email lists will take a + * signifigant amount of time to complete. On larger domains this may + * may cause execution to timeout without proper precautions in place. + * + * @return Zend_Gdata_Gapps_EmailListFeed The list of email lists found + * as Zend_Gdata_Gapps_EmailListEntry objects. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveAllEmailLists() { + return $this->retrieveAllEntriesForFeed($this->retrievePageOfEmailLists()); + } + + /** + * Delete a specified email list. + * + * @param string $emailList The name of the emailList to be deleted. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function deleteEmailList($emailList) { + $this->delete($this->getBaseUrl() . self::APPS_EMAIL_LIST_PATH . '/' + . $emailList); + } + + /** + * Add a specified recipient to an existing emailList. + * + * @param string $recipientAddress The address of the recipient to be + * added to the email list. + * @param string $emailList The name of the email address to which the + * recipient should be added. + * @return Zend_Gdata_Gapps_EmailListRecipientEntry The recipient entry + * created by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function addRecipientToEmailList($recipientAddress, $emailList) { + $entry = $this->newEmailListRecipientEntry(); + $who = $this->newWho(); + $who->email = $recipientAddress; + $entry->who = $who; + $address = $this->getBaseUrl() . self::APPS_EMAIL_LIST_PATH . '/' . + $emailList . self::APPS_EMAIL_LIST_RECIPIENT_POSTFIX . '/'; + return $this->insertEmailListRecipient($entry, $address); + } + + /** + * Retrieve a page of email list recipients in alphabetical order, + * starting with the provided email list recipient. + * + * @param string $emaiList The email list which should be searched. + * @param string $startRecipient (optinal) The address of the first + * recipient, or null to start with the first recipient in + * the list. + * @return Zend_Gdata_Gapps_EmailListRecipientFeed Collection of + * Zend_Gdata_EmailListRecipientEntry objects representing all + * recpients in the specified list. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrievePageOfRecipients ($emailList, + $startRecipient = null) { + $query = $this->newEmailListRecipientQuery(); + $query->setEmailListName($emailList); + $query->setStartRecipient($startRecipient); + return $this->getEmailListRecipientFeed($query); + } + + /** + * Retrieve all recipients associated with an email list. Be aware that + * calling this function on a domain with many email lists will take a + * signifigant amount of time to complete. On larger domains this may + * may cause execution to timeout without proper precautions in place. + * + * @param string $emaiList The email list which should be searched. + * @return Zend_Gdata_Gapps_EmailListRecipientFeed The list of email lists + * found as Zend_Gdata_Gapps_EmailListRecipientEntry objects. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function retrieveAllRecipients($emailList) { + return $this->retrieveAllEntriesForFeed( + $this->retrievePageOfRecipients($emailList)); + } + + /** + * Remove a specified recipient from an email list. + * + * @param string $recipientAddress The recipient to be removed. + * @param string $emailList The list from which the recipient should + * be removed. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_Gapps_ServiceException + */ + public function removeRecipientFromEmailList($recipientAddress, $emailList) { + $this->delete($this->getBaseUrl() . self::APPS_EMAIL_LIST_PATH . '/' + . $emailList . self::APPS_EMAIL_LIST_RECIPIENT_POSTFIX . '/' + . $recipientAddress); + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/EmailListEntry.php b/lib/zend/Zend/Gdata/Gapps/EmailListEntry.php new file mode 100644 index 0000000000..b4b1708d8e --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/EmailListEntry.php @@ -0,0 +1,214 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @subpackage Gapps + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Gdata_Gapps_EmailListEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Gapps_EmailListEntry'; + + /** + * child element containing general information about + * this email list. + * + * @var Zend_Gdata_Gapps_Extension_EmailList + */ + protected $_emailList = null; + + /** + * element containing information about other feeds + * relevant to this entry. + * + * @var Zend_Gdata_Extension_FeedLink + */ + protected $_feedLink = array(); + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Gapps::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_emailList !== null) { + $element->appendChild($this->_emailList->getDOM($element->ownerDocument)); + } + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('apps') . ':' . 'emailList'; + $emailList = new Zend_Gdata_Gapps_Extension_EmailList(); + $emailList->transferFromDOM($child); + $this->_emailList = $emailList; + break; + case $this->lookupNamespace('gd') . ':' . 'feedLink'; + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Retrieve the email list property for this entry. + * + * @see setEmailList + * @return Zend_Gdata_Gapps_Extension_EmailList The requested object + * or null if not set. + */ + public function getEmailList() + { + return $this->_emailList; + } + + /** + * Set the email list property for this entry. This property contains + * information such as the name of this email list. + * + * This corresponds to the property in the Google Data + * protocol. + * + * @param Zend_Gdata_Gapps_Extension_EmailList $value The desired value + * this element, or null to unset. + * @return Zend_Gdata_Gapps_EventEntry Provides a fluent interface + */ + public function setEmailList($value) + { + $this->_emailList = $value; + return $this; + } + + /** + * Get the feed link property for this entry. + * + * @see setFeedLink + * @param string $rel (optional) The rel value of the link to be found. + * If null, the array of links is returned. + * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink + * object corresponding to the requested rel value is returned + * if found, or null if the requested value is not found. If + * $rel is null or not specified, an array of all available + * feed links for this entry is returned, or null if no feed + * links are set. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Set the feed link property for this entry. Feed links provide + * information about other feeds associated with this entry. + * + * This corresponds to the property in the Google Data + * protocol. + * + * @param array $value A collection of Zend_Gdata_Gapps_Extension_FeedLink + * instances representing all feed links for this entry, or + * null to unset. + * @return Zend_Gdata_Gapps_EventEntry Provides a fluent interface + */ + public function setFeedLink($value) + { + $this->_feedLink = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/EmailListFeed.php b/lib/zend/Zend/Gdata/Gapps/EmailListFeed.php new file mode 100644 index 0000000000..38a1456806 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/EmailListFeed.php @@ -0,0 +1,53 @@ +setEmailListName($emailListName); + $this->setRecipient($recipient); + $this->setStartEmailListName($startEmailListName); + } + + /** + * Set the email list name to query for. When set, only lists with a name + * matching this value will be returned in search results. Set to + * null to disable filtering by list name. + * + * @param string $value The email list name to filter search results by, + * or null to disable. + */ + public function setEmailListName($value) + { + $this->_emailListName = $value; + } + + /** + * Get the email list name to query for. If no name is set, null will be + * returned. + * + * @see setEmailListName + * @return string The email list name to filter search results by, or null + * if disabled. + */ + public function getEmailListName() + { + return $this->_emailListName; + } + + /** + * Set the recipient to query for. When set, only subscribers with an + * email address matching this value will be returned in search results. + * Set to null to disable filtering by username. + * + * @param string $value The recipient email address to filter search + * results by, or null to disable. + */ + public function setRecipient($value) + { + if ($value !== null) { + $this->_params['recipient'] = $value; + } + else { + unset($this->_params['recipient']); + } + } + + /** + * Get the recipient email address to query for. If no recipient is set, + * null will be returned. + * + * @see setRecipient + * @return string The recipient email address to filter search results by, + * or null if disabled. + */ + public function getRecipient() + { + if (array_key_exists('recipient', $this->_params)) { + return $this->_params['recipient']; + } else { + return null; + } + } + + /** + * Set the first email list which should be displayed when retrieving + * a list of email lists. + * + * @param string $value The first email list to be returned, or null to + * disable. + */ + public function setStartEmailListName($value) + { + if ($value !== null) { + $this->_params['startEmailListName'] = $value; + } else { + unset($this->_params['startEmailListName']); + } + } + + /** + * Get the first email list which should be displayed when retrieving + * a list of email lists. + * + * @return string The first email list to be returned, or null to + * disable. + */ + public function getStartEmailListName() + { + if (array_key_exists('startEmailListName', $this->_params)) { + return $this->_params['startEmailListName']; + } else { + return null; + } + } + + /** + * Returns the URL generated for this query, based on it's current + * parameters. + * + * @return string A URL generated based on the state of this query. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getQueryUrl() + { + + $uri = $this->getBaseUrl(); + $uri .= Zend_Gdata_Gapps::APPS_EMAIL_LIST_PATH; + if ($this->_emailListName !== null) { + $uri .= '/' . $this->_emailListName; + } + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/EmailListRecipientEntry.php b/lib/zend/Zend/Gdata/Gapps/EmailListRecipientEntry.php new file mode 100644 index 0000000000..61341aa8b6 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/EmailListRecipientEntry.php @@ -0,0 +1,146 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @subpackage Gapps + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Gdata_Gapps_EmailListRecipientEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Gapps_EmailListRecipientEntry'; + + /** + * element used to store the email address of the current + * recipient. Only the email property of this element should be + * populated. + * + * @var Zend_Gdata_Extension_Who + */ + protected $_who = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Gapps::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_who !== null) { + $element->appendChild($this->_who->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'who'; + $who = new Zend_Gdata_Extension_Who(); + $who->transferFromDOM($child); + $this->_who = $who; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value of the who property for this object. + * + * @see setWho + * @return Zend_Gdata_Extension_Who The requested object. + */ + public function getWho() + { + return $this->_who; + } + + /** + * Set the value of the who property for this object. This property + * is used to store the email address of the current recipient. + * + * @param Zend_Gdata_Extension_Who $value The desired value for this + * instance's who property. + * @return Zend_Gdata_Gapps_EventEntry Provides a fluent interface. + */ + public function setWho($value) + { + $this->_who = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/EmailListRecipientFeed.php b/lib/zend/Zend/Gdata/Gapps/EmailListRecipientFeed.php new file mode 100644 index 0000000000..e45029660a --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/EmailListRecipientFeed.php @@ -0,0 +1,53 @@ +setEmailListName($emailListName); + $this->setStartRecipient($startRecipient); + } + + /** + * Set the email list name to query for. When set, only lists with a name + * matching this value will be returned in search results. Set to + * null to disable filtering by list name. + * + * @param string $value The email list name to filter search results by, + * or null to disable. + */ + public function setEmailListName($value) + { + $this->_emailListName = $value; + } + + /** + * Get the email list name to query for. If no name is set, null will be + * returned. + * + * @param string $value The email list name to filter search results by, + * or null if disabled. + */ + public function getEmailListName() + { + return $this->_emailListName; + } + + /** + * Set the first recipient which should be displayed when retrieving + * a list of email list recipients. + * + * @param string $value The first recipient to be returned, or null to + * disable. + */ + public function setStartRecipient($value) + { + if ($value !== null) { + $this->_params['startRecipient'] = $value; + } else { + unset($this->_params['startRecipient']); + } + } + + /** + * Get the first recipient which should be displayed when retrieving + * a list of email list recipients. + * + * @return string The first recipient to be returned, or null if + * disabled. + */ + public function getStartRecipient() + { + if (array_key_exists('startRecipient', $this->_params)) { + return $this->_params['startRecipient']; + } else { + return null; + } + } + + /** + * Returns the URL generated for this query, based on it's current + * parameters. + * + * @return string A URL generated based on the state of this query. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getQueryUrl() + { + + $uri = $this->getBaseUrl(); + $uri .= Zend_Gdata_Gapps::APPS_EMAIL_LIST_PATH; + if ($this->_emailListName !== null) { + $uri .= '/' . $this->_emailListName; + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'EmailListName must not be null'); + } + $uri .= Zend_Gdata_Gapps::APPS_EMAIL_LIST_RECIPIENT_POSTFIX . '/'; + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/Error.php b/lib/zend/Zend/Gdata/Gapps/Error.php new file mode 100644 index 0000000000..6a490aada4 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/Error.php @@ -0,0 +1,233 @@ +_errorCode = $errorCode; + $this->_reason = $reason; + $this->_invalidInput = $invalidInput; + } + + /** + * Set the error code for this exception. For more information about + * error codes, see getErrorCode. + * + * @see getErrorCode + * @param integer $value The new value for the error code. + */ + public function setErrorCode($value) { + $this->_errorCode = $value; + } + + /** + * Get the error code for this exception. Currently valid values are + * available as constants within this class. These values are: + * + * UNKNOWN_ERROR (1000) + * USER_DELETED_RECENTLY (1100) + * USER_SUSPENDED (1101) + * DOMAIN_USER_LIMIT_EXCEEDED (1200) + * DOMAIN_ALIAS_LIMIT_EXCEEDED (1201) + * DOMAIN_SUSPENDED (1202) + * DOMAIN_FEATURE_UNAVAILABLE (1203) + * ENTITY_EXISTS (1300) + * ENTITY_DOES_NOT_EXIST (1301) + * ENTITY_NAME_IS_RESERVED (1302) + * ENTITY_NAME_NOT_VALID (1303) + * INVALID_GIVEN_NAME (1400) + * INVALID_FAMILY_NAME (1401) + * INVALID_PASSWORD (1402) + * INVALID_USERNAME (1403) + * INVALID_HASH_FUNCTION_NAME (1404) + * INVALID_HASH_DIGEST_LENGTH (1405) + * INVALID_EMAIL_ADDRESS (1406) + * INVALID_QUERY_PARAMETER_VALUE (1407) + * TOO_MANY_RECIPIENTS_ON_EMAIL_LIST (1500) + * + * Numbers in parenthesis indicate the actual integer value of the + * constant. This list should not be treated as exhaustive, as additional + * error codes may be added at any time. + * + * For more information about these codes and their meaning, please + * see Appendix D of the Google Apps Provisioning API Reference. + * + * @link http://code.google.com/apis/apps/gdata_provisioning_api_v2.0_reference.html#appendix_d Google Apps Provisioning API Reference: Appendix D - Gdata Error Codes + * @see setErrorCode + * @return integer The error code returned by the Google Apps server. + */ + public function getErrorCode() { + return $this->_errorCode; + } + + /** + * Set human-readable text describing the reason this exception occurred. + * + * @see getReason + * @param string $value The reason this exception occurred. + */ + public function setReason($value) { + $this->_reason = $value; + } + + /** + * Get human-readable text describing the reason this exception occurred. + * + * @see setReason + * @return string The reason this exception occurred. + */ + public function getReason() { + return $this->_reason; + } + + /** + * Set the invalid input which caused this exception. + * + * @see getInvalidInput + * @param string $value The invalid input that triggered this exception. + */ + public function setInvalidInput($value) { + $this->_invalidInput = $value; + } + + /** + * Set the invalid input which caused this exception. + * + * @see setInvalidInput + * @return string The reason this exception occurred. + */ + public function getInvalidInput() { + return $this->_invalidInput; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_errorCode !== null) { + $element->setAttribute('errorCode', $this->_errorCode); + } + if ($this->_reason !== null) { + $element->setAttribute('reason', $this->_reason); + } + if ($this->_invalidInput !== null) { + $element->setAttribute('invalidInput', $this->_invalidInput); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'errorCode': + $this->_errorCode = $attribute->nodeValue; + break; + case 'reason': + $this->_reason = $attribute->nodeValue; + break; + case 'invalidInput': + $this->_invalidInput = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get a human readable version of this exception. + * + * @return string + */ + public function __toString() { + return "Error " . $this->getErrorCode() . ": " . $this->getReason() . + "\n\tInvalid Input: \"" . $this->getInvalidInput() . "\""; + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/Extension/EmailList.php b/lib/zend/Zend/Gdata/Gapps/Extension/EmailList.php new file mode 100644 index 0000000000..2471cae68a --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/Extension/EmailList.php @@ -0,0 +1,144 @@ +registerAllNamespaces(Zend_Gdata_Gapps::$namespaces); + parent::__construct(); + $this->_name = $name; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_name !== null) { + $element->setAttribute('name', $this->_name); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'name': + $this->_name = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's name attribute. + * + * @see setName + * @return string The requested attribute. + */ + public function getName() + { + return $this->_name; + } + + /** + * Set the value for this element's name attribute. This is the unique + * name which will be used to identify this email list within this + * domain, and will be used to form this email list's email address. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_EmailList The element being modified. + */ + public function setName($value) + { + $this->_name = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string + */ + public function __toString() + { + return $this->getName(); + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/Extension/Login.php b/lib/zend/Zend/Gdata/Gapps/Extension/Login.php new file mode 100644 index 0000000000..988f086985 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/Extension/Login.php @@ -0,0 +1,485 @@ +registerAllNamespaces(Zend_Gdata_Gapps::$namespaces); + parent::__construct(); + $this->_username = $username; + $this->_password = $password; + $this->_hashFunctionName = $hashFunctionName; + $this->_admin = $admin; + $this->_agreedToTerms = $agreedToTerms; + $this->_suspended = $suspended; + $this->_changePasswordAtNextLogin = $changePasswordAtNextLogin; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_username !== null) { + $element->setAttribute('userName', $this->_username); + } + if ($this->_password !== null) { + $element->setAttribute('password', $this->_password); + } + if ($this->_hashFunctionName !== null) { + $element->setAttribute('hashFunctionName', $this->_hashFunctionName); + } + if ($this->_admin !== null) { + $element->setAttribute('admin', ($this->_admin ? "true" : "false")); + } + if ($this->_agreedToTerms !== null) { + $element->setAttribute('agreedToTerms', ($this->_agreedToTerms ? "true" : "false")); + } + if ($this->_suspended !== null) { + $element->setAttribute('suspended', ($this->_suspended ? "true" : "false")); + } + if ($this->_changePasswordAtNextLogin !== null) { + $element->setAttribute('changePasswordAtNextLogin', ($this->_changePasswordAtNextLogin ? "true" : "false")); + } + + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + * @throws Zend_Gdata_App_InvalidArgumentException + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'userName': + $this->_username = $attribute->nodeValue; + break; + case 'password': + $this->_password = $attribute->nodeValue; + break; + case 'hashFunctionName': + $this->_hashFunctionName = $attribute->nodeValue; + break; + case 'admin': + if ($attribute->nodeValue == "true") { + $this->_admin = true; + } + else if ($attribute->nodeValue == "false") { + $this->_admin = false; + } + else { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for apps:login#admin."); + } + break; + case 'agreedToTerms': + if ($attribute->nodeValue == "true") { + $this->_agreedToTerms = true; + } + else if ($attribute->nodeValue == "false") { + $this->_agreedToTerms = false; + } + else { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for apps:login#agreedToTerms."); + } + break; + case 'suspended': + if ($attribute->nodeValue == "true") { + $this->_suspended = true; + } + else if ($attribute->nodeValue == "false") { + $this->_suspended = false; + } + else { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for apps:login#suspended."); + } + break; + case 'changePasswordAtNextLogin': + if ($attribute->nodeValue == "true") { + $this->_changePasswordAtNextLogin = true; + } + else if ($attribute->nodeValue == "false") { + $this->_changePasswordAtNextLogin = false; + } + else { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException("Expected 'true' or 'false' for apps:login#changePasswordAtNextLogin."); + } + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's username attribute. + * + * @see setUsername + * @return string The attribute being modified. + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Set the value for this element's username attribute. This string + * is used to uniquely identify the user in this domian and is used + * to form this user's email address. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + */ + public function setUsername($value) + { + $this->_username = $value; + return $this; + } + + /** + * Get the value for this element's password attribute. + * + * @see setPassword + * @return string The requested attribute. + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Set the value for this element's password attribute. As of this + * writing, this can be either be provided as plaintext or hashed using + * the SHA-1 algorithm for protection. If using a hash function, + * this must be indicated by calling setHashFunctionName(). + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + */ + public function setPassword($value) + { + $this->_password = $value; + return $this; + } + + /** + * Get the value for this element's hashFunctionName attribute. + * + * @see setHashFunctionName + * @return string The requested attribute. + */ + public function getHashFunctionName() + { + return $this->_hashFunctionName; + } + + /** + * Set the value for this element's hashFunctionName attribute. This + * indicates whether the password supplied with setPassword() is in + * plaintext or has had a hash function applied to it. If null, + * plaintext is assumed. As of this writing, the only valid hash + * function is 'SHA-1'. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + */ + public function setHashFunctionName($value) + { + $this->_hashFunctionName = $value; + return $this; + } + + /** + * Get the value for this element's admin attribute. + * + * @see setAdmin + * @return boolean The requested attribute. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getAdmin() + { + if (!(is_bool($this->_admin))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for admin.'); + } + return $this->_admin; + } + + /** + * Set the value for this element's admin attribute. This indicates + * whether this user is an administrator for this domain. + * + * @param boolean $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setAdmin($value) + { + if (!(is_bool($value))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for $value.'); + } + $this->_admin = $value; + return $this; + } + + /** + * Get the value for this element's agreedToTerms attribute. + * + * @see setAgreedToTerms + * @return boolean The requested attribute. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getAgreedToTerms() + { + if (!(is_bool($this->_agreedToTerms))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for agreedToTerms.'); + } + return $this->_agreedToTerms; + } + + /** + * Set the value for this element's agreedToTerms attribute. This + * indicates whether this user has agreed to the terms of service. + * + * @param boolean $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setAgreedToTerms($value) + { + if (!(is_bool($value))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for $value.'); + } + $this->_agreedToTerms = $value; + return $this; + } + + /** + * Get the value for this element's suspended attribute. + * + * @see setSuspended + * @return boolean The requested attribute. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getSuspended() + { + if (!(is_bool($this->_suspended))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for suspended.'); + } + return $this->_suspended; + } + + /** + * Set the value for this element's suspended attribute. If true, the + * user will not be able to login to this domain until unsuspended. + * + * @param boolean $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setSuspended($value) + { + if (!(is_bool($value))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for $value.'); + } + $this->_suspended = $value; + return $this; + } + + /** + * Get the value for this element's changePasswordAtNextLogin attribute. + * + * @see setChangePasswordAtNextLogin + * @return boolean The requested attribute. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getChangePasswordAtNextLogin() + { + if (!(is_bool($this->_changePasswordAtNextLogin))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for changePasswordAtNextLogin.'); + } + return $this->_changePasswordAtNextLogin; + } + + /** + * Set the value for this element's changePasswordAtNextLogin attribute. + * If true, the user will be forced to set a new password the next + * time they login. + * + * @param boolean $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Login Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function setChangePasswordAtNextLogin($value) + { + if (!(is_bool($value))) { + require_once('Zend/Gdata/App/InvalidArgumentException.php'); + throw new Zend_Gdata_App_InvalidArgumentException('Expected boolean for $value.'); + } + $this->_changePasswordAtNextLogin = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return "Username: " . $this->getUsername() . + "\nPassword: " . (($this->getPassword() === null) ? "NOT SET" : "SET") . + "\nPassword Hash Function: " . $this->getHashFunctionName() . + "\nAdministrator: " . ($this->getAdmin() ? "Yes" : "No") . + "\nAgreed To Terms: " . ($this->getAgreedToTerms() ? "Yes" : "No") . + "\nSuspended: " . ($this->getSuspended() ? "Yes" : "No"); + } +} diff --git a/lib/zend/Zend/Gdata/Gapps/Extension/Name.php b/lib/zend/Zend/Gdata/Gapps/Extension/Name.php new file mode 100644 index 0000000000..b2aa1710b7 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/Extension/Name.php @@ -0,0 +1,181 @@ +registerAllNamespaces(Zend_Gdata_Gapps::$namespaces); + parent::__construct(); + $this->_familyName = $familyName; + $this->_givenName = $givenName; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_familyName !== null) { + $element->setAttribute('familyName', $this->_familyName); + } + if ($this->_givenName !== null) { + $element->setAttribute('givenName', $this->_givenName); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'familyName': + $this->_familyName = $attribute->nodeValue; + break; + case 'givenName': + $this->_givenName = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's familyName attribute. + * + * @see setFamilyName + * @return string The requested attribute. + */ + public function getFamilyName() + { + return $this->_familyName; + } + + /** + * Set the value for this element's familyName attribute. This + * represents a user's family name. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Name Provides a fluent interface.. + */ + public function setFamilyName($value) + { + $this->_familyName = $value; + return $this; + } + + /** + * Get the value for this element's givenName attribute. + * + * @see setGivenName + * @return string The requested attribute. + */ + public function getGivenName() + { + return $this->_givenName; + } + + /** + * Set the value for this element's givenName attribute. This + * represents a user's given name. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Name Provides a fluent interface. + */ + public function setGivenName($value) + { + $this->_givenName = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getGivenName() . ' ' . $this->getFamilyName(); + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/Extension/Nickname.php b/lib/zend/Zend/Gdata/Gapps/Extension/Nickname.php new file mode 100644 index 0000000000..6d0e1fb30f --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/Extension/Nickname.php @@ -0,0 +1,142 @@ +registerAllNamespaces(Zend_Gdata_Gapps::$namespaces); + parent::__construct(); + $this->_name = $name; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_name !== null) { + $element->setAttribute('name', $this->_name); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'name': + $this->_name = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's name attribute. + * + * @see setName + * @return string The requested attribute. + */ + public function getName() + { + return $this->_name; + } + + /** + * Set the value for this element's name attribute. This name uniquely + * describes this nickname within the domain. Emails addressed to this + * name will be delivered to the user who owns this nickname. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Nickname Provides a fluent + * interface. + */ + public function setName($value) + { + $this->_name = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getName(); + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/Extension/Quota.php b/lib/zend/Zend/Gdata/Gapps/Extension/Quota.php new file mode 100644 index 0000000000..a6412bf93b --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/Extension/Quota.php @@ -0,0 +1,142 @@ +registerAllNamespaces(Zend_Gdata_Gapps::$namespaces); + parent::__construct(); + $this->_limit = $limit; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_limit !== null) { + $element->setAttribute('limit', $this->_limit); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'limit': + $this->_limit = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's limit attribute. + * + * @see setLimit + * @return string The requested attribute. + */ + public function getLimit() + { + return $this->_limit; + } + + /** + * Set the value for this element's limit attribute. This is the amount + * of storage space, in bytes, that should be made available to + * the associated user. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Gapps_Extension_Quota Provides a fluent interface. + */ + public function setLimit($value) + { + $this->_limit = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->getLimit(); + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/NicknameEntry.php b/lib/zend/Zend/Gdata/Gapps/NicknameEntry.php new file mode 100644 index 0000000000..6841177ba0 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/NicknameEntry.php @@ -0,0 +1,189 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @subpackage Gapps + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Gdata_Gapps_NicknameEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Gapps_NicknameEntry'; + + /** + * element used to hold information about the owner + * of this nickname, including their username. + * + * @var Zend_Gdata_Gapps_Extension_Login + */ + protected $_login = null; + + /** + * element used to hold the name of this nickname. + * + * @var Zend_Gdata_Gapps_Extension_Nickname + */ + protected $_nickname = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Gapps::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_login !== null) { + $element->appendChild($this->_login->getDOM($element->ownerDocument)); + } + if ($this->_nickname !== null) { + $element->appendChild($this->_nickname->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('apps') . ':' . 'login'; + $login = new Zend_Gdata_Gapps_Extension_Login(); + $login->transferFromDOM($child); + $this->_login = $login; + break; + case $this->lookupNamespace('apps') . ':' . 'nickname'; + $nickname = new Zend_Gdata_Gapps_Extension_Nickname(); + $nickname->transferFromDOM($child); + $this->_nickname = $nickname; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value of the login property for this object. + * + * @see setLogin + * @return Zend_Gdata_Gapps_Extension_Login The requested object. + */ + public function getLogin() + { + return $this->_login; + } + + /** + * Set the value of the login property for this object. This property + * is used to store the username address of the current user. + * + * @param Zend_Gdata_Gapps_Extension_Login $value The desired value for + * this instance's login property. + * @return Zend_Gdata_Gapps_NicknameEntry Provides a fluent interface. + */ + public function setLogin($value) + { + $this->_login = $value; + return $this; + } + + /** + * Get the value of the nickname property for this object. + * + * @see setNickname + * @return Zend_Gdata_Gapps_Extension_Nickname The requested object. + */ + public function getNickname() + { + return $this->_nickname; + } + + /** + * Set the value of the nickname property for this object. This property + * is used to store the the name of the current nickname. + * + * @param Zend_Gdata_Gapps_Extension_Nickname $value The desired value for + * this instance's nickname property. + * @return Zend_Gdata_Gapps_NicknameEntry Provides a fluent interface. + */ + public function setNickname($value) + { + $this->_nickname = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/NicknameFeed.php b/lib/zend/Zend/Gdata/Gapps/NicknameFeed.php new file mode 100644 index 0000000000..42f4c0e3af --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/NicknameFeed.php @@ -0,0 +1,53 @@ +setNickname($nickname); + $this->setUsername($username); + $this->setStartNickname($startNickname); + } + + /** + * Set the nickname to query for. When set, only users with a nickname + * matching this value will be returned in search results. Set to + * null to disable filtering by username. + * + * @param string $value The nickname to filter search results by, or null + * to disable. + */ + public function setNickname($value) + { + $this->_nickname = $value; + } + + /** + * Get the nickname to query for. If no nickname is set, null will be + * returned. + * + * @see setNickname + * @return string The nickname to filter search results by, or null if + * disabled. + */ + public function getNickname() + { + return $this->_nickname; + } + + /** + * Set the username to query for. When set, only users with a username + * matching this value will be returned in search results. Set to + * null to disable filtering by username. + * + * @param string $value The username to filter search results by, or null + * to disable. + */ + public function setUsername($value) + { + if ($value !== null) { + $this->_params['username'] = $value; + } + else { + unset($this->_params['username']); + } + } + + /** + * Get the username to query for. If no username is set, null will be + * returned. + * + * @see setUsername + * @return string The username to filter search results by, or null if + * disabled. + */ + public function getUsername() + { + if (array_key_exists('username', $this->_params)) { + return $this->_params['username']; + } else { + return null; + } + } + + /** + * Set the first nickname which should be displayed when retrieving + * a list of nicknames. + * + * @param string $value The first nickname to be returned, or null to + * disable. + */ + public function setStartNickname($value) + { + if ($value !== null) { + $this->_params['startNickname'] = $value; + } else { + unset($this->_params['startNickname']); + } + } + + /** + * Get the first nickname which should be displayed when retrieving + * a list of nicknames. + * + * @return string The first nickname to be returned, or null to + * disable. + */ + public function getStartNickname() + { + if (array_key_exists('startNickname', $this->_params)) { + return $this->_params['startNickname']; + } else { + return null; + } + } + + /** + * Returns the URL generated for this query, based on it's current + * parameters. + * + * @return string A URL generated based on the state of this query. + */ + public function getQueryUrl() + { + + $uri = $this->getBaseUrl(); + $uri .= Zend_Gdata_Gapps::APPS_NICKNAME_PATH; + if ($this->_nickname !== null) { + $uri .= '/' . $this->_nickname; + } + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/Query.php b/lib/zend/Zend/Gdata/Gapps/Query.php new file mode 100644 index 0000000000..e2785efa61 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/Query.php @@ -0,0 +1,123 @@ +_domain = $domain; + } + + /** + * Set domain for this service instance. This should be a fully qualified + * domain, such as 'foo.example.com'. + * + * This value is used when calculating URLs for retrieving and posting + * entries. If no value is specified, a URL will have to be manually + * constructed prior to using any methods which interact with the Google + * Apps provisioning service. + * + * @param string $value The domain to be used for this session. + */ + public function setDomain($value) + { + $this->_domain = $value; + } + + /** + * Get domain for this service instance. This should be a fully qualified + * domain, such as 'foo.example.com'. If no domain is set, null will be + * returned. + * + * @see setDomain + * @return string The domain to be used for this session, or null if not + * set. + */ + public function getDomain() + { + return $this->_domain; + } + + /** + * Returns the base URL used to access the Google Apps service, based + * on the current domain. The current domain can be temporarily + * overridden by providing a fully qualified domain as $domain. + * + * @see setDomain + * @param string $domain (optional) A fully-qualified domain to use + * instead of the default domain for this service instance. + */ + public function getBaseUrl($domain = null) + { + if ($domain !== null) { + return Zend_Gdata_Gapps::APPS_BASE_FEED_URI . '/' . $domain; + } + else if ($this->_domain !== null) { + return Zend_Gdata_Gapps::APPS_BASE_FEED_URI . '/' . $this->_domain; + } + else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Domain must be specified.'); + } + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/ServiceException.php b/lib/zend/Zend/Gdata/Gapps/ServiceException.php new file mode 100644 index 0000000000..7c34ae3488 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/ServiceException.php @@ -0,0 +1,208 @@ +setErrors($errors); + } + } + + /** + * Add a single Error object to the list of errors received by the + * server. + * + * @param Zend_Gdata_Gapps_Error $error An instance of an error returned + * by the server. The error's errorCode must be set. + * @throws Zend_Gdata_App_Exception + */ + public function addError($error) { + // Make sure that we don't try to index an error that doesn't + // contain an index value. + if ($error->getErrorCode() == null) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception("Error encountered without corresponding error code."); + } + + $this->_errors[$error->getErrorCode()] = $error; + } + + /** + * Set the list of errors as sent by the server inside of an + * AppsForYourDomainErrors tag. + * + * @param array $array An associative array containing a collection of + * Zend_Gdata_Gapps_Error objects. All errors must have their + * errorCode value set. + * @throws Zend_Gdata_App_Exception + */ + public function setErrors($array) { + $this->_errors = array(); + foreach ($array as $error) { + $this->addError($error); + } + } + + /** + * Get the list of errors as sent by the server inside of an + * AppsForYourDomainErrors tag. + * + * @return array An associative array containing a collection of + * Zend_Gdata_Gapps_Error objects, indexed by error code. + */ + public function getErrors() { + return $this->_errors; + } + + /** + * Return the Error object associated with a specific error code. + * + * @return Zend_Gdata_Gapps_Error The Error object requested, or null + * if not found. + */ + public function getError($errorCode) { + if (array_key_exists($errorCode, $this->_errors)) { + $result = $this->_errors[$errorCode]; + return $result; + } else { + return null; + } + } + + /** + * Check whether or not a particular error code was returned by the + * server. + * + * @param integer $errorCode The error code to check against. + * @return boolean Whether or not the supplied error code was returned + * by the server. + */ + public function hasError($errorCode) { + return array_key_exists($errorCode, $this->_errors); + } + + /** + * Import an AppsForYourDomain error from XML. + * + * @param string $string The XML data to be imported + * @return Zend_Gdata_Gapps_ServiceException Provides a fluent interface. + * @throws Zend_Gdata_App_Exception + */ + public function importFromString($string) { + if ($string) { + // Check to see if an AppsForYourDomainError exists + // + // track_errors is temporarily enabled so that if an error + // occurs while parsing the XML we can append it to an + // exception by referencing $php_errormsg + @ini_set('track_errors', 1); + $doc = new DOMDocument(); + $success = @$doc->loadXML($string); + @ini_restore('track_errors'); + + if (!$success) { + require_once 'Zend/Gdata/App/Exception.php'; + // $php_errormsg is automatically generated by PHP if + // an error occurs while calling loadXML(), above. + throw new Zend_Gdata_App_Exception("DOMDocument cannot parse XML: $php_errormsg"); + } + + // Ensure that the outermost node is an AppsForYourDomain error. + // If it isn't, something has gone horribly wrong. + $rootElement = $doc->getElementsByTagName($this->_rootElement)->item(0); + if (!$rootElement) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('No root <' . $this->_rootElement . '> element found, cannot parse feed.'); + } + + foreach ($rootElement->childNodes as $errorNode) { + if (!($errorNode instanceof DOMText)) { + $error = new Zend_Gdata_Gapps_Error(); + $error->transferFromDom($errorNode); + $this->addError($error); + } + } + return $this; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('XML passed to transferFromXML cannot be null'); + } + + } + + /** + * Get a human readable version of this exception. + * + * @return string + */ + public function __toString() { + $result = "The server encountered the following errors processing the request:"; + foreach ($this->_errors as $error) { + $result .= "\n" . $error->__toString(); + } + return $result; + } +} diff --git a/lib/zend/Zend/Gdata/Gapps/UserEntry.php b/lib/zend/Zend/Gdata/Gapps/UserEntry.php new file mode 100644 index 0000000000..34da8da1d9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/UserEntry.php @@ -0,0 +1,295 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @subpackage Gapps + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Gdata_Gapps_UserEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Gapps_UserEntry'; + + /** + * element containing information about this user's + * account, including their username and permissions. + * + * @var Zend_Gdata_Gapps_Extension_Login + */ + protected $_login = null; + + /** + * element containing the user's actual name. + * + * @var Zend_Gdata_Gapps_Extension_Name + */ + protected $_name = null; + + /** + * element describing any storage quotas in place for + * this user. + * + * @var Zend_Gdata_Gapps_Extension_Quota + */ + protected $_quota = null; + + /** + * element containing information about other feeds + * relevant to this entry. + * + * @var Zend_Gdata_Extension_FeedLink + */ + protected $_feedLink = array(); + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Gapps::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_login !== null) { + $element->appendChild($this->_login->getDOM($element->ownerDocument)); + } + if ($this->_name !== null) { + $element->appendChild($this->_name->getDOM($element->ownerDocument)); + } + if ($this->_quota !== null) { + $element->appendChild($this->_quota->getDOM($element->ownerDocument)); + } + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('apps') . ':' . 'login'; + $login = new Zend_Gdata_Gapps_Extension_Login(); + $login->transferFromDOM($child); + $this->_login = $login; + break; + case $this->lookupNamespace('apps') . ':' . 'name'; + $name = new Zend_Gdata_Gapps_Extension_Name(); + $name->transferFromDOM($child); + $this->_name = $name; + break; + case $this->lookupNamespace('apps') . ':' . 'quota'; + $quota = new Zend_Gdata_Gapps_Extension_Quota(); + $quota->transferFromDOM($child); + $this->_quota = $quota; + break; + case $this->lookupNamespace('gd') . ':' . 'feedLink'; + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value of the login property for this object. + * + * @see setLogin + * @return Zend_Gdata_Gapps_Extension_Login The requested object. + */ + public function getLogin() + { + return $this->_login; + } + + /** + * Set the value of the login property for this object. This property + * is used to store the username address of the current user. + * + * @param Zend_Gdata_Gapps_Extension_Login $value The desired value for + * this instance's login property. + * @return Zend_Gdata_Gapps_UserEntry Provides a fluent interface. + */ + public function setLogin($value) + { + $this->_login = $value; + return $this; + } + + /** + * Get the value of the name property for this object. + * + * @see setName + * @return Zend_Gdata_Gapps_Extension_Name The requested object. + */ + public function getName() + { + return $this->_name; + } + + /** + * Set the value of the name property for this object. This property + * is used to store the full name of the current user. + * + * @param Zend_Gdata_Gapps_Extension_Name $value The desired value for + * this instance's name property. + * @return Zend_Gdata_Gapps_UserEntry Provides a fluent interface. + */ + public function setName($value) + { + $this->_name = $value; + return $this; + } + + /** + * Get the value of the quota property for this object. + * + * @see setQuota + * @return Zend_Gdata_Gapps_Extension_Quota The requested object. + */ + public function getQuota() + { + return $this->_quota; + } + + /** + * Set the value of the quota property for this object. This property + * is used to store the amount of storage available for the current + * user. Quotas may not be modifiable depending on the domain used. + * + * @param Zend_Gdata_Gapps_Extension_Quota $value The desired value for + * this instance's quota property. + * @return Zend_Gdata_Gapps_UserEntry Provides a fluent interface. + */ + public function setQuota($value) + { + $this->_quota = $value; + return $this; + } + + /** + * Returns all feed links for this entry, or if a rel value is + * specified, the feed link associated with that value is returned. + * + * @param string $rel The rel value of the link to be found. If null, + * the array of links is returned instead. + * @return mixed Either an array of Zend_Gdata_Extension_FeedLink + * objects if $rel is null, a single + * Zend_Gdata_Extension_FeedLink object if $rel is specified + * and a matching feed link is found, or null if $rel is + * specified and no matching feed link is found. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Set the value of the feed link property for this object. This property + * is used to provide links to alternative feeds relevant to this entry. + * + * @param array $value A collection of + * Zend_Gdata_Gapps_Extension_FeedLink objects. + * @return Zend_Gdata_Gapps_EventEntry Provides a fluent interface. + */ + public function setFeedLink($value) + { + $this->_feedLink = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Gapps/UserFeed.php b/lib/zend/Zend/Gdata/Gapps/UserFeed.php new file mode 100644 index 0000000000..e673316a7c --- /dev/null +++ b/lib/zend/Zend/Gdata/Gapps/UserFeed.php @@ -0,0 +1,53 @@ +setUsername($username); + $this->setStartUsername($startUsername); + } + + /** + * Set the username to query for. When set, only users with a username + * matching this value will be returned in search results. Set to + * null to disable filtering by username. + * + * @see getUsername + * @param string $value The username to filter search results by, or null to + * disable. + */ + public function setUsername($value) + { + $this->_username = $value; + } + + /** + * Get the username to query for. If no username is set, null will be + * returned. + * + * @param string $value The username to filter search results by, or + * null if disabled. + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Set the first username which should be displayed when retrieving + * a list of users. + * + * @param string $value The first username to be returned, or null to + * disable. + */ + public function setStartUsername($value) + { + if ($value !== null) { + $this->_params['startUsername'] = $value; + } else { + unset($this->_params['startUsername']); + } + } + + /** + * Get the first username which should be displayed when retrieving + * a list of users. + * + * @see setStartUsername + * @return string The first username to be returned, or null if + * disabled. + */ + public function getStartUsername() + { + if (array_key_exists('startUsername', $this->_params)) { + return $this->_params['startUsername']; + } else { + return null; + } + } + + /** + * Returns the query URL generated by this query instance. + * + * @return string The query URL for this instance. + */ + public function getQueryUrl() + { + $uri = $this->getBaseUrl(); + $uri .= Zend_Gdata_Gapps::APPS_USER_PATH; + if ($this->_username !== null) { + $uri .= '/' . $this->_username; + } + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/lib/zend/Zend/Gdata/Gbase.php b/lib/zend/Zend/Gdata/Gbase.php new file mode 100644 index 0000000000..8f6c6eab1f --- /dev/null +++ b/lib/zend/Zend/Gdata/Gbase.php @@ -0,0 +1,209 @@ +registerPackage('Zend_Gdata_Gbase'); + $this->registerPackage('Zend_Gdata_Gbase_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + } + + /** + * Retreive feed object + * + * @param mixed $location The location for the feed, as a URL or Query + * @return Zend_Gdata_Gbase_ItemFeed + */ + public function getGbaseItemFeed($location = null) + { + if ($location === null) { + $uri = self::GBASE_ITEM_FEED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gbase_ItemFeed'); + } + + /** + * Retreive entry object + * + * @param mixed $location The location for the feed, as a URL or Query + * @return Zend_Gdata_Gbase_ItemEntry + */ + public function getGbaseItemEntry($location = null) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Gbase_ItemEntry'); + } + + /** + * Insert an entry + * + * @param Zend_Gdata_Gbase_ItemEntry $entry The Base entry to upload + * @param boolean $dryRun Flag for the 'dry-run' parameter + * @return Zend_Gdata_Gbase_ItemFeed + */ + public function insertGbaseItem($entry, $dryRun = false) + { + if ($dryRun == false) { + $uri = $this->_defaultPostUri; + } else { + $uri = $this->_defaultPostUri . '?dry-run=true'; + } + $newitem = $this->insertEntry($entry, $uri, 'Zend_Gdata_Gbase_ItemEntry'); + return $newitem; + } + + /** + * Update an entry + * + * @param Zend_Gdata_Gbase_ItemEntry $entry The Base entry to be updated + * @param boolean $dryRun Flag for the 'dry-run' parameter + * @return Zend_Gdata_Gbase_ItemEntry + */ + public function updateGbaseItem($entry, $dryRun = false) + { + $returnedEntry = $entry->save($dryRun); + return $returnedEntry; + } + + /** + * Delete an entry + * + * @param Zend_Gdata_Gbase_ItemEntry $entry The Base entry to remove + * @param boolean $dryRun Flag for the 'dry-run' parameter + * @return Zend_Gdata_Gbase_ItemFeed + */ + public function deleteGbaseItem($entry, $dryRun = false) + { + $entry->delete($dryRun); + return $this; + } + + /** + * Retrieve feed object + * + * @param mixed $location The location for the feed, as a URL or Query + * @return Zend_Gdata_Gbase_SnippetFeed + */ + public function getGbaseSnippetFeed($location = null) + { + if ($location === null) { + $uri = self::GBASE_SNIPPET_FEED_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Gbase_SnippetFeed'); + } +} diff --git a/lib/zend/Zend/Gdata/Gbase/Entry.php b/lib/zend/Zend/Gdata/Gbase/Entry.php new file mode 100644 index 0000000000..5506c3619a --- /dev/null +++ b/lib/zend/Zend/Gdata/Gbase/Entry.php @@ -0,0 +1,151 @@ +registerAllNamespaces(Zend_Gdata_Gbase::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + foreach ($this->_baseAttributes as $baseAttribute) { + $element->appendChild($baseAttribute->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + if (strstr($absoluteNodeName, $this->lookupNamespace('g') . ':')) { + $baseAttribute = new Zend_Gdata_Gbase_Extension_BaseAttribute(); + $baseAttribute->transferFromDOM($child); + $this->_baseAttributes[] = $baseAttribute; + } else { + parent::takeChildFromDOM($child); + } + } + + /** + * Get the value of the itme_type + * + * @return Zend_Gdata_Gbase_Extension_ItemType The requested object. + */ + public function getItemType() + { + $itemType = $this->getGbaseAttribute('item_type'); + if (is_object($itemType[0])) { + return $itemType[0]; + } else { + return null; + } + } + + /** + * Return all the Base attributes + * @return Zend_Gdata_Gbase_Extension_BaseAttribute + */ + public function getGbaseAttributes() { + return $this->_baseAttributes; + } + + /** + * Return an array of Base attributes that match the given attribute name + * + * @param string $name The name of the Base attribute to look for + * @return array $matches Array that contains the matching list of Base attributes + */ + public function getGbaseAttribute($name) + { + $matches = array(); + for ($i = 0; $i < count($this->_baseAttributes); $i++) { + $baseAttribute = $this->_baseAttributes[$i]; + if ($baseAttribute->rootElement == $name && + $baseAttribute->rootNamespaceURI == $this->lookupNamespace('g')) { + $matches[] = &$this->_baseAttributes[$i]; + } + } + return $matches; + } + +} diff --git a/lib/zend/Zend/Gdata/Gbase/Extension/BaseAttribute.php b/lib/zend/Zend/Gdata/Gbase/Extension/BaseAttribute.php new file mode 100644 index 0000000000..caaf0505be --- /dev/null +++ b/lib/zend/Zend/Gdata/Gbase/Extension/BaseAttribute.php @@ -0,0 +1,115 @@ +registerAllNamespaces(Zend_Gdata_Gbase::$namespaces); + if ($type !== null) { + $attr = array('name' => 'type', 'value' => $type); + $typeAttr = array('type' => $attr); + $this->setExtensionAttributes($typeAttr); + } + parent::__construct($name, + $this->_rootNamespace, + $this->lookupNamespace($this->_rootNamespace), + $text); + } + + /** + * Get the name of the attribute + * + * @return attribute name The requested object. + */ + public function getName() { + return $this->_rootElement; + } + + /** + * Get the type of the attribute + * + * @return attribute type The requested object. + */ + public function getType() { + $typeAttr = $this->getExtensionAttributes(); + return $typeAttr['type']['value']; + } + + /** + * Set the 'name' of the Base attribute object: + * <g:[$name] type='[$type]'>[$value]</g:[$name]> + * + * @param Zend_Gdata_App_Extension_Element $attribute The attribute object + * @param string $name The name of the Base attribute + * @return Zend_Gdata_Extension_ItemEntry Provides a fluent interface + */ + public function setName($name) { + $this->_rootElement = $name; + return $this; + } + + /** + * Set the 'type' of the Base attribute object: + * <g:[$name] type='[$type]'>[$value]</g:[$name]> + * + * @param Zend_Gdata_App_Extension_Element $attribute The attribute object + * @param string $type The type of the Base attribute + * @return Zend_Gdata_Extension_ItemEntry Provides a fluent interface + */ + public function setType($type) { + $attr = array('name' => 'type', 'value' => $type); + $typeAttr = array('type' => $attr); + $this->setExtensionAttributes($typeAttr); + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Gbase/Feed.php b/lib/zend/Zend/Gdata/Gbase/Feed.php new file mode 100644 index 0000000000..4cf5e3b054 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gbase/Feed.php @@ -0,0 +1,60 @@ +registerAllNamespaces(Zend_Gdata_Gbase::$namespaces); + parent::__construct($element); + } +} diff --git a/lib/zend/Zend/Gdata/Gbase/ItemEntry.php b/lib/zend/Zend/Gdata/Gbase/ItemEntry.php new file mode 100644 index 0000000000..0e39933ef6 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gbase/ItemEntry.php @@ -0,0 +1,161 @@ +addGbaseAttribute('item_type', $value, 'text'); + return $this; + } + + /** + * Adds a custom attribute to the entry in the following format: + * <g:[$name] type='[$type]'>[$value]</g:[$name]> + * + * @param string $name The name of the attribute + * @param string $value The text value of the attribute + * @param string $type (optional) The type of the attribute. + * e.g.: 'text', 'number', 'floatUnit' + * @return Zend_Gdata_Gbase_ItemEntry Provides a fluent interface + */ + public function addGbaseAttribute($name, $text, $type = null) { + $newBaseAttribute = new Zend_Gdata_Gbase_Extension_BaseAttribute($name, $text, $type); + $this->_baseAttributes[] = $newBaseAttribute; + return $this; + } + + /** + * Removes a Base attribute from the current list of Base attributes + * + * @param Zend_Gdata_Gbase_Extension_BaseAttribute $baseAttribute The attribute to be removed + * @return Zend_Gdata_Gbase_ItemEntry Provides a fluent interface + */ + public function removeGbaseAttribute($baseAttribute) { + $baseAttributes = $this->_baseAttributes; + for ($i = 0; $i < count($this->_baseAttributes); $i++) { + if ($this->_baseAttributes[$i] == $baseAttribute) { + array_splice($baseAttributes, $i, 1); + break; + } + } + $this->_baseAttributes = $baseAttributes; + return $this; + } + + /** + * Uploads changes in this entry to the server using Zend_Gdata_App + * + * @param boolean $dryRun Whether the transaction is dry run or not. + * @param string|null $uri The URI to send requests to, or null if $data + * contains the URI. + * @param string|null $className The name of the class that should we + * deserializing the server response. If null, then + * 'Zend_Gdata_App_Entry' will be used. + * @param array $extraHeaders Extra headers to add to the request, as an + * array of string-based key/value pairs. + * @return Zend_Gdata_App_Entry The updated entry + * @throws Zend_Gdata_App_Exception + */ + public function save($dryRun = false, + $uri = null, + $className = null, + $extraHeaders = array()) + { + if ($dryRun == true) { + $editLink = $this->getEditLink(); + if ($uri == null && $editLink !== null) { + $uri = $editLink->getHref() . '?dry-run=true'; + } + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException('You must specify an URI which needs deleted.'); + } + $service = new Zend_Gdata_App($this->getHttpClient()); + return $service->updateEntry($this, + $uri, + $className, + $extraHeaders); + } else { + parent::save($uri, $className, $extraHeaders); + } + } + + /** + * Deletes this entry to the server using the referenced + * Zend_Http_Client to do a HTTP DELETE to the edit link stored in this + * entry's link collection. + * + * @param boolean $dyrRun Whether the transaction is dry run or not + * @return void + * @throws Zend_Gdata_App_Exception + */ + public function delete($dryRun = false) + { + $uri = null; + + if ($dryRun == true) { + $editLink = $this->getEditLink(); + if ($editLink !== null) { + $uri = $editLink->getHref() . '?dry-run=true'; + } + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException('You must specify an URI which needs deleted.'); + } + parent::delete($uri); + } else { + parent::delete(); + } + } + +} diff --git a/lib/zend/Zend/Gdata/Gbase/ItemFeed.php b/lib/zend/Zend/Gdata/Gbase/ItemFeed.php new file mode 100644 index 0000000000..e2269e3045 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gbase/ItemFeed.php @@ -0,0 +1,48 @@ +_id = $value; + return $this; + } + + /* + * @return string id + */ + public function getId() + { + return $this->_id; + } + + /** + * Returns the query URL generated by this query instance. + * + * @return string The query URL for this instance. + */ + public function getQueryUrl() + { + $uri = $this->_defaultFeedUri; + if ($this->getId() !== null) { + $uri .= '/' . $this->getId(); + } else { + $uri .= $this->getQueryString(); + } + return $uri; + } + +} diff --git a/lib/zend/Zend/Gdata/Gbase/Query.php b/lib/zend/Zend/Gdata/Gbase/Query.php new file mode 100644 index 0000000000..ea25d48b9a --- /dev/null +++ b/lib/zend/Zend/Gdata/Gbase/Query.php @@ -0,0 +1,268 @@ +_params['key'] = $value; + } else { + unset($this->_params['key']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setBq($value) + { + if ($value !== null) { + $this->_params['bq'] = $value; + } else { + unset($this->_params['bq']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setRefine($value) + { + if ($value !== null) { + $this->_params['refine'] = $value; + } else { + unset($this->_params['refine']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setContent($value) + { + if ($value !== null) { + $this->_params['content'] = $value; + } else { + unset($this->_params['content']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setOrderBy($value) + { + if ($value !== null) { + $this->_params['orderby'] = $value; + } else { + unset($this->_params['orderby']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setSortOrder($value) + { + if ($value !== null) { + $this->_params['sortorder'] = $value; + } else { + unset($this->_params['sortorder']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setCrowdBy($value) + { + if ($value !== null) { + $this->_params['crowdby'] = $value; + } else { + unset($this->_params['crowdby']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Gbase_ItemQuery Provides a fluent interface + */ + public function setAdjust($value) + { + if ($value !== null) { + $this->_params['adjust'] = $value; + } else { + unset($this->_params['adjust']); + } + return $this; + } + + /** + * @return string key + */ + public function getKey() + { + if (array_key_exists('key', $this->_params)) { + return $this->_params['key']; + } else { + return null; + } + } + + /** + * @return string bq + */ + public function getBq() + { + if (array_key_exists('bq', $this->_params)) { + return $this->_params['bq']; + } else { + return null; + } + } + + /** + * @return string refine + */ + public function getRefine() + { + if (array_key_exists('refine', $this->_params)) { + return $this->_params['refine']; + } else { + return null; + } + } + + /** + * @return string content + */ + public function getContent() + { + if (array_key_exists('content', $this->_params)) { + return $this->_params['content']; + } else { + return null; + } + } + + /** + * @return string orderby + */ + public function getOrderBy() + { + if (array_key_exists('orderby', $this->_params)) { + return $this->_params['orderby']; + } else { + return null; + } + } + + /** + * @return string sortorder + */ + public function getSortOrder() + { + if (array_key_exists('sortorder', $this->_params)) { + return $this->_params['sortorder']; + } else { + return null; + } + } + + /** + * @return string crowdby + */ + public function getCrowdBy() + { + if (array_key_exists('crowdby', $this->_params)) { + return $this->_params['crowdby']; + } else { + return null; + } + } + + /** + * @return string adjust + */ + public function getAdjust() + { + if (array_key_exists('adjust', $this->_params)) { + return $this->_params['adjust']; + } else { + return null; + } + } + +} diff --git a/lib/zend/Zend/Gdata/Gbase/SnippetEntry.php b/lib/zend/Zend/Gdata/Gbase/SnippetEntry.php new file mode 100644 index 0000000000..02c659c6c9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Gbase/SnippetEntry.php @@ -0,0 +1,48 @@ +_defaultFeedUri; + if ($this->getCategory() !== null) { + $uri .= '/-/' . $this->getCategory(); + } + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/lib/zend/Zend/Gdata/Geo.php b/lib/zend/Zend/Gdata/Geo.php new file mode 100755 index 0000000000..4249ac5464 --- /dev/null +++ b/lib/zend/Zend/Gdata/Geo.php @@ -0,0 +1,70 @@ +registerPackage('Zend_Gdata_Geo'); + $this->registerPackage('Zend_Gdata_Geo_Extension'); + parent::__construct($client, $applicationId); + } + +} diff --git a/lib/zend/Zend/Gdata/Geo/Entry.php b/lib/zend/Zend/Gdata/Geo/Entry.php new file mode 100755 index 0000000000..e36abb9f08 --- /dev/null +++ b/lib/zend/Zend/Gdata/Geo/Entry.php @@ -0,0 +1,97 @@ +registerAllNamespaces(Zend_Gdata_Geo::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_where != null) { + $element->appendChild($this->_where->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('georss') . ':' . 'where': + $where = new Zend_Gdata_Geo_Extension_GeoRssWhere(); + $where->transferFromDOM($child); + $this->_where = $where; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getWhere() + { + return $this->_where; + } + + public function setWhere($value) + { + $this->_where = $value; + return $this; + } + + +} diff --git a/lib/zend/Zend/Gdata/Geo/Extension/GeoRssWhere.php b/lib/zend/Zend/Gdata/Geo/Extension/GeoRssWhere.php new file mode 100755 index 0000000000..503d6b8ae9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Geo/Extension/GeoRssWhere.php @@ -0,0 +1,135 @@ +registerAllNamespaces(Zend_Gdata_Geo::$namespaces); + parent::__construct(); + $this->setPoint($point); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_point !== null) { + $element->appendChild($this->_point->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gml') . ':' . 'Point'; + $point = new Zend_Gdata_Geo_Extension_GmlPoint(); + $point->transferFromDOM($child); + $this->_point = $point; + break; + } + } + + /** + * Get the value for this element's point attribute. + * + * @see setPoint + * @return Zend_Gdata_Geo_Extension_GmlPoint The requested attribute. + */ + public function getPoint() + { + return $this->_point; + } + + /** + * Set the value for this element's point attribute. + * + * @param Zend_Gdata_Geo_Extension_GmlPoint $value The desired value for this attribute. + * @return Zend_Gdata_Geo_Extension_GeoRssWhere Provides a fluent interface + */ + public function setPoint($value) + { + $this->_point = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Geo/Extension/GmlPoint.php b/lib/zend/Zend/Gdata/Geo/Extension/GmlPoint.php new file mode 100755 index 0000000000..cd8572a592 --- /dev/null +++ b/lib/zend/Zend/Gdata/Geo/Extension/GmlPoint.php @@ -0,0 +1,136 @@ +registerAllNamespaces(Zend_Gdata_Geo::$namespaces); + parent::__construct(); + $this->setPos($pos); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_pos !== null) { + $element->appendChild($this->_pos->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gml') . ':' . 'pos'; + $pos = new Zend_Gdata_Geo_Extension_GmlPos(); + $pos->transferFromDOM($child); + $this->_pos = $pos; + break; + } + } + + /** + * Get the value for this element's pos attribute. + * + * @see setPos + * @return Zend_Gdata_Geo_Extension_GmlPos The requested attribute. + */ + public function getPos() + { + return $this->_pos; + } + + /** + * Set the value for this element's distance attribute. + * + * @param Zend_Gdata_Geo_Extension_GmlPos $value The desired value for this attribute + * @return Zend_Gdata_Geo_Extension_GmlPoint Provides a fluent interface + */ + public function setPos($value) + { + $this->_pos = $value; + return $this; + } + + +} diff --git a/lib/zend/Zend/Gdata/Geo/Extension/GmlPos.php b/lib/zend/Zend/Gdata/Geo/Extension/GmlPos.php new file mode 100755 index 0000000000..e3615e17a8 --- /dev/null +++ b/lib/zend/Zend/Gdata/Geo/Extension/GmlPos.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Geo::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Geo/Feed.php b/lib/zend/Zend/Gdata/Geo/Feed.php new file mode 100755 index 0000000000..f67d348b73 --- /dev/null +++ b/lib/zend/Zend/Gdata/Geo/Feed.php @@ -0,0 +1,64 @@ +registerAllNamespaces(Zend_Gdata_Geo::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/Health.php b/lib/zend/Zend/Gdata/Health.php new file mode 100755 index 0000000000..f406a26cd7 --- /dev/null +++ b/lib/zend/Zend/Gdata/Health.php @@ -0,0 +1,274 @@ + 'urn:astm-org:CCR', + 'batch' => 'http://schemas.google.com/gdata/batch', + 'h9m' => 'http://schemas.google.com/health/metadata', + 'gAcl' => 'http://schemas.google.com/acl/2007', + 'gd' => 'http://schemas.google.com/g/2005'); + + /** + * Create Zend_Gdata_Health object + * + * @param Zend_Http_Client $client (optional) The HTTP client to use when + * when communicating with the Google Health servers. + * @param string $applicationId The identity of the application in the form + * of Company-AppName-Version + * @param bool $useH9Sandbox True if the H9 Developer's Sandbox should be + * used instead of production Google Health. + */ + public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0', $useH9Sandbox = false) + { + $this->registerPackage('Zend_Gdata_Health'); + $this->registerPackage('Zend_Gdata_Health_Extension_Ccr'); + parent::__construct($client, $applicationId); + $this->_useH9Sandbox = $useH9Sandbox; + } + + /** + * Gets the id of the user's profile + * + * @return string The profile id + */ + public function getProfileID() + { + return $this->_profileID; + } + + /** + * Sets which of the user's profiles will be used + * + * @param string $id The profile ID + * @return Zend_Gdata_Health Provides a fluent interface + */ + public function setProfileID($id) { + $this->_profileID = $id; + return $this; + } + + /** + * Retrieves the list of profiles associated with the user's ClientLogin + * credentials. + * + * @param string $query The query of the feed as a URL or Query object + * @return Zend_Gdata_Feed + */ + public function getHealthProfileListFeed($query = null) + { + if ($this->_httpClient->getClientLoginToken() === null) { + require_once 'Zend/Gdata/App/AuthException.php'; + throw new Zend_Gdata_App_AuthException( + 'Profiles list feed is only available when using ClientLogin'); + } + + if($query === null) { + $uri = self::CLIENTLOGIN_PROFILELIST_FEED_URI; + } else if ($query instanceof Zend_Gdata_Query) { + $uri = $query->getQueryUrl(); + } else { + $uri = $query; + } + + // use correct feed for /h9 or /health + if ($this->_useH9Sandbox) { + $uri = preg_replace('/\/health\//', '/h9/', $uri); + } + + return parent::getFeed($uri, 'Zend_Gdata_Health_ProfileListFeed'); + } + + /** + * Retrieve a user's profile as a feed object. If ClientLogin is used, the + * profile associated with $this->_profileID is returned, otherwise + * the profile associated with the AuthSub token is read. + * + * @param mixed $query The query for the feed, as a URL or Query + * @return Zend_Gdata_Health_ProfileFeed + */ + public function getHealthProfileFeed($query = null) + { + if ($this->_httpClient->getClientLoginToken() !== null && + $this->getProfileID() == null) { + require_once 'Zend/Gdata/App/AuthException.php'; + throw new Zend_Gdata_App_AuthException( + 'Profile ID must not be null. Did you call setProfileID()?'); + } + + if ($query instanceof Zend_Gdata_Query) { + $uri = $query->getQueryUrl(); + } else if ($this->_httpClient->getClientLoginToken() !== null && + $query == null) { + $uri = self::CLIENTLOGIN_PROFILE_FEED_URI . '/' . $this->getProfileID(); + } else if ($query === null) { + $uri = self::AUTHSUB_PROFILE_FEED_URI; + } else { + $uri = $query; + } + + // use correct feed for /h9 or /health + if ($this->_useH9Sandbox) { + $uri = preg_replace('/\/health\//', '/h9/', $uri); + } + + return parent::getFeed($uri, 'Zend_Gdata_Health_ProfileFeed'); + } + + /** + * Retrieve a profile entry object + * + * @param mixed $query The query for the feed, as a URL or Query + * @return Zend_Gdata_Health_ProfileEntry + */ + public function getHealthProfileEntry($query = null) + { + if ($query === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Query must not be null'); + } else if ($query instanceof Zend_Gdata_Query) { + $uri = $query->getQueryUrl(); + } else { + $uri = $query; + } + return parent::getEntry($uri, 'Zend_Gdata_Health_ProfileEntry'); + } + + /** + * Posts a new notice using the register feed. This function constructs + * the atom profile entry. + * + * @param string $subject The subject line of the notice + * @param string $body The message body of the notice + * @param string $bodyType The (optional) type of message body + * (text, xhtml, html, etc.) + * @param string $ccrXML The (optional) CCR to add to the user's profile + * @return Zend_Gdata_Health_ProfileEntry + */ + public function sendHealthNotice($subject, $body, $bodyType = null, $ccrXML = null) + { + if ($this->_httpClient->getClientLoginToken()) { + $profileID = $this->getProfileID(); + if ($profileID !== null) { + $uri = self::CLIENTLOGIN_REGISTER_FEED_URI . '/' . $profileID; + } else { + require_once 'Zend/Gdata/App/AuthException.php'; + throw new Zend_Gdata_App_AuthException( + 'Profile ID must not be null. Did you call setProfileID()?'); + } + } else { + $uri = self::AUTHSUB_REGISTER_FEED_URI; + } + + $entry = new Zend_Gdata_Health_ProfileEntry(); + $entry->title = $this->newTitle($subject); + $entry->content = $this->newContent($body); + $entry->content->type = $bodyType ? $bodyType : 'text'; + $entry->setCcr($ccrXML); + + // use correct feed for /h9 or /health + if ($this->_useH9Sandbox) { + $uri = preg_replace('/\/health\//', '/h9/', $uri); + } + + return $this->insertEntry($entry, $uri, 'Zend_Gdata_Health_ProfileEntry'); + } +} diff --git a/lib/zend/Zend/Gdata/Health/Extension/Ccr.php b/lib/zend/Zend/Gdata/Health/Extension/Ccr.php new file mode 100755 index 0000000000..2683447cbd --- /dev/null +++ b/lib/zend/Zend/Gdata/Health/Extension/Ccr.php @@ -0,0 +1,125 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + } + + /** + * Transfers each child and attribute into member variables. + * This is called when XML is received over the wire and the data + * model needs to be built to represent this XML. + * + * @param DOMNode $node The DOMNode that represents this object's data + */ + public function transferFromDOM($node) + { + $this->_ccrDom = $node; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + if ($doc === null) { + $doc = new DOMDocument('1.0', 'utf-8'); + } + $domElement = $doc->importNode($this->_ccrDom, true); + return $domElement; + } + + /** + * Magic helper that allows drilling down and returning specific elements + * in the CCR. For example, to retrieve the users medications + * (/ContinuityOfCareRecord/Body/Medications) from the entry's CCR, call + * $entry->getCcr()->getMedications(). Similarly, getConditions() would + * return extract the user's conditions. + * + * @param string $name Name of the function to call + * @return array. A list of the appropriate CCR data + */ + public function __call($name, $args) + { + $matches = array(); + + if (substr($name, 0, 3) === 'get') { + $category = substr($name, 3); + + switch ($category) { + case 'Conditions': + $category = 'Problems'; + break; + case 'Allergies': + $category = 'Alerts'; + break; + case 'TestResults': + // TestResults is an alias for LabResults + case 'LabResults': + $category = 'Results'; + break; + default: + // $category is already well formatted + } + + return $this->_ccrDom->getElementsByTagNameNS($this->lookupNamespace('ccr'), $category); + } else { + return null; + } + } +} diff --git a/lib/zend/Zend/Gdata/Health/ProfileEntry.php b/lib/zend/Zend/Gdata/Health/ProfileEntry.php new file mode 100755 index 0000000000..ffeac5d172 --- /dev/null +++ b/lib/zend/Zend/Gdata/Health/ProfileEntry.php @@ -0,0 +1,135 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_ccrData !== null) { + $element->appendChild($this->_ccrData->getDOM($element->ownerDocument)); + } + + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + if (strstr($absoluteNodeName, $this->lookupNamespace('ccr') . ':')) { + $ccrElement = new Zend_Gdata_Health_Extension_Ccr(); + $ccrElement->transferFromDOM($child); + $this->_ccrData = $ccrElement; + } else { + parent::takeChildFromDOM($child); + + } + } + + /** + * Sets the profile entry's CCR data + * @param string $ccrXMLStr The CCR as an xml string + * @return Zend_Gdata_Health_Extension_Ccr + */ + public function setCcr($ccrXMLStr) { + $ccrElement = null; + if ($ccrXMLStr != null) { + $ccrElement = new Zend_Gdata_Health_Extension_Ccr(); + $ccrElement->transferFromXML($ccrXMLStr); + $this->_ccrData = $ccrElement; + } + return $ccrElement; + } + + + /** + * Returns all the CCR data in a profile entry + * @return Zend_Gdata_Health_Extension_Ccr + */ + public function getCcr() { + return $this->_ccrData; + } +} diff --git a/lib/zend/Zend/Gdata/Health/ProfileFeed.php b/lib/zend/Zend/Gdata/Health/ProfileFeed.php new file mode 100755 index 0000000000..59535895cf --- /dev/null +++ b/lib/zend/Zend/Gdata/Health/ProfileFeed.php @@ -0,0 +1,67 @@ + $nsUri) { + $this->registerNamespace($nsPrefix, $nsUri); + } + parent::__construct($element); + } + + public function getEntries() + { + return $this->entry; + } +} diff --git a/lib/zend/Zend/Gdata/Health/ProfileListEntry.php b/lib/zend/Zend/Gdata/Health/ProfileListEntry.php new file mode 100755 index 0000000000..36554e0897 --- /dev/null +++ b/lib/zend/Zend/Gdata/Health/ProfileListEntry.php @@ -0,0 +1,100 @@ + + * @return string The profile id + */ + public function getProfileID() { + return $this->getContent()->text; + } + + /** + * Retrieves the profile's title, which is contained in + * @return string The profile name + */ + public function getProfileName() { + return $this->getTitle()->text; + } + +} diff --git a/lib/zend/Zend/Gdata/Health/ProfileListFeed.php b/lib/zend/Zend/Gdata/Health/ProfileListFeed.php new file mode 100755 index 0000000000..c0d6799c63 --- /dev/null +++ b/lib/zend/Zend/Gdata/Health/ProfileListFeed.php @@ -0,0 +1,53 @@ +entry; + } +} diff --git a/lib/zend/Zend/Gdata/Health/Query.php b/lib/zend/Zend/Gdata/Health/Query.php new file mode 100755 index 0000000000..d1692e2d55 --- /dev/null +++ b/lib/zend/Zend/Gdata/Health/Query.php @@ -0,0 +1,285 @@ +_params['digest'] = $value; + } + return $this; + } + + /** + * Returns the digest parameter's value. + * + * @return string The value set for the digest parameter. + */ + public function getDigest() + { + if (array_key_exists('digest', $this->_params)) { + return $this->_params['digest']; + } else { + return null; + } + } + + /** + * Setter for category queries. + * + * @param string $item A category to query. + * @param string $name (optional) A specific item to search a category for. + * An example would be 'Lipitor' if $item is set to 'medication'. + * @return Zend_Gdata_Health_Query Provides a fluent interface + */ + public function setCategory($item, $name = null) + { + $this->_category = $item . + ($name ? '/' . urlencode('{' . self::ITEM_CATEGORY_NS . '}' . $name) : null); + return $this; + } + + /** + * Returns the query object's category. + * + * @return string id + */ + public function getCategory() + { + return $this->_category; + } + + /** + * Setter for the grouped parameter. + * + * @param string $value setting a count of results per group. + * @return Zend_Gdata_Health_Query Provides a fluent interface + */ + public function setGrouped($value) + { + if ($value !== null) { + $this->_params['grouped'] = $value; + } + return $this; + } + + /** + * Returns the value set for the grouped parameter. + * + * @return string grouped parameter. + */ + public function getGrouped() + { + if (array_key_exists('grouped', $this->_params)) { + return $this->_params['grouped']; + } else { + return null; + } + } + + /** + * Setter for the max-results-group parameter. + * + * @param int $value Specifies the maximum number of groups to be + * retrieved. Must be an integer value greater than zero. This parameter + * is only valid if grouped=true. + * @return Zend_Gdata_Health_Query Provides a fluent interface + */ + public function setMaxResultsGroup($value) + { + if ($value !== null) { + if ($value <= 0 || $this->getGrouped() !== 'true') { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'The max-results-group parameter must be set to a value + greater than 0 and can only be used if grouped=true'); + } else { + $this->_params['max-results-group'] = $value; + } + } + return $this; + } + + /** + * Returns the value set for max-results-group. + * + * @return int Returns max-results-group parameter. + */ + public function getMaxResultsGroup() + { + if (array_key_exists('max-results-group', $this->_params)) { + return $this->_params['max-results-group']; + } else { + return null; + } + } + + /** + * Setter for the max-results-group parameter. + * + * @param int $value Specifies the maximum number of records to be + * retrieved from each group. The limits that you specify with this + * parameter apply to all groups. Must be an integer value greater than + * zero. This parameter is only valid if grouped=true. + * @return Zend_Gdata_Health_Query Provides a fluent interface + */ + public function setMaxResultsInGroup($value) + { + if ($value !== null) { + if ($value <= 0 || $this->getGrouped() !== 'true') { + throw new Zend_Gdata_App_InvalidArgumentException( + 'The max-results-in-group parameter must be set to a value + greater than 0 and can only be used if grouped=true'); + } else { + $this->_params['max-results-in-group'] = $value; + } + } + return $this; + } + + /** + * Returns the value set for max-results-in-group. + * + * @return int Returns max-results-in-group parameter. + */ + public function getMaxResultsInGroup() + { + if (array_key_exists('max-results-in-group', $this->_params)) { + return $this->_params['max-results-in-group']; + } else { + return null; + } + } + + /** + * Setter for the start-index-group parameter. + * + * @param int $value Retrieves only items whose group ranking is at + * least start-index-group. This should be set to a 1-based index of the + * first group to be retrieved. The range is applied per category. + * This parameter is only valid if grouped=true. + * @return Zend_Gdata_Health_Query Provides a fluent interface + */ + public function setStartIndexGroup($value) + { + if ($value !== null && $this->getGrouped() !== 'true') { + throw new Zend_Gdata_App_InvalidArgumentException( + 'The start-index-group can only be used if grouped=true'); + } else { + $this->_params['start-index-group'] = $value; + } + return $this; + } + + /** + * Returns the value set for start-index-group. + * + * @return int Returns start-index-group parameter. + */ + public function getStartIndexGroup() + { + if (array_key_exists('start-index-group', $this->_params)) { + return $this->_params['start-index-group']; + } else { + return null; + } + } + + /** + * Setter for the start-index-in-group parameter. + * + * @param int $value A 1-based index of the records to be retrieved from + * each group. This parameter is only valid if grouped=true. + * @return Zend_Gdata_Health_Query Provides a fluent interface + */ + public function setStartIndexInGroup($value) + { + if ($value !== null && $this->getGrouped() !== 'true') { + throw new Zend_Gdata_App_InvalidArgumentException('start-index-in-group'); + } else { + $this->_params['start-index-in-group'] = $value; + } + return $this; + } + + /** + * Returns the value set for start-index-in-group. + * + * @return int Returns start-index-in-group parameter. + */ + public function getStartIndexInGroup() + { + if (array_key_exists('start-index-in-group', $this->_params)) { + return $this->_params['start-index-in-group']; + } else { + return null; + } + } +} diff --git a/lib/zend/Zend/Gdata/HttpAdapterStreamingProxy.php b/lib/zend/Zend/Gdata/HttpAdapterStreamingProxy.php new file mode 100644 index 0000000000..bf9cfd1f19 --- /dev/null +++ b/lib/zend/Zend/Gdata/HttpAdapterStreamingProxy.php @@ -0,0 +1,127 @@ +config['proxy_host']) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception('No proxy host set!'); + } + + // Make sure we're properly connected + if (! $this->socket) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Trying to write but we are not connected'); + } + + $host = $this->config['proxy_host']; + $port = $this->config['proxy_port']; + + if ($this->connected_to[0] != $host || $this->connected_to[1] != $port) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Trying to write but we are connected to the wrong proxy ' . + 'server'); + } + + // Add Proxy-Authorization header + if ($this->config['proxy_user'] && ! isset($headers['proxy-authorization'])) { + $headers['proxy-authorization'] = Zend_Http_Client::encodeAuthHeader( + $this->config['proxy_user'], $this->config['proxy_pass'], $this->config['proxy_auth'] + ); + } + + // if we are proxying HTTPS, preform CONNECT handshake with the proxy + if ($uri->getScheme() == 'https' && (! $this->negotiated)) { + $this->connectHandshake($uri->getHost(), $uri->getPort(), $http_ver, $headers); + $this->negotiated = true; + } + + // Save request method for later + $this->method = $method; + + // Build request headers + $request = "{$method} {$uri->__toString()} HTTP/{$http_ver}\r\n"; + + // Add all headers to the request string + foreach ($headers as $k => $v) { + if (is_string($k)) $v = "$k: $v"; + $request .= "$v\r\n"; + } + + $request .= "\r\n"; + + // Send the request headers + if (! @fwrite($this->socket, $request)) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Error writing request to proxy server'); + } + + //read from $body, write to socket + while ($body->hasData()) { + if (! @fwrite($this->socket, $body->read(self::CHUNK_SIZE))) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Error writing request to server'); + } + } + return 'Large upload, request is not cached.'; + } +} diff --git a/lib/zend/Zend/Gdata/HttpAdapterStreamingSocket.php b/lib/zend/Zend/Gdata/HttpAdapterStreamingSocket.php new file mode 100644 index 0000000000..49a506dcfc --- /dev/null +++ b/lib/zend/Zend/Gdata/HttpAdapterStreamingSocket.php @@ -0,0 +1,111 @@ +socket) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Trying to write but we are not connected'); + } + + $host = $uri->getHost(); + $host = (strtolower($uri->getScheme()) == 'https' ? $this->config['ssltransport'] : 'tcp') . '://' . $host; + if ($this->connected_to[0] != $host || $this->connected_to[1] != $uri->getPort()) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Trying to write but we are connected to the wrong host'); + } + + // Save request method for later + $this->method = $method; + + // Build request headers + $path = $uri->getPath(); + if ($uri->getQuery()) $path .= '?' . $uri->getQuery(); + $request = "{$method} {$path} HTTP/{$http_ver}\r\n"; + foreach ($headers as $k => $v) { + if (is_string($k)) $v = ucfirst($k) . ": $v"; + $request .= "$v\r\n"; + } + + // Send the headers over + $request .= "\r\n"; + if (! @fwrite($this->socket, $request)) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Error writing request to server'); + } + + + //read from $body, write to socket + $chunk = $body->read(self::CHUNK_SIZE); + while ($chunk !== FALSE) { + if (! @fwrite($this->socket, $chunk)) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Error writing request to server'); + } + $chunk = $body->read(self::CHUNK_SIZE); + } + $body->closeFileHandle(); + return 'Large upload, request is not cached.'; + } +} diff --git a/lib/zend/Zend/Gdata/HttpClient.php b/lib/zend/Zend/Gdata/HttpClient.php index bf5a76e912..4a850e1021 100644 --- a/lib/zend/Zend/Gdata/HttpClient.php +++ b/lib/zend/Zend/Gdata/HttpClient.php @@ -1,5 +1,4 @@ _authSubPrivateKeyId; } - + /** * Gets the AuthSub token used for authentication * @@ -146,7 +150,7 @@ class Zend_Gdata_HttpClient extends Zend_Http_Client /** * Sets the AuthSub token used for authentication * - * @param string $token The token + * @param string $token The token * @return Zend_Gdata_HttpClient Provides a fluent interface */ public function setAuthSubToken($token) { @@ -157,7 +161,7 @@ class Zend_Gdata_HttpClient extends Zend_Http_Client /** * Gets the ClientLogin token used for authentication * - * @return string The token + * @return string The token */ public function getClientLoginToken() { return $this->_clientLoginToken; @@ -166,7 +170,7 @@ class Zend_Gdata_HttpClient extends Zend_Http_Client /** * Sets the ClientLogin token used for authentication * - * @param string $token The token + * @param string $token The token * @return Zend_Gdata_HttpClient Provides a fluent interface */ public function setClientLoginToken($token) { @@ -187,12 +191,12 @@ class Zend_Gdata_HttpClient extends Zend_Http_Client * * @param string $method The HTTP method * @param string $url The URL - * @param array $headers An associate array of headers to be + * @param array $headers An associate array of headers to be * sent with the request or null * @param string $body The body of the request or null * @param string $contentType The MIME content type of the body or null * @throws Zend_Gdata_App_Exception if there was a signing failure - * @return array The processed values in an associative array, + * @return array The processed values in an associative array, * using the same names as the params */ public function filterHttpRequest($method, $url, $headers = array(), $body = null, $contentType = null) { @@ -206,7 +210,7 @@ class Zend_Gdata_HttpClient extends Zend_Http_Client // compute signature $pKeyId = $this->getAuthSubPrivateKeyId(); - $signSuccess = openssl_sign($dataToSign, $signature, $pKeyId, + $signSuccess = openssl_sign($dataToSign, $signature, $pKeyId, OPENSSL_ALGO_SHA1); if (!$signSuccess) { require_once 'Zend/Gdata/App/Exception.php'; @@ -242,4 +246,102 @@ class Zend_Gdata_HttpClient extends Zend_Http_Client return $response; } + /** + * Return the current connection adapter + * + * @return Zend_Http_Client_Adapter_Interface|string $adapter + */ + public function getAdapter() + { + return $this->adapter; + } + + /** + * Load the connection adapter + * + * @param Zend_Http_Client_Adapter_Interface $adapter + * @return void + */ + public function setAdapter($adapter) + { + if ($adapter == null) { + $this->adapter = $adapter; + } else { + parent::setAdapter($adapter); + } + } + + /** + * Set the streamingRequest variable which controls whether we are + * sending the raw (already encoded) POST data from a stream source. + * + * @param boolean $value The value to set. + * @return void + */ + public function setStreamingRequest($value) + { + $this->_streamingRequest = $value; + } + + /** + * Check whether the client is set to perform streaming requests. + * + * @return boolean True if yes, false otherwise. + */ + public function getStreamingRequest() + { + if ($this->_streamingRequest()) { + return true; + } else { + return false; + } + } + + /** + * Prepare the request body (for POST and PUT requests) + * + * @return string + * @throws Zend_Http_Client_Exception + */ + protected function _prepareBody() + { + if($this->_streamingRequest) { + $this->setHeaders(self::CONTENT_LENGTH, + $this->raw_post_data->getTotalSize()); + return $this->raw_post_data; + } + else { + return parent::_prepareBody(); + } + } + + /** + * Clear all custom parameters we set. + * + * @return Zend_Http_Client + */ + public function resetParameters() + { + $this->_streamingRequest = false; + + return parent::resetParameters(); + } + + /** + * Set the raw (already encoded) POST data from a stream source. + * + * This is used to support POSTing from open file handles without + * caching the entire body into memory. It is a wrapper around + * Zend_Http_Client::setRawData(). + * + * @param string $data The request data + * @param string $enctype The encoding type + * @return Zend_Http_Client + */ + public function setRawDataStream($data, $enctype = null) + { + $this->_streamingRequest = true; + return $this->setRawData($data, $enctype); + } + } diff --git a/lib/zend/Zend/Gdata/Kind/EventEntry.php b/lib/zend/Zend/Gdata/Kind/EventEntry.php new file mode 100644 index 0000000000..4b134e22f8 --- /dev/null +++ b/lib/zend/Zend/Gdata/Kind/EventEntry.php @@ -0,0 +1,428 @@ +_who != null) { + foreach ($this->_who as $who) { + $element->appendChild($who->getDOM($element->ownerDocument)); + } + } + if ($this->_when != null) { + foreach ($this->_when as $when) { + $element->appendChild($when->getDOM($element->ownerDocument)); + } + } + if ($this->_where != null) { + foreach ($this->_where as $where) { + $element->appendChild($where->getDOM($element->ownerDocument)); + } + } + if ($this->_recurrenceException != null) { + foreach ($this->_recurrenceException as $recurrenceException) { + $element->appendChild($recurrenceException->getDOM($element->ownerDocument)); + } + } + if ($this->_extendedProperty != null) { + foreach ($this->_extendedProperty as $extProp) { + $element->appendChild($extProp->getDOM($element->ownerDocument)); + } + } + + if ($this->_recurrence != null) { + $element->appendChild($this->_recurrence->getDOM($element->ownerDocument)); + } + if ($this->_eventStatus != null) { + $element->appendChild($this->_eventStatus->getDOM($element->ownerDocument)); + } + if ($this->_comments != null) { + $element->appendChild($this->_comments->getDOM($element->ownerDocument)); + } + if ($this->_transparency != null) { + $element->appendChild($this->_transparency->getDOM($element->ownerDocument)); + } + if ($this->_visibility != null) { + $element->appendChild($this->_visibility->getDOM($element->ownerDocument)); + } + if ($this->_originalEvent != null) { + $element->appendChild($this->_originalEvent->getDOM($element->ownerDocument)); + } + if ($this->_entryLink != null) { + $element->appendChild($this->_entryLink->getDOM($element->ownerDocument)); + } + + + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'where'; + $where = new Zend_Gdata_Extension_Where(); + $where->transferFromDOM($child); + $this->_where[] = $where; + break; + case $this->lookupNamespace('gd') . ':' . 'when'; + $when = new Zend_Gdata_Extension_When(); + $when->transferFromDOM($child); + $this->_when[] = $when; + break; + case $this->lookupNamespace('gd') . ':' . 'who'; + $who = new Zend_Gdata_Extension_Who(); + $who ->transferFromDOM($child); + $this->_who[] = $who; + break; + case $this->lookupNamespace('gd') . ':' . 'recurrence'; + $recurrence = new Zend_Gdata_Extension_Recurrence(); + $recurrence->transferFromDOM($child); + $this->_recurrence = $recurrence; + break; + case $this->lookupNamespace('gd') . ':' . 'eventStatus'; + $eventStatus = new Zend_Gdata_Extension_EventStatus(); + $eventStatus->transferFromDOM($child); + $this->_eventStatus = $eventStatus; + break; + case $this->lookupNamespace('gd') . ':' . 'comments'; + $comments = new Zend_Gdata_Extension_Comments(); + $comments->transferFromDOM($child); + $this->_comments = $comments; + break; + case $this->lookupNamespace('gd') . ':' . 'transparency'; + $transparency = new Zend_Gdata_Extension_Transparency(); + $transparency ->transferFromDOM($child); + $this->_transparency = $transparency; + break; + case $this->lookupNamespace('gd') . ':' . 'visibility'; + $visiblity = new Zend_Gdata_Extension_Visibility(); + $visiblity ->transferFromDOM($child); + $this->_visibility = $visiblity; + break; + case $this->lookupNamespace('gd') . ':' . 'recurrenceException'; + require_once 'Zend/Gdata/Extension/RecurrenceException.php'; + $recurrenceException = new Zend_Gdata_Extension_RecurrenceException(); + $recurrenceException ->transferFromDOM($child); + $this->_recurrenceException[] = $recurrenceException; + break; + case $this->lookupNamespace('gd') . ':' . 'originalEvent'; + $originalEvent = new Zend_Gdata_Extension_OriginalEvent(); + $originalEvent ->transferFromDOM($child); + $this->_originalEvent = $originalEvent; + break; + case $this->lookupNamespace('gd') . ':' . 'extendedProperty'; + $extProp = new Zend_Gdata_Extension_ExtendedProperty(); + $extProp->transferFromDOM($child); + $this->_extendedProperty[] = $extProp; + break; + case $this->lookupNamespace('gd') . ':' . 'entryLink': + $entryLink = new Zend_Gdata_Extension_EntryLink(); + $entryLink->transferFromDOM($child); + $this->_entryLink = $entryLink; + break; + + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getWhen() + { + return $this->_when; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setWhen($value) + { + $this->_when = $value; + return $this; + } + + public function getWhere() + { + return $this->_where; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setWhere($value) + { + $this->_where = $value; + return $this; + } + + public function getWho() + { + return $this->_who; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setWho($value) + { + $this->_who = $value; + return $this; + } + + public function getRecurrence() + { + return $this->_recurrence; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setRecurrence($value) + { + $this->_recurrence = $value; + return $this; + } + + public function getEventStatus() + { + return $this->_eventStatus; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setEventStatus($value) + { + $this->_eventStatus = $value; + return $this; + } + + public function getComments() + { + return $this->_comments; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setComments($value) + { + $this->_comments = $value; + return $this; + } + + public function getTransparency() + { + return $this->_transparency; + } + + /** + * @param Zend_Gdata_Transparency $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setTransparency($value) + { + $this->_transparency = $value; + return $this; + } + + public function getVisibility() + { + return $this->_visibility; + } + + /** + * @param Zend_Gdata_Visibility $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + public function getRecurrenceExcption() + { + return $this->_recurrenceException; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setRecurrenceException($value) + { + $this->_recurrenceException = $value; + return $this; + } + + public function getExtendedProperty() + { + return $this->_extendedProperty; + } + + /** + * @param array $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setExtendedProperty($value) + { + $this->_extendedProperty = $value; + return $this; + } + + public function getOriginalEvent() + { + return $this->_originalEvent; + } + + /** + * @param Zend_Gdata_Extension_OriginalEvent $value + * @return Zend_Gdata_Kind_EventEntry Provides a fluent interface + */ + public function setOriginalEvent($value) + { + $this->_originalEvent = $value; + return $this; + } + + /** + * Get this entry's EntryLink element. + * + * @return Zend_Gdata_Extension_EntryLink The requested entry. + */ + public function getEntryLink() + { + return $this->_entryLink; + } + + /** + * Set the child's EntryLink element. + * + * @param Zend_Gdata_Extension_EntryLink $value The desired value for this attribute. + * @return Zend_Gdata_Extension_Who The element being modified. + */ + public function setEntryLink($value) + { + $this->_entryLink = $value; + return $this; + } + + +} diff --git a/lib/zend/Zend/Gdata/Media.php b/lib/zend/Zend/Gdata/Media.php new file mode 100755 index 0000000000..ba716be630 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media.php @@ -0,0 +1,65 @@ +registerPackage('Zend_Gdata_Media'); + $this->registerPackage('Zend_Gdata_Media_Extension'); + parent::__construct($client, $applicationId); + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Entry.php b/lib/zend/Zend/Gdata/Media/Entry.php new file mode 100755 index 0000000000..5dddb78262 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Entry.php @@ -0,0 +1,134 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_mediaGroup != null) { + $element->appendChild($this->_mediaGroup->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('media') . ':' . 'group': + $mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup(); + $mediaGroup->transferFromDOM($child); + $this->_mediaGroup = $mediaGroup; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Returns the entry's mediaGroup object. + * + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function getMediaGroup() + { + return $this->_mediaGroup; + } + + /** + * Sets the entry's mediaGroup object. + * + * @param Zend_Gdata_Media_Extension_MediaGroup $mediaGroup + * @return Zend_Gdata_Media_Entry Provides a fluent interface + */ + public function setMediaGroup($mediaGroup) + { + $this->_mediaGroup = $mediaGroup; + return $this; + } + + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaCategory.php b/lib/zend/Zend/Gdata/Media/Extension/MediaCategory.php new file mode 100755 index 0000000000..829695728a --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaCategory.php @@ -0,0 +1,148 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_text = $text; + $this->_scheme = $scheme; + $this->_label = $label; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_scheme !== null) { + $element->setAttribute('scheme', $this->_scheme); + } + if ($this->_label !== null) { + $element->setAttribute('label', $this->_label); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'scheme': + $this->_scheme = $attribute->nodeValue; + break; + case 'label': + $this->_label = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the URI that identifies the categorization scheme + * Optional. + * + * @return string URI that identifies the categorization scheme + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * @param string $value URI that identifies the categorization scheme + * @return Zend_Gdata_Media_Extension_MediaCategory Provides a fluent interface + */ + public function setScheme($value) + { + $this->_scheme = $value; + return $this; + } + + /** + * @return string Human-readable label to be displayed in applications + */ + public function getLabel() + { + return $this->_label; + } + + /** + * @param string $value Human-readable label to be displayed in applications + * @return Zend_Gdata_Media_Extension_MediaCategory Provides a fluent interface + */ + public function setLabel($value) + { + $this->_label = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaContent.php b/lib/zend/Zend/Gdata/Media/Extension/MediaContent.php new file mode 100755 index 0000000000..c332dfeb0b --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaContent.php @@ -0,0 +1,522 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_url = $url; + $this->_fileSize = $fileSize; + $this->_type = $type; + $this->_medium = $medium; + $this->_isDefault = $isDefault; + $this->_expression = $expression; + $this->_bitrate = $bitrate; + $this->_framerate = $framerate; + $this->_samplingrate = $samplingrate; + $this->_channels = $channels; + $this->_duration = $duration; + $this->_height = $height; + $this->_width = $width; + $this->_lang = $lang; + } + + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_url !== null) { + $element->setAttribute('url', $this->_url); + } + if ($this->_fileSize !== null) { + $element->setAttribute('fileSize', $this->_fileSize); + } + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + if ($this->_medium !== null) { + $element->setAttribute('medium', $this->_medium); + } + if ($this->_isDefault !== null) { + $element->setAttribute('isDefault', $this->_isDefault); + } + if ($this->_expression !== null) { + $element->setAttribute('expression', $this->_expression); + } + if ($this->_bitrate !== null) { + $element->setAttribute('bitrate', $this->_bitrate); + } + if ($this->_framerate !== null) { + $element->setAttribute('framerate', $this->_framerate); + } + if ($this->_samplingrate !== null) { + $element->setAttribute('samplingrate', $this->_samplingrate); + } + if ($this->_channels !== null) { + $element->setAttribute('channels', $this->_channels); + } + if ($this->_duration !== null) { + $element->setAttribute('duration', $this->_duration); + } + if ($this->_height !== null) { + $element->setAttribute('height', $this->_height); + } + if ($this->_width !== null) { + $element->setAttribute('width', $this->_width); + } + if ($this->_lang !== null) { + $element->setAttribute('lang', $this->_lang); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'url': + $this->_url = $attribute->nodeValue; + break; + case 'fileSize': + $this->_fileSize = $attribute->nodeValue; + break; + case 'type': + $this->_type = $attribute->nodeValue; + break; + case 'medium': + $this->_medium = $attribute->nodeValue; + break; + case 'isDefault': + $this->_isDefault = $attribute->nodeValue; + break; + case 'expression': + $this->_expression = $attribute->nodeValue; + break; + case 'bitrate': + $this->_bitrate = $attribute->nodeValue; + break; + case 'framerate': + $this->_framerate = $attribute->nodeValue; + break; + case 'samplingrate': + $this->_samplingrate = $attribute->nodeValue; + break; + case 'channels': + $this->_channels = $attribute->nodeValue; + break; + case 'duration': + $this->_duration = $attribute->nodeValue; + break; + case 'height': + $this->_height = $attribute->nodeValue; + break; + case 'width': + $this->_width = $attribute->nodeValue; + break; + case 'lang': + $this->_lang = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the URL representing this MediaContent object + * + * @return string The URL representing this MediaContent object. + */ + public function __toString() + { + return $this->getUrl(); + } + + /** + * @return string The direct URL to the media object + */ + public function getUrl() + { + return $this->_url; + } + + /** + * @param string $value The direct URL to the media object + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setUrl($value) + { + $this->_url = $value; + return $this; + } + + /** + * @return int The size of the media in bytes + */ + public function getFileSize() + { + return $this->_fileSize; + } + + /** + * @param int $value + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setFileSize($value) + { + $this->_fileSize = $value; + return $this; + } + + /** + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + + /** + * @return string + */ + public function getMedium() + { + return $this->_medium; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setMedium($value) + { + $this->_medium = $value; + return $this; + } + + /** + * @return bool + */ + public function getIsDefault() + { + return $this->_isDefault; + } + + /** + * @param bool $value + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setIsDefault($value) + { + $this->_isDefault = $value; + return $this; + } + + /** + * @return string + */ + public function getExpression() + { + return $this->_expression; + } + + /** + * @param string + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setExpression($value) + { + $this->_expression = $value; + return $this; + } + + /** + * @return int + */ + public function getBitrate() + { + return $this->_bitrate; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setBitrate($value) + { + $this->_bitrate = $value; + return $this; + } + + /** + * @return int + */ + public function getFramerate() + { + return $this->_framerate; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setFramerate($value) + { + $this->_framerate = $value; + return $this; + } + + /** + * @return int + */ + public function getSamplingrate() + { + return $this->_samplingrate; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setSamplingrate($value) + { + $this->_samplingrate = $value; + return $this; + } + + /** + * @return int + */ + public function getChannels() + { + return $this->_channels; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setChannels($value) + { + $this->_channels = $value; + return $this; + } + + /** + * @return int + */ + public function getDuration() + { + return $this->_duration; + } + + /** + * + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setDuration($value) + { + $this->_duration = $value; + return $this; + } + + /** + * @return int + */ + public function getHeight() + { + return $this->_height; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setHeight($value) + { + $this->_height = $value; + return $this; + } + + /** + * @return int + */ + public function getWidth() + { + return $this->_width; + } + + /** + * @param int + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setWidth($value) + { + $this->_width = $value; + return $this; + } + + /** + * @return string + */ + public function getLang() + { + return $this->_lang; + } + + /** + * @param string + * @return Zend_Gdata_Media_Extension_MediaContent Provides a fluent interface + */ + public function setLang($value) + { + $this->_lang = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaCopyright.php b/lib/zend/Zend/Gdata/Media/Extension/MediaCopyright.php new file mode 100755 index 0000000000..02da2bbe61 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaCopyright.php @@ -0,0 +1,116 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_text = $text; + $this->_url = $url; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_url !== null) { + $element->setAttribute('url', $this->_url); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'url': + $this->_url = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaCopyright Provides a fluent interface + */ + public function setUrl($value) + { + $this->_url = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaCredit.php b/lib/zend/Zend/Gdata/Media/Extension/MediaCredit.php new file mode 100755 index 0000000000..3058dd6c74 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaCredit.php @@ -0,0 +1,149 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_text = $text; + $this->_role = $role; + $this->_scheme = $scheme; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_role !== null) { + $element->setAttribute('role', $this->_role); + } + if ($this->_scheme !== null) { + $element->setAttribute('scheme', $this->_scheme); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'role': + $this->_role = $attribute->nodeValue; + break; + case 'scheme': + $this->_scheme = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getRole() + { + return $this->_role; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaCredit Provides a fluent interface + */ + public function setRole($value) + { + $this->_role = $value; + return $this; + } + + /** + * @return string + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaCredit Provides a fluent interface + */ + public function setScheme($value) + { + $this->_scheme = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaDescription.php b/lib/zend/Zend/Gdata/Media/Extension/MediaDescription.php new file mode 100755 index 0000000000..a3ba35a9f9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaDescription.php @@ -0,0 +1,116 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_type = $type; + $this->_text = $text; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'type': + $this->_type = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaDescription Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaGroup.php b/lib/zend/Zend/Gdata/Media/Extension/MediaGroup.php new file mode 100755 index 0000000000..1dda30d275 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaGroup.php @@ -0,0 +1,566 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + foreach ($this->_content as $content) { + $element->appendChild($content->getDOM($element->ownerDocument)); + } + foreach ($this->_category as $category) { + $element->appendChild($category->getDOM($element->ownerDocument)); + } + foreach ($this->_credit as $credit) { + $element->appendChild($credit->getDOM($element->ownerDocument)); + } + foreach ($this->_player as $player) { + $element->appendChild($player->getDOM($element->ownerDocument)); + } + foreach ($this->_rating as $rating) { + $element->appendChild($rating->getDOM($element->ownerDocument)); + } + foreach ($this->_restriction as $restriction) { + $element->appendChild($restriction->getDOM($element->ownerDocument)); + } + foreach ($this->_mediaText as $text) { + $element->appendChild($text->getDOM($element->ownerDocument)); + } + foreach ($this->_thumbnail as $thumbnail) { + $element->appendChild($thumbnail->getDOM($element->ownerDocument)); + } + if ($this->_copyright != null) { + $element->appendChild( + $this->_copyright->getDOM($element->ownerDocument)); + } + if ($this->_description != null) { + $element->appendChild( + $this->_description->getDOM($element->ownerDocument)); + } + foreach ($this->_hash as $hash) { + $element->appendChild($hash->getDOM($element->ownerDocument)); + } + if ($this->_keywords != null) { + $element->appendChild( + $this->_keywords->getDOM($element->ownerDocument)); + } + if ($this->_title != null) { + $element->appendChild( + $this->_title->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('media') . ':' . 'content'; + $content = new Zend_Gdata_Media_Extension_MediaContent(); + $content->transferFromDOM($child); + $this->_content[] = $content; + break; + case $this->lookupNamespace('media') . ':' . 'category'; + $category = new Zend_Gdata_Media_Extension_MediaCategory(); + $category->transferFromDOM($child); + $this->_category[] = $category; + break; + case $this->lookupNamespace('media') . ':' . 'copyright'; + $copyright = new Zend_Gdata_Media_Extension_MediaCopyright(); + $copyright->transferFromDOM($child); + $this->_copyright = $copyright; + break; + case $this->lookupNamespace('media') . ':' . 'credit'; + $credit = new Zend_Gdata_Media_Extension_MediaCredit(); + $credit->transferFromDOM($child); + $this->_credit[] = $credit; + break; + case $this->lookupNamespace('media') . ':' . 'description'; + $description = new Zend_Gdata_Media_Extension_MediaDescription(); + $description->transferFromDOM($child); + $this->_description = $description; + break; + case $this->lookupNamespace('media') . ':' . 'hash'; + $hash = new Zend_Gdata_Media_Extension_MediaHash(); + $hash->transferFromDOM($child); + $this->_hash[] = $hash; + break; + case $this->lookupNamespace('media') . ':' . 'keywords'; + $keywords = new Zend_Gdata_Media_Extension_MediaKeywords(); + $keywords->transferFromDOM($child); + $this->_keywords = $keywords; + break; + case $this->lookupNamespace('media') . ':' . 'player'; + $player = new Zend_Gdata_Media_Extension_MediaPlayer(); + $player->transferFromDOM($child); + $this->_player[] = $player; + break; + case $this->lookupNamespace('media') . ':' . 'rating'; + $rating = new Zend_Gdata_Media_Extension_MediaRating(); + $rating->transferFromDOM($child); + $this->_rating[] = $rating; + break; + case $this->lookupNamespace('media') . ':' . 'restriction'; + $restriction = new Zend_Gdata_Media_Extension_MediaRestriction(); + $restriction->transferFromDOM($child); + $this->_restriction[] = $restriction; + break; + case $this->lookupNamespace('media') . ':' . 'text'; + $text = new Zend_Gdata_Media_Extension_MediaText(); + $text->transferFromDOM($child); + $this->_mediaText[] = $text; + break; + case $this->lookupNamespace('media') . ':' . 'thumbnail'; + $thumbnail = new Zend_Gdata_Media_Extension_MediaThumbnail(); + $thumbnail->transferFromDOM($child); + $this->_thumbnail[] = $thumbnail; + break; + case $this->lookupNamespace('media') . ':' . 'title'; + $title = new Zend_Gdata_Media_Extension_MediaTitle(); + $title->transferFromDOM($child); + $this->_title = $title; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * @return array + */ + public function getContent() + { + return $this->_content; + } + + /** + * @param array $value + * @return Zend_Gdata_Media_MediaGroup Provides a fluent interface + */ + public function setContent($value) + { + $this->_content = $value; + return $this; + } + + /** + * @return array + */ + public function getCategory() + { + return $this->_category; + } + + /** + * @param array $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setCategory($value) + { + $this->_category = $value; + return $this; + } + + /** + * @return Zend_Gdata_Media_Extension_MediaCopyright + */ + public function getCopyright() + { + return $this->_copyright; + } + + /** + * @param Zend_Gdata_Media_Extension_MediaCopyright $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setCopyright($value) + { + $this->_copyright = $value; + return $this; + } + + /** + * @return array + */ + public function getCredit() + { + return $this->_credit; + } + + /** + * @param array $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setCredit($value) + { + $this->_credit = $value; + return $this; + } + + /** + * @return Zend_Gdata_Media_Extension_MediaTitle + */ + public function getTitle() + { + return $this->_title; + } + + /** + * @param Zend_Gdata_Media_Extension_MediaTitle $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setTitle($value) + { + $this->_title = $value; + return $this; + } + + /** + * @return Zend_Gdata_Media_Extension_MediaDescription + */ + public function getDescription() + { + return $this->_description; + } + + /** + * @param Zend_Gdata_Media_Extension_MediaDescription $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setDescription($value) + { + $this->_description = $value; + return $this; + } + + /** + * @return array + */ + public function getHash() + { + return $this->_hash; + } + + /** + * @param array $value + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setHash($value) + { + $this->_hash = $value; + return $this; + } + + /** + * @return Zend_Gdata_Media_Extension_MediaKeywords + */ + public function getKeywords() + { + return $this->_keywords; + } + + /** + * @param array $value + * @return Zend_Gdata_Media_Extension_MediaGroup Provides a fluent interface + */ + public function setKeywords($value) + { + $this->_keywords = $value; + return $this; + } + + /** + * @return array + */ + public function getPlayer() + { + return $this->_player; + } + + /** + * @param array + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setPlayer($value) + { + $this->_player = $value; + return $this; + } + + /** + * @return array + */ + public function getRating() + { + return $this->_rating; + } + + /** + * @param array + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setRating($value) + { + $this->_rating = $value; + return $this; + } + + /** + * @return array + */ + public function getRestriction() + { + return $this->_restriction; + } + + /** + * @param array + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setRestriction($value) + { + $this->_restriction = $value; + return $this; + } + + /** + * @return array + */ + public function getThumbnail() + { + return $this->_thumbnail; + } + + /** + * @param array + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setThumbnail($value) + { + $this->_thumbnail = $value; + return $this; + } + + /** + * @return array + */ + public function getMediaText() + { + return $this->_mediaText; + } + + /** + * @param array + * @return Zend_Gdata_Media_Extension_MediaGroup + */ + public function setMediaText($value) + { + $this->_mediaText = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaHash.php b/lib/zend/Zend/Gdata/Media/Extension/MediaHash.php new file mode 100755 index 0000000000..f41de8f7f9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaHash.php @@ -0,0 +1,115 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_text = $text; + $this->_algo = $algo; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_algo !== null) { + $element->setAttribute('algo', $this->_algo); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + * @throws Zend_Gdata_App_InvalidArgumentException + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'algo': + $this->_algo = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string The algo + */ + public function getAlgo() + { + return $this->_algo; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaHash Provides a fluent interface + */ + public function setAlgo($value) + { + $this->_algo = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaKeywords.php b/lib/zend/Zend/Gdata/Media/Extension/MediaKeywords.php new file mode 100755 index 0000000000..b481a58008 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaKeywords.php @@ -0,0 +1,52 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaPlayer.php b/lib/zend/Zend/Gdata/Media/Extension/MediaPlayer.php new file mode 100755 index 0000000000..b84013b312 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaPlayer.php @@ -0,0 +1,178 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_url = $url; + $this->_width = $width; + $this->_height = $height; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_url !== null) { + $element->setAttribute('url', $this->_url); + } + if ($this->_width !== null) { + $element->setAttribute('width', $this->_width); + } + if ($this->_height !== null) { + $element->setAttribute('height', $this->_height); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'url': + $this->_url = $attribute->nodeValue; + break; + case 'width': + $this->_width = $attribute->nodeValue; + break; + case 'height': + $this->_height = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaPlayer Provides a fluent interface + */ + public function setUrl($value) + { + $this->_url = $value; + return $this; + } + + /** + * @return int + */ + public function getWidth() + { + return $this->_width; + } + + /** + * @param int $value + * @return Zend_Gdata_Media_Extension_MediaPlayer Provides a fluent interface + */ + public function setWidth($value) + { + $this->_width = $value; + return $this; + } + + /** + * @return int + */ + public function getHeight() + { + return $this->_height; + } + + /** + * @param int $value + * @return Zend_Gdata_Media_Extension_MediaPlayer Provides a fluent interface + */ + public function setHeight($value) + { + $this->_height = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaRating.php b/lib/zend/Zend/Gdata/Media/Extension/MediaRating.php new file mode 100755 index 0000000000..3e986a2771 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaRating.php @@ -0,0 +1,118 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_scheme = $scheme; + $this->_text = $text; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_scheme !== null) { + $element->setAttribute('scheme', $this->_scheme); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'scheme': + $this->_scheme = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaRating Provides a fluent interface + */ + public function setScheme($value) + { + $this->_scheme = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaRestriction.php b/lib/zend/Zend/Gdata/Media/Extension/MediaRestriction.php new file mode 100755 index 0000000000..6756dc789c --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaRestriction.php @@ -0,0 +1,149 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_text = $text; + $this->_relationship = $relationship; + $this->_type = $type; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_relationship !== null) { + $element->setAttribute('relationship', $this->_relationship); + } + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'relationship': + $this->_relationship = $attribute->nodeValue; + break; + case 'type': + $this->_type = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getRelationship() + { + return $this->_relationship; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaRestriction Provides a fluent interface + */ + public function setRelationship($value) + { + $this->_relationship = $value; + return $this; + } + + /** + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaRestriction Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaText.php b/lib/zend/Zend/Gdata/Media/Extension/MediaText.php new file mode 100755 index 0000000000..4a5eb009fd --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaText.php @@ -0,0 +1,211 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_text = $text; + $this->_type = $type; + $this->_lang = $lang; + $this->_start = $start; + $this->_end = $end; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + if ($this->_lang !== null) { + $element->setAttribute('lang', $this->_lang); + } + if ($this->_start !== null) { + $element->setAttribute('start', $this->_start); + } + if ($this->_end !== null) { + $element->setAttribute('end', $this->_end); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'type': + $this->_type = $attribute->nodeValue; + break; + case 'lang': + $this->_lang = $attribute->nodeValue; + break; + case 'start': + $this->_start = $attribute->nodeValue; + break; + case 'end': + $this->_end = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaText Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + + /** + * @return string + */ + public function getLang() + { + return $this->_lang; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaText Provides a fluent interface + */ + public function setLang($value) + { + $this->_lang = $value; + return $this; + } + + /** + * @return string + */ + public function getStart() + { + return $this->_start; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaText Provides a fluent interface + */ + public function setStart($value) + { + $this->_start = $value; + return $this; + } + + /** + * @return string + */ + public function getEnd() + { + return $this->_end; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaText Provides a fluent interface + */ + public function setEnd($value) + { + $this->_end = $value; + return $this; + } +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaThumbnail.php b/lib/zend/Zend/Gdata/Media/Extension/MediaThumbnail.php new file mode 100755 index 0000000000..a608162049 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaThumbnail.php @@ -0,0 +1,210 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_url = $url; + $this->_width = $width; + $this->_height = $height; + $this->_time = $time ; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_url !== null) { + $element->setAttribute('url', $this->_url); + } + if ($this->_width !== null) { + $element->setAttribute('width', $this->_width); + } + if ($this->_height !== null) { + $element->setAttribute('height', $this->_height); + } + if ($this->_time !== null) { + $element->setAttribute('time', $this->_time); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'url': + $this->_url = $attribute->nodeValue; + break; + case 'width': + $this->_width = $attribute->nodeValue; + break; + case 'height': + $this->_height = $attribute->nodeValue; + break; + case 'time': + $this->_time = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaThumbnail Provides a fluent interface + */ + public function setUrl($value) + { + $this->_url = $value; + return $this; + } + + /** + * @return int + */ + public function getWidth() + { + return $this->_width; + } + + /** + * @param int $value + * @return Zend_Gdata_Media_Extension_MediaThumbnail Provides a fluent interface + */ + public function setWidth($value) + { + $this->_width = $value; + return $this; + } + + /** + * @return int + */ + public function getHeight() + { + return $this->_height; + } + + /** + * @param int $value + * @return Zend_Gdata_Media_Extension_MediaThumbnail Provides a fluent interface + */ + public function setHeight($value) + { + $this->_height = $value; + return $this; + } + + /** + * @return string + */ + public function getTime() + { + return $this->_time; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaThumbnail Provides a fluent interface + */ + public function setTime($value) + { + $this->_time = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Extension/MediaTitle.php b/lib/zend/Zend/Gdata/Media/Extension/MediaTitle.php new file mode 100755 index 0000000000..ecd9b75e09 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Extension/MediaTitle.php @@ -0,0 +1,118 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_type = $type; + $this->_text = $text; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_type !== null) { + $element->setAttribute('type', $this->_type); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'type': + $this->_type = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaTitle Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Media/Feed.php b/lib/zend/Zend/Gdata/Media/Feed.php new file mode 100755 index 0000000000..a554b6fe33 --- /dev/null +++ b/lib/zend/Zend/Gdata/Media/Feed.php @@ -0,0 +1,70 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/MediaMimeStream.php b/lib/zend/Zend/Gdata/MediaMimeStream.php new file mode 100644 index 0000000000..5d25d03840 --- /dev/null +++ b/lib/zend/Zend/Gdata/MediaMimeStream.php @@ -0,0 +1,190 @@ + 1. + */ + public function __construct($xmlString = null, $filePath = null, + $fileContentType = null) + { + if (!file_exists($filePath) || !is_readable($filePath)) { + require_once 'Zend/Gdata/App/IOException.php'; + throw new Zend_Gdata_App_IOException('File to be uploaded at ' . + $filePath . ' does not exist or is not readable.'); + } + + $this->_fileHandle = fopen($filePath, 'rb', TRUE); + $this->_boundaryString = '=_' . md5(microtime(1) . rand(1,20)); + $entry = $this->wrapEntry($xmlString, $fileContentType); + $closingBoundary = new Zend_Gdata_MimeBodyString("\r\n--{$this->_boundaryString}--\r\n"); + $file = new Zend_Gdata_MimeFile($this->_fileHandle); + $this->_parts = array($entry, $file, $closingBoundary); + + $fileSize = filesize($filePath); + $this->_totalSize = $entry->getSize() + $fileSize + + $closingBoundary->getSize(); + + } + + /** + * Sandwiches the entry body into a MIME message + * + * @return void + */ + private function wrapEntry($entry, $fileMimeType) + { + $wrappedEntry = "--{$this->_boundaryString}\r\n"; + $wrappedEntry .= "Content-Type: application/atom+xml\r\n\r\n"; + $wrappedEntry .= $entry; + $wrappedEntry .= "\r\n--{$this->_boundaryString}\r\n"; + $wrappedEntry .= "Content-Type: $fileMimeType\r\n\r\n"; + return new Zend_Gdata_MimeBodyString($wrappedEntry); + } + + /** + * Read a specific chunk of the the MIME multipart message. + * + * @param integer $bufferSize The size of the chunk that is to be read, + * must be lower than MAX_BUFFER_SIZE. + * @return string A corresponding piece of the message. This could be + * binary or regular text. + */ + public function read($bytesRequested) + { + if($this->_currentPart >= count($this->_parts)) { + return FALSE; + } + + $activePart = $this->_parts[$this->_currentPart]; + $buffer = $activePart->read($bytesRequested); + + while(strlen($buffer) < $bytesRequested) { + $this->_currentPart += 1; + $nextBuffer = $this->read($bytesRequested - strlen($buffer)); + if($nextBuffer === FALSE) { + break; + } + $buffer .= $nextBuffer; + } + + return $buffer; + } + + /** + * Return the total size of the mime message. + * + * @return integer Total size of the message to be sent. + */ + public function getTotalSize() + { + return $this->_totalSize; + } + + /** + * Close the internal file that we are streaming to the socket. + * + * @return void + */ + public function closeFileHandle() + { + if ($this->_fileHandle !== null) { + fclose($this->_fileHandle); + } + } + + /** + * Return a Content-type header that includes the current boundary string. + * + * @return string A valid HTTP Content-Type header. + */ + public function getContentType() + { + return 'multipart/related;boundary="' . + $this->_boundaryString . '"' . "\r\n"; + } + +} diff --git a/lib/zend/Zend/Gdata/MimeBodyString.php b/lib/zend/Zend/Gdata/MimeBodyString.php new file mode 100644 index 0000000000..373882356c --- /dev/null +++ b/lib/zend/Zend/Gdata/MimeBodyString.php @@ -0,0 +1,92 @@ +_sourceString = $sourceString; + $this->_bytesRead = 0; + } + + /** + * Read the next chunk of the string. + * + * @param integer $bytesRequested The size of the chunk that is to be read. + * @return string A corresponding piece of the string. + */ + public function read($bytesRequested) + { + $len = strlen($this->_sourceString); + if($this->_bytesRead == $len) { + return FALSE; + } else if($bytesRequested > $len - $this->_bytesRead) { + $bytesRequested = $len - $this->_bytesRead; + } + + $buffer = substr($this->_sourceString, $this->_bytesRead, $bytesRequested); + $this->_bytesRead += $bytesRequested; + + return $buffer; + } + + /** + * The length of the string. + * + * @return int The length of the string contained in the object. + */ + public function getSize() + { + return strlen($this->_sourceString); + } + + +} diff --git a/lib/zend/Zend/Gdata/MimeFile.php b/lib/zend/Zend/Gdata/MimeFile.php new file mode 100644 index 0000000000..381faacc50 --- /dev/null +++ b/lib/zend/Zend/Gdata/MimeFile.php @@ -0,0 +1,66 @@ +_fileHandle = $fileHandle; + } + + /** + * Read the next chunk of the file. + * + * @param integer $bytesRequested The size of the chunk that is to be read. + * @return string A corresponding piece of the message. This could be + * binary or regular text. + */ + public function read($bytesRequested) + { + return fread($this->_fileHandle, $bytesRequested); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos.php b/lib/zend/Zend/Gdata/Photos.php new file mode 100755 index 0000000000..6c5cbe552f --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos.php @@ -0,0 +1,576 @@ +registerPackage('Zend_Gdata_Photos'); + $this->registerPackage('Zend_Gdata_Photos_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + } + + /** + * Retrieve a UserFeed containing AlbumEntries, PhotoEntries and + * TagEntries associated with a given user. + * + * @param string $userName The userName of interest + * @param mixed $location (optional) The location for the feed, as a URL + * or Query. If not provided, a default URL will be used instead. + * @return Zend_Gdata_Photos_UserFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getUserFeed($userName = null, $location = null) + { + if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('feed'); + if ($userName !== null) { + $location->setUser($userName); + } + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + if ($userName !== null) { + $location->setUser($userName); + } + $uri = $location->getQueryUrl(); + } else if ($location !== null) { + $uri = $location; + } else if ($userName !== null) { + $uri = self::PICASA_BASE_FEED_URI . '/' . + self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' . + $userName; + } else { + $uri = self::PICASA_BASE_FEED_URI . '/' . + self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' . + self::DEFAULT_USER; + } + + return parent::getFeed($uri, 'Zend_Gdata_Photos_UserFeed'); + } + + /** + * Retreive AlbumFeed object containing multiple PhotoEntry or TagEntry + * objects. + * + * @param mixed $location (optional) The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_AlbumFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getAlbumFeed($location = null) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('feed'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Photos_AlbumFeed'); + } + + /** + * Retreive PhotoFeed object containing comments and tags associated + * with a given photo. + * + * @param mixed $location (optional) The location for the feed, as a URL + * or Query. If not specified, the community search feed will + * be returned instead. + * @return Zend_Gdata_Photos_PhotoFeed + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getPhotoFeed($location = null) + { + if ($location === null) { + $uri = self::PICASA_BASE_FEED_URI . '/' . + self::DEFAULT_PROJECTION . '/' . + self::COMMUNITY_SEARCH_PATH; + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('feed'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Photos_PhotoFeed'); + } + + /** + * Retreive a single UserEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_UserEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getUserEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('entry'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Photos_UserEntry'); + } + + /** + * Retreive a single AlbumEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_AlbumEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getAlbumEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('entry'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Photos_AlbumEntry'); + } + + /** + * Retreive a single PhotoEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_PhotoEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getPhotoEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('entry'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Photos_PhotoEntry'); + } + + /** + * Retreive a single TagEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_TagEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getTagEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('entry'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Photos_TagEntry'); + } + + /** + * Retreive a single CommentEntry object. + * + * @param mixed $location The location for the feed, as a URL or Query. + * @return Zend_Gdata_Photos_CommentEntry + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function getCommentEntry($location) + { + if ($location === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Location must not be null'); + } else if ($location instanceof Zend_Gdata_Photos_UserQuery) { + $location->setType('entry'); + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_Photos_CommentEntry'); + } + + /** + * Create a new album from a AlbumEntry. + * + * @param Zend_Gdata_Photos_AlbumEntry $album The album entry to + * insert. + * @param string $url (optional) The URI that the album should be + * uploaded to. If null, the default album creation URI for + * this domain will be used. + * @return Zend_Gdata_Photos_AlbumEntry The inserted album entry as + * returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function insertAlbumEntry($album, $uri = null) + { + if ($uri === null) { + $uri = self::PICASA_BASE_FEED_URI . '/' . + self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' . + self::DEFAULT_USER; + } + $newEntry = $this->insertEntry($album, $uri, 'Zend_Gdata_Photos_AlbumEntry'); + return $newEntry; + } + + /** + * Create a new photo from a PhotoEntry. + * + * @param Zend_Gdata_Photos_PhotoEntry $photo The photo to insert. + * @param string $url The URI that the photo should be uploaded + * to. Alternatively, an AlbumEntry can be provided and the + * photo will be added to that album. + * @return Zend_Gdata_Photos_PhotoEntry The inserted photo entry + * as returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function insertPhotoEntry($photo, $uri = null) + { + if ($uri instanceof Zend_Gdata_Photos_AlbumEntry) { + $uri = $uri->getLink(self::FEED_LINK_PATH)->href; + } + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'URI must not be null'); + } + $newEntry = $this->insertEntry($photo, $uri, 'Zend_Gdata_Photos_PhotoEntry'); + return $newEntry; + } + + /** + * Create a new tag from a TagEntry. + * + * @param Zend_Gdata_Photos_TagEntry $tag The tag entry to insert. + * @param string $url The URI where the tag should be + * uploaded to. Alternatively, a PhotoEntry can be provided and + * the tag will be added to that photo. + * @return Zend_Gdata_Photos_TagEntry The inserted tag entry as returned + * by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function insertTagEntry($tag, $uri = null) + { + if ($uri instanceof Zend_Gdata_Photos_PhotoEntry) { + $uri = $uri->getLink(self::FEED_LINK_PATH)->href; + } + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'URI must not be null'); + } + $newEntry = $this->insertEntry($tag, $uri, 'Zend_Gdata_Photos_TagEntry'); + return $newEntry; + } + + /** + * Create a new comment from a CommentEntry. + * + * @param Zend_Gdata_Photos_CommentEntry $comment The comment entry to + * insert. + * @param string $url The URI where the comment should be uploaded to. + * Alternatively, a PhotoEntry can be provided and + * the comment will be added to that photo. + * @return Zend_Gdata_Photos_CommentEntry The inserted comment entry + * as returned by the server. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function insertCommentEntry($comment, $uri = null) + { + if ($uri instanceof Zend_Gdata_Photos_PhotoEntry) { + $uri = $uri->getLink(self::FEED_LINK_PATH)->href; + } + if ($uri === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'URI must not be null'); + } + $newEntry = $this->insertEntry($comment, $uri, 'Zend_Gdata_Photos_CommentEntry'); + return $newEntry; + } + + /** + * Delete an AlbumEntry. + * + * @param Zend_Gdata_Photos_AlbumEntry $album The album entry to + * delete. + * @param boolean $catch Whether to catch an exception when + * modified and re-delete or throw + * @return void. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function deleteAlbumEntry($album, $catch) + { + if ($catch) { + try { + $this->delete($album); + } catch (Zend_Gdata_App_HttpException $e) { + if ($e->getResponse()->getStatus() === 409) { + $entry = new Zend_Gdata_Photos_AlbumEntry($e->getResponse()->getBody()); + $this->delete($entry->getLink('edit')->href); + } else { + throw $e; + } + } + } else { + $this->delete($album); + } + } + + /** + * Delete a PhotoEntry. + * + * @param Zend_Gdata_Photos_PhotoEntry $photo The photo entry to + * delete. + * @param boolean $catch Whether to catch an exception when + * modified and re-delete or throw + * @return void. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function deletePhotoEntry($photo, $catch) + { + if ($catch) { + try { + $this->delete($photo); + } catch (Zend_Gdata_App_HttpException $e) { + if ($e->getResponse()->getStatus() === 409) { + $entry = new Zend_Gdata_Photos_PhotoEntry($e->getResponse()->getBody()); + $this->delete($entry->getLink('edit')->href); + } else { + throw $e; + } + } + } else { + $this->delete($photo); + } + } + + /** + * Delete a CommentEntry. + * + * @param Zend_Gdata_Photos_CommentEntry $comment The comment entry to + * delete. + * @param boolean $catch Whether to catch an exception when + * modified and re-delete or throw + * @return void. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function deleteCommentEntry($comment, $catch) + { + if ($catch) { + try { + $this->delete($comment); + } catch (Zend_Gdata_App_HttpException $e) { + if ($e->getResponse()->getStatus() === 409) { + $entry = new Zend_Gdata_Photos_CommentEntry($e->getResponse()->getBody()); + $this->delete($entry->getLink('edit')->href); + } else { + throw $e; + } + } + } else { + $this->delete($comment); + } + } + + /** + * Delete a TagEntry. + * + * @param Zend_Gdata_Photos_TagEntry $tag The tag entry to + * delete. + * @param boolean $catch Whether to catch an exception when + * modified and re-delete or throw + * @return void. + * @throws Zend_Gdata_App_Exception + * @throws Zend_Gdata_App_HttpException + */ + public function deleteTagEntry($tag, $catch) + { + if ($catch) { + try { + $this->delete($tag); + } catch (Zend_Gdata_App_HttpException $e) { + if ($e->getResponse()->getStatus() === 409) { + $entry = new Zend_Gdata_Photos_TagEntry($e->getResponse()->getBody()); + $this->delete($entry->getLink('edit')->href); + } else { + throw $e; + } + } + } else { + $this->delete($tag); + } + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/AlbumEntry.php b/lib/zend/Zend/Gdata/Photos/AlbumEntry.php new file mode 100755 index 0000000000..d72f924215 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/AlbumEntry.php @@ -0,0 +1,610 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @subpackage Photos + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Gdata_Photos_AlbumEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Photos_AlbumEntry'; + + /** + * gphoto:id element + * + * @var Zend_Gdata_Photos_Extension_Id + */ + protected $_gphotoId = null; + + /** + * gphoto:access element + * + * @var Zend_Gdata_Photos_Extension_Access + */ + protected $_gphotoAccess = null; + + /** + * gphoto:location element + * + * @var Zend_Gdata_Photos_Extension_Location + */ + protected $_gphotoLocation = null; + + /** + * gphoto:user element + * + * @var Zend_Gdata_Photos_Extension_User + */ + protected $_gphotoUser = null; + + /** + * gphoto:nickname element + * + * @var Zend_Gdata_Photos_Extension_Nickname + */ + protected $_gphotoNickname = null; + + /** + * gphoto:timestamp element + * + * @var Zend_Gdata_Photos_Extension_Timestamp + */ + protected $_gphotoTimestamp = null; + + /** + * gphoto:name element + * + * @var Zend_Gdata_Photos_Extension_Name + */ + protected $_gphotoName = null; + + /** + * gphoto:numphotos element + * + * @var Zend_Gdata_Photos_Extension_NumPhotos + */ + protected $_gphotoNumPhotos = null; + + /** + * gphoto:commentCount element + * + * @var Zend_Gdata_Photos_Extension_CommentCount + */ + protected $_gphotoCommentCount = null; + + /** + * gphoto:commentingEnabled element + * + * @var Zend_Gdata_Photos_Extension_CommentingEnabled + */ + protected $_gphotoCommentingEnabled = null; + + /** + * media:group element + * + * @var Zend_Gdata_Media_MediaGroup + */ + protected $_mediaGroup = null; + + /** + * georss:where element + * + * @var Zend_Gdata_Geo_Extension_GeoRssWhere + */ + protected $_geoRssWhere = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct($element); + + $category = new Zend_Gdata_App_Extension_Category( + 'http://schemas.google.com/photos/2007#album', + 'http://schemas.google.com/g/2005#kind'); + $this->setCategory(array($category)); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoTimestamp !== null) { + $element->appendChild($this->_gphotoTimestamp->getDOM($element->ownerDocument)); + } + if ($this->_gphotoUser !== null) { + $element->appendChild($this->_gphotoUser->getDOM($element->ownerDocument)); + } + if ($this->_gphotoNickname !== null) { + $element->appendChild($this->_gphotoNickname->getDOM($element->ownerDocument)); + } + if ($this->_gphotoAccess !== null) { + $element->appendChild($this->_gphotoAccess->getDOM($element->ownerDocument)); + } + if ($this->_gphotoLocation !== null) { + $element->appendChild($this->_gphotoLocation->getDOM($element->ownerDocument)); + } + if ($this->_gphotoName !== null) { + $element->appendChild($this->_gphotoName->getDOM($element->ownerDocument)); + } + if ($this->_gphotoNumPhotos !== null) { + $element->appendChild($this->_gphotoNumPhotos->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentCount !== null) { + $element->appendChild($this->_gphotoCommentCount->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentingEnabled !== null) { + $element->appendChild($this->_gphotoCommentingEnabled->getDOM($element->ownerDocument)); + } + if ($this->_gphotoId !== null) { + $element->appendChild($this->_gphotoId->getDOM($element->ownerDocument)); + } + if ($this->_mediaGroup !== null) { + $element->appendChild($this->_mediaGroup->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'access'; + $access = new Zend_Gdata_Photos_Extension_Access(); + $access->transferFromDOM($child); + $this->_gphotoAccess = $access; + break; + case $this->lookupNamespace('gphoto') . ':' . 'location'; + $location = new Zend_Gdata_Photos_Extension_Location(); + $location->transferFromDOM($child); + $this->_gphotoLocation = $location; + break; + case $this->lookupNamespace('gphoto') . ':' . 'name'; + $name = new Zend_Gdata_Photos_Extension_Name(); + $name->transferFromDOM($child); + $this->_gphotoName = $name; + break; + case $this->lookupNamespace('gphoto') . ':' . 'numphotos'; + $numPhotos = new Zend_Gdata_Photos_Extension_NumPhotos(); + $numPhotos->transferFromDOM($child); + $this->_gphotoNumPhotos = $numPhotos; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentCount'; + $commentCount = new Zend_Gdata_Photos_Extension_CommentCount(); + $commentCount->transferFromDOM($child); + $this->_gphotoCommentCount = $commentCount; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentingEnabled'; + $commentingEnabled = new Zend_Gdata_Photos_Extension_CommentingEnabled(); + $commentingEnabled->transferFromDOM($child); + $this->_gphotoCommentingEnabled = $commentingEnabled; + break; + case $this->lookupNamespace('gphoto') . ':' . 'id'; + $id = new Zend_Gdata_Photos_Extension_Id(); + $id->transferFromDOM($child); + $this->_gphotoId = $id; + break; + case $this->lookupNamespace('gphoto') . ':' . 'user'; + $user = new Zend_Gdata_Photos_Extension_User(); + $user->transferFromDOM($child); + $this->_gphotoUser = $user; + break; + case $this->lookupNamespace('gphoto') . ':' . 'timestamp'; + $timestamp = new Zend_Gdata_Photos_Extension_Timestamp(); + $timestamp->transferFromDOM($child); + $this->_gphotoTimestamp = $timestamp; + break; + case $this->lookupNamespace('gphoto') . ':' . 'nickname'; + $nickname = new Zend_Gdata_Photos_Extension_Nickname(); + $nickname->transferFromDOM($child); + $this->_gphotoNickname = $nickname; + break; + case $this->lookupNamespace('georss') . ':' . 'where'; + $geoRssWhere = new Zend_Gdata_Geo_Extension_GeoRssWhere(); + $geoRssWhere->transferFromDOM($child); + $this->_geoRssWhere = $geoRssWhere; + break; + case $this->lookupNamespace('media') . ':' . 'group'; + $mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup(); + $mediaGroup->transferFromDOM($child); + $this->_mediaGroup = $mediaGroup; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:access attribute. + * + * @see setGphotoAccess + * @return string The requested attribute. + */ + public function getGphotoAccess() + { + return $this->_gphotoAccess; + } + + /** + * Set the value for this element's gphoto:access attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Access The element being modified. + */ + public function setGphotoAccess($value) + { + $this->_gphotoAccess = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:location attribute. + * + * @see setGphotoLocation + * @return string The requested attribute. + */ + public function getGphotoLocation() + { + return $this->_gphotoLocation; + } + + /** + * Set the value for this element's gphoto:location attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Location The element being modified. + */ + public function setGphotoLocation($value) + { + $this->_location = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:name attribute. + * + * @see setGphotoName + * @return string The requested attribute. + */ + public function getGphotoName() + { + return $this->_gphotoName; + } + + /** + * Set the value for this element's gphoto:name attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Name The element being modified. + */ + public function setGphotoName($value) + { + $this->_gphotoName = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:numphotos attribute. + * + * @see setGphotoNumPhotos + * @return string The requested attribute. + */ + public function getGphotoNumPhotos() + { + return $this->_gphotoNumPhotos; + } + + /** + * Set the value for this element's gphoto:numphotos attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_NumPhotos The element being modified. + */ + public function setGphotoNumPhotos($value) + { + $this->_gphotoNumPhotos = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentCount attribute. + * + * @see setGphotoCommentCount + * @return string The requested attribute. + */ + public function getGphotoCommentCount() + { + return $this->_gphotoCommentCount; + } + + /** + * Set the value for this element's gphoto:commentCount attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentCount The element being modified. + */ + public function setGphotoCommentCount($value) + { + $this->_gphotoCommentCount = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentingEnabled attribute. + * + * @see setGphotoCommentingEnabled + * @return string The requested attribute. + */ + public function getGphotoCommentingEnabled() + { + return $this->_gphotoCommentingEnabled; + } + + /** + * Set the value for this element's gphoto:commentingEnabled attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentingEnabled The element being modified. + */ + public function setGphotoCommentingEnabled($value) + { + $this->_gphotoCommentingEnabled = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:id attribute. + * + * @see setGphotoId + * @return string The requested attribute. + */ + public function getGphotoId() + { + return $this->_gphotoId; + } + + /** + * Set the value for this element's gphoto:id attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Id The element being modified. + */ + public function setGphotoId($value) + { + $this->_gphotoId = $value; + return $this; + } + + /** + * Get the value for this element's georss:where attribute. + * + * @see setGeoRssWhere + * @return string The requested attribute. + */ + public function getGeoRssWhere() + { + return $this->_geoRssWhere; + } + + /** + * Set the value for this element's georss:where attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Geo_Extension_GeoRssWhere The element being modified. + */ + public function setGeoRssWhere($value) + { + $this->_geoRssWhere = $value; + return $this; + } + + /** + * Get the value for this element's media:group attribute. + * + * @see setMediaGroup + * @return string The requested attribute. + */ + public function getMediaGroup() + { + return $this->_mediaGroup; + } + + /** + * Set the value for this element's media:group attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Media_Extension_MediaGroup The element being modified. + */ + public function setMediaGroup($value) + { + $this->_mediaGroup = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:user attribute. + * + * @see setGphotoUser + * @return string The requested attribute. + */ + public function getGphotoUser() + { + return $this->_gphotoUser; + } + + /** + * Set the value for this element's gphoto:user attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_User The element being modified. + */ + public function setGphotoUser($value) + { + $this->_gphotoUser = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:nickname attribute. + * + * @see setGphotoNickname + * @return string The requested attribute. + */ + public function getGphotoNickname() + { + return $this->_gphotoNickname; + } + + /** + * Set the value for this element's gphoto:nickname attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Nickname The element being modified. + */ + public function setGphotoNickname($value) + { + $this->_gphotoNickname = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:timestamp attribute. + * + * @see setGphotoTimestamp + * @return string The requested attribute. + */ + public function getGphotoTimestamp() + { + return $this->_gphotoTimestamp; + } + + /** + * Set the value for this element's gphoto:timestamp attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Timestamp The element being modified. + */ + public function setGphotoTimestamp($value) + { + $this->_gphotoTimestamp = $value; + return $this; + } +} diff --git a/lib/zend/Zend/Gdata/Photos/AlbumFeed.php b/lib/zend/Zend/Gdata/Photos/AlbumFeed.php new file mode 100755 index 0000000000..13cd91ae46 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/AlbumFeed.php @@ -0,0 +1,509 @@ + 'Zend_Gdata_Photos_PhotoEntry', + 'http://schemas.google.com/photos/2007#comment' => 'Zend_Gdata_Photos_CommentEntry', + 'http://schemas.google.com/photos/2007#tag' => 'Zend_Gdata_Photos_TagEntry' + ); + + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoId != null) { + $element->appendChild($this->_gphotoId->getDOM($element->ownerDocument)); + } + if ($this->_gphotoUser != null) { + $element->appendChild($this->_gphotoUser->getDOM($element->ownerDocument)); + } + if ($this->_gphotoNickname != null) { + $element->appendChild($this->_gphotoNickname->getDOM($element->ownerDocument)); + } + if ($this->_gphotoName != null) { + $element->appendChild($this->_gphotoName->getDOM($element->ownerDocument)); + } + if ($this->_gphotoLocation != null) { + $element->appendChild($this->_gphotoLocation->getDOM($element->ownerDocument)); + } + if ($this->_gphotoAccess != null) { + $element->appendChild($this->_gphotoAccess->getDOM($element->ownerDocument)); + } + if ($this->_gphotoTimestamp != null) { + $element->appendChild($this->_gphotoTimestamp->getDOM($element->ownerDocument)); + } + if ($this->_gphotoNumPhotos != null) { + $element->appendChild($this->_gphotoNumPhotos->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentingEnabled != null) { + $element->appendChild($this->_gphotoCommentingEnabled->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentCount != null) { + $element->appendChild($this->_gphotoCommentCount->getDOM($element->ownerDocument)); + } + + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'id'; + $id = new Zend_Gdata_Photos_Extension_Id(); + $id->transferFromDOM($child); + $this->_gphotoId = $id; + break; + case $this->lookupNamespace('gphoto') . ':' . 'user'; + $user = new Zend_Gdata_Photos_Extension_User(); + $user->transferFromDOM($child); + $this->_gphotoUser = $user; + break; + case $this->lookupNamespace('gphoto') . ':' . 'nickname'; + $nickname = new Zend_Gdata_Photos_Extension_Nickname(); + $nickname->transferFromDOM($child); + $this->_gphotoNickname = $nickname; + break; + case $this->lookupNamespace('gphoto') . ':' . 'name'; + $name = new Zend_Gdata_Photos_Extension_Name(); + $name->transferFromDOM($child); + $this->_gphotoName = $name; + break; + case $this->lookupNamespace('gphoto') . ':' . 'location'; + $location = new Zend_Gdata_Photos_Extension_Location(); + $location->transferFromDOM($child); + $this->_gphotoLocation = $location; + break; + case $this->lookupNamespace('gphoto') . ':' . 'access'; + $access = new Zend_Gdata_Photos_Extension_Access(); + $access->transferFromDOM($child); + $this->_gphotoAccess = $access; + break; + case $this->lookupNamespace('gphoto') . ':' . 'timestamp'; + $timestamp = new Zend_Gdata_Photos_Extension_Timestamp(); + $timestamp->transferFromDOM($child); + $this->_gphotoTimestamp = $timestamp; + break; + case $this->lookupNamespace('gphoto') . ':' . 'numphotos'; + $numphotos = new Zend_Gdata_Photos_Extension_NumPhotos(); + $numphotos->transferFromDOM($child); + $this->_gphotoNumPhotos = $numphotos; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentingEnabled'; + $commentingEnabled = new Zend_Gdata_Photos_Extension_CommentingEnabled(); + $commentingEnabled->transferFromDOM($child); + $this->_gphotoCommentingEnabled = $commentingEnabled; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentCount'; + $commentCount = new Zend_Gdata_Photos_Extension_CommentCount(); + $commentCount->transferFromDOM($child); + $this->_gphotoCommentCount = $commentCount; + break; + case $this->lookupNamespace('atom') . ':' . 'entry': + $entryClassName = $this->_entryClassName; + $tmpEntry = new Zend_Gdata_App_Entry($child); + $categories = $tmpEntry->getCategory(); + foreach ($categories as $category) { + if ($category->scheme == Zend_Gdata_Photos::KIND_PATH && + $this->_entryKindClassMapping[$category->term] != "") { + $entryClassName = $this->_entryKindClassMapping[$category->term]; + break; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Entry is missing kind declaration.'); + } + } + + $newEntry = new $entryClassName($child); + $newEntry->setHttpClient($this->getHttpClient()); + $this->_entry[] = $newEntry; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:user attribute. + * + * @see setGphotoUser + * @return string The requested attribute. + */ + public function getGphotoUser() + { + return $this->_gphotoUser; + } + + /** + * Set the value for this element's gphoto:user attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_User The element being modified. + */ + public function setGphotoUser($value) + { + $this->_gphotoUser = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:access attribute. + * + * @see setGphotoAccess + * @return string The requested attribute. + */ + public function getGphotoAccess() + { + return $this->_gphotoAccess; + } + + /** + * Set the value for this element's gphoto:access attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Access The element being modified. + */ + public function setGphotoAccess($value) + { + $this->_gphotoAccess = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:location attribute. + * + * @see setGphotoLocation + * @return string The requested attribute. + */ + public function getGphotoLocation() + { + return $this->_gphotoLocation; + } + + /** + * Set the value for this element's gphoto:location attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Location The element being modified. + */ + public function setGphotoLocation($value) + { + $this->_gphotoLocation = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:name attribute. + * + * @see setGphotoName + * @return string The requested attribute. + */ + public function getGphotoName() + { + return $this->_gphotoName; + } + + /** + * Set the value for this element's gphoto:name attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Name The element being modified. + */ + public function setGphotoName($value) + { + $this->_gphotoName = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:numphotos attribute. + * + * @see setGphotoNumPhotos + * @return string The requested attribute. + */ + public function getGphotoNumPhotos() + { + return $this->_gphotoNumPhotos; + } + + /** + * Set the value for this element's gphoto:numphotos attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_NumPhotos The element being modified. + */ + public function setGphotoNumPhotos($value) + { + $this->_gphotoNumPhotos = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentCount attribute. + * + * @see setGphotoCommentCount + * @return string The requested attribute. + */ + public function getGphotoCommentCount() + { + return $this->_gphotoCommentCount; + } + + /** + * Set the value for this element's gphoto:commentCount attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentCount The element being modified. + */ + public function setGphotoCommentCount($value) + { + $this->_gphotoCommentCount = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentingEnabled attribute. + * + * @see setGphotoCommentingEnabled + * @return string The requested attribute. + */ + public function getGphotoCommentingEnabled() + { + return $this->_gphotoCommentingEnabled; + } + + /** + * Set the value for this element's gphoto:commentingEnabled attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentingEnabled The element being modified. + */ + public function setGphotoCommentingEnabled($value) + { + $this->_gphotoCommentingEnabled = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:id attribute. + * + * @see setGphotoId + * @return string The requested attribute. + */ + public function getGphotoId() + { + return $this->_gphotoId; + } + + /** + * Set the value for this element's gphoto:id attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Id The element being modified. + */ + public function setGphotoId($value) + { + $this->_gphotoId = $value; + return $this; + } + + /** + * Get the value for this element's georss:where attribute. + * + * @see setGeoRssWhere + * @return string The requested attribute. + */ + public function getGeoRssWhere() + { + return $this->_geoRssWhere; + } + + /** + * Set the value for this element's georss:where attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Geo_Extension_GeoRssWhere The element being modified. + */ + public function setGeoRssWhere($value) + { + $this->_geoRssWhere = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:nickname attribute. + * + * @see setGphotoNickname + * @return string The requested attribute. + */ + public function getGphotoNickname() + { + return $this->_gphotoNickname; + } + + /** + * Set the value for this element's gphoto:nickname attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Nickname The element being modified. + */ + public function setGphotoNickname($value) + { + $this->_gphotoNickname = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:timestamp attribute. + * + * @see setGphotoTimestamp + * @return string The requested attribute. + */ + public function getGphotoTimestamp() + { + return $this->_gphotoTimestamp; + } + + /** + * Set the value for this element's gphoto:timestamp attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Timestamp The element being modified. + */ + public function setGphotoTimestamp($value) + { + $this->_gphotoTimestamp = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/AlbumQuery.php b/lib/zend/Zend/Gdata/Photos/AlbumQuery.php new file mode 100755 index 0000000000..27087a1eaf --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/AlbumQuery.php @@ -0,0 +1,149 @@ +_albumId = null; + $this->_albumName = $value; + + return $this; + } + + /** + * Get the album name which is to be returned. + * + * @see setAlbumName + * @return string The name of the album to retrieve. + */ + public function getAlbumName() + { + return $this->_albumName; + } + + /** + * Set the album ID to query for. When set, this album's photographs + * be returned. If not set or null, the default user's feed will be + * returned instead. + * + * NOTE: Album and AlbumId are mutually exclusive. Setting one will + * automatically set the other to null. + * + * @param string $value The ID of the album to retrieve, or null to + * clear. + * @return Zend_Gdata_Photos_AlbumQuery The query object. + */ + public function setAlbumId($value) + { + $this->_albumName = null; + $this->_albumId = $value; + + return $this; + } + + /** + * Get the album ID which is to be returned. + * + * @see setAlbum + * @return string The ID of the album to retrieve. + */ + public function getAlbumId() + { + return $this->_albumId; + } + + /** + * Returns the URL generated for this query, based on it's current + * parameters. + * + * @return string A URL generated based on the state of this query. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getQueryUrl($incomingUri = '') + { + $uri = ''; + if ($this->getAlbumName() !== null && $this->getAlbumId() === null) { + $uri .= '/album/' . $this->getAlbumName(); + } elseif ($this->getAlbumName() === null && $this->getAlbumId() !== null) { + $uri .= '/albumid/' . $this->getAlbumId(); + } elseif ($this->getAlbumName() !== null && $this->getAlbumId() !== null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'AlbumName and AlbumId cannot both be non-null'); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'AlbumName and AlbumId cannot both be null'); + } + $uri .= $incomingUri; + return parent::getQueryUrl($uri); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/CommentEntry.php b/lib/zend/Zend/Gdata/Photos/CommentEntry.php new file mode 100755 index 0000000000..346a329cb9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/CommentEntry.php @@ -0,0 +1,195 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @subpackage Photos + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Gdata_Photos_CommentEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Photos_CommentEntry'; + + /** + * gphoto:id element + * + * @var Zend_Gdata_Photos_Extension_Id + */ + protected $_gphotoId = null; + + /** + * gphoto:photoid element, differs from gphoto:id as this is an + * actual identification number unique exclusively to photo entries, + * whereas gphoto:id can refer to all gphoto objects + * + * @var Zend_Gdata_Photos_Extension_PhotoId + */ + protected $_gphotoPhotoId = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct($element); + + $category = new Zend_Gdata_App_Extension_Category( + 'http://schemas.google.com/photos/2007#comment', + 'http://schemas.google.com/g/2005#kind'); + $this->setCategory(array($category)); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoId !== null) { + $element->appendChild($this->_gphotoId->getDOM($element->ownerDocument)); + } + if ($this->_gphotoPhotoId !== null) { + $element->appendChild($this->_gphotoPhotoId->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'id'; + $id = new Zend_Gdata_Photos_Extension_Id(); + $id->transferFromDOM($child); + $this->_gphotoId = $id; + break; + case $this->lookupNamespace('gphoto') . ':' . 'photoid'; + $photoid = new Zend_Gdata_Photos_Extension_PhotoId(); + $photoid->transferFromDOM($child); + $this->_gphotoPhotoId = $photoid; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:photoid attribute. + * + * @see setGphotoPhotoId + * @return string The requested attribute. + */ + public function getGphotoPhotoId() + { + return $this->_gphotoPhotoId; + } + + /** + * Set the value for this element's gphoto:photoid attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_PhotoId The element being modified. + */ + public function setGphotoPhotoId($value) + { + $this->_gphotoPhotoId = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:id attribute. + * + * @see setGphotoId + * @return string The requested attribute. + */ + public function getGphotoId() + { + return $this->_gphotoId; + } + + /** + * Set the value for this element's gphoto:id attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Id The element being modified. + */ + public function setGphotoId($value) + { + $this->_gphotoId = $value; + return $this; + } +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Access.php b/lib/zend/Zend/Gdata/Photos/Extension/Access.php new file mode 100755 index 0000000000..eebc14e648 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Access.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/AlbumId.php b/lib/zend/Zend/Gdata/Photos/Extension/AlbumId.php new file mode 100755 index 0000000000..dffb3d5175 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/AlbumId.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/BytesUsed.php b/lib/zend/Zend/Gdata/Photos/Extension/BytesUsed.php new file mode 100755 index 0000000000..18f8a2e573 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/BytesUsed.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Checksum.php b/lib/zend/Zend/Gdata/Photos/Extension/Checksum.php new file mode 100755 index 0000000000..1417157121 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Checksum.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Client.php b/lib/zend/Zend/Gdata/Photos/Extension/Client.php new file mode 100755 index 0000000000..a827889d16 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Client.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/CommentCount.php b/lib/zend/Zend/Gdata/Photos/Extension/CommentCount.php new file mode 100755 index 0000000000..af4ebad0e5 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/CommentCount.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/CommentingEnabled.php b/lib/zend/Zend/Gdata/Photos/Extension/CommentingEnabled.php new file mode 100755 index 0000000000..4d1c1b482a --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/CommentingEnabled.php @@ -0,0 +1,64 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Height.php b/lib/zend/Zend/Gdata/Photos/Extension/Height.php new file mode 100755 index 0000000000..eb3bfb59ee --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Height.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Id.php b/lib/zend/Zend/Gdata/Photos/Extension/Id.php new file mode 100755 index 0000000000..2a63b93352 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Id.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Location.php b/lib/zend/Zend/Gdata/Photos/Extension/Location.php new file mode 100755 index 0000000000..78295acd2e --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Location.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/MaxPhotosPerAlbum.php b/lib/zend/Zend/Gdata/Photos/Extension/MaxPhotosPerAlbum.php new file mode 100755 index 0000000000..a2cadd95cf --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/MaxPhotosPerAlbum.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Name.php b/lib/zend/Zend/Gdata/Photos/Extension/Name.php new file mode 100755 index 0000000000..7b7fa9778e --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Name.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Nickname.php b/lib/zend/Zend/Gdata/Photos/Extension/Nickname.php new file mode 100755 index 0000000000..b1b7497417 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Nickname.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/NumPhotos.php b/lib/zend/Zend/Gdata/Photos/Extension/NumPhotos.php new file mode 100755 index 0000000000..25d27eb2ef --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/NumPhotos.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/NumPhotosRemaining.php b/lib/zend/Zend/Gdata/Photos/Extension/NumPhotosRemaining.php new file mode 100755 index 0000000000..a82bb5b104 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/NumPhotosRemaining.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/PhotoId.php b/lib/zend/Zend/Gdata/Photos/Extension/PhotoId.php new file mode 100755 index 0000000000..c4611a831c --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/PhotoId.php @@ -0,0 +1,61 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Position.php b/lib/zend/Zend/Gdata/Photos/Extension/Position.php new file mode 100755 index 0000000000..537010147b --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Position.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/QuotaCurrent.php b/lib/zend/Zend/Gdata/Photos/Extension/QuotaCurrent.php new file mode 100755 index 0000000000..7c02ca5e9d --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/QuotaCurrent.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/QuotaLimit.php b/lib/zend/Zend/Gdata/Photos/Extension/QuotaLimit.php new file mode 100755 index 0000000000..41d7775f10 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/QuotaLimit.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Rotation.php b/lib/zend/Zend/Gdata/Photos/Extension/Rotation.php new file mode 100755 index 0000000000..56e42e2102 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Rotation.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Size.php b/lib/zend/Zend/Gdata/Photos/Extension/Size.php new file mode 100755 index 0000000000..7043c85ac3 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Size.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Thumbnail.php b/lib/zend/Zend/Gdata/Photos/Extension/Thumbnail.php new file mode 100755 index 0000000000..b861a4a1a7 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Thumbnail.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Timestamp.php b/lib/zend/Zend/Gdata/Photos/Extension/Timestamp.php new file mode 100755 index 0000000000..ca018461f3 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Timestamp.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/User.php b/lib/zend/Zend/Gdata/Photos/Extension/User.php new file mode 100755 index 0000000000..e886433599 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/User.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Version.php b/lib/zend/Zend/Gdata/Photos/Extension/Version.php new file mode 100755 index 0000000000..763c123437 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Version.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Weight.php b/lib/zend/Zend/Gdata/Photos/Extension/Weight.php new file mode 100755 index 0000000000..c4f2ccab66 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Weight.php @@ -0,0 +1,63 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/Extension/Width.php b/lib/zend/Zend/Gdata/Photos/Extension/Width.php new file mode 100755 index 0000000000..a545aed68a --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/Extension/Width.php @@ -0,0 +1,62 @@ +registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct(); + $this->setText($text); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/PhotoEntry.php b/lib/zend/Zend/Gdata/Photos/PhotoEntry.php new file mode 100755 index 0000000000..0bea56c574 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/PhotoEntry.php @@ -0,0 +1,691 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @subpackage Photos + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Gdata_Photos_PhotoEntry extends Zend_Gdata_Media_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Photos_PhotoEntry'; + + /** + * gphoto:id element + * + * @var Zend_Gdata_Photos_Extension_Id + */ + protected $_gphotoId = null; + + /** + * gphoto:albumid element + * + * @var Zend_Gdata_Photos_Extension_AlbumId + */ + protected $_gphotoAlbumId = null; + + /** + * gphoto:version element + * + * @var Zend_Gdata_Photos_Extension_Version + */ + protected $_gphotoVersion = null; + + /** + * gphoto:width element + * + * @var Zend_Gdata_Photos_Extension_Width + */ + protected $_gphotoWidth = null; + + /** + * gphoto:height element + * + * @var Zend_Gdata_Photos_Extension_Height + */ + protected $_gphotoHeight = null; + + /** + * gphoto:size element + * + * @var Zend_Gdata_Photos_Extension_Size + */ + protected $_gphotoSize = null; + + /** + * gphoto:client element + * + * @var Zend_Gdata_Photos_Extension_Client + */ + protected $_gphotoClient = null; + + /** + * gphoto:checksum element + * + * @var Zend_Gdata_Photos_Extension_Checksum + */ + protected $_gphotoChecksum = null; + + /** + * gphoto:timestamp element + * + * @var Zend_Gdata_Photos_Extension_Timestamp + */ + protected $_gphotoTimestamp = null; + + /** + * gphoto:commentCount element + * + * @var Zend_Gdata_Photos_Extension_CommentCount + */ + protected $_gphotoCommentCount = null; + + /** + * gphoto:commentingEnabled element + * + * @var Zend_Gdata_Photos_Extension_CommentingEnabled + */ + protected $_gphotoCommentingEnabled = null; + + /** + * exif:tags element + * + * @var Zend_Gdata_Exif_Extension_Tags + */ + protected $_exifTags = null; + + /** + * georss:where element + * + * @var Zend_Gdata_Geo_Extension_GeoRssWhere + */ + protected $_geoRssWhere = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct($element); + + $category = new Zend_Gdata_App_Extension_Category( + 'http://schemas.google.com/photos/2007#photo', + 'http://schemas.google.com/g/2005#kind'); + $this->setCategory(array($category)); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoAlbumId !== null) { + $element->appendChild($this->_gphotoAlbumId->getDOM($element->ownerDocument)); + } + if ($this->_gphotoId !== null) { + $element->appendChild($this->_gphotoId->getDOM($element->ownerDocument)); + } + if ($this->_gphotoVersion !== null) { + $element->appendChild($this->_gphotoVersion->getDOM($element->ownerDocument)); + } + if ($this->_gphotoWidth !== null) { + $element->appendChild($this->_gphotoWidth->getDOM($element->ownerDocument)); + } + if ($this->_gphotoHeight !== null) { + $element->appendChild($this->_gphotoHeight->getDOM($element->ownerDocument)); + } + if ($this->_gphotoSize !== null) { + $element->appendChild($this->_gphotoSize->getDOM($element->ownerDocument)); + } + if ($this->_gphotoClient !== null) { + $element->appendChild($this->_gphotoClient->getDOM($element->ownerDocument)); + } + if ($this->_gphotoChecksum !== null) { + $element->appendChild($this->_gphotoChecksum->getDOM($element->ownerDocument)); + } + if ($this->_gphotoTimestamp !== null) { + $element->appendChild($this->_gphotoTimestamp->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentingEnabled !== null) { + $element->appendChild($this->_gphotoCommentingEnabled->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentCount !== null) { + $element->appendChild($this->_gphotoCommentCount->getDOM($element->ownerDocument)); + } + if ($this->_exifTags !== null) { + $element->appendChild($this->_exifTags->getDOM($element->ownerDocument)); + } + if ($this->_geoRssWhere !== null) { + $element->appendChild($this->_geoRssWhere->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'albumid'; + $albumId = new Zend_Gdata_Photos_Extension_AlbumId(); + $albumId->transferFromDOM($child); + $this->_gphotoAlbumId = $albumId; + break; + case $this->lookupNamespace('gphoto') . ':' . 'id'; + $id = new Zend_Gdata_Photos_Extension_Id(); + $id->transferFromDOM($child); + $this->_gphotoId = $id; + break; + case $this->lookupNamespace('gphoto') . ':' . 'version'; + $version = new Zend_Gdata_Photos_Extension_Version(); + $version->transferFromDOM($child); + $this->_gphotoVersion = $version; + break; + case $this->lookupNamespace('gphoto') . ':' . 'width'; + $width = new Zend_Gdata_Photos_Extension_Width(); + $width->transferFromDOM($child); + $this->_gphotoWidth = $width; + break; + case $this->lookupNamespace('gphoto') . ':' . 'height'; + $height = new Zend_Gdata_Photos_Extension_Height(); + $height->transferFromDOM($child); + $this->_gphotoHeight = $height; + break; + case $this->lookupNamespace('gphoto') . ':' . 'size'; + $size = new Zend_Gdata_Photos_Extension_Size(); + $size->transferFromDOM($child); + $this->_gphotoSize = $size; + break; + case $this->lookupNamespace('gphoto') . ':' . 'client'; + $client = new Zend_Gdata_Photos_Extension_Client(); + $client->transferFromDOM($child); + $this->_gphotoClient = $client; + break; + case $this->lookupNamespace('gphoto') . ':' . 'checksum'; + $checksum = new Zend_Gdata_Photos_Extension_Checksum(); + $checksum->transferFromDOM($child); + $this->_gphotoChecksum = $checksum; + break; + case $this->lookupNamespace('gphoto') . ':' . 'timestamp'; + $timestamp = new Zend_Gdata_Photos_Extension_Timestamp(); + $timestamp->transferFromDOM($child); + $this->_gphotoTimestamp = $timestamp; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentingEnabled'; + $commentingEnabled = new Zend_Gdata_Photos_Extension_CommentingEnabled(); + $commentingEnabled->transferFromDOM($child); + $this->_gphotoCommentingEnabled = $commentingEnabled; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentCount'; + $commentCount = new Zend_Gdata_Photos_Extension_CommentCount(); + $commentCount->transferFromDOM($child); + $this->_gphotoCommentCount = $commentCount; + break; + case $this->lookupNamespace('exif') . ':' . 'tags'; + $exifTags = new Zend_Gdata_Exif_Extension_Tags(); + $exifTags->transferFromDOM($child); + $this->_exifTags = $exifTags; + break; + case $this->lookupNamespace('georss') . ':' . 'where'; + $geoRssWhere = new Zend_Gdata_Geo_Extension_GeoRssWhere(); + $geoRssWhere->transferFromDOM($child); + $this->_geoRssWhere = $geoRssWhere; + break; + default: + parent::takeChildFromDOM($child); + break; + + } + } + + /** + * Get the value for this element's gphoto:albumid attribute. + * + * @see setGphotoAlbumId + * @return string The requested attribute. + */ + public function getGphotoAlbumId() + { + return $this->_gphotoAlbumId; + } + + /** + * Set the value for this element's gphoto:albumid attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_AlbumId The element being modified. + */ + public function setGphotoAlbumId($value) + { + $this->_gphotoAlbumId = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:id attribute. + * + * @see setGphotoId + * @return string The requested attribute. + */ + public function getGphotoId() + { + return $this->_gphotoId; + } + + /** + * Set the value for this element's gphoto:id attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Id The element being modified. + */ + public function setGphotoId($value) + { + $this->_gphotoId = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:version attribute. + * + * @see setGphotoVersion + * @return string The requested attribute. + */ + public function getGphotoVersion() + { + return $this->_gphotoVersion; + } + + /** + * Set the value for this element's gphoto:version attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Version The element being modified. + */ + public function setGphotoVersion($value) + { + $this->_gphotoVersion = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:width attribute. + * + * @see setGphotoWidth + * @return string The requested attribute. + */ + public function getGphotoWidth() + { + return $this->_gphotoWidth; + } + + /** + * Set the value for this element's gphoto:width attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Width The element being modified. + */ + public function setGphotoWidth($value) + { + $this->_gphotoWidth = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:height attribute. + * + * @see setGphotoHeight + * @return string The requested attribute. + */ + public function getGphotoHeight() + { + return $this->_gphotoHeight; + } + + /** + * Set the value for this element's gphoto:height attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Height The element being modified. + */ + public function setGphotoHeight($value) + { + $this->_gphotoHeight = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:size attribute. + * + * @see setGphotoSize + * @return string The requested attribute. + */ + public function getGphotoSize() + { + return $this->_gphotoSize; + } + + /** + * Set the value for this element's gphoto:size attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Size The element being modified. + */ + public function setGphotoSize($value) + { + $this->_gphotoSize = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:client attribute. + * + * @see setGphotoClient + * @return string The requested attribute. + */ + public function getGphotoClient() + { + return $this->_gphotoClient; + } + + /** + * Set the value for this element's gphoto:client attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Client The element being modified. + */ + public function setGphotoClient($value) + { + $this->_gphotoClient = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:checksum attribute. + * + * @see setGphotoChecksum + * @return string The requested attribute. + */ + public function getGphotoChecksum() + { + return $this->_gphotoChecksum; + } + + /** + * Set the value for this element's gphoto:checksum attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Checksum The element being modified. + */ + public function setGphotoChecksum($value) + { + $this->_gphotoChecksum = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:timestamp attribute. + * + * @see setGphotoTimestamp + * @return string The requested attribute. + */ + public function getGphotoTimestamp() + { + return $this->_gphotoTimestamp; + } + + /** + * Set the value for this element's gphoto:timestamp attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Timestamp The element being modified. + */ + public function setGphotoTimestamp($value) + { + $this->_gphotoTimestamp = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentCount attribute. + * + * @see setGphotoCommentCount + * @return string The requested attribute. + */ + public function getGphotoCommentCount() + { + return $this->_gphotoCommentCount; + } + + /** + * Set the value for this element's gphoto:commentCount attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentCount The element being modified. + */ + public function setGphotoCommentCount($value) + { + $this->_gphotoCommentCount = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentingEnabled attribute. + * + * @see setGphotoCommentingEnabled + * @return string The requested attribute. + */ + public function getGphotoCommentingEnabled() + { + return $this->_gphotoCommentingEnabled; + } + + /** + * Set the value for this element's gphoto:commentingEnabled attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentingEnabled The element being modified. + */ + public function setGphotoCommentingEnabled($value) + { + $this->_gphotoCommentingEnabled = $value; + return $this; + } + + /** + * Get the value for this element's exif:tags attribute. + * + * @see setExifTags + * @return string The requested attribute. + */ + public function getExifTags() + { + return $this->_exifTags; + } + + /** + * Set the value for this element's exif:tags attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Exif_Extension_Tags The element being modified. + */ + public function setExifTags($value) + { + $this->_exifTags = $value; + return $this; + } + + /** + * Get the value for this element's georss:where attribute. + * + * @see setGeoRssWhere + * @return string The requested attribute. + */ + public function getGeoRssWhere() + { + return $this->_geoRssWhere; + } + + /** + * Set the value for this element's georss:where attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Geo_Extension_GeoRssWhere The element being modified. + */ + public function setGeoRssWhere($value) + { + $this->_geoRssWhere = $value; + return $this; + } + + /** + * Get the value for this element's media:group attribute. + * + * @see setMediaGroup + * @return string The requested attribute. + */ + public function getMediaGroup() + { + return $this->_mediaGroup; + } + + /** + * Set the value for this element's media:group attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Media_Extension_MediaGroup The element being modified. + */ + public function setMediaGroup($value) + { + $this->_mediaGroup = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/PhotoFeed.php b/lib/zend/Zend/Gdata/Photos/PhotoFeed.php new file mode 100755 index 0000000000..102eace76f --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/PhotoFeed.php @@ -0,0 +1,559 @@ + 'Zend_Gdata_Photos_CommentEntry', + 'http://schemas.google.com/photos/2007#tag' => 'Zend_Gdata_Photos_TagEntry' + ); + + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoId != null) { + $element->appendChild($this->_gphotoId->getDOM($element->ownerDocument)); + } + if ($this->_gphotoVersion != null) { + $element->appendChild($this->_gphotoVersion->getDOM($element->ownerDocument)); + } + if ($this->_gphotoWidth != null) { + $element->appendChild($this->_gphotoWidth->getDOM($element->ownerDocument)); + } + if ($this->_gphotoHeight != null) { + $element->appendChild($this->_gphotoHeight->getDOM($element->ownerDocument)); + } + if ($this->_gphotoSize != null) { + $element->appendChild($this->_gphotoSize->getDOM($element->ownerDocument)); + } + if ($this->_gphotoClient != null) { + $element->appendChild($this->_gphotoClient->getDOM($element->ownerDocument)); + } + if ($this->_gphotoChecksum != null) { + $element->appendChild($this->_gphotoChecksum->getDOM($element->ownerDocument)); + } + if ($this->_gphotoTimestamp != null) { + $element->appendChild($this->_gphotoTimestamp->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentingEnabled != null) { + $element->appendChild($this->_gphotoCommentingEnabled->getDOM($element->ownerDocument)); + } + if ($this->_gphotoCommentCount != null) { + $element->appendChild($this->_gphotoCommentCount->getDOM($element->ownerDocument)); + } + if ($this->_mediaGroup != null) { + $element->appendChild($this->_mediaGroup->getDOM($element->ownerDocument)); + } + + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'id'; + $id = new Zend_Gdata_Photos_Extension_Id(); + $id->transferFromDOM($child); + $this->_gphotoId = $id; + break; + case $this->lookupNamespace('gphoto') . ':' . 'version'; + $version = new Zend_Gdata_Photos_Extension_Version(); + $version->transferFromDOM($child); + $this->_gphotoVersion = $version; + break; + case $this->lookupNamespace('gphoto') . ':' . 'albumid'; + $albumid = new Zend_Gdata_Photos_Extension_AlbumId(); + $albumid->transferFromDOM($child); + $this->_gphotoAlbumId = $albumid; + break; + case $this->lookupNamespace('gphoto') . ':' . 'width'; + $width = new Zend_Gdata_Photos_Extension_Width(); + $width->transferFromDOM($child); + $this->_gphotoWidth = $width; + break; + case $this->lookupNamespace('gphoto') . ':' . 'height'; + $height = new Zend_Gdata_Photos_Extension_Height(); + $height->transferFromDOM($child); + $this->_gphotoHeight = $height; + break; + case $this->lookupNamespace('gphoto') . ':' . 'size'; + $size = new Zend_Gdata_Photos_Extension_Size(); + $size->transferFromDOM($child); + $this->_gphotoSize = $size; + break; + case $this->lookupNamespace('gphoto') . ':' . 'client'; + $client = new Zend_Gdata_Photos_Extension_Client(); + $client->transferFromDOM($child); + $this->_gphotoClient = $client; + break; + case $this->lookupNamespace('gphoto') . ':' . 'checksum'; + $checksum = new Zend_Gdata_Photos_Extension_Checksum(); + $checksum->transferFromDOM($child); + $this->_gphotoChecksum = $checksum; + break; + case $this->lookupNamespace('gphoto') . ':' . 'timestamp'; + $timestamp = new Zend_Gdata_Photos_Extension_Timestamp(); + $timestamp->transferFromDOM($child); + $this->_gphotoTimestamp = $timestamp; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentingEnabled'; + $commentingEnabled = new Zend_Gdata_Photos_Extension_CommentingEnabled(); + $commentingEnabled->transferFromDOM($child); + $this->_gphotoCommentingEnabled = $commentingEnabled; + break; + case $this->lookupNamespace('gphoto') . ':' . 'commentCount'; + $commentCount = new Zend_Gdata_Photos_Extension_CommentCount(); + $commentCount->transferFromDOM($child); + $this->_gphotoCommentCount = $commentCount; + break; + case $this->lookupNamespace('media') . ':' . 'group'; + $mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup(); + $mediaGroup->transferFromDOM($child); + $this->_mediaGroup = $mediaGroup; + break; + case $this->lookupNamespace('atom') . ':' . 'entry': + $entryClassName = $this->_entryClassName; + $tmpEntry = new Zend_Gdata_App_Entry($child); + $categories = $tmpEntry->getCategory(); + foreach ($categories as $category) { + if ($category->scheme == Zend_Gdata_Photos::KIND_PATH && + $this->_entryKindClassMapping[$category->term] != "") { + $entryClassName = $this->_entryKindClassMapping[$category->term]; + break; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Entry is missing kind declaration.'); + } + } + + $newEntry = new $entryClassName($child); + $newEntry->setHttpClient($this->getHttpClient()); + $this->_entry[] = $newEntry; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:id attribute. + * + * @see setGphotoId + * @return string The requested attribute. + */ + public function getGphotoId() + { + return $this->_gphotoId; + } + + /** + * Set the value for this element's gphoto:id attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Id The element being modified. + */ + public function setGphotoId($value) + { + $this->_gphotoId = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:version attribute. + * + * @see setGphotoVersion + * @return string The requested attribute. + */ + public function getGphotoVersion() + { + return $this->_gphotoVersion; + } + + /** + * Set the value for this element's gphoto:version attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Version The element being modified. + */ + public function setGphotoVersion($value) + { + $this->_gphotoVersion = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:albumid attribute. + * + * @see setGphotoAlbumId + * @return string The requested attribute. + */ + public function getGphotoAlbumId() + { + return $this->_gphotoAlbumId; + } + + /** + * Set the value for this element's gphoto:albumid attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_AlbumId The element being modified. + */ + public function setGphotoAlbumId($value) + { + $this->_gphotoAlbumId = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:width attribute. + * + * @see setGphotoWidth + * @return string The requested attribute. + */ + public function getGphotoWidth() + { + return $this->_gphotoWidth; + } + + /** + * Set the value for this element's gphoto:width attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Width The element being modified. + */ + public function setGphotoWidth($value) + { + $this->_gphotoWidth = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:height attribute. + * + * @see setGphotoHeight + * @return string The requested attribute. + */ + public function getGphotoHeight() + { + return $this->_gphotoHeight; + } + + /** + * Set the value for this element's gphoto:height attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Height The element being modified. + */ + public function setGphotoHeight($value) + { + $this->_gphotoHeight = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:size attribute. + * + * @see setGphotoSize + * @return string The requested attribute. + */ + public function getGphotoSize() + { + return $this->_gphotoSize; + } + + /** + * Set the value for this element's gphoto:size attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Size The element being modified. + */ + public function setGphotoSize($value) + { + $this->_gphotoSize = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:client attribute. + * + * @see setGphotoClient + * @return string The requested attribute. + */ + public function getGphotoClient() + { + return $this->_gphotoClient; + } + + /** + * Set the value for this element's gphoto:client attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Client The element being modified. + */ + public function setGphotoClient($value) + { + $this->_gphotoClient = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:checksum attribute. + * + * @see setGphotoChecksum + * @return string The requested attribute. + */ + public function getGphotoChecksum() + { + return $this->_gphotoChecksum; + } + + /** + * Set the value for this element's gphoto:checksum attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Checksum The element being modified. + */ + public function setGphotoChecksum($value) + { + $this->_gphotoChecksum = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:timestamp attribute. + * + * @see setGphotoTimestamp + * @return string The requested attribute. + */ + public function getGphotoTimestamp() + { + return $this->_gphotoTimestamp; + } + + /** + * Set the value for this element's gphoto:timestamp attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Timestamp The element being modified. + */ + public function setGphotoTimestamp($value) + { + $this->_gphotoTimestamp = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentCount attribute. + * + * @see setGphotoCommentCount + * @return string The requested attribute. + */ + public function getGphotoCommentCount() + { + return $this->_gphotoCommentCount; + } + + /** + * Set the value for this element's gphoto:commentCount attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentCount The element being modified. + */ + public function setGphotoCommentCount($value) + { + $this->_gphotoCommentCount = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:commentingEnabled attribute. + * + * @see setGphotoCommentingEnabled + * @return string The requested attribute. + */ + public function getGphotoCommentingEnabled() + { + return $this->_gphotoCommentingEnabled; + } + + /** + * Set the value for this element's gphoto:commentingEnabled attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_CommentingEnabled The element being modified. + */ + public function setGphotoCommentingEnabled($value) + { + $this->_gphotoCommentingEnabled = $value; + return $this; + } + + /** + * Get the value for this element's media:group attribute. + * + * @see setMediaGroup + * @return string The requested attribute. + */ + public function getMediaGroup() + { + return $this->_mediaGroup; + } + + /** + * Set the value for this element's media:group attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Media_Extension_MediaGroup The element being modified. + */ + public function setMediaGroup($value) + { + $this->_mediaGroup = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/PhotoQuery.php b/lib/zend/Zend/Gdata/Photos/PhotoQuery.php new file mode 100755 index 0000000000..bf37cd8aa8 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/PhotoQuery.php @@ -0,0 +1,98 @@ +_photoId = $value; + } + + /** + * Get the photo ID which is to be returned. + * + * @see setPhoto + * @return string The ID of the photo to retrieve. + */ + public function getPhotoId() + { + return $this->_photoId; + } + + /** + * Returns the URL generated for this query, based on it's current + * parameters. + * + * @return string A URL generated based on the state of this query. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getQueryUrl($incomingUri = '') + { + $uri = ''; + if ($this->getPhotoId() !== null) { + $uri .= '/photoid/' . $this->getPhotoId(); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'PhotoId cannot be null'); + } + $uri .= $incomingUri; + return parent::getQueryUrl($uri); + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/TagEntry.php b/lib/zend/Zend/Gdata/Photos/TagEntry.php new file mode 100755 index 0000000000..5a48b737f4 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/TagEntry.php @@ -0,0 +1,140 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @subpackage Photos + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Gdata_Photos_TagEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Photos_TagEntry'; + + protected $_gphotoWeight = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct($element); + + $category = new Zend_Gdata_App_Extension_Category( + 'http://schemas.google.com/photos/2007#tag', + 'http://schemas.google.com/g/2005#kind'); + $this->setCategory(array($category)); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoWeight !== null) { + $element->appendChild($this->_gphotoWeight->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'weight'; + $weight = new Zend_Gdata_Photos_Extension_Weight(); + $weight->transferFromDOM($child); + $this->_gphotoWeight = $weight; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:weight attribute. + * + * @see setGphotoWeight + * @return string The requested attribute. + */ + public function getGphotoWeight() + { + return $this->_gphotoWeight; + } + + /** + * Set the value for this element's gphoto:weight attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Weight The element being modified. + */ + public function setGphotoWeight($value) + { + $this->_gphotoWeight = $value; + return $this; + } +} diff --git a/lib/zend/Zend/Gdata/Photos/UserEntry.php b/lib/zend/Zend/Gdata/Photos/UserEntry.php new file mode 100755 index 0000000000..8e125686cf --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/UserEntry.php @@ -0,0 +1,366 @@ + in the Google Data protocol. + * + * @category Zend + * @package Zend_Gdata + * @subpackage Photos + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Gdata_Photos_UserEntry extends Zend_Gdata_Entry +{ + + protected $_entryClassName = 'Zend_Gdata_Photos_UserEntry'; + + /** + * gphoto:nickname element + * + * @var Zend_Gdata_Photos_Extension_Nickname + */ + protected $_gphotoNickname = null; + + /** + * gphoto:user element + * + * @var Zend_Gdata_Photos_Extension_User + */ + protected $_gphotoUser = null; + + /** + * gphoto:thumbnail element + * + * @var Zend_Gdata_Photos_Extension_Thumbnail + */ + protected $_gphotoThumbnail = null; + + /** + * gphoto:quotalimit element + * + * @var Zend_Gdata_Photos_Extension_QuotaLimit + */ + protected $_gphotoQuotaLimit = null; + + /** + * gphoto:quotacurrent element + * + * @var Zend_Gdata_Photos_Extension_QuotaCurrent + */ + protected $_gphotoQuotaCurrent = null; + + /** + * gphoto:maxPhotosPerAlbum element + * + * @var Zend_Gdata_Photos_Extension_MaxPhotosPerAlbum + */ + protected $_gphotoMaxPhotosPerAlbum = null; + + /** + * Create a new instance. + * + * @param DOMElement $element (optional) DOMElement from which this + * object should be constructed. + */ + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct($element); + + $category = new Zend_Gdata_App_Extension_Category( + 'http://schemas.google.com/photos/2007#user', + 'http://schemas.google.com/g/2005#kind'); + $this->setCategory(array($category)); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoNickname !== null) { + $element->appendChild($this->_gphotoNickname->getDOM($element->ownerDocument)); + } + if ($this->_gphotoThumbnail !== null) { + $element->appendChild($this->_gphotoThumbnail->getDOM($element->ownerDocument)); + } + if ($this->_gphotoUser !== null) { + $element->appendChild($this->_gphotoUser->getDOM($element->ownerDocument)); + } + if ($this->_gphotoQuotaCurrent !== null) { + $element->appendChild($this->_gphotoQuotaCurrent->getDOM($element->ownerDocument)); + } + if ($this->_gphotoQuotaLimit !== null) { + $element->appendChild($this->_gphotoQuotaLimit->getDOM($element->ownerDocument)); + } + if ($this->_gphotoMaxPhotosPerAlbum !== null) { + $element->appendChild($this->_gphotoMaxPhotosPerAlbum->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'nickname'; + $nickname = new Zend_Gdata_Photos_Extension_Nickname(); + $nickname->transferFromDOM($child); + $this->_gphotoNickname = $nickname; + break; + case $this->lookupNamespace('gphoto') . ':' . 'thumbnail'; + $thumbnail = new Zend_Gdata_Photos_Extension_Thumbnail(); + $thumbnail->transferFromDOM($child); + $this->_gphotoThumbnail = $thumbnail; + break; + case $this->lookupNamespace('gphoto') . ':' . 'user'; + $user = new Zend_Gdata_Photos_Extension_User(); + $user->transferFromDOM($child); + $this->_gphotoUser = $user; + break; + case $this->lookupNamespace('gphoto') . ':' . 'quotacurrent'; + $quotaCurrent = new Zend_Gdata_Photos_Extension_QuotaCurrent(); + $quotaCurrent->transferFromDOM($child); + $this->_gphotoQuotaCurrent = $quotaCurrent; + break; + case $this->lookupNamespace('gphoto') . ':' . 'quotalimit'; + $quotaLimit = new Zend_Gdata_Photos_Extension_QuotaLimit(); + $quotaLimit->transferFromDOM($child); + $this->_gphotoQuotaLimit = $quotaLimit; + break; + case $this->lookupNamespace('gphoto') . ':' . 'maxPhotosPerAlbum'; + $maxPhotosPerAlbum = new Zend_Gdata_Photos_Extension_MaxPhotosPerAlbum(); + $maxPhotosPerAlbum->transferFromDOM($child); + $this->_gphotoMaxPhotosPerAlbum = $maxPhotosPerAlbum; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's gphoto:nickname attribute. + * + * @see setGphotoNickname + * @return string The requested attribute. + */ + public function getGphotoNickname() + { + return $this->_gphotoNickname; + } + + /** + * Set the value for this element's gphoto:nickname attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Nickname The element being modified. + */ + public function setGphotoNickname($value) + { + $this->_gphotoNickname = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:thumbnail attribute. + * + * @see setGphotoThumbnail + * @return string The requested attribute. + */ + public function getGphotoThumbnail() + { + return $this->_gphotoThumbnail; + } + + /** + * Set the value for this element's gphoto:thumbnail attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Thumbnail The element being modified. + */ + public function setGphotoThumbnail($value) + { + $this->_gphotoThumbnail = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:quotacurrent attribute. + * + * @see setGphotoQuotaCurrent + * @return string The requested attribute. + */ + public function getGphotoQuotaCurrent() + { + return $this->_gphotoQuotaCurrent; + } + + /** + * Set the value for this element's gphoto:quotacurrent attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_QuotaCurrent The element being modified. + */ + public function setGphotoQuotaCurrent($value) + { + $this->_gphotoQuotaCurrent = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:quotalimit attribute. + * + * @see setGphotoQuotaLimit + * @return string The requested attribute. + */ + public function getGphotoQuotaLimit() + { + return $this->_gphotoQuotaLimit; + } + + /** + * Set the value for this element's gphoto:quotalimit attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_QuotaLimit The element being modified. + */ + public function setGphotoQuotaLimit($value) + { + $this->_gphotoQuotaLimit = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:maxPhotosPerAlbum attribute. + * + * @see setGphotoMaxPhotosPerAlbum + * @return string The requested attribute. + */ + public function getGphotoMaxPhotosPerAlbum() + { + return $this->_gphotoMaxPhotosPerAlbum; + } + + /** + * Set the value for this element's gphoto:maxPhotosPerAlbum attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_MaxPhotosPerAlbum The element being modified. + */ + public function setGphotoMaxPhotosPerAlbum($value) + { + $this->_gphotoMaxPhotosPerAlbum = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:user attribute. + * + * @see setGphotoUser + * @return string The requested attribute. + */ + public function getGphotoUser() + { + return $this->_gphotoUser; + } + + /** + * Set the value for this element's gphoto:user attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_User The element being modified. + */ + public function setGphotoUser($value) + { + $this->_gphotoUser = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/UserFeed.php b/lib/zend/Zend/Gdata/Photos/UserFeed.php new file mode 100755 index 0000000000..850a1375c8 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/UserFeed.php @@ -0,0 +1,247 @@ + 'Zend_Gdata_Photos_AlbumEntry', + 'http://schemas.google.com/photos/2007#photo' => 'Zend_Gdata_Photos_PhotoEntry', + 'http://schemas.google.com/photos/2007#comment' => 'Zend_Gdata_Photos_CommentEntry', + 'http://schemas.google.com/photos/2007#tag' => 'Zend_Gdata_Photos_TagEntry' + ); + + public function __construct($element = null) + { + $this->registerAllNamespaces(Zend_Gdata_Photos::$namespaces); + parent::__construct($element); + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gphoto') . ':' . 'user'; + $user = new Zend_Gdata_Photos_Extension_User(); + $user->transferFromDOM($child); + $this->_gphotoUser = $user; + break; + case $this->lookupNamespace('gphoto') . ':' . 'nickname'; + $nickname = new Zend_Gdata_Photos_Extension_Nickname(); + $nickname->transferFromDOM($child); + $this->_gphotoNickname = $nickname; + break; + case $this->lookupNamespace('gphoto') . ':' . 'thumbnail'; + $thumbnail = new Zend_Gdata_Photos_Extension_Thumbnail(); + $thumbnail->transferFromDOM($child); + $this->_gphotoThumbnail = $thumbnail; + break; + case $this->lookupNamespace('atom') . ':' . 'entry': + $entryClassName = $this->_entryClassName; + $tmpEntry = new Zend_Gdata_App_Entry($child); + $categories = $tmpEntry->getCategory(); + foreach ($categories as $category) { + if ($category->scheme == Zend_Gdata_Photos::KIND_PATH && + $this->_entryKindClassMapping[$category->term] != "") { + $entryClassName = $this->_entryKindClassMapping[$category->term]; + break; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Entry is missing kind declaration.'); + } + } + + $newEntry = new $entryClassName($child); + $newEntry->setHttpClient($this->getHttpClient()); + $this->_entry[] = $newEntry; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_gphotoUser != null) { + $element->appendChild($this->_gphotoUser->getDOM($element->ownerDocument)); + } + if ($this->_gphotoNickname != null) { + $element->appendChild($this->_gphotoNickname->getDOM($element->ownerDocument)); + } + if ($this->_gphotoThumbnail != null) { + $element->appendChild($this->_gphotoThumbnail->getDOM($element->ownerDocument)); + } + + return $element; + } + + /** + * Get the value for this element's gphoto:user attribute. + * + * @see setGphotoUser + * @return string The requested attribute. + */ + public function getGphotoUser() + { + return $this->_gphotoUser; + } + + /** + * Set the value for this element's gphoto:user attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_User The element being modified. + */ + public function setGphotoUser($value) + { + $this->_gphotoUser = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:nickname attribute. + * + * @see setGphotoNickname + * @return string The requested attribute. + */ + public function getGphotoNickname() + { + return $this->_gphotoNickname; + } + + /** + * Set the value for this element's gphoto:nickname attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Nickname The element being modified. + */ + public function setGphotoNickname($value) + { + $this->_gphotoNickname = $value; + return $this; + } + + /** + * Get the value for this element's gphoto:thumbnail attribute. + * + * @see setGphotoThumbnail + * @return string The requested attribute. + */ + public function getGphotoThumbnail() + { + return $this->_gphotoThumbnail; + } + + /** + * Set the value for this element's gphoto:thumbnail attribute. + * + * @param string $value The desired value for this attribute. + * @return Zend_Gdata_Photos_Extension_Thumbnail The element being modified. + */ + public function setGphotoThumbnail($value) + { + $this->_gphotoThumbnail = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Photos/UserQuery.php b/lib/zend/Zend/Gdata/Photos/UserQuery.php new file mode 100755 index 0000000000..605505a463 --- /dev/null +++ b/lib/zend/Zend/Gdata/Photos/UserQuery.php @@ -0,0 +1,355 @@ +_projection = $value; + return $this; + } + + /** + * Gets the format of data in returned in Atom feeds. + * + * @see setProjection + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * Set's the type of data returned in queries. Can be either + * 'feed' or 'entry'. Normally, 'feed' will be desired. Default is 'feed'. + * + * @param string $value + * @return Zend_Gdata_Photos_UserQuery Provides a fluent interface + */ + public function setType($value) + { + $this->_type = $value; + return $this; + } + + /** + * Gets the type of data in returned in queries. + * + * @see setType + * @return string type + */ + public function getType() + { + return $this->_type; + } + + /** + * Set the user to query for. When set, this user's feed will be + * returned. If not set or null, the default user's feed will be returned + * instead. + * + * @param string $value The user to retrieve, or null for the default + * user. + */ + public function setUser($value) + { + if ($value !== null) { + $this->_user = $value; + } else { + $this->_user = Zend_Gdata_Photos::DEFAULT_USER; + } + } + + /** + * Get the user which is to be returned. + * + * @see setUser + * @return string The visibility to retrieve. + */ + public function getUser() + { + return $this->_user; + } + + /** + * Set the visibility filter for entries returned. Only entries which + * match this value will be returned. If null or unset, the default + * value will be used instead. + * + * Valid values are 'all' (default), 'public', and 'private'. + * + * @param string $value The visibility to filter by, or null to use the + * default value. + */ + public function setAccess($value) + { + if ($value !== null) { + $this->_params['access'] = $value; + } else { + unset($this->_params['access']); + } + } + + /** + * Get the visibility filter for entries returned. + * + * @see setAccess + * @return string The visibility to filter by, or null for the default + * user. + */ + public function getAccess() + { + return $this->_params['access']; + } + + /** + * Set the tag for entries that are returned. Only entries which + * match this value will be returned. If null or unset, this filter will + * not be applied. + * + * See http://code.google.com/apis/picasaweb/reference.html#Parameters + * for a list of valid values. + * + * @param string $value The tag to filter by, or null if no + * filter is to be applied. + */ + public function setTag($value) + { + if ($value !== null) { + $this->_params['tag'] = $value; + } else { + unset($this->_params['tag']); + } + } + + /** + * Get the tag filter for entries returned. + * + * @see setTag + * @return string The tag to filter by, or null if no filter + * is to be applied. + */ + public function getTag() + { + return $this->_params['tag']; + } + + /** + * Set the kind of entries that are returned. Only entries which + * match this value will be returned. If null or unset, this filter will + * not be applied. + * + * See http://code.google.com/apis/picasaweb/reference.html#Parameters + * for a list of valid values. + * + * @param string $value The kind to filter by, or null if no + * filter is to be applied. + */ + public function setKind($value) + { + if ($value !== null) { + $this->_params['kind'] = $value; + } else { + unset($this->_params['kind']); + } + } + + /** + * Get the kind of entries to be returned. + * + * @see setKind + * @return string The kind to filter by, or null if no filter + * is to be applied. + */ + public function getKind() + { + return $this->_params['kind']; + } + + /** + * Set the maximum image size for entries returned. Only entries which + * match this value will be returned. If null or unset, this filter will + * not be applied. + * + * See http://code.google.com/apis/picasaweb/reference.html#Parameters + * for a list of valid values. + * + * @param string $value The image size to filter by, or null if no + * filter is to be applied. + */ + public function setImgMax($value) + { + if ($value !== null) { + $this->_params['imgmax'] = $value; + } else { + unset($this->_params['imgmax']); + } + } + + /** + * Get the maximum image size filter for entries returned. + * + * @see setImgMax + * @return string The image size size to filter by, or null if no filter + * is to be applied. + */ + public function getImgMax() + { + return $this->_params['imgmax']; + } + + /** + * Set the thumbnail size filter for entries returned. Only entries which + * match this value will be returned. If null or unset, this filter will + * not be applied. + * + * See http://code.google.com/apis/picasaweb/reference.html#Parameters + * for a list of valid values. + * + * @param string $value The thumbnail size to filter by, or null if no + * filter is to be applied. + */ + public function setThumbsize($value) + { + if ($value !== null) { + $this->_params['thumbsize'] = $value; + } else { + unset($this->_params['thumbsize']); + } + } + + /** + * Get the thumbnail size filter for entries returned. + * + * @see setThumbsize + * @return string The thumbnail size to filter by, or null if no filter + * is to be applied. + */ + public function getThumbsize() + { + return $this->_params['thumbsize']; + } + + /** + * Returns the URL generated for this query, based on it's current + * parameters. + * + * @return string A URL generated based on the state of this query. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function getQueryUrl($incomingUri = null) + { + $uri = Zend_Gdata_Photos::PICASA_BASE_URI; + + if ($this->getType() !== null) { + $uri .= '/' . $this->getType(); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Type must be feed or entry, not null'); + } + + if ($this->getProjection() !== null) { + $uri .= '/' . $this->getProjection(); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Projection must not be null'); + } + + if ($this->getUser() !== null) { + $uri .= '/user/' . $this->getUser(); + } else { + // Should never occur due to setter behavior + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'User must not be null'); + } + + $uri .= $incomingUri; + $uri .= $this->getQueryString(); + return $uri; + } + +} diff --git a/lib/zend/Zend/Gdata/Query.php b/lib/zend/Zend/Gdata/Query.php new file mode 100644 index 0000000000..6235244cb0 --- /dev/null +++ b/lib/zend/Zend/Gdata/Query.php @@ -0,0 +1,418 @@ +_url = $url; + } + + /** + * @return string querystring + */ + public function getQueryString() + { + $queryArray = array(); + foreach ($this->_params as $name => $value) { + if (substr($name, 0, 1) == '_') { + continue; + } + $queryArray[] = urlencode($name) . '=' . urlencode($value); + } + if (count($queryArray) > 0) { + return '?' . implode('&', $queryArray); + } else { + return ''; + } + } + + /** + * + */ + public function resetParameters() + { + $this->_params = array(); + } + + /** + * @return string url + */ + public function getQueryUrl() + { + if ($this->_url == null) { + $url = $this->_defaultFeedUri; + } else { + $url = $this->_url; + } + if ($this->getCategory() !== null) { + $url .= '/-/' . $this->getCategory(); + } + $url .= $this->getQueryString(); + return $url; + } + + /** + * @param string $name + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setParam($name, $value) + { + $this->_params[$name] = $value; + return $this; + } + + /** + * @param string $name + */ + public function getParam($name) + { + return $this->_params[$name]; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setAlt($value) + { + if ($value != null) { + $this->_params['alt'] = $value; + } else { + unset($this->_params['alt']); + } + return $this; + } + + /** + * @param int $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setMaxResults($value) + { + if ($value != null) { + $this->_params['max-results'] = $value; + } else { + unset($this->_params['max-results']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setQuery($value) + { + if ($value != null) { + $this->_params['q'] = $value; + } else { + unset($this->_params['q']); + } + return $this; + } + + /** + * @param int $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setStartIndex($value) + { + if ($value != null) { + $this->_params['start-index'] = $value; + } else { + unset($this->_params['start-index']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setUpdatedMax($value) + { + if ($value != null) { + $this->_params['updated-max'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['updated-max']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setUpdatedMin($value) + { + if ($value != null) { + $this->_params['updated-min'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['updated-min']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setPublishedMax($value) + { + if ($value !== null) { + $this->_params['published-max'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['published-max']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setPublishedMin($value) + { + if ($value != null) { + $this->_params['published-min'] = Zend_Gdata_App_Util::formatTimestamp($value); + } else { + unset($this->_params['published-min']); + } + return $this; + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setAuthor($value) + { + if ($value != null) { + $this->_params['author'] = $value; + } else { + unset($this->_params['author']); + } + return $this; + } + + /** + * @return string rss or atom + */ + public function getAlt() + { + if (array_key_exists('alt', $this->_params)) { + return $this->_params['alt']; + } else { + return null; + } + } + + /** + * @return int maxResults + */ + public function getMaxResults() + { + if (array_key_exists('max-results', $this->_params)) { + return intval($this->_params['max-results']); + } else { + return null; + } + } + + /** + * @return string query + */ + public function getQuery() + { + if (array_key_exists('q', $this->_params)) { + return $this->_params['q']; + } else { + return null; + } + } + + /** + * @return int startIndex + */ + public function getStartIndex() + { + if (array_key_exists('start-index', $this->_params)) { + return intval($this->_params['start-index']); + } else { + return null; + } + } + + /** + * @return string updatedMax + */ + public function getUpdatedMax() + { + if (array_key_exists('updated-max', $this->_params)) { + return $this->_params['updated-max']; + } else { + return null; + } + } + + /** + * @return string updatedMin + */ + public function getUpdatedMin() + { + if (array_key_exists('updated-min', $this->_params)) { + return $this->_params['updated-min']; + } else { + return null; + } + } + + /** + * @return string publishedMax + */ + public function getPublishedMax() + { + if (array_key_exists('published-max', $this->_params)) { + return $this->_params['published-max']; + } else { + return null; + } + } + + /** + * @return string publishedMin + */ + public function getPublishedMin() + { + if (array_key_exists('published-min', $this->_params)) { + return $this->_params['published-min']; + } else { + return null; + } + } + + /** + * @return string author + */ + public function getAuthor() + { + if (array_key_exists('author', $this->_params)) { + return $this->_params['author']; + } else { + return null; + } + } + + /** + * @param string $value + * @return Zend_Gdata_Query Provides a fluent interface + */ + public function setCategory($value) + { + $this->_category = $value; + return $this; + } + + /* + * @return string id + */ + public function getCategory() + { + return $this->_category; + } + + + public function __get($name) + { + $method = 'get'.ucfirst($name); + if (method_exists($this, $method)) { + return call_user_func(array(&$this, $method)); + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Property ' . $name . ' does not exist'); + } + } + + public function __set($name, $val) + { + $method = 'set'.ucfirst($name); + if (method_exists($this, $method)) { + return call_user_func(array(&$this, $method), $val); + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Property ' . $name . ' does not exist'); + } + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets.php b/lib/zend/Zend/Gdata/Spreadsheets.php new file mode 100644 index 0000000000..db7a87a57a --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets.php @@ -0,0 +1,445 @@ +registerPackage('Zend_Gdata_Spreadsheets'); + $this->registerPackage('Zend_Gdata_Spreadsheets_Extension'); + parent::__construct($client, $applicationId); + $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME); + $this->_server = 'spreadsheets.google.com'; + } + + /** + * Gets a spreadsheet feed. + * + * @param mixed $location A DocumentQuery or a string URI specifying the feed location. + * @return Zend_Gdata_Spreadsheets_SpreadsheetFeed + */ + public function getSpreadsheetFeed($location = null) + { + if ($location == null) { + $uri = self::SPREADSHEETS_FEED_URI; + } else if ($location instanceof Zend_Gdata_Spreadsheets_DocumentQuery) { + if ($location->getDocumentType() == null) { + $location->setDocumentType('spreadsheets'); + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + + return parent::getFeed($uri, 'Zend_Gdata_Spreadsheets_SpreadsheetFeed'); + } + + /** + * Gets a spreadsheet entry. + * + * @param string $location A DocumentQuery or a URI specifying the entry location. + * @return SpreadsheetEntry + */ + public function getSpreadsheetEntry($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_DocumentQuery) { + if ($location->getDocumentType() == null) { + $location->setDocumentType('spreadsheets'); + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + + return parent::getEntry($uri, 'Zend_Gdata_Spreadsheets_SpreadsheetEntry'); + } + + /** + * Gets a worksheet feed. + * + * @param mixed $location A DocumentQuery, SpreadsheetEntry, or a string URI + * @return Zend_Gdata_Spreadsheets_WorksheetFeed The feed of worksheets + */ + public function getWorksheetFeed($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_DocumentQuery) { + if ($location->getDocumentType() == null) { + $location->setDocumentType('worksheets'); + } + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Spreadsheets_SpreadsheetEntry) { + $uri = $location->getLink(self::WORKSHEETS_FEED_LINK_URI)->href; + } else { + $uri = $location; + } + + return parent::getFeed($uri, 'Zend_Gdata_Spreadsheets_WorksheetFeed'); + } + + /** + * Gets a worksheet entry. + * + * @param string $location A DocumentQuery or a URI specifying the entry location. + * @return WorksheetEntry + */ + public function GetWorksheetEntry($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_DocumentQuery) { + if ($location->getDocumentType() == null) { + $location->setDocumentType('worksheets'); + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + + return parent::getEntry($uri, 'Zend_Gdata_Spreadsheets_WorksheetEntry'); + } + + /** + * Gets a cell feed. + * + * @param string $location A CellQuery, WorksheetEntry or a URI specifying the feed location. + * @return CellFeed + */ + public function getCellFeed($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_CellQuery) { + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Spreadsheets_WorksheetEntry) { + $uri = $location->getLink(self::CELL_FEED_LINK_URI)->href; + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_Spreadsheets_CellFeed'); + } + + /** + * Gets a cell entry. + * + * @param string $location A CellQuery or a URI specifying the entry location. + * @return CellEntry + */ + public function getCellEntry($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_CellQuery) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + + return parent::getEntry($uri, 'Zend_Gdata_Spreadsheets_CellEntry'); + } + + /** + * Gets a list feed. + * + * @param mixed $location A ListQuery, WorksheetEntry or string URI specifying the feed location. + * @return ListFeed + */ + public function getListFeed($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_ListQuery) { + $uri = $location->getQueryUrl(); + } else if ($location instanceof Zend_Gdata_Spreadsheets_WorksheetEntry) { + $uri = $location->getLink(self::LIST_FEED_LINK_URI)->href; + } else { + $uri = $location; + } + + return parent::getFeed($uri, 'Zend_Gdata_Spreadsheets_ListFeed'); + } + + /** + * Gets a list entry. + * + * @param string $location A ListQuery or a URI specifying the entry location. + * @return ListEntry + */ + public function getListEntry($location) + { + if ($location instanceof Zend_Gdata_Spreadsheets_ListQuery) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + + return parent::getEntry($uri, 'Zend_Gdata_Spreadsheets_ListEntry'); + } + + /** + * Updates an existing cell. + * + * @param int $row The row containing the cell to update + * @param int $col The column containing the cell to update + * @param int $inputValue The new value for the cell + * @param string $key The key for the spreadsheet to be updated + * @param string $wkshtId (optional) The worksheet to be updated + * @return CellEntry The updated cell entry. + */ + public function updateCell($row, $col, $inputValue, $key, $wkshtId = 'default') + { + $cell = 'R'.$row.'C'.$col; + + $query = new Zend_Gdata_Spreadsheets_CellQuery(); + $query->setSpreadsheetKey($key); + $query->setWorksheetId($wkshtId); + $query->setCellId($cell); + + $entry = $this->getCellEntry($query); + $entry->setCell(new Zend_Gdata_Spreadsheets_Extension_Cell(null, $row, $col, $inputValue)); + $response = $entry->save(); + return $response; + } + + /** + * Inserts a new row with provided data. + * + * @param array $rowData An array of column header to row data + * @param string $key The key of the spreadsheet to modify + * @param string $wkshtId (optional) The worksheet to modify + * @return ListEntry The inserted row + */ + public function insertRow($rowData, $key, $wkshtId = 'default') + { + $newEntry = new Zend_Gdata_Spreadsheets_ListEntry(); + $newCustomArr = array(); + foreach ($rowData as $k => $v) { + $newCustom = new Zend_Gdata_Spreadsheets_Extension_Custom(); + $newCustom->setText($v)->setColumnName($k); + $newEntry->addCustom($newCustom); + } + + $query = new Zend_Gdata_Spreadsheets_ListQuery(); + $query->setSpreadsheetKey($key); + $query->setWorksheetId($wkshtId); + + $feed = $this->getListFeed($query); + $editLink = $feed->getLink('http://schemas.google.com/g/2005#post'); + + return $this->insertEntry($newEntry->saveXML(), $editLink->href, 'Zend_Gdata_Spreadsheets_ListEntry'); + } + + /** + * Updates an existing row with provided data. + * + * @param ListEntry $entry The row entry to update + * @param array $newRowData An array of column header to row data + */ + public function updateRow($entry, $newRowData) + { + $newCustomArr = array(); + foreach ($newRowData as $k => $v) { + $newCustom = new Zend_Gdata_Spreadsheets_Extension_Custom(); + $newCustom->setText($v)->setColumnName($k); + $newCustomArr[] = $newCustom; + } + $entry->setCustom($newCustomArr); + + return $entry->save(); + } + + /** + * Deletes an existing row . + * + * @param ListEntry $entry The row to delete + */ + public function deleteRow($entry) + { + $entry->delete(); + } + + /** + * Returns the content of all rows as an associative array + * + * @param mixed $location A ListQuery or string URI specifying the feed location. + * @return array An array of rows. Each element of the array is an associative array of data + */ + public function getSpreadsheetListFeedContents($location) + { + $listFeed = $this->getListFeed($location); + $listFeed = $this->retrieveAllEntriesForFeed($listFeed); + $spreadsheetContents = array(); + foreach ($listFeed as $listEntry) { + $rowContents = array(); + $customArray = $listEntry->getCustom(); + foreach ($customArray as $custom) { + $rowContents[$custom->getColumnName()] = $custom->getText(); + } + $spreadsheetContents[] = $rowContents; + } + return $spreadsheetContents; + } + + /** + * Returns the content of all cells as an associative array, indexed + * off the cell location (ie 'A1', 'D4', etc). Each element of + * the array is an associative array with a 'value' and a 'function'. + * Only non-empty cells are returned by default. 'range' is the + * value of the 'range' query parameter specified at: + * http://code.google.com/apis/spreadsheets/reference.html#cells_Parameters + * + * @param mixed $location A CellQuery, WorksheetEntry or a URL (w/o query string) specifying the feed location. + * @param string $range The range of cells to retrieve + * @param boolean $empty Whether to retrieve empty cells + * @return array An associative array of cells + */ + public function getSpreadsheetCellFeedContents($location, $range = null, $empty = false) + { + $cellQuery = null; + if ($location instanceof Zend_Gdata_Spreadsheets_CellQuery) { + $cellQuery = $location; + } else if ($location instanceof Zend_Gdata_Spreadsheets_WorksheetEntry) { + $url = $location->getLink(self::CELL_FEED_LINK_URI)->href; + $cellQuery = new Zend_Gdata_Spreadsheets_CellQuery($url); + } else { + $url = $location; + $cellQuery = new Zend_Gdata_Spreadsheets_CellQuery($url); + } + + if ($range != null) { + $cellQuery->setRange($range); + } + $cellQuery->setReturnEmpty($empty); + + $cellFeed = $this->getCellFeed($cellQuery); + $cellFeed = $this->retrieveAllEntriesForFeed($cellFeed); + $spreadsheetContents = array(); + foreach ($cellFeed as $cellEntry) { + $cellContents = array(); + $cell = $cellEntry->getCell(); + $cellContents['formula'] = $cell->getInputValue(); + $cellContents['value'] = $cell->getText(); + $spreadsheetContents[$cellEntry->getTitle()->getText()] = $cellContents; + } + return $spreadsheetContents; + } + + /** + * Alias for getSpreadsheetFeed + * + * @param mixed $location A DocumentQuery or a string URI specifying the feed location. + * @return Zend_Gdata_Spreadsheets_SpreadsheetFeed + */ + public function getSpreadsheets($location = null) + { + return $this->getSpreadsheetFeed($location = null); + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/CellEntry.php b/lib/zend/Zend/Gdata/Spreadsheets/CellEntry.php new file mode 100644 index 0000000000..e00dc43748 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/CellEntry.php @@ -0,0 +1,103 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_cell != null) { + $element->appendChild($this->_cell->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gs') . ':' . 'cell'; + $cell = new Zend_Gdata_Spreadsheets_Extension_Cell(); + $cell->transferFromDOM($child); + $this->_cell = $cell; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Gets the Cell element of this Cell Entry. + * @return Zend_Gdata_Spreadsheets_Extension_Cell + */ + public function getCell() + { + return $this->_cell; + } + + /** + * Sets the Cell element of this Cell Entry. + * @param $cell Zend_Gdata_Spreadsheets_Extension_Cell $cell + */ + public function setCell($cell) + { + $this->_cell = $cell; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/CellFeed.php b/lib/zend/Zend/Gdata/Spreadsheets/CellFeed.php new file mode 100644 index 0000000000..efc9f35164 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/CellFeed.php @@ -0,0 +1,158 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->rowCount != null) { + $element->appendChild($this->_rowCount->getDOM($element->ownerDocument)); + } + if ($this->colCount != null) { + $element->appendChild($this->_colCount->getDOM($element->ownerDocument)); + } + return $element; + } + + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gs') . ':' . 'rowCount'; + $rowCount = new Zend_Gdata_Spreadsheets_Extension_RowCount(); + $rowCount->transferFromDOM($child); + $this->_rowCount = $rowCount; + break; + case $this->lookupNamespace('gs') . ':' . 'colCount'; + $colCount = new Zend_Gdata_Spreadsheets_Extension_ColCount(); + $colCount->transferFromDOM($child); + $this->_colCount = $colCount; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Gets the row count for this feed. + * @return string The row count for the feed. + */ + public function getRowCount() + { + return $this->_rowCount; + } + + /** + * Gets the column count for this feed. + * @return string The column count for the feed. + */ + public function getColumnCount() + { + return $this->_colCount; + } + + /** + * Sets the row count for this feed. + * @param string $rowCount The new row count for the feed. + */ + public function setRowCount($rowCount) + { + $this->_rowCount = $rowCount; + return $this; + } + + /** + * Sets the column count for this feed. + * @param string $colCount The new column count for the feed. + */ + public function setColumnCount($colCount) + { + $this->_colCount = $colCount; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/CellQuery.php b/lib/zend/Zend/Gdata/Spreadsheets/CellQuery.php new file mode 100644 index 0000000000..0523db07a9 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/CellQuery.php @@ -0,0 +1,417 @@ +_spreadsheetKey = $value; + return $this; + } + + /** + * Gets the spreadsheet key for this query. + * + * @return string spreadsheet key + */ + public function getSpreadsheetKey() + { + return $this->_spreadsheetKey; + } + + /** + * Sets the worksheet id for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setWorksheetId($value) + { + $this->_worksheetId = $value; + return $this; + } + + /** + * Gets the worksheet id for this query. + * + * @return string worksheet id + */ + public function getWorksheetId() + { + return $this->_worksheetId; + } + + /** + * Sets the cell id for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setCellId($value) + { + $this->_cellId = $value; + return $this; + } + + /** + * Gets the cell id for this query. + * + * @return string cell id + */ + public function getCellId() + { + return $this->_cellId; + } + + /** + * Sets the projection for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setProjection($value) + { + $this->_projection = $value; + return $this; + } + + /** + * Sets the visibility for this query. + * + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + /** + * Gets the projection for this query. + * + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * Gets the visibility for this query. + * + * @return string visibility + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * Sets the min-row attribute for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setMinRow($value) + { + if ($value != null) { + $this->_params['min-row'] = $value; + } else { + unset($this->_params['min-row']); + } + return $this; + } + + /** + * Gets the min-row attribute for this query. + * + * @return string min-row + */ + public function getMinRow() + { + if (array_key_exists('min-row', $this->_params)) { + return $this->_params['min-row']; + } else { + return null; + } + } + + /** + * Sets the max-row attribute for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setMaxRow($value) + { + if ($value != null) { + $this->_params['max-row'] = $value; + } else { + unset($this->_params['max-row']); + } + return $this; + } + + /** + * Gets the max-row attribute for this query. + * + * @return string max-row + */ + public function getMaxRow() + { + if (array_key_exists('max-row', $this->_params)) { + return $this->_params['max-row']; + } else { + return null; + } + } + + /** + * Sets the min-col attribute for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setMinCol($value) + { + if ($value != null) { + $this->_params['min-col'] = $value; + } else { + unset($this->_params['min-col']); + } + return $this; + } + + /** + * Gets the min-col attribute for this query. + * + * @return string min-col + */ + public function getMinCol() + { + if (array_key_exists('min-col', $this->_params)) { + return $this->_params['min-col']; + } else { + return null; + } + } + + /** + * Sets the max-col attribute for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setMaxCol($value) + { + if ($value != null) { + $this->_params['max-col'] = $value; + } else { + unset($this->_params['max-col']); + } + return $this; + } + + /** + * Gets the max-col attribute for this query. + * + * @return string max-col + */ + public function getMaxCol() + { + if (array_key_exists('max-col', $this->_params)) { + return $this->_params['max-col']; + } else { + return null; + } + } + + /** + * Sets the range attribute for this query. + * + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setRange($value) + { + if ($value != null) { + $this->_params['range'] = $value; + } else { + unset($this->_params['range']); + } + return $this; + } + + /** + * Gets the range attribute for this query. + * + * @return string range + */ + public function getRange() + { + if (array_key_exists('range', $this->_params)) { + return $this->_params['range']; + } else { + return null; + } + } + + /** + * Sets the return-empty attribute for this query. + * + * @param mixed $value String or bool value for whether to return empty cells + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setReturnEmpty($value) + { + if (is_bool($value)) { + $this->_params['return-empty'] = ($value?'true':'false'); + } else if ($value != null) { + $this->_params['return-empty'] = $value; + } else { + unset($this->_params['return-empty']); + } + return $this; + } + + /** + * Gets the return-empty attribute for this query. + * + * @return string return-empty + */ + public function getReturnEmpty() + { + if (array_key_exists('return-empty', $this->_params)) { + return $this->_params['return-empty']; + } else { + return null; + } + } + + /** + * Gets the full query URL for this query. + * + * @return string url + */ + public function getQueryUrl() + { + if ($this->_url == null) { + $uri = $this->_defaultFeedUri; + + if ($this->_spreadsheetKey != null) { + $uri .= '/'.$this->_spreadsheetKey; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A spreadsheet key must be provided for cell queries.'); + } + + if ($this->_worksheetId != null) { + $uri .= '/'.$this->_worksheetId; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A worksheet id must be provided for cell queries.'); + } + + if ($this->_visibility != null) { + $uri .= '/'.$this->_visibility; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A visibility must be provided for cell queries.'); + } + + if ($this->_projection != null) { + $uri .= '/'.$this->_projection; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A projection must be provided for cell queries.'); + } + + if ($this->_cellId != null) { + $uri .= '/'.$this->_cellId; + } + } else { + $uri = $this->_url; + } + + $uri .= $this->getQueryString(); + return $uri; + } + + /** + * Gets the attribute query string for this query. + * + * @return string query string + */ + public function getQueryString() + { + return parent::getQueryString(); + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/DocumentQuery.php b/lib/zend/Zend/Gdata/Spreadsheets/DocumentQuery.php new file mode 100644 index 0000000000..9965b11c72 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/DocumentQuery.php @@ -0,0 +1,288 @@ +_spreadsheetKey = $value; + return $this; + } + + /** + * Gets the spreadsheet key for this query. + * @return string spreadsheet key + */ + public function getSpreadsheetKey() + { + return $this->_spreadsheetKey; + } + + /** + * Sets the worksheet id for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setWorksheetId($value) + { + $this->_worksheetId = $value; + return $this; + } + + /** + * Gets the worksheet id for this query. + * @return string worksheet id + */ + public function getWorksheetId() + { + return $this->_worksheetId; + } + + /** + * Sets the document type for this query. + * @param string $value spreadsheets or worksheets + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setDocumentType($value) + { + $this->_documentType = $value; + return $this; + } + + /** + * Gets the document type for this query. + * @return string document type + */ + public function getDocumentType() + { + return $this->_documentType; + } + + /** + * Sets the projection for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setProjection($value) + { + $this->_projection = $value; + return $this; + } + + /** + * Sets the visibility for this query. + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + /** + * Gets the projection for this query. + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * Gets the visibility for this query. + * @return string visibility + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * Sets the title attribute for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setTitle($value) + { + if ($value != null) { + $this->_params['title'] = $value; + } else { + unset($this->_params['title']); + } + return $this; + } + + /** + * Sets the title-exact attribute for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setTitleExact($value) + { + if ($value != null) { + $this->_params['title-exact'] = $value; + } else { + unset($this->_params['title-exact']); + } + return $this; + } + + /** + * Gets the title attribute for this query. + * @return string title + */ + public function getTitle() + { + if (array_key_exists('title', $this->_params)) { + return $this->_params['title']; + } else { + return null; + } + } + + /** + * Gets the title-exact attribute for this query. + * @return string title-exact + */ + public function getTitleExact() + { + if (array_key_exists('title-exact', $this->_params)) { + return $this->_params['title-exact']; + } else { + return null; + } + } + + private function appendVisibilityProjection() + { + $uri = ''; + + if ($this->_visibility != null) { + $uri .= '/'.$this->_visibility; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A visibility must be provided for document queries.'); + } + + if ($this->_projection != null) { + $uri .= '/'.$this->_projection; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A projection must be provided for document queries.'); + } + + return $uri; + } + + + /** + * Gets the full query URL for this query. + * @return string url + */ + public function getQueryUrl() + { + $uri = $this->_defaultFeedUri; + + if ($this->_documentType != null) { + $uri .= '/'.$this->_documentType; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A document type must be provided for document queries.'); + } + + if ($this->_documentType == 'spreadsheets') { + $uri .= $this->appendVisibilityProjection(); + if ($this->_spreadsheetKey != null) { + $uri .= '/'.$this->_spreadsheetKey; + } + } else if ($this->_documentType == 'worksheets') { + if ($this->_spreadsheetKey != null) { + $uri .= '/'.$this->_spreadsheetKey; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A spreadsheet key must be provided for worksheet document queries.'); + } + $uri .= $this->appendVisibilityProjection(); + if ($this->_worksheetId != null) { + $uri .= '/'.$this->_worksheetId; + } + } + + $uri .= $this->getQueryString(); + return $uri; + } + + /** + * Gets the attribute query string for this query. + * @return string query string + */ + public function getQueryString() + { + return parent::getQueryString(); + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/Extension/Cell.php b/lib/zend/Zend/Gdata/Spreadsheets/Extension/Cell.php new file mode 100644 index 0000000000..8286080297 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/Extension/Cell.php @@ -0,0 +1,201 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct(); + $this->_text = $text; + $this->_row = $row; + $this->_col = $col; + $this->_inputValue = $inputValue; + $this->_numericValue = $numericValue; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + $element->setAttribute('row', $this->_row); + $element->setAttribute('col', $this->_col); + if ($this->_inputValue) $element->setAttribute('inputValue', $this->_inputValue); + if ($this->_numericValue) $element->setAttribute('numericValue', $this->_numericValue); + return $element; + } + + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'row': + $this->_row = $attribute->nodeValue; + break; + case 'col': + $this->_col = $attribute->nodeValue; + break; + case 'inputValue': + $this->_inputValue = $attribute->nodeValue; + break; + case 'numericValue': + $this->_numericValue = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Gets the row attribute of the Cell element. + * @return string Row of the Cell. + */ + public function getRow() + { + return $this->_row; + } + + /** + * Gets the column attribute of the Cell element. + * @return string Column of the Cell. + */ + public function getColumn() + { + return $this->_col; + } + + /** + * Gets the input value attribute of the Cell element. + * @return string Input value of the Cell. + */ + public function getInputValue() + { + return $this->_inputValue; + } + + /** + * Gets the numeric value attribute of the Cell element. + * @return string Numeric value of the Cell. + */ + public function getNumericValue() + { + return $this->_numericValue; + } + + /** + * Sets the row attribute of the Cell element. + * @param string $row New row of the Cell. + */ + public function setRow($row) + { + $this->_row = $row; + return $this; + } + + /** + * Sets the column attribute of the Cell element. + * @param string $col New column of the Cell. + */ + public function setColumn($col) + { + $this->_col = $col; + return $this; + } + + /** + * Sets the input value attribute of the Cell element. + * @param string $inputValue New input value of the Cell. + */ + public function setInputValue($inputValue) + { + $this->_inputValue = $inputValue; + return $this; + } + + /** + * Sets the numeric value attribute of the Cell element. + * @param string $numericValue New numeric value of the Cell. + */ + public function setNumericValue($numericValue) + { + $this->_numericValue = $numericValue; + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/Extension/ColCount.php b/lib/zend/Zend/Gdata/Spreadsheets/Extension/ColCount.php new file mode 100644 index 0000000000..8827bb27ed --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/Extension/ColCount.php @@ -0,0 +1,59 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct(); + $this->_text = $text; + } +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/Extension/Custom.php b/lib/zend/Zend/Gdata/Spreadsheets/Extension/Custom.php new file mode 100644 index 0000000000..09d42a2a6b --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/Extension/Custom.php @@ -0,0 +1,100 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct(); + $this->_text = $value; + $this->_rootElement = $column; + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + return $element; + } + + /** + * Transfers each child and attribute into member variables. + * This is called when XML is received over the wire and the data + * model needs to be built to represent this XML. + * + * @param DOMNode $node The DOMNode that represents this object's data + */ + public function transferFromDOM($node) + { + parent::transferFromDOM($node); + $this->_rootElement = $node->localName; + } + + /** + * Sets the column/tag name of the element. + * @param string $column The new column name. + */ + public function setColumnName($column) + { + $this->_rootElement = $column; + return $this; + } + + /** + * Gets the column name of the element + * @return string The column name. + */ + public function getColumnName() + { + return $this->_rootElement; + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/Extension/RowCount.php b/lib/zend/Zend/Gdata/Spreadsheets/Extension/RowCount.php new file mode 100644 index 0000000000..2408deb2c7 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/Extension/RowCount.php @@ -0,0 +1,60 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/ListEntry.php b/lib/zend/Zend/Gdata/Spreadsheets/ListEntry.php new file mode 100644 index 0000000000..2626e14645 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/ListEntry.php @@ -0,0 +1,208 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if (!empty($this->_custom)) { + foreach ($this->_custom as $custom) { + $element->appendChild($custom->getDOM($element->ownerDocument)); + } + } + return $element; + } + + protected function takeChildFromDOM($child) + { + switch ($child->namespaceURI) { + case $this->lookupNamespace('gsx'); + $custom = new Zend_Gdata_Spreadsheets_Extension_Custom($child->localName); + $custom->transferFromDOM($child); + $this->addCustom($custom); + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Gets the row elements contained by this list entry. + * @return array The custom row elements in this list entry + */ + public function getCustom() + { + return $this->_custom; + } + + /** + * Gets a single row element contained by this list entry using its name. + * @param string $name The name of a custom element to return. If null + * or not defined, an array containing all custom elements + * indexed by name will be returned. + * @return mixed If a name is specified, the + * Zend_Gdata_Spreadsheets_Extension_Custom element requested, + * is returned or null if not found. Otherwise, an array of all + * Zend_Gdata_Spreadsheets_Extension_Custom elements is returned + * indexed by name. + */ + public function getCustomByName($name = null) + { + if ($name === null) { + return $this->_customByName; + } else { + if (array_key_exists($name, $this->customByName)) { + return $this->_customByName[$name]; + } else { + return null; + } + } + } + + /** + * Sets the row elements contained by this list entry. If any + * custom row elements were previously stored, they will be overwritten. + * @param array $custom The custom row elements to be contained in this + * list entry. + * @return Zend_Gdata_Spreadsheets_ListEntry Provides a fluent interface. + */ + public function setCustom($custom) + { + $this->_custom = array(); + foreach ($custom as $c) { + $this->addCustom($c); + } + return $this; + } + + /** + * Add an individual custom row element to this list entry. + * @param Zend_Gdata_Spreadsheets_Extension_Custom $custom The custom + * element to be added. + * @return Zend_Gdata_Spreadsheets_ListEntry Provides a fluent interface. + */ + public function addCustom($custom) + { + $this->_custom[] = $custom; + $this->_customByName[$custom->getColumnName()] = $custom; + return $this; + } + + /** + * Remove an individual row element from this list entry by index. This + * will cause the array to be re-indexed. + * @param int $index The index of the custom element to be deleted. + * @return Zend_Gdata_Spreadsheets_ListEntry Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function removeCustom($index) + { + if (array_key_exists($index, $this->_custom)) { + $element = $this->_custom[$index]; + // Remove element + unset($this->_custom[$index]); + // Re-index the array + $this->_custom = array_values($this->_custom); + // Be sure to delete form both arrays! + $key = array_search($element, $this->_customByName); + unset($this->_customByName[$key]); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Element does not exist.'); + } + return $this; + } + + /** + * Remove an individual row element from this list entry by name. + * @param string $name The name of the custom element to be deleted. + * @return Zend_Gdata_Spreadsheets_ListEntry Provides a fluent interface. + * @throws Zend_Gdata_App_InvalidArgumentException + */ + public function removeCustomByName($name) + { + if (array_key_exists($name, $this->_customByName)) { + $element = $this->_customByName[$name]; + // Remove element + unset($this->_customByName[$name]); + // Be sure to delete from both arrays! + $key = array_search($element, $this->_custom); + unset($this->_custom[$key]); + } else { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Element does not exist.'); + } + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/ListFeed.php b/lib/zend/Zend/Gdata/Spreadsheets/ListFeed.php new file mode 100644 index 0000000000..a67fcc2f45 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/ListFeed.php @@ -0,0 +1,64 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/ListQuery.php b/lib/zend/Zend/Gdata/Spreadsheets/ListQuery.php new file mode 100644 index 0000000000..e8204f20c2 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/ListQuery.php @@ -0,0 +1,305 @@ +_spreadsheetKey = $value; + return $this; + } + + /** + * Gets the spreadsheet key for the query. + * @return string spreadsheet key + */ + public function getSpreadsheetKey() + { + return $this->_spreadsheetKey; + } + + /** + * Sets the worksheet id for the query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setWorksheetId($value) + { + $this->_worksheetId = $value; + return $this; + } + + /** + * Gets the worksheet id for the query. + * @return string worksheet id + */ + public function getWorksheetId() + { + return $this->_worksheetId; + } + + /** + * Sets the row id for the query. + * @param string $value row id + * @return Zend_Gdata_Spreadsheets_CellQuery Provides a fluent interface + */ + public function setRowId($value) + { + $this->_rowId = $value; + return $this; + } + + /** + * Gets the row id for the query. + * @return string row id + */ + public function getRowId() + { + return $this->_rowId; + } + + /** + * Sets the projection for the query. + * @param string $value Projection + * @return Zend_Gdata_Spreadsheets_ListQuery Provides a fluent interface + */ + public function setProjection($value) + { + $this->_projection = $value; + return $this; + } + + /** + * Sets the visibility for this query. + * @param string $value visibility + * @return Zend_Gdata_Spreadsheets_ListQuery Provides a fluent interface + */ + public function setVisibility($value) + { + $this->_visibility = $value; + return $this; + } + + /** + * Gets the projection for this query. + * @return string projection + */ + public function getProjection() + { + return $this->_projection; + } + + /** + * Gets the visibility for this query. + * @return string visibility + */ + public function getVisibility() + { + return $this->_visibility; + } + + /** + * Sets the spreadsheet key for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setSpreadsheetQuery($value) + { + if ($value != null) { + $this->_params['sq'] = $value; + } else { + unset($this->_params['sq']); + } + return $this; + } + + /** + * Gets the spreadsheet key for this query. + * @return string spreadsheet query + */ + public function getSpreadsheetQuery() + { + if (array_key_exists('sq', $this->_params)) { + return $this->_params['sq']; + } else { + return null; + } + } + + /** + * Sets the orderby attribute for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setOrderBy($value) + { + if ($value != null) { + $this->_params['orderby'] = $value; + } else { + unset($this->_params['orderby']); + } + return $this; + } + + /** + * Gets the orderby attribute for this query. + * @return string orderby + */ + public function getOrderBy() + { + if (array_key_exists('orderby', $this->_params)) { + return $this->_params['orderby']; + } else { + return null; + } + } + + /** + * Sets the reverse attribute for this query. + * @param string $value + * @return Zend_Gdata_Spreadsheets_DocumentQuery Provides a fluent interface + */ + public function setReverse($value) + { + if ($value != null) { + $this->_params['reverse'] = $value; + } else { + unset($this->_params['reverse']); + } + return $this; + } + + /** + * Gets the reverse attribute for this query. + * @return string reverse + */ + public function getReverse() + { + + + if (array_key_exists('reverse', $this->_params)) { + return $this->_params['reverse']; + } else { + return null; + } + } + + /** + * Gets the full query URL for this query. + * @return string url + */ + public function getQueryUrl() + { + + $uri = $this->_defaultFeedUri; + + if ($this->_spreadsheetKey != null) { + $uri .= '/'.$this->_spreadsheetKey; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A spreadsheet key must be provided for list queries.'); + } + + if ($this->_worksheetId != null) { + $uri .= '/'.$this->_worksheetId; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A worksheet id must be provided for list queries.'); + } + + if ($this->_visibility != null) { + $uri .= '/'.$this->_visibility; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A visibility must be provided for list queries.'); + } + + if ($this->_projection != null) { + $uri .= '/'.$this->_projection; + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('A projection must be provided for list queries.'); + } + + if ($this->_rowId != null) { + $uri .= '/'.$this->_rowId; + } + + $uri .= $this->getQueryString(); + return $uri; + } + + /** + * Gets the attribute query string for this query. + * @return string query string + */ + public function getQueryString() + { + return parent::getQueryString(); + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/SpreadsheetEntry.php b/lib/zend/Zend/Gdata/Spreadsheets/SpreadsheetEntry.php new file mode 100644 index 0000000000..a7fc3eb99c --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/SpreadsheetEntry.php @@ -0,0 +1,64 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct($element); + } + + /** + * Returns the worksheets in this spreadsheet + * + * @return Zend_Gdata_Spreadsheets_WorksheetFeed The worksheets + */ + public function getWorksheets() + { + $service = new Zend_Gdata_Spreadsheets($this->getHttpClient()); + return $service->getWorksheetFeed($this); + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/SpreadsheetFeed.php b/lib/zend/Zend/Gdata/Spreadsheets/SpreadsheetFeed.php new file mode 100644 index 0000000000..db14177ad1 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/SpreadsheetFeed.php @@ -0,0 +1,64 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/WorksheetEntry.php b/lib/zend/Zend/Gdata/Spreadsheets/WorksheetEntry.php new file mode 100644 index 0000000000..dba8880490 --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/WorksheetEntry.php @@ -0,0 +1,187 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_rowCount != null) { + $element->appendChild($this->_rowCount->getDOM($element->ownerDocument)); + } + if ($this->_colCount != null) { + $element->appendChild($this->_colCount->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gs') . ':' . 'rowCount'; + $rowCount = new Zend_Gdata_Spreadsheets_Extension_RowCount(); + $rowCount->transferFromDOM($child); + $this->_rowCount = $rowCount; + break; + case $this->lookupNamespace('gs') . ':' . 'colCount'; + $colCount = new Zend_Gdata_Spreadsheets_Extension_ColCount(); + $colCount->transferFromDOM($child); + $this->_colCount = $colCount; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + + /** + * Gets the row count for this entry. + * + * @return string The row count for the entry. + */ + public function getRowCount() + { + return $this->_rowCount; + } + + /** + * Gets the column count for this entry. + * + * @return string The column count for the entry. + */ + public function getColumnCount() + { + return $this->_colCount; + } + + /** + * Sets the row count for this entry. + * + * @param string $rowCount The new row count for the entry. + */ + public function setRowCount($rowCount) + { + $this->_rowCount = $rowCount; + return $this; + } + + /** + * Sets the column count for this entry. + * + * @param string $colCount The new column count for the entry. + */ + public function setColumnCount($colCount) + { + $this->_colCount = $colCount; + return $this; + } + + /** + * Returns the content of all rows as an associative array + * + * @return array An array of rows. Each element of the array is an associative array of data + */ + public function getContentsAsRows() + { + $service = new Zend_Gdata_Spreadsheets($this->getHttpClient()); + return $service->getSpreadsheetListFeedContents($this); + } + + /** + * Returns the content of all cells as an associative array, indexed + * off the cell location (ie 'A1', 'D4', etc). Each element of + * the array is an associative array with a 'value' and a 'function'. + * Only non-empty cells are returned by default. 'range' is the + * value of the 'range' query parameter specified at: + * http://code.google.com/apis/spreadsheets/reference.html#cells_Parameters + * + * @param string $range The range of cells to retrieve + * @param boolean $empty Whether to retrieve empty cells + * @return array An associative array of cells + */ + public function getContentsAsCells($range = null, $empty = false) + { + $service = new Zend_Gdata_Spreadsheets($this->getHttpClient()); + return $service->getSpreadsheetCellFeedContents($this, $range, $empty); + } + +} diff --git a/lib/zend/Zend/Gdata/Spreadsheets/WorksheetFeed.php b/lib/zend/Zend/Gdata/Spreadsheets/WorksheetFeed.php new file mode 100644 index 0000000000..c950f8a40e --- /dev/null +++ b/lib/zend/Zend/Gdata/Spreadsheets/WorksheetFeed.php @@ -0,0 +1,64 @@ +registerAllNamespaces(Zend_Gdata_Spreadsheets::$namespaces); + parent::__construct($element); + } + + /** + * The classname for individual feed elements. + * + * @var string + */ + protected $_entryClassName = 'Zend_Gdata_Spreadsheets_WorksheetEntry'; + + /** + * The classname for the feed. + * + * @var string + */ + protected $_feedClassName = 'Zend_Gdata_Spreadsheets_WorksheetFeed'; + +} diff --git a/lib/zend/Zend/Gdata/YouTube.php b/lib/zend/Zend/Gdata/YouTube.php new file mode 100644 index 0000000000..f7be0b73d9 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube.php @@ -0,0 +1,874 @@ +registerPackage('Zend_Gdata_YouTube'); + $this->registerPackage('Zend_Gdata_YouTube_Extension'); + $this->registerPackage('Zend_Gdata_Media'); + $this->registerPackage('Zend_Gdata_Media_Extension'); + + // NOTE This constructor no longer calls the parent constructor + $this->setHttpClient($client, $applicationId, $clientId, $developerKey); + } + + /** + * Set the Zend_Http_Client object used for communication + * + * @param Zend_Http_Client $client The client to use for communication + * @throws Zend_Gdata_App_HttpException + * @return Zend_Gdata_App Provides a fluent interface + */ + public function setHttpClient($client, + $applicationId = 'MyCompany-MyApp-1.0', $clientId = null, + $developerKey = null) + { + if ($client === null) { + $client = new Zend_Http_Client(); + } + if (!$client instanceof Zend_Http_Client) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException( + 'Argument is not an instance of Zend_Http_Client.'); + } + + if ($clientId != null) { + $client->setHeaders('X-GData-Client', $clientId); + } + + if ($developerKey != null) { + $client->setHeaders('X-GData-Key', 'key='. $developerKey); + } + + return parent::setHttpClient($client, $applicationId); + } + + /** + * Retrieves a feed of videos. + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getVideoFeed($location = null) + { + if ($location == null) { + $uri = self::VIDEO_URI; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a specific video entry. + * + * @param mixed $videoId The ID of the video to retrieve. + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined. + * @param boolean $fullEntry (optional) Retrieve the full metadata for the + * entry. Only possible if entry belongs to currently authenticated + * user. An exception will be thrown otherwise. + * @throws Zend_Gdata_App_HttpException + * @return Zend_Gdata_YouTube_VideoEntry The video entry found at the + * specified URL. + */ + public function getVideoEntry($videoId = null, $location = null, + $fullEntry = false) + { + if ($videoId !== null) { + if ($fullEntry) { + return $this->getFullVideoEntry($videoId); + } else { + $uri = self::VIDEO_URI . "/" . $videoId; + } + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_YouTube_VideoEntry'); + } + + /** + * Retrieves a video entry from the user's upload feed. + * + * @param mixed $videoID The ID of the video to retrieve. + * @throws Zend_Gdata_App_HttpException + * @return Zend_Gdata_YouTube_VideoEntry|null The video entry to be + * retrieved, or null if it was not found or the user requesting it + * did not have the appropriate permissions. + */ + public function getFullVideoEntry($videoId) + { + $uri = self::USER_URI . "/default/" . + self::UPLOADS_URI_SUFFIX . "/$videoId"; + return parent::getEntry($uri, 'Zend_Gdata_YouTube_VideoEntry'); + } + + /** + * Retrieves a feed of videos related to the specified video ID. + * + * @param string $videoId The videoId of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getRelatedVideoFeed($videoId = null, $location = null) + { + if ($videoId !== null) { + $uri = self::VIDEO_URI . "/" . $videoId . "/" . + self::RELATED_URI_SUFFIX; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a feed of video responses related to the specified video ID. + * + * @param string $videoId The videoId of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getVideoResponseFeed($videoId = null, $location = null) + { + if ($videoId !== null) { + $uri = self::VIDEO_URI . "/" . $videoId . "/" . + self::RESPONSES_URI_SUFFIX; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a feed of comments related to the specified video ID. + * + * @param string $videoId The videoId of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_CommentFeed The feed of videos found at the + * specified URL. + */ + public function getVideoCommentFeed($videoId = null, $location = null) + { + if ($videoId !== null) { + $uri = self::VIDEO_URI . "/" . $videoId . "/comments"; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_CommentFeed'); + } + + /** + * Retrieves a feed of comments related to the specified video ID. + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_CommentFeed The feed of videos found at the + * specified URL. + */ + public function getTopRatedVideoFeed($location = null) + { + $standardFeedUri = self::STANDARD_TOP_RATED_URI; + + if ($this->getMajorProtocolVersion() == 2) { + $standardFeedUri = self::STANDARD_TOP_RATED_URI_V2; + } + + if ($location == null) { + $uri = $standardFeedUri; + } else if ($location instanceof Zend_Gdata_Query) { + if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { + if (!isset($location->url)) { + $location->setFeedType('top rated'); + } + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + + /** + * Retrieves a feed of the most viewed videos. + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getMostViewedVideoFeed($location = null) + { + $standardFeedUri = self::STANDARD_MOST_VIEWED_URI; + + if ($this->getMajorProtocolVersion() == 2) { + $standardFeedUri = self::STANDARD_MOST_VIEWED_URI_V2; + } + + if ($location == null) { + $uri = $standardFeedUri; + } else if ($location instanceof Zend_Gdata_Query) { + if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { + if (!isset($location->url)) { + $location->setFeedType('most viewed'); + } + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a feed of recently featured videos. + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getRecentlyFeaturedVideoFeed($location = null) + { + $standardFeedUri = self::STANDARD_RECENTLY_FEATURED_URI; + + if ($this->getMajorProtocolVersion() == 2) { + $standardFeedUri = self::STANDARD_RECENTLY_FEATURED_URI_V2; + } + + if ($location == null) { + $uri = $standardFeedUri; + } else if ($location instanceof Zend_Gdata_Query) { + if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { + if (!isset($location->url)) { + $location->setFeedType('recently featured'); + } + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a feed of videos recently featured for mobile devices. + * These videos will have RTSP links in the $entry->mediaGroup->content + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the + * specified URL. + */ + public function getWatchOnMobileVideoFeed($location = null) + { + $standardFeedUri = self::STANDARD_WATCH_ON_MOBILE_URI; + + if ($this->getMajorProtocolVersion() == 2) { + $standardFeedUri = self::STANDARD_WATCH_ON_MOBILE_URI_V2; + } + + if ($location == null) { + $uri = $standardFeedUri; + } else if ($location instanceof Zend_Gdata_Query) { + if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { + if (!isset($location->url)) { + $location->setFeedType('watch on mobile'); + } + } + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a feed which lists a user's playlist + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_PlaylistListFeed The feed of playlists + */ + public function getPlaylistListFeed($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user . '/playlists'; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_PlaylistListFeed'); + } + + /** + * Retrieves a feed of videos in a particular playlist + * + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_PlaylistVideoFeed The feed of videos found at + * the specified URL. + */ + public function getPlaylistVideoFeed($location) + { + if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_PlaylistVideoFeed'); + } + + /** + * Retrieves a feed of a user's subscriptions + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_SubscriptionListFeed The feed of subscriptions + */ + public function getSubscriptionFeed($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user . '/subscriptions'; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_SubscriptionFeed'); + } + + /** + * Retrieves a feed of a user's contacts + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_ContactFeed The feed of contacts + */ + public function getContactFeed($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user . '/contacts'; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_ContactFeed'); + } + + /** + * Retrieves a user's uploads + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The videos uploaded by the user + */ + public function getUserUploads($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user . '/' . + self::UPLOADS_URI_SUFFIX; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a user's favorites + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_VideoFeed The videos favorited by the user + */ + public function getUserFavorites($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user . '/' . + self::FAVORITES_URI_SUFFIX; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); + } + + /** + * Retrieves a user's profile as an entry + * + * @param string $user (optional) The username of interest + * @param mixed $location (optional) The URL to query or a + * Zend_Gdata_Query object from which a URL can be determined + * @return Zend_Gdata_YouTube_UserProfileEntry The user profile entry + */ + public function getUserProfile($user = null, $location = null) + { + if ($user !== null) { + $uri = self::USER_URI . '/' . $user; + } else if ($location instanceof Zend_Gdata_Query) { + $uri = $location->getQueryUrl(); + } else { + $uri = $location; + } + return parent::getEntry($uri, 'Zend_Gdata_YouTube_UserProfileEntry'); + } + + /** + * Helper function for parsing a YouTube token response + * + * @param string $response The service response + * @throws Zend_Gdata_App_Exception + * @return array An array containing the token and URL + */ + public static function parseFormUploadTokenResponse($response) + { + // Load the feed as an XML DOMDocument object + @ini_set('track_errors', 1); + $doc = new DOMDocument(); + $success = @$doc->loadXML($response); + @ini_restore('track_errors'); + + if (!$success) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + "Zend_Gdata_YouTube::parseFormUploadTokenResponse - " . + "DOMDocument cannot parse XML: $php_errormsg"); + } + $responseElement = $doc->getElementsByTagName('response')->item(0); + + $urlText = null; + $tokenText = null; + if ($responseElement != null) { + $urlElement = + $responseElement->getElementsByTagName('url')->item(0); + $tokenElement = + $responseElement->getElementsByTagName('token')->item(0); + + if ($urlElement && $urlElement->hasChildNodes() && + $tokenElement && $tokenElement->hasChildNodes()) { + + $urlText = $urlElement->firstChild->nodeValue; + $tokenText = $tokenElement->firstChild->nodeValue; + } + } + + if ($tokenText != null && $urlText != null) { + return array('token' => $tokenText, 'url' => $urlText); + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Form upload token not found in response'); + } + } + + /** + * Retrieves a YouTube token + * + * @param Zend_Gdata_YouTube_VideoEntry $videoEntry The video entry + * @param string $url The location as a string URL + * @throws Zend_Gdata_App_Exception + * @return array An array containing a token and URL + */ + public function getFormUploadToken($videoEntry, + $url='http://gdata.youtube.com/action/GetUploadToken') + { + if ($url != null && is_string($url)) { + // $response is a Zend_Http_response object + $response = $this->post($videoEntry, $url); + return self::parseFormUploadTokenResponse($response->getBody()); + } else { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Url must be provided as a string URL'); + } + } + + /** + * Retrieves the activity feed for users + * + * @param mixed $usernames A string identifying the usernames for which to + * retrieve activity for. This can also be a Zend_Gdata_Query + * object from which a URL can be determined. + * @throws Zend_Gdata_App_VersionException if using version less than 2. + * @return Zend_Gdata_YouTube_ActivityFeed + */ + public function getActivityForUser($username) + { + if ($this->getMajorProtocolVersion() == 1) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('User activity feeds ' . + 'are not available in API version 1.'); + } + + $uri = null; + if ($username instanceof Zend_Gdata_Query) { + $uri = $username->getQueryUrl(); + } else { + if (count(explode(',', $username)) > + self::ACTIVITY_FEED_MAX_USERS) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Activity feed can only retrieve for activity for up to ' . + self::ACTIVITY_FEED_MAX_USERS . ' users per request'); + } + $uri = self::ACTIVITY_FEED_URI . '?author=' . $username; + } + + return parent::getFeed($uri, 'Zend_Gdata_YouTube_ActivityFeed'); + } + + /** + * Retrieve the activity of the currently authenticated users friend. + * + * @throws Zend_Gdata_App_Exception if not logged in. + * @return Zend_Gdata_YouTube_ActivityFeed + */ + public function getFriendActivityForCurrentUser() + { + if (!$this->isAuthenticated()) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('You must be authenticated to ' . + 'use the getFriendActivityForCurrentUser function in Zend_' . + 'Gdata_YouTube.'); + } + return parent::getFeed(self::FRIEND_ACTIVITY_FEED_URI, + 'Zend_Gdata_YouTube_ActivityFeed'); + } + + /** + * Retrieve a feed of messages in the currently authenticated user's inbox. + * + * @throws Zend_Gdata_App_Exception if not logged in. + * @return Zend_Gdata_YouTube_InboxFeed|null + */ + public function getInboxFeedForCurrentUser() + { + if (!$this->isAuthenticated()) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('You must be authenticated to ' . + 'use the getInboxFeedForCurrentUser function in Zend_' . + 'Gdata_YouTube.'); + } + + return parent::getFeed(self::INBOX_FEED_URI, + 'Zend_Gdata_YouTube_InboxFeed'); + } + + /** + * Send a video message. + * + * Note: Either a Zend_Gdata_YouTube_VideoEntry or a valid video ID must + * be provided. + * + * @param string $body The body of the message + * @param Zend_Gdata_YouTube_VideoEntry (optional) The video entry to send + * @param string $videoId The id of the video to send + * @param string $recipientUserName The username of the recipient + * @throws Zend_Gdata_App_InvalidArgumentException if no valid + * Zend_Gdata_YouTube_VideoEntry or videoId were provided + * @return Zend_Gdata_YouTube_InboxEntry|null The + * Zend_Gdata_YouTube_Inbox_Entry representing the sent message. + * + */ + public function sendVideoMessage($body, $videoEntry = null, + $videoId = null, $recipientUserName) + { + if (!$videoId && !$videoEntry) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Expecting either a valid videoID or a videoEntry object in ' . + 'Zend_Gdata_YouTube->sendVideoMessage().'); + } + + $messageEntry = new Zend_Gdata_YouTube_InboxEntry(); + + if ($this->getMajorProtocolVersion() == null || + $this->getMajorProtocolVersion() == 1) { + + if (!$videoId) { + $videoId = $videoEntry->getVideoId(); + } elseif (strlen($videoId) < 12) { + //Append the full URI + $videoId = self::VIDEO_URI . '/' . $videoId; + } + + $messageEntry->setId($this->newId($videoId)); + // TODO there seems to be a bug where v1 inbox entries dont + // retain their description... + $messageEntry->setDescription( + new Zend_Gdata_YouTube_Extension_Description($body)); + + } else { + if (!$videoId) { + $videoId = $videoEntry->getVideoId(); + $videoId = substr($videoId, strrpos($videoId, ':')); + } + $messageEntry->setId($this->newId($videoId)); + $messageEntry->setSummary($this->newSummary($body)); + } + + $insertUrl = 'http://gdata.youtube.com/feeds/api/users/' . + $recipientUserName . '/inbox'; + $response = $this->insertEntry($messageEntry, $insertUrl, + 'Zend_Gdata_YouTube_InboxEntry'); + return $response; + } + + /** + * Post a comment in reply to an existing comment + * + * @param $commentEntry Zend_Gdata_YouTube_CommentEntry The comment entry + * to reply to + * @param $commentText string The text of the comment to post + * @return A Zend_Gdata_YouTube_CommentEntry representing the posted + * comment + */ + public function replyToCommentEntry($commentEntry, $commentText) + { + $newComment = $this->newCommentEntry(); + $newComment->content = $this->newContent()->setText($commentText); + $commentId = $commentEntry->getId(); + $commentIdArray = explode(':', $commentId); + + // create a new link element + $inReplyToLinkHref = self::VIDEO_URI . '/' . $commentIdArray[3] . + '/comments/' . $commentIdArray[5]; + $inReplyToLink = $this->newLink($inReplyToLinkHref, + self::IN_REPLY_TO_SCHEME, $type="application/atom+xml"); + $links = $newComment->getLink(); + $links[] = $inReplyToLink; + $newComment->setLink($links); + $commentFeedPostUrl = self::VIDEO_URI . '/' . $commentIdArray[3] . + '/comments'; + return $this->insertEntry($newComment, + $commentFeedPostUrl, 'Zend_Gdata_YouTube_CommentEntry'); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/ActivityEntry.php b/lib/zend/Zend/Gdata/YouTube/ActivityEntry.php new file mode 100644 index 0000000000..a67d6df5fb --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/ActivityEntry.php @@ -0,0 +1,232 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_videoId !== null) { + $element->appendChild($this->_videoId->getDOM( + $element->ownerDocument)); + } + if ($this->_username !== null) { + $element->appendChild($this->_username->getDOM( + $element->ownerDocument)); + } + if ($this->_rating !== null) { + $element->appendChild($this->_rating->getDOM( + $element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'videoid': + $videoId = new Zend_Gdata_YouTube_Extension_VideoId(); + $videoId->transferFromDOM($child); + $this->_videoId = $videoId; + break; + case $this->lookupNamespace('yt') . ':' . 'username': + $username = new Zend_Gdata_YouTube_Extension_Username(); + $username->transferFromDOM($child); + $this->_username = $username; + break; + case $this->lookupNamespace('gd') . ':' . 'rating': + $rating = new Zend_Gdata_Extension_Rating(); + $rating->transferFromDOM($child); + $this->_rating = $rating; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Returns the video ID for this activity entry. + * + * @return null|Zend_Gdata_YouTube_Extension_VideoId + */ + public function getVideoId() + { + return $this->_videoId; + } + + /** + * Returns the username for this activity entry. + * + * @return null|Zend_Gdata_YouTube_Extension_Username + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Returns the rating for this activity entry. + * + * @return null|Zend_Gdata_YouTube_Extension_Rating + */ + public function getRating() + { + return $this->_rating; + } + + /** + * Return the value of the rating for this video entry. + * + * Convenience method to save needless typing. + * + * @return integer|null The value of the rating that was created, if found. + */ + public function getRatingValue() + { + $rating = $this->_rating; + if ($rating) { + return $rating->getValue(); + } + return null; + } + + /** + * Return the activity type that was performed. + * + * Convenience method that inspects category where scheme is + * http://gdata.youtube.com/schemas/2007/userevents.cat. + * + * @return string|null The activity category if found. + */ + public function getActivityType() + { + $categories = $this->getCategory(); + foreach($categories as $category) { + if ($category->getScheme() == self::ACTIVITY_CATEGORY_SCHEME) { + return $category->getTerm(); + } + } + return null; + } + + /** + * Convenience method to quickly get access to the author of the activity + * + * @return string The author of the activity + */ + public function getAuthorName() + { + $authors = $this->getAuthor(); + return $authors[0]->getName()->getText(); + } +} diff --git a/lib/zend/Zend/Gdata/YouTube/ActivityFeed.php b/lib/zend/Zend/Gdata/YouTube/ActivityFeed.php new file mode 100644 index 0000000000..16f918b349 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/ActivityFeed.php @@ -0,0 +1,66 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/CommentEntry.php b/lib/zend/Zend/Gdata/YouTube/CommentEntry.php new file mode 100644 index 0000000000..3895e3c3a0 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/CommentEntry.php @@ -0,0 +1,59 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/CommentFeed.php b/lib/zend/Zend/Gdata/YouTube/CommentFeed.php new file mode 100644 index 0000000000..584794e54a --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/CommentFeed.php @@ -0,0 +1,66 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/ContactEntry.php b/lib/zend/Zend/Gdata/YouTube/ContactEntry.php new file mode 100644 index 0000000000..e791cb40a8 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/ContactEntry.php @@ -0,0 +1,136 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_status != null) { + $element->appendChild($this->_status->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'status': + $status = new Zend_Gdata_YouTube_Extension_Status(); + $status->transferFromDOM($child); + $this->_status = $status; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Sets the status + * + * @param Zend_Gdata_YouTube_Extension_Status $status The status + * @return Zend_Gdata_YouTube_ContactEntry Provides a fluent interface + */ + public function setStatus($status = null) + { + $this->_status = $status; + return $this; + } + + /** + * Returns the status + * + * @return Zend_Gdata_YouTube_Extension_Status The status + */ + public function getStatus() + { + return $this->_status; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/ContactFeed.php b/lib/zend/Zend/Gdata/YouTube/ContactFeed.php new file mode 100644 index 0000000000..6d0e09c3ff --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/ContactFeed.php @@ -0,0 +1,68 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/AboutMe.php b/lib/zend/Zend/Gdata/YouTube/Extension/AboutMe.php new file mode 100644 index 0000000000..cc629ac7bb --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/AboutMe.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Age.php b/lib/zend/Zend/Gdata/YouTube/Extension/Age.php new file mode 100644 index 0000000000..799dac8379 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Age.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Books.php b/lib/zend/Zend/Gdata/YouTube/Extension/Books.php new file mode 100644 index 0000000000..6444aac963 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Books.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Company.php b/lib/zend/Zend/Gdata/YouTube/Extension/Company.php new file mode 100644 index 0000000000..ebf860e566 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Company.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Control.php b/lib/zend/Zend/Gdata/YouTube/Extension/Control.php new file mode 100755 index 0000000000..d4eae13847 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Control.php @@ -0,0 +1,133 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($draft); + $this->_state = $state; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_state != null) { + $element->appendChild($this->_state->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'state': + $state = new Zend_Gdata_YouTube_Extension_State(); + $state->transferFromDOM($child); + $this->_state = $state; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's state attribute. + * + * @return Zend_Gdata_YouTube_Extension_State The state element. + */ + public function getState() + { + return $this->_state; + } + + /** + * Set the value for this element's state attribute. + * + * @param Zend_Gdata_YouTube_Extension_State $value The desired value for this attribute. + * @return Zend_YouTube_Extension_Control The element being modified. + */ + public function setState($value) + { + $this->_state = $value; + return $this; + } + + /** + * Get the value of this element's state attribute. + * + * @return string The state's text value + */ + public function getStateValue() + { + return $this->getState()->getText(); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/CountHint.php b/lib/zend/Zend/Gdata/YouTube/Extension/CountHint.php new file mode 100755 index 0000000000..2118d6c454 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/CountHint.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Description.php b/lib/zend/Zend/Gdata/YouTube/Extension/Description.php new file mode 100644 index 0000000000..7f637d131e --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Description.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Duration.php b/lib/zend/Zend/Gdata/YouTube/Extension/Duration.php new file mode 100644 index 0000000000..49c40095d6 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Duration.php @@ -0,0 +1,126 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_seconds = $seconds; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_seconds !== null) { + $element->setAttribute('seconds', $this->_seconds); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and valueare + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'seconds': + $this->_seconds = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's seconds attribute. + * + * @return int The value associated with this attribute. + */ + public function getSeconds() + { + return $this->_seconds; + } + + /** + * Set the value for this element's seconds attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Duration The element being modified. + */ + public function setSeconds($value) + { + $this->_seconds = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string The duration in seconds + */ + public function __toString() + { + return $this->_seconds; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/FirstName.php b/lib/zend/Zend/Gdata/YouTube/Extension/FirstName.php new file mode 100644 index 0000000000..b2df77f2ff --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/FirstName.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Gender.php b/lib/zend/Zend/Gdata/YouTube/Extension/Gender.php new file mode 100644 index 0000000000..caf4cd5b27 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Gender.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Hobbies.php b/lib/zend/Zend/Gdata/YouTube/Extension/Hobbies.php new file mode 100644 index 0000000000..81e8ddaa17 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Hobbies.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Hometown.php b/lib/zend/Zend/Gdata/YouTube/Extension/Hometown.php new file mode 100644 index 0000000000..fff840960f --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Hometown.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/LastName.php b/lib/zend/Zend/Gdata/YouTube/Extension/LastName.php new file mode 100644 index 0000000000..1511853c99 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/LastName.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Link.php b/lib/zend/Zend/Gdata/YouTube/Extension/Link.php new file mode 100755 index 0000000000..95be72e105 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Link.php @@ -0,0 +1,133 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($href, $rel, $type, $hrefLang, $title, $length); + $this->_token = $token; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_token != null) { + $element->appendChild($this->_token->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them as members of this entry based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'token': + $token = new Zend_Gdata_YouTube_Extension_Token(); + $token->transferFromDOM($child); + $this->_token = $token; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the value for this element's token attribute. + * + * @return Zend_Gdata_YouTube_Extension_Token The token element. + */ + public function getToken() + { + return $this->_token; + } + + /** + * Set the value for this element's token attribute. + * + * @param Zend_Gdata_YouTube_Extension_Token $value The desired value for this attribute. + * @return Zend_YouTube_Extension_Link The element being modified. + */ + public function setToken($value) + { + $this->_token = $value; + return $this; + } + + /** + * Get the value of this element's token attribute. + * + * @return string The token's text value + */ + public function getTokenValue() + { + return $this->getToken()->getText(); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Location.php b/lib/zend/Zend/Gdata/YouTube/Extension/Location.php new file mode 100644 index 0000000000..b53733c217 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Location.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/MediaContent.php b/lib/zend/Zend/Gdata/YouTube/Extension/MediaContent.php new file mode 100755 index 0000000000..b4722a7bb8 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/MediaContent.php @@ -0,0 +1,120 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_format!= null) { + $element->setAttributeNS($this->lookupNamespace('yt'), 'yt:format', $this->_format); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + $absoluteAttrName = $attribute->namespaceURI . ':' . $attribute->localName; + if ($absoluteAttrName == $this->lookupNamespace('yt') . ':' . 'format') { + $this->_format = $attribute->nodeValue; + } else { + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Returns the format of the media + * Optional. + * + * @return int The format of the media + */ + public function getFormat() + { + return $this->_format; + } + + /** + * Sets the format of the media + * + * @param int $value Format of the media + * @return Zend_Gdata_YouTube_Extension_MediaContent Provides a fluent interface + * + */ + public function setFormat($value) + { + $this->_format = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/MediaCredit.php b/lib/zend/Zend/Gdata/YouTube/Extension/MediaCredit.php new file mode 100644 index 0000000000..51eea76290 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/MediaCredit.php @@ -0,0 +1,189 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_text = $text; + $this->_role = $role; + $this->_scheme = $scheme; + $this->_yttype = $yttype; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_role !== null) { + $element->setAttribute('role', $this->_role); + } + if ($this->_scheme !== null) { + $element->setAttribute('scheme', $this->_scheme); + } + if ($this->_yttype !== null) { + $element->setAttributeNS('http://gdata.youtube.com/schemas/2007', + 'yt:type', $this->_yttype); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'role': + $this->_role = $attribute->nodeValue; + break; + case 'scheme': + $this->_scheme = $attribute->nodeValue; + break; + case 'type': + $this->_yttype = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getRole() + { + return $this->_role; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaCredit Provides a fluent + * interface + */ + public function setRole($value) + { + $this->_role = $value; + return $this; + } + + /** + * @return string + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaCredit Provides a fluent + * interface + */ + public function setScheme($value) + { + $this->_scheme = $value; + return $this; + } + + /** + * @return string + */ + public function getYTtype() + { + return $this->_yttype; + } + + /** + * @param string $value + * @return Zend_Gdata_Media_Extension_MediaCredit Provides a fluent + * interface + */ + public function setYTtype($value) + { + $this->_yttype = $value; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/MediaGroup.php b/lib/zend/Zend/Gdata/YouTube/Extension/MediaGroup.php new file mode 100755 index 0000000000..c6ee5c7dbd --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/MediaGroup.php @@ -0,0 +1,336 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_duration !== null) { + $element->appendChild( + $this->_duration->getDOM($element->ownerDocument)); + } + if ($this->_private !== null) { + $element->appendChild( + $this->_private->getDOM($element->ownerDocument)); + } + if ($this->_videoid != null) { + $element->appendChild( + $this->_videoid->getDOM($element->ownerDocument)); + } + if ($this->_uploaded != null) { + $element->appendChild( + $this->_uploaded->getDOM($element->ownerDocument)); + } + if ($this->_mediacredit != null) { + $element->appendChild( + $this->_mediacredit->getDOM($element->ownerDocument)); + } + if ($this->_mediarating != null) { + $element->appendChild( + $this->_mediarating->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('media') . ':' . 'content': + $content = new Zend_Gdata_YouTube_Extension_MediaContent(); + $content->transferFromDOM($child); + $this->_content[] = $content; + break; + case $this->lookupNamespace('media') . ':' . 'rating': + $mediarating = new Zend_Gdata_YouTube_Extension_MediaRating(); + $mediarating->transferFromDOM($child); + $this->_mediarating = $mediarating; + break; + case $this->lookupNamespace('media') . ':' . 'credit': + $mediacredit = new Zend_Gdata_YouTube_Extension_MediaCredit(); + $mediacredit->transferFromDOM($child); + $this->_mediacredit = $mediacredit; + break; + case $this->lookupNamespace('yt') . ':' . 'duration': + $duration = new Zend_Gdata_YouTube_Extension_Duration(); + $duration->transferFromDOM($child); + $this->_duration = $duration; + break; + case $this->lookupNamespace('yt') . ':' . 'private': + $private = new Zend_Gdata_YouTube_Extension_Private(); + $private->transferFromDOM($child); + $this->_private = $private; + break; + case $this->lookupNamespace('yt') . ':' . 'videoid': + $videoid = new Zend_Gdata_YouTube_Extension_VideoId(); + $videoid ->transferFromDOM($child); + $this->_videoid = $videoid; + break; + case $this->lookupNamespace('yt') . ':' . 'uploaded': + $uploaded = new Zend_Gdata_YouTube_Extension_Uploaded(); + $uploaded ->transferFromDOM($child); + $this->_uploaded = $uploaded; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Returns the duration value of this element + * + * @return Zend_Gdata_YouTube_Extension_Duration + */ + public function getDuration() + { + return $this->_duration; + } + + /** + * Sets the duration value of this element + * + * @param Zend_Gdata_YouTube_Extension_Duration $value The duration value + * @return Zend_Gdata_YouTube_Extension_MediaGroup Provides a fluent + * interface + */ + public function setDuration($value) + { + $this->_duration = $value; + return $this; + } + + /** + * Returns the videoid value of this element + * + * @return Zend_Gdata_YouTube_Extension_VideoId + */ + public function getVideoId() + { + return $this->_videoid; + } + + /** + * Sets the videoid value of this element + * + * @param Zend_Gdata_YouTube_Extension_VideoId $value The video id value + * @return Zend_Gdata_YouTube_Extension_MediaGroup Provides a fluent + * interface + */ + public function setVideoId($value) + { + $this->_videoid = $value; + return $this; + } + + /** + * Returns the yt:uploaded element + * + * @return Zend_Gdata_YouTube_Extension_Uploaded + */ + public function getUploaded() + { + return $this->_uploaded; + } + + /** + * Sets the yt:uploaded element + * + * @param Zend_Gdata_YouTube_Extension_Uploaded $value The uploaded value + * @return Zend_Gdata_YouTube_Extension_MediaGroup Provides a fluent + * interface + */ + public function setUploaded($value) + { + $this->_uploaded = $value; + return $this; + } + + /** + * Returns the private value of this element + * + * @return Zend_Gdata_YouTube_Extension_Private + */ + public function getPrivate() + { + return $this->_private; + } + + /** + * Sets the private value of this element + * + * @param Zend_Gdata_YouTube_Extension_Private $value The private value + * @return Zend_Gdata_YouTube_Extension_MediaGroup Provides a fluent + * interface + */ + public function setPrivate($value) + { + $this->_private = $value; + return $this; + } + + /** + * Returns the rating value of this element + * + * @return Zend_Gdata_YouTube_Extension_MediaRating + */ + public function getMediaRating() + { + return $this->_mediarating; + } + + /** + * Sets the media:rating value of this element + * + * @param Zend_Gdata_YouTube_Extension_MediaRating $value The rating element + * @return Zend_Gdata_YouTube_Extension_MediaGroup Provides a fluent + * interface + */ + public function setMediaRating($value) + { + $this->_mediarating = $value; + return $this; + } + + /** + * Returns the media:credit value of this element + * + * @return Zend_Gdata_YouTube_Extension_MediaCredit + */ + public function getMediaCredit() + { + return $this->_mediacredit; + } + + /** + * Sets the media:credit value of this element + * + * @param Zend_Gdata_YouTube_Extension_MediaCredit $value The credit element + * @return Zend_Gdata_YouTube_Extension_MediaGroup Provides a fluent + * interface + */ + public function setMediaCredit($value) + { + $this->_mediacredit = $value; + return $this; + } +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/MediaRating.php b/lib/zend/Zend/Gdata/YouTube/Extension/MediaRating.php new file mode 100755 index 0000000000..a96ec4eafb --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/MediaRating.php @@ -0,0 +1,150 @@ +registerAllNamespaces(Zend_Gdata_Media::$namespaces); + parent::__construct(); + $this->_scheme = $scheme; + $this->_country = $country; + $this->_text = $text; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_scheme !== null) { + $element->setAttribute('scheme', $this->_scheme); + } + if ($this->_country != null) { + $element->setAttribute('country', $this->_country); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'scheme': + $this->_scheme = $attribute->nodeValue; + break; + case 'country': + $this->_country = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * @return string + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * @param string $value + * @return Zend_Gdata_YouTube_Extension_MediaRating Provides a fluent interface + */ + public function setScheme($value) + { + $this->_scheme = $value; + return $this; + } + + /** + * @return string + */ + public function getCountry() + { + return $this->_country; + } + + /** + * @param string $value + * @return Zend_Gdata_YouTube_Extension_MediaRating Provides a fluent interface + */ + public function setCountry($value) + { + $this->_country = $value; + return $this; + } + + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Movies.php b/lib/zend/Zend/Gdata/YouTube/Extension/Movies.php new file mode 100644 index 0000000000..db999b2049 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Movies.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Music.php b/lib/zend/Zend/Gdata/YouTube/Extension/Music.php new file mode 100644 index 0000000000..c781835681 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Music.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/NoEmbed.php b/lib/zend/Zend/Gdata/YouTube/Extension/NoEmbed.php new file mode 100644 index 0000000000..c621be18a7 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/NoEmbed.php @@ -0,0 +1,54 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Occupation.php b/lib/zend/Zend/Gdata/YouTube/Extension/Occupation.php new file mode 100644 index 0000000000..59a81630fb --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Occupation.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/PlaylistId.php b/lib/zend/Zend/Gdata/YouTube/Extension/PlaylistId.php new file mode 100644 index 0000000000..c6ee4e2727 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/PlaylistId.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/PlaylistTitle.php b/lib/zend/Zend/Gdata/YouTube/Extension/PlaylistTitle.php new file mode 100644 index 0000000000..8725097a26 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/PlaylistTitle.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Position.php b/lib/zend/Zend/Gdata/YouTube/Extension/Position.php new file mode 100644 index 0000000000..f5871507e1 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Position.php @@ -0,0 +1,90 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $value; + } + + /** + * Get the value for the position in the playlist + * + * @return int The 1-based position in the playlist + */ + public function getValue() + { + return $this->_text; + } + + /** + * Set the value for the position in the playlist + * + * @param int $value The 1-based position in the playlist + * @return Zend_Gdata_Extension_Visibility The element being modified + */ + public function setValue($value) + { + $this->_text = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string + */ + public function __toString() + { + return $this->getValue(); + } + +} + diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Private.php b/lib/zend/Zend/Gdata/YouTube/Extension/Private.php new file mode 100755 index 0000000000..7bacd41b4b --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Private.php @@ -0,0 +1,81 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and valueare + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + parent::takeAttributeFromDOM($attribute); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/QueryString.php b/lib/zend/Zend/Gdata/YouTube/Extension/QueryString.php new file mode 100644 index 0000000000..07b9591bb8 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/QueryString.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Racy.php b/lib/zend/Zend/Gdata/YouTube/Extension/Racy.php new file mode 100644 index 0000000000..89a2f67419 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Racy.php @@ -0,0 +1,124 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_state = $state; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_state !== null) { + $element->setAttribute('state', $this->_state); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and value are + * stored in an array. + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'state': + $this->_state = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's state attribute. + * + * @return bool The value associated with this attribute. + */ + public function getState() + { + return $this->_state; + } + + /** + * Set the value for this element's state attribute. + * + * @param bool $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Racy The element being modified. + */ + public function setState($value) + { + $this->_state = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + */ + public function __toString() + { + return $this->_state; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Recorded.php b/lib/zend/Zend/Gdata/YouTube/Extension/Recorded.php new file mode 100644 index 0000000000..44194c3918 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Recorded.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Relationship.php b/lib/zend/Zend/Gdata/YouTube/Extension/Relationship.php new file mode 100644 index 0000000000..ba75a819a7 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Relationship.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/ReleaseDate.php b/lib/zend/Zend/Gdata/YouTube/Extension/ReleaseDate.php new file mode 100644 index 0000000000..577843bcdd --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/ReleaseDate.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/School.php b/lib/zend/Zend/Gdata/YouTube/Extension/School.php new file mode 100644 index 0000000000..cc5276a2da --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/School.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/State.php b/lib/zend/Zend/Gdata/YouTube/Extension/State.php new file mode 100644 index 0000000000..1481e261d7 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/State.php @@ -0,0 +1,193 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $explanation; + $this->_name = $name; + $this->_reasonCode = $reasonCode; + $this->_helpUrl = $reasonCode; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_name !== null) { + $element->setAttribute('name', $this->_name); + } + if ($this->_reasonCode !== null) { + $element->setAttribute('reasonCode', $this->_reasonCode); + } + if ($this->_helpUrl !== null) { + $element->setAttribute('helpUrl', $this->_helpUrl); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and valueare + * stored in an array. + * TODO: Convert attributes to proper types + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'name': + $this->_name = $attribute->nodeValue; + break; + case 'reasonCode': + $this->_reasonCode = $attribute->nodeValue; + break; + case 'helpUrl': + $this->_helpUrl = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's name attribute. + * + * @return int The value associated with this attribute. + */ + public function getName() + { + return $this->_name; + } + + /** + * Set the value for this element's name attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_State The element being modified. + */ + public function setName($value) + { + $this->_name = $value; + return $this; + } + + /** + * Get the value for this element's reasonCode attribute. + * + * @return int The value associated with this attribute. + */ + public function getReasonCode() + { + return $this->_reasonCode; + } + + /** + * Set the value for this element's reasonCode attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_State The element being modified. + */ + public function setReasonCode($value) + { + $this->_reasonCode = $value; + return $this; + } + + /** + * Get the value for this element's helpUrl attribute. + * + * @return int The value associated with this attribute. + */ + public function getHelpUrl() + { + return $this->_helpUrl; + } + + /** + * Set the value for this element's helpUrl attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_State The element being modified. + */ + public function setHelpUrl($value) + { + $this->_helpUrl = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string + */ + public function __toString() + { + return $this->_text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Statistics.php b/lib/zend/Zend/Gdata/YouTube/Extension/Statistics.php new file mode 100644 index 0000000000..ac62b0a550 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Statistics.php @@ -0,0 +1,309 @@ + tag appears within a + * user profile entry. + * + * @var integer + */ + protected $_videoWatchCount = null; + + /** + * When the viewCount attribute refers to a video entry, the attribute + * specifies the number of times that the video has been viewed. + * When the viewCount attribute refers to a user profile, the attribute + * specifies the number of times that the user's profile has been + * viewed. + * + * @var integer + */ + protected $_viewCount = null; + + /** + * The subscriberCount attribute specifies the number of YouTube users + * who have subscribed to a particular user's YouTube channel. + * The subscriberCount attribute is only specified when the + * tag appears within a user profile entry. + * + * @var integer + */ + protected $_subscriberCount = null; + + /** + * The lastWebAccess attribute indicates the most recent time that + * a particular user used YouTube. + * + * @var string + */ + protected $_lastWebAccess = null; + + /** + * The favoriteCount attribute specifies the number of YouTube users + * who have added a video to their list of favorite videos. The + * favoriteCount attribute is only specified when the + * tag appears within a video entry. + * + * @var integer + */ + protected $_favoriteCount = null; + + /** + * Constructs a new Zend_Gdata_YouTube_Extension_Statistics object. + * @param string $viewCount(optional) The viewCount value + * @param string $videoWatchCount(optional) The videoWatchCount value + * @param string $subscriberCount(optional) The subscriberCount value + * @param string $lastWebAccess(optional) The lastWebAccess value + * @param string $favoriteCount(optional) The favoriteCount value + */ + public function __construct($viewCount = null, $videoWatchCount = null, + $subscriberCount = null, $lastWebAccess = null, + $favoriteCount = null) + { + $this->registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_viewCount = $viewCount; + $this->_videoWatchCount = $videoWatchCount; + $this->_subscriberCount = $subscriberCount; + $this->_lastWebAccess = $lastWebAccess; + $this->_favoriteCount = $favoriteCount; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_videoWatchCount !== null) { + $element->setAttribute('watchCount', $this->_videoWatchCount); + } + if ($this->_viewCount !== null) { + $element->setAttribute('viewCount', $this->_viewCount); + } + if ($this->_subscriberCount !== null) { + $element->setAttribute('subscriberCount', + $this->_subscriberCount); + } + if ($this->_lastWebAccess !== null) { + $element->setAttribute('lastWebAccess', + $this->_lastWebAccess); + } + if ($this->_favoriteCount !== null) { + $element->setAttribute('favoriteCount', + $this->_favoriteCount); + } + return $element; + } + + /** + * Given a DOMNode representing an attribute, tries to map the data into + * instance members. If no mapping is defined, the name and valueare + * stored in an array. + * TODO: Convert attributes to proper types + * + * @param DOMNode $attribute The DOMNode attribute needed to be handled + */ + protected function takeAttributeFromDOM($attribute) + { + switch ($attribute->localName) { + case 'videoWatchCount': + $this->_videoWatchCount = $attribute->nodeValue; + break; + case 'viewCount': + $this->_viewCount = $attribute->nodeValue; + break; + case 'subscriberCount': + $this->_subscriberCount = $attribute->nodeValue; + break; + case 'lastWebAccess': + $this->_lastWebAccess = $attribute->nodeValue; + break; + case 'favoriteCount': + $this->_favoriteCount = $attribute->nodeValue; + break; + default: + parent::takeAttributeFromDOM($attribute); + } + } + + /** + * Get the value for this element's viewCount attribute. + * + * @return int The value associated with this attribute. + */ + public function getViewCount() + { + return $this->_viewCount; + } + + /** + * Set the value for this element's viewCount attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Statistics The element being + * modified. + */ + public function setViewCount($value) + { + $this->_viewCount = $value; + return $this; + } + + /** + * Get the value for this element's videoWatchCount attribute. + * + * @return int The value associated with this attribute. + */ + public function getVideoWatchCount() + { + return $this->_videoWatchCount; + } + + /** + * Set the value for this element's videoWatchCount attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Statistics The element being + * modified. + */ + public function setVideoWatchCount($value) + { + $this->_videoWatchCount = $value; + return $this; + } + + /** + * Get the value for this element's subscriberCount attribute. + * + * @return int The value associated with this attribute. + */ + public function getSubscriberCount() + { + return $this->_subscriberCount; + } + + /** + * Set the value for this element's subscriberCount attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Statistics The element being + * modified. + */ + public function setSubscriberCount($value) + { + $this->_subscriberCount = $value; + return $this; + } + + /** + * Get the value for this element's lastWebAccess attribute. + * + * @return int The value associated with this attribute. + */ + public function getLastWebAccess() + { + return $this->_lastWebAccess; + } + + /** + * Set the value for this element's lastWebAccess attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Statistics The element being + * modified. + */ + public function setLastWebAccess($value) + { + $this->_lastWebAccess = $value; + return $this; + } + + /** + * Get the value for this element's favoriteCount attribute. + * + * @return int The value associated with this attribute. + */ + public function getFavoriteCount() + { + return $this->_favoriteCount; + } + + /** + * Set the value for this element's favoriteCount attribute. + * + * @param int $value The desired value for this attribute. + * @return Zend_Gdata_YouTube_Extension_Statistics The element being + * modified. + */ + public function setFavoriteCount($value) + { + $this->_favoriteCount = $value; + return $this; + } + + /** + * Magic toString method allows using this directly via echo + * Works best in PHP >= 4.2.0 + * + * @return string + */ + public function __toString() + { + return 'View Count=' . $this->_viewCount . + ' VideoWatchCount=' . $this->_videoWatchCount . + ' SubscriberCount=' . $this->_subscriberCount . + ' LastWebAccess=' . $this->_lastWebAccess . + ' FavoriteCount=' . $this->_favoriteCount; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Status.php b/lib/zend/Zend/Gdata/YouTube/Extension/Status.php new file mode 100644 index 0000000000..ed9529d4fa --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Status.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Token.php b/lib/zend/Zend/Gdata/YouTube/Extension/Token.php new file mode 100755 index 0000000000..16a4d56f1c --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Token.php @@ -0,0 +1,70 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + return $element; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Uploaded.php b/lib/zend/Zend/Gdata/YouTube/Extension/Uploaded.php new file mode 100644 index 0000000000..8789d63a82 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Uploaded.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/Username.php b/lib/zend/Zend/Gdata/YouTube/Extension/Username.php new file mode 100644 index 0000000000..636fbffd11 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/Username.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/Extension/VideoId.php b/lib/zend/Zend/Gdata/YouTube/Extension/VideoId.php new file mode 100644 index 0000000000..18d9af18d1 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/Extension/VideoId.php @@ -0,0 +1,51 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct(); + $this->_text = $text; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/InboxEntry.php b/lib/zend/Zend/Gdata/YouTube/InboxEntry.php new file mode 100644 index 0000000000..cff4d079bb --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/InboxEntry.php @@ -0,0 +1,281 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_description != null) { + $element->appendChild( + $this->_description->getDOM($element->ownerDocument)); + } + if ($this->_rating != null) { + $element->appendChild( + $this->_rating->getDOM($element->ownerDocument)); + } + if ($this->_statistics != null) { + $element->appendChild( + $this->_statistics->getDOM($element->ownerDocument)); + } + if ($this->_comments != null) { + $element->appendChild( + $this->_comments->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'comments': + $comments = new Zend_Gdata_Extension_Comments(); + $comments->transferFromDOM($child); + $this->_comments = $comments; + break; + case $this->lookupNamespace('gd') . ':' . 'rating': + $rating = new Zend_Gdata_Extension_Rating(); + $rating->transferFromDOM($child); + $this->_rating = $rating; + break; + case $this->lookupNamespace('yt') . ':' . 'description': + $description = new Zend_Gdata_YouTube_Extension_Description(); + $description->transferFromDOM($child); + $this->_description = $description; + break; + case $this->lookupNamespace('yt') . ':' . 'statistics': + $statistics = new Zend_Gdata_YouTube_Extension_Statistics(); + $statistics->transferFromDOM($child); + $this->_statistics = $statistics; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Get the yt:description + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_Description|null + */ + public function getDescription() + { + if ($this->getMajorProtocolVersion() == 2) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The getDescription ' . + ' method is only supported in version 1 of the YouTube ' . + 'API.'); + } else { + return $this->_description; + } + } + + /** + * Sets the yt:description element for a new inbox entry. + * + * @param Zend_Gdata_YouTube_Extension_Description $description The + * description. + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_InboxEntry Provides a fluent interface + */ + public function setDescription($description = null) + { + if ($this->getMajorProtocolVersion() == 2) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The setDescription ' . + ' method is only supported in version 1 of the YouTube ' . + 'API.'); + } else { + $this->_description = $description; + return $this; + } + } + + /** + * Get the gd:rating element for the inbox entry + * + * @return Zend_Gdata_Extension_Rating|null + */ + public function getRating() + { + return $this->_rating; + } + + /** + * Sets the gd:rating element for the inbox entry + * + * @param Zend_Gdata_Extension_Rating $rating The rating for the video in + * the message + * @return Zend_Gdata_YouTube_InboxEntry Provides a fluent interface + */ + public function setRating($rating = null) + { + $this->_rating = $rating; + return $this; + } + + /** + * Get the gd:comments element of the inbox entry. + * + * @return Zend_Gdata_Extension_Comments|null + */ + public function getComments() + { + return $this->_comments; + } + + /** + * Sets the gd:comments element for the inbox entry + * + * @param Zend_Gdata_Extension_Comments $comments The comments feed link + * @return Zend_Gdata_YouTube_InboxEntry Provides a fluent interface + */ + public function setComments($comments = null) + { + $this->_comments = $comments; + return $this; + } + + /** + * Get the yt:statistics element for the inbox entry + * + * @return Zend_Gdata_YouTube_Extension_Statistics|null + */ + public function getStatistics() + { + return $this->_statistics; + } + + /** + * Sets the yt:statistics element for the inbox entry + * + * @param Zend_Gdata_YouTube_Extension_Statistics $statistics The + * statistics element for the video in the message + * @return Zend_Gdata_YouTube_InboxEntry Provides a fluent interface + */ + public function setStatistics($statistics = null) + { + $this->_statistics = $statistics; + return $this; + } + + +} diff --git a/lib/zend/Zend/Gdata/YouTube/InboxFeed.php b/lib/zend/Zend/Gdata/YouTube/InboxFeed.php new file mode 100644 index 0000000000..393a2b2d0a --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/InboxFeed.php @@ -0,0 +1,68 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/MediaEntry.php b/lib/zend/Zend/Gdata/YouTube/MediaEntry.php new file mode 100755 index 0000000000..490e12201e --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/MediaEntry.php @@ -0,0 +1,81 @@ +namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('media') . ':' . 'group': + $mediaGroup = new Zend_Gdata_YouTube_Extension_MediaGroup(); + $mediaGroup->transferFromDOM($child); + $this->_mediaGroup = $mediaGroup; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/PlaylistListEntry.php b/lib/zend/Zend/Gdata/YouTube/PlaylistListEntry.php new file mode 100644 index 0000000000..7f1902fa21 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/PlaylistListEntry.php @@ -0,0 +1,300 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_description != null) { + $element->appendChild($this->_description->getDOM($element->ownerDocument)); + } + if ($this->_countHint != null) { + $element->appendChild($this->_countHint->getDOM($element->ownerDocument)); + } + if ($this->_playlistId != null) { + $element->appendChild($this->_playlistId->getDOM($element->ownerDocument)); + } + if ($this->_feedLink != null) { + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM($element->ownerDocument)); + } + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'description': + $description = new Zend_Gdata_YouTube_Extension_Description(); + $description->transferFromDOM($child); + $this->_description = $description; + break; + case $this->lookupNamespace('yt') . ':' . 'countHint': + $countHint = new Zend_Gdata_YouTube_Extension_CountHint(); + $countHint->transferFromDOM($child); + $this->_countHint = $countHint; + break; + case $this->lookupNamespace('yt') . ':' . 'playlistId': + $playlistId = new Zend_Gdata_YouTube_Extension_PlaylistId(); + $playlistId->transferFromDOM($child); + $this->_playlistId = $playlistId; + break; + case $this->lookupNamespace('gd') . ':' . 'feedLink': + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Sets the description relating to the playlist. + * + * @deprecated Deprecated as of version 2 of the YouTube API. + * @param Zend_Gdata_YouTube_Extension_Description $description The description relating to the video + * @return Zend_Gdata_YouTube_PlaylistListEntry Provides a fluent interface + */ + public function setDescription($description = null) + { + if ($this->getMajorProtocolVersion() >= 2) { + $this->setSummary($description); + } else { + $this->_description = $description; + } + return $this; + } + + /** + * Returns the description relating to the video. + * + * @return Zend_Gdata_YouTube_Extension_Description The description + * relating to the video + */ + public function getDescription() + { + if ($this->getMajorProtocolVersion() >= 2) { + return $this->getSummary(); + } else { + return $this->_description; + } + } + + /** + * Returns the countHint relating to the playlist. + * + * The countHint is the number of videos on a playlist. + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_CountHint The count of videos on + * a playlist. + */ + public function getCountHint() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The yt:countHint ' . + 'element is not supported in versions earlier than 2.'); + } else { + return $this->_countHint; + } + } + + /** + * Returns the Id relating to the playlist. + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_PlaylistId The id of this playlist. + */ + public function getPlaylistId() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The yt:playlistId ' . + 'element is not supported in versions earlier than 2.'); + } else { + return $this->_playlistId; + } + } + + /** + * Sets the array of embedded feeds related to the playlist + * + * @param array $feedLink The array of embedded feeds relating to the video + * @return Zend_Gdata_YouTube_PlaylistListEntry Provides a fluent interface + */ + public function setFeedLink($feedLink = null) + { + $this->_feedLink = $feedLink; + return $this; + } + + /** + * Get the feed link property for this entry. + * + * @see setFeedLink + * @param string $rel (optional) The rel value of the link to be found. + * If null, the array of links is returned. + * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink + * object corresponding to the requested rel value is returned + * if found, or null if the requested value is not found. If + * $rel is null or not specified, an array of all available + * feed links for this entry is returned, or null if no feed + * links are set. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Returns the URL of the playlist video feed + * + * @return string The URL of the playlist video feed + */ + public function getPlaylistVideoFeedUrl() + { + if ($this->getMajorProtocolVersion() >= 2) { + return $this->getContent()->getSrc(); + } else { + return $this->getFeedLink(Zend_Gdata_YouTube::PLAYLIST_REL)->href; + } + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/PlaylistListFeed.php b/lib/zend/Zend/Gdata/YouTube/PlaylistListFeed.php new file mode 100644 index 0000000000..ca3e9b026e --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/PlaylistListFeed.php @@ -0,0 +1,68 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/PlaylistVideoEntry.php b/lib/zend/Zend/Gdata/YouTube/PlaylistVideoEntry.php new file mode 100644 index 0000000000..b55de28825 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/PlaylistVideoEntry.php @@ -0,0 +1,132 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_position !== null) { + $element->appendChild($this->_position->getDOM($element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'position': + $position = new Zend_Gdata_YouTube_Extension_Position(); + $position->transferFromDOM($child); + $this->_position = $position; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + + /** + * Sets the array of embedded feeds related to the video + * + * @param Zend_Gdata_YouTube_Extension_Position $position + * The position of the entry in the feed, as specified by the user. + * @return Zend_Gdata_YouTube_PlaylistVideoEntry Provides a fluent interface + */ + public function setPosition($position = null) + { + $this->_position = $position; + return $this; + } + + /** + * Returns the position of the entry in the feed, as specified by the user + * + * @return Zend_Gdata_YouTube_Extension_Position The position + */ + public function getPosition() + { + return $this->_position; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/PlaylistVideoFeed.php b/lib/zend/Zend/Gdata/YouTube/PlaylistVideoFeed.php new file mode 100644 index 0000000000..b6ff7f2862 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/PlaylistVideoFeed.php @@ -0,0 +1,68 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/SubscriptionEntry.php b/lib/zend/Zend/Gdata/YouTube/SubscriptionEntry.php new file mode 100644 index 0000000000..8b38115cce --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/SubscriptionEntry.php @@ -0,0 +1,446 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_countHint != null) { + $element->appendChild($this->_countHint->getDOM($element->ownerDocument)); + } + if ($this->_playlistTitle != null) { + $element->appendChild($this->_playlistTitle->getDOM($element->ownerDocument)); + } + if ($this->_playlistId != null) { + $element->appendChild($this->_playlistId->getDOM($element->ownerDocument)); + } + if ($this->_mediaThumbnail != null) { + $element->appendChild($this->_mediaThumbnail->getDOM($element->ownerDocument)); + } + if ($this->_username != null) { + $element->appendChild($this->_username->getDOM($element->ownerDocument)); + } + if ($this->_queryString != null) { + $element->appendChild($this->_queryString->getDOM($element->ownerDocument)); + } + if ($this->_feedLink != null) { + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM($element->ownerDocument)); + } + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('gd') . ':' . 'feedLink': + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + case $this->lookupNamespace('media') . ':' . 'thumbnail': + $mediaThumbnail = new Zend_Gdata_Media_Extension_MediaThumbnail(); + $mediaThumbnail->transferFromDOM($child); + $this->_mediaThumbnail = $mediaThumbnail; + break; + case $this->lookupNamespace('yt') . ':' . 'countHint': + $countHint = new Zend_Gdata_YouTube_Extension_CountHint(); + $countHint->transferFromDOM($child); + $this->_countHint = $countHint; + break; + case $this->lookupNamespace('yt') . ':' . 'playlistTitle': + $playlistTitle = new Zend_Gdata_YouTube_Extension_PlaylistTitle(); + $playlistTitle->transferFromDOM($child); + $this->_playlistTitle = $playlistTitle; + break; + case $this->lookupNamespace('yt') . ':' . 'playlistId': + $playlistId = new Zend_Gdata_YouTube_Extension_PlaylistId(); + $playlistId->transferFromDOM($child); + $this->_playlistId = $playlistId; + break; + case $this->lookupNamespace('yt') . ':' . 'queryString': + $queryString = new Zend_Gdata_YouTube_Extension_QueryString(); + $queryString->transferFromDOM($child); + $this->_queryString = $queryString; + break; + case $this->lookupNamespace('yt') . ':' . 'username': + $username = new Zend_Gdata_YouTube_Extension_Username(); + $username->transferFromDOM($child); + $this->_username = $username; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Sets the array of embedded feeds related to the video + * + * @param array $feedLink The array of embedded feeds relating to the video + * @return Zend_Gdata_YouTube_SubscriptionEntry Provides a fluent interface + */ + public function setFeedLink($feedLink = null) + { + $this->_feedLink = $feedLink; + return $this; + } + + /** + * Get the feed link property for this entry. + * + * @see setFeedLink + * @param string $rel (optional) The rel value of the link to be found. + * If null, the array of links is returned. + * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink + * object corresponding to the requested rel value is returned + * if found, or null if the requested value is not found. If + * $rel is null or not specified, an array of all available + * feed links for this entry is returned, or null if no feed + * links are set. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Get the playlist title for a 'playlist' subscription. + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_PlaylistId + */ + public function getPlaylistId() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The getPlaylistId ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + return $this->_playlistId; + } + } + + /** + * Sets the yt:playlistId element for a new playlist subscription. + * + * @param Zend_Gdata_YouTube_Extension_PlaylistId $id The id of + * the playlist to which to subscribe to. + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_SubscriptionEntry Provides a fluent interface + */ + public function setPlaylistId($id = null) + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The setPlaylistTitle ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + $this->_playlistId = $id; + return $this; + } + } + + /** + * Get the queryString of the subscription + * + * @return Zend_Gdata_YouTube_Extension_QueryString + */ + public function getQueryString() + { + return $this->_queryString; + } + + /** + * Sets the yt:queryString element for a new keyword subscription. + * + * @param Zend_Gdata_YouTube_Extension_QueryString $queryString The query + * string to subscribe to + * @return Zend_Gdata_YouTube_SubscriptionEntry Provides a fluent interface + */ + public function setQueryString($queryString = null) + { + $this->_queryString = $queryString; + return $this; + } + + /** + * Get the playlist title for a 'playlist' subscription. + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_PlaylistTitle + */ + public function getPlaylistTitle() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The getPlaylistTitle ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + return $this->_playlistTitle; + } + } + + /** + * Sets the yt:playlistTitle element for a new playlist subscription. + * + * @param Zend_Gdata_YouTube_Extension_PlaylistTitle $title The title of + * the playlist to which to subscribe to. + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_SubscriptionEntry Provides a fluent interface + */ + public function setPlaylistTitle($title = null) + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The setPlaylistTitle ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + $this->_playlistTitle = $title; + return $this; + } + } + + /** + * Get the counthint for a subscription. + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_CountHint + */ + public function getCountHint() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The getCountHint ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + return $this->_countHint; + } + } + + /** + * Get the thumbnail for a subscription. + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_Media_Extension_MediaThumbnail + */ + public function getMediaThumbnail() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The getMediaThumbnail ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + return $this->_mediaThumbnail; + } + } + + /** + * Get the username for a channel subscription. + * + * @return Zend_Gdata_YouTube_Extension_Username + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Sets the username for a new channel subscription. + * + * @param Zend_Gdata_YouTube_Extension_Username $username The username of + * the channel to which to subscribe to. + * @return Zend_Gdata_YouTube_SubscriptionEntry Provides a fluent interface + */ + public function setUsername($username = null) + { + $this->_username = $username; + return $this; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/SubscriptionFeed.php b/lib/zend/Zend/Gdata/YouTube/SubscriptionFeed.php new file mode 100644 index 0000000000..9242c44c32 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/SubscriptionFeed.php @@ -0,0 +1,68 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/UserProfileEntry.php b/lib/zend/Zend/Gdata/YouTube/UserProfileEntry.php new file mode 100644 index 0000000000..a83d4dddf5 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/UserProfileEntry.php @@ -0,0 +1,1041 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_description != null) { + $element->appendChild($this->_description->getDOM($element->ownerDocument)); + } + if ($this->_aboutMe != null) { + $element->appendChild($this->_aboutMe->getDOM($element->ownerDocument)); + } + if ($this->_age != null) { + $element->appendChild($this->_age->getDOM($element->ownerDocument)); + } + if ($this->_username != null) { + $element->appendChild($this->_username->getDOM($element->ownerDocument)); + } + if ($this->_books != null) { + $element->appendChild($this->_books->getDOM($element->ownerDocument)); + } + if ($this->_company != null) { + $element->appendChild($this->_company->getDOM($element->ownerDocument)); + } + if ($this->_hobbies != null) { + $element->appendChild($this->_hobbies->getDOM($element->ownerDocument)); + } + if ($this->_hometown != null) { + $element->appendChild($this->_hometown->getDOM($element->ownerDocument)); + } + if ($this->_location != null) { + $element->appendChild($this->_location->getDOM($element->ownerDocument)); + } + if ($this->_movies != null) { + $element->appendChild($this->_movies->getDOM($element->ownerDocument)); + } + if ($this->_music != null) { + $element->appendChild($this->_music->getDOM($element->ownerDocument)); + } + if ($this->_occupation != null) { + $element->appendChild($this->_occupation->getDOM($element->ownerDocument)); + } + if ($this->_school != null) { + $element->appendChild($this->_school->getDOM($element->ownerDocument)); + } + if ($this->_gender != null) { + $element->appendChild($this->_gender->getDOM($element->ownerDocument)); + } + if ($this->_relationship != null) { + $element->appendChild($this->_relationship->getDOM($element->ownerDocument)); + } + if ($this->_firstName != null) { + $element->appendChild($this->_firstName->getDOM($element->ownerDocument)); + } + if ($this->_lastName != null) { + $element->appendChild($this->_lastName->getDOM($element->ownerDocument)); + } + if ($this->_statistics != null) { + $element->appendChild($this->_statistics->getDOM($element->ownerDocument)); + } + if ($this->_thumbnail != null) { + $element->appendChild($this->_thumbnail->getDOM($element->ownerDocument)); + } + if ($this->_feedLink != null) { + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM($element->ownerDocument)); + } + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'description': + $description = new Zend_Gdata_YouTube_Extension_Description(); + $description->transferFromDOM($child); + $this->_description = $description; + break; + case $this->lookupNamespace('yt') . ':' . 'aboutMe': + $aboutMe = new Zend_Gdata_YouTube_Extension_AboutMe(); + $aboutMe->transferFromDOM($child); + $this->_aboutMe = $aboutMe; + break; + case $this->lookupNamespace('yt') . ':' . 'age': + $age = new Zend_Gdata_YouTube_Extension_Age(); + $age->transferFromDOM($child); + $this->_age = $age; + break; + case $this->lookupNamespace('yt') . ':' . 'username': + $username = new Zend_Gdata_YouTube_Extension_Username(); + $username->transferFromDOM($child); + $this->_username = $username; + break; + case $this->lookupNamespace('yt') . ':' . 'books': + $books = new Zend_Gdata_YouTube_Extension_Books(); + $books->transferFromDOM($child); + $this->_books = $books; + break; + case $this->lookupNamespace('yt') . ':' . 'company': + $company = new Zend_Gdata_YouTube_Extension_Company(); + $company->transferFromDOM($child); + $this->_company = $company; + break; + case $this->lookupNamespace('yt') . ':' . 'hobbies': + $hobbies = new Zend_Gdata_YouTube_Extension_Hobbies(); + $hobbies->transferFromDOM($child); + $this->_hobbies = $hobbies; + break; + case $this->lookupNamespace('yt') . ':' . 'hometown': + $hometown = new Zend_Gdata_YouTube_Extension_Hometown(); + $hometown->transferFromDOM($child); + $this->_hometown = $hometown; + break; + case $this->lookupNamespace('yt') . ':' . 'location': + $location = new Zend_Gdata_YouTube_Extension_Location(); + $location->transferFromDOM($child); + $this->_location = $location; + break; + case $this->lookupNamespace('yt') . ':' . 'movies': + $movies = new Zend_Gdata_YouTube_Extension_Movies(); + $movies->transferFromDOM($child); + $this->_movies = $movies; + break; + case $this->lookupNamespace('yt') . ':' . 'music': + $music = new Zend_Gdata_YouTube_Extension_Music(); + $music->transferFromDOM($child); + $this->_music = $music; + break; + case $this->lookupNamespace('yt') . ':' . 'occupation': + $occupation = new Zend_Gdata_YouTube_Extension_Occupation(); + $occupation->transferFromDOM($child); + $this->_occupation = $occupation; + break; + case $this->lookupNamespace('yt') . ':' . 'school': + $school = new Zend_Gdata_YouTube_Extension_School(); + $school->transferFromDOM($child); + $this->_school = $school; + break; + case $this->lookupNamespace('yt') . ':' . 'gender': + $gender = new Zend_Gdata_YouTube_Extension_Gender(); + $gender->transferFromDOM($child); + $this->_gender = $gender; + break; + case $this->lookupNamespace('yt') . ':' . 'relationship': + $relationship = new Zend_Gdata_YouTube_Extension_Relationship(); + $relationship->transferFromDOM($child); + $this->_relationship = $relationship; + break; + case $this->lookupNamespace('yt') . ':' . 'firstName': + $firstName = new Zend_Gdata_YouTube_Extension_FirstName(); + $firstName->transferFromDOM($child); + $this->_firstName = $firstName; + break; + case $this->lookupNamespace('yt') . ':' . 'lastName': + $lastName = new Zend_Gdata_YouTube_Extension_LastName(); + $lastName->transferFromDOM($child); + $this->_lastName = $lastName; + break; + case $this->lookupNamespace('yt') . ':' . 'statistics': + $statistics = new Zend_Gdata_YouTube_Extension_Statistics(); + $statistics->transferFromDOM($child); + $this->_statistics = $statistics; + break; + case $this->lookupNamespace('media') . ':' . 'thumbnail': + $thumbnail = new Zend_Gdata_Media_Extension_MediaThumbnail(); + $thumbnail->transferFromDOM($child); + $this->_thumbnail = $thumbnail; + break; + case $this->lookupNamespace('gd') . ':' . 'feedLink': + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Sets the content of the 'about me' field. + * + * @param Zend_Gdata_YouTube_Extension_AboutMe $aboutMe The 'about me' + * information. + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setAboutMe($aboutMe = null) + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The setAboutMe ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + $this->_aboutMe = $aboutMe; + return $this; + } + } + + /** + * Returns the contents of the 'about me' field. + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_AboutMe The 'about me' information + */ + public function getAboutMe() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The getAboutMe ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + return $this->_aboutMe; + } + } + + /** + * Sets the content of the 'first name' field. + * + * @param Zend_Gdata_YouTube_Extension_FirstName $firstName The first name + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setFirstName($firstName = null) + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The setFirstName ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + $this->_firstName = $firstName; + return $this; + } + } + + /** + * Returns the first name + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_FirstName The first name + */ + public function getFirstName() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The getFirstName ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + return $this->_firstName; + } + } + + /** + * Sets the content of the 'last name' field. + * + * @param Zend_Gdata_YouTube_Extension_LastName $lastName The last name + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setLastName($lastName = null) + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The setLastName ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + $this->_lastName = $lastName; + return $this; + } + } + + /** + * Returns the last name + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_LastName The last name + */ + public function getLastName() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The getLastName ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + return $this->_lastName; + } + } + + /** + * Returns the statistics + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_Statistics The profile statistics + */ + public function getStatistics() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The getStatistics ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + return $this->_statistics; + } + } + + /** + * Returns the thumbnail + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_Media_Extension_MediaThumbnail The profile thumbnail + */ + public function getThumbnail() + { + if (($this->getMajorProtocolVersion() == null) || + ($this->getMajorProtocolVersion() == 1)) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException('The getThumbnail ' . + ' method is only supported as of version 2 of the YouTube ' . + 'API.'); + } else { + return $this->_thumbnail; + } + } + + /** + * Sets the age + * + * @param Zend_Gdata_YouTube_Extension_Age $age The age + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setAge($age = null) + { + $this->_age = $age; + return $this; + } + + /** + * Returns the age + * + * @return Zend_Gdata_YouTube_Extension_Age The age + */ + public function getAge() + { + return $this->_age; + } + + /** + * Sets the username + * + * @param Zend_Gdata_YouTube_Extension_Username $username The username + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setUsername($username = null) + { + $this->_username = $username; + return $this; + } + + /** + * Returns the username + * + * @return Zend_Gdata_YouTube_Extension_Username The username + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Sets the books + * + * @param Zend_Gdata_YouTube_Extension_Books $books The books + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setBooks($books = null) + { + $this->_books = $books; + return $this; + } + + /** + * Returns the books + * + * @return Zend_Gdata_YouTube_Extension_Books The books + */ + public function getBooks() + { + return $this->_books; + } + + /** + * Sets the company + * + * @param Zend_Gdata_YouTube_Extension_Company $company The company + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setCompany($company = null) + { + $this->_company = $company; + return $this; + } + + /** + * Returns the company + * + * @return Zend_Gdata_YouTube_Extension_Company The company + */ + public function getCompany() + { + return $this->_company; + } + + /** + * Sets the hobbies + * + * @param Zend_Gdata_YouTube_Extension_Hobbies $hobbies The hobbies + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setHobbies($hobbies = null) + { + $this->_hobbies = $hobbies; + return $this; + } + + /** + * Returns the hobbies + * + * @return Zend_Gdata_YouTube_Extension_Hobbies The hobbies + */ + public function getHobbies() + { + return $this->_hobbies; + } + + /** + * Sets the hometown + * + * @param Zend_Gdata_YouTube_Extension_Hometown $hometown The hometown + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setHometown($hometown = null) + { + $this->_hometown = $hometown; + return $this; + } + + /** + * Returns the hometown + * + * @return Zend_Gdata_YouTube_Extension_Hometown The hometown + */ + public function getHometown() + { + return $this->_hometown; + } + + /** + * Sets the location + * + * @param Zend_Gdata_YouTube_Extension_Location $location The location + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setLocation($location = null) + { + $this->_location = $location; + return $this; + } + + /** + * Returns the location + * + * @return Zend_Gdata_YouTube_Extension_Location The location + */ + public function getLocation() + { + return $this->_location; + } + + /** + * Sets the movies + * + * @param Zend_Gdata_YouTube_Extension_Movies $movies The movies + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setMovies($movies = null) + { + $this->_movies = $movies; + return $this; + } + + /** + * Returns the movies + * + * @return Zend_Gdata_YouTube_Extension_Movies The movies + */ + public function getMovies() + { + return $this->_movies; + } + + /** + * Sets the music + * + * @param Zend_Gdata_YouTube_Extension_Music $music The music + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setMusic($music = null) + { + $this->_music = $music; + return $this; + } + + /** + * Returns the music + * + * @return Zend_Gdata_YouTube_Extension_Music The music + */ + public function getMusic() + { + return $this->_music; + } + + /** + * Sets the occupation + * + * @param Zend_Gdata_YouTube_Extension_Occupation $occupation The occupation + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setOccupation($occupation = null) + { + $this->_occupation = $occupation; + return $this; + } + + /** + * Returns the occupation + * + * @return Zend_Gdata_YouTube_Extension_Occupation The occupation + */ + public function getOccupation() + { + return $this->_occupation; + } + + /** + * Sets the school + * + * @param Zend_Gdata_YouTube_Extension_School $school The school + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setSchool($school = null) + { + $this->_school = $school; + return $this; + } + + /** + * Returns the school + * + * @return Zend_Gdata_YouTube_Extension_School The school + */ + public function getSchool() + { + return $this->_school; + } + + /** + * Sets the gender + * + * @param Zend_Gdata_YouTube_Extension_Gender $gender The gender + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setGender($gender = null) + { + $this->_gender = $gender; + return $this; + } + + /** + * Returns the gender + * + * @return Zend_Gdata_YouTube_Extension_Gender The gender + */ + public function getGender() + { + return $this->_gender; + } + + /** + * Sets the relationship + * + * @param Zend_Gdata_YouTube_Extension_Relationship $relationship The relationship + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setRelationship($relationship = null) + { + $this->_relationship = $relationship; + return $this; + } + + /** + * Returns the relationship + * + * @return Zend_Gdata_YouTube_Extension_Relationship The relationship + */ + public function getRelationship() + { + return $this->_relationship; + } + + /** + * Sets the array of embedded feeds related to the video + * + * @param array $feedLink The array of embedded feeds relating to the video + * @return Zend_Gdata_YouTube_UserProfileEntry Provides a fluent interface + */ + public function setFeedLink($feedLink = null) + { + $this->_feedLink = $feedLink; + return $this; + } + + /** + * Get the feed link property for this entry. + * + * @see setFeedLink + * @param string $rel (optional) The rel value of the link to be found. + * If null, the array of links is returned. + * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink + * object corresponding to the requested rel value is returned + * if found, or null if the requested value is not found. If + * $rel is null or not specified, an array of all available + * feed links for this entry is returned, or null if no feed + * links are set. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Returns the URL in the gd:feedLink with the provided rel value + * + * @param string $rel The rel value to find + * @return mixed Either the URL as a string or null if a feedLink wasn't + * found with the provided rel value + */ + public function getFeedLinkHref($rel) + { + $feedLink = $this->getFeedLink($rel); + if ($feedLink !== null) { + return $feedLink->href; + } else { + return null; + } + } + + /** + * Returns the URL of the playlist list feed + * + * @return string The URL of the playlist video feed + */ + public function getPlaylistListFeedUrl() + { + return $this->getFeedLinkHref(Zend_Gdata_YouTube::USER_PLAYLISTS_REL); + } + + /** + * Returns the URL of the uploads feed + * + * @return string The URL of the uploads video feed + */ + public function getUploadsFeedUrl() + { + return $this->getFeedLinkHref(Zend_Gdata_YouTube::USER_UPLOADS_REL); + } + + /** + * Returns the URL of the subscriptions feed + * + * @return string The URL of the subscriptions feed + */ + public function getSubscriptionsFeedUrl() + { + return $this->getFeedLinkHref(Zend_Gdata_YouTube::USER_SUBSCRIPTIONS_REL); + } + + /** + * Returns the URL of the contacts feed + * + * @return string The URL of the contacts feed + */ + public function getContactsFeedUrl() + { + return $this->getFeedLinkHref(Zend_Gdata_YouTube::USER_CONTACTS_REL); + } + + /** + * Returns the URL of the favorites feed + * + * @return string The URL of the favorites feed + */ + public function getFavoritesFeedUrl() + { + return $this->getFeedLinkHref(Zend_Gdata_YouTube::USER_FAVORITES_REL); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/VideoEntry.php b/lib/zend/Zend/Gdata/YouTube/VideoEntry.php new file mode 100644 index 0000000000..0389df4c72 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/VideoEntry.php @@ -0,0 +1,1095 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + + /** + * Retrieves a DOMElement which corresponds to this element and all + * child properties. This is used to build an entry back into a DOM + * and eventually XML text for sending to the server upon updates, or + * for application storage/persistence. + * + * @param DOMDocument $doc The DOMDocument used to construct DOMElements + * @return DOMElement The DOMElement representing this element and all + * child properties. + */ + public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null) + { + $element = parent::getDOM($doc, $majorVersion, $minorVersion); + if ($this->_noEmbed != null) { + $element->appendChild($this->_noEmbed->getDOM( + $element->ownerDocument)); + } + if ($this->_statistics != null) { + $element->appendChild($this->_statistics->getDOM( + $element->ownerDocument)); + } + if ($this->_racy != null) { + $element->appendChild($this->_racy->getDOM( + $element->ownerDocument)); + } + if ($this->_recorded != null) { + $element->appendChild($this->_recorded->getDOM( + $element->ownerDocument)); + } + if ($this->_location != null) { + $element->appendChild($this->_location->getDOM( + $element->ownerDocument)); + } + if ($this->_rating != null) { + $element->appendChild($this->_rating->getDOM( + $element->ownerDocument)); + } + if ($this->_comments != null) { + $element->appendChild($this->_comments->getDOM( + $element->ownerDocument)); + } + if ($this->_feedLink != null) { + foreach ($this->_feedLink as $feedLink) { + $element->appendChild($feedLink->getDOM( + $element->ownerDocument)); + } + } + if ($this->_where != null) { + $element->appendChild($this->_where->getDOM( + $element->ownerDocument)); + } + return $element; + } + + /** + * Creates individual Entry objects of the appropriate type and + * stores them in the $_entry array based upon DOM data. + * + * @param DOMNode $child The DOMNode to process + */ + protected function takeChildFromDOM($child) + { + $absoluteNodeName = $child->namespaceURI . ':' . $child->localName; + + switch ($absoluteNodeName) { + case $this->lookupNamespace('yt') . ':' . 'statistics': + $statistics = new Zend_Gdata_YouTube_Extension_Statistics(); + $statistics->transferFromDOM($child); + $this->_statistics = $statistics; + break; + case $this->lookupNamespace('yt') . ':' . 'racy': + $racy = new Zend_Gdata_YouTube_Extension_Racy(); + $racy->transferFromDOM($child); + $this->_racy = $racy; + break; + case $this->lookupNamespace('yt') . ':' . 'recorded': + $recorded = new Zend_Gdata_YouTube_Extension_Recorded(); + $recorded->transferFromDOM($child); + $this->_recorded = $recorded; + break; + case $this->lookupNamespace('yt') . ':' . 'location': + $location = new Zend_Gdata_YouTube_Extension_Location(); + $location->transferFromDOM($child); + $this->_location = $location; + break; + case $this->lookupNamespace('gd') . ':' . 'rating': + $rating = new Zend_Gdata_Extension_Rating(); + $rating->transferFromDOM($child); + $this->_rating = $rating; + break; + case $this->lookupNamespace('gd') . ':' . 'comments': + $comments = new Zend_Gdata_Extension_Comments(); + $comments->transferFromDOM($child); + $this->_comments = $comments; + break; + case $this->lookupNamespace('yt') . ':' . 'noembed': + $noEmbed = new Zend_Gdata_YouTube_Extension_NoEmbed(); + $noEmbed->transferFromDOM($child); + $this->_noEmbed = $noEmbed; + break; + case $this->lookupNamespace('gd') . ':' . 'feedLink': + $feedLink = new Zend_Gdata_Extension_FeedLink(); + $feedLink->transferFromDOM($child); + $this->_feedLink[] = $feedLink; + break; + case $this->lookupNamespace('georss') . ':' . 'where': + $where = new Zend_Gdata_Geo_Extension_GeoRssWhere(); + $where->transferFromDOM($child); + $this->_where = $where; + break; + case $this->lookupNamespace('atom') . ':' . 'link'; + $link = new Zend_Gdata_YouTube_Extension_Link(); + $link->transferFromDOM($child); + $this->_link[] = $link; + break; + case $this->lookupNamespace('app') . ':' . 'control': + $control = new Zend_Gdata_YouTube_Extension_Control(); + $control->transferFromDOM($child); + $this->_control = $control; + break; + default: + parent::takeChildFromDOM($child); + break; + } + } + + /** + * Sets when the video was recorded. + * + * @param Zend_Gdata_YouTube_Extension_Recorded $recorded When the video was recorded + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setRecorded($recorded = null) + { + $this->_recorded = $recorded; + return $this; + } + + /** + * Gets the date that the video was recorded. + * + * @return Zend_Gdata_YouTube_Extension_Recorded|null + */ + public function getRecorded() + { + return $this->_recorded; + } + + /** + * Sets the location information. + * + * @param Zend_Gdata_YouTube_Extension_Location $location Where the video + * was recorded + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setLocation($location = null) + { + $this->_location = $location; + return $this; + } + + /** + * Gets the location where the video was recorded. + * + * @return Zend_Gdata_YouTube_Extension_Location|null + */ + public function getLocation() + { + return $this->_location; + } + + /** + * If an instance of Zend_Gdata_YouTube_Extension_NoEmbed is passed in, + * the video cannot be embedded. Otherwise, if null is passsed in, the + * video is able to be embedded. + * + * @param Zend_Gdata_YouTube_Extension_NoEmbed $noEmbed Whether or not the + * video can be embedded. + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setNoEmbed($noEmbed = null) + { + $this->_noEmbed = $noEmbed; + return $this; + } + + /** + * If the return value is an instance of + * Zend_Gdata_YouTube_Extension_NoEmbed, this video cannot be embedded. + * + * @return Zend_Gdata_YouTube_Extension_NoEmbed|null Whether or not the video can be embedded + */ + public function getNoEmbed() + { + return $this->_noEmbed; + } + + /** + * Checks whether the video is embeddable. + * + * @return bool Returns true if the video is embeddable. + */ + public function isVideoEmbeddable() + { + if ($this->getNoEmbed() == null) { + return true; + } else { + return false; + } + } + + /** + * Sets the statistics relating to the video. + * + * @param Zend_Gdata_YouTube_Extension_Statistics $statistics The statistics relating to the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setStatistics($statistics = null) + { + $this->_statistics = $statistics; + return $this; + } + + /** + * Returns the statistics relating to the video. + * + * @return Zend_Gdata_YouTube_Extension_Statistics The statistics relating to the video + */ + public function getStatistics() + { + return $this->_statistics; + } + + /** + * Specifies that the video has racy content. + * + * @param Zend_Gdata_YouTube_Extension_Racy $racy The racy flag object + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setRacy($racy = null) + { + if ($this->getMajorProtocolVersion() == 2) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException( + 'Calling getRacy() on a YouTube VideoEntry is deprecated ' . + 'as of version 2 of the API.'); + } + + $this->_racy = $racy; + return $this; + } + + /** + * Returns the racy flag object. + * + * @throws Zend_Gdata_App_VersionException + * @return Zend_Gdata_YouTube_Extension_Racy|null The racy flag object + */ + public function getRacy() + { + if ($this->getMajorProtocolVersion() == 2) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException( + 'Calling getRacy() on a YouTube VideoEntry is deprecated ' . + 'as of version 2 of the API.'); + } + return $this->_racy; + } + + /** + * Sets the rating relating to the video. + * + * @param Zend_Gdata_Extension_Rating $rating The rating relating to the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setRating($rating = null) + { + $this->_rating = $rating; + return $this; + } + + /** + * Returns the rating relating to the video. + * + * @return Zend_Gdata_Extension_Rating The rating relating to the video + */ + public function getRating() + { + return $this->_rating; + } + + /** + * Sets the comments relating to the video. + * + * @param Zend_Gdata_Extension_Comments $comments The comments relating to the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setComments($comments = null) + { + $this->_comments = $comments; + return $this; + } + + /** + * Returns the comments relating to the video. + * + * @return Zend_Gdata_Extension_Comments The comments relating to the video + */ + public function getComments() + { + return $this->_comments; + } + + /** + * Sets the array of embedded feeds related to the video + * + * @param array $feedLink The array of embedded feeds relating to the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setFeedLink($feedLink = null) + { + $this->_feedLink = $feedLink; + return $this; + } + + /** + * Get the feed link property for this entry. + * + * @see setFeedLink + * @param string $rel (optional) The rel value of the link to be found. + * If null, the array of links is returned. + * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink + * object corresponding to the requested rel value is returned + * if found, or null if the requested value is not found. If + * $rel is null or not specified, an array of all available + * feed links for this entry is returned, or null if no feed + * links are set. + */ + public function getFeedLink($rel = null) + { + if ($rel == null) { + return $this->_feedLink; + } else { + foreach ($this->_feedLink as $feedLink) { + if ($feedLink->rel == $rel) { + return $feedLink; + } + } + return null; + } + } + + /** + * Returns the link element relating to video responses. + * + * @return Zend_Gdata_App_Extension_Link + */ + public function getVideoResponsesLink() + { + return $this->getLink(Zend_Gdata_YouTube::VIDEO_RESPONSES_REL); + } + + /** + * Returns the link element relating to video ratings. + * + * @return Zend_Gdata_App_Extension_Link + */ + public function getVideoRatingsLink() + { + return $this->getLink(Zend_Gdata_YouTube::VIDEO_RATINGS_REL); + } + + /** + * Returns the link element relating to video complaints. + * + * @return Zend_Gdata_App_Extension_Link + */ + public function getVideoComplaintsLink() + { + return $this->getLink(Zend_Gdata_YouTube::VIDEO_COMPLAINTS_REL); + } + + /** + * Gets the YouTube video ID based upon the atom:id value + * + * @return string The video ID + */ + public function getVideoId() + { + if ($this->getMajorProtocolVersion() == 2) { + $videoId = $this->getMediaGroup()->getVideoId()->text; + } else { + $fullId = $this->getId()->getText(); + $position = strrpos($fullId, '/'); + if ($position === false) { + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception( + 'Slash not found in atom:id of ' . $fullId); + } else { + $videoId = substr($fullId, $position + 1); + } + } + return $videoId; + } + + /** + * Gets the date that the video was recorded. + * + * @return string|null The date that the video was recorded + */ + public function getVideoRecorded() + { + $recorded = $this->getRecorded(); + if ($recorded != null) { + return $recorded->getText(); + } else { + return null; + } + } + + /** + * Sets the date that the video was recorded. + * + * @param string $recorded The date that the video was recorded, in the + * format of '2001-06-19' + */ + public function setVideoRecorded($recorded) + { + $this->setRecorded( + new Zend_Gdata_YouTube_Extension_Recorded($recorded)); + return $this; + } + + /** + * Gets the georss:where element + * + * @return Zend_Gdata_Geo_Extension_GeoRssWhere + */ + public function getWhere() + { + return $this->_where; + } + + /** + * Sets the georss:where element + * + * @param Zend_Gdata_Geo_Extension_GeoRssWhere $value The georss:where class value + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setWhere($value) + { + $this->_where = $value; + return $this; + } + + /** + * Gets the title of the video as a string. null is returned + * if the video title is not available. + * + * @return string|null The title of the video + */ + public function getVideoTitle() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getTitle() != null) { + return $this->getMediaGroup()->getTitle()->getText(); + } else { + return null; + } + } + + /** + * Sets the title of the video as a string. + * + * @param string $title Title for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoTitle($title) + { + $this->ensureMediaGroupIsNotNull(); + $this->getMediaGroup()->setTitle( + new Zend_Gdata_Media_Extension_MediaTitle($title)); + return $this; + } + + /** + * Sets the description of the video as a string. + * + * @param string $description Description for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoDescription($description) + { + $this->ensureMediaGroupIsNotNull(); + $this->getMediaGroup()->setDescription( + new Zend_Gdata_Media_Extension_MediaDescription($description)); + return $this; + } + + + /** + * Gets the description of the video as a string. null is returned + * if the video description is not available. + * + * @return string|null The description of the video + */ + public function getVideoDescription() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getDescription() != null) { + return $this->getMediaGroup()->getDescription()->getText(); + } else { + return null; + } + } + + /** + * Gets the URL of the YouTube video watch page. null is returned + * if the video watch page URL is not available. + * + * @return string|null The URL of the YouTube video watch page + */ + public function getVideoWatchPageUrl() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getPlayer() != null && + array_key_exists(0, $this->getMediaGroup()->getPlayer())) { + $players = $this->getMediaGroup()->getPlayer(); + return $players[0]->getUrl(); + } else { + return null; + } + } + + /** + * Gets an array of the thumbnails representing the video. + * Each thumbnail is an element of the array, and is an + * array of the thumbnail properties - time, height, width, + * and url. For convient usage inside a foreach loop, an + * empty array is returned if there are no thumbnails. + * + * @return array An array of video thumbnails. + */ + public function getVideoThumbnails() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getThumbnail() != null) { + + $thumbnailArray = array(); + + foreach ($this->getMediaGroup()->getThumbnail() as $thumbnailObj) { + $thumbnail = array(); + $thumbnail['time'] = $thumbnailObj->time; + $thumbnail['height'] = $thumbnailObj->height; + $thumbnail['width'] = $thumbnailObj->width; + $thumbnail['url'] = $thumbnailObj->url; + $thumbnailArray[] = $thumbnail; + } + return $thumbnailArray; + } else { + return array(); + } + } + + /** + * Gets the URL of the flash player SWF. null is returned if the + * duration value is not available. + * + * @return string|null The URL of the flash player SWF + */ + public function getFlashPlayerUrl() + { + $this->ensureMediaGroupIsNotNull(); + foreach ($this->getMediaGroup()->getContent() as $content) { + if ($content->getType() === 'application/x-shockwave-flash') { + return $content->getUrl(); + } + } + return null; + } + + /** + * Gets the duration of the video, in seconds. null is returned + * if the duration value is not available. + * + * @return string|null The duration of the video, in seconds. + */ + public function getVideoDuration() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getDuration() != null) { + return $this->getMediaGroup()->getDuration()->getSeconds(); + } else { + return null; + } + } + + /** + * Checks whether the video is private. + * + * @return bool Return true if video is private + */ + public function isVideoPrivate() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getPrivate() != null) { + return true; + } else { + return false; + } + } + + /** + * Sets video to private. + * + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoPrivate() + { + $this->ensureMediaGroupIsNotNull(); + $this->getMediaGroup()->setPrivate(new Zend_Gdata_YouTube_Extension_Private()); + return $this; + } + + /** + * Sets a private video to be public. + * + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoPublic() + { + $this->ensureMediaGroupIsNotNull(); + $this->getMediaGroup()->private = null; + return $this; + } + + /** + * Gets an array of the tags assigned to this video. For convient + * usage inside a foreach loop, an empty array is returned when there + * are no tags assigned. + * + * @return array An array of the tags assigned to this video + */ + public function getVideoTags() + { + $this->ensureMediaGroupIsNotNull(); + if ($this->getMediaGroup()->getKeywords() != null) { + + $keywords = $this->getMediaGroup()->getKeywords(); + $keywordsString = $keywords->getText(); + if (strlen(trim($keywordsString)) > 0) { + return preg_split('/(, *)|,/', $keywordsString); + } + } + return array(); + } + + /** + * Sets the keyword tags for a video. + * + * @param mixed $tags Either a comma-separated string or an array + * of tags for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoTags($tags) + { + $this->ensureMediaGroupIsNotNull(); + $keywords = new Zend_Gdata_Media_Extension_MediaKeywords(); + if (is_array($tags)) { + $tags = implode(', ', $tags); + } + $keywords->setText($tags); + $this->getMediaGroup()->setKeywords($keywords); + return $this; + } + + /** + * Gets the number of views for this video. null is returned if the + * number of views is not available. + * + * @return string|null The number of views for this video + */ + public function getVideoViewCount() + { + if ($this->getStatistics() != null) { + return $this->getStatistics()->getViewCount(); + } else { + return null; + } + } + + /** + * Gets the location specified for this video, if available. The location + * is returned as an array containing the keys 'longitude' and 'latitude'. + * null is returned if the location is not available. + * + * @return array|null The location specified for this video + */ + public function getVideoGeoLocation() + { + if ($this->getWhere() != null && + $this->getWhere()->getPoint() != null && + ($position = $this->getWhere()->getPoint()->getPos()) != null) { + + $positionString = $position->__toString(); + + if (strlen(trim($positionString)) > 0) { + $positionArray = explode(' ', trim($positionString)); + if (count($positionArray) == 2) { + $returnArray = array(); + $returnArray['latitude'] = $positionArray[0]; + $returnArray['longitude'] = $positionArray[1]; + return $returnArray; + } + } + } + return null; + } + + /** + * Gets the rating information for this video, if available. The rating + * is returned as an array containing the keys 'average' and 'numRaters'. + * null is returned if the rating information is not available. + * + * @return array|null The rating information for this video + */ + public function getVideoRatingInfo() + { + if ($this->getRating() != null) { + $returnArray = array(); + $returnArray['average'] = $this->getRating()->getAverage(); + $returnArray['numRaters'] = $this->getRating()->getNumRaters(); + return $returnArray; + } else { + return null; + } + } + + /** + * Gets the category of this video, if available. The category is returned + * as a string. Valid categories are found at: + * http://gdata.youtube.com/schemas/2007/categories.cat + * If the category is not set, null is returned. + * + * @return string|null The category of this video + */ + public function getVideoCategory() + { + $this->ensureMediaGroupIsNotNull(); + $categories = $this->getMediaGroup()->getCategory(); + if ($categories != null) { + foreach($categories as $category) { + if ($category->getScheme() == self::YOUTUBE_CATEGORY_SCHEMA) { + return $category->getText(); + } + } + } + return null; + } + + /** + * Sets the category of the video as a string. + * + * @param string $category Categories for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoCategory($category) + { + $this->ensureMediaGroupIsNotNull(); + $this->getMediaGroup()->setCategory(array(new Zend_Gdata_Media_Extension_MediaCategory($category, self::YOUTUBE_CATEGORY_SCHEMA))); + return $this; + } + + /** + * Gets the developer tags for the video, if available and if client is + * authenticated with a valid developerKey. The tags are returned + * as an array. + * If no tags are set, null is returned. + * + * @return array|null The developer tags for this video or null if none were set. + */ + public function getVideoDeveloperTags() + { + $developerTags = null; + $this->ensureMediaGroupIsNotNull(); + + $categoryArray = $this->getMediaGroup()->getCategory(); + if ($categoryArray != null) { + foreach ($categoryArray as $category) { + if ($category instanceof Zend_Gdata_Media_Extension_MediaCategory) { + if ($category->getScheme() == self::YOUTUBE_DEVELOPER_TAGS_SCHEMA) { + $developerTags[] = $category->getText(); + } + } + } + return $developerTags; + } + return null; + } + + /** + * Adds a developer tag to array of tags for the video. + * + * @param string $developerTag DeveloperTag for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function addVideoDeveloperTag($developerTag) + { + $this->ensureMediaGroupIsNotNull(); + $newCategory = new Zend_Gdata_Media_Extension_MediaCategory($developerTag, self::YOUTUBE_DEVELOPER_TAGS_SCHEMA); + + if ($this->getMediaGroup()->getCategory() == null) { + $this->getMediaGroup()->setCategory($newCategory); + } else { + $categories = $this->getMediaGroup()->getCategory(); + $categories[] = $newCategory; + $this->getMediaGroup()->setCategory($categories); + } + return $this; + } + + /** + * Set multiple developer tags for the video as strings. + * + * @param array $developerTags Array of developerTag for the video + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface + */ + public function setVideoDeveloperTags($developerTags) + { + foreach($developerTags as $developerTag) { + $this->addVideoDeveloperTag($developerTag); + } + return $this; + } + + + /** + * Get the current publishing state of the video. + * + * @return Zend_Gdata_YouTube_Extension_State|null The publishing state of this video + */ + public function getVideoState() + { + $control = $this->getControl(); + if ($control != null && + $control->getDraft() != null && + $control->getDraft()->getText() == 'yes') { + + return $control->getState(); + } + return null; + } + + /** + * Get the VideoEntry's Zend_Gdata_YouTube_Extension_MediaGroup object. + * If the mediaGroup does not exist, then set it. + * + * @return void + */ + public function ensureMediaGroupIsNotNull() + { + if ($this->getMediagroup() == null) { + $this->setMediagroup(new Zend_Gdata_YouTube_Extension_MediaGroup()); + } + } + + /** + * Helper function to conveniently set a video's rating. + * + * @param integer $ratingValue A number representing the rating. Must + * be between 1 and 5 inclusive. + * @throws Zend_Gdata_Exception + * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface. + */ + public function setVideoRating($ratingValue) + { + if ($ratingValue < 1 || $ratingValue > 5) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Rating for video entry must be between 1 and 5 inclusive.'); + } + + require_once 'Zend/Gdata/Extension/Rating.php'; + $rating = new Zend_Gdata_Extension_Rating(null, 1, 5, null, + $ratingValue); + $this->setRating($rating); + return $this; + } + + /** + * Retrieve the URL for a video's comment feed. + * + * @return string|null The URL if found, or null if not found. + */ + public function getVideoCommentFeedUrl() + { + $commentsExtension = $this->getComments(); + $commentsFeedUrl = null; + if ($commentsExtension) { + $commentsFeedLink = $commentsExtension->getFeedLink(); + if ($commentsFeedLink) { + $commentsFeedUrl = $commentsFeedLink->getHref(); + } + } + return $commentsFeedUrl; + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/VideoFeed.php b/lib/zend/Zend/Gdata/YouTube/VideoFeed.php new file mode 100644 index 0000000000..fb2c1ed144 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/VideoFeed.php @@ -0,0 +1,65 @@ +registerAllNamespaces(Zend_Gdata_YouTube::$namespaces); + parent::__construct($element); + } + +} diff --git a/lib/zend/Zend/Gdata/YouTube/VideoQuery.php b/lib/zend/Zend/Gdata/YouTube/VideoQuery.php new file mode 100644 index 0000000000..03ca966a59 --- /dev/null +++ b/lib/zend/Zend/Gdata/YouTube/VideoQuery.php @@ -0,0 +1,540 @@ +_url = Zend_Gdata_YouTube::STANDARD_TOP_RATED_URI; + break; + case 'most viewed': + $this->_url = Zend_Gdata_YouTube::STANDARD_MOST_VIEWED_URI; + break; + case 'recently featured': + $this->_url = Zend_Gdata_YouTube::STANDARD_RECENTLY_FEATURED_URI; + break; + case 'mobile': + $this->_url = Zend_Gdata_YouTube::STANDARD_WATCH_ON_MOBILE_URI; + break; + case 'related': + if ($videoId === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Video ID must be set for feed of type: ' . $feedType); + } else { + $this->_url = Zend_Gdata_YouTube::VIDEO_URI . '/' . $videoId . + '/related'; + } + break; + case 'responses': + if ($videoId === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_Exception( + 'Video ID must be set for feed of type: ' . $feedType); + } else { + $this->_url = Zend_Gdata_YouTube::VIDEO_URI . '/' . $videoId . + 'responses'; + } + break; + case 'comments': + if ($videoId === null) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_Exception( + 'Video ID must be set for feed of type: ' . $feedType); + } else { + $this->_url = Zend_Gdata_YouTube::VIDEO_URI . '/' . + $videoId . 'comments'; + if ($entry !== null) { + $this->_url .= '/' . $entry; + } + } + break; + default: + require_once 'Zend/Gdata/App/Exception.php'; + throw new Zend_Gdata_App_Exception('Unknown feed type'); + break; + } + } + + /** + * Sets the location parameter for the query + * + * @param string $value + * @throws Zend_Gdata_App_InvalidArgumentException + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setLocation($value) + { + switch($value) { + case null: + unset($this->_params['location']); + default: + $parameters = explode(',', $value); + if (count($parameters) != 2) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'You must provide 2 coordinates to the location ' . + 'URL parameter'); + } + + foreach($parameters as $param) { + $temp = trim($param); + // strip off the optional exclamation mark for numeric check + if (substr($temp, -1) == '!') { + $temp = substr($temp, -1); + } + if (!is_numeric($temp)) { + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Value provided to location parameter must' . + ' be in the form of two coordinates'); + } + } + $this->_params['location'] = $value; + } + } + + /** + * Get the value of the location parameter + * + * @return string|null Return the location if it exists, null otherwise. + */ + public function getLocation() + { + if (array_key_exists('location', $this->_params)) { + return $this->_params['location']; + } else { + return null; + } + } + + + /** + * Sets the location-radius parameter for the query + * + * @param string $value + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setLocationRadius($value) + { + switch($value) { + case null: + unset($this->_params['location-radius']); + default: + $this->_params['location-radius'] = $value; + } + } + + /** + * Get the value of the location-radius parameter + * + * @return string|null Return the location-radius if it exists, + * null otherwise. + */ + public function getLocationRadius() + { + if (array_key_exists('location-radius', $this->_params)) { + return $this->_params['location-radius']; + } else { + return null; + } + } + + /** + * Sets the time period over which this query should apply + * + * @param string $value + * @throws Zend_Gdata_App_InvalidArgumentException + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setTime($value = null) + { + switch ($value) { + case 'today': + $this->_params['time'] = 'today'; + break; + case 'this_week': + $this->_params['time'] = 'this_week'; + break; + case 'this_month': + $this->_params['time'] = 'this_month'; + break; + case 'all_time': + $this->_params['time'] = 'all_time'; + break; + case null: + unset($this->_params['time']); + default: + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Unknown time value'); + break; + } + return $this; + } + + /** + * Sets the value of the uploader parameter + * + * @param string $value The value of the uploader parameter. Currently this + * can only be set to the value of 'partner'. + * @throws Zend_Gdata_App_InvalidArgumentException + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setUploader($value = null) + { + switch ($value) { + case 'partner': + $this->_params['uploader'] = 'partner'; + break; + case null: + unset($this->_params['uploader']); + break; + default: + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'Unknown value for uploader'); + } + return $this; + } + + /** + * Sets the formatted video query (vq) URL param value + * + * @param string $value + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setVideoQuery($value = null) + { + if ($value != null) { + $this->_params['vq'] = $value; + } else { + unset($this->_params['vq']); + } + return $this; + } + + /** + * Sets the param to return videos of a specific format + * + * @param string $value + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setFormat($value = null) + { + if ($value != null) { + $this->_params['format'] = $value; + } else { + unset($this->_params['format']); + } + return $this; + } + + /** + * Sets whether or not to include racy videos in the search results + * + * @param string $value + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setRacy($value = null) + { + switch ($value) { + case 'include': + $this->_params['racy'] = $value; + break; + case 'exclude': + $this->_params['racy'] = $value; + break; + case null: + unset($this->_params['racy']); + break; + } + return $this; + } + + /** + * Whether or not to include racy videos in the search results + * + * @return string|null The value of racy if it exists, null otherwise. + */ + public function getRacy() + { + if (array_key_exists('racy', $this->_params)) { + return $this->_params['racy']; + } else { + return null; + } + } + + /** + * Set the safeSearch parameter + * + * @param string $value The value of the parameter, currently only 'none', + * 'moderate' or 'strict' are allowed values. + * @throws Zend_Gdata_App_InvalidArgumentException + * @return Zend_Gdata_YouTube_VideoQuery Provides a fluent interface + */ + public function setSafeSearch($value) + { + switch ($value) { + case 'none': + $this->_params['safeSearch'] = 'none'; + break; + case 'moderate': + $this->_params['safeSearch'] = 'moderate'; + break; + case 'strict': + $this->_params['safeSearch'] = 'strict'; + break; + case null: + unset($this->_params['safeSearch']); + default: + require_once 'Zend/Gdata/App/InvalidArgumentException.php'; + throw new Zend_Gdata_App_InvalidArgumentException( + 'The safeSearch parameter only supports the values '. + '\'none\', \'moderate\' or \'strict\'.'); + } + } + + /** + * Return the value of the safeSearch parameter + * + * @return string|null The value of the safeSearch parameter if it has been + * set, null otherwise. + */ + public function getSafeSearch() + { + if (array_key_exists('safeSearch', $this->_params)) { + return $this->_params['safeSearch']; + } + return $this; + } + + /** + * Set the value of the orderby parameter + * + * @param string $value + * @return Zend_Gdata_YouTube_Query Provides a fluent interface + */ + public function setOrderBy($value) + { + if ($value != null) { + $this->_params['orderby'] = $value; + } else { + unset($this->_params['orderby']); + } + return $this; + } + + /** + * Return the value of the format parameter + * + * @return string|null The value of format if it exists, null otherwise. + */ + public function getFormat() + { + if (array_key_exists('format', $this->_params)) { + return $this->_params['format']; + } else { + return null; + } + } + + /** + * Return the value of the video query that has been set + * + * @return string|null The value of the video query if it exists, + * null otherwise. + */ + public function getVideoQuery() + { + if (array_key_exists('vq', $this->_params)) { + return $this->_params['vq']; + } else { + return null; + } + } + + /** + * Return the value of the time parameter + * + * @return string|null The time parameter if it exists, null otherwise. + */ + public function getTime() + { + if (array_key_exists('time', $this->_params)) { + return $this->_params['time']; + } else { + return null; + } + } + + /** + * Return the value of the orderby parameter if it exists + * + * @return string|null The value of orderby if it exists, null otherwise. + */ + public function getOrderBy() + { + if (array_key_exists('orderby', $this->_params)) { + return $this->_params['orderby']; + } else { + return null; + } + } + + /** + * Generate the query string from the URL parameters, optionally modifying + * them based on protocol version. + * + * @param integer $majorProtocolVersion The major protocol version + * @param integer $minorProtocolVersion The minor protocol version + * @throws Zend_Gdata_App_VersionException + * @return string querystring + */ + public function getQueryString($majorProtocolVersion = null, + $minorProtocolVersion = null) + { + $queryArray = array(); + + foreach ($this->_params as $name => $value) { + if (substr($name, 0, 1) == '_') { + continue; + } + + switch($name) { + case 'location-radius': + if ($majorProtocolVersion == 1) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException("The $name " . + "parameter is only supported in version 2."); + } + break; + + case 'racy': + if ($majorProtocolVersion == 2) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException("The $name " . + "parameter is not supported in version 2. " . + "Please use 'safeSearch'."); + } + break; + + case 'safeSearch': + if ($majorProtocolVersion == 1) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException("The $name " . + "parameter is only supported in version 2. " . + "Please use 'racy'."); + } + break; + + case 'uploader': + if ($majorProtocolVersion == 1) { + require_once 'Zend/Gdata/App/VersionException.php'; + throw new Zend_Gdata_App_VersionException("The $name " . + "parameter is only supported in version 2."); + } + break; + + case 'vq': + if ($majorProtocolVersion == 2) { + $name = 'q'; + } + break; + } + + $queryArray[] = urlencode($name) . '=' . urlencode($value); + + } + if (count($queryArray) > 0) { + return '?' . implode('&', $queryArray); + } else { + return ''; + } + } + + /** + * Returns the generated full query URL, optionally modifying it based on + * the protocol version. + * + * @param integer $majorProtocolVersion The major protocol version + * @param integer $minorProtocolVersion The minor protocol version + * @return string The URL + */ + public function getQueryUrl($majorProtocolVersion = null, + $minorProtocolVersion = null) + { + if (isset($this->_url)) { + $url = $this->_url; + } else { + $url = Zend_Gdata_YouTube::VIDEO_URI; + } + if ($this->getCategory() !== null) { + $url .= '/-/' . $this->getCategory(); + } + $url = $url . $this->getQueryString($majorProtocolVersion, + $minorProtocolVersion); + return $url; + } + +} diff --git a/lib/zend/Zend/Http/Client.php b/lib/zend/Zend/Http/Client.php index 621ccbe905..8fbb426705 100644 --- a/lib/zend/Zend/Http/Client.php +++ b/lib/zend/Zend/Http/Client.php @@ -17,7 +17,7 @@ * @package Zend_Http * @subpackage Client * @version $Id$ - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -55,7 +55,7 @@ require_once 'Zend/Http/Response.php'; * @package Zend_Http * @subpackage Client * @throws Zend_Http_Client_Exception - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Http_Client @@ -223,14 +223,14 @@ class Zend_Http_Client /** * Fileinfo magic database resource - * + * * This varaiable is populated the first time _detectFileMimeType is called * and is then reused on every call to this method * * @var resource */ static protected $_fileInfoDb = null; - + /** * Contructor method. Will create a new HTTP client. Accepts the target * URL and optionally configuration array. @@ -240,8 +240,12 @@ class Zend_Http_Client */ public function __construct($uri = null, $config = null) { - if ($uri !== null) $this->setUri($uri); - if ($config !== null) $this->setConfig($config); + if ($uri !== null) { + $this->setUri($uri); + } + if ($config !== null) { + $this->setConfig($config); + } } /** @@ -291,26 +295,30 @@ class Zend_Http_Client /** * Set configuration parameters for this HTTP client * - * @param array $config + * @param Zend_Config | array $config * @return Zend_Http_Client * @throws Zend_Http_Client_Exception */ public function setConfig($config = array()) { - if (! is_array($config)) { + if ($config instanceof Zend_Config) { + $config = $config->toArray(); + + } elseif (! is_array($config)) { /** @see Zend_Http_Client_Exception */ require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception('Expected array parameter, given ' . gettype($config)); + throw new Zend_Http_Client_Exception('Array or Zend_Config object expected, got ' . gettype($config)); } - foreach ($config as $k => $v) + foreach ($config as $k => $v) { $this->config[strtolower($k)] = $v; + } // Pass configuration options to the adapter if it exists if ($this->adapter instanceof Zend_Http_Client_Adapter_Interface) { $this->adapter->setConfig($config); } - + return $this; } @@ -327,15 +335,15 @@ class Zend_Http_Client */ public function setMethod($method = self::GET) { - $regex = '/^[^\x00-\x1f\x7f-\xff\(\)<>@,;:\\\\"\/\[\]\?={}\s]+$/'; - if (! preg_match($regex, $method)) { + if (! preg_match('/^[^\x00-\x1f\x7f-\xff\(\)<>@,;:\\\\"\/\[\]\?={}\s]+$/', $method)) { /** @see Zend_Http_Client_Exception */ require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("'{$method}' is not a valid HTTP request method."); } - if ($method == self::POST && $this->enctype === null) + if ($method == self::POST && $this->enctype === null) { $this->setEncType(self::ENC_URLENCODED); + } $this->method = $method; @@ -374,8 +382,9 @@ class Zend_Http_Client } } else { // Check if $name needs to be split - if ($value === null && (strpos($name, ':') > 0)) + if ($value === null && (strpos($name, ':') > 0)) { list($name, $value) = explode(':', $name, 2); + } // Make sure the name is valid if we are in strict mode if ($this->config['strict'] && (! preg_match('/^[a-zA-Z0-9-]+$/', $name))) { @@ -383,7 +392,7 @@ class Zend_Http_Client require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("{$name} is not a valid HTTP header name"); } - + $normalized_name = strtolower($name); // If $value is null or false, unset the header @@ -392,8 +401,10 @@ class Zend_Http_Client // Else, set the header } else { - // Header names are storred lowercase internally. - if (is_string($value)) $value = trim($value); + // Header names are stored lowercase internally. + if (is_string($value)) { + $value = trim($value); + } $this->headers[$normalized_name] = array($name, $value); } } @@ -556,8 +567,9 @@ class Zend_Http_Client */ public function setCookieJar($cookiejar = true) { - if (! class_exists('Zend_Http_CookieJar')) + if (! class_exists('Zend_Http_CookieJar')) { require_once 'Zend/Http/CookieJar.php'; + } if ($cookiejar instanceof Zend_Http_CookieJar) { $this->cookiejar = $cookiejar; @@ -595,8 +607,9 @@ class Zend_Http_Client */ public function setCookie($cookie, $value = null) { - if (! class_exists('Zend_Http_Cookie')) + if (! class_exists('Zend_Http_Cookie')) { require_once 'Zend/Http/Cookie.php'; + } if (is_array($cookie)) { foreach ($cookie as $c => $v) { @@ -610,7 +623,9 @@ class Zend_Http_Client return $this; } - if ($value !== null) $value = urlencode($value); + if ($value !== null) { + $value = urlencode($value); + } if (isset($this->cookiejar)) { if ($cookie instanceof Zend_Http_Cookie) { @@ -634,7 +649,9 @@ class Zend_Http_Client $value = addslashes($value); - if (! isset($this->headers['cookie'])) $this->headers['cookie'] = array('Cookie', ''); + if (! isset($this->headers['cookie'])) { + $this->headers['cookie'] = array('Cookie', ''); + } $this->headers['cookie'][1] .= $cookie . '=' . $value . '; '; } @@ -670,13 +687,20 @@ class Zend_Http_Client throw new Zend_Http_Client_Exception("Unable to read file '{$filename}' for upload"); } - if (! $ctype) $ctype = $this->_detectFileMimeType($filename); + if (! $ctype) { + $ctype = $this->_detectFileMimeType($filename); + } } // Force enctype to multipart/form-data $this->setEncType(self::ENC_FORMDATA); - $this->files[$formname] = array(basename($filename), $ctype, $data); + $this->files[] = array( + 'formname' => $formname, + 'filename' => basename($filename), + 'ctype' => $ctype, + 'data' => $data + ); return $this; } @@ -731,10 +755,12 @@ class Zend_Http_Client $this->raw_post_data = null; // Clear outdated headers - if (isset($this->headers[strtolower(self::CONTENT_TYPE)])) + if (isset($this->headers[strtolower(self::CONTENT_TYPE)])) { unset($this->headers[strtolower(self::CONTENT_TYPE)]); - if (isset($this->headers[strtolower(self::CONTENT_LENGTH)])) + } + if (isset($this->headers[strtolower(self::CONTENT_LENGTH)])) { unset($this->headers[strtolower(self::CONTENT_LENGTH)]); + } return $this; } @@ -775,12 +801,15 @@ class Zend_Http_Client public function setAdapter($adapter) { if (is_string($adapter)) { - try { - Zend_Loader::loadClass($adapter); - } catch (Zend_Exception $e) { - /** @see Zend_Http_Client_Exception */ - require_once 'Zend/Http/Client/Exception.php'; - throw new Zend_Http_Client_Exception("Unable to load adapter '$adapter': {$e->getMessage()}"); + if (!class_exists($adapter)) { + try { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($adapter); + } catch (Zend_Exception $e) { + /** @see Zend_Http_Client_Exception */ + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("Unable to load adapter '$adapter': {$e->getMessage()}"); + } } $adapter = new $adapter; @@ -813,12 +842,16 @@ class Zend_Http_Client throw new Zend_Http_Client_Exception('No valid URI has been passed to the client'); } - if ($method) $this->setMethod($method); + if ($method) { + $this->setMethod($method); + } $this->redirectCounter = 0; $response = null; // Make sure the adapter is loaded - if ($this->adapter == null) $this->setAdapter($this->config['adapter']); + if ($this->adapter == null) { + $this->setAdapter($this->config['adapter']); + } // Send the first request. If redirected, continue. do { @@ -826,7 +859,9 @@ class Zend_Http_Client $uri = clone $this->uri; if (! empty($this->paramsGet)) { $query = $uri->getQuery(); - if (! empty($query)) $query .= '&'; + if (! empty($query)) { + $query .= '&'; + } $query .= http_build_query($this->paramsGet, null, '&'); $uri->setQuery($query); @@ -850,10 +885,14 @@ class Zend_Http_Client } $response = Zend_Http_Response::fromString($response); - if ($this->config['storeresponse']) $this->last_response = $response; + if ($this->config['storeresponse']) { + $this->last_response = $response; + } // Load cookies into cookie jar - if (isset($this->cookiejar)) $this->cookiejar->addCookiesFromResponse($response, $uri); + if (isset($this->cookiejar)) { + $this->cookiejar->addCookiesFromResponse($response, $uri); + } // If we got redirected, look for the Location header if ($response->isRedirect() && ($location = $response->getHeader('location'))) { @@ -931,7 +970,9 @@ class Zend_Http_Client // Set the connection header if (! isset($this->headers['connection'])) { - if (! $this->config['keepalive']) $headers[] = "Connection: close"; + if (! $this->config['keepalive']) { + $headers[] = "Connection: close"; + } } // Set the Accept-encoding header if not set - depending on whether @@ -943,14 +984,14 @@ class Zend_Http_Client $headers[] = 'Accept-encoding: identity'; } } - + // Set the Content-Type header if ($this->method == self::POST && (! isset($this->headers[strtolower(self::CONTENT_TYPE)]) && isset($this->enctype))) { $headers[] = self::CONTENT_TYPE . ': ' . $this->enctype; } - + // Set the user agent header if (! isset($this->headers['user-agent']) && isset($this->config['useragent'])) { $headers[] = "User-Agent: {$this->config['useragent']}"; @@ -967,14 +1008,17 @@ class Zend_Http_Client $cookstr = $this->cookiejar->getMatchingCookies($this->uri, true, Zend_Http_CookieJar::COOKIE_STRING_CONCAT); - if ($cookstr) $headers[] = "Cookie: {$cookstr}"; + if ($cookstr) { + $headers[] = "Cookie: {$cookstr}"; + } } // Add all other user defined headers foreach ($this->headers as $header) { list($name, $value) = $header; - if (is_array($value)) + if (is_array($value)) { $value = implode(', ', $value); + } $headers[] = "$name: $value"; } @@ -995,16 +1039,31 @@ class Zend_Http_Client return ''; } + // If mbstring overloads substr and strlen functions, we have to + // override it's internal encoding + if (function_exists('mb_internal_encoding') && + ((int) ini_get('mbstring.func_overload')) & 2) { + + $mbIntEnc = mb_internal_encoding(); + mb_internal_encoding('ASCII'); + } + // If we have raw_post_data set, just use it as the body. if (isset($this->raw_post_data)) { $this->setHeaders(self::CONTENT_LENGTH, strlen($this->raw_post_data)); + if (isset($mbIntEnc)) { + mb_internal_encoding($mbIntEnc); + } + return $this->raw_post_data; } $body = ''; // If we have files to upload, force enctype to multipart/form-data - if (count ($this->files) > 0) $this->setEncType(self::ENC_FORMDATA); + if (count ($this->files) > 0) { + $this->setEncType(self::ENC_FORMDATA); + } // If we have POST parameters or files, encode and add them to the body if (count($this->paramsPost) > 0 || count($this->files) > 0) { @@ -1015,15 +1074,15 @@ class Zend_Http_Client $this->setHeaders(self::CONTENT_TYPE, self::ENC_FORMDATA . "; boundary={$boundary}"); // Get POST parameters and encode them - $params = $this->_getParametersRecursive($this->paramsPost); + $params = self::_flattenParametersArray($this->paramsPost); foreach ($params as $pp) { $body .= self::encodeFormData($boundary, $pp[0], $pp[1]); } // Encode files - foreach ($this->files as $name => $file) { - $fhead = array(self::CONTENT_TYPE => $file[1]); - $body .= self::encodeFormData($boundary, $name, $file[2], $file[0], $fhead); + foreach ($this->files as $file) { + $fhead = array(self::CONTENT_TYPE => $file['ctype']); + $body .= self::encodeFormData($boundary, $file['formname'], $file['data'], $file['filename'], $fhead); } $body .= "--{$boundary}--\r\n"; @@ -1036,6 +1095,10 @@ class Zend_Http_Client break; default: + if (isset($mbIntEnc)) { + mb_internal_encoding($mbIntEnc); + } + /** @see Zend_Http_Client_Exception */ require_once 'Zend/Http/Client/Exception.php'; throw new Zend_Http_Client_Exception("Cannot handle content type '{$this->enctype}' automatically." . @@ -1043,12 +1106,16 @@ class Zend_Http_Client break; } } - + // Set the Content-Length if we have a body or if request is POST/PUT if ($body || $this->method == self::POST || $this->method == self::PUT) { $this->setHeaders(self::CONTENT_LENGTH, strlen($body)); } + if (isset($mbIntEnc)) { + mb_internal_encoding($mbIntEnc); + } + return $body; } @@ -1060,42 +1127,59 @@ class Zend_Http_Client * necessarily unique. If one of the parameters in as array, it will also * add a [] suffix to the key. * - * @param array $parray The parameters array - * @param bool $urlencode Whether to urlencode the name and value + * This method is deprecated since Zend Framework 1.9 in favour of + * self::_flattenParametersArray() and will be dropped in 2.0 + * + * @deprecated since 1.9 + * + * @param array $parray The parameters array + * @param bool $urlencode Whether to urlencode the name and value * @return array */ protected function _getParametersRecursive($parray, $urlencode = false) { - if (! is_array($parray)) return $parray; + // Issue a deprecated notice + trigger_error("The " . __METHOD__ . " method is deprecated and will be dropped in 2.0.", + E_USER_NOTICE); + + if (! is_array($parray)) { + return $parray; + } $parameters = array(); foreach ($parray as $name => $value) { - if ($urlencode) $name = urlencode($name); + if ($urlencode) { + $name = urlencode($name); + } // If $value is an array, iterate over it if (is_array($value)) { $name .= ($urlencode ? '%5B%5D' : '[]'); foreach ($value as $subval) { - if ($urlencode) $subval = urlencode($subval); + if ($urlencode) { + $subval = urlencode($subval); + } $parameters[] = array($name, $subval); } } else { - if ($urlencode) $value = urlencode($value); + if ($urlencode) { + $value = urlencode($value); + } $parameters[] = array($name, $value); } } return $parameters; } - + /** * Attempt to detect the MIME type of a file using available extensions - * + * * This method will try to detect the MIME type of a file. If the fileinfo - * extension is available, it will be used. If not, the mime_magic + * extension is available, it will be used. If not, the mime_magic * extension which is deprected but is still available in many PHP setups - * will be tried. - * + * will be tried. + * * If neither extension is available, the default application/octet-stream * MIME type will be returned * @@ -1105,26 +1189,26 @@ class Zend_Http_Client protected function _detectFileMimeType($file) { $type = null; - + // First try with fileinfo functions if (function_exists('finfo_open')) { if (self::$_fileInfoDb === null) { self::$_fileInfoDb = @finfo_open(FILEINFO_MIME); } - - if (self::$_fileInfoDb) { + + if (self::$_fileInfoDb) { $type = finfo_file(self::$_fileInfoDb, $file); } - + } elseif (function_exists('mime_content_type')) { $type = mime_content_type($file); } - + // Fallback to the default application/octet-stream if (! $type) { $type = 'application/octet-stream'; } - + return $type; } @@ -1142,7 +1226,9 @@ class Zend_Http_Client $ret = "--{$boundary}\r\n" . 'Content-Disposition: form-data; name="' . $name .'"'; - if ($filename) $ret .= '; filename="' . $filename . '"'; + if ($filename) { + $ret .= '; filename="' . $filename . '"'; + } $ret .= "\r\n"; foreach ($headers as $hname => $hvalue) { @@ -1196,4 +1282,51 @@ class Zend_Http_Client return $authHeader; } + + /** + * Convert an array of parameters into a flat array of (key, value) pairs + * + * Will flatten a potentially multi-dimentional array of parameters (such + * as POST parameters) into a flat array of (key, value) paris. In case + * of multi-dimentional arrays, square brackets ([]) will be added to the + * key to indicate an array. + * + * @since 1.9 + * + * @param array $parray + * @param string $prefix + * @return array + */ + static protected function _flattenParametersArray($parray, $prefix = null) + { + if (! is_array($parray)) { + return $parray; + } + + $parameters = array(); + + foreach($parray as $name => $value) { + + // Calculate array key + if ($prefix) { + if (is_int($name)) { + $key = $prefix . '[]'; + } else { + $key = $prefix . "[$name]"; + } + } else { + $key = $name; + } + + if (is_array($value)) { + $parameters = array_merge($parameters, self::_flattenParametersArray($value, $key)); + + } else { + $parameters[] = array($key, $value); + } + } + + return $parameters; + } + } diff --git a/lib/zend/Zend/Http/Client/Adapter/Curl.php b/lib/zend/Zend/Http/Client/Adapter/Curl.php new file mode 100644 index 0000000000..c8359d7753 --- /dev/null +++ b/lib/zend/Zend/Http/Client/Adapter/Curl.php @@ -0,0 +1,423 @@ +toArray(); + + } elseif (! is_array($config)) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + 'Array or Zend_Config object expected, got ' . gettype($config) + ); + } + + if(isset($config['proxy_user']) && isset($config['proxy_pass'])) { + $this->setCurlOption(CURLOPT_PROXYUSERPWD, $config['proxy_user'].":".$config['proxy_pass']); + unset($config['proxy_user'], $config['proxy_pass']); + } + + foreach ($config as $k => $v) { + $option = strtolower($k); + switch($option) { + case 'proxy_host': + $this->setCurlOption(CURLOPT_PROXY, $v); + break; + case 'proxy_port': + $this->setCurlOption(CURLOPT_PROXYPORT, $v); + break; + default: + $this->_config[$option] = $v; + break; + } + } + + return $this; + } + + /** + * Direct setter for cURL adapter related options. + * + * @param string|int $option + * @param mixed $value + * @return Zend_Http_Adapter_Curl + */ + public function setCurlOption($option, $value) + { + if (!isset($this->_config['curloptions'])) { + $this->_config['curloptions'] = array(); + } + $this->_config['curloptions'][$option] = $value; + return $this; + } + + /** + * Initialize curl + * + * @param string $host + * @param int $port + * @param boolean $secure + * @return void + * @throws Zend_Http_Client_Adapter_Exception if unable to connect + */ + public function connect($host, $port = 80, $secure = false) + { + // If we're already connected, disconnect first + if ($this->_curl) { + $this->close(); + } + + // If we are connected to a different server or port, disconnect first + if ($this->_curl + && is_array($this->_connected_to) + && ($this->_connected_to[0] != $host + || $this->_connected_to[1] != $port) + ) { + $this->close(); + } + + // Do the actual connection + $this->_curl = curl_init(); + if ($port != 80) { + curl_setopt($this->_curl, CURLOPT_PORT, intval($port)); + } + + // Set timeout + curl_setopt($this->_curl, CURLOPT_TIMEOUT, $this->_config['timeout']); + + // Set Max redirects + curl_setopt($this->_curl, CURLOPT_MAXREDIRS, $this->_config['maxredirects']); + + if (!$this->_curl) { + $this->close(); + + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception('Unable to Connect to ' . $host . ':' . $port); + } + + if ($secure !== false) { + // Behave the same like Zend_Http_Adapter_Socket on SSL options. + if (isset($this->_config['sslcert'])) { + curl_setopt($this->_curl, CURLOPT_SSLCERT, $this->_config['sslcert']); + } + if (isset($this->_config['sslpassphrase'])) { + curl_setopt($this->_curl, CURLOPT_SSLCERTPASSWD, $this->_config['sslpassphrase']); + } + } + + // Update connected_to + $this->_connected_to = array($host, $port); + } + + /** + * Send request to the remote server + * + * @param string $method + * @param Zend_Uri_Http $uri + * @param float $http_ver + * @param array $headers + * @param string $body + * @return string $request + * @throws Zend_Http_Client_Adapter_Exception If connection fails, connected to wrong host, no PUT file defined, unsupported method, or unsupported cURL option + */ + public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') + { + // Make sure we're properly connected + if (!$this->_curl) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are not connected"); + } + + if ($this->_connected_to[0] != $uri->getHost() || $this->_connected_to[1] != $uri->getPort()) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are connected to the wrong host"); + } + + // set URL + curl_setopt($this->_curl, CURLOPT_URL, $uri->__toString()); + + // ensure correct curl call + $curlValue = true; + switch ($method) { + case Zend_Http_Client::GET: + $curlMethod = CURLOPT_HTTPGET; + break; + + case Zend_Http_Client::POST: + $curlMethod = CURLOPT_POST; + break; + + case Zend_Http_Client::PUT: + // There are two different types of PUT request, either a Raw Data string has been set + // or CURLOPT_INFILE and CURLOPT_INFILESIZE are used. + if (isset($this->_config['curloptions'][CURLOPT_INFILE])) { + if (!isset($this->_config['curloptions'][CURLOPT_INFILESIZE])) { + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception("Cannot set a file-handle for cURL option CURLOPT_INFILE without also setting its size in CURLOPT_INFILESIZE."); + } + + // Now we will probably already have Content-Length set, so that we have to delete it + // from $headers at this point: + foreach ($headers AS $k => $header) { + if (stristr($header, "Content-Length:") !== false) { + unset($headers[$k]); + } + } + + $curlMethod = CURLOPT_PUT; + } else { + $curlMethod = CURLOPT_CUSTOMREQUEST; + $curlValue = "PUT"; + } + break; + + case Zend_Http_Client::DELETE: + $curlMethod = CURLOPT_CUSTOMREQUEST; + $curlValue = "DELETE"; + break; + + case Zend_Http_Client::OPTIONS: + $curlMethod = CURLOPT_CUSTOMREQUEST; + $curlValue = "OPTIONS"; + break; + + case Zend_Http_Client::TRACE: + $curlMethod = CURLOPT_CUSTOMREQUEST; + $curlValue = "TRACE"; + break; + + default: + // For now, through an exception for unsupported request methods + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception("Method currently not supported"); + } + + // get http version to use + $curlHttp = ($http_ver = 1.1) ? CURL_HTTP_VERSION_1_1 : CURL_HTTP_VERSION_1_0; + + // mark as HTTP request and set HTTP method + curl_setopt($this->_curl, $curlHttp, true); + curl_setopt($this->_curl, $curlMethod, $curlValue); + + // ensure headers are also returned + curl_setopt($this->_curl, CURLOPT_HEADER, true); + + // ensure actual response is returned + curl_setopt($this->_curl, CURLOPT_RETURNTRANSFER, true); + + // set additional headers + $headers['Accept'] = ''; + curl_setopt($this->_curl, CURLOPT_HTTPHEADER, $headers); + + /** + * Make sure POSTFIELDS is set after $curlMethod is set: + * @link http://de2.php.net/manual/en/function.curl-setopt.php#81161 + */ + if ($method == Zend_Http_Client::POST) { + curl_setopt($this->_curl, CURLOPT_POSTFIELDS, $body); + } elseif ($curlMethod == CURLOPT_PUT) { + // this covers a PUT by file-handle: + // Make the setting of this options explicit (rather than setting it through the loop following a bit lower) + // to group common functionality together. + curl_setopt($this->_curl, CURLOPT_INFILE, $this->_config['curloptions'][CURLOPT_INFILE]); + curl_setopt($this->_curl, CURLOPT_INFILESIZE, $this->_config['curloptions'][CURLOPT_INFILESIZE]); + unset($this->_config['curloptions'][CURLOPT_INFILE]); + unset($this->_config['curloptions'][CURLOPT_INFILESIZE]); + } elseif ($method == Zend_Http_Client::PUT) { + // This is a PUT by a setRawData string, not by file-handle + curl_setopt($this->_curl, CURLOPT_POSTFIELDS, $body); + } + + // set additional curl options + if (isset($this->_config['curloptions'])) { + foreach ((array)$this->_config['curloptions'] as $k => $v) { + if (!in_array($k, $this->_invalidOverwritableCurlOptions)) { + if (curl_setopt($this->_curl, $k, $v) == false) { + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception(sprintf("Unknown or erroreous cURL option '%s' set", $k)); + } + } + } + } + + // send the request + $this->_response = curl_exec($this->_curl); + + $request = curl_getinfo($this->_curl, CURLINFO_HEADER_OUT); + $request .= $body; + + if (empty($this->_response)) { + require_once 'Zend/Http/Client/Exception.php'; + throw new Zend_Http_Client_Exception("Error in cURL request: " . curl_error($this->_curl)); + } + + // cURL automatically decodes chunked-messages, this means we have to disallow the Zend_Http_Response to do it again + if (stripos($this->_response, "Transfer-Encoding: chunked\r\n")) { + $this->_response = str_ireplace("Transfer-Encoding: chunked\r\n", '', $this->_response); + } + + // Eliminate multiple HTTP responses. + do { + $parts = preg_split('|(?:\r?\n){2}|m', $this->_response, 2); + $again = false; + + if (isset($parts[1]) && preg_match("|^HTTP/1\.[01](.*?)\r\n|mi", $parts[1])) { + $this->_response = $parts[1]; + $again = true; + } + } while ($again); + + // cURL automatically handles Proxy rewrites, remove the "HTTP/1.0 200 Connection established" string: + if (stripos($this->_response, "HTTP/1.0 200 Connection established\r\n\r\n") !== false) { + $this->_response = str_ireplace("HTTP/1.0 200 Connection established\r\n\r\n", '', $this->_response); + } + + return $request; + } + + /** + * Return read response from server + * + * @return string + */ + public function read() + { + return $this->_response; + } + + /** + * Close the connection to the server + * + */ + public function close() + { + if(is_resource($this->_curl)) { + curl_close($this->_curl); + } + $this->_curl = null; + $this->_connected_to = array(null, null); + } + + /** + * Get cUrl Handle + * + * @return resource + */ + public function getHandle() + { + return $this->_curl; + } +} diff --git a/lib/zend/Zend/Http/Client/Adapter/Exception.php b/lib/zend/Zend/Http/Client/Adapter/Exception.php index 89eb95b0a9..ab66619542 100644 --- a/lib/zend/Zend/Http/Client/Adapter/Exception.php +++ b/lib/zend/Zend/Http/Client/Adapter/Exception.php @@ -16,18 +16,23 @@ * @package Zend_Http * @subpackage Client_Adapter_Exception * @version $Id$ - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ +/** + * @see Zend_Http_Client_Exception + */ require_once 'Zend/Http/Client/Exception.php'; /** * @category Zend * @package Zend_Http * @subpackage Client_Adapter - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Http_Client_Adapter_Exception extends Zend_Http_Client_Exception -{} +{ + const READ_TIMEOUT = 1000; +} diff --git a/lib/zend/Zend/Http/Client/Adapter/Interface.php b/lib/zend/Zend/Http/Client/Adapter/Interface.php index e9ddf55ad4..0b2e8674a3 100644 --- a/lib/zend/Zend/Http/Client/Adapter/Interface.php +++ b/lib/zend/Zend/Http/Client/Adapter/Interface.php @@ -17,7 +17,7 @@ * @package Zend_Http * @subpackage Client_Adapter * @version $Id$ - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -30,7 +30,7 @@ * @category Zend * @package Zend_Http * @subpackage Client_Adapter - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ interface Zend_Http_Client_Adapter_Interface diff --git a/lib/zend/Zend/Http/Client/Adapter/Proxy.php b/lib/zend/Zend/Http/Client/Adapter/Proxy.php index dbee45dc58..09eef7461b 100644 --- a/lib/zend/Zend/Http/Client/Adapter/Proxy.php +++ b/lib/zend/Zend/Http/Client/Adapter/Proxy.php @@ -17,12 +17,21 @@ * @package Zend_Http * @subpackage Client_Adapter * @version $Id$ - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ +/** + * @see Zend_Uri_Http + */ require_once 'Zend/Uri/Http.php'; +/** + * @see Zend_Http_Client + */ require_once 'Zend/Http/Client.php'; +/** + * @see Zend_Http_Client_Adapter_Socket + */ require_once 'Zend/Http/Client/Adapter/Socket.php'; /** @@ -37,7 +46,7 @@ require_once 'Zend/Http/Client/Adapter/Socket.php'; * @category Zend * @package Zend_Http * @subpackage Client_Adapter - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Http_Client_Adapter_Proxy extends Zend_Http_Client_Adapter_Socket @@ -49,6 +58,8 @@ class Zend_Http_Client_Adapter_Proxy extends Zend_Http_Client_Adapter_Socket */ protected $config = array( 'ssltransport' => 'ssl', + 'sslcert' => null, + 'sslpassphrase' => null, 'proxy_host' => '', 'proxy_port' => 8080, 'proxy_user' => '', @@ -63,7 +74,7 @@ class Zend_Http_Client_Adapter_Proxy extends Zend_Http_Client_Adapter_Socket * @var boolean */ protected $negotiated = false; - + /** * Connect to the remote server * @@ -73,41 +84,20 @@ class Zend_Http_Client_Adapter_Proxy extends Zend_Http_Client_Adapter_Socket * @param string $host * @param int $port * @param boolean $secure - * @param int $timeout */ public function connect($host, $port = 80, $secure = false) { // If no proxy is set, fall back to Socket adapter - if (! $this->config['proxy_host']) return parent::connect($host, $port, $secure); - - // Go through a proxy - the connection is actually to the proxy server - $host = $this->config['proxy_host']; - $port = $this->config['proxy_port']; - - // If we are connected to the wrong proxy, disconnect first - if (($this->connected_to[0] != $host || $this->connected_to[1] != $port)) { - if (is_resource($this->socket)) $this->close(); + if (! $this->config['proxy_host']) { + return parent::connect($host, $port, $secure); } - // Now, if we are not connected, connect - if (! is_resource($this->socket) || ! $this->config['keepalive']) { - $this->socket = @fsockopen($host, $port, $errno, $errstr, (int) $this->config['timeout']); - if (! $this->socket) { - $this->close(); - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception( - 'Unable to Connect to proxy server ' . $host . ':' . $port . '. Error #' . $errno . ': ' . $errstr); - } - - // Set the stream timeout - if (!stream_set_timeout($this->socket, (int) $this->config['timeout'])) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception('Unable to set the connection timeout'); - } - - // Update connected_to - $this->connected_to = array($host, $port); - } + // Connect (a non-secure connection) to the proxy server + return parent::connect( + $this->config['proxy_host'], + $this->config['proxy_port'], + false + ); } /** @@ -134,7 +124,7 @@ class Zend_Http_Client_Adapter_Proxy extends Zend_Http_Client_Adapter_Socket $host = $this->config['proxy_host']; $port = $this->config['proxy_port']; - if ($this->connected_to[0] != $host || $this->connected_to[1] != $port) { + if ($this->connected_to[0] != "tcp://$host" || $this->connected_to[1] != $port) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception("Trying to write but we are connected to the wrong proxy server"); } @@ -145,18 +135,26 @@ class Zend_Http_Client_Adapter_Proxy extends Zend_Http_Client_Adapter_Socket $this->config['proxy_user'], $this->config['proxy_pass'], $this->config['proxy_auth'] ); } - + // if we are proxying HTTPS, preform CONNECT handshake with the proxy if ($uri->getScheme() == 'https' && (! $this->negotiated)) { $this->connectHandshake($uri->getHost(), $uri->getPort(), $http_ver, $headers); $this->negotiated = true; } - + // Save request method for later $this->method = $method; // Build request headers - $request = "{$method} {$uri->__toString()} HTTP/{$http_ver}\r\n"; + if ($this->negotiated) { + $path = $uri->getPath(); + if ($uri->getQuery()) { + $path .= '?' . $uri->getQuery(); + } + $request = "$method $path HTTP/$http_ver\r\n"; + } else { + $request = "$method $uri HTTP/$http_ver\r\n"; + } // Add all headers to the request string foreach ($headers as $k => $v) { @@ -186,21 +184,21 @@ class Zend_Http_Client_Adapter_Proxy extends Zend_Http_Client_Adapter_Socket */ protected function connectHandshake($host, $port = 443, $http_ver = '1.1', array &$headers = array()) { - $request = "CONNECT $host:$port HTTP/$http_ver\r\n" . + $request = "CONNECT $host:$port HTTP/$http_ver\r\n" . "Host: " . $this->config['proxy_host'] . "\r\n"; // Add the user-agent header if (isset($this->config['useragent'])) { $request .= "User-agent: " . $this->config['useragent'] . "\r\n"; } - + // If the proxy-authorization header is set, send it to proxy but remove // it from headers sent to target host if (isset($headers['proxy-authorization'])) { $request .= "Proxy-authorization: " . $headers['proxy-authorization'] . "\r\n"; unset($headers['proxy-authorization']); } - + $request .= "\r\n"; // Send the request @@ -219,35 +217,35 @@ class Zend_Http_Client_Adapter_Proxy extends Zend_Http_Client_Adapter_Socket if (!chop($line)) break; } } - + // Check that the response from the proxy is 200 if (Zend_Http_Response::extractCode($response) != 200) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception("Unable to connect to HTTPS proxy. Server response: " . $response); } - + // If all is good, switch socket to secure mode. We have to fall back - // through the different modes + // through the different modes $modes = array( - STREAM_CRYPTO_METHOD_TLS_CLIENT, + STREAM_CRYPTO_METHOD_TLS_CLIENT, STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, - STREAM_CRYPTO_METHOD_SSLv2_CLIENT + STREAM_CRYPTO_METHOD_SSLv2_CLIENT ); - - $success = false; + + $success = false; foreach($modes as $mode) { $success = stream_socket_enable_crypto($this->socket, true, $mode); if ($success) break; } - + if (! $success) { require_once 'Zend/Http/Client/Adapter/Exception.php'; - throw new Zend_Http_Client_Adapter_Exception("Unable to connect to" . + throw new Zend_Http_Client_Adapter_Exception("Unable to connect to" . " HTTPS server through proxy: could not negotiate secure connection."); } } - + /** * Close the connection to the server * @@ -257,7 +255,7 @@ class Zend_Http_Client_Adapter_Proxy extends Zend_Http_Client_Adapter_Socket parent::close(); $this->negotiated = false; } - + /** * Destructor: make sure the socket is disconnected * diff --git a/lib/zend/Zend/Http/Client/Adapter/Socket.php b/lib/zend/Zend/Http/Client/Adapter/Socket.php index 544fbebd80..c0a29e429b 100644 --- a/lib/zend/Zend/Http/Client/Adapter/Socket.php +++ b/lib/zend/Zend/Http/Client/Adapter/Socket.php @@ -17,11 +17,17 @@ * @package Zend_Http * @subpackage Client_Adapter * @version $Id$ - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ +/** + * @see Zend_Uri_Http + */ require_once 'Zend/Uri/Http.php'; +/** + * @see Zend_Http_Client_Adapter_Interface + */ require_once 'Zend/Http/Client/Adapter/Interface.php'; /** @@ -31,7 +37,7 @@ require_once 'Zend/Http/Client/Adapter/Interface.php'; * @category Zend * @package Zend_Http * @subpackage Client_Adapter - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interface @@ -69,6 +75,13 @@ class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interf */ protected $method = null; + /** + * Stream context + * + * @var resource + */ + protected $_context = null; + /** * Adapter constructor, currently empty. Config is set using setConfig() * @@ -80,14 +93,18 @@ class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interf /** * Set the configuration array for the adapter * - * @param array $config + * @param Zend_Config | array $config */ public function setConfig($config = array()) { - if (! is_array($config)) { + if ($config instanceof Zend_Config) { + $config = $config->toArray(); + + } elseif (! is_array($config)) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception( - '$config expects an array, ' . gettype($config) . ' recieved.'); + 'Array or Zend_Config object expected, got ' . gettype($config) + ); } foreach ($config as $k => $v) { @@ -95,13 +112,60 @@ class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interf } } + /** + * Set the stream context for the TCP connection to the server + * + * Can accept either a pre-existing stream context resource, or an array + * of stream options, similar to the options array passed to the + * stream_context_create() PHP function. In such case a new stream context + * will be created using the passed options. + * + * @since Zend Framework 1.9 + * + * @param mixed $context Stream context or array of context options + * @return Zend_Http_Client_Adapter_Socket + */ + public function setStreamContext($context) + { + if (is_resource($context) && get_resource_type($context) == 'stream-context') { + $this->_context = $context; + + } elseif (is_array($context)) { + $this->_context = stream_context_create($context); + + } else { + // Invalid parameter + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + "Expecting either a stream context resource or array, got " . gettype($context) + ); + } + + return $this; + } + + /** + * Get the stream context for the TCP connection to the server. + * + * If no stream context is set, will create a default one. + * + * @return resource + */ + public function getStreamContext() + { + if (! $this->_context) { + $this->_context = stream_context_create(); + } + + return $this->_context; + } + /** * Connect to the remote server * * @param string $host * @param int $port * @param boolean $secure - * @param int $timeout */ public function connect($host, $port = 80, $secure = false) { @@ -115,7 +179,7 @@ class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interf // Now, if we are not connected, connect if (! is_resource($this->socket) || ! $this->config['keepalive']) { - $context = stream_context_create(); + $context = $this->getStreamContext(); if ($secure) { if ($this->config['sslcert'] !== null) { if (! stream_context_set_option($context, 'ssl', 'local_cert', @@ -135,13 +199,14 @@ class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interf $flags = STREAM_CLIENT_CONNECT; if ($this->config['persistent']) $flags |= STREAM_CLIENT_PERSISTENT; - + $this->socket = @stream_socket_client($host . ':' . $port, $errno, $errstr, (int) $this->config['timeout'], $flags, $context); + if (! $this->socket) { $this->close(); require_once 'Zend/Http/Client/Adapter/Exception.php'; @@ -219,6 +284,7 @@ class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interf // First, read headers only $response = ''; $gotStatus = false; + while (($line = @fgets($this->socket)) !== false) { $gotStatus = $gotStatus || (strpos($line, 'HTTP') !== false); if ($gotStatus) { @@ -227,82 +293,121 @@ class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interf } } + $this->_checkSocketReadTimeout(); + $statusCode = Zend_Http_Response::extractCode($response); - + // Handle 100 and 101 responses internally by restarting the read again if ($statusCode == 100 || $statusCode == 101) return $this->read(); + // Check headers to see what kind of connection / transfer encoding we have + $headers = Zend_Http_Response::extractHeaders($response); + /** * Responses to HEAD requests and 204 or 304 responses are not expected * to have a body - stop reading here */ - if ($statusCode == 304 || $statusCode == 204 || - $this->method == Zend_Http_Client::HEAD) return $response; + if ($statusCode == 304 || $statusCode == 204 || + $this->method == Zend_Http_Client::HEAD) { - // Check headers to see what kind of connection / transfer encoding we have - $headers = Zend_Http_Response::extractHeaders($response); + // Close the connection if requested to do so by the server + if (isset($headers['connection']) && $headers['connection'] == 'close') { + $this->close(); + } + return $response; + } // If we got a 'transfer-encoding: chunked' header if (isset($headers['transfer-encoding'])) { - if ($headers['transfer-encoding'] == 'chunked') { + + if (strtolower($headers['transfer-encoding']) == 'chunked') { + do { - $chunk = ''; - $line = @fgets($this->socket); - $chunk .= $line; + $line = @fgets($this->socket); + $this->_checkSocketReadTimeout(); - $hexchunksize = ltrim(chop($line), '0'); - $hexchunksize = strlen($hexchunksize) ? strtolower($hexchunksize) : 0; + $chunk = $line; - $chunksize = hexdec(chop($line)); - if (dechex($chunksize) != $hexchunksize) { - @fclose($this->socket); + // Figure out the next chunk size + $chunksize = trim($line); + if (! ctype_xdigit($chunksize)) { + $this->close(); require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception('Invalid chunk size "' . - $hexchunksize . '" unable to read chunked body'); + $chunksize . '" unable to read chunked body'); } - $left_to_read = $chunksize; - while ($left_to_read > 0) { - $line = @fread($this->socket, $left_to_read); - $chunk .= $line; - $left_to_read -= strlen($line); - - // Break if the connection ended prematurely - if (feof($this->socket)) break; - } + // Convert the hexadecimal value to plain integer + $chunksize = hexdec($chunksize); + + // Read next chunk + $read_to = ftell($this->socket) + $chunksize; + + do { + $current_pos = ftell($this->socket); + if ($current_pos >= $read_to) break; + + $line = @fread($this->socket, $read_to - $current_pos); + if ($line === false || strlen($line) === 0) { + $this->_checkSocketReadTimeout(); + break; + } else { + $chunk .= $line; + } + + } while (! feof($this->socket)); $chunk .= @fgets($this->socket); + $this->_checkSocketReadTimeout(); + $response .= $chunk; } while ($chunksize > 0); - + } else { + $this->close(); throw new Zend_Http_Client_Adapter_Exception('Cannot handle "' . $headers['transfer-encoding'] . '" transfer encoding'); } - + // Else, if we got the content-length header, read this number of bytes } elseif (isset($headers['content-length'])) { - $left_to_read = $headers['content-length']; + + $current_pos = ftell($this->socket); $chunk = ''; - while ($left_to_read > 0) { - $chunk = @fread($this->socket, $left_to_read); - $left_to_read -= strlen($chunk); + + for ($read_to = $current_pos + $headers['content-length']; + $read_to > $current_pos; + $current_pos = ftell($this->socket)) { + + $chunk = @fread($this->socket, $read_to - $current_pos); + if ($chunk === false || strlen($chunk) === 0) { + $this->_checkSocketReadTimeout(); + break; + } + $response .= $chunk; - + // Break if the connection ended prematurely if (feof($this->socket)) break; } - + // Fallback: just read the response until EOF } else { - while (($buff = @fread($this->socket, 8192)) !== false) { - $response .= $buff; - if (feof($this->socket)) break; - } + + do { + $buff = @fread($this->socket, 8192); + if ($buff === false || strlen($buff) === 0) { + $this->_checkSocketReadTimeout(); + break; + } else { + $response .= $buff; + } + + } while (feof($this->socket) === false); $this->close(); } - + // Close the connection if requested to do so by the server if (isset($headers['connection']) && $headers['connection'] == 'close') { $this->close(); @@ -323,8 +428,30 @@ class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interf } /** - * Destructor: make sure the socket is disconnected - * + * Check if the socket has timed out - if so close connection and throw + * an exception + * + * @throws Zend_Http_Client_Adapter_Exception with READ_TIMEOUT code + */ + protected function _checkSocketReadTimeout() + { + if ($this->socket) { + $info = stream_get_meta_data($this->socket); + $timedout = $info['timed_out']; + if ($timedout) { + $this->close(); + require_once 'Zend/Http/Client/Adapter/Exception.php'; + throw new Zend_Http_Client_Adapter_Exception( + "Read timed out after {$this->config['timeout']} seconds", + Zend_Http_Client_Adapter_Exception::READ_TIMEOUT + ); + } + } + } + + /** + * Destructor: make sure the socket is disconnected + * * If we are in persistent TCP mode, will not close the connection * */ diff --git a/lib/zend/Zend/Http/Client/Adapter/Test.php b/lib/zend/Zend/Http/Client/Adapter/Test.php index aad25f203f..10633d71e2 100644 --- a/lib/zend/Zend/Http/Client/Adapter/Test.php +++ b/lib/zend/Zend/Http/Client/Adapter/Test.php @@ -16,12 +16,21 @@ * @package Zend_Http * @subpackage Client_Adapter * @version $Id$ - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ +/** + * @see Zend_Uri_Http + */ require_once 'Zend/Uri/Http.php'; +/** + * @see Zend_Http_Response + */ require_once 'Zend/Http/Response.php'; +/** + * @see Zend_Http_Client_Adapter_Interface + */ require_once 'Zend/Http/Client/Adapter/Interface.php'; /** @@ -35,7 +44,7 @@ require_once 'Zend/Http/Client/Adapter/Interface.php'; * @category Zend * @package Zend_Http * @subpackage Client_Adapter - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Http_Client_Adapter_Test implements Zend_Http_Client_Adapter_Interface @@ -72,14 +81,18 @@ class Zend_Http_Client_Adapter_Test implements Zend_Http_Client_Adapter_Interfac /** * Set the configuration array for the adapter * - * @param array $config + * @param Zend_Config | array $config */ public function setConfig($config = array()) { - if (! is_array($config)) { + if ($config instanceof Zend_Config) { + $config = $config->toArray(); + + } elseif (! is_array($config)) { require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception( - '$config expects an array, ' . gettype($config) . ' recieved.'); + 'Array or Zend_Config object expected, got ' . gettype($config) + ); } foreach ($config as $k => $v) { @@ -87,6 +100,7 @@ class Zend_Http_Client_Adapter_Test implements Zend_Http_Client_Adapter_Interfac } } + /** * Connect to the remote server * @@ -158,7 +172,7 @@ class Zend_Http_Client_Adapter_Test implements Zend_Http_Client_Adapter_Interfac public function setResponse($response) { if ($response instanceof Zend_Http_Response) { - $response = $response->asString(); + $response = $response->asString("\r\n"); } $this->responses = (array)$response; @@ -168,10 +182,14 @@ class Zend_Http_Client_Adapter_Test implements Zend_Http_Client_Adapter_Interfac /** * Add another response to the response buffer. * - * @param string $response + * @param string Zend_Http_Response|$response */ public function addResponse($response) { + if ($response instanceof Zend_Http_Response) { + $response = $response->asString("\r\n"); + } + $this->responses[] = $response; } diff --git a/lib/zend/Zend/Http/Client/Exception.php b/lib/zend/Zend/Http/Client/Exception.php index 357305745c..e140fdd587 100644 --- a/lib/zend/Zend/Http/Client/Exception.php +++ b/lib/zend/Zend/Http/Client/Exception.php @@ -16,17 +16,20 @@ * @package Zend_Http * @subpackage Client_Exception * @version $Id$ - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ +/** + * @see Zend_Http_Exception + */ require_once 'Zend/Http/Exception.php'; /** * @category Zend * @package Zend_Http * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Http_Client_Exception extends Zend_Http_Exception diff --git a/lib/zend/Zend/Http/Cookie.php b/lib/zend/Zend/Http/Cookie.php index cb91ddea5e..ff9bebfeb0 100644 --- a/lib/zend/Zend/Http/Cookie.php +++ b/lib/zend/Zend/Http/Cookie.php @@ -1,4 +1,5 @@ valid() && ($uri->getScheme() == 'http' || $uri->getScheme() =='https'))) { - require_once 'Zend/Http/Exception.php'; + require_once 'Zend/Http/Exception.php'; throw new Zend_Http_Exception('Passed URI is not a valid HTTP or HTTPS URI'); } @@ -231,12 +236,15 @@ class Zend_Http_Cookie if ($this->isExpired($now)) return false; if ($this->isSessionCookie() && ! $matchSessionCookies) return false; - // Validate domain and path - // Domain is validated using tail match, while path is validated using head match - $domain_preg = preg_quote($this->getDomain(), "/"); - if (! preg_match("/{$domain_preg}$/", $uri->getHost())) return false; - $path_preg = preg_quote($this->getPath(), "/"); - if (! preg_match("/^{$path_preg}/", $uri->getPath())) return false; + // Check if the domain matches + if (! self::matchCookieDomain($this->getDomain(), $uri->getHost())) { + return false; + } + + // Check that path matches using prefix match + if (! self::matchCookiePath($this->getPath(), $uri->getPath())) { + return false; + } // If we didn't die until now, return true. return true; @@ -304,14 +312,29 @@ class Zend_Http_Cookie list($k, $v) = $keyValue; switch (strtolower($k)) { case 'expires': - $expires = strtotime($v); + if(($expires = strtotime($v)) === false) { + /** + * The expiration is past Tue, 19 Jan 2038 03:14:07 UTC + * the maximum for 32-bit signed integer. Zend_Date + * can get around that limit. + * + * @see Zend_Date + */ + require_once 'Zend/Date.php'; + + $expireDate = new Zend_Date($v); + $expires = $expireDate->getTimestamp(); + } break; + case 'path': $path = $v; break; + case 'domain': $domain = $v; break; + default: break; } @@ -319,9 +342,67 @@ class Zend_Http_Cookie } if ($name !== '') { - return new Zend_Http_Cookie($name, $value, $domain, $expires, $path, $secure); + return new self($name, $value, $domain, $expires, $path, $secure); } else { return false; } } + + /** + * Check if a cookie's domain matches a host name. + * + * Used by Zend_Http_Cookie and Zend_Http_CookieJar for cookie matching + * + * @param string $cookieDomain + * @param string $host + * + * @return boolean + */ + public static function matchCookieDomain($cookieDomain, $host) + { + if (! $cookieDomain) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception("\$cookieDomain is expected to be a cookie domain"); + } + + if (! $host) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception("\$host is expected to be a host name"); + } + + $cookieDomain = strtolower($cookieDomain); + $host = strtolower($host); + + if ($cookieDomain[0] == '.') { + $cookieDomain = substr($cookieDomain, 1); + } + + // Check for either exact match or suffix match + return ($cookieDomain == $host || + preg_match("/\.$cookieDomain$/", $host)); + } + + /** + * Check if a cookie's path matches a URL path + * + * Used by Zend_Http_Cookie and Zend_Http_CookieJar for cookie matching + * + * @param string $cookiePath + * @param string $path + * @return boolean + */ + public static function matchCookiePath($cookiePath, $path) + { + if (! $cookiePath) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception("\$cookiePath is expected to be a cookie path"); + } + + if (! $path) { + require_once 'Zend/Http/Exception.php'; + throw new Zend_Http_Exception("\$path is expected to be a host name"); + } + + return (strpos($path, $cookiePath) === 0); + } } diff --git a/lib/zend/Zend/Http/CookieJar.php b/lib/zend/Zend/Http/CookieJar.php index 0a135ca375..65e60f5491 100644 --- a/lib/zend/Zend/Http/CookieJar.php +++ b/lib/zend/Zend/Http/CookieJar.php @@ -16,12 +16,21 @@ * @package Zend_Http * @subpackage CookieJar * @version $Id$ - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com/) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ +/** + * @see Zend_Uri + */ require_once "Zend/Uri.php"; +/** + * @see Zend_Http_Cookie + */ require_once "Zend/Http/Cookie.php"; +/** + * @see Zend_Http_Response + */ require_once "Zend/Http/Response.php"; /** @@ -41,14 +50,14 @@ require_once "Zend/Http/Response.php"; * (by passing Zend_Http_CookieJar::COOKIE_STRING_CONCAT). * * @link http://wp.netscape.com/newsref/std/cookie_spec.html for some specs. - * + * * @category Zend * @package Zend_Http * @subpackage CookieJar - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com/) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Http_CookieJar +class Zend_Http_CookieJar implements Countable, IteratorAggregate { /** * Return cookie(s) as a Zend_Http_Cookie object @@ -87,6 +96,13 @@ class Zend_Http_CookieJar */ protected $cookies = array(); + /** + * The Zend_Http_Cookie array + * + * @var array + */ + protected $_rawCookies = array(); + /** * Construct a new CookieJar object * @@ -113,6 +129,7 @@ class Zend_Http_CookieJar if (! isset($this->cookies[$domain])) $this->cookies[$domain] = array(); if (! isset($this->cookies[$domain][$path])) $this->cookies[$domain][$path] = array(); $this->cookies[$domain][$path][$cookie->getName()] = $cookie; + $this->_rawCookies[] = $cookie; } else { require_once 'Zend/Http/Exception.php'; throw new Zend_Http_Exception('Supplient argument is not a valid cookie string or object'); @@ -129,7 +146,7 @@ class Zend_Http_CookieJar public function addCookiesFromResponse($response, $ref_uri) { if (! $response instanceof Zend_Http_Response) { - require_once 'Zend/Http/Exception.php'; + require_once 'Zend/Http/Exception.php'; throw new Zend_Http_Exception('$response is expected to be a Response object, ' . gettype($response) . ' was passed'); } @@ -173,18 +190,13 @@ class Zend_Http_CookieJar { if (is_string($uri)) $uri = Zend_Uri::factory($uri); if (! $uri instanceof Zend_Uri_Http) { - require_once 'Zend/Http/Exception.php'; + require_once 'Zend/Http/Exception.php'; throw new Zend_Http_Exception("Invalid URI string or object passed"); } - // Set path - $path = $uri->getPath(); - $path = substr($path, 0, strrpos($path, '/')); - if (! $path) $path = '/'; - // First, reduce the array of cookies to only those matching domain and path $cookies = $this->_matchDomain($uri->getHost()); - $cookies = $this->_matchPath($cookies, $path); + $cookies = $this->_matchPath($cookies, $uri->getPath()); $cookies = $this->_flattenCookiesArray($cookies, self::COOKIE_OBJECT); // Next, run Cookie->match on all cookies to check secure, time and session mathcing @@ -288,17 +300,17 @@ class Zend_Http_CookieJar /** * Return a subset of the cookies array matching a specific domain * - * Returned array is actually an array of pointers to items in the $this->cookies array. - * * @param string $domain * @return array */ - protected function _matchDomain($domain) { + protected function _matchDomain($domain) + { $ret = array(); foreach (array_keys($this->cookies) as $cdom) { - $regex = "/" . preg_quote($cdom, "/") . "$/i"; - if (preg_match($regex, $domain)) $ret[$cdom] = &$this->cookies[$cdom]; + if (Zend_Http_Cookie::matchCookieDomain($cdom, $domain)) { + $ret[$cdom] = $this->cookies[$cdom]; + } } return $ret; @@ -307,22 +319,22 @@ class Zend_Http_CookieJar /** * Return a subset of a domain-matching cookies that also match a specified path * - * Returned array is actually an array of pointers to items in the $passed array. - * * @param array $dom_array * @param string $path * @return array */ - protected function _matchPath($domains, $path) { + protected function _matchPath($domains, $path) + { $ret = array(); - if (substr($path, -1) != '/') $path .= '/'; foreach ($domains as $dom => $paths_array) { foreach (array_keys($paths_array) as $cpath) { - $regex = "|^" . preg_quote($cpath, "|") . "|i"; - if (preg_match($regex, $path)) { - if (! isset($ret[$dom])) $ret[$dom] = array(); - $ret[$dom][$cpath] = &$paths_array[$cpath]; + if (Zend_Http_Cookie::matchCookiePath($cpath, $path)) { + if (! isset($ret[$dom])) { + $ret[$dom] = array(); + } + + $ret[$dom][$cpath] = $paths_array[$cpath]; } } } @@ -347,4 +359,45 @@ class Zend_Http_CookieJar $jar->addCookiesFromResponse($response, $ref_uri); return $jar; } + + /** + * Required by Countable interface + * + * @return int + */ + public function count() + { + return count($this->_rawCookies); + } + + /** + * Required by IteratorAggregate interface + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_rawCookies); + } + + /** + * Tells if the jar is empty of any cookie + * + * @return bool + */ + public function isEmpty() + { + return count($this) == 0; + } + + /** + * Empties the cookieJar of any cookie + * + * @return Zend_Http_CookieJar + */ + public function reset() + { + $this->cookies = $this->_rawCookies = array(); + return $this; + } } diff --git a/lib/zend/Zend/Http/Exception.php b/lib/zend/Zend/Http/Exception.php index 585ae85b37..32c18e9b5e 100644 --- a/lib/zend/Zend/Http/Exception.php +++ b/lib/zend/Zend/Http/Exception.php @@ -16,17 +16,20 @@ * @package Zend_Http * @subpackage Exception * @version $Id$ - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ +/** + * @see Zend_Exception + */ require_once 'Zend/Exception.php'; /** * @category Zend * @package Zend_Http * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Http_Exception extends Zend_Exception diff --git a/lib/zend/Zend/Http/Response.php b/lib/zend/Zend/Http/Response.php index 776f907421..ebf36db231 100644 --- a/lib/zend/Zend/Http/Response.php +++ b/lib/zend/Zend/Http/Response.php @@ -17,7 +17,7 @@ * @package Zend_Http * @subpackage Response * @version $Id$ - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -28,7 +28,7 @@ * * @package Zend_Http * @subpackage Response - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Http_Response @@ -253,7 +253,7 @@ class Zend_Http_Response $body = ''; // Decode the body if it was transfer-encoded - switch ($this->getHeader('transfer-encoding')) { + switch (strtolower($this->getHeader('transfer-encoding'))) { // Handle chunked body case 'chunked': @@ -397,6 +397,16 @@ class Zend_Http_Response return $this->getHeadersAsString(true, $br) . $br . $this->getRawBody(); } + /** + * Implements magic __toString() + * + * @return string + */ + public function __toString() + { + return $this->asString(); + } + /** * A convenience function that returns a text representation of * HTTP response codes. Returns 'Unknown' for unknown codes. @@ -483,11 +493,11 @@ class Zend_Http_Response public static function extractHeaders($response_str) { $headers = array(); - + // First, split body and headers $parts = preg_split('|(?:\r?\n){2}|m', $response_str, 2); if (! $parts[0]) return $headers; - + // Split headers part to lines $lines = explode("\n", $parts[0]); unset($parts); @@ -535,7 +545,7 @@ class Zend_Http_Response public static function extractBody($response_str) { $parts = preg_split('|(?:\r?\n){2}|m', $response_str, 2); - if (isset($parts[1])) { + if (isset($parts[1])) { return $parts[1]; } return ''; @@ -550,7 +560,16 @@ class Zend_Http_Response public static function decodeChunkedBody($body) { $decBody = ''; - + + // If mbstring overloads substr and strlen functions, we have to + // override it's internal encoding + if (function_exists('mb_internal_encoding') && + ((int) ini_get('mbstring.func_overload')) & 2) { + + $mbIntEnc = mb_internal_encoding(); + mb_internal_encoding('ASCII'); + } + while (trim($body)) { if (! preg_match("/^([\da-fA-F]+)[^\r\n]*\r\n/sm", $body, $m)) { require_once 'Zend/Http/Exception.php'; @@ -559,11 +578,14 @@ class Zend_Http_Response $length = hexdec(trim($m[1])); $cut = strlen($m[0]); - $decBody .= substr($body, $cut, $length); $body = substr($body, $cut + $length + 2); } + if (isset($mbIntEnc)) { + mb_internal_encoding($mbIntEnc); + } + return $decBody; } @@ -579,8 +601,9 @@ class Zend_Http_Response { if (! function_exists('gzinflate')) { require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('Unable to decode gzipped response ' . - 'body: perhaps the zlib extension is not loaded?'); + throw new Zend_Http_Exception( + 'zlib extension is required in order to decode "gzip" encoding' + ); } return gzinflate(substr($body, 10)); @@ -598,11 +621,28 @@ class Zend_Http_Response { if (! function_exists('gzuncompress')) { require_once 'Zend/Http/Exception.php'; - throw new Zend_Http_Exception('Unable to decode deflated response ' . - 'body: perhaps the zlib extension is not loaded?'); + throw new Zend_Http_Exception( + 'zlib extension is required in order to decode "deflate" encoding' + ); } - return gzuncompress($body); + /** + * Some servers (IIS ?) send a broken deflate response, without the + * RFC-required zlib header. + * + * We try to detect the zlib header, and if it does not exsit we + * teat the body is plain DEFLATE content. + * + * This method was adapted from PEAR HTTP_Request2 by (c) Alexey Borzov + * + * @link http://framework.zend.com/issues/browse/ZF-6040 + */ + $zlibHeader = unpack('n', substr($body, 0, 2)); + if ($zlibHeader[1] % 31 == 0) { + return gzuncompress($body); + } else { + return gzinflate($body); + } } /** diff --git a/lib/zend/Zend/InfoCard/Adapter/Default.php b/lib/zend/Zend/InfoCard/Adapter/Default.php new file mode 100644 index 0000000000..fdc679e27e --- /dev/null +++ b/lib/zend/Zend/InfoCard/Adapter/Default.php @@ -0,0 +1,79 @@ +_padding = $padding; + break; + default: + require_once 'Zend/InfoCard/Cipher/Exception.php'; + throw new Zend_InfoCard_Cipher_Exception("Invalid Padding Type Provided"); + break; + } + + return $this; + } + + /** + * Retruns the public-key padding used + * + * @return integer One of the padding constants in this class + */ + public function getPadding() + { + return $this->_padding; + } +} diff --git a/lib/zend/Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php b/lib/zend/Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php new file mode 100644 index 0000000000..02a44c4068 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php @@ -0,0 +1,120 @@ +setPadding($padding); + } + + /** + * Decrypts RSA encrypted data using the given private key + * + * @throws Zend_InfoCard_Cipher_Exception + * @param string $encryptedData The encrypted data in binary format + * @param string $privateKey The private key in binary format + * @param string $password The private key passphrase + * @param integer $padding The padding to use during decryption (of not provided object value will be used) + * @return string The decrypted data + */ + public function decrypt($encryptedData, $privateKey, $password = null, $padding = null) + { + $private_key = openssl_pkey_get_private(array($privateKey, $password)); + + if(!$private_key) { + require_once 'Zend/InfoCard/Cipher/Exception.php'; + throw new Zend_InfoCard_Cipher_Exception("Failed to load private key"); + } + + if($padding !== null) { + try { + $this->setPadding($padding); + } catch(Exception $e) { + openssl_free_key($private_key); + throw $e; + } + } + + switch($this->getPadding()) { + case self::NO_PADDING: + $openssl_padding = OPENSSL_NO_PADDING; + break; + case self::OAEP_PADDING: + $openssl_padding = OPENSSL_PKCS1_OAEP_PADDING; + break; + } + + $result = openssl_private_decrypt($encryptedData, $decryptedData, $private_key, $openssl_padding); + + openssl_free_key($private_key); + + if(!$result) { + require_once 'Zend/InfoCard/Cipher/Exception.php'; + throw new Zend_InfoCard_Cipher_Exception("Unable to Decrypt Value using provided private key"); + } + + if($this->getPadding() == self::NO_PADDING) { + $decryptedData = substr($decryptedData, 2); + $start = strpos($decryptedData, 0) + 1; + $decryptedData = substr($decryptedData, $start); + } + + return $decryptedData; + } +} diff --git a/lib/zend/Zend/InfoCard/Cipher/Pki/Interface.php b/lib/zend/Zend/InfoCard/Cipher/Pki/Interface.php new file mode 100644 index 0000000000..11c03007df --- /dev/null +++ b/lib/zend/Zend/InfoCard/Cipher/Pki/Interface.php @@ -0,0 +1,33 @@ + 0) { + $mcrypt_iv = substr($encryptedData, 0, $iv_length); + $encryptedData = substr($encryptedData, $iv_length); + } + + $decrypted = mcrypt_decrypt(self::MCRYPT_CIPHER, $decryptionKey, $encryptedData, self::MCRYPT_MODE, $mcrypt_iv); + + if(!$decrypted) { + require_once 'Zend/InfoCard/Cipher/Exception.php'; + throw new Zend_InfoCard_Cipher_Exception("Failed to decrypt data using AES256CBC Algorithm"); + } + + $decryptedLength = strlen($decrypted); + $paddingLength = substr($decrypted, $decryptedLength -1, 1); + $decrypted = substr($decrypted, 0, $decryptedLength - ord($paddingLength)); + + return rtrim($decrypted, "\0"); + } +} diff --git a/lib/zend/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php b/lib/zend/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php new file mode 100644 index 0000000000..c183c56479 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php @@ -0,0 +1,38 @@ +_isValid = true; + return $this; + } + + /** + * Retrieve the PPI (Private Personal Identifier) associated with the information card + * + * @return string the private personal identifier + */ + public function getCardID() + { + return $this->getClaim('http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier'); + } + + /** + * Retrieves the default namespace used in this information card. If a default namespace was not + * set, it figures out which one to consider 'default' by taking the first namespace sorted by use-count + * in claims + * + * @throws Zend_InfoCard_Exception + * @return string The default namespace + */ + public function getDefaultNamespace() + { + if($this->_defaultNamespace === null) { + $namespaces = array(); + $leader = ''; + foreach($this->_claims as $claim) { + if(!isset($namespaces[$claim['namespace']])) { + $namespaces[$claim['namespace']] = 1; + } else { + $namespaces[$claim['namespace']]++; + } + + if(empty($leader) || ($namespaces[$claim['namespace']] > $leader)) { + $leader = $claim['namespace']; + } + } + + if(empty($leader)) { + require_once 'Zend/InfoCard/Exception.php'; + throw new Zend_InfoCard_Exception("Failed to determine default namespace"); + } + + $this->setDefaultNamespace($leader); + } + + return $this->_defaultNamespace; + } + + /** + * Set the default namespace, overriding any existing default + * + * @throws Zend_InfoCard_Exception + * @param string $namespace The default namespace to use + * @return Zend_InfoCard_Claims + */ + public function setDefaultNamespace($namespace) + { + + foreach($this->_claims as $claim) { + if($namespace == $claim['namespace']) { + $this->_defaultNamespace = $namespace; + return $this; + } + } + + require_once 'Zend/InfoCard/Exception.php'; + throw new Zend_InfoCard_Exception("At least one claim must exist in specified namespace to make it the default namespace"); + } + + /** + * Indicates if this claim object contains validated claims or not + * + * @return bool + */ + public function isValid() + { + return $this->_isValid; + } + + /** + * Set the error message contained within the claims object + * + * @param string $error The error message + * @return Zend_InfoCard_Claims + */ + public function setError($error) + { + $this->_error = $error; + $this->_isValid = false; + return $this; + } + + /** + * Retrieve the error message contained within the claims object + * + * @return string The error message + */ + public function getErrorMsg() + { + return $this->_error; + } + + /** + * Set the claims for the claims object. Can only be set once and is done + * by the component itself. Internal use only. + * + * @throws Zend_InfoCard_Exception + * @param array $claims + * @return Zend_InfoCard_Claims + */ + public function setClaims(Array $claims) + { + if($this->_claims !== null) { + require_once 'Zend/InfoCard/Exception.php'; + throw new Zend_InfoCard_Exception("Claim objects are read-only"); + } + + $this->_claims = $claims; + return $this; + } + + /** + * Set the result code of the claims object. + * + * @throws Zend_InfoCard_Exception + * @param int $code The result code + * @return Zend_InfoCard_Claims + */ + public function setCode($code) + { + switch($code) { + case self::RESULT_PROCESSING_FAILURE: + case self::RESULT_SUCCESS: + case self::RESULT_VALIDATION_FAILURE: + $this->_code = $code; + return $this; + } + + require_once 'Zend/InfoCard/Exception.php'; + throw new Zend_InfoCard_Exception("Attempted to set unknown error code"); + } + + /** + * Gets the result code of the claims object + * + * @return integer The result code + */ + public function getCode() + { + return $this->_code; + } + + /** + * Get a claim by providing its complete claim URI + * + * @param string $claimURI The complete claim URI to retrieve + * @return mixed The claim matching that specific URI or null if not found + */ + public function getClaim($claimURI) + { + if($this->claimExists($claimURI)) { + return $this->_claims[$claimURI]['value']; + } + + return null; + } + + /** + * Indicates if a specific claim URI exists or not within the object + * + * @param string $claimURI The complete claim URI to check + * @return bool true if the claim exists, false if not found + */ + public function claimExists($claimURI) + { + return isset($this->_claims[$claimURI]); + } + + /** + * Magic helper function + * @throws Zend_InfoCard_Exception + */ + public function __unset($k) + { + require_once 'Zend/InfoCard/Exception.php'; + throw new Zend_InfoCard_Exception("Claim objects are read-only"); + } + + /** + * Magic helper function + */ + public function __isset($k) + { + return $this->claimExists("{$this->getDefaultNamespace()}/$k"); + } + + /** + * Magic helper function + */ + public function __get($k) + { + return $this->getClaim("{$this->getDefaultNamespace()}/$k"); + } + + /** + * Magic helper function + * @throws Zend_InfoCard_Exception + */ + public function __set($k, $v) + { + require_once 'Zend/InfoCard/Exception.php'; + throw new Zend_InfoCard_Exception("Claim objects are read-only"); + } +} diff --git a/lib/zend/Zend/InfoCard/Exception.php b/lib/zend/Zend/InfoCard/Exception.php new file mode 100644 index 0000000000..ff662d5cf4 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Exception.php @@ -0,0 +1,43 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + require_once 'Zend/InfoCard/Xml/Exception.php'; + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + $namespaces = $sxe->getDocNameSpaces(); + + foreach($namespaces as $namespace) { + switch($namespace) { + case self::TYPE_SAML: + include_once 'Zend/InfoCard/Xml/Assertion/Saml.php'; + return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_Assertion_Saml', null); + } + } + + require_once 'Zend/InfoCard/Xml/Exception.php'; + throw new Zend_InfoCard_Xml_Exception("Unable to determine Assertion type by Namespace"); + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/Assertion/Interface.php b/lib/zend/Zend/InfoCard/Xml/Assertion/Interface.php new file mode 100644 index 0000000000..6e79abdbde --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/Assertion/Interface.php @@ -0,0 +1,69 @@ + $conditionValue) { + switch(strtolower($condition)) { + case 'audiencerestrictioncondition': + + $serverName = $this->_getServerName(); + $serverPort = $this->_getServerPort(); + + $self_aliases[] = $serverName; + $self_aliases[] = "{{$serverName}:{$serverPort}"; + + $found = false; + if(is_array($conditionValue)) { + foreach($conditionValue as $audience) { + + list(,,$audience) = explode('/', $audience); + if(in_array($audience, $self_aliases)) { + $found = true; + break; + } + } + } + + if(!$found) { + return array($condition, 'Could not find self in allowed audience list'); + } + + break; + case 'notbefore': + $notbeforetime = strtotime($conditionValue); + + if($currentTime < $notbeforetime) { + if($currentTime + self::CONDITION_TIME_ADJ < $notbeforetime) { + return array($condition, 'Current time is before specified window'); + } + } + + break; + case 'notonorafter': + $notonoraftertime = strtotime($conditionValue); + + if($currentTime >= $notonoraftertime) { + if($currentTime - self::CONDITION_TIME_ADJ >= $notonoraftertime) { + return array($condition, 'Current time is after specified window'); + } + } + + break; + + } + } + } + return true; + } + + /** + * Get the Assertion URI for this type of Assertion + * + * @return string the Assertion URI + */ + public function getAssertionURI() + { + return Zend_InfoCard_Xml_Assertion::TYPE_SAML; + } + + /** + * Get the Major Version of the SAML Assertion + * + * @return integer The major version number + */ + public function getMajorVersion() + { + return (int)(string)$this['MajorVersion']; + } + + /** + * The Minor Version of the SAML Assertion + * + * @return integer The minor version number + */ + public function getMinorVersion() + { + return (int)(string)$this['MinorVersion']; + } + + /** + * Get the Assertion ID of the assertion + * + * @return string The Assertion ID + */ + public function getAssertionID() + { + return (string)$this['AssertionID']; + } + + /** + * Get the Issuer URI of the assertion + * + * @return string the URI of the assertion Issuer + */ + public function getIssuer() + { + return (string)$this['Issuer']; + } + + /** + * Get the Timestamp of when the assertion was issued + * + * @return integer a UNIX timestamp representing when the assertion was issued + */ + public function getIssuedTimestamp() + { + return strtotime((string)$this['IssueInstant']); + } + + /** + * Return an array of conditions which the assertions are predicated on + * + * @throws Zend_InfoCard_Xml_Exception + * @return array an array of conditions + */ + public function getConditions() + { + + list($conditions) = $this->xpath("//saml:Conditions"); + + if(!($conditions instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the saml:Conditions block"); + } + + $retval = array(); + + foreach($conditions->children('urn:oasis:names:tc:SAML:1.0:assertion') as $key => $value) { + switch($key) { + case self::CONDITION_AUDIENCE: + foreach($value->children('urn:oasis:names:tc:SAML:1.0:assertion') as $audience_key => $audience_value) { + if($audience_key == 'Audience') { + $retval[$key][] = (string)$audience_value; + } + } + break; + } + } + + $retval['NotBefore'] = (string)$conditions['NotBefore']; + $retval['NotOnOrAfter'] = (string)$conditions['NotOnOrAfter']; + + return $retval; + } + + /** + * Get they KeyInfo element for the Subject KeyInfo block + * + * @todo Not Yet Implemented + * @ignore + */ + public function getSubjectKeyInfo() + { + /** + * @todo Not sure if this is part of the scope for now.. + */ + + if($this->getConfirmationMethod() == self::CONFIRMATION_BEARER) { + throw new Zend_InfoCard_Xml_Exception("Cannot get Subject Key Info when Confirmation Method was Bearer"); + } + } + + /** + * Return the Confirmation Method URI used in the Assertion + * + * @return string The confirmation method URI + */ + public function getConfirmationMethod() + { + list($confirmation) = $this->xPath("//saml:ConfirmationMethod"); + return (string)$confirmation; + } + + /** + * Return an array of attributes (claims) contained within the assertion + * + * @return array An array of attributes / claims within the assertion + */ + public function getAttributes() + { + $attributes = $this->xPath('//saml:Attribute'); + + $retval = array(); + foreach($attributes as $key => $value) { + + $retkey = (string)$value['AttributeNamespace'].'/'.(string)$value['AttributeName']; + + $retval[$retkey]['name'] = (string)$value['AttributeName']; + $retval[$retkey]['namespace'] = (string)$value['AttributeNamespace']; + + list($aValue) = $value->children('urn:oasis:names:tc:SAML:1.0:assertion'); + $retval[$retkey]['value'] = (string)$aValue; + } + + return $retval; + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/Element.php b/lib/zend/Zend/InfoCard/Xml/Element.php new file mode 100644 index 0000000000..4781d5d624 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/Element.php @@ -0,0 +1,107 @@ +asXML(); + } + + /** + * Converts an XML Element object into a DOM object + * + * @throws Zend_InfoCard_Xml_Exception + * @param Zend_InfoCard_Xml_Element $e The object to convert + * @return DOMElement A DOMElement representation of the same object + */ + static public function convertToDOM(Zend_InfoCard_Xml_Element $e) + { + $dom = dom_import_simplexml($e); + + if(!($dom instanceof DOMElement)) { + // Zend_InfoCard_Xml_Element exntes SimpleXMLElement, so this should *never* fail + // @codeCoverageIgnoreStart + require_once 'Zend/InfoCard/Xml/Exception.php'; + throw new Zend_InfoCard_Xml_Exception("Failed to convert between SimpleXML and DOM"); + // @codeCoverageIgnoreEnd + } + + return $dom; + } + + /** + * Converts a DOMElement object into the specific class + * + * @throws Zend_InfoCard_Xml_Exception + * @param DOMElement $e The DOMElement object to convert + * @param string $classname The name of the class to convert it to (must inhert from Zend_InfoCard_Xml_Element) + * @return Zend_InfoCard_Xml_Element a Xml Element object from the DOM element + */ + static public function convertToObject(DOMElement $e, $classname) + { + if (!class_exists($classname)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($classname); + } + + $reflection = new ReflectionClass($classname); + + if(!$reflection->isSubclassOf('Zend_InfoCard_Xml_Element')) { + require_once 'Zend/InfoCard/Xml/Exception.php'; + throw new Zend_InfoCard_Xml_Exception("DOM element must be converted to an instance of Zend_InfoCard_Xml_Element"); + } + + $sxe = simplexml_import_dom($e, $classname); + + if(!($sxe instanceof Zend_InfoCard_Xml_Element)) { + // Since we just checked to see if this was a subclass of Zend_infoCard_Xml_Element this shoudl never fail + // @codeCoverageIgnoreStart + require_once 'Zend/InfoCard/Xml/Exception.php'; + throw new Zend_InfoCard_Xml_Exception("Failed to convert between DOM and SimpleXML"); + // @codeCoverageIgnoreEnd + } + + return $sxe; + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/Element/Interface.php b/lib/zend/Zend/InfoCard/Xml/Element/Interface.php new file mode 100644 index 0000000000..b9beef798b --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/Element/Interface.php @@ -0,0 +1,44 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + require_once 'Zend/InfoCard/Xml/Exception.php'; + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + switch($sxe['Type']) { + case 'http://www.w3.org/2001/04/xmlenc#Element': + include_once 'Zend/InfoCard/Xml/EncryptedData/XmlEnc.php'; + return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_EncryptedData_XmlEnc'); + default: + require_once 'Zend/InfoCard/Xml/Exception.php'; + throw new Zend_InfoCard_Xml_Exception("Unknown EncryptedData type found"); + break; + } + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/EncryptedData/Abstract.php b/lib/zend/Zend/InfoCard/Xml/EncryptedData/Abstract.php new file mode 100644 index 0000000000..b481a619e9 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/EncryptedData/Abstract.php @@ -0,0 +1,92 @@ +KeyInfo[0]); + } + + /** + * Return the Encryption method used to encrypt the assertion document + * (the symmetric cipher) + * + * @throws Zend_InfoCard_Xml_Exception + * @return string The URI of the Symmetric Encryption Method used + */ + public function getEncryptionMethod() + { + + /** + * @todo This is pretty hacky unless we can always be confident that the first + * EncryptionMethod block is the correct one (the AES or compariable symetric algorithm).. + * the second is the PK method if provided. + */ + list($encryption_method) = $this->xpath("//enc:EncryptionMethod"); + + if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the enc:EncryptionMethod symmetric encryption block"); + } + + $dom = self::convertToDOM($encryption_method); + + if(!$dom->hasAttribute('Algorithm')) { + throw new Zend_InfoCard_Xml_Exception("Unable to determine the encryption algorithm in the Symmetric enc:EncryptionMethod XML block"); + } + + return $dom->getAttribute('Algorithm'); + } + + /** + * Returns the value of the encrypted block + * + * @return string the value of the encrypted CipherValue block + */ + abstract function getCipherValue(); +} diff --git a/lib/zend/Zend/InfoCard/Xml/EncryptedData/XmlEnc.php b/lib/zend/Zend/InfoCard/Xml/EncryptedData/XmlEnc.php new file mode 100644 index 0000000000..55c41d0274 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/EncryptedData/XmlEnc.php @@ -0,0 +1,64 @@ +registerXPathNamespace('enc', 'http://www.w3.org/2001/04/xmlenc#'); + + list(,$cipherdata) = $this->xpath("//enc:CipherData"); + + if(!($cipherdata instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the enc:CipherData block"); + } + + list(,$ciphervalue) = $cipherdata->xpath("//enc:CipherValue"); + + if(!($ciphervalue instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to fidn the enc:CipherValue block"); + } + + return (string)$ciphervalue; + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/EncryptedKey.php b/lib/zend/Zend/InfoCard/Xml/EncryptedKey.php new file mode 100644 index 0000000000..6aa1e16331 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/EncryptedKey.php @@ -0,0 +1,174 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + if($sxe->getName() != "EncryptedKey") { + throw new Zend_InfoCard_Xml_Exception("Invalid XML Block provided for EncryptedKey"); + } + + return simplexml_load_string($strXmlData, "Zend_InfoCard_Xml_EncryptedKey"); + } + + /** + * Returns the Encyption Method Algorithm URI of the block + * + * @throws Zend_InfoCard_Xml_Exception + * @return string the Encryption method algorithm URI + */ + public function getEncryptionMethod() + { + + $this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#'); + list($encryption_method) = $this->xpath("//e:EncryptionMethod"); + + if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the e:EncryptionMethod KeyInfo encryption block"); + } + + $dom = self::convertToDOM($encryption_method); + + if(!$dom->hasAttribute('Algorithm')) { + throw new Zend_InfoCard_Xml_Exception("Unable to determine the encryption algorithm in the Symmetric enc:EncryptionMethod XML block"); + } + + return $dom->getAttribute('Algorithm'); + + } + + /** + * Returns the Digest Method Algorithm URI used + * + * @throws Zend_InfoCard_Xml_Exception + * @return string the Digest Method Algorithm URI + */ + public function getDigestMethod() + { + $this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#'); + list($encryption_method) = $this->xpath("//e:EncryptionMethod"); + + if(!($encryption_method instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the e:EncryptionMethod KeyInfo encryption block"); + } + + if(!($encryption_method->DigestMethod instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the DigestMethod block"); + } + + $dom = self::convertToDOM($encryption_method->DigestMethod); + + if(!$dom->hasAttribute('Algorithm')) { + throw new Zend_InfoCard_Xml_Exception("Unable to determine the digest algorithm for the symmetric Keyinfo"); + } + + return $dom->getAttribute('Algorithm'); + + } + + /** + * Returns the KeyInfo block object + * + * @throws Zend_InfoCard_Xml_Exception + * @return Zend_InfoCard_Xml_KeyInfo_Abstract + */ + public function getKeyInfo() + { + + if(isset($this->KeyInfo)) { + return Zend_InfoCard_Xml_KeyInfo::getInstance($this->KeyInfo); + } + + throw new Zend_InfoCard_Xml_Exception("Unable to locate a KeyInfo block"); + } + + /** + * Return the encrypted value of the block in base64 format + * + * @throws Zend_InfoCard_Xml_Exception + * @return string The Value of the CipherValue block in base64 format + */ + public function getCipherValue() + { + + $this->registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#'); + + list($cipherdata) = $this->xpath("//e:CipherData"); + + if(!($cipherdata instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to find the e:CipherData block"); + } + + $cipherdata->registerXPathNameSpace('enc', 'http://www.w3.org/2001/04/xmlenc#'); + list($ciphervalue) = $cipherdata->xpath("//enc:CipherValue"); + + if(!($ciphervalue instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Unable to fidn the enc:CipherValue block"); + } + + return (string)$ciphervalue; + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/Exception.php b/lib/zend/Zend/InfoCard/Xml/Exception.php new file mode 100644 index 0000000000..a3312157a3 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/Exception.php @@ -0,0 +1,37 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + $namespaces = $sxe->getDocNameSpaces(); + + if(!empty($namespaces)) { + foreach($sxe->getDocNameSpaces() as $namespace) { + switch($namespace) { + case 'http://www.w3.org/2000/09/xmldsig#': + include_once 'Zend/InfoCard/Xml/KeyInfo/XmlDSig.php'; + return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_KeyInfo_XmlDSig'); + default: + + throw new Zend_InfoCard_Xml_Exception("Unknown KeyInfo Namespace provided"); + // We are ignoring these lines, as XDebug reports each as a "non executed" line + // which breaks my coverage % + // @codeCoverageIgnoreStart + } + } + } + // @codeCoverageIgnoreEnd + + include_once 'Zend/InfoCard/Xml/KeyInfo/Default.php'; + return simplexml_load_string($strXmlData, 'Zend_InfoCard_Xml_KeyInfo_Default'); + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/KeyInfo/Abstract.php b/lib/zend/Zend/InfoCard/Xml/KeyInfo/Abstract.php new file mode 100644 index 0000000000..0d978a6d20 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/KeyInfo/Abstract.php @@ -0,0 +1,37 @@ + block which doesn't provide a namespace + * In this context, it is assumed to mean that it is the type of KeyInfo block which + * contains the SecurityTokenReference + * + * @category Zend + * @package Zend_InfoCard + * @subpackage Zend_InfoCard_Xml + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_InfoCard_Xml_KeyInfo_Default extends Zend_InfoCard_Xml_KeyInfo_Abstract +{ + /** + * Returns the object representation of the SecurityTokenReference block + * + * @throws Zend_InfoCard_Xml_Exception + * @return Zend_InfoCard_Xml_SecurityTokenReference + */ + public function getSecurityTokenReference() + { + $this->registerXPathNamespace('o', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'); + + list($sectokenref) = $this->xpath('//o:SecurityTokenReference'); + + if(!($sectokenref instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception('Could not locate the Security Token Reference'); + } + + return Zend_InfoCard_Xml_SecurityTokenReference::getInstance($sectokenref); + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/KeyInfo/Interface.php b/lib/zend/Zend/InfoCard/Xml/KeyInfo/Interface.php new file mode 100644 index 0000000000..0fb9d44d84 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/KeyInfo/Interface.php @@ -0,0 +1,38 @@ +registerXPathNamespace('e', 'http://www.w3.org/2001/04/xmlenc#'); + list($encryptedkey) = $this->xpath('//e:EncryptedKey'); + + if(!($encryptedkey instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Failed to retrieve encrypted key"); + } + + return Zend_InfoCard_Xml_EncryptedKey::getInstance($encryptedkey); + } + + /** + * Returns the KeyInfo Block within the encrypted key + * + * @return Zend_InfoCard_Xml_KeyInfo_Default + */ + public function getKeyInfo() + { + return $this->getEncryptedKey()->getKeyInfo(); + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/Security.php b/lib/zend/Zend/InfoCard/Xml/Security.php new file mode 100644 index 0000000000..0c66ba9a9a --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/Security.php @@ -0,0 +1,305 @@ +Signature)) { + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Could not identify XML Signature element"); + } + + if(!isset($sxe->Signature->SignedInfo)) { + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a SignedInfo block"); + } + + if(!isset($sxe->Signature->SignatureValue)) { + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a SignatureValue block"); + } + + if(!isset($sxe->Signature->KeyInfo)) { + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a KeyInfo block"); + } + + if(!isset($sxe->Signature->KeyInfo->KeyValue)) { + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Signature is missing a KeyValue block"); + } + + switch((string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm']) { + case self::CANONICAL_METHOD_C14N_EXC: + $cMethod = (string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm']; + break; + default: + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported CanonicalizationMethod Requested"); + break; + } + + switch((string)$sxe->Signature->SignedInfo->SignatureMethod['Algorithm']) { + case self::SIGNATURE_METHOD_SHA1: + $sMethod = (string)$sxe->Signature->SignedInfo->SignatureMethod['Algorithm']; + break; + default: + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported SignatureMethod Requested"); + break; + } + + switch((string)$sxe->Signature->SignedInfo->Reference->DigestMethod['Algorithm']) { + case self::DIGEST_METHOD_SHA1: + $dMethod = (string)$sxe->Signature->SignedInfo->Reference->DigestMethod['Algorithm']; + break; + default: + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Unknown or unsupported DigestMethod Requested"); + break; + } + + $base64DecodeSupportsStrictParam = version_compare(PHP_VERSION, '5.2.0', '>='); + + if ($base64DecodeSupportsStrictParam) { + $dValue = base64_decode((string)$sxe->Signature->SignedInfo->Reference->DigestValue, true); + } else { + $dValue = base64_decode((string)$sxe->Signature->SignedInfo->Reference->DigestValue); + } + + if ($base64DecodeSupportsStrictParam) { + $signatureValue = base64_decode((string)$sxe->Signature->SignatureValue, true); + } else { + $signatureValue = base64_decode((string)$sxe->Signature->SignatureValue); + } + + $transformer = new Zend_InfoCard_Xml_Security_Transform(); + + foreach($sxe->Signature->SignedInfo->Reference->Transforms->children() as $transform) { + $transformer->addTransform((string)$transform['Algorithm']); + } + + $transformed_xml = $transformer->applyTransforms($strXMLInput); + + $transformed_xml_binhash = pack("H*", sha1($transformed_xml)); + + if($transformed_xml_binhash != $dValue) { + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Locally Transformed XML does not match XML Document. Cannot Verify Signature"); + } + + $public_key = null; + + switch(true) { + case isset($sxe->Signature->KeyInfo->KeyValue->X509Certificate): + + $certificate = (string)$sxe->Signature->KeyInfo->KeyValue->X509Certificate; + + + $pem = "-----BEGIN CERTIFICATE-----\n" . + wordwrap($certificate, 64, "\n", true) . + "\n-----END CERTIFICATE-----"; + + $public_key = openssl_pkey_get_public($pem); + + if(!$public_key) { + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Unable to extract and prcoess X509 Certificate from KeyValue"); + } + + break; + case isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue): + + if(!isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Modulus) || + !isset($sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Exponent)) { + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("RSA Key Value not in Modulus/Exponent form"); + } + + $modulus = base64_decode((string)$sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Modulus); + $exponent = base64_decode((string)$sxe->Signature->KeyInfo->KeyValue->RSAKeyValue->Exponent); + + $pem_public_key = self::_getPublicKeyFromModExp($modulus, $exponent); + + $public_key = openssl_pkey_get_public ($pem_public_key); + + break; + default: + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Unable to determine or unsupported representation of the KeyValue block"); + } + + $transformer = new Zend_InfoCard_Xml_Security_Transform(); + $transformer->addTransform((string)$sxe->Signature->SignedInfo->CanonicalizationMethod['Algorithm']); + + // The way we are doing our XML processing requires that we specifically add this + // (even though it's in the parent-block).. otherwise, our canonical form + // fails signature verification + $sxe->Signature->SignedInfo->addAttribute('xmlns', 'http://www.w3.org/2000/09/xmldsig#'); + + $canonical_signedinfo = $transformer->applyTransforms($sxe->Signature->SignedInfo->asXML()); + + if(@openssl_verify($canonical_signedinfo, $signatureValue, $public_key)) { + return (string)$sxe->Signature->SignedInfo->Reference['URI']; + } + + return false; + } + + /** + * Transform an RSA Key in Modulus/Exponent format into a PEM encoding and + * return an openssl resource for it + * + * @param string $modulus The RSA Modulus in binary format + * @param string $exponent The RSA exponent in binary format + * @return string The PEM encoded version of the key + */ + static protected function _getPublicKeyFromModExp($modulus, $exponent) + { + $modulusInteger = self::_encodeValue($modulus, self::ASN_TYPE_INTEGER); + $exponentInteger = self::_encodeValue($exponent, self::ASN_TYPE_INTEGER); + $modExpSequence = self::_encodeValue($modulusInteger . $exponentInteger, self::ASN_TYPE_SEQUENCE); + $modExpBitString = self::_encodeValue($modExpSequence, self::ASN_TYPE_BITSTRING); + + $binRsaKeyIdentifier = pack( "H*", self::RSA_KEY_IDENTIFIER ); + + $publicKeySequence = self::_encodeValue($binRsaKeyIdentifier . $modExpBitString, self::ASN_TYPE_SEQUENCE); + + $publicKeyInfoBase64 = base64_encode( $publicKeySequence ); + + $publicKeyString = "-----BEGIN PUBLIC KEY-----\n"; + $publicKeyString .= wordwrap($publicKeyInfoBase64, 64, "\n", true); + $publicKeyString .= "\n-----END PUBLIC KEY-----\n"; + + return $publicKeyString; + } + + /** + * Encode a limited set of data types into ASN.1 encoding format + * which is used in X.509 certificates + * + * @param string $data The data to encode + * @param const $type The encoding format constant + * @return string The encoded value + * @throws Zend_InfoCard_Xml_Security_Exception + */ + static protected function _encodeValue($data, $type) + { + // Null pad some data when we get it (integer values > 128 and bitstrings) + if( (($type == self::ASN_TYPE_INTEGER) && (ord($data) > 0x7f)) || + ($type == self::ASN_TYPE_BITSTRING)) { + $data = "\0$data"; + } + + $len = strlen($data); + + // encode the value based on length of the string + // I'm fairly confident that this is by no means a complete implementation + // but it is enough for our purposes + switch(true) { + case ($len < 128): + return sprintf("%c%c%s", $type, $len, $data); + case ($len < 0x0100): + return sprintf("%c%c%c%s", $type, 0x81, $len, $data); + case ($len < 0x010000): + return sprintf("%c%c%c%c%s", $type, 0x82, $len / 0x0100, $len % 0x0100, $data); + default: + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Could not encode value"); + } + + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Invalid code path"); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/InfoCard/Xml/Security/Exception.php b/lib/zend/Zend/InfoCard/Xml/Security/Exception.php new file mode 100644 index 0000000000..2274ecbcce --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/Security/Exception.php @@ -0,0 +1,37 @@ +_findClassbyURI($uri); + + $this->_transformList[] = array('uri' => $uri, + 'class' => $class); + return $this; + } + + /** + * Return the list of transforms to perform + * + * @return array The list of transforms + */ + public function getTransformList() + { + return $this->_transformList; + } + + /** + * Apply the transforms in the transform list to the input XML document + * + * @param string $strXmlDocument The input XML + * @return string The XML after the transformations have been applied + */ + public function applyTransforms($strXmlDocument) + { + foreach($this->_transformList as $transform) { + if (!class_exists($transform['class'])) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($transform['class']); + } + + $transformer = new $transform['class']; + + // We can't really test this check because it would require logic changes in the component itself + // @codeCoverageIgnoreStart + if(!($transformer instanceof Zend_InfoCard_Xml_Security_Transform_Interface)) { + require_once 'Zend/InfoCard/Xml/Security/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Exception("Transforms must implement the Transform Interface"); + } + // @codeCoverageIgnoreEnd + + $strXmlDocument = $transformer->transform($strXmlDocument); + } + + return $strXmlDocument; + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/Security/Transform/EnvelopedSignature.php b/lib/zend/Zend/InfoCard/Xml/Security/Transform/EnvelopedSignature.php new file mode 100644 index 0000000000..7f5eb52478 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/Security/Transform/EnvelopedSignature.php @@ -0,0 +1,60 @@ +Signature) { + require_once 'Zend/InfoCard/Xml/Security/Transform/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Transform_Exception("Unable to locate Signature Block for EnvelopedSignature Transform"); + } + + unset($sxe->Signature); + + return $sxe->asXML(); + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/Security/Transform/Exception.php b/lib/zend/Zend/InfoCard/Xml/Security/Transform/Exception.php new file mode 100644 index 0000000000..c30a3c87c6 --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/Security/Transform/Exception.php @@ -0,0 +1,37 @@ +loadXML($strXMLData); + + if(method_exists($dom, 'C14N')) { + return $dom->C14N(true, false); + } + + require_once 'Zend/InfoCard/Xml/Security/Transform/Exception.php'; + throw new Zend_InfoCard_Xml_Security_Transform_Exception("This transform requires the C14N() method to exist in the DOM extension"); + } +} diff --git a/lib/zend/Zend/InfoCard/Xml/SecurityTokenReference.php b/lib/zend/Zend/InfoCard/Xml/SecurityTokenReference.php new file mode 100644 index 0000000000..9b74757bae --- /dev/null +++ b/lib/zend/Zend/InfoCard/Xml/SecurityTokenReference.php @@ -0,0 +1,173 @@ +asXML(); + } else if (is_string($xmlData)) { + $strXmlData = $xmlData; + } else { + throw new Zend_InfoCard_Xml_Exception("Invalid Data provided to create instance"); + } + + $sxe = simplexml_load_string($strXmlData); + + if($sxe->getName() != "SecurityTokenReference") { + throw new Zend_InfoCard_Xml_Exception("Invalid XML Block provided for SecurityTokenReference"); + } + + return simplexml_load_string($strXmlData, "Zend_InfoCard_Xml_SecurityTokenReference"); + } + + /** + * Return the Key Identifier XML Object + * + * @return Zend_InfoCard_Xml_Element + * @throws Zend_InfoCard_Xml_Exception + */ + protected function _getKeyIdentifier() + { + $this->registerXPathNamespace('o', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'); + list($keyident) = $this->xpath('//o:KeyIdentifier'); + + if(!($keyident instanceof Zend_InfoCard_Xml_Element)) { + throw new Zend_InfoCard_Xml_Exception("Failed to retrieve Key Identifier"); + } + + return $keyident; + } + + /** + * Return the Key URI identifying the thumbprint type used + * + * @return string The thumbprint type URI + * @throws Zend_InfoCard_Xml_Exception + */ + public function getKeyThumbprintType() + { + + $keyident = $this->_getKeyIdentifier(); + + $dom = self::convertToDOM($keyident); + + if(!$dom->hasAttribute('ValueType')) { + throw new Zend_InfoCard_Xml_Exception("Key Identifier did not provide a type for the value"); + } + + return $dom->getAttribute('ValueType'); + } + + + /** + * Return the thumbprint encoding type used as a URI + * + * @return string the URI of the thumbprint encoding used + * @throws Zend_InfoCard_Xml_Exception + */ + public function getKeyThumbprintEncodingType() + { + + $keyident = $this->_getKeyIdentifier(); + + $dom = self::convertToDOM($keyident); + + if(!$dom->hasAttribute('EncodingType')) { + throw new Zend_InfoCard_Xml_Exception("Unable to determine the encoding type for the key identifier"); + } + + return $dom->getAttribute('EncodingType'); + } + + /** + * Get the key reference data used to identify the public key + * + * @param bool $decode if true, will return a decoded version of the key + * @return string the key reference thumbprint, either in binary or encoded form + * @throws Zend_InfoCard_Xml_Exception + */ + public function getKeyReference($decode = true) + { + $keyIdentifier = $this->_getKeyIdentifier(); + + $dom = self::convertToDOM($keyIdentifier); + $encoded = $dom->nodeValue; + + if(empty($encoded)) { + throw new Zend_InfoCard_Xml_Exception("Could not find the Key Reference Encoded Value"); + } + + if($decode) { + + $decoded = ""; + switch($this->getKeyThumbprintEncodingType()) { + case self::ENCODING_BASE64BIN: + + if(version_compare(PHP_VERSION, "5.2.0", ">=")) { + $decoded = base64_decode($encoded, true); + } else { + $decoded = base64_decode($encoded); + } + + break; + default: + throw new Zend_InfoCard_Xml_Exception("Unknown Key Reference Encoding Type: {$this->getKeyThumbprintEncodingType()}"); + } + + if(!$decoded || empty($decoded)) { + throw new Zend_InfoCard_Xml_Exception("Failed to decode key reference"); + } + + return $decoded; + } + + return $encoded; + } +} diff --git a/lib/zend/Zend/Json/Decoder.php b/lib/zend/Zend/Json/Decoder.php new file mode 100644 index 0000000000..321d180df2 --- /dev/null +++ b/lib/zend/Zend/Json/Decoder.php @@ -0,0 +1,578 @@ +_source = self::decodeUnicodeString($source); + $this->_sourceLength = strlen($this->_source); + $this->_token = self::EOF; + $this->_offset = 0; + + // Normalize and set $decodeType + if (!in_array($decodeType, array(Zend_Json::TYPE_ARRAY, Zend_Json::TYPE_OBJECT))) + { + $decodeType = Zend_Json::TYPE_ARRAY; + } + $this->_decodeType = $decodeType; + + // Set pointer at first token + $this->_getNextToken(); + } + + /** + * Decode a JSON source string + * + * Decodes a JSON encoded string. The value returned will be one of the + * following: + * - integer + * - float + * - boolean + * - null + * - StdClass + * - array + * - array of one or more of the above types + * + * By default, decoded objects will be returned as associative arrays; to + * return a StdClass object instead, pass {@link Zend_Json::TYPE_OBJECT} to + * the $objectDecodeType parameter. + * + * Throws a Zend_Json_Exception if the source string is null. + * + * @static + * @access public + * @param string $source String to be decoded + * @param int $objectDecodeType How objects should be decoded; should be + * either or {@link Zend_Json::TYPE_ARRAY} or + * {@link Zend_Json::TYPE_OBJECT}; defaults to TYPE_ARRAY + * @return mixed + * @throws Zend_Json_Exception + */ + public static function decode($source = null, $objectDecodeType = Zend_Json::TYPE_ARRAY) + { + if (null === $source) { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception('Must specify JSON encoded source for decoding'); + } elseif (!is_string($source)) { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception('Can only decode JSON encoded strings'); + } + + $decoder = new self($source, $objectDecodeType); + + return $decoder->_decodeValue(); + } + + + /** + * Recursive driving rountine for supported toplevel tops + * + * @return mixed + */ + protected function _decodeValue() + { + switch ($this->_token) { + case self::DATUM: + $result = $this->_tokenValue; + $this->_getNextToken(); + return($result); + break; + case self::LBRACE: + return($this->_decodeObject()); + break; + case self::LBRACKET: + return($this->_decodeArray()); + break; + default: + return null; + break; + } + } + + /** + * Decodes an object of the form: + * { "attribute: value, "attribute2" : value,...} + * + * If Zend_Json_Encoder was used to encode the original object then + * a special attribute called __className which specifies a class + * name that should wrap the data contained within the encoded source. + * + * Decodes to either an array or StdClass object, based on the value of + * {@link $_decodeType}. If invalid $_decodeType present, returns as an + * array. + * + * @return array|StdClass + */ + protected function _decodeObject() + { + $members = array(); + $tok = $this->_getNextToken(); + + while ($tok && $tok != self::RBRACE) { + if ($tok != self::DATUM || ! is_string($this->_tokenValue)) { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception('Missing key in object encoding: ' . $this->_source); + } + + $key = $this->_tokenValue; + $tok = $this->_getNextToken(); + + if ($tok != self::COLON) { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception('Missing ":" in object encoding: ' . $this->_source); + } + + $tok = $this->_getNextToken(); + $members[$key] = $this->_decodeValue(); + $tok = $this->_token; + + if ($tok == self::RBRACE) { + break; + } + + if ($tok != self::COMMA) { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception('Missing "," in object encoding: ' . $this->_source); + } + + $tok = $this->_getNextToken(); + } + + switch ($this->_decodeType) { + case Zend_Json::TYPE_OBJECT: + // Create new StdClass and populate with $members + $result = new StdClass(); + foreach ($members as $key => $value) { + $result->$key = $value; + } + break; + case Zend_Json::TYPE_ARRAY: + default: + $result = $members; + break; + } + + $this->_getNextToken(); + return $result; + } + + /** + * Decodes a JSON array format: + * [element, element2,...,elementN] + * + * @return array + */ + protected function _decodeArray() + { + $result = array(); + $starttok = $tok = $this->_getNextToken(); // Move past the '[' + $index = 0; + + while ($tok && $tok != self::RBRACKET) { + $result[$index++] = $this->_decodeValue(); + + $tok = $this->_token; + + if ($tok == self::RBRACKET || !$tok) { + break; + } + + if ($tok != self::COMMA) { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception('Missing "," in array encoding: ' . $this->_source); + } + + $tok = $this->_getNextToken(); + } + + $this->_getNextToken(); + return($result); + } + + + /** + * Removes whitepsace characters from the source input + */ + protected function _eatWhitespace() + { + if (preg_match( + '/([\t\b\f\n\r ])*/s', + $this->_source, + $matches, + PREG_OFFSET_CAPTURE, + $this->_offset) + && $matches[0][1] == $this->_offset) + { + $this->_offset += strlen($matches[0][0]); + } + } + + + /** + * Retrieves the next token from the source stream + * + * @return int Token constant value specified in class definition + */ + protected function _getNextToken() + { + $this->_token = self::EOF; + $this->_tokenValue = null; + $this->_eatWhitespace(); + + if ($this->_offset >= $this->_sourceLength) { + return(self::EOF); + } + + $str = $this->_source; + $str_length = $this->_sourceLength; + $i = $this->_offset; + $start = $i; + + switch ($str{$i}) { + case '{': + $this->_token = self::LBRACE; + break; + case '}': + $this->_token = self::RBRACE; + break; + case '[': + $this->_token = self::LBRACKET; + break; + case ']': + $this->_token = self::RBRACKET; + break; + case ',': + $this->_token = self::COMMA; + break; + case ':': + $this->_token = self::COLON; + break; + case '"': + $result = ''; + do { + $i++; + if ($i >= $str_length) { + break; + } + + $chr = $str{$i}; + + if ($chr == '\\') { + $i++; + if ($i >= $str_length) { + break; + } + $chr = $str{$i}; + switch ($chr) { + case '"' : + $result .= '"'; + break; + case '\\': + $result .= '\\'; + break; + case '/' : + $result .= '/'; + break; + case 'b' : + $result .= chr(8); + break; + case 'f' : + $result .= chr(12); + break; + case 'n' : + $result .= chr(10); + break; + case 'r' : + $result .= chr(13); + break; + case 't' : + $result .= chr(9); + break; + case '\'' : + $result .= '\''; + break; + default: + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception("Illegal escape " + . "sequence '" . $chr . "'"); + } + } elseif($chr == '"') { + break; + } else { + $result .= $chr; + } + } while ($i < $str_length); + + $this->_token = self::DATUM; + //$this->_tokenValue = substr($str, $start + 1, $i - $start - 1); + $this->_tokenValue = $result; + break; + case 't': + if (($i+ 3) < $str_length && substr($str, $start, 4) == "true") { + $this->_token = self::DATUM; + } + $this->_tokenValue = true; + $i += 3; + break; + case 'f': + if (($i+ 4) < $str_length && substr($str, $start, 5) == "false") { + $this->_token = self::DATUM; + } + $this->_tokenValue = false; + $i += 4; + break; + case 'n': + if (($i+ 3) < $str_length && substr($str, $start, 4) == "null") { + $this->_token = self::DATUM; + } + $this->_tokenValue = NULL; + $i += 3; + break; + } + + if ($this->_token != self::EOF) { + $this->_offset = $i + 1; // Consume the last token character + return($this->_token); + } + + $chr = $str{$i}; + if ($chr == '-' || $chr == '.' || ($chr >= '0' && $chr <= '9')) { + if (preg_match('/-?([0-9])*(\.[0-9]*)?((e|E)((-|\+)?)[0-9]+)?/s', + $str, $matches, PREG_OFFSET_CAPTURE, $start) && $matches[0][1] == $start) { + + $datum = $matches[0][0]; + + if (is_numeric($datum)) { + if (preg_match('/^0\d+$/', $datum)) { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception("Octal notation not supported by JSON (value: $datum)"); + } else { + $val = intval($datum); + $fVal = floatval($datum); + $this->_tokenValue = ($val == $fVal ? $val : $fVal); + } + } else { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception("Illegal number format: $datum"); + } + + $this->_token = self::DATUM; + $this->_offset = $start + strlen($datum); + } + } else { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception('Illegal Token'); + } + + return($this->_token); + } + + /** + * Decode Unicode Characters from \u0000 ASCII syntax. + * + * This algorithm was originally developed for the + * Solar Framework by Paul M. Jones + * + * @link http://solarphp.com/ + * @link http://svn.solarphp.com/core/trunk/Solar/Json.php + * @param string $value + * @return string + */ + public static function decodeUnicodeString($chrs) + { + $delim = substr($chrs, 0, 1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for($i = 0; $i < $strlen_chrs; $i++) { + + $substr_chrs_c_2 = substr($chrs, $i, 2); + $ord_chrs_c = ord($chrs[$i]); + + switch (true) { + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $i, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($i + 2), 2))) + . chr(hexdec(substr($chrs, ($i + 4), 2))); + $utf8 .= self::_utf162utf8($utf16); + $i += 5; + break; + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$i}; + break; + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $i, 2); + ++$i; + break; + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $i, 3); + $i += 2; + break; + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $i, 4); + $i += 3; + break; + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $i, 5); + $i += 4; + break; + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $i, 6); + $i += 5; + break; + } + } + + return $utf8; + } + + /** + * Convert a string from one UTF-16 char to one UTF-8 char. + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * This method is from the Solar Framework by Paul M. Jones + * + * @link http://solarphp.com + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + */ + protected static function _utf162utf8($utf16) + { + // Check for mb extension otherwise do by hand. + if( function_exists('mb_convert_encoding') ) { + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + } + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch (true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } +} + diff --git a/lib/zend/Zend/Json/Encoder.php b/lib/zend/Zend/Json/Encoder.php new file mode 100644 index 0000000000..8df375e618 --- /dev/null +++ b/lib/zend/Zend/Json/Encoder.php @@ -0,0 +1,574 @@ +_cycleCheck = $cycleCheck; + $this->_options = $options; + } + + /** + * Use the JSON encoding scheme for the value specified + * + * @param mixed $value The value to be encoded + * @param boolean $cycleCheck Whether or not to check for possible object recursion when encoding + * @param array $options Additional options used during encoding + * @return string The encoded value + */ + public static function encode($value, $cycleCheck = false, $options = array()) + { + $encoder = new self(($cycleCheck) ? true : false, $options); + + return $encoder->_encodeValue($value); + } + + /** + * Recursive driver which determines the type of value to be encoded + * and then dispatches to the appropriate method. $values are either + * - objects (returns from {@link _encodeObject()}) + * - arrays (returns from {@link _encodeArray()}) + * - basic datums (e.g. numbers or strings) (returns from {@link _encodeDatum()}) + * + * @param $value mixed The value to be encoded + * @return string Encoded value + */ + protected function _encodeValue(&$value) + { + if (is_object($value)) { + return $this->_encodeObject($value); + } else if (is_array($value)) { + return $this->_encodeArray($value); + } + + return $this->_encodeDatum($value); + } + + + + /** + * Encode an object to JSON by encoding each of the public properties + * + * A special property is added to the JSON object called '__className' + * that contains the name of the class of $value. This is used to decode + * the object on the client into a specific class. + * + * @param $value object + * @return string + * @throws Zend_Json_Exception If recursive checks are enabled and the object has been serialized previously + */ + protected function _encodeObject(&$value) + { + if ($this->_cycleCheck) { + if ($this->_wasVisited($value)) { + + if (isset($this->_options['silenceCyclicalExceptions']) + && $this->_options['silenceCyclicalExceptions']===true) { + + return '"* RECURSION (' . get_class($value) . ') *"'; + + } else { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception( + 'Cycles not supported in JSON encoding, cycle introduced by ' + . 'class "' . get_class($value) . '"' + ); + } + } + + $this->_visited[] = $value; + } + + $props = ''; + + if ($value instanceof Iterator) { + $propCollection = $value; + } else { + $propCollection = get_object_vars($value); + } + + foreach ($propCollection as $name => $propValue) { + if (isset($propValue)) { + $props .= ',' + . $this->_encodeValue($name) + . ':' + . $this->_encodeValue($propValue); + } + } + + return '{"__className":"' . get_class($value) . '"' + . $props . '}'; + } + + + /** + * Determine if an object has been serialized already + * + * @param mixed $value + * @return boolean + */ + protected function _wasVisited(&$value) + { + if (in_array($value, $this->_visited, true)) { + return true; + } + + return false; + } + + + /** + * JSON encode an array value + * + * Recursively encodes each value of an array and returns a JSON encoded + * array string. + * + * Arrays are defined as integer-indexed arrays starting at index 0, where + * the last index is (count($array) -1); any deviation from that is + * considered an associative array, and will be encoded as such. + * + * @param $array array + * @return string + */ + protected function _encodeArray(&$array) + { + $tmpArray = array(); + + // Check for associative array + if (!empty($array) && (array_keys($array) !== range(0, count($array) - 1))) { + // Associative array + $result = '{'; + foreach ($array as $key => $value) { + $key = (string) $key; + $tmpArray[] = $this->_encodeString($key) + . ':' + . $this->_encodeValue($value); + } + $result .= implode(',', $tmpArray); + $result .= '}'; + } else { + // Indexed array + $result = '['; + $length = count($array); + for ($i = 0; $i < $length; $i++) { + $tmpArray[] = $this->_encodeValue($array[$i]); + } + $result .= implode(',', $tmpArray); + $result .= ']'; + } + + return $result; + } + + + /** + * JSON encode a basic data type (string, number, boolean, null) + * + * If value type is not a string, number, boolean, or null, the string + * 'null' is returned. + * + * @param $value mixed + * @return string + */ + protected function _encodeDatum(&$value) + { + $result = 'null'; + + if (is_int($value) || is_float($value)) { + $result = (string) $value; + $result = str_replace(",", ".", $result); + } elseif (is_string($value)) { + $result = $this->_encodeString($value); + } elseif (is_bool($value)) { + $result = $value ? 'true' : 'false'; + } + + return $result; + } + + + /** + * JSON encode a string value by escaping characters as necessary + * + * @param $value string + * @return string + */ + protected function _encodeString(&$string) + { + // Escape these characters with a backslash: + // " \ / \n \r \t \b \f + $search = array('\\', "\n", "\t", "\r", "\b", "\f", '"'); + $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'); + $string = str_replace($search, $replace, $string); + + // Escape certain ASCII characters: + // 0x08 => \b + // 0x0c => \f + $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string); + $string = self::encodeUnicodeString($string); + + return '"' . $string . '"'; + } + + + /** + * Encode the constants associated with the ReflectionClass + * parameter. The encoding format is based on the class2 format + * + * @param $cls ReflectionClass + * @return string Encoded constant block in class2 format + */ + private static function _encodeConstants(ReflectionClass $cls) + { + $result = "constants : {"; + $constants = $cls->getConstants(); + + $tmpArray = array(); + if (!empty($constants)) { + foreach ($constants as $key => $value) { + $tmpArray[] = "$key: " . self::encode($value); + } + + $result .= implode(', ', $tmpArray); + } + + return $result . "}"; + } + + + /** + * Encode the public methods of the ReflectionClass in the + * class2 format + * + * @param $cls ReflectionClass + * @return string Encoded method fragment + * + */ + private static function _encodeMethods(ReflectionClass $cls) + { + $methods = $cls->getMethods(); + $result = 'methods:{'; + + $started = false; + foreach ($methods as $method) { + if (! $method->isPublic() || !$method->isUserDefined()) { + continue; + } + + if ($started) { + $result .= ','; + } + $started = true; + + $result .= '' . $method->getName(). ':function('; + + if ('__construct' != $method->getName()) { + $parameters = $method->getParameters(); + $paramCount = count($parameters); + $argsStarted = false; + + $argNames = "var argNames=["; + foreach ($parameters as $param) { + if ($argsStarted) { + $result .= ','; + } + + $result .= $param->getName(); + + if ($argsStarted) { + $argNames .= ','; + } + + $argNames .= '"' . $param->getName() . '"'; + + $argsStarted = true; + } + $argNames .= "];"; + + $result .= "){" + . $argNames + . 'var result = ZAjaxEngine.invokeRemoteMethod(' + . "this, '" . $method->getName() + . "',argNames,arguments);" + . 'return(result);}'; + } else { + $result .= "){}"; + } + } + + return $result . "}"; + } + + + /** + * Encode the public properties of the ReflectionClass in the class2 + * format. + * + * @param $cls ReflectionClass + * @return string Encode properties list + * + */ + private static function _encodeVariables(ReflectionClass $cls) + { + $properties = $cls->getProperties(); + $propValues = get_class_vars($cls->getName()); + $result = "variables:{"; + $cnt = 0; + + $tmpArray = array(); + foreach ($properties as $prop) { + if (! $prop->isPublic()) { + continue; + } + + $tmpArray[] = $prop->getName() + . ':' + . self::encode($propValues[$prop->getName()]); + } + $result .= implode(',', $tmpArray); + + return $result . "}"; + } + + /** + * Encodes the given $className into the class2 model of encoding PHP + * classes into JavaScript class2 classes. + * NOTE: Currently only public methods and variables are proxied onto + * the client machine + * + * @param $className string The name of the class, the class must be + * instantiable using a null constructor + * @param $package string Optional package name appended to JavaScript + * proxy class name + * @return string The class2 (JavaScript) encoding of the class + * @throws Zend_Json_Exception + */ + public static function encodeClass($className, $package = '') + { + $cls = new ReflectionClass($className); + if (! $cls->isInstantiable()) { + require_once 'Zend/Json/Exception.php'; + throw new Zend_Json_Exception("$className must be instantiable"); + } + + return "Class.create('$package$className',{" + . self::_encodeConstants($cls) ."," + . self::_encodeMethods($cls) ."," + . self::_encodeVariables($cls) .'});'; + } + + + /** + * Encode several classes at once + * + * Returns JSON encoded classes, using {@link encodeClass()}. + * + * @param array $classNames + * @param string $package + * @return string + */ + public static function encodeClasses(array $classNames, $package = '') + { + $result = ''; + foreach ($classNames as $className) { + $result .= self::encodeClass($className, $package); + } + + return $result; + } + + /** + * Encode Unicode Characters to \u0000 ASCII syntax. + * + * This algorithm was originally developed for the + * Solar Framework by Paul M. Jones + * + * @link http://solarphp.com/ + * @link http://svn.solarphp.com/core/trunk/Solar/Json.php + * @param string $value + * @return string + */ + public static function encodeUnicodeString($value) + { + $strlen_var = strlen($value); + $ascii = ""; + + /** + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for($i = 0; $i < $strlen_var; $i++) { + $ord_var_c = ord($value[$i]); + + switch (true) { + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $value[$i]; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($value[$i + 1])); + $i += 1; + $utf16 = self::_utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($value[$i + 1]), + ord($value[$i + 2])); + $i += 2; + $utf16 = self::_utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($value[$i + 1]), + ord($value[$i + 2]), + ord($value[$i + 3])); + $i += 3; + $utf16 = self::_utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($value[$i + 1]), + ord($value[$i + 2]), + ord($value[$i + 3]), + ord($value[$i + 4])); + $i += 4; + $utf16 = self::_utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($value[$i + 1]), + ord($value[$i + 2]), + ord($value[$i + 3]), + ord($value[$i + 4]), + ord($value[$i + 5])); + $i += 5; + $utf16 = self::_utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return $ascii; + } + + /** + * Convert a string from one UTF-8 char to one UTF-16 char. + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * This method is from the Solar Framework by Paul M. Jones + * + * @link http://solarphp.com + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + */ + protected static function _utf82utf16($utf8) + { + // Check for mb extension otherwise do by hand. + if( function_exists('mb_convert_encoding') ) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch (strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } +} + diff --git a/lib/zend/Zend/Json/Exception.php b/lib/zend/Zend/Json/Exception.php new file mode 100644 index 0000000000..3f4578ce4f --- /dev/null +++ b/lib/zend/Zend/Json/Exception.php @@ -0,0 +1,37 @@ + + * $foo = array( + * 'integer' =>9, + * 'string' =>'test string', + * 'function' => Zend_Json_Expr( + * 'function(){ window.alert("javascript function encoded by Zend_Json") }' + * ), + * ); + * + * Zend_Json::encode($foo, false, array('enableJsonExprFinder' => true)); + * // it will returns json encoded string: + * // {"integer":9,"string":"test string","function":function(){window.alert("javascript function encoded by Zend_Json")}} + * + * + * @category Zend + * @package Zend_Json + * @subpackage Expr + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Json_Expr +{ + /** + * Storage for javascript expression. + * + * @var string + */ + protected $_expression; + + /** + * Constructor + * + * @param string $expression the expression to hold. + * @return void + */ + public function __construct($expression) + { + $this->_expression = (string) $expression; + } + + /** + * Cast to string + * + * @return string holded javascript expression. + */ + public function __toString() + { + return $this->_expression; + } +} diff --git a/lib/zend/Zend/Json/Server.php b/lib/zend/Zend/Json/Server.php new file mode 100644 index 0000000000..67e045a4fb --- /dev/null +++ b/lib/zend/Zend/Json/Server.php @@ -0,0 +1,538 @@ + count($function)))) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Unable to attach function; invalid'); + } + + if (!is_callable($function)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Unable to attach function; does not exist'); + } + + $argv = null; + if (2 < func_num_args()) { + $argv = func_get_args(); + $argv = array_slice($argv, 2); + } + + require_once 'Zend/Server/Reflection.php'; + if (is_string($function)) { + $method = Zend_Server_Reflection::reflectFunction($function, $argv, $namespace); + } else { + $class = array_shift($function); + $action = array_shift($function); + $reflection = Zend_Server_Reflection::reflectClass($class, $argv, $namespace); + $methods = $reflection->getMethods(); + $found = false; + foreach ($methods as $method) { + if ($action == $method->getName()) { + $found = true; + break; + } + } + if (!$found) { + $this->fault('Method not found', -32601); + return $this; + } + } + + $definition = $this->_buildSignature($method); + $this->_addMethodServiceMap($definition); + + return $this; + } + + /** + * Register a class with the server + * + * @param string $class + * @param string $namespace Ignored + * @param mixed $argv Ignored + * @return Zend_Json_Server + */ + public function setClass($class, $namespace = '', $argv = null) + { + $argv = null; + if (3 < func_num_args()) { + $argv = func_get_args(); + $argv = array_slice($argv, 3); + } + + require_once 'Zend/Server/Reflection.php'; + $reflection = Zend_Server_Reflection::reflectClass($class, $argv, $namespace); + + foreach ($reflection->getMethods() as $method) { + $definition = $this->_buildSignature($method, $class); + $this->_addMethodServiceMap($definition); + } + return $this; + } + + /** + * Indicate fault response + * + * @param string $fault + * @param int $code + * @return false + */ + public function fault($fault = null, $code = 404, $data = null) + { + require_once 'Zend/Json/Server/Error.php'; + $error = new Zend_Json_Server_Error($fault, $code, $data); + $this->getResponse()->setError($error); + return $error; + } + + /** + * Handle request + * + * @param Zend_Json_Server_Request $request + * @return null|Zend_Json_Server_Response + */ + public function handle($request = false) + { + if ((false !== $request) && (!$request instanceof Zend_Json_Server_Request)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid request type provided; cannot handle'); + } elseif ($request) { + $this->setRequest($request); + } + + // Handle request + $this->_handle(); + + // Get response + $response = $this->_getReadyResponse(); + + // Emit response? + if ($this->autoEmitResponse()) { + echo $response; + return; + } + + // or return it? + return $response; + } + + /** + * Load function definitions + * + * @param array|Zend_Server_Definition $definition + * @return void + */ + public function loadFunctions($definition) + { + if (!is_array($definition) && (!$definition instanceof Zend_Server_Definition)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid definition provided to loadFunctions()'); + } + + foreach ($definition as $key => $method) { + $this->_table->addMethod($method, $key); + $this->_addMethodServiceMap($method); + } + } + + public function setPersistence($mode) + { + } + + /** + * Set request object + * + * @param Zend_Json_Server_Request $request + * @return Zend_Json_Server + */ + public function setRequest(Zend_Json_Server_Request $request) + { + $this->_request = $request; + return $this; + } + + /** + * Get JSON-RPC request object + * + * @return Zend_Json_Server_Request + */ + public function getRequest() + { + if (null === ($request = $this->_request)) { + require_once 'Zend/Json/Server/Request/Http.php'; + $this->setRequest(new Zend_Json_Server_Request_Http()); + } + return $this->_request; + } + + /** + * Set response object + * + * @param Zend_Json_Server_Response $response + * @return Zend_Json_Server + */ + public function setResponse(Zend_Json_Server_Response $response) + { + $this->_response = $response; + return $this; + } + + /** + * Get response object + * + * @return Zend_Json_Server_Response + */ + public function getResponse() + { + if (null === ($response = $this->_response)) { + require_once 'Zend/Json/Server/Response/Http.php'; + $this->setResponse(new Zend_Json_Server_Response_Http()); + } + return $this->_response; + } + + /** + * Set flag indicating whether or not to auto-emit response + * + * @param bool $flag + * @return Zend_Json_Server + */ + public function setAutoEmitResponse($flag) + { + $this->_autoEmitResponse = (bool) $flag; + return $this; + } + + /** + * Will we auto-emit the response? + * + * @return bool + */ + public function autoEmitResponse() + { + return $this->_autoEmitResponse; + } + + // overloading for SMD metadata + /** + * Overload to accessors of SMD object + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + if (preg_match('/^(set|get)/', $method, $matches)) { + if (in_array($method, $this->_getSmdMethods())) { + if ('set' == $matches[1]) { + $value = array_shift($args); + $this->getServiceMap()->$method($value); + return $this; + } else { + return $this->getServiceMap()->$method(); + } + } + } + return null; + } + + /** + * Retrieve SMD object + * + * @return Zend_Json_Server_Smd + */ + public function getServiceMap() + { + if (null === $this->_serviceMap) { + require_once 'Zend/Json/Server/Smd.php'; + $this->_serviceMap = new Zend_Json_Server_Smd(); + } + return $this->_serviceMap; + } + + /** + * Add service method to service map + * + * @param Zend_Server_Reflection_Function $method + * @return void + */ + protected function _addMethodServiceMap(Zend_Server_Method_Definition $method) + { + $serviceInfo = array( + 'name' => $method->getName(), + 'return' => $this->_getReturnType($method), + ); + $params = $this->_getParams($method); + $serviceInfo['params'] = $params; + $serviceMap = $this->getServiceMap(); + if (false !== $serviceMap->getService($serviceInfo['name'])) { + $serviceMap->removeService($serviceInfo['name']); + } + $serviceMap->addService($serviceInfo); + } + + /** + * Translate PHP type to JSON type + * + * @param string $type + * @return string + */ + protected function _fixType($type) + { + return $type; + } + + /** + * Get default params from signature + * + * @param array $args + * @param array $params + * @return array + */ + protected function _getDefaultParams(array $args, array $params) + { + $defaultParams = array_slice($params, count($args)); + foreach ($defaultParams as $param) { + $value = null; + if (array_key_exists('default', $param)) { + $value = $param['default']; + } + array_push($args, $value); + } + return $args; + } + + /** + * Get method param type + * + * @param Zend_Server_Reflection_Function_Abstract $method + * @return string|array + */ + protected function _getParams(Zend_Server_Method_Definition $method) + { + $params = array(); + foreach ($method->getPrototypes() as $prototype) { + foreach ($prototype->getParameterObjects() as $key => $parameter) { + if (!isset($params[$key])) { + $params[$key] = array( + 'type' => $parameter->getType(), + 'name' => $parameter->getName(), + 'optional' => $parameter->isOptional(), + ); + if (null !== ($default = $parameter->getDefaultValue())) { + $params[$key]['default'] = $default; + } + $description = $parameter->getDescription(); + if (!empty($description)) { + $params[$key]['description'] = $description; + } + continue; + } + $newType = $parameter->getType(); + if (!is_array($params[$key]['type'])) { + if ($params[$key]['type'] == $newType) { + continue; + } + $params[$key]['type'] = (array) $params[$key]['type']; + } elseif (in_array($newType, $params[$key]['type'])) { + continue; + } + array_push($params[$key]['type'], $parameter->getType()); + } + } + return $params; + } + + /** + * Set response state + * + * @return Zend_Json_Server_Response + */ + protected function _getReadyResponse() + { + $request = $this->getRequest(); + $response = $this->getResponse(); + + $response->setServiceMap($this->getServiceMap()); + if (null !== ($id = $request->getId())) { + $response->setId($id); + } + if (null !== ($version = $request->getVersion())) { + $response->setVersion($version); + } + + return $response; + } + + /** + * Get method return type + * + * @param Zend_Server_Reflection_Function_Abstract $method + * @return string|array + */ + protected function _getReturnType(Zend_Server_Method_Definition $method) + { + $return = array(); + foreach ($method->getPrototypes() as $prototype) { + $return[] = $prototype->getReturnType(); + } + if (1 == count($return)) { + return $return[0]; + } + return $return; + } + + /** + * Retrieve list of allowed SMD methods for proxying + * + * @return array + */ + protected function _getSmdMethods() + { + if (null === $this->_smdMethods) { + $this->_smdMethods = array(); + require_once 'Zend/Json/Server/Smd.php'; + $methods = get_class_methods('Zend_Json_Server_Smd'); + foreach ($methods as $key => $method) { + if (!preg_match('/^(set|get)/', $method)) { + continue; + } + if (strstr($method, 'Service')) { + continue; + } + $this->_smdMethods[] = $method; + } + } + return $this->_smdMethods; + } + + /** + * Internal method for handling request + * + * @return void + */ + protected function _handle() + { + $request = $this->getRequest(); + + if (!$request->isMethodError() && (null === $request->getMethod())) { + return $this->fault('Invalid Request', -32600); + } + + if ($request->isMethodError()) { + return $this->fault('Invalid Request', -32600); + } + + $method = $request->getMethod(); + if (!$this->_table->hasMethod($method)) { + return $this->fault('Method not found', -32601); + } + + $params = $request->getParams(); + $invocable = $this->_table->getMethod($method); + $serviceMap = $this->getServiceMap(); + $service = $serviceMap->getService($method); + $serviceParams = $service->getParams(); + + if (count($params) < count($serviceParams)) { + $params = $this->_getDefaultParams($params, $serviceParams); + } + + try { + $result = $this->_dispatch($invocable, $params); + } catch (Exception $e) { + return $this->fault($e->getMessage(), $e->getCode()); + } + + $this->getResponse()->setResult($result); + } +} diff --git a/lib/zend/Zend/Json/Server/Cache.php b/lib/zend/Zend/Json/Server/Cache.php new file mode 100644 index 0000000000..da9945e4cc --- /dev/null +++ b/lib/zend/Zend/Json/Server/Cache.php @@ -0,0 +1,102 @@ +getServiceMap()->toJson())) { + return false; + } + + return true; + } + + /** + * Retrieve a cached SMD + * + * On success, returns the cached SMD (a JSON string); an failure, returns + * boolean false. + * + * @param string $filename + * @return string|false + */ + public static function getSmd($filename) + { + if (!is_string($filename) + || !file_exists($filename) + || !is_readable($filename)) + { + return false; + } + + + if (false === ($smd = @file_get_contents($filename))) { + return false; + } + + return $smd; + } + + /** + * Delete a file containing a cached SMD + * + * @param string $filename + * @return bool + */ + public static function deleteSmd($filename) + { + if (is_string($filename) && file_exists($filename)) { + unlink($filename); + return true; + } + + return false; + } +} diff --git a/lib/zend/Zend/Json/Server/Error.php b/lib/zend/Zend/Json/Server/Error.php new file mode 100644 index 0000000000..9c1b159d7e --- /dev/null +++ b/lib/zend/Zend/Json/Server/Error.php @@ -0,0 +1,198 @@ +setMessage($message) + ->setCode($code) + ->setData($data); + } + + /** + * Set error code + * + * @param int $code + * @return Zend_Json_Server_Error + */ + public function setCode($code) + { + if (!is_scalar($code)) { + return $this; + } + + $code = (int) $code; + if (in_array($code, $this->_allowedCodes)) { + $this->_code = $code; + } elseif (in_array($code, range(-32099, -32000))) { + $this->_code = $code; + } + + return $this; + } + + /** + * Get error code + * + * @return int|null + */ + public function getCode() + { + return $this->_code; + } + + /** + * Set error message + * + * @param string $message + * @return Zend_Json_Server_Error + */ + public function setMessage($message) + { + if (!is_scalar($message)) { + return $this; + } + + $this->_message = (string) $message; + return $this; + } + + /** + * Get error message + * + * @return string + */ + public function getMessage() + { + return $this->_message; + } + + /** + * Set error data + * + * @param mixed $data + * @return Zend_Json_Server_Error + */ + public function setData($data) + { + $this->_data = $data; + return $this; + } + + /** + * Get error data + * + * @return mixed + */ + public function getData() + { + return $this->_data; + } + + /** + * Cast error to array + * + * @return array + */ + public function toArray() + { + return array( + 'code' => $this->getCode(), + 'message' => $this->getMessage(), + 'data' => $this->getData(), + ); + } + + /** + * Cast error to JSON + * + * @return string + */ + public function toJson() + { + require_once 'Zend/Json.php'; + return Zend_Json::encode($this->toArray()); + } + + /** + * Cast to string (JSON) + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } +} + diff --git a/lib/zend/Zend/Json/Server/Exception.php b/lib/zend/Zend/Json/Server/Exception.php new file mode 100644 index 0000000000..92076c7ddc --- /dev/null +++ b/lib/zend/Zend/Json/Server/Exception.php @@ -0,0 +1,36 @@ + $value) { + $method = 'set' . ucfirst($key); + if (in_array($method, $methods)) { + $this->$method($value); + } elseif ($key == 'jsonrpc') { + $this->setVersion($value); + } + } + return $this; + } + + /** + * Add a parameter to the request + * + * @param mixed $value + * @param string $key + * @return Zend_Json_Server_Request + */ + public function addParam($value, $key = null) + { + if ((null === $key) || !is_string($key)) { + $index = count($this->_params); + $this->_params[$index] = $value; + } else { + $this->_params[$key] = $value; + } + + return $this; + } + + /** + * Add many params + * + * @param array $params + * @return Zend_Json_Server_Request + */ + public function addParams(array $params) + { + foreach ($params as $key => $value) { + $this->addParam($value, $key); + } + return $this; + } + + /** + * Overwrite params + * + * @param array $params + * @return Zend_Json_Server_Request + */ + public function setParams(array $params) + { + $this->_params = array(); + return $this->addParams($params); + } + + /** + * Retrieve param by index or key + * + * @param int|string $index + * @return mixed|null Null when not found + */ + public function getParam($index) + { + if (array_key_exists($index, $this->_params)) { + return $this->_params[$index]; + } + + return null; + } + + /** + * Retrieve parameters + * + * @return array + */ + public function getParams() + { + return $this->_params; + } + + /** + * Set request method + * + * @param string $name + * @return Zend_Json_Server_Request + */ + public function setMethod($name) + { + if (!preg_match($this->_methodRegex, $name)) { + $this->_isMethodError = true; + } else { + $this->_method = $name; + } + return $this; + } + + /** + * Get request method name + * + * @return string + */ + public function getMethod() + { + return $this->_method; + } + + /** + * Was a bad method provided? + * + * @return bool + */ + public function isMethodError() + { + return $this->_isMethodError; + } + + /** + * Set request identifier + * + * @param mixed $name + * @return Zend_Json_Server_Request + */ + public function setId($name) + { + $this->_id = (string) $name; + return $this; + } + + /** + * Retrieve request identifier + * + * @return mixed + */ + public function getId() + { + return $this->_id; + } + + /** + * Set JSON-RPC version + * + * @param string $version + * @return Zend_Json_Server_Request + */ + public function setVersion($version) + { + if ('2.0' == $version) { + $this->_version = '2.0'; + } else { + $this->_version = '1.0'; + } + return $this; + } + + /** + * Retrieve JSON-RPC version + * + * @return string + */ + public function getVersion() + { + return $this->_version; + } + + /** + * Set request state based on JSON + * + * @param string $json + * @return void + */ + public function loadJson($json) + { + require_once 'Zend/Json.php'; + $options = Zend_Json::decode($json); + $this->setOptions($options); + } + + /** + * Cast request to JSON + * + * @return string + */ + public function toJson() + { + $jsonArray = array( + 'method' => $this->getMethod() + ); + if (null !== ($id = $this->getId())) { + $jsonArray['id'] = $id; + } + $params = $this->getParams(); + if (!empty($params)) { + $jsonArray['params'] = $params; + } + if ('2.0' == $this->getVersion()) { + $jsonArray['jsonrpc'] = '2.0'; + } + + require_once 'Zend/Json.php'; + return Zend_Json::encode($jsonArray); + } + + /** + * Cast request to string (JSON) + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } +} diff --git a/lib/zend/Zend/Json/Server/Request/Http.php b/lib/zend/Zend/Json/Server/Request/Http.php new file mode 100644 index 0000000000..53523f59de --- /dev/null +++ b/lib/zend/Zend/Json/Server/Request/Http.php @@ -0,0 +1,66 @@ +_rawJson = $json; + if (!empty($json)) { + $this->loadJson($json); + } + } + + /** + * Get JSON from raw POST body + * + * @return string + */ + public function getRawJson() + { + return $this->_rawJson; + } +} diff --git a/lib/zend/Zend/Json/Server/Response.php b/lib/zend/Zend/Json/Server/Response.php new file mode 100644 index 0000000000..8f07686656 --- /dev/null +++ b/lib/zend/Zend/Json/Server/Response.php @@ -0,0 +1,248 @@ +_result = $value; + return $this; + } + + /** + * Get result + * + * @return mixed + */ + public function getResult() + { + return $this->_result; + } + + // RPC error, if response results in fault + /** + * Set result error + * + * @param Zend_Json_Server_Error $error + * @return Zend_Json_Server_Response + */ + public function setError(Zend_Json_Server_Error $error) + { + $this->_error = $error; + return $this; + } + + /** + * Get response error + * + * @return null|Zend_Json_Server_Error + */ + public function getError() + { + return $this->_error; + } + + /** + * Is the response an error? + * + * @return bool + */ + public function isError() + { + return $this->getError() instanceof Zend_Json_Server_Error; + } + + /** + * Set request ID + * + * @param mixed $name + * @return Zend_Json_Server_Response + */ + public function setId($name) + { + $this->_id = $name; + return $this; + } + + /** + * Get request ID + * + * @return mixed + */ + public function getId() + { + return $this->_id; + } + + /** + * Set JSON-RPC version + * + * @param string $version + * @return Zend_Json_Server_Response + */ + public function setVersion($version) + { + $version = (string) $version; + if ('2.0' == $version) { + $this->_version = '2.0'; + } else { + $this->_version = null; + } + + return $this; + } + + /** + * Retrieve JSON-RPC version + * + * @return string + */ + public function getVersion() + { + return $this->_version; + } + + /** + * Cast to JSON + * + * @return string + */ + public function toJson() + { + if ($this->isError()) { + $response = array( + 'error' => $this->getError()->toArray(), + 'id' => $this->getId(), + ); + } else { + $response = array( + 'result' => $this->getResult(), + 'id' => $this->getId(), + ); + } + + if (null !== ($version = $this->getVersion())) { + $response['jsonrpc'] = $version; + } + + require_once 'Zend/Json.php'; + return Zend_Json::encode($response); + } + + /** + * Retrieve args + * + * @return mixed + */ + public function getArgs() + { + return $this->_args; + } + + /** + * Set args + * + * @param mixed $args + * @return self + */ + public function setArgs($args) + { + $this->_args = $args; + return $this; + } + + /** + * Set service map object + * + * @param Zend_Json_Server_Smd $serviceMap + * @return Zend_Json_Server_Response + */ + public function setServiceMap($serviceMap) + { + $this->_serviceMap = $serviceMap; + return $this; + } + + /** + * Retrieve service map + * + * @return Zend_Json_Server_Smd|null + */ + public function getServiceMap() + { + return $this->_serviceMap; + } + + /** + * Cast to string (JSON) + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } +} + diff --git a/lib/zend/Zend/Json/Server/Response/Http.php b/lib/zend/Zend/Json/Server/Response/Http.php new file mode 100644 index 0000000000..54dc3b6df3 --- /dev/null +++ b/lib/zend/Zend/Json/Server/Response/Http.php @@ -0,0 +1,81 @@ +sendHeaders(); + if (!$this->isError() && null === $this->getId()) { + return ''; + } + + return parent::toJson(); + } + + /** + * Send headers + * + * If headers are already sent, do nothing. If null ID, send HTTP 204 + * header. Otherwise, send content type header based on content type of + * service map. + * + * @return void + */ + public function sendHeaders() + { + if (headers_sent()) { + return; + } + + if (!$this->isError() && (null === $this->getId())) { + header('HTTP/1.1 204 No Content'); + return; + } + + if (null === ($smd = $this->getServiceMap())) { + return; + } + + $contentType = $smd->getContentType(); + if (!empty($contentType)) { + header('Content-Type: ' . $contentType); + } + } +} diff --git a/lib/zend/Zend/Json/Server/Smd.php b/lib/zend/Zend/Json/Server/Smd.php new file mode 100644 index 0000000000..7eefc9112b --- /dev/null +++ b/lib/zend/Zend/Json/Server/Smd.php @@ -0,0 +1,480 @@ + $value) { + $method = 'set' . ucfirst($key); + if (in_array($method, $methods)) { + $this->$method($value); + } + } + return $this; + } + + /** + * Set transport + * + * @param string $transport + * @return Zend_Json_Server_Smd + */ + public function setTransport($transport) + { + if (!in_array($transport, $this->_transportTypes)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid transport "%s" specified', $transport)); + } + $this->_transport = $transport; + return $this; + } + + /** + * Get transport + * + * @return string + */ + public function getTransport() + { + return $this->_transport; + } + + /** + * Set envelope + * + * @param string $envelopeType + * @return Zend_Json_Server_Smd + */ + public function setEnvelope($envelopeType) + { + if (!in_array($envelopeType, $this->_envelopeTypes)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid envelope type "%s"', $envelopeType)); + } + $this->_envelope = $envelopeType; + return $this; + } + + /** + * Retrieve envelope + * + * @return string + */ + public function getEnvelope() + { + return $this->_envelope; + } + + // Content-Type of response; default to application/json + /** + * Set content type + * + * @param string $type + * @return Zend_Json_Server_Smd + */ + public function setContentType($type) + { + if (!preg_match($this->_contentTypeRegex, $type)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid content type "%s" specified', $type)); + } + $this->_contentType = $type; + return $this; + } + + /** + * Retrieve content type + * + * @return string + */ + public function getContentType() + { + return $this->_contentType; + } + + /** + * Set service target + * + * @param string $target + * @return Zend_Json_Server_Smd + */ + public function setTarget($target) + { + $this->_target = (string) $target; + return $this; + } + + /** + * Retrieve service target + * + * @return string + */ + public function getTarget() + { + return $this->_target; + } + + /** + * Set service ID + * + * @param string $Id + * @return Zend_Json_Server_Smd + */ + public function setId($id) + { + $this->_id = (string) $id; + return $this->_id; + } + + /** + * Get service id + * + * @return string + */ + public function getId() + { + return $this->_id; + } + + /** + * Set service description + * + * @param string $description + * @return Zend_Json_Server_Smd + */ + public function setDescription($description) + { + $this->_description = (string) $description; + return $this->_description; + } + + /** + * Get service description + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Indicate whether or not to generate Dojo-compatible SMD + * + * @param bool $flag + * @return Zend_Json_Server_Smd + */ + public function setDojoCompatible($flag) + { + $this->_dojoCompatible = (bool) $flag; + return $this; + } + + /** + * Is this a Dojo compatible SMD? + * + * @return bool + */ + public function isDojoCompatible() + { + return $this->_dojoCompatible; + } + + /** + * Add Service + * + * @param Zend_Json_Server_Smd_Service|array $service + * @return void + */ + public function addService($service) + { + require_once 'Zend/Json/Server/Smd/Service.php'; + + if ($service instanceof Zend_Json_Server_Smd_Service) { + $name = $service->getName(); + } elseif (is_array($service)) { + $service = new Zend_Json_Server_Smd_Service($service); + $name = $service->getName(); + } else { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid service passed to addService()'); + } + + if (array_key_exists($name, $this->_services)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Attempt to register a service already registered detected'); + } + $this->_services[$name] = $service; + return $this; + } + + /** + * Add many services + * + * @param array $services + * @return Zend_Json_Server_Smd + */ + public function addServices(array $services) + { + foreach ($services as $service) { + $this->addService($service); + } + return $this; + } + + /** + * Overwrite existing services with new ones + * + * @param array $services + * @return Zend_Json_Server_Smd + */ + public function setServices(array $services) + { + $this->_services = array(); + return $this->addServices($services); + } + + /** + * Get service object + * + * @param string $name + * @return false|Zend_Json_Server_Smd_Service + */ + public function getService($name) + { + if (array_key_exists($name, $this->_services)) { + return $this->_services[$name]; + } + return false; + } + + /** + * Return services + * + * @return array + */ + public function getServices() + { + return $this->_services; + } + + /** + * Remove service + * + * @param string $name + * @return boolean + */ + public function removeService($name) + { + if (array_key_exists($name, $this->_services)) { + unset($this->_services[$name]); + return true; + } + return false; + } + + /** + * Cast to array + * + * @return array + */ + public function toArray() + { + if ($this->isDojoCompatible()) { + return $this->toDojoArray(); + } + + $transport = $this->getTransport(); + $envelope = $this->getEnvelope(); + $contentType = $this->getContentType(); + $SMDVersion = self::SMD_VERSION; + $service = compact('transport', 'envelope', 'contentType', 'SMDVersion'); + + if (null !== ($target = $this->getTarget())) { + $service['target'] = $target; + } + if (null !== ($id = $this->getId())) { + $service['id'] = $id; + } + + $services = $this->getServices(); + if (!empty($services)) { + $service['services'] = array(); + foreach ($services as $name => $svc) { + $svc->setEnvelope($envelope); + $service['services'][$name] = $svc->toArray(); + } + $service['methods'] = $service['services']; + } + + return $service; + } + + /** + * Export to DOJO-compatible SMD array + * + * @return array + */ + public function toDojoArray() + { + $SMDVersion = '.1'; + $serviceType = 'JSON-RPC'; + $service = compact('SMDVersion', 'serviceType'); + + $target = $this->getTarget(); + + $services = $this->getServices(); + if (!empty($services)) { + $service['methods'] = array(); + foreach ($services as $name => $svc) { + $method = array( + 'name' => $name, + 'serviceURL' => $target, + ); + $params = array(); + foreach ($svc->getParams() as $param) { + $paramName = array_key_exists('name', $param) ? $param['name'] : $param['type']; + $params[] = array( + 'name' => $paramName, + 'type' => $param['type'], + ); + } + if (!empty($params)) { + $method['parameters'] = $params; + } + $service['methods'][] = $method; + } + } + + return $service; + } + + /** + * Cast to JSON + * + * @return string + */ + public function toJson() + { + require_once 'Zend/Json.php'; + return Zend_Json::encode($this->toArray()); + } + + /** + * Cast to string (JSON) + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } +} + diff --git a/lib/zend/Zend/Json/Server/Smd/Service.php b/lib/zend/Zend/Json/Server/Smd/Service.php new file mode 100644 index 0000000000..6133d4f2af --- /dev/null +++ b/lib/zend/Zend/Json/Server/Smd/Service.php @@ -0,0 +1,473 @@ + 'is_string', + 'optional' => 'is_bool', + 'default' => null, + 'description' => 'is_string', + ); + + /** + * Service params + * @var array + */ + protected $_params = array(); + + /** + * Mapping of parameter types to JSON-RPC types + * @var array + */ + protected $_paramMap = array( + 'any' => 'any', + 'arr' => 'array', + 'array' => 'array', + 'assoc' => 'object', + 'bool' => 'boolean', + 'boolean' => 'boolean', + 'dbl' => 'float', + 'double' => 'float', + 'false' => 'boolean', + 'float' => 'float', + 'hash' => 'object', + 'integer' => 'integer', + 'int' => 'integer', + 'mixed' => 'any', + 'nil' => 'null', + 'null' => 'null', + 'object' => 'object', + 'string' => 'string', + 'str' => 'string', + 'struct' => 'object', + 'true' => 'boolean', + 'void' => 'null', + ); + + /** + * Allowed transport types + * @var array + */ + protected $_transportTypes = array( + 'POST', + ); + + /** + * Constructor + * + * @param string|array $spec + * @return void + * @throws Zend_Json_Server_Exception if no name provided + */ + public function __construct($spec) + { + if (is_string($spec)) { + $this->setName($spec); + } elseif (is_array($spec)) { + $this->setOptions($spec); + } + + if (null == $this->getName()) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('SMD service description requires a name; none provided'); + } + } + + /** + * Set object state + * + * @param array $options + * @return Zend_Json_Server_Smd_Service + */ + public function setOptions(array $options) + { + $methods = get_class_methods($this); + foreach ($options as $key => $value) { + if ('options' == strtolower($key)) { + continue; + } + $method = 'set' . ucfirst($key); + if (in_array($method, $methods)) { + $this->$method($value); + } + } + return $this; + } + + /** + * Set service name + * + * @param string $name + * @return Zend_Json_Server_Smd_Service + * @throws Zend_Json_Server_Exception + */ + public function setName($name) + { + $name = (string) $name; + if (!preg_match($this->_nameRegex, $name)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid name "%s" provided for service; must follow PHP method naming conventions', $name)); + } + $this->_name = $name; + return $this; + } + + /** + * Retrieve name + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Set Transport + * + * Currently limited to POST + * + * @param string $transport + * @return Zend_Json_Server_Smd_Service + */ + public function setTransport($transport) + { + if (!in_array($transport, $this->_transportTypes)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid transport "%s"; please select one of (%s)', $transport, implode(', ', $this->_transportTypes))); + } + + $this->_transport = $transport; + return $this; + } + + /** + * Get transport + * + * @return string + */ + public function getTransport() + { + return $this->_transport; + } + + /** + * Set service target + * + * @param string $target + * @return Zend_Json_Server_Smd_Service + */ + public function setTarget($target) + { + $this->_target = (string) $target; + return $this; + } + + /** + * Get service target + * + * @return string + */ + public function getTarget() + { + return $this->_target; + } + + /** + * Set envelope type + * + * @param string $envelopeType + * @return Zend_Json_Server_Smd_Service + */ + public function setEnvelope($envelopeType) + { + if (!in_array($envelopeType, $this->_envelopeTypes)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception(sprintf('Invalid envelope type "%s"; please specify one of (%s)', $envelopeType, implode(', ', $this->_envelopeTypes))); + } + + $this->_envelope = $envelopeType; + return $this; + } + + /** + * Get envelope type + * + * @return string + */ + public function getEnvelope() + { + return $this->_envelope; + } + + /** + * Add a parameter to the service + * + * @param string|array $type + * @param array $options + * @param int|null $order + * @return Zend_Json_Server_Smd_Service + */ + public function addParam($type, array $options = array(), $order = null) + { + if (is_string($type)) { + $type = $this->_validateParamType($type); + } elseif (is_array($type)) { + foreach ($type as $key => $paramType) { + $type[$key] = $this->_validateParamType($paramType); + } + } else { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid param type provided'); + } + + $paramOptions = array( + 'type' => $type, + ); + foreach ($options as $key => $value) { + if (in_array($key, array_keys($this->_paramOptionTypes))) { + if (null !== ($callback = $this->_paramOptionTypes[$key])) { + if (!$callback($value)) { + continue; + } + } + $paramOptions[$key] = $value; + } + } + + $this->_params[] = array( + 'param' => $paramOptions, + 'order' => $order, + ); + + return $this; + } + + /** + * Add params + * + * Each param should be an array, and should include the key 'type'. + * + * @param array $params + * @return Zend_Json_Server_Smd_Service + */ + public function addParams(array $params) + { + ksort($params); + foreach ($params as $options) { + if (!is_array($options)) { + continue; + } + if (!array_key_exists('type', $options)) { + continue; + } + $type = $options['type']; + $order = (array_key_exists('order', $options)) ? $options['order'] : null; + $this->addParam($type, $options, $order); + } + return $this; + } + + /** + * Overwrite all parameters + * + * @param array $params + * @return Zend_Json_Server_Smd_Service + */ + public function setParams(array $params) + { + $this->_params = array(); + return $this->addParams($params); + } + + /** + * Get all parameters + * + * Returns all params in specified order. + * + * @return array + */ + public function getParams() + { + $params = array(); + $index = 0; + foreach ($this->_params as $param) { + if (null === $param['order']) { + if (array_search($index, array_keys($params), true)) { + ++$index; + } + $params[$index] = $param['param']; + ++$index; + } else { + $params[$param['order']] = $param['param']; + } + } + ksort($params); + return $params; + } + + /** + * Set return type + * + * @param string|array $type + * @return Zend_Json_Server_Smd_Service + */ + public function setReturn($type) + { + if (is_string($type)) { + $type = $this->_validateParamType($type, true); + } elseif (is_array($type)) { + foreach ($type as $key => $returnType) { + $type[$key] = $this->_validateParamType($returnType, true); + } + } else { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid param type provided ("' . gettype($type) .'")'); + } + $this->_return = $type; + return $this; + } + + /** + * Get return type + * + * @return string|array + */ + public function getReturn() + { + return $this->_return; + } + + /** + * Cast service description to array + * + * @return array + */ + public function toArray() + { + $name = $this->getName(); + $envelope = $this->getEnvelope(); + $target = $this->getTarget(); + $transport = $this->getTransport(); + $parameters = $this->getParams(); + $returns = $this->getReturn(); + + if (empty($target)) { + return compact('envelope', 'transport', 'parameters', 'returns'); + } + + return $paramInfo = compact('envelope', 'target', 'transport', 'parameters', 'returns'); + } + + /** + * Return JSON encoding of service + * + * @return string + */ + public function toJson() + { + $service = array($this->getName() => $this->toArray()); + + require_once 'Zend/Json.php'; + return Zend_Json::encode($service); + } + + /** + * Cast to string + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } + + /** + * Validate parameter type + * + * @param string $type + * @return true + * @throws Zend_Json_Server_Exception + */ + protected function _validateParamType($type, $isReturn = false) + { + if (!is_string($type)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid param type provided ("' . $type .'")'); + } + + if (!array_key_exists($type, $this->_paramMap)) { + $type = 'object'; + } + + $paramType = $this->_paramMap[$type]; + if (!$isReturn && ('null' == $paramType)) { + require_once 'Zend/Json/Server/Exception.php'; + throw new Zend_Json_Server_Exception('Invalid param type provided ("' . $type . '")'); + } + + return $paramType; + } +} diff --git a/lib/zend/Zend/Layout/Controller/Action/Helper/Layout.php b/lib/zend/Zend/Layout/Controller/Action/Helper/Layout.php new file mode 100644 index 0000000000..14341e79e2 --- /dev/null +++ b/lib/zend/Zend/Layout/Controller/Action/Helper/Layout.php @@ -0,0 +1,186 @@ +setLayoutInstance($layout); + } else { + /** + * @see Zend_Layout + */ + require_once 'Zend/Layout.php'; + $layout = Zend_Layout::getMvcInstance(); + } + + if (null !== $layout) { + $pluginClass = $layout->getPluginClass(); + $front = $this->getFrontController(); + if ($front->hasPlugin($pluginClass)) { + $plugin = $front->getPlugin($pluginClass); + $plugin->setLayoutActionHelper($this); + } + } + } + + public function init() + { + $this->_isActionControllerSuccessful = false; + } + + /** + * Get front controller instance + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + if (null === $this->_frontController) { + /** + * @see Zend_Controller_Front + */ + require_once 'Zend/Controller/Front.php'; + $this->_frontController = Zend_Controller_Front::getInstance(); + } + + return $this->_frontController; + } + + /** + * Get layout object + * + * @return Zend_Layout + */ + public function getLayoutInstance() + { + if (null === $this->_layout) { + /** + * @see Zend_Layout + */ + require_once 'Zend/Layout.php'; + if (null === ($this->_layout = Zend_Layout::getMvcInstance())) { + $this->_layout = new Zend_Layout(); + } + } + + return $this->_layout; + } + + /** + * Set layout object + * + * @param Zend_Layout $layout + * @return Zend_Layout_Controller_Action_Helper_Layout + */ + public function setLayoutInstance(Zend_Layout $layout) + { + $this->_layout = $layout; + return $this; + } + + /** + * Mark Action Controller (according to this plugin) as Running successfully + * + * @return Zend_Layout_Controller_Action_Helper_Layout + */ + public function postDispatch() + { + $this->_isActionControllerSuccessful = true; + return $this; + } + + /** + * Did the previous action successfully complete? + * + * @return bool + */ + public function isActionControllerSuccessful() + { + return $this->_isActionControllerSuccessful; + } + + /** + * Strategy pattern; call object as method + * + * Returns layout object + * + * @return Zend_Layout + */ + public function direct() + { + return $this->getLayoutInstance(); + } + + /** + * Proxy method calls to layout object + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $layout = $this->getLayoutInstance(); + if (method_exists($layout, $method)) { + return call_user_func_array(array($layout, $method), $args); + } + + require_once 'Zend/Layout/Exception.php'; + throw new Zend_Layout_Exception(sprintf("Invalid method '%s' called on layout action helper", $method)); + } +} diff --git a/lib/zend/Zend/Layout/Controller/Plugin/Layout.php b/lib/zend/Zend/Layout/Controller/Plugin/Layout.php new file mode 100644 index 0000000000..33251bf7b5 --- /dev/null +++ b/lib/zend/Zend/Layout/Controller/Plugin/Layout.php @@ -0,0 +1,155 @@ +setLayout($layout); + } + } + + /** + * Retrieve layout object + * + * @return Zend_Layout + */ + public function getLayout() + { + return $this->_layout; + } + + /** + * Set layout object + * + * @param Zend_Layout $layout + * @return Zend_Layout_Controller_Plugin_Layout + */ + public function setLayout(Zend_Layout $layout) + { + $this->_layout = $layout; + return $this; + } + + /** + * Set layout action helper + * + * @param Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper + * @return Zend_Layout_Controller_Plugin_Layout + */ + public function setLayoutActionHelper(Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper) + { + $this->_layoutActionHelper = $layoutActionHelper; + return $this; + } + + /** + * Retrieve layout action helper + * + * @return Zend_Layout_Controller_Action_Helper_Layout + */ + public function getLayoutActionHelper() + { + return $this->_layoutActionHelper; + } + + /** + * postDispatch() plugin hook -- render layout + * + * @param Zend_Controller_Request_Abstract $request + * @return void + */ + public function postDispatch(Zend_Controller_Request_Abstract $request) + { + $layout = $this->getLayout(); + $helper = $this->getLayoutActionHelper(); + + // Return early if forward detected + if (!$request->isDispatched() + || ($layout->getMvcSuccessfulActionOnly() + && (!empty($helper) && !$helper->isActionControllerSuccessful()))) + { + return; + } + + // Return early if layout has been disabled + if (!$layout->isEnabled()) { + return; + } + + $response = $this->getResponse(); + $content = $response->getBody(true); + $contentKey = $layout->getContentKey(); + + if (isset($content['default'])) { + $content[$contentKey] = $content['default']; + } + if ('default' != $contentKey) { + unset($content['default']); + } + + $layout->assign($content); + + $fullContent = null; + $obStartLevel = ob_get_level(); + try { + $fullContent = $layout->render(); + $response->setBody($fullContent); + } catch (Exception $e) { + while (ob_get_level() > $obStartLevel) { + $fullContent .= ob_get_clean(); + } + $request->setParam('layoutFullContent', $fullContent); + $request->setParam('layoutContent', $layout->content); + $response->setBody(null); + throw $e; + } + + } +} diff --git a/lib/zend/Zend/Layout/Exception.php b/lib/zend/Zend/Layout/Exception.php new file mode 100644 index 0000000000..6e61d85bf3 --- /dev/null +++ b/lib/zend/Zend/Layout/Exception.php @@ -0,0 +1,35 @@ += 0 && $index_iterator = $iterator; + } + + public function __destruct() + { + $this->close(); + } + + /** + * Closes the current result set + * + * @return boolean + */ + public function close() + { + return $this->_iterator->close(); + } + + /** + * Get all entries as an array + * + * @return array + */ + public function toArray() + { + $data = array(); + foreach ($this as $item) { + $data[] = $item; + } + return $data; + } + + /** + * Get first entry + * + * @return array + */ + public function getFirst() + { + if ($this->count()>0) { + $this->rewind(); + return $this->current(); + } + else return null; + } + + /** + * Returns the number of items in current result + * Implements Countable + * + * @return int + */ + public function count() + { + return $this->_iterator->count(); + } + + /** + * Return the current result item + * Implements Iterator + * + * @return array + * @throws Zend_Ldap_Exception + */ + public function current() + { + if (!array_key_exists($this->_currentNumber, $this->_cache)) + { + $this->_cache[$this->_currentNumber] = + $this->_createEntry($this->_iterator->current()); + } + return $this->_cache[$this->_currentNumber]; + } + + /** + * Creates the data structure for the given entry data + * + * @param array $data + * @return array + */ + protected function _createEntry(array $data) + { + return $data; + } + + /** + * Return the result item key + * Implements Iterator + * + * @return int + */ + public function key() + { + return $this->_currentNumber; + } + + /** + * Move forward to next result item + * Implements Iterator + * + * @throws Zend_Ldap_Exception + */ + public function next() + { + $this->_iterator->next(); + $this->_currentNumber++; + } + + /** + * Rewind the Iterator to the first result item + * Implements Iterator + * + * @throws Zend_Ldap_Exception + */ + public function rewind() + { + $this->_iterator->rewind(); + $this->_currentNumber = 0; + } + + /** + * Check if there is a current result item + * after calls to rewind() or next() + * Implements Iterator + * + * @return boolean + */ + public function valid() + { + if (isset($this->_cache[$this->_currentNumber])) { + return true; + } else { + return $this->_iterator->valid(); + } + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Collection/Iterator/Default.php b/lib/zend/Zend/Ldap/Collection/Iterator/Default.php new file mode 100644 index 0000000000..7d0ad476f4 --- /dev/null +++ b/lib/zend/Zend/Ldap/Collection/Iterator/Default.php @@ -0,0 +1,253 @@ +_ldap = $ldap; + $this->_resultId = $resultId; + $this->_itemCount = @ldap_count_entries($ldap->getResource(), $resultId); + if ($this->_itemCount === false) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception($this->_ldap, 'counting entries'); + } + } + + public function __destruct() + { + $this->close(); + } + + /** + * Closes the current result set + * + * @return bool + */ + public function close() + { + $isClosed = false; + if (is_resource($this->_resultId)) { + $isClosed = @ldap_free_result($this->_resultId); + $this->_resultId = null; + $this->_currentDn = null; + $this->_current = null; + } + return $isClosed; + } + + /** + * Gets the current LDAP connection. + * + * @return Zend_Ldap + */ + public function getLdap() + { + return $this->_ldap; + } + + /** + * Returns the number of items in current result + * Implements Countable + * + * @return int + */ + public function count() + { + return $this->_itemCount; + } + + /** + * Return the current result item + * Implements Iterator + * + * @return array + * @throws Zend_Ldap_Exception + */ + public function current() + { + if (!is_resource($this->_current) || !is_string($this->_currentDn)) return null; + + $entry = array('dn' => $this->_currentDn); + $ber_identifier = null; + $name = @ldap_first_attribute($this->_ldap->getResource(), $this->_current, + $ber_identifier); + while ($name) + { + $data = @ldap_get_values_len($this->_ldap->getResource(), $this->_current, $name); + unset($data['count']); + $entry[strtolower($name)] = $data; + $name = @ldap_next_attribute($this->_ldap->getResource(), $this->_current, + $ber_identifier); + } + ksort($entry, SORT_LOCALE_STRING); + return $entry; + } + + /** + * Return the result item key + * Implements Iterator + * + * @return int + */ + public function key() + { + return $this->_currentDn; + } + + /** + * Move forward to next result item + * Implements Iterator + * + * @throws Zend_Ldap_Exception + */ + public function next() + { + if (!is_resource($this->_current)) return; + $this->_current = @ldap_next_entry($this->_ldap->getResource(), $this->_current); + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + if ($this->_current === false) { + $msg = $this->_ldap->getLastError($code); + if ($code === Zend_Ldap_Exception::LDAP_SIZELIMIT_EXCEEDED) { + // we have reached the size limit enforced by the server + return; + } else if ($code > Zend_Ldap_Exception::LDAP_SUCCESS) { + throw new Zend_Ldap_Exception($this->_ldap, 'getting next entry (' . $msg . ')'); + } + } + $this->_storeCurrentDn(); + } + + /** + * Rewind the Iterator to the first result item + * Implements Iterator + * + * @throws Zend_Ldap_Exception + */ + public function rewind() + { + if (!is_resource($this->_resultId)) return; + $this->_current = @ldap_first_entry($this->_ldap->getResource(), $this->_resultId); + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + if ($this->_current === false && + $this->_ldap->getLastErrorCode() > Zend_Ldap_Exception::LDAP_SUCCESS) { + throw new Zend_Ldap_Exception($this->_ldap, 'getting first entry'); + } + + $this->_storeCurrentDn(); + } + + /** + * Stores the current DN + * + * @return void + * @throws Zend_Ldap_Exception + */ + protected function _storeCurrentDn() + { + if (is_resource($this->_current)) { + $this->_currentDn = @ldap_get_dn($this->_ldap->getResource(), $this->_current); + if ($this->_currentDn === false) { + throw new Zend_Ldap_Exception($this->_ldap, 'getting dn'); + } + } else { + $this->_currentDn = null; + } + } + + /** + * Check if there is a current result item + * after calls to rewind() or next() + * Implements Iterator + * + * @return boolean + */ + public function valid() + { + return (is_resource($this->_current) && is_string($this->_currentDn)); + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Collection/Iterator/Interface.php b/lib/zend/Zend/Ldap/Collection/Iterator/Interface.php new file mode 100644 index 0000000000..56f4f28062 --- /dev/null +++ b/lib/zend/Zend/Ldap/Collection/Iterator/Interface.php @@ -0,0 +1,46 @@ + + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger + * + * @param string $string String to convert + * @return string + */ + public static function ascToHex32($string) + { + for ($i = 0; $i, + * heavily based on work from DavidSmith@byu.net + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger , heavily based on work from DavidSmith@byu.net + * + * @param string $string String to convert + * @return string + */ + public static function hex32ToAsc($string) + { + $string = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $string); + return $string; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Dn.php b/lib/zend/Zend/Ldap/Dn.php new file mode 100644 index 0000000000..eefd3e5ea6 --- /dev/null +++ b/lib/zend/Zend/Ldap/Dn.php @@ -0,0 +1,794 @@ +_dn = $dn; + $this->setCaseFold($caseFold); + } + + /** + * Gets the RDN of the current DN + * + * @param string $caseFold + * @return array + * @throws Zend_Ldap_Exception if DN has no RDN (empty array) + */ + public function getRdn($caseFold = null) + { + $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); + return self::_caseFoldRdn($this->get(0, 1, $caseFold), null); + } + + /** + * Gets the RDN of the current DN as a string + * + * @param string $caseFold + * @return string + * @throws Zend_Ldap_Exception if DN has no RDN (empty array) + */ + public function getRdnString($caseFold = null) + { + $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); + return self::implodeRdn($this->getRdn(), $caseFold); + } + + /** + * Get the parent DN $levelUp levels up the tree + * + * @param int $levelUp + * @return Zend_Ldap_Dn + */ + public function getParentDn($levelUp = 1) + { + $levelUp = (int)$levelUp; + if ($levelUp < 1 || $levelUp >= count($this->_dn)) { + /** + * Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Cannot retrieve parent DN with given $levelUp'); + } + $newDn = array_slice($this->_dn, $levelUp); + return new self($newDn, $this->_caseFold); + } + + /** + * Get a DN part + * + * @param int $index + * @param int $length + * @param string $caseFold + * @return array + * @throws Zend_Ldap_Exception if index is illegal + */ + public function get($index, $length = 1, $caseFold = null) + { + $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); + $this->_assertIndex($index); + $length = (int)$length; + if ($length <= 0) { + $length = 1; + } + if ($length === 1) { + return self::_caseFoldRdn($this->_dn[$index], $caseFold); + } + else { + return self::_caseFoldDn(array_slice($this->_dn, $index, $length, false), $caseFold); + } + } + + /** + * Set a DN part + * + * @param int $index + * @param array $value + * @return Zend_Ldap_Dn Provides a fluent interface + * @throws Zend_Ldap_Exception if index is illegal + */ + public function set($index, array $value) + { + $this->_assertIndex($index); + self::_assertRdn($value); + $this->_dn[$index] = $value; + return $this; + } + + /** + * Remove a DN part + * + * @param int $index + * @param int $length + * @return Zend_Ldap_Dn Provides a fluent interface + * @throws Zend_Ldap_Exception if index is illegal + */ + public function remove($index, $length = 1) + { + $this->_assertIndex($index); + $length = (int)$length; + if ($length <= 0) { + $length = 1; + } + array_splice($this->_dn, $index, $length, null); + return $this; + } + + /** + * Append a DN part + * + * @param array $value + * @return Zend_Ldap_Dn Provides a fluent interface + */ + public function append(array $value) + { + self::_assertRdn($value); + $this->_dn[] = $value; + return $this; + } + + /** + * Prepend a DN part + * + * @param array $value + * @return Zend_Ldap_Dn Provides a fluent interface + */ + public function prepend(array $value) + { + self::_assertRdn($value); + array_unshift($this->_dn, $value); + return $this; + } + + /** + * Insert a DN part + * + * @param int $index + * @param array $value + * @return Zend_Ldap_Dn Provides a fluent interface + * @throws Zend_Ldap_Exception if index is illegal + */ + public function insert($index, array $value) + { + $this->_assertIndex($index); + self::_assertRdn($value); + $first = array_slice($this->_dn, 0, $index + 1); + $second = array_slice($this->_dn, $index + 1); + $this->_dn = array_merge($first, array($value), $second); + return $this; + } + + /** + * Assert index is correct and usable + * + * @param mixed $index + * @return boolean + * @throws Zend_Ldap_Exception + */ + protected function _assertIndex($index) + { + if (!is_int($index)) { + /** + * Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Parameter $index must be an integer'); + } + if ($index < 0 || $index >= count($this->_dn)) { + /** + * Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Parameter $index out of bounds'); + } + return true; + } + + /** + * Assert if value is in a correct RDN format + * + * @param array $value + * @return boolean + * @throws Zend_Ldap_Exception + */ + protected static function _assertRdn(array $value) + { + if (count($value)<1) { + /** + * Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'RDN Array is malformed: it must have at least one item'); + } + + foreach (array_keys($value) as $key) { + if (!is_string($key)) { + /** + * Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'RDN Array is malformed: it must use string keys'); + } + } + } + + /** + * Sets the case fold + * + * @param string|null $caseFold + */ + public function setCaseFold($caseFold) + { + $this->_caseFold = self::_sanitizeCaseFold($caseFold, self::$_defaultCaseFold); + } + + /** + * Return DN as a string + * + * @param string $caseFold + * @return string + * @throws Zend_Ldap_Exception + */ + public function toString($caseFold = null) + { + $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); + return self::implodeDn($this->_dn, $caseFold); + } + + /** + * Return DN as an array + * + * @param string $caseFold + * @return array + */ + public function toArray($caseFold = null) + { + $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); + + if ($caseFold === self::ATTR_CASEFOLD_NONE) { + return $this->_dn; + } else { + return self::_caseFoldDn($this->_dn, $caseFold); + } + } + + /** + * Do a case folding on a RDN + * + * @param array $part + * @param string $caseFold + * @return array + */ + protected static function _caseFoldRdn(array $part, $caseFold) + { + switch ($caseFold) { + case self::ATTR_CASEFOLD_UPPER: + return array_change_key_case($part, CASE_UPPER); + case self::ATTR_CASEFOLD_LOWER: + return array_change_key_case($part, CASE_LOWER); + case self::ATTR_CASEFOLD_NONE: + default: + return $part; + } + } + + /** + * Do a case folding on a DN ort part of it + * + * @param array $dn + * @param string $caseFold + * @return array + */ + protected static function _caseFoldDn(array $dn, $caseFold) + { + $return = array(); + foreach ($dn as $part) { + $return[] = self::_caseFoldRdn($part, $caseFold); + } + return $return; + } + + /** + * Cast to string representation {@see toString()} + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Required by the ArrayAccess implementation + * + * @param int $offset + * @return boolean + */ + public function offsetExists($offset) + { + $offset = (int)$offset; + if ($offset < 0 || $offset >= count($this->_dn)) { + return false; + } else { + return true; + } + } + + /** + * Proxy to {@see get()} + * Required by the ArrayAccess implementation + * + * @param int $offset + * @return array + */ + public function offsetGet($offset) + { + return $this->get($offset, 1, null); + } + + /** + * Proxy to {@see set()} + * Required by the ArrayAccess implementation + * + * @param int $offset + * @param array $value + */ + public function offsetSet($offset, $value) + { + $this->set($offset, $value); + } + + /** + * Proxy to {@see remove()} + * Required by the ArrayAccess implementation + * + * @param int $offset + */ + public function offsetUnset($offset) + { + $this->remove($offset, 1); + } + + /** + * Sets the default case fold + * + * @param string $caseFold + */ + public static function setDefaultCaseFold($caseFold) + { + self::$_defaultCaseFold = self::_sanitizeCaseFold($caseFold, self::ATTR_CASEFOLD_NONE); + } + + /** + * Sanitizes the case fold + * + * @param string $caseFold + * @return string + */ + protected static function _sanitizeCaseFold($caseFold, $default) + { + switch ($caseFold) { + case self::ATTR_CASEFOLD_NONE: + case self::ATTR_CASEFOLD_UPPER: + case self::ATTR_CASEFOLD_LOWER: + return $caseFold; + break; + default: + return $default; + break; + } + } + + /** + * Escapes a DN value according to RFC 2253 + * + * Escapes the given VALUES according to RFC 2253 so that they can be safely used in LDAP DNs. + * The characters ",", "+", """, "\", "<", ">", ";", "#", " = " with a special meaning in RFC 2252 + * are preceeded by ba backslash. Control characters with an ASCII code < 32 are represented as \hexpair. + * Finally all leading and trailing spaces are converted to sequences of \20. + * @see Net_LDAP2_Util::escape_dn_value() from Benedikt Hallinger + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger + * + * @param string|array $values An array containing the DN values that should be escaped + * @return array The array $values, but escaped + */ + public static function escapeValue($values = array()) + { + /** + * @see Zend_Ldap_Converter + */ + require_once 'Zend/Ldap/Converter.php'; + + if (!is_array($values)) $values = array($values); + foreach ($values as $key => $val) { + // Escaping of filter meta characters + $val = str_replace(array('\\', ',', '+', '"', '<', '>', ';', '#', '=', ), + array('\\\\', '\,', '\+', '\"', '\<', '\>', '\;', '\#', '\='), $val); + $val = Zend_Ldap_Converter::ascToHex32($val); + + // Convert all leading and trailing spaces to sequences of \20. + if (preg_match('/^(\s*)(.+?)(\s*)$/', $val, $matches)) { + $val = $matches[2]; + for ($i = 0; $i + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger + * + * @param string|array $values Array of DN Values + * @return array Same as $values, but unescaped + */ + public static function unescapeValue($values = array()) + { + /** + * @see Zend_Ldap_Converter + */ + require_once 'Zend/Ldap/Converter.php'; + + if (!is_array($values)) $values = array($values); + foreach ($values as $key => $val) { + // strip slashes from special chars + $val = str_replace(array('\\\\', '\,', '\+', '\"', '\<', '\>', '\;', '\#', '\='), + array('\\', ',', '+', '"', '<', '>', ';', '#', '=', ), $val); + $values[$key] = Zend_Ldap_Converter::hex32ToAsc($val); + } + return (count($values) == 1) ? $values[0] : $values; + } + + /** + * Creates an array containing all parts of the given DN. + * + * Array will be of type + * array( + * array("cn" => "name1", "uid" => "user"), + * array("cn" => "name2"), + * array("dc" => "example"), + * array("dc" => "org") + * ) + * for a DN of cn=name1+uid=user,cn=name2,dc=example,dc=org. + * + * @param string $dn + * @param array $keys An optional array to receive DN keys (e.g. CN, OU, DC, ...) + * @param array $vals An optional array to receive DN values + * @param string $caseFold + * @return array + * @throws Zend_Ldap_Exception + */ + public static function explodeDn($dn, array &$keys = null, array &$vals = null, + $caseFold = self::ATTR_CASEFOLD_NONE) + { + $k = array(); + $v = array(); + if (!self::checkDn($dn, $k, $v, $caseFold)) { + /** + * Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'DN is malformed'); + } + $ret = array(); + for ($i = 0; $i < count($k); $i++) { + if (is_array($k[$i]) && is_array($v[$i]) && (count($k[$i]) === count($v[$i]))) { + $multi = array(); + for ($j = 0; $j < count($k[$i]); $j++) { + $key=$k[$i][$j]; + $val=$v[$i][$j]; + $multi[$key] = $val; + } + $ret[] = $multi; + } else if (is_string($k[$i]) && is_string($v[$i])) { + $ret[] = array($k[$i] => $v[$i]); + } + } + if (!is_null($keys)) $keys = $k; + if (!is_null($vals)) $vals = $v; + return $ret; + } + + /** + * @param string $dn The DN to parse + * @param array $keys An optional array to receive DN keys (e.g. CN, OU, DC, ...) + * @param array $vals An optional array to receive DN values + * @param string $caseFold + * @return boolean True if the DN was successfully parsed or false if the string is not a valid DN. + */ + public static function checkDn($dn, array &$keys = null, array &$vals = null, + $caseFold = self::ATTR_CASEFOLD_NONE) + { + /* This is a classic state machine parser. Each iteration of the + * loop processes one character. State 1 collects the key. When equals ( = ) + * is encountered the state changes to 2 where the value is collected + * until a comma (,) or semicolon (;) is encountered after which we switch back + * to state 1. If a backslash (\) is encountered, state 3 is used to collect the + * following character without engaging the logic of other states. + */ + $key = null; + $value = null; + $slen = strlen($dn); + $state = 1; + $ko = $vo = 0; + $multi = false; + $ka = array(); + $va = array(); + for ($di = 0; $di <= $slen; $di++) { + $ch = ($di == $slen) ? 0 : $dn[$di]; + switch ($state) { + case 1: // collect key + if ($ch === '=') { + $key = trim(substr($dn, $ko, $di - $ko)); + if ($caseFold == self::ATTR_CASEFOLD_LOWER) $key = strtolower($key); + else if ($caseFold == self::ATTR_CASEFOLD_UPPER) $key = strtoupper($key); + if (is_array($multi)) { + $keyId = strtolower($key); + if (in_array($keyId, $multi)) { + return false; + } + $ka[count($ka)-1][] = $key; + $multi[] = $keyId; + } else { + $ka[] = $key; + } + $state = 2; + $vo = $di + 1; + } else if ($ch === ',' || $ch === ';' || $ch === '+') { + return false; + } + break; + case 2: // collect value + if ($ch === '\\') { + $state = 3; + } else if ($ch === ',' || $ch === ';' || $ch === 0 || $ch === '+') { + $value = self::unescapeValue(trim(substr($dn, $vo, $di - $vo))); + if (is_array($multi)) { + $va[count($va)-1][] = $value; + } else { + $va[] = $value; + } + $state = 1; + $ko = $di + 1; + if ($ch === '+' && $multi === false) { + $lastKey = array_pop($ka); + $lastVal = array_pop($va); + $ka[] = array($lastKey); + $va[] = array($lastVal); + $multi = array(strtolower($lastKey)); + } else if ($ch === ','|| $ch === ';' || $ch === 0) { + $multi = false; + } + } else if ($ch === '=') { + return false; + } + break; + case 3: // escaped + $state = 2; + break; + } + } + + if ($keys !== null) { + $keys = $ka; + } + if ($vals !== null) { + $vals = $va; + } + + return ($state === 1 && $ko > 0); + } + + /** + * Returns a DN part in the form $attribute = $value + * + * This method supports the creation of multi-valued RDNs + * $part must contain an even number of elemets. + * + * @param array $attribute + * @param string $caseFold + * @return string + * @throws Zend_Ldap_Exception + */ + public static function implodeRdn(array $part, $caseFold = null) + { + self::_assertRdn($part); + $part = self::_caseFoldRdn($part, $caseFold); + $rdnParts = array(); + foreach ($part as $key => $value) { + $value = self::escapeValue($value); + $keyId = strtolower($key); + $rdnParts[$keyId] = implode('=', array($key, $value)); + } + ksort($rdnParts, SORT_STRING); + return implode('+', $rdnParts); + } + + /** + * Implodes an array in the form delivered by {@link explodeDn()} + * to a DN string. + * + * $dnArray must be of type + * array( + * array("cn" => "name1", "uid" => "user"), + * array("cn" => "name2"), + * array("dc" => "example"), + * array("dc" => "org") + * ) + * + * @param array $dnArray + * @param string $caseFold + * @param string $separator + * @return string + * @throws Zend_Ldap_Exception + */ + public static function implodeDn(array $dnArray, $caseFold = null, $separator = ',') + { + $parts = array(); + foreach ($dnArray as $p) { + $parts[] = self::implodeRdn($p, $caseFold); + } + return implode($separator, $parts); + } + + /** + * Checks if given $childDn is beneath $parentDn subtree. + * + * @param string|Zend_Ldap_Dn $childDn + * @param string|Zend_Ldap_Dn $parentDn + * @return boolean + */ + public static function isChildOf($childDn, $parentDn) + { + try { + $keys = array(); + $vals = array(); + if ($childDn instanceof Zend_Ldap_Dn) { + $cdn = $childDn->toArray(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); + } else { + $cdn = self::explodeDn($childDn, $keys, $vals, Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); + } + if ($parentDn instanceof Zend_Ldap_Dn) { + $pdn = $parentDn->toArray(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); + } else { + $pdn = self::explodeDn($parentDn, $keys, $vals, Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); + } + } + catch (Zend_Ldap_Exception $e) { + return false; + } + + $startIndex = count($cdn)-count($pdn); + if ($startIndex<0) return false; + for ($i = 0; $igetLastError($code, $errorMessages) . ': '; + if ($code === 0) { + $message = ''; + $code = $oldCode; + } + } + if (empty($message)) { + if ($code > 0) { + $message = '0x' . dechex($code) . ': '; + } + } + + if (!empty($str)) { + $message .= $str; + } else { + $message .= 'no exception message'; + } + + parent::__construct($message, $code); + } + + + /** + * @deprecated not necessary any more - will be removed + * @param Zend_Ldap $ldap A Zend_Ldap object + * @return int The current error code for the resource + */ + public static function getLdapCode(Zend_Ldap $ldap = null) + { + if ($ldap !== null) { + return $ldap->getLastErrorCode(); + } + return 0; + } + + /** + * @deprecated will be removed + * @return int The current error code for this exception + */ + public function getErrorCode() + { + return $this->getCode(); + } +} diff --git a/lib/zend/Zend/Ldap/Filter.php b/lib/zend/Zend/Ldap/Filter.php new file mode 100644 index 0000000000..2d937cdd64 --- /dev/null +++ b/lib/zend/Zend/Ldap/Filter.php @@ -0,0 +1,265 @@ +'; + const TYPE_GREATEROREQUAL = '>='; + const TYPE_LESS = '<'; + const TYPE_LESSOREQUAL = '<='; + const TYPE_APPROX = '~='; + + /** + * Creates an 'equals' filter. + * (attr=value) + * + * @param string $attr + * @param string $value + * @return Zend_Ldap_Filter + */ + public static function equals($attr, $value) + { + return new self($attr, $value, self::TYPE_EQUALS, null, null); + } + + /** + * Creates a 'begins with' filter. + * (attr=value*) + * + * @param string $attr + * @param string $value + * @return Zend_Ldap_Filter + */ + public static function begins($attr, $value) + { + return new self($attr, $value, self::TYPE_EQUALS, null, '*'); + } + + /** + * Creates an 'ends with' filter. + * (attr=*value) + * + * @param string $attr + * @param string $value + * @return Zend_Ldap_Filter + */ + public static function ends($attr, $value) + { + return new self($attr, $value, self::TYPE_EQUALS, '*', null); + } + + /** + * Creates a 'contains' filter. + * (attr=*value*) + * + * @param string $attr + * @param string $value + * @return Zend_Ldap_Filter + */ + public static function contains($attr, $value) + { + return new self($attr, $value, self::TYPE_EQUALS, '*', '*'); + } + + /** + * Creates a 'greater' filter. + * (attr>value) + * + * @param string $attr + * @param string $value + * @return Zend_Ldap_Filter + */ + public static function greater($attr, $value) + { + return new self($attr, $value, self::TYPE_GREATER, null, null); + } + + /** + * Creates a 'greater or equal' filter. + * (attr>=value) + * + * @param string $attr + * @param string $value + * @return Zend_Ldap_Filter + */ + public static function greaterOrEqual($attr, $value) + { + return new self($attr, $value, self::TYPE_GREATEROREQUAL, null, null); + } + + /** + * Creates a 'less' filter. + * (attrtoString(); + } + + /** + * Negates the filter. + * + * @return Zend_Ldap_Filter_Abstract + */ + public function negate() + { + /** + * Zend_Ldap_Filter_Not + */ + require_once 'Zend/Ldap/Filter/Not.php'; + return new Zend_Ldap_Filter_Not($this); + } + + /** + * Creates an 'and' filter. + * + * @param Zend_Ldap_Filter_Abstract $filter,... + * @return Zend_Ldap_Filter_And + */ + public function addAnd($filter) + { + /** + * Zend_Ldap_Filter_And + */ + require_once 'Zend/Ldap/Filter/And.php'; + $fa = func_get_args(); + $args = array_merge(array($this), $fa); + return new Zend_Ldap_Filter_And($args); + } + + /** + * Creates an 'or' filter. + * + * @param Zend_Ldap_Filter_Abstract $filter,... + * @return Zend_Ldap_Filter_Or + */ + public function addOr($filter) + { + /** + * Zend_Ldap_Filter_Or + */ + require_once 'Zend/Ldap/Filter/Or.php'; + $fa = func_get_args(); + $args = array_merge(array($this), $fa); + return new Zend_Ldap_Filter_Or($args); + } + + /** + * Escapes the given VALUES according to RFC 2254 so that they can be safely used in LDAP filters. + * + * Any control characters with an ACII code < 32 as well as the characters with special meaning in + * LDAP filters "*", "(", ")", and "\" (the backslash) are converted into the representation of a + * backslash followed by two hex digits representing the hexadecimal value of the character. + * @see Net_LDAP2_Util::escape_filter_value() from Benedikt Hallinger + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger + * + * @param string|array $values Array of values to escape + * @return array Array $values, but escaped + */ + public static function escapeValue($values = array()) + { + /** + * @see Zend_Ldap_Converter + */ + require_once 'Zend/Ldap/Converter.php'; + + if (!is_array($values)) $values = array($values); + foreach ($values as $key => $val) { + // Escaping of filter meta characters + $val = str_replace(array('\\', '*', '(', ')'), array('\5c', '\2a', '\28', '\29'), $val); + // ASCII < 32 escaping + $val = Zend_Ldap_Converter::ascToHex32($val); + if (null === $val) $val = '\0'; // apply escaped "null" if string is empty + $values[$key] = $val; + } + return (count($values) == 1) ? $values[0] : $values; + } + + /** + * Undoes the conversion done by {@link escapeValue()}. + * + * Converts any sequences of a backslash followed by two hex digits into the corresponding character. + * @see Net_LDAP2_Util::escape_filter_value() from Benedikt Hallinger + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger + * + * @param string|array $values Array of values to escape + * @return array Array $values, but unescaped + */ + public static function unescapeValue($values = array()) + { + /** + * @see Zend_Ldap_Converter + */ + require_once 'Zend/Ldap/Converter.php'; + + if (!is_array($values)) $values = array($values); + foreach ($values as $key => $value) { + // Translate hex code into ascii + $values[$key] = Zend_Ldap_Converter::hex32ToAsc($value); + } + return (count($values) == 1) ? $values[0] : $values; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Filter/And.php b/lib/zend/Zend/Ldap/Filter/And.php new file mode 100644 index 0000000000..b8d2dd0775 --- /dev/null +++ b/lib/zend/Zend/Ldap/Filter/And.php @@ -0,0 +1,48 @@ +wsdl_file = $wsdl; - } -} - +require_once 'Zend/Exception.php'; +/** + * @category Zend + * @package Zend_Ldap + * @subpackage Filter + * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Ldap_Filter_Exception extends Zend_Exception +{ +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Filter/Logical.php b/lib/zend/Zend/Ldap/Filter/Logical.php new file mode 100644 index 0000000000..fa2baecc15 --- /dev/null +++ b/lib/zend/Zend/Ldap/Filter/Logical.php @@ -0,0 +1,107 @@ + $s) { + if (is_string($s)) $subfilters[$key] = new Zend_Ldap_Filter_String($s); + else if (!($s instanceof Zend_Ldap_Filter_Abstract)) { + /** + * @see Zend_Ldap_Filter_Exception + */ + require_once 'Zend/Ldap/Filter/Exception.php'; + throw new Zend_Ldap_Filter_Exception('Only strings or Zend_Ldap_Filter_Abstract allowed.'); + } + } + $this->_subfilters = $subfilters; + $this->_symbol = $symbol; + } + + /** + * Adds a filter to this grouping filter. + * + * @param Zend_Ldap_Filter_Abstract $filter + * @return Zend_Ldap_Filter_Logical + */ + public function addFilter(Zend_Ldap_Filter_Abstract $filter) + { + $new = clone $this; + $new->_subfilters[] = $filter; + return $new; + } + + /** + * Returns a string representation of the filter. + * + * @return string + */ + public function toString() + { + $return = '(' . $this->_symbol; + foreach ($this->_subfilters as $sub) $return .= $sub->toString(); + $return .= ')'; + return $return; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Filter/Mask.php b/lib/zend/Zend/Ldap/Filter/Mask.php new file mode 100644 index 0000000000..dc7e94c3ce --- /dev/null +++ b/lib/zend/Zend/Ldap/Filter/Mask.php @@ -0,0 +1,66 @@ +_filter; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Filter/Not.php b/lib/zend/Zend/Ldap/Filter/Not.php new file mode 100644 index 0000000000..97d06cfd50 --- /dev/null +++ b/lib/zend/Zend/Ldap/Filter/Not.php @@ -0,0 +1,75 @@ +_filter = $filter; + } + + /** + * Negates the filter. + * + * @return Zend_Ldap_Filter_Abstract + */ + public function negate() + { + return $this->_filter; + } + + /** + * Returns a string representation of the filter. + * + * @return string + */ + public function toString() + { + return '(!' . $this->_filter->toString() . ')'; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Filter/Or.php b/lib/zend/Zend/Ldap/Filter/Or.php new file mode 100644 index 0000000000..760131f77b --- /dev/null +++ b/lib/zend/Zend/Ldap/Filter/Or.php @@ -0,0 +1,48 @@ +_filter = $filter; + } + + /** + * Returns a string representation of the filter. + * + * @return string + */ + public function toString() + { + return '(' . $this->_filter . ')'; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Ldif/Encoder.php b/lib/zend/Zend/Ldap/Ldif/Encoder.php new file mode 100644 index 0000000000..8ab8a5bb78 --- /dev/null +++ b/lib/zend/Zend/Ldap/Ldif/Encoder.php @@ -0,0 +1,304 @@ + true, + 'version' => 1, + 'wrap' => 78 + ); + + /** + * @var boolean + */ + protected $_versionWritten = false; + + /** + * Constructor. + * + * @param array $options Additional options used during encoding + * @return void + */ + protected function __construct(array $options = array()) + { + $this->_options = array_merge($this->_options, $options); + } + + /** + * Decodes the string $string into an array of LDIF items + * + * @param string $string + * @return array + */ + public static function decode($string) + { + $encoder = new self(array()); + return $encoder->_decode($string); + } + + /** + * Decodes the string $string into an array of LDIF items + * + * @param string $string + * @return array + */ + protected function _decode($string) + { + $items = array(); + $item = array(); + $last = null; + foreach (explode("\n", $string) as $line) { + $line = rtrim($line, "\x09\x0A\x0D\x00\x0B"); + $matches = array(); + if (substr($line, 0, 1) === ' ' && $last !== null) { + $last[2] .= substr($line, 1); + } else if (substr($line, 0, 1) === '#') { + continue; + } else if (preg_match('/^([a-z0-9;-]+)(:[:<]?\s*)([^:<]*)$/i', $line, $matches)) { + $name = strtolower($matches[1]); + $type = trim($matches[2]); + $value = $matches[3]; + if ($last !== null) { + $this->_pushAttribute($last, $item); + } + if ($name === 'version') { + continue; + } else if (count($item) > 0 && $name === 'dn') { + $items[] = $item; + $item = array(); + $last = null; + } + $last = array($name, $type, $value); + } else if (trim($line) === '') { + continue; + } + } + if ($last !== null) { + $this->_pushAttribute($last, $item); + } + $items[] = $item; + return (count($items)>1) ? $items : $items[0]; + } + + /** + * Pushes a decoded attribute to the stack + * + * @param array $attribute + * @param array $entry + */ + protected function _pushAttribute(array $attribute, array &$entry) + { + $name = $attribute[0]; + $type = $attribute[1]; + $value = $attribute[2]; + if ($type === '::') { + $value = base64_decode($value); + } + if ($name === 'dn') { + $entry[$name] = $value; + } else if (isset($entry[$name]) && $value !== '') { + $entry[$name][] = $value; + } else { + $entry[$name] = ($value !== '') ? array($value) : array(); + } + } + + /** + * Encode $value into a LDIF representation + * + * @param mixed $value The value to be encoded + * @param array $options Additional options used during encoding + * @return string The encoded value + */ + public static function encode($value, array $options = array()) + { + $encoder = new self($options); + return $encoder->_encode($value); + } + + /** + * Recursive driver which determines the type of value to be encoded + * and then dispatches to the appropriate method. + * + * @param mixed $value The value to be encoded + * @return string Encoded value + */ + protected function _encode($value) + { + if (is_scalar($value)) { + return $this->_encodeString($value); + } else if (is_array($value)) { + return $this->_encodeAttributes($value); + } else if ($value instanceof Zend_Ldap_Node) { + return $value->toLdif($this->_options); + } + return null; + } + + /** + * Encodes $string according to RFC2849 + * + * @link http://www.faqs.org/rfcs/rfc2849.html + * + * @param string $string + * @param boolen $base64 + * @return string + */ + protected function _encodeString($string, &$base64 = null) + { + $string = (string)$string; + if (empty($string)) { + return ''; + } + + /* + * SAFE-INIT-CHAR = %x01-09 / %x0B-0C / %x0E-1F / + * %x21-39 / %x3B / %x3D-7F + * ; any value <= 127 except NUL, LF, CR, + * ; SPACE, colon (":", ASCII 58 decimal) + * ; and less-than ("<" , ASCII 60 decimal) + * + */ + $unsafe_init_char = array(0, 10, 13, 32, 58, 60); + /* + * SAFE-CHAR = %x01-09 / %x0B-0C / %x0E-7F + * ; any value <= 127 decimal except NUL, LF, + * ; and CR + */ + $unsafe_char = array(0, 10, 13); + + $base64 = false; + for ($i = 0; $i < strlen($string); $i++) { + $char = ord(substr($string, $i, 1)); + if ($char >= 127) { + $base64 = true; + break; + } else if ($i === 0 && in_array($char, $unsafe_init_char)) { + $base64 = true; + break; + } else if (in_array($char, $unsafe_char)) { + $base64 = true; + break; + } + } + // Test for ending space + if (substr($string, -1) == ' ') { + $base64 = true; + } + + if ($base64 === true) { + $string = base64_encode($string); + } + + return $string; + } + + /** + * Encodes an attribute with $name and $value according to RFC2849 + * + * @link http://www.faqs.org/rfcs/rfc2849.html + * + * @param string $name + * @param array|string $value + * @return string + */ + protected function _encodeAttribute($name, $value) + { + if (!is_array($value)) { + $value = array($value); + } + + $output = ''; + + if (count($value) < 1) { + return $name . ': '; + } + + foreach ($value as $v) { + $base64 = null; + $v = $this->_encodeString($v, $base64); + $attribute = $name . ':'; + if ($base64 === true) { + $attribute .= ': ' . $v; + } else { + $attribute .= ' ' . $v; + } + if (isset($this->_options['wrap']) && strlen($attribute) > $this->_options['wrap']) { + $attribute = trim(chunk_split($attribute, $this->_options['wrap'], PHP_EOL . ' ')); + } + $output .= $attribute . PHP_EOL; + } + return trim($output, PHP_EOL); + } + + /** + * Encodes a collection of attributes according to RFC2849 + * + * @link http://www.faqs.org/rfcs/rfc2849.html + * + * @param array $attributes + * @return string + */ + protected function _encodeAttributes(array $attributes) + { + $string = ''; + $attributes = array_change_key_case($attributes, CASE_LOWER); + if (!$this->_versionWritten && array_key_exists('dn', $attributes) && isset($this->_options['version']) + && array_key_exists('objectclass', $attributes)) { + $string .= sprintf('version: %d', $this->_options['version']) . PHP_EOL; + $this->_versionWritten = true; + } + + if (isset($this->_options['sort']) && $this->_options['sort'] === true) { + ksort($attributes, SORT_STRING); + if (array_key_exists('objectclass', $attributes)) { + $oc = $attributes['objectclass']; + unset($attributes['objectclass']); + $attributes = array_merge(array('objectclass' => $oc), $attributes); + } + if (array_key_exists('dn', $attributes)) { + $dn = $attributes['dn']; + unset($attributes['dn']); + $attributes = array_merge(array('dn' => $dn), $attributes); + } + } + foreach ($attributes as $key => $value) { + $string .= $this->_encodeAttribute($key, $value) . PHP_EOL; + } + return trim($string, PHP_EOL); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node.php b/lib/zend/Zend/Ldap/Node.php new file mode 100644 index 0000000000..fa63de0b8c --- /dev/null +++ b/lib/zend/Zend/Ldap/Node.php @@ -0,0 +1,1098 @@ +attachLdap($ldap); + else $this->detachLdap(); + } + + /** + * Serialization callback + * + * Only DN and attributes will be serialized. + * + * @return array + */ + public function __sleep() + { + return array('_dn', '_currentData', '_newDn', '_originalData', + '_new', '_delete', '_children'); + } + + /** + * Deserialization callback + * + * Enforces a detached node. + * + * @return null + */ + public function __wakeup() + { + $this->detachLdap(); + } + + /** + * Gets the current LDAP connection. + * + * @return Zend_Ldap + * @throws Zend_Ldap_Exception + */ + public function getLdap() + { + if (is_null($this->_ldap)) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'No LDAP connection specified.', Zend_Ldap_Exception::LDAP_OTHER); + } + else return $this->_ldap; + } + + /** + * Attach node to an LDAP connection + * + * This is an offline method. + * + * @uses Zend_Ldap_Dn::isChildOf() + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function attachLdap(Zend_Ldap $ldap) + { + if (!Zend_Ldap_Dn::isChildOf($this->_getDn(), $ldap->getBaseDn())) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'LDAP connection is not responsible for given node.', + Zend_Ldap_Exception::LDAP_OTHER); + } + + if ($ldap !== $this->_ldap) { + $this->_ldap = $ldap; + if (is_array($this->_children)) { + foreach ($this->_children as $child) { + $child->attachLdap($ldap); + } + } + } + return $this; + } + + /** + * Detach node from LDAP connection + * + * This is an offline method. + * + * @return Zend_Ldap_Node Provides a fluid interface + */ + public function detachLdap() + { + $this->_ldap = null; + if (is_array($this->_children)) { + foreach ($this->_children as $child) { + $child->detachLdap(); + } + } + return $this; + } + + /** + * Checks if the current node is attached to a LDAP server. + * + * This is an offline method. + * + * @return boolean + */ + public function isAttached() + { + return (!is_null($this->_ldap)); + } + + /** + * @param array $data + * @param boolean $fromDataSource + * @throws Zend_Ldap_Exception + */ + protected function _loadData(array $data, $fromDataSource) + { + parent::_loadData($data, $fromDataSource); + if ($fromDataSource === true) { + $this->_originalData = $data; + } else { + $this->_originalData = array(); + } + $this->_children = null; + $this->_markAsNew(($fromDataSource === true) ? false : true); + $this->_markAsToBeDeleted(false); + } + + /** + * Factory method to create a new detached Zend_Ldap_Node for a given DN. + * + * @param string|array|Zend_Ldap_Dn $dn + * @param array $objectClass + * @return Zend_Ldap_Node + * @throws Zend_Ldap_Exception + */ + public static function create($dn, array $objectClass = array()) + { + if (is_string($dn) || is_array($dn)) { + $dn = Zend_Ldap_Dn::factory($dn); + } else if ($dn instanceof Zend_Ldap_Dn) { + $dn = clone $dn; + } else { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, '$dn is of a wrong data type.'); + } + $new = new self($dn, array(), false, null); + $new->_ensureRdnAttributeValues(); + $new->setAttribute('objectClass', $objectClass); + return $new; + } + + /** + * Factory method to create an attached Zend_Ldap_Node for a given DN. + * + * @param string|array|Zend_Ldap_Dn $dn + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node + * @throws Zend_Ldap_Exception + */ + public static function fromLdap($dn, Zend_Ldap $ldap) + { + if (is_string($dn) || is_array($dn)) { + $dn = Zend_Ldap_Dn::factory($dn); + } else if ($dn instanceof Zend_Ldap_Dn) { + $dn = clone $dn; + } else { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, '$dn is of a wrong data type.'); + } + $data = $ldap->getEntry($dn, array('*', '+'), true); + $entry = new self($dn, $data, true, $ldap); + return $entry; + } + + /** + * Factory method to create a detached Zend_Ldap_Node from array data. + * + * @param array $data + * @param boolean $fromDataSource + * @return Zend_Ldap_Node + * @throws Zend_Ldap_Exception + */ + public static function fromArray(array $data, $fromDataSource = false) + { + if (!array_key_exists('dn', $data)) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, '\'dn\' key is missing in array.'); + } + if (is_string($data['dn']) || is_array($data['dn'])) { + $dn = Zend_Ldap_Dn::factory($data['dn']); + } else if ($data['dn'] instanceof Zend_Ldap_Dn) { + $dn = clone $data['dn']; + } else { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, '\'dn\' key is of a wrong data type.'); + } + $fromDataSource = ($fromDataSource === true) ? true : false; + $new = new self($dn, $data, $fromDataSource, null); + $new->_ensureRdnAttributeValues(); + return $new; + } + + /** + * Ensures that teh RDN attributes are correctly set. + * + * @return void + */ + protected function _ensureRdnAttributeValues() + { + foreach ($this->getRdnArray() as $key => $value) { + Zend_Ldap_Attribute::setAttribute($this->_currentData, $key, $value, false); + } + } + + /** + * Marks this node as new. + * + * Node will be added (instead of updated) on calling update() if $new is true. + * + * @param boolean $new + */ + protected function _markAsNew($new) + { + $this->_new = ($new === false) ? false : true; + } + + /** + * Tells if the node is consiedered as new (not present on the server) + * + * Please note, that this doesn't tell you if the node is present on the server. + * Use {@link exits()} to see if a node is already there. + * + * @return boolean + */ + public function isNew() + { + return $this->_new; + } + + /** + * Marks this node as to be deleted. + * + * Node will be deleted on calling update() if $delete is true. + * + * @param boolean $delete + */ + protected function _markAsToBeDeleted($delete) + { + $this->_delete = ($delete === true) ? true : false; + } + + + /** + * Is this node going to be deleted once update() is called? + * + * @return boolean + */ + public function willBeDeleted() + { + return $this->_delete; + } + + /** + * Marks this node as to be deleted + * + * Node will be deleted on calling update() if $delete is true. + * + * @return Zend_Ldap_Node Provides a fluid interface + */ + public function delete() + { + $this->_markAsToBeDeleted(true); + return $this; + } + + /** + * Is this node going to be moved once update() is called? + * + * @return boolean + */ + public function willBeMoved() + { + if ($this->isNew() || $this->willBeDeleted()) { + return false; + } else if ($this->_newDn !== null) { + return ($this->_dn != $this->_newDn); + } else { + return false; + } + } + + /** + * Sends all pending changes to the LDAP server + * + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function update(Zend_Ldap $ldap = null) + { + if ($ldap !== null) { + $this->attachLdap($ldap); + } + $ldap = $this->getLdap(); + if (!($ldap instanceof Zend_Ldap)) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'No LDAP connection available'); + } + + if ($this->willBeDeleted()) { + if ($ldap->exists($this->_dn)) { + $ldap->delete($this->_dn); + } + return $this; + } + + if ($this->isNew()) { + $data = $this->getData(); + $ldap->add($this->_getDn(), $data); + $this->_loadData($data, true); + return $this; + } + + $changedData = $this->getChangedData(); + if ($this->willBeMoved()) { + $recursive = $this->hasChildren(); + $ldap->rename($this->_dn, $this->_newDn, $recursive, false); + foreach ($this->_newDn->getRdn() as $key => $value) { + if (array_key_exists($key, $changedData)) { + unset($changedData[$key]); + } + } + $this->_dn = $this->_newDn; + $this->_newDn = null; + } + if (count($changedData) > 0) { + $ldap->update($this->_getDn(), $changedData); + } + $this->_originalData = $this->_currentData; + return $this; + } + + /** + * Gets the DN of the current node as a Zend_Ldap_Dn. + * + * This is an offline method. + * + * @return Zend_Ldap_Dn + */ + protected function _getDn() + { + return ($this->_newDn === null) ? parent::_getDn() : $this->_newDn; + } + + /** + * Gets the current DN of the current node as a Zend_Ldap_Dn. + * The method returns a clone of the node's DN to prohibit modification. + * + * This is an offline method. + * + * @return Zend_Ldap_Dn + */ + public function getCurrentDn() + { + $dn = clone parent::_getDn(); + return $dn; + } + + /** + * Sets the new DN for this node + * + * This is an offline method. + * + * @param Zend_Ldap_Dn|string|array $newDn + * @throws Zend_Ldap_Exception + * @return Zend_Ldap_Node Provides a fluid interface + */ + public function setDn($newDn) + { + if ($newDn instanceof Zend_Ldap_Dn) { + $this->_newDn = clone $newDn; + } else { + $this->_newDn = Zend_Ldap_Dn::factory($newDn); + } + $this->_ensureRdnAttributeValues(); + return $this; + } + + /** + * {@see setDn()} + * + * This is an offline method. + * + * @param Zend_Ldap_Dn|string|array $newDn + * @throws Zend_Ldap_Exception + * @return Zend_Ldap_Node Provides a fluid interface + */ + public function move($newDn) + { + return $this->setDn($newDn); + } + + /** + * {@see setDn()} + * + * This is an offline method. + * + * @param Zend_Ldap_Dn|string|array $newDn + * @throws Zend_Ldap_Exception + * @return Zend_Ldap_Node Provides a fluid interface + */ + public function rename($newDn) + { + return $this->setDn($newDn); + } + + /** + * Sets the objectClass. + * + * This is an offline method. + * + * @param array|string $value + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function setObjectClass($value) + { + $this->setAttribute('objectClass', $value); + return $this; + } + + /** + * Appends to the objectClass. + * + * This is an offline method. + * + * @param array|string $value + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function appendObjectClass($value) + { + $this->appendToAttribute('objectClass', $value); + return $this; + } + + /** + * Returns a LDIF representation of the current node + * + * @param array $options Additional options used during encoding + * @return string + */ + public function toLdif(array $options = array()) + { + $attributes = array_merge(array('dn' => $this->getDnString()), $this->getData(false)); + /** + * Zend_Ldap_Ldif_Encoder + */ + require_once 'Zend/Ldap/Ldif/Encoder.php'; + return Zend_Ldap_Ldif_Encoder::encode($attributes, $options); + } + + /** + * Gets changed node data. + * + * The array contains all changed attributes. + * This format can be used in {@link Zend_Ldap::add()} and {@link Zend_Ldap::update()}. + * + * This is an offline method. + * + * @return array + */ + public function getChangedData() + { + $changed = array(); + foreach ($this->_currentData as $key => $value) { + if (!array_key_exists($key, $this->_originalData) && !empty($value)) { + $changed[$key] = $value; + } else if ($this->_originalData[$key] !== $this->_currentData[$key]) { + $changed[$key] = $value; + } + } + return $changed; + } + + /** + * Returns all changes made. + * + * This is an offline method. + * + * @return array + */ + public function getChanges() + { + $changes = array( + 'add' => array(), + 'delete' => array(), + 'replace' => array()); + foreach ($this->_currentData as $key => $value) { + if (!array_key_exists($key, $this->_originalData) && !empty($value)) { + $changes['add'][$key] = $value; + } else if (count($this->_originalData[$key]) === 0 && !empty($value)) { + $changes['add'][$key] = $value; + } else if ($this->_originalData[$key] !== $this->_currentData[$key]) { + if (empty($value)) { + $changes['delete'][$key] = $value; + } else { + $changes['replace'][$key] = $value; + } + } + } + return $changes; + } + + /** + * Sets a LDAP attribute. + * + * This is an offline method. + * + * @param string $name + * @param mixed $value + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function setAttribute($name, $value) + { + $this->_setAttribute($name, $value, false); + return $this; + } + + /** + * Appends to a LDAP attribute. + * + * This is an offline method. + * + * @param string $name + * @param mixed $value + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function appendToAttribute($name, $value) + { + $this->_setAttribute($name, $value, true); + return $this; + } + + /** + * Checks if the attribute can be set and sets it accordingly. + * + * @param string $name + * @param mixed $value + * @param boolean $append + * @throws Zend_Ldap_Exception + */ + protected function _setAttribute($name, $value, $append) + { + $this->_assertChangeableAttribute($name); + Zend_Ldap_Attribute::setAttribute($this->_currentData, $name, $value, $append); + } + + /** + * Sets a LDAP date/time attribute. + * + * This is an offline method. + * + * @param string $name + * @param integer|array $value + * @param boolean $utc + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function setDateTimeAttribute($name, $value, $utc = false) + { + $this->_setDateTimeAttribute($name, $value, $utc, false); + return $this; + } + + /** + * Appends to a LDAP date/time attribute. + * + * This is an offline method. + * + * @param string $name + * @param integer|array $value + * @param boolean $utc + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function appendToDateTimeAttribute($name, $value, $utc = false) + { + $this->_setDateTimeAttribute($name, $value, $utc, true); + return $this; + } + + /** + * Checks if the attribute can be set and sets it accordingly. + * + * @param string $name + * @param integer|array $value + * @param boolean $utc + * @param boolean $append + * @throws Zend_Ldap_Exception + */ + protected function _setDateTimeAttribute($name, $value, $utc, $append) + { + $this->_assertChangeableAttribute($name); + Zend_Ldap_Attribute::setDateTimeAttribute($this->_currentData, $name, $value, $utc, $append); + } + + /** + * Sets a LDAP password. + * + * @param string $password + * @param string $hashType + * @param string $attribName + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function setPasswordAttribute($password, $hashType = Zend_Ldap_Attribute::PASSWORD_HASH_MD5, + $attribName = 'userPassword') + { + $this->_assertChangeableAttribute($attribName); + Zend_Ldap_Attribute::setPassword($this->_currentData, $password, $hashType, $attribName); + return $this; + } + + /** + * Deletes a LDAP attribute. + * + * This method deletes the attribute. + * + * This is an offline method. + * + * @param string $name + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function deleteAttribute($name) + { + if ($this->existsAttribute($name, true)) { + $this->_setAttribute($name, null, false); + } + return $this; + } + + /** + * Removes duplicate values from a LDAP attribute + * + * @param string $attribName + * @return void + */ + public function removeDuplicatesFromAttribute($attribName) + { + Zend_Ldap_Attribute::removeDuplicatesFromAttribute($this->_currentData, $attribName); + } + + /** + * Remove given values from a LDAP attribute + * + * @param string $attribName + * @param mixed|array $value + * @return void + */ + public function removeFromAttribute($attribName, $value) + { + Zend_Ldap_Attribute::removeFromAttribute($this->_currentData, $attribName, $value); + } + + /** + * @param string $name + * @return boolean + * @throws Zend_Ldap_Exception + */ + protected function _assertChangeableAttribute($name) + { + $name = strtolower($name); + $rdn = $this->getRdnArray(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); + if ($name == 'dn') { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'DN cannot be changed.'); + } + else if (array_key_exists($name, $rdn)) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Cannot change attribute because it\'s part of the RDN'); + } else if (in_array($name, self::$_systemAttributes)) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Cannot change attribute because it\'s read-only'); + } + else return true; + } + + /** + * Sets a LDAP attribute. + * + * This is an offline method. + * + * @param string $name + * @param mixed $value + * @return null + * @throws Zend_Ldap_Exception + */ + public function __set($name, $value) + { + $this->setAttribute($name, $value); + } + + /** + * Deletes a LDAP attribute. + * + * This method deletes the attribute. + * + * This is an offline method. + * + * @param string $name + * @return null + * @throws Zend_Ldap_Exception + */ + public function __unset($name) + { + $this->deleteAttribute($name); + } + + /** + * Sets a LDAP attribute. + * Implements ArrayAccess. + * + * This is an offline method. + * + * @param string $name + * @param mixed $value + * @return null + * @throws Zend_Ldap_Exception + */ + public function offsetSet($name, $value) + { + $this->setAttribute($name, $value); + } + + /** + * Deletes a LDAP attribute. + * Implements ArrayAccess. + * + * This method deletes the attribute. + * + * This is an offline method. + * + * @param string $name + * @return null + * @throws Zend_Ldap_Exception + */ + public function offsetUnset($name) + { + $this->deleteAttribute($name); + } + + /** + * Check if node exists on LDAP. + * + * This is an online method. + * + * @param Zend_Ldap $ldap + * @return boolean + * @throws Zend_Ldap_Exception + */ + public function exists(Zend_Ldap $ldap = null) + { + if ($ldap !== null) { + $this->attachLdap($ldap); + } + $ldap = $this->getLdap(); + return $ldap->exists($this->_getDn()); + } + + /** + * Reload node attributes from LDAP. + * + * This is an online method. + * + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function reload(Zend_Ldap $ldap = null) + { + if ($ldap !== null) { + $this->attachLdap($ldap); + } + $ldap = $this->getLdap(); + parent::reload($ldap); + return $this; + } + + /** + * Search current subtree with given options. + * + * This is an online method. + * + * @param string|Zend_Ldap_Filter_Abstract $filter + * @param integer $scope + * @param string $sort + * @return Zend_Ldap_Node_Collection + * @throws Zend_Ldap_Exception + */ + public function searchSubtree($filter, $scope = Zend_Ldap::SEARCH_SCOPE_SUB, $sort = null) + { + /** + * @see Zend_Ldap_Node_Collection + */ + require_once 'Zend/Ldap/Node/Collection.php'; + return $this->getLdap()->search($filter, $this->_getDn(), $scope, array('*', '+'), $sort, + 'Zend_Ldap_Node_Collection'); + } + + /** + * Count items in current subtree found by given filter. + * + * This is an online method. + * + * @param string|Zend_Ldap_Filter_Abstract $filter + * @param integer $scope + * @return integer + * @throws Zend_Ldap_Exception + */ + public function countSubtree($filter, $scope = Zend_Ldap::SEARCH_SCOPE_SUB) + { + return $this->getLdap()->count($filter, $this->_getDn(), $scope); + } + + /** + * Count children of current node. + * + * This is an online method. + * + * @return integer + * @throws Zend_Ldap_Exception + */ + public function countChildren() + { + return $this->countSubtree('(objectClass=*)', Zend_Ldap::SEARCH_SCOPE_ONE); + } + + /** + * Gets children of current node. + * + * This is an online method. + * + * @param string|Zend_Ldap_Filter_Abstract $filter + * @param string $sort + * @return Zend_Ldap_Node_Collection + * @throws Zend_Ldap_Exception + */ + public function searchChildren($filter, $sort = null) + { + return $this->searchSubtree($filter, Zend_Ldap::SEARCH_SCOPE_ONE, $sort); + } + + /** + * Checks if current node has children. + * Returns whether the current element has children. + * + * Can be used offline but returns false if children have not been retrieved yet. + * + * @return boolean + * @throws Zend_Ldap_Exception + */ + public function hasChildren() + { + if (!is_array($this->_children)) { + if ($this->isAttached()) { + return ($this->countChildren() > 0); + } else { + return false; + } + } else { + return (count($this->_children) > 0); + } + } + + /** + * Returns the children for the current node. + * + * Can be used offline but returns an empty array if children have not been retrieved yet. + * + * @return Zend_Ldap_Node_ChildrenIterator + * @throws Zend_Ldap_Exception + */ + public function getChildren() + { + if (!is_array($this->_children)) { + $this->_children = array(); + if ($this->isAttached()) { + $children = $this->searchChildren('(objectClass=*)', null); + foreach ($children as $child) { + $this->_children[$child->getRdnString(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER)] = $child; + } + } + } + /** + * @see Zend_Ldap_Node_ChildrenIterator + */ + require_once 'Zend/Ldap/Node/ChildrenIterator.php'; + return new Zend_Ldap_Node_ChildrenIterator($this->_children); + } + + /** + * Returns the parent of the current node. + * + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node + * @throws Zend_Ldap_Exception + */ + public function getParent(Zend_Ldap $ldap = null) + { + if ($ldap !== null) { + $this->attachLdap($ldap); + } + $ldap = $this->getLdap(); + $parentDn = $this->_getDn()->getParentDn(1); + return self::fromLdap($parentDn, $ldap); + } + + /** + * Return the current attribute. + * Implements Iterator + * + * @return array + */ + public function current() + { + return $this; + } + + /** + * Return the attribute name. + * Implements Iterator + * + * @return string + */ + public function key() + { + return $this->getRdnString(); + } + + /** + * Move forward to next attribute. + * Implements Iterator + */ + public function next() + { + $this->_iteratorRewind = false; + } + + /** + * Rewind the Iterator to the first attribute. + * Implements Iterator + */ + public function rewind() + { + $this->_iteratorRewind = true; + } + + /** + * Check if there is a current attribute + * after calls to rewind() or next(). + * Implements Iterator + * + * @return boolean + */ + public function valid() + { + return $this->_iteratorRewind; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/Abstract.php b/lib/zend/Zend/Ldap/Node/Abstract.php new file mode 100644 index 0000000000..3c484ce846 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/Abstract.php @@ -0,0 +1,485 @@ +_dn = $dn; + $this->_loadData($data, $fromDataSource); + } + + /** + * @param array $data + * @param boolean $fromDataSource + * @throws Zend_Ldap_Exception + */ + protected function _loadData(array $data, $fromDataSource) + { + if (array_key_exists('dn', $data)) { + unset($data['dn']); + } + ksort($data, SORT_STRING); + $this->_currentData = $data; + } + + /** + * Reload node attributes from LDAP. + * + * This is an online method. + * + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node_Abstract Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function reload(Zend_Ldap $ldap = null) + { + if ($ldap !== null) { + $data = $ldap->getEntry($this->_getDn(), array('*', '+'), true); + $this->_loadData($data, true); + } + return $this; + } + + /** + * Gets the DN of the current node as a Zend_Ldap_Dn. + * + * This is an offline method. + * + * @return Zend_Ldap_Dn + */ + protected function _getDn() + { + return $this->_dn; + } + + /** + * Gets the DN of the current node as a Zend_Ldap_Dn. + * The method returns a clone of the node's DN to prohibit modification. + * + * This is an offline method. + * + * @return Zend_Ldap_Dn + */ + public function getDn() + { + $dn = clone $this->_getDn(); + return $dn; + } + + /** + * Gets the DN of the current node as a string. + * + * This is an offline method. + * + * @param string $caseFold + * @return string + */ + public function getDnString($caseFold = null) + { + return $this->_getDn()->toString($caseFold); + } + + /** + * Gets the DN of the current node as an array. + * + * This is an offline method. + * + * @param string $caseFold + * @return array + */ + public function getDnArray($caseFold = null) + { + return $this->_getDn()->toArray($caseFold); + } + + /** + * Gets the RDN of the current node as a string. + * + * This is an offline method. + * + * @param string $caseFold + * @return string + */ + public function getRdnString($caseFold = null) + { + return $this->_getDn()->getRdnString($caseFold); + } + + /** + * Gets the RDN of the current node as an array. + * + * This is an offline method. + * + * @param string $caseFold + * @return array + */ + public function getRdnArray($caseFold = null) + { + return $this->_getDn()->getRdn($caseFold); + } + + /** + * Gets the objectClass of the node + * + * @return array + */ + public function getObjectClass() + { + return $this->getAttribute('objectClass', null); + } + + /** + * Gets all attributes of node. + * + * The collection contains all attributes. + * + * This is an offline method. + * + * @param boolean $includeSystemAttributes + * @return array + */ + public function getAttributes($includeSystemAttributes = true) + { + $data = array(); + foreach ($this->getData($includeSystemAttributes) as $name => $value) { + $data[$name] = $this->getAttribute($name, null); + } + return $data; + } + + /** + * Returns the DN of the current node. {@see getDnString()} + * + * @return string + */ + public function toString() + { + return $this->getDnString(); + } + + /** + * Cast to string representation {@see toString()} + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Returns an array representation of the current node + * + * @param boolean $includeSystemAttributes + * @return array + */ + public function toArray($includeSystemAttributes = true) + { + $attributes = $this->getAttributes($includeSystemAttributes); + return array_merge(array('dn' => $this->getDnString()), $attributes); + } + + /** + * Returns a JSON representation of the current node + * + * @param boolean $includeSystemAttributes + * @return string + */ + public function toJson($includeSystemAttributes = true) + { + return json_encode($this->toArray($includeSystemAttributes)); + } + + /** + * Gets node attributes. + * + * The array contains all attributes in its internal format (no conversion). + * + * This is an offline method. + * + * @param boolean $includeSystemAttributes + * @return array + */ + public function getData($includeSystemAttributes = true) + { + if ($includeSystemAttributes === false) { + $data = array(); + foreach ($this->_currentData as $key => $value) { + if (!in_array($key, self::$_systemAttributes)) { + $data[$key] = $value; + } + } + return $data; + } else { + return $this->_currentData; + } + } + + /** + * Checks whether a given attribute exists. + * + * If $emptyExists is false empty attributes (containing only array()) are + * treated as non-existent returning false. + * If $emptyExists is true empty attributes are treated as existent returning + * true. In this case method returns false only if the attribute name is + * missing in the key-collection. + * + * @param string $name + * @param boolean $emptyExists + * @return boolean + */ + public function existsAttribute($name, $emptyExists = false) + { + $name = strtolower($name); + if (isset($this->_currentData[$name])) { + if ($emptyExists) return true; + return count($this->_currentData[$name])>0; + } + else return false; + } + + /** + * Checks if the given value(s) exist in the attribute + * + * @param string $attribName + * @param mixed|array $value + * @return boolean + */ + public function attributeHasValue($attribName, $value) + { + return Zend_Ldap_Attribute::attributeHasValue($this->_currentData, $attribName, $value); + } + + /** + * Gets a LDAP attribute. + * + * This is an offline method. + * + * @param string $name + * @param integer $index + * @return mixed + * @throws Zend_Ldap_Exception + */ + public function getAttribute($name, $index = null) + { + if ($name == 'dn') { + return $this->getDnString(); + } + else { + return Zend_Ldap_Attribute::getAttribute($this->_currentData, $name, $index); + } + } + + /** + * Gets a LDAP date/time attribute. + * + * This is an offline method. + * + * @param string $name + * @param integer $index + * @return array|integer + * @throws Zend_Ldap_Exception + */ + public function getDateTimeAttribute($name, $index = null) + { + return Zend_Ldap_Attribute::getDateTimeAttribute($this->_currentData, $name, $index); + } + + /** + * Sets a LDAP attribute. + * + * This is an offline method. + * + * @param string $name + * @param mixed $value + * @return null + * @throws BadMethodCallException + */ + public function __set($name, $value) + { + throw new BadMethodCallException(); + } + + /** + * Gets a LDAP attribute. + * + * This is an offline method. + * + * @param string $name + * @return array + * @throws Zend_Ldap_Exception + */ + public function __get($name) + { + return $this->getAttribute($name, null); + } + + /** + * Deletes a LDAP attribute. + * + * This method deletes the attribute. + * + * This is an offline method. + * + * @param string $name + * @return null + * @throws BadMethodCallException + */ + public function __unset($name) + { + throw new BadMethodCallException(); + } + + /** + * Checks whether a given attribute exists. + * + * Empty attributes will be treated as non-existent. + * + * @param string $name + * @return boolean + */ + public function __isset($name) + { + return $this->existsAttribute($name, false); + } + + /** + * Sets a LDAP attribute. + * Implements ArrayAccess. + * + * This is an offline method. + * + * @param string $name + * @param mixed $value + * @return null + * @throws BadMethodCallException + */ + public function offsetSet($name, $value) + { + throw new BadMethodCallException(); + } + + /** + * Gets a LDAP attribute. + * Implements ArrayAccess. + * + * This is an offline method. + * + * @param string $name + * @return array + * @throws Zend_Ldap_Exception + */ + public function offsetGet($name) + { + return $this->getAttribute($name, null); + } + + /** + * Deletes a LDAP attribute. + * Implements ArrayAccess. + * + * This method deletes the attribute. + * + * This is an offline method. + * + * @param string $name + * @return null + * @throws BadMethodCallException + */ + public function offsetUnset($name) + { + throw new BadMethodCallException(); + } + + /** + * Checks whether a given attribute exists. + * Implements ArrayAccess. + * + * Empty attributes will be treated as non-existent. + * + * @param string $name + * @return boolean + */ + public function offsetExists($name) + { + return $this->existsAttribute($name, false); + } + + /** + * Returns the number of attributes in node. + * Implements Countable + * + * @return int + */ + public function count() + { + return count($this->_currentData); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/ChildrenIterator.php b/lib/zend/Zend/Ldap/Node/ChildrenIterator.php new file mode 100644 index 0000000000..5494974192 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/ChildrenIterator.php @@ -0,0 +1,209 @@ +_data = $data; + } + + /** + * Returns the number of child nodes. + * Implements Countable + * + * @return int + */ + public function count() + { + return count($this->_data); + } + + /** + * Return the current child. + * Implements Iterator + * + * @return Zend_Ldap_Node + */ + public function current() + { + return current($this->_data); + } + + /** + * Return the child'd RDN. + * Implements Iterator + * + * @return string + */ + public function key() + { + return key($this->_data); + } + + /** + * Move forward to next child. + * Implements Iterator + */ + public function next() + { + next($this->_data); + } + + /** + * Rewind the Iterator to the first child. + * Implements Iterator + */ + public function rewind() + { + reset($this->_data); + } + + /** + * Check if there is a current child + * after calls to rewind() or next(). + * Implements Iterator + * + * @return boolean + */ + public function valid() + { + return (current($this->_data)!==false); + } + + /** + * Checks if current node has children. + * Returns whether the current element has children. + * + * @return boolean + */ + public function hasChildren() + { + if ($this->current() instanceof Zend_Ldap_Node) { + return $this->current()->hasChildren(); + } else { + return false; + } + } + + /** + * Returns the children for the current node. + * + * @return Zend_Ldap_Node_ChildrenIterator + */ + public function getChildren() + { + if ($this->current() instanceof Zend_Ldap_Node) { + return $this->current()->getChildren(); + } else { + return null; + } + } + + /** + * Returns a child with a given RDN. + * Implements ArrayAccess. + * + * @param string $rdn + * @return Zend_Ldap_node + */ + public function offsetGet($rdn) + { + if ($this->offsetExists($rdn)) { + return $this->_data[$rdn]; + } else { + return null; + } + } + + /** + * Checks whether a given rdn exists. + * Implements ArrayAccess. + * + * @param string $rdn + * @return boolean + */ + public function offsetExists($rdn) + { + return (array_key_exists($rdn, $this->_data)); + } + + /** + * Does nothing. + * Implements ArrayAccess. + * + * @param string $name + * @return null + */ + public function offsetUnset($name) { } + + /** + * Does nothing. + * Implements ArrayAccess. + * + * @param string $name + * @param mixed $value + * @return null + */ + public function offsetSet($name, $value) { } + + /** + * Get all children as an array + * + * @return array + */ + public function toArray() + { + $data = array(); + foreach ($this as $rdn => $node) { + $data[$rdn] = $node; + } + return $data; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/Collection.php b/lib/zend/Zend/Ldap/Node/Collection.php new file mode 100644 index 0000000000..f2723f3b70 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/Collection.php @@ -0,0 +1,67 @@ +attachLdap($this->_iterator->getLdap()); + return $node; + } + + /** + * Return the child key (DN). + * Implements Iterator and RecursiveIterator + * + * @return string + */ + public function key() + { + return $this->_iterator->key(); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/RootDse.php b/lib/zend/Zend/Ldap/Node/RootDse.php new file mode 100644 index 0000000000..940fc95529 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/RootDse.php @@ -0,0 +1,158 @@ +getEntry($dn, array('*', '+'), true); + if (isset($data['domainfunctionality'])) { + /** + * @see Zend_Ldap_Node_RootDse_ActiveDirectory + */ + require_once 'Zend/Ldap/Node/RootDse/ActiveDirectory.php'; + return new Zend_Ldap_Node_RootDse_ActiveDirectory($dn, $data); + } else if (isset($data['dsaname'])) { + /** + * @see Zend_Ldap_Node_RootDse_ActiveDirectory + */ + require_once 'Zend/Ldap/Node/RootDse/eDirectory.php'; + return new Zend_Ldap_Node_RootDse_eDirectory($dn, $data); + } else if (isset($data['structuralobjectclass']) && + $data['structuralobjectclass'][0] === 'OpenLDAProotDSE') { + /** + * @see Zend_Ldap_Node_RootDse_OpenLdap + */ + require_once 'Zend/Ldap/Node/RootDse/OpenLdap.php'; + return new Zend_Ldap_Node_RootDse_OpenLdap($dn, $data); + } else { + return new self($dn, $data); + } + } + + /** + * Constructor. + * + * Constructor is protected to enforce the use of factory methods. + * + * @param Zend_Ldap_Dn $dn + * @param array $data + */ + protected function __construct(Zend_Ldap_Dn $dn, array $data) + { + parent::__construct($dn, $data, true); + } + + /** + * Gets the namingContexts. + * + * @return array + */ + public function getNamingContexts() + { + return $this->getAttribute('namingContexts', null); + } + + /** + * Gets the subschemaSubentry. + * + * @return string|null + */ + public function getSubschemaSubentry() + { + return $this->getAttribute('subschemaSubentry', 0); + } + + /** + * Determines if the version is supported + * + * @param string|int|array $versions version(s) to check + * @return boolean + */ + public function supportsVersion($versions) + { + return $this->attributeHasValue('supportedLDAPVersion', $versions); + } + + /** + * Determines if the sasl mechanism is supported + * + * @param string|array $mechlist SASL mechanisms to check + * @return boolean + */ + public function supportsSaslMechanism($mechlist) + { + return $this->attributeHasValue('supportedSASLMechanisms', $mechlist); + } + + /** + * Gets the server type + * + * @return int + */ + public function getServerType() + { + return self::SERVER_TYPE_GENERIC; + } + + /** + * Returns the schema DN + * + * @return Zend_Ldap_Dn + */ + public function getSchemaDn() + { + $schemaDn = $this->getSubschemaSubentry(); + /** + * @see Zend_Ldap_Dn + */ + require_once 'Zend/Ldap/Dn.php'; + return Zend_Ldap_Dn::fromString($schemaDn); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/RootDse/ActiveDirectory.php b/lib/zend/Zend/Ldap/Node/RootDse/ActiveDirectory.php new file mode 100644 index 0000000000..dc125175d5 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/RootDse/ActiveDirectory.php @@ -0,0 +1,247 @@ +getAttribute('configurationNamingContext', 0); + } + + /** + * Gets the currentTime. + * + * @return string|null + */ + public function getCurrentTime() + { + return $this->getAttribute('currentTime', 0); + } + + /** + * Gets the defaultNamingContext. + * + * @return string|null + */ + public function getDefaultNamingContext() + { + return $this->getAttribute('defaultNamingContext', 0); + } + + /** + * Gets the dnsHostName. + * + * @return string|null + */ + public function getDnsHostName() + { + return $this->getAttribute('dnsHostName', 0); + } + + /** + * Gets the domainControllerFunctionality. + * + * @return string|null + */ + public function getDomainControllerFunctionality() + { + return $this->getAttribute('domainControllerFunctionality', 0); + } + + /** + * Gets the domainFunctionality. + * + * @return string|null + */ + public function getDomainFunctionality() + { + return $this->getAttribute('domainFunctionality', 0); + } + + /** + * Gets the dsServiceName. + * + * @return string|null + */ + public function getDsServiceName() + { + return $this->getAttribute('dsServiceName', 0); + } + + /** + * Gets the forestFunctionality. + * + * @return string|null + */ + public function getForestFunctionality() + { + return $this->getAttribute('forestFunctionality', 0); + } + + /** + * Gets the highestCommittedUSN. + * + * @return string|null + */ + public function getHighestCommittedUSN() + { + return $this->getAttribute('highestCommittedUSN', 0); + } + + /** + * Gets the isGlobalCatalogReady. + * + * @return string|null + */ + public function getIsGlobalCatalogReady() + { + return $this->getAttribute('isGlobalCatalogReady', 0); + } + + /** + * Gets the isSynchronized. + * + * @return string|null + */ + public function getIsSynchronized() + { + return $this->getAttribute('isSynchronized', 0); + } + + /** + * Gets the ldapServiceName. + * + * @return string|null + */ + public function getLdapServiceName() + { + return $this->getAttribute('ldapServiceName', 0); + } + + /** + * Gets the rootDomainNamingContext. + * + * @return string|null + */ + public function getRootDomainNamingContext() + { + return $this->getAttribute('rootDomainNamingContext', 0); + } + + /** + * Gets the schemaNamingContext. + * + * @return string|null + */ + public function getSchemaNamingContext() + { + return $this->getAttribute('schemaNamingContext', 0); + } + + /** + * Gets the serverName. + * + * @return string|null + */ + public function getServerName() + { + return $this->getAttribute('serverName', 0); + } + + /** + * Determines if the capability is supported + * + * @param string|string|array $oids capability(s) to check + * @return boolean + */ + public function supportsCapability($oids) + { + return $this->attributeHasValue('supportedCapabilities', $oids); + } + + /** + * Determines if the control is supported + * + * @param string|array $oids control oid(s) to check + * @return boolean + */ + public function supportsControl($oids) + { + return $this->attributeHasValue('supportedControl', $oids); + } + + /** + * Determines if the version is supported + * + * @param string|array $policies policy(s) to check + * @return boolean + */ + public function supportsPolicy($policies) + { + return $this->attributeHasValue('supportedLDAPPolicies', $policies); + } + + /** + * Gets the server type + * + * @return int + */ + public function getServerType() + { + return self::SERVER_TYPE_ACTIVEDIRECTORY; + } + + /** + * Returns the schema DN + * + * @return Zend_Ldap_Dn + */ + public function getSchemaDn() + { + $schemaDn = $this->getSchemaNamingContext(); + /** + * @see Zend_Ldap_Dn + */ + require_once 'Zend/Ldap/Dn.php'; + return Zend_Ldap_Dn::fromString($schemaDn); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/RootDse/OpenLdap.php b/lib/zend/Zend/Ldap/Node/RootDse/OpenLdap.php new file mode 100644 index 0000000000..509afdb0d2 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/RootDse/OpenLdap.php @@ -0,0 +1,102 @@ +getAttribute('configContext', 0); + } + + /** + * Gets the monitorContext. + * + * @return string|null + */ + public function getMonitorContext() + { + return $this->getAttribute('monitorContext', 0); + } + + /** + * Determines if the control is supported + * + * @param string|array $oids control oid(s) to check + * @return boolean + */ + public function supportsControl($oids) + { + return $this->attributeHasValue('supportedControl', $oids); + } + + /** + * Determines if the extension is supported + * + * @param string|array $oids oid(s) to check + * @return boolean + */ + public function supportsExtension($oids) + { + return $this->attributeHasValue('supportedExtension', $oids); + } + + /** + * Determines if the feature is supported + * + * @param string|array $oids feature oid(s) to check + * @return boolean + */ + public function supportsFeature($oids) + { + return $this->attributeHasValue('supportedFeatures', $oids); + } + + /** + * Gets the server type + * + * @return int + */ + public function getServerType() + { + return self::SERVER_TYPE_OPENLDAP; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/RootDse/eDirectory.php b/lib/zend/Zend/Ldap/Node/RootDse/eDirectory.php new file mode 100644 index 0000000000..871f0c522c --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/RootDse/eDirectory.php @@ -0,0 +1,160 @@ +attributeHasValue('supportedExtension', $oids); + } + + /** + * Gets the vendorName. + * + * @return string|null + */ + public function getVendorName() + { + return $this->getAttribute('vendorName', 0); + } + + /** + * Gets the vendorVersion. + * + * @return string|null + */ + public function getVendorVersion() + { + return $this->getAttribute('vendorVersion', 0); + } + + /** + * Gets the dsaName. + * + * @return string|null + */ + public function getDsaName() + { + return $this->getAttribute('dsaName', 0); + } + + /** + * Gets the server statistics "errors". + * + * @return string|null + */ + public function getStatisticsErrors() + { + return $this->getAttribute('errors', 0); + } + + /** + * Gets the server statistics "securityErrors". + * + * @return string|null + */ + public function getStatisticsSecurityErrors() + { + return $this->getAttribute('securityErrors', 0); + } + + /** + * Gets the server statistics "chainings". + * + * @return string|null + */ + public function getStatisticsChainings() + { + return $this->getAttribute('chainings', 0); + } + + /** + * Gets the server statistics "referralsReturned". + * + * @return string|null + */ + public function getStatisticsReferralsReturned() + { + return $this->getAttribute('referralsReturned', 0); + } + + /** + * Gets the server statistics "extendedOps". + * + * @return string|null + */ + public function getStatisticsExtendedOps() + { + return $this->getAttribute('extendedOps', 0); + } + + /** + * Gets the server statistics "abandonOps". + * + * @return string|null + */ + public function getStatisticsAbandonOps() + { + return $this->getAttribute('abandonOps', 0); + } + + /** + * Gets the server statistics "wholeSubtreeSearchOps". + * + * @return string|null + */ + public function getStatisticsWholeSubtreeSearchOps() + { + return $this->getAttribute('wholeSubtreeSearchOps', 0); + } + + /** + * Gets the server type + * + * @return int + */ + public function getServerType() + { + return self::SERVER_TYPE_EDIRECTORY; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/Schema.php b/lib/zend/Zend/Ldap/Node/Schema.php new file mode 100644 index 0000000000..3c98e4bcf1 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/Schema.php @@ -0,0 +1,120 @@ +getRootDse()->getSchemaDn(); + $data = $ldap->getEntry($dn, array('*', '+'), true); + switch ($ldap->getRootDse()->getServerType()) { + case Zend_Ldap_Node_RootDse::SERVER_TYPE_ACTIVEDIRECTORY: + /** + * @see Zend_Ldap_Node_Schema_ActiveDirectory + */ + require_once 'Zend/Ldap/Node/Schema/ActiveDirectory.php'; + return new Zend_Ldap_Node_Schema_ActiveDirectory($dn, $data, $ldap); + case Zend_Ldap_Node_RootDse::SERVER_TYPE_OPENLDAP: + /** + * @see Zend_Ldap_Node_RootDse_ActiveDirectory + */ + require_once 'Zend/Ldap/Node/Schema/OpenLdap.php'; + return new Zend_Ldap_Node_Schema_OpenLdap($dn, $data, $ldap); + case Zend_Ldap_Node_RootDse::SERVER_TYPE_EDIRECTORY: + default: + return new self($dn, $data, $ldap); + } + } + + /** + * Constructor. + * + * Constructor is protected to enforce the use of factory methods. + * + * @param Zend_Ldap_Dn $dn + * @param array $data + * @param Zend_Ldap $ldap + */ + protected function __construct(Zend_Ldap_Dn $dn, array $data, Zend_Ldap $ldap) + { + parent::__construct($dn, $data, true); + $this->_parseSchema($dn, $ldap); + } + + /** + * Parses the schema + * + * @param Zend_Ldap_Dn $dn + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node_Schema Provides a fluid interface + */ + protected function _parseSchema(Zend_Ldap_Dn $dn, Zend_Ldap $ldap) + { + return $this; + } + + /** + * Gets the attribute Types + * + * @return array + */ + public function getAttributeTypes() + { + return array(); + } + + /** + * Gets the object classes + * + * @return array + */ + public function getObjectClasses() + { + return array(); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/Schema/ActiveDirectory.php b/lib/zend/Zend/Ldap/Node/Schema/ActiveDirectory.php new file mode 100644 index 0000000000..36a1297d25 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/Schema/ActiveDirectory.php @@ -0,0 +1,103 @@ +search('(objectClass=classSchema)', $dn, + Zend_Ldap::SEARCH_SCOPE_ONE) as $node) { + $val = new Zend_Ldap_Node_Schema_ObjectClass_ActiveDirectory($node); + $this->_objectClasses[$val->getName()] = $val; + } + foreach ($ldap->search('(objectClass=attributeSchema)', $dn, + Zend_Ldap::SEARCH_SCOPE_ONE) as $node) { + $val = new Zend_Ldap_Node_Schema_AttributeType_ActiveDirectory($node); + $this->_attributeTypes[$val->getName()] = $val; + } + return $this; + } + + /** + * Gets the attribute Types + * + * @return array + */ + public function getAttributeTypes() + { + return $this->_attributeTypes; + } + + /** + * Gets the object classes + * + * @return array + */ + public function getObjectClasses() + { + return $this->_objectClasses; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/Schema/AttributeType/ActiveDirectory.php b/lib/zend/Zend/Ldap/Node/Schema/AttributeType/ActiveDirectory.php new file mode 100644 index 0000000000..3dcce91584 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/Schema/AttributeType/ActiveDirectory.php @@ -0,0 +1,104 @@ +ldapdisplayname[0]; + } + + /** + * Gets the attribute OID + * + * @return string + */ + public function getOid() + { + + } + + /** + * Gets the attribute syntax + * + * @return string + */ + public function getSyntax() + { + + } + + /** + * Gets the attribute maximum length + * + * @return int|null + */ + public function getMaxLength() + { + + } + + /** + * Returns if the attribute is single-valued. + * + * @return boolean + */ + public function isSingleValued() + { + + } + + /** + * Gets the attribute description + * + * @return string + */ + public function getDescription() + { + + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/Schema/AttributeType/Interface.php b/lib/zend/Zend/Ldap/Node/Schema/AttributeType/Interface.php new file mode 100644 index 0000000000..9797c3f14c --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/Schema/AttributeType/Interface.php @@ -0,0 +1,75 @@ +name; + } + + /** + * Gets the attribute OID + * + * @return string + */ + public function getOid() + { + return $this->oid; + } + + /** + * Gets the attribute syntax + * + * @return string + */ + public function getSyntax() + { + if ($this->syntax === null) { + $parent = $this->getParent(); + if ($parent === null) return null; + else return $parent->getSyntax(); + } else { + return $this->syntax; + } + } + + /** + * Gets the attribute maximum length + * + * @return int|null + */ + public function getMaxLength() + { + $maxLength = $this->{'max-length'}; + if ($maxLength === null) { + $parent = $this->getParent(); + if ($parent === null) return null; + else return $parent->getMaxLength(); + } else { + return (int)$maxLength; + } + } + + /** + * Returns if the attribute is single-valued. + * + * @return boolean + */ + public function isSingleValued() + { + return $this->{'single-value'}; + } + + /** + * Gets the attribute description + * + * @return string + */ + public function getDescription() + { + return $this->desc; + } + + /** + * Returns the parent attribute type in the inhertitance tree if one exists + * + * @return Zend_Ldap_Node_Schema_AttributeType_OpenLdap|null + */ + public function getParent() + { + if (count($this->_parents) === 1) { + return $this->_parents[0]; + } + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/Schema/Item.php b/lib/zend/Zend/Ldap/Node/Schema/Item.php new file mode 100644 index 0000000000..7e8e0df41e --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/Schema/Item.php @@ -0,0 +1,163 @@ +setData($data); + } + + /** + * Sets the data + * + * @param array $data + * @return Zend_Ldap_Node_Schema_Item Provides a fluid interface + */ + public function setData(array $data) + { + $this->_data = $data; + return $this; + } + + /** + * Gets the data + * + * @return array + */ + public function getData() + { + return $this->_data; + } + + /** + * Gets a specific attribute from this item + * + * @param string $name + * @return mixed + */ + public function __get($name) + { + if (array_key_exists($name, $this->_data)) { + return $this->_data[$name]; + } else { + return null; + } + } + + /** + * Checks whether a specific attribute exists. + * + * @param string $name + * @return boolean + */ + public function __isset($name) + { + return (array_key_exists($name, $this->_data)); + } + + /** + * Always throws BadMethodCallException + * Implements ArrayAccess. + * + * This method is needed for a full implementation of ArrayAccess + * + * @param string $name + * @param mixed $value + * @return null + * @throws BadMethodCallException + */ + public function offsetSet($name, $value) + { + throw new BadMethodCallException(); + } + + /** + * Gets a specific attribute from this item + * + * @param string $name + * @return mixed + */ + public function offsetGet($name) + { + return $this->__get($name); + } + + /** + * Always throws BadMethodCallException + * Implements ArrayAccess. + * + * This method is needed for a full implementation of ArrayAccess + * + * @param string $name + * @return null + * @throws BadMethodCallException + */ + public function offsetUnset($name) + { + throw new BadMethodCallException(); + } + + /** + * Checks whether a specific attribute exists. + * + * @param string $name + * @return boolean + */ + public function offsetExists($name) + { + return $this->__isset($name); + } + + /** + * Returns the number of attributes. + * Implements Countable + * + * @return int + */ + public function count() + { + return count($this->_data); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/Schema/ObjectClass/ActiveDirectory.php b/lib/zend/Zend/Ldap/Node/Schema/ObjectClass/ActiveDirectory.php new file mode 100644 index 0000000000..7ccc175850 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/Schema/ObjectClass/ActiveDirectory.php @@ -0,0 +1,115 @@ +ldapdisplayname[0]; + } + + /** + * Gets the objectClass OID + * + * @return string + */ + public function getOid() + { + + } + + /** + * Gets the attributes that this objectClass must contain + * + * @return array + */ + public function getMustContain() + { + + } + + /** + * Gets the attributes that this objectClass may contain + * + * @return array + */ + public function getMayContain() + { + + } + + /** + * Gets the objectClass description + * + * @return string + */ + public function getDescription() + { + + } + + /** + * Gets the objectClass type + * + * @return integer + */ + public function getType() + { + + } + + /** + * Returns the parent objectClasses of this class. + * This includes structural, abstract and auxiliary objectClasses + * + * @return array + */ + public function getParentClasses() + { + + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/Schema/ObjectClass/Interface.php b/lib/zend/Zend/Ldap/Node/Schema/ObjectClass/Interface.php new file mode 100644 index 0000000000..51045e1d45 --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/Schema/ObjectClass/Interface.php @@ -0,0 +1,83 @@ +name; + } + + /** + * Gets the objectClass OID + * + * @return string + */ + public function getOid() + { + return $this->oid; + } + + /** + * Gets the attributes that this objectClass must contain + * + * @return array + */ + public function getMustContain() + { + if ($this->_inheritedMust === null) { + $this->_resolveInheritance(); + } + return $this->_inheritedMust; + } + + /** + * Gets the attributes that this objectClass may contain + * + * @return array + */ + public function getMayContain() + { + if ($this->_inheritedMay === null) { + $this->_resolveInheritance(); + } + return $this->_inheritedMay; + } + + /** + * Resolves the inheritance tree + * + * @return void + */ + protected function _resolveInheritance() + { + $must = $this->must; + $may = $this->may; + foreach ($this->getParents() as $p) { + $must = array_merge($must, $p->getMustContain()); + $may = array_merge($may, $p->getMayContain()); + } + $must = array_unique($must); + $may = array_unique($may); + $may = array_diff($may, $must); + sort($must, SORT_STRING); + sort($may, SORT_STRING); + $this->_inheritedMust = $must; + $this->_inheritedMay = $may; + } + + /** + * Gets the objectClass description + * + * @return string + */ + public function getDescription() + { + return $this->desc; + } + + /** + * Gets the objectClass type + * + * @return integer + */ + public function getType() + { + if ($this->structural) { + return Zend_Ldap_Node_Schema::OBJECTCLASS_TYPE_STRUCTURAL; + } else if ($this->abstract) { + return Zend_Ldap_Node_Schema::OBJECTCLASS_TYPE_ABSTRACT; + } else if ($this->auxiliary) { + return Zend_Ldap_Node_Schema::OBJECTCLASS_TYPE_AUXILIARY; + } else { + return Zend_Ldap_Node_Schema::OBJECTCLASS_TYPE_UNKNOWN; + } + } + + /** + * Returns the parent objectClasses of this class. + * This includes structural, abstract and auxiliary objectClasses + * + * @return array + */ + public function getParentClasses() + { + return $this->sup; + } + + /** + * Returns the parent object classes in the inhertitance tree if one exists + * + * @return array of Zend_Ldap_Node_Schema_ObjectClass_OpenLdap + */ + public function getParents() + { + return $this->_parents; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Ldap/Node/Schema/OpenLdap.php b/lib/zend/Zend/Ldap/Node/Schema/OpenLdap.php new file mode 100644 index 0000000000..ea5634067c --- /dev/null +++ b/lib/zend/Zend/Ldap/Node/Schema/OpenLdap.php @@ -0,0 +1,502 @@ +_loadAttributeTypes(); + $this->_loadLdapSyntaxes(); + $this->_loadMatchingRules(); + $this->_loadMatchingRuleUse(); + $this->_loadObjectClasses(); + return $this; + } + + /** + * Gets the attribute Types + * + * @return array + */ + public function getAttributeTypes() + { + return $this->_attributeTypes; + } + + /** + * Gets the object classes + * + * @return array + */ + public function getObjectClasses() + { + return $this->_objectClasses; + } + + /** + * Gets the LDAP syntaxes + * + * @return array + */ + public function getLdapSyntaxes() + { + return $this->_ldapSyntaxes; + } + + /** + * Gets the matching rules + * + * @return array + */ + public function getMatchingRules() + { + return $this->_matchingRules; + } + + /** + * Gets the matching rule use + * + * @return array + */ + public function getMatchingRuleUse() + { + return $this->_matchingRuleUse; + } + + /** + * Loads the attribute Types + * + * @return void + */ + protected function _loadAttributeTypes() + { + $this->_attributeTypes = array(); + foreach ($this->getAttribute('attributeTypes') as $value) { + $val = $this->_parseAttributeType($value); + $val = new Zend_Ldap_Node_Schema_AttributeType_OpenLdap($val); + $this->_attributeTypes[$val->getName()] = $val; + + } + foreach ($this->_attributeTypes as $val) { + if (count($val->sup) > 0) { + $this->_resolveInheritance($val, $this->_attributeTypes); + } + foreach ($val->aliases as $alias) { + $this->_attributeTypes[$alias] = $val; + } + } + ksort($this->_attributeTypes, SORT_STRING); + } + + /** + * Parses an attributeType value + * + * @param string $value + * @return array + */ + protected function _parseAttributeType($value) + { + $attributeType = array( + 'oid' => null, + 'name' => null, + 'desc' => null, + 'obsolete' => false, + 'sup' => null, + 'equality' => null, + 'ordering' => null, + 'substr' => null, + 'syntax' => null, + 'max-length' => null, + 'single-value' => false, + 'collective' => false, + 'no-user-modification' => false, + 'usage' => 'userApplications', + '_string' => $value, + '_parents' => array()); + + $tokens = $this->_tokenizeString($value); + $attributeType['oid'] = array_shift($tokens); // first token is the oid + $this->_parseLdapSchemaSyntax($attributeType, $tokens); + + if (array_key_exists('syntax', $attributeType)) { + // get max length from syntax + if (preg_match('/^(.+){(\d+)}$/', $attributeType['syntax'], $matches)) { + $attributeType['syntax'] = $matches[1]; + $attributeType['max-length'] = $matches[2]; + } + } + + $this->_ensureNameAttribute($attributeType); + + return $attributeType; + } + + /** + * Loads the object classes + * + * @return void + */ + protected function _loadObjectClasses() + { + $this->_objectClasses = array(); + foreach ($this->getAttribute('objectClasses') as $value) { + $val = $this->_parseObjectClass($value); + $val = new Zend_Ldap_Node_Schema_ObjectClass_OpenLdap($val); + $this->_objectClasses[$val->getName()] = $val; + } + foreach ($this->_objectClasses as $val) { + if (count($val->sup) > 0) { + $this->_resolveInheritance($val, $this->_objectClasses); + } + foreach ($val->aliases as $alias) { + $this->_objectClasses[$alias] = $val; + } + } + ksort($this->_objectClasses, SORT_STRING); + } + + /** + * Parses an objectClasses value + * + * @param string $value + * @return array + */ + protected function _parseObjectClass($value) + { + $objectClass = array( + 'oid' => null, + 'name' => null, + 'desc' => null, + 'obsolete' => false, + 'sup' => array(), + 'abstract' => false, + 'structural' => false, + 'auxiliary' => false, + 'must' => array(), + 'may' => array(), + '_string' => $value, + '_parents' => array()); + + $tokens = $this->_tokenizeString($value); + $objectClass['oid'] = array_shift($tokens); // first token is the oid + $this->_parseLdapSchemaSyntax($objectClass, $tokens); + + $this->_ensureNameAttribute($objectClass); + + return $objectClass; + } + + /** + * Resolves inheritance in objectClasses and attributes + * + * @param Zend_Ldap_Node_Schema_Item $node + * @param array $repository + */ + protected function _resolveInheritance(Zend_Ldap_Node_Schema_Item $node, array $repository) + { + $data = $node->getData(); + $parents = $data['sup']; + if ($parents === null || !is_array($parents) || count($parents) < 1) return; + foreach ($parents as $parent) { + if (!array_key_exists($parent, $repository)) continue; + if (!array_key_exists('_parents', $data) || !is_array($data['_parents'])) { + $data['_parents'] = array(); + } + $data['_parents'][] = $repository[$parent]; + } + $node->setData($data); + } + + /** + * Loads the LDAP syntaxes + * + * @return void + */ + protected function _loadLdapSyntaxes() + { + $this->_ldapSyntaxes = array(); + foreach ($this->getAttribute('ldapSyntaxes') as $value) { + $val = $this->_parseLdapSyntax($value); + $this->_ldapSyntaxes[$val['oid']] = $val; + } + ksort($this->_ldapSyntaxes, SORT_STRING); + } + + /** + * Parses an ldapSyntaxes value + * + * @param string $value + * @return array + */ + protected function _parseLdapSyntax($value) + { + $ldapSyntax = array( + 'oid' => null, + 'desc' => null, + '_string' => $value); + + $tokens = $this->_tokenizeString($value); + $ldapSyntax['oid'] = array_shift($tokens); // first token is the oid + $this->_parseLdapSchemaSyntax($ldapSyntax, $tokens); + + return $ldapSyntax; + } + + /** + * Loads the matching rules + * + * @return void + */ + protected function _loadMatchingRules() + { + $this->_matchingRules = array(); + foreach ($this->getAttribute('matchingRules') as $value) { + $val = $this->_parseMatchingRule($value); + $this->_matchingRules[$val['name']] = $val; + } + ksort($this->_matchingRules, SORT_STRING); + } + + /** + * Parses an matchingRules value + * + * @param string $value + * @return array + */ + protected function _parseMatchingRule($value) + { + $matchingRule = array( + 'oid' => null, + 'name' => null, + 'desc' => null, + 'obsolete' => false, + 'syntax' => null, + '_string' => $value); + + $tokens = $this->_tokenizeString($value); + $matchingRule['oid'] = array_shift($tokens); // first token is the oid + $this->_parseLdapSchemaSyntax($matchingRule, $tokens); + + $this->_ensureNameAttribute($matchingRule); + + return $matchingRule; + } + + /** + * Loads the matching rule use + * + * @return void + */ + protected function _loadMatchingRuleUse() + { + $this->_matchingRuleUse = array(); + foreach ($this->getAttribute('matchingRuleUse') as $value) { + $val = $this->_parseMatchingRuleUse($value); + $this->_matchingRuleUse[$val['name']] = $val; + } + ksort($this->_matchingRuleUse, SORT_STRING); + } + + /** + * Parses an matchingRuleUse value + * + * @param string $value + * @return array + */ + protected function _parseMatchingRuleUse($value) + { + $matchingRuleUse = array( + 'oid' => null, + 'name' => null, + 'desc' => null, + 'obsolete' => false, + 'applies' => array(), + '_string' => $value); + + $tokens = $this->_tokenizeString($value); + $matchingRuleUse['oid'] = array_shift($tokens); // first token is the oid + $this->_parseLdapSchemaSyntax($matchingRuleUse, $tokens); + + $this->_ensureNameAttribute($matchingRuleUse); + + return $matchingRuleUse; + } + + /** + * Ensures that a name element is present and that it is single-values. + * + * @param array $data + */ + protected function _ensureNameAttribute(array &$data) + { + if (!array_key_exists('name', $data) || empty($data['name'])) { + // force a name + $data['name'] = $data['oid']; + } + if (is_array($data['name'])) { + // make one name the default and put the other ones into aliases + $aliases = $data['name']; + $data['name'] = array_shift($aliases); + $data['aliases'] = $aliases; + } else { + $data['aliases'] = array(); + } + } + + /** + * Parse the given tokens into a data structure + * + * @param array $data + * @param array $tokens + * @return void + */ + protected function _parseLdapSchemaSyntax(array &$data, array $tokens) + { + // tokens that have no value associated + $noValue = array('single-value', + 'obsolete', + 'collective', + 'no-user-modification', + 'abstract', + 'structural', + 'auxiliary'); + // tokens that can have multiple values + $multiValue = array('must', 'may', 'sup'); + + while (count($tokens) > 0) { + $token = strtolower(array_shift($tokens)); + if (in_array($token, $noValue)) { + $data[$token] = true; // single value token + } else { + $data[$token] = array_shift($tokens); + // this one follows a string or a list if it is multivalued + if ($data[$token] == '(') { + // this creates the list of values and cycles through the tokens + // until the end of the list is reached ')' + $data[$token] = array(); + while ($tmp = array_shift($tokens)) { + if ($tmp == ')') break; + if ($tmp != '$') { + $data[$token][] = Zend_Ldap_Attribute::convertFromLdapValue($tmp); + } + } + } else { + $data[$token] = Zend_Ldap_Attribute::convertFromLdapValue($data[$token]); + } + // create a array if the value should be multivalued but was not + if (in_array($token, $multiValue) && !is_array($data[$token])) { + $data[$token] = array($data[$token]); + } + } + } + } + + /** + * Tokenizes the given value into an array + * + * @param string $value + * @return array tokens + */ + protected function _tokenizeString($value) + { + $tokens = array(); + $matches = array(); + // this one is taken from PEAR::Net_LDAP2 + $pattern = "/\s* (?:([()]) | ([^'\s()]+) | '((?:[^']+|'[^\s)])*)') \s*/x"; + preg_match_all($pattern, $value, $matches); + $cMatches = count($matches[0]); + $cPattern = count($matches); + for ($i = 0; $i < $cMatches; $i++) { // number of tokens (full pattern match) + for ($j = 1; $j < $cPattern; $j++) { // each subpattern + $tok = trim($matches[$j][$i]); + if (!empty($tok)) { // pattern match in this subpattern + $tokens[$i] = $tok; // this is the token + } + } + } + if ($tokens[0] == '(') array_shift($tokens); + if ($tokens[count($tokens) - 1] == ')') array_pop($tokens); + return $tokens; + } +} diff --git a/lib/zend/Zend/Loader/Autoloader.php b/lib/zend/Zend/Loader/Autoloader.php new file mode 100644 index 0000000000..b6b5ae83eb --- /dev/null +++ b/lib/zend/Zend/Loader/Autoloader.php @@ -0,0 +1,584 @@ + true, + 'ZendX_' => true, + ); + + /** + * @var array Namespace-specific autoloaders + */ + protected $_namespaceAutoloaders = array(); + + /** + * @var bool Whether or not to suppress file not found warnings + */ + protected $_suppressNotFoundWarnings = false; + + /** + * @var null|string + */ + protected $_zfPath; + + /** + * Retrieve singleton instance + * + * @return Zend_Loader_Autoloader + */ + public static function getInstance() + { + if (null === self::$_instance) { + self::$_instance = new self(); + } + return self::$_instance; + } + + /** + * Reset the singleton instance + * + * @return void + */ + public static function resetInstance() + { + self::$_instance = null; + } + + /** + * Autoload a class + * + * @param string $class + * @return bool + */ + public static function autoload($class) + { + $self = self::getInstance(); + + foreach ($self->getClassAutoloaders($class) as $autoloader) { + if ($autoloader instanceof Zend_Loader_Autoloader_Interface) { + if ($autoloader->autoload($class)) { + return true; + } + } elseif (is_string($autoloader)) { + if ($autoloader($class)) { + return true; + } + } elseif (is_array($autoloader)) { + $object = array_shift($autoloader); + $method = array_shift($autoloader); + if (call_user_func(array($object, $method), $class)) { + return true; + } + } + } + + return false; + } + + /** + * Set the default autoloader implementation + * + * @param string|array $callback PHP callback + * @return void + */ + public function setDefaultAutoloader($callback) + { + if (!is_callable($callback)) { + throw new Zend_Loader_Exception('Invalid callback specified for default autoloader'); + } + + $this->_defaultAutoloader = $callback; + return $this; + } + + /** + * Retrieve the default autoloader callback + * + * @return string|array PHP Callback + */ + public function getDefaultAutoloader() + { + return $this->_defaultAutoloader; + } + + /** + * Set several autoloader callbacks at once + * + * @param array $autoloaders Array of PHP callbacks (or Zend_Loader_Autoloader_Interface implementations) to act as autoloaders + * @return Zend_Loader_Autoloader + */ + public function setAutoloaders(array $autoloaders) + { + $this->_autoloaders = $autoloaders; + return $this; + } + + /** + * Get attached autoloader implementations + * + * @return array + */ + public function getAutoloaders() + { + return $this->_autoloaders; + } + + /** + * Return all autoloaders for a given namespace + * + * @param string $namespace + * @return array + */ + public function getNamespaceAutoloaders($namespace) + { + $namespace = (string) $namespace; + if (!array_key_exists($namespace, $this->_namespaceAutoloaders)) { + return array(); + } + return $this->_namespaceAutoloaders[$namespace]; + } + + /** + * Register a namespace to autoload + * + * @param string|array $namespace + * @return Zend_Loader_Autoloader + */ + public function registerNamespace($namespace) + { + if (is_string($namespace)) { + $namespace = (array) $namespace; + } elseif (!is_array($namespace)) { + throw new Zend_Loader_Exception('Invalid namespace provided'); + } + + foreach ($namespace as $ns) { + if (!isset($this->_namespaces[$ns])) { + $this->_namespaces[$ns] = true; + } + } + return $this; + } + + /** + * Unload a registered autoload namespace + * + * @param string|array $namespace + * @return Zend_Loader_Autoloader + */ + public function unregisterNamespace($namespace) + { + if (is_string($namespace)) { + $namespace = (array) $namespace; + } elseif (!is_array($namespace)) { + throw new Zend_Loader_Exception('Invalid namespace provided'); + } + + foreach ($namespace as $ns) { + if (isset($this->_namespaces[$ns])) { + unset($this->_namespaces[$ns]); + } + } + return $this; + } + + /** + * Get a list of registered autoload namespaces + * + * @return array + */ + public function getRegisteredNamespaces() + { + return array_keys($this->_namespaces); + } + + public function setZfPath($spec, $version = 'latest') + { + $path = $spec; + if (is_array($spec)) { + if (!isset($spec['path'])) { + throw new Zend_Loader_Exception('No path specified for ZF'); + } + $path = $spec['path']; + if (isset($spec['version'])) { + $version = $spec['version']; + } + } + + $this->_zfPath = $this->_getVersionPath($path, $version); + set_include_path(implode(PATH_SEPARATOR, array( + $this->_zfPath, + get_include_path(), + ))); + return $this; + } + + public function getZfPath() + { + return $this->_zfPath; + } + + /** + * Get or set the value of the "suppress not found warnings" flag + * + * @param null|bool $flag + * @return bool|Zend_Loader_Autoloader Returns boolean if no argument is passed, object instance otherwise + */ + public function suppressNotFoundWarnings($flag = null) + { + if (null === $flag) { + return $this->_suppressNotFoundWarnings; + } + $this->_suppressNotFoundWarnings = (bool) $flag; + return $this; + } + + /** + * Indicate whether or not this autoloader should be a fallback autoloader + * + * @param bool $flag + * @return Zend_Loader_Autoloader + */ + public function setFallbackAutoloader($flag) + { + $this->_fallbackAutoloader = (bool) $flag; + return $this; + } + + /** + * Is this instance acting as a fallback autoloader? + * + * @return bool + */ + public function isFallbackAutoloader() + { + return $this->_fallbackAutoloader; + } + + /** + * Get autoloaders to use when matching class + * + * Determines if the class matches a registered namespace, and, if so, + * returns only the autoloaders for that namespace. Otherwise, it returns + * all non-namespaced autoloaders. + * + * @param string $class + * @return array Array of autoloaders to use + */ + public function getClassAutoloaders($class) + { + $namespace = false; + $autoloaders = array(); + + // Add concrete namespaced autoloaders + foreach (array_keys($this->_namespaceAutoloaders) as $ns) { + if ('' == $ns) { + continue; + } + if (0 === strpos($class, $ns)) { + $namespace = $ns; + $autoloaders = $autoloaders + $this->getNamespaceAutoloaders($ns); + break; + } + } + + // Add internal namespaced autoloader + foreach ($this->getRegisteredNamespaces() as $ns) { + if (0 === strpos($class, $ns)) { + $namespace = $ns; + $autoloaders[] = $this->_internalAutoloader; + break; + } + } + + // Add non-namespaced autoloaders + $autoloaders = $autoloaders + $this->getNamespaceAutoloaders(''); + + // Add fallback autoloader + if (!$namespace && $this->isFallbackAutoloader()) { + $autoloaders[] = $this->_internalAutoloader; + } + + return $autoloaders; + } + + /** + * Add an autoloader to the beginning of the stack + * + * @param object|array|string $callback PHP callback or Zend_Loader_Autoloader_Interface implementation + * @param string|array $namespace Specific namespace(s) under which to register callback + * @return Zend_Loader_Autoloader + */ + public function unshiftAutoloader($callback, $namespace = '') + { + $autoloaders = $this->getAutoloaders(); + array_unshift($autoloaders, $callback); + $this->setAutoloaders($autoloaders); + + $namespace = (array) $namespace; + foreach ($namespace as $ns) { + $autoloaders = $this->getNamespaceAutoloaders($ns); + array_unshift($autoloaders, $callback); + $this->_setNamespaceAutoloaders($autoloaders, $ns); + } + + return $this; + } + + /** + * Append an autoloader to the autoloader stack + * + * @param object|array|string $callback PHP callback or Zend_Loader_Autoloader_Interface implementation + * @param string|array $namespace Specific namespace(s) under which to register callback + * @return Zend_Loader_Autoloader + */ + public function pushAutoloader($callback, $namespace = '') + { + $autoloaders = $this->getAutoloaders(); + array_push($autoloaders, $callback); + $this->setAutoloaders($autoloaders); + + $namespace = (array) $namespace; + foreach ($namespace as $ns) { + $autoloaders = $this->getNamespaceAutoloaders($ns); + array_push($autoloaders, $callback); + $this->_setNamespaceAutoloaders($autoloaders, $ns); + } + + return $this; + } + + /** + * Remove an autoloader from the autoloader stack + * + * @param object|array|string $callback PHP callback or Zend_Loader_Autoloader_Interface implementation + * @param null|string|array $namespace Specific namespace(s) from which to remove autoloader + * @return Zend_Loader_Autoloader + */ + public function removeAutoloader($callback, $namespace = null) + { + if (null === $namespace) { + $autoloaders = $this->getAutoloaders(); + if (false !== ($index = array_search($callback, $autoloaders, true))) { + unset($autoloaders[$index]); + $this->setAutoloaders($autoloaders); + } + + foreach ($this->_namespaceAutoloaders as $ns => $autoloaders) { + if (false !== ($index = array_search($callback, $autoloaders, true))) { + unset($autoloaders[$index]); + $this->_setNamespaceAutoloaders($autoloaders, $ns); + } + } + } else { + $namespace = (array) $namespace; + foreach ($namespace as $ns) { + $autoloaders = $this->getNamespaceAutoloaders($ns); + if (false !== ($index = array_search($callback, $autoloaders, true))) { + unset($autoloaders[$index]); + $this->_setNamespaceAutoloaders($autoloaders, $ns); + } + } + } + + return $this; + } + + /** + * Constructor + * + * Registers instance with spl_autoload stack + * + * @return void + */ + protected function __construct() + { + spl_autoload_register(array(__CLASS__, 'autoload')); + $this->_internalAutoloader = array($this, '_autoload'); + } + + /** + * Internal autoloader implementation + * + * @param string $class + * @return bool + */ + protected function _autoload($class) + { + $callback = $this->getDefaultAutoloader(); + try { + if ($this->suppressNotFoundWarnings()) { + @call_user_func($callback, $class); + } else { + call_user_func($callback, $class); + } + return $class; + } catch (Zend_Exception $e) { + return false; + } + } + + /** + * Set autoloaders for a specific namespace + * + * @param array $autoloaders + * @param string $namespace + * @return Zend_Loader_Autoloader + */ + protected function _setNamespaceAutoloaders(array $autoloaders, $namespace = '') + { + $namespace = (string) $namespace; + $this->_namespaceAutoloaders[$namespace] = $autoloaders; + return $this; + } + + /** + * Retrieve the filesystem path for the requested ZF version + * + * @param string $path + * @param string $version + * @return void + */ + protected function _getVersionPath($path, $version) + { + $type = $this->_getVersionType($version); + + if ($type == 'latest') { + $version = 'latest'; + } + + $availableVersions = $this->_getAvailableVersions($path, $version); + if (empty($availableVersions)) { + throw new Zend_Loader_Exception('No valid ZF installations discovered'); + } + + $matchedVersion = array_pop($availableVersions); + return $matchedVersion; + } + + /** + * Retrieve the ZF version type + * + * @param string $version + * @return string "latest", "major", "minor", or "specific" + * @throws Zend_Loader_Exception if version string contains too many dots + */ + protected function _getVersionType($version) + { + if (strtolower($version) == 'latest') { + return 'latest'; + } + + $parts = explode('.', $version); + $count = count($parts); + if (1 == $count) { + return 'major'; + } + if (2 == $count) { + return 'minor'; + } + if (3 < $count) { + throw new Zend_Loader_Exception('Invalid version string provided'); + } + return 'specific'; + } + + /** + * Get available versions for the version type requested + * + * @param string $path + * @param string $version + * @return array + */ + protected function _getAvailableVersions($path, $version) + { + if (!is_dir($path)) { + throw new Zend_Loader_Exception('Invalid ZF path provided'); + } + + $path = rtrim($path, '/'); + $path = rtrim($path, '\\'); + $versionLen = strlen($version); + $versions = array(); + $dirs = glob("$path/*", GLOB_ONLYDIR); + foreach ($dirs as $dir) { + $dirName = substr($dir, strlen($path) + 1); + if (!preg_match('/^(?:ZendFramework-)?(\d+\.\d+\.\d+((a|b|pl|pr|p|rc)\d+)?)(?:-minimal)?$/i', $dirName, $matches)) { + continue; + } + + $matchedVersion = $matches[1]; + + if (('latest' == $version) + || ((strlen($matchedVersion) >= $versionLen) + && (0 === strpos($matchedVersion, $version))) + ) { + $versions[$matchedVersion] = $dir . '/library'; + } + } + + uksort($versions, 'version_compare'); + return $versions; + } +} diff --git a/lib/zend/Zend/Loader/Autoloader/Interface.php b/lib/zend/Zend/Loader/Autoloader/Interface.php new file mode 100644 index 0000000000..0837312cc2 --- /dev/null +++ b/lib/zend/Zend/Loader/Autoloader/Interface.php @@ -0,0 +1,34 @@ +toArray(); + } + if (!is_array($options)) { + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception('Options must be passed to resource loader constructor'); + } + + $this->setOptions($options); + + $namespace = $this->getNamespace(); + if ((null === $namespace) + || (null === $this->getBasePath()) + ) { + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception('Resource loader requires both a namespace and a base path for initialization'); + } + + if (!empty($namespace)) { + $namespace .= '_'; + } + Zend_Loader_Autoloader::getInstance()->unshiftAutoloader($this, $namespace); + } + + /** + * Overloading: methods + * + * Allow retrieving concrete resource object instances using 'get()' + * syntax. Example: + * + * $loader = new Zend_Loader_Autoloader_Resource(array( + * 'namespace' => 'Stuff_', + * 'basePath' => '/path/to/some/stuff', + * )) + * $loader->addResourceType('Model', 'models', 'Model'); + * + * $foo = $loader->getModel('Foo'); // get instance of Stuff_Model_Foo class + * + * + * @param string $method + * @param array $args + * @return mixed + * @throws Zend_Loader_Exception if method not beginning with 'get' or not matching a valid resource type is called + */ + public function __call($method, $args) + { + if ('get' == substr($method, 0, 3)) { + $type = strtolower(substr($method, 3)); + if (!$this->hasResourceType($type)) { + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception("Invalid resource type $type; cannot load resource"); + } + if (empty($args)) { + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception("Cannot load resources; no resource specified"); + } + $resource = array_shift($args); + return $this->load($resource, $type); + } + + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception("Method '$method' is not supported"); + } + + /** + * Attempt to autoload a class + * + * @param string $class + * @return mixed False if not matched, otherwise result if include operation + */ + public function autoload($class) + { + $segments = explode('_', $class); + $namespaceTopLevel = $this->getNamespace(); + $namespace = ''; + + if (!empty($namespaceTopLevel)) { + $namespace = array_shift($segments); + if ($namespace != $namespaceTopLevel) { + // wrong prefix? we're done + return false; + } + } + + if (count($segments) < 2) { + // assumes all resources have a component and class name, minimum + return false; + } + + $final = array_pop($segments); + $component = $namespace; + $lastMatch = false; + do { + $segment = array_shift($segments); + $component .= empty($component) ? $segment : '_' . $segment; + if (isset($this->_components[$component])) { + $lastMatch = $component; + } + } while (count($segments)); + + if (!$lastMatch) { + return false; + } + + $final = substr($class, strlen($lastMatch)); + $path = $this->_components[$lastMatch]; + return include $path . '/' . str_replace('_', '/', $final) . '.php'; + } + + /** + * Set class state from options + * + * @param array $options + * @return Zend_Loader_Autoloader_Resource + */ + public function setOptions(array $options) + { + $methods = get_class_methods($this); + foreach ($options as $key => $value) { + $method = 'set' . ucfirst($key); + if (in_array($method, $methods)) { + $this->$method($value); + } + } + return $this; + } + + /** + * Set namespace that this autoloader handles + * + * @param string $namespace + * @return Zend_Loader_Autoloader_Resource + */ + public function setNamespace($namespace) + { + $this->_namespace = rtrim((string) $namespace, '_'); + return $this; + } + + /** + * Get namespace this autoloader handles + * + * @return string + */ + public function getNamespace() + { + return $this->_namespace; + } + + /** + * Set base path for this set of resources + * + * @param string $path + * @return Zend_Loader_Autoloader_Resource + */ + public function setBasePath($path) + { + $this->_basePath = (string) $path; + return $this; + } + + /** + * Get base path to this set of resources + * + * @return string + */ + public function getBasePath() + { + return $this->_basePath; + } + + /** + * Add resource type + * + * @param string $type identifier for the resource type being loaded + * @param string $path path relative to resource base path containing the resource types + * @param null|string $namespace sub-component namespace to append to base namespace that qualifies this resource type + * @return Zend_Loader_Autoloader_Resource + */ + public function addResourceType($type, $path, $namespace = null) + { + $type = strtolower($type); + if (!isset($this->_resourceTypes[$type])) { + if (null === $namespace) { + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception('Initial definition of a resource type must include a namespace'); + } + $namespaceTopLevel = $this->getNamespace(); + $namespace = ucfirst(trim($namespace, '_')); + $this->_resourceTypes[$type] = array( + 'namespace' => empty($namespaceTopLevel) ? $namespace : $namespaceTopLevel . '_' . $namespace, + ); + } + if (!is_string($path)) { + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception('Invalid path specification provided; must be string'); + } + $this->_resourceTypes[$type]['path'] = $this->getBasePath() . '/' . rtrim($path, '\/'); + + $component = $this->_resourceTypes[$type]['namespace']; + $this->_components[$component] = $this->_resourceTypes[$type]['path']; + return $this; + } + + /** + * Add multiple resources at once + * + * $types should be an associative array of resource type => specification + * pairs. Each specification should be an associative array containing + * minimally the 'path' key (specifying the path relative to the resource + * base path) and optionally the 'namespace' key (indicating the subcomponent + * namespace to append to the resource namespace). + * + * As an example: + * + * $loader->addResourceTypes(array( + * 'model' => array( + * 'path' => 'models', + * 'namespace' => 'Model', + * ), + * 'form' => array( + * 'path' => 'forms', + * 'namespace' => 'Form', + * ), + * )); + * + * + * @param array $types + * @return Zend_Loader_Autoloader_Resource + */ + public function addResourceTypes(array $types) + { + foreach ($types as $type => $spec) { + if (!is_array($spec)) { + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception('addResourceTypes() expects an array of arrays'); + } + if (!isset($spec['path'])) { + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception('addResourceTypes() expects each array to include a paths element'); + } + $paths = $spec['path']; + $namespace = null; + if (isset($spec['namespace'])) { + $namespace = $spec['namespace']; + } + $this->addResourceType($type, $paths, $namespace); + } + return $this; + } + + /** + * Overwrite existing and set multiple resource types at once + * + * @see Zend_Loader_Autoloader_Resource::addResourceTypes() + * @param array $types + * @return Zend_Loader_Autoloader_Resource + */ + public function setResourceTypes(array $types) + { + $this->clearResourceTypes(); + return $this->addResourceTypes($types); + } + + /** + * Retrieve resource type mappings + * + * @return array + */ + public function getResourceTypes() + { + return $this->_resourceTypes; + } + + /** + * Is the requested resource type defined? + * + * @param string $type + * @return bool + */ + public function hasResourceType($type) + { + return isset($this->_resourceTypes[$type]); + } + + /** + * Remove the requested resource type + * + * @param string $type + * @return Zend_Loader_Autoloader_Resource + */ + public function removeResourceType($type) + { + if ($this->hasResourceType($type)) { + $namespace = $this->_resourceTypes[$type]['namespace']; + unset($this->_components[$namespace]); + unset($this->_resourceTypes[$type]); + } + return $this; + } + + /** + * Clear all resource types + * + * @return Zend_Loader_Autoloader_Resource + */ + public function clearResourceTypes() + { + $this->_resourceTypes = array(); + $this->_components = array(); + return $this; + } + + /** + * Set default resource type to use when calling load() + * + * @param string $type + * @return Zend_Loader_Autoloader_Resource + */ + public function setDefaultResourceType($type) + { + if ($this->hasResourceType($type)) { + $this->_defaultResourceType = $type; + } + return $this; + } + + /** + * Get default resource type to use when calling load() + * + * @return string|null + */ + public function getDefaultResourceType() + { + return $this->_defaultResourceType; + } + + /** + * Object registry and factory + * + * Loads the requested resource of type $type (or uses the default resource + * type if none provided). If the resource has been loaded previously, + * returns the previous instance; otherwise, instantiates it. + * + * @param string $resource + * @param string $type + * @return object + * @throws Zend_Loader_Exception if resource type not specified or invalid + */ + public function load($resource, $type = null) + { + if (null === $type) { + $type = $this->getDefaultResourceType(); + if (empty($type)) { + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception('No resource type specified'); + } + } + if (!$this->hasResourceType($type)) { + require_once 'Zend/Loader/Exception.php'; + throw new Zend_Loader_Exception('Invalid resource type specified'); + } + $namespace = $this->_resourceTypes[$type]['namespace']; + $class = $namespace . '_' . ucfirst($resource); + if (!isset($this->_resources[$class])) { + $this->_resources[$class] = new $class; + } + return $this->_resources[$class]; + } +} diff --git a/lib/zend/Zend/Loader/Exception.php b/lib/zend/Zend/Loader/Exception.php new file mode 100644 index 0000000000..f1e01e3b74 --- /dev/null +++ b/lib/zend/Zend/Loader/Exception.php @@ -0,0 +1,35 @@ +_useStaticRegistry = $staticRegistryName; + if(!isset(self::$_staticPrefixToPaths[$staticRegistryName])) { + self::$_staticPrefixToPaths[$staticRegistryName] = array(); + } + if(!isset(self::$_staticLoadedPlugins[$staticRegistryName])) { + self::$_staticLoadedPlugins[$staticRegistryName] = array(); + } + } + + foreach ($prefixToPaths as $prefix => $path) { + $this->addPrefixPath($prefix, $path); + } + } + + /** + * Format prefix for internal use + * + * @param string $prefix + * @return string + */ + protected function _formatPrefix($prefix) + { + if($prefix == "") { + return $prefix; + } + return rtrim($prefix, '_') . '_'; + } + + /** + * Add prefixed paths to the registry of paths + * + * @param string $prefix + * @param string $path + * @return Zend_Loader_PluginLoader + */ + public function addPrefixPath($prefix, $path) + { + if (!is_string($prefix) || !is_string($path)) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Zend_Loader_PluginLoader::addPrefixPath() method only takes strings for prefix and path.'); + } + + $prefix = $this->_formatPrefix($prefix); + $path = rtrim($path, '/\\') . '/'; + + if ($this->_useStaticRegistry) { + self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix][] = $path; + } else { + if (!isset($this->_prefixToPaths[$prefix])) { + $this->_prefixToPaths[$prefix] = array(); + } + if (!in_array($path, $this->_prefixToPaths[$prefix])) { + $this->_prefixToPaths[$prefix][] = $path; + } + } + return $this; + } + + /** + * Get path stack + * + * @param string $prefix + * @return false|array False if prefix does not exist, array otherwise + */ + public function getPaths($prefix = null) + { + if ((null !== $prefix) && is_string($prefix)) { + $prefix = $this->_formatPrefix($prefix); + if ($this->_useStaticRegistry) { + if (isset(self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix])) { + return self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix]; + } + + return false; + } + + if (isset($this->_prefixToPaths[$prefix])) { + return $this->_prefixToPaths[$prefix]; + } + + return false; + } + + if ($this->_useStaticRegistry) { + return self::$_staticPrefixToPaths[$this->_useStaticRegistry]; + } + + return $this->_prefixToPaths; + } + + /** + * Clear path stack + * + * @param string $prefix + * @return bool False only if $prefix does not exist + */ + public function clearPaths($prefix = null) + { + if ((null !== $prefix) && is_string($prefix)) { + $prefix = $this->_formatPrefix($prefix); + if ($this->_useStaticRegistry) { + if (isset(self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix])) { + unset(self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix]); + return true; + } + + return false; + } + + if (isset($this->_prefixToPaths[$prefix])) { + unset($this->_prefixToPaths[$prefix]); + return true; + } + + return false; + } + + if ($this->_useStaticRegistry) { + self::$_staticPrefixToPaths[$this->_useStaticRegistry] = array(); + } else { + $this->_prefixToPaths = array(); + } + + return true; + } + + /** + * Remove a prefix (or prefixed-path) from the registry + * + * @param string $prefix + * @param string $path OPTIONAL + * @return Zend_Loader_PluginLoader + */ + public function removePrefixPath($prefix, $path = null) + { + $prefix = $this->_formatPrefix($prefix); + if ($this->_useStaticRegistry) { + $registry =& self::$_staticPrefixToPaths[$this->_useStaticRegistry]; + } else { + $registry =& $this->_prefixToPaths; + } + + if (!isset($registry[$prefix])) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Prefix ' . $prefix . ' was not found in the PluginLoader.'); + } + + if ($path != null) { + $pos = array_search($path, $registry[$prefix]); + if ($pos === null) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Prefix ' . $prefix . ' / Path ' . $path . ' was not found in the PluginLoader.'); + } + unset($registry[$prefix][$pos]); + } else { + unset($registry[$prefix]); + } + + return $this; + } + + /** + * Normalize plugin name + * + * @param string $name + * @return string + */ + protected function _formatName($name) + { + return ucfirst((string) $name); + } + + /** + * Whether or not a Plugin by a specific name is loaded + * + * @param string $name + * @return Zend_Loader_PluginLoader + */ + public function isLoaded($name) + { + $name = $this->_formatName($name); + if ($this->_useStaticRegistry) { + return isset(self::$_staticLoadedPlugins[$this->_useStaticRegistry][$name]); + } + + return isset($this->_loadedPlugins[$name]); + } + + /** + * Return full class name for a named plugin + * + * @param string $name + * @return string|false False if class not found, class name otherwise + */ + public function getClassName($name) + { + $name = $this->_formatName($name); + if ($this->_useStaticRegistry + && isset(self::$_staticLoadedPlugins[$this->_useStaticRegistry][$name]) + ) { + return self::$_staticLoadedPlugins[$this->_useStaticRegistry][$name]; + } elseif (isset($this->_loadedPlugins[$name])) { + return $this->_loadedPlugins[$name]; + } + + return false; + } + + /** + * Get path to plugin class + * + * @param mixed $name + * @return string|false False if not found + */ + public function getClassPath($name) + { + $name = $this->_formatName($name); + if ($this->_useStaticRegistry + && !empty(self::$_staticLoadedPluginPaths[$this->_useStaticRegistry][$name]) + ) { + return self::$_staticLoadedPluginPaths[$this->_useStaticRegistry][$name]; + } elseif (!empty($this->_loadedPluginPaths[$name])) { + return $this->_loadedPluginPaths[$name]; + } + + if ($this->isLoaded($name)) { + $class = $this->getClassName($name); + $r = new ReflectionClass($class); + $path = $r->getFileName(); + if ($this->_useStaticRegistry) { + self::$_staticLoadedPluginPaths[$this->_useStaticRegistry][$name] = $path; + } else { + $this->_loadedPluginPaths[$name] = $path; + } + return $path; + } + + return false; + } + + /** + * Load a plugin via the name provided + * + * @param string $name + * @param bool $throwExceptions Whether or not to throw exceptions if the + * class is not resolved + * @return string|false Class name of loaded class; false if $throwExceptions + * if false and no class found + * @throws Zend_Loader_Exception if class not found + */ + public function load($name, $throwExceptions = true) + { + $name = $this->_formatName($name); + if ($this->isLoaded($name)) { + return $this->getClassName($name); + } + + if ($this->_useStaticRegistry) { + $registry = self::$_staticPrefixToPaths[$this->_useStaticRegistry]; + } else { + $registry = $this->_prefixToPaths; + } + + $registry = array_reverse($registry, true); + $found = false; + $classFile = str_replace('_', DIRECTORY_SEPARATOR, $name) . '.php'; + $incFile = self::getIncludeFileCache(); + foreach ($registry as $prefix => $paths) { + $className = $prefix . $name; + + if (class_exists($className, false)) { + $found = true; + break; + } + + $paths = array_reverse($paths, true); + + foreach ($paths as $path) { + $loadFile = $path . $classFile; + if (Zend_Loader::isReadable($loadFile)) { + include_once $loadFile; + if (class_exists($className, false)) { + if (null !== $incFile) { + self::_appendIncFile($loadFile); + } + $found = true; + break 2; + } + } + } + } + + if (!$found) { + if (!$throwExceptions) { + return false; + } + + $message = "Plugin by name '$name' was not found in the registry; used paths:"; + foreach ($registry as $prefix => $paths) { + $message .= "\n$prefix: " . implode(PATH_SEPARATOR, $paths); + } + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception($message); + } + + if ($this->_useStaticRegistry) { + self::$_staticLoadedPlugins[$this->_useStaticRegistry][$name] = $className; + self::$_staticLoadedPluginPaths[$this->_useStaticRegistry][$name] = (isset($loadFile) ? $loadFile : ''); + } else { + $this->_loadedPlugins[$name] = $className; + $this->_loadedPluginPaths[$name] = (isset($loadFile) ? $loadFile : ''); + } + return $className; + } + + /** + * Set path to class file cache + * + * Specify a path to a file that will add include_once statements for each + * plugin class loaded. This is an opt-in feature for performance purposes. + * + * @param string $file + * @return void + * @throws Zend_Loader_PluginLoader_Exception if file is not writeable or path does not exist + */ + public static function setIncludeFileCache($file) + { + if (null === $file) { + self::$_includeFileCache = null; + return; + } + + if (!file_exists($file) && !file_exists(dirname($file))) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Specified file does not exist and/or directory does not exist (' . $file . ')'); + } + if (file_exists($file) && !is_writable($file)) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Specified file is not writeable (' . $file . ')'); + } + if (!file_exists($file) && file_exists(dirname($file)) && !is_writable(dirname($file))) { + require_once 'Zend/Loader/PluginLoader/Exception.php'; + throw new Zend_Loader_PluginLoader_Exception('Specified file is not writeable (' . $file . ')'); + } + + self::$_includeFileCache = $file; + } + + /** + * Retrieve class file cache path + * + * @return string|null + */ + public static function getIncludeFileCache() + { + return self::$_includeFileCache; + } + + /** + * Append an include_once statement to the class file cache + * + * @param string $incFile + * @return void + */ + protected static function _appendIncFile($incFile) + { + if (!file_exists(self::$_includeFileCache)) { + $file = ' + * test + * content + * content2 + * + * + * + * Case 1: _readFile('ar','/ldml/delimiter') -> returns [] = test + * Case 1: _readFile('ar','/ldml/second[@type=myone]') -> returns [] = content + * Case 2: _readFile('ar','/ldml/second','type') -> returns [myone] = content; [mysecond] = content2 + * Case 3: _readFile('ar','/ldml/delimiter',,'right') -> returns [right] = test + * Case 4: _readFile('ar','/ldml/third','type','myone') -> returns [myone] = mythird + * + * @param string $locale + * @param string $path + * @param string $attribute + * @param string $value + * @access private + * @return array + */ + private static function _readFile($locale, $path, $attribute, $value, $temp) + { + // without attribute - read all values + // with attribute - read only this value + if (!empty(self::$_ldml[(string) $locale])) { + + $result = self::$_ldml[(string) $locale]->xpath($path); + if (!empty($result)) { + foreach ($result as &$found) { + + if (empty($value)) { + + if (empty($attribute)) { + // Case 1 + $temp[] = (string) $found; + } else if (empty($temp[(string) $found[$attribute]])){ + // Case 2 + $temp[(string) $found[$attribute]] = (string) $found; + } + + } else if (empty ($temp[$value])) { + + if (empty($attribute)) { + // Case 3 + $temp[$value] = (string) $found; + } else { + // Case 4 + $temp[$value] = (string) $found[$attribute]; + } + + } + } + } + } + return $temp; + } + + /** + * Find possible routing to other path or locale + * + * @param string $locale + * @param string $path + * @param string $attribute + * @param string $value + * @param array $temp + * @throws Zend_Locale_Exception + * @access private + */ + private static function _findRoute($locale, $path, $attribute, $value, &$temp) + { + // load locale file if not already in cache + // needed for alias tag when referring to other locale + if (empty(self::$_ldml[(string) $locale])) { + $filename = dirname(__FILE__) . '/Data/' . $locale . '.xml'; + if (!file_exists($filename)) { + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception("Missing locale file '$filename' for '$locale' locale."); + } + + self::$_ldml[(string) $locale] = simplexml_load_file($filename); + } + + // search for 'alias' tag in the search path for redirection + $search = ''; + $tok = strtok($path, '/'); + + // parse the complete path + if (!empty(self::$_ldml[(string) $locale])) { + while ($tok !== false) { + $search .= '/' . $tok; + if (strpos($search, '[@') !== false) { + while (strrpos($search, '[@') > strrpos($search, ']')) { + $tok = strtok('/'); + if (empty($tok)) { + $search .= '/'; + } + $search = $search . '/' . $tok; + } + } + $result = self::$_ldml[(string) $locale]->xpath($search . '/alias'); + + // alias found + if (!empty($result)) { + + $source = $result[0]['source']; + $newpath = $result[0]['path']; + + // new path - path //ldml is to ignore + if ($newpath != '//ldml') { + // other path - parse to make real path + + while (substr($newpath,0,3) == '../') { + $newpath = substr($newpath, 3); + $search = substr($search, 0, strrpos($search, '/')); + } + + // truncate ../ to realpath otherwise problems with alias + $path = $search . '/' . $newpath; + while (($tok = strtok('/'))!== false) { + $path = $path . '/' . $tok; + } + } + + // reroute to other locale + if ($source != 'locale') { + $locale = $source; + } + + $temp = self::_getFile($locale, $path, $attribute, $value, $temp); + return false; + } + + $tok = strtok('/'); + } + } + return true; + } + + /** + * Read the right LDML file + * + * @param string $locale + * @param string $path + * @param string $attribute + * @param string $value + * @access private + */ + private static function _getFile($locale, $path, $attribute = false, $value = false, $temp = array()) + { + $result = self::_findRoute($locale, $path, $attribute, $value, $temp); + if ($result) { + $temp = self::_readFile($locale, $path, $attribute, $value, $temp); + } + + // parse required locales reversive + // example: when given zh_Hans_CN + // 1. -> zh_Hans_CN + // 2. -> zh_Hans + // 3. -> zh + // 4. -> root + if (($locale != 'root') && ($result)) { + $locale = substr($locale, 0, -strlen(strrchr($locale, '_'))); + if (!empty($locale)) { + $temp = self::_getFile($locale, $path, $attribute, $value, $temp); + } else { + $temp = self::_getFile('root', $path, $attribute, $value, $temp); + } + } + return $temp; + } + + /** + * Find the details for supplemental calendar datas + * + * @param string $locale Locale for Detaildata + * @param array $list List to search + * @return string Key for Detaildata + */ + private static function _calendarDetail($locale, $list) + { + $ret = "001"; + foreach ($list as $key => $value) { + if (strpos($locale, '_') !== false) { + $locale = substr($locale, strpos($locale, '_') + 1); + } + if (strpos($key, $locale) !== false) { + $ret = $key; + break; + } + } + return $ret; + } + + /** + * Internal function for checking the locale + * + * @param string|Zend_Locale $locale Locale to check + * @return string + */ + private static function _checkLocale($locale) + { + if (empty($locale)) { + $locale = new Zend_Locale(); + } + + if (!(Zend_Locale::isLocale((string) $locale, null, false))) { + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception("Locale (" . (string) $locale . ") is a unknown locale"); + } + + return (string) $locale; + } + + /** + * Read the LDML file, get a array of multipath defined value + * + * @param string $locale + * @param string $path + * @param string $value + * @return array + * @access public + */ + public static function getList($locale, $path, $value = false) + { + $locale = self::_checkLocale($locale); + + if (!isset(self::$_cache) && !self::$_cacheDisabled) { + require_once 'Zend/Cache.php'; + self::$_cache = Zend_Cache::factory( + 'Core', + 'File', + array('automatic_serialization' => true), + array()); + } + + $val = $value; + if (is_array($value)) { + $val = implode('_' , $value); + } + + $val = urlencode($val); + $id = strtr('Zend_LocaleL_' . $locale . '_' . $path . '_' . $val, array('-' => '_', '%' => '_', '+' => '_')); + if (!self::$_cacheDisabled && ($result = self::$_cache->load($id))) { + return unserialize($result); + } + + $temp = array(); + switch(strtolower($path)) { + case 'language': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/languages/language', 'type'); + break; + + case 'script': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/scripts/script', 'type'); + break; + + case 'territory': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/territories/territory', 'type'); + if ($value === 1) { + foreach($temp as $key => $value) { + if ((is_numeric($key) === false) and ($key != 'QO') and ($key != 'QU')) { + unset($temp[$key]); + } + } + } else if ($value === 2) { + foreach($temp as $key => $value) { + if (is_numeric($key) or ($key == 'QO') or ($key == 'QU')) { + unset($temp[$key]); + } + } + } + break; + + case 'variant': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/variants/variant', 'type'); + break; + + case 'key': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/keys/key', 'type'); + break; + + case 'type': + if (empty($type)) { + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/types/type', 'type'); + } else { + if (($value == 'calendar') or + ($value == 'collation') or + ($value == 'currency')) { + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/types/type[@key=\'' . $value . '\']', 'type'); + } else { + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/types/type[@type=\'' . $value . '\']', 'type'); + } + } + break; + + case 'layout': + $temp = self::_getFile($locale, '/ldml/layout/orientation', 'lines', 'lines'); + $temp += self::_getFile($locale, '/ldml/layout/orientation', 'characters', 'characters'); + $temp += self::_getFile($locale, '/ldml/layout/inList', '', 'inList'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'currency\']', '', 'currency'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'dayWidth\']', '', 'dayWidth'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'fields\']', '', 'fields'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'keys\']', '', 'keys'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'languages\']', '', 'languages'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'long\']', '', 'long'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'measurementSystemNames\']', '', 'measurementSystemNames'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'monthWidth\']', '', 'monthWidth'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'quarterWidth\']', '', 'quarterWidth'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'scripts\']', '', 'scripts'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'territories\']', '', 'territories'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'types\']', '', 'types'); + $temp += self::_getFile($locale, '/ldml/layout/inText[@type=\'variants\']', '', 'variants'); + break; + + case 'characters': + $temp = self::_getFile($locale, '/ldml/characters/exemplarCharacters', '', 'characters'); + $temp += self::_getFile($locale, '/ldml/characters/exemplarCharacters[@type=\'auxiliary\']', '', 'auxiliary'); + $temp += self::_getFile($locale, '/ldml/characters/exemplarCharacters[@type=\'currencySymbol\']', '', 'currencySymbol'); + break; + + case 'delimiters': + $temp = self::_getFile($locale, '/ldml/delimiters/quotationStart', '', 'quoteStart'); + $temp += self::_getFile($locale, '/ldml/delimiters/quotationEnd', '', 'quoteEnd'); + $temp += self::_getFile($locale, '/ldml/delimiters/alternateQuotationStart', '', 'quoteStartAlt'); + $temp += self::_getFile($locale, '/ldml/delimiters/alternateQuotationEnd', '', 'quoteEndAlt'); + break; + + case 'measurement': + $temp = self::_getFile('supplementalData', '/supplementalData/measurementData/measurementSystem[@type=\'metric\']', 'territories', 'metric'); + $temp += self::_getFile('supplementalData', '/supplementalData/measurementData/measurementSystem[@type=\'US\']', 'territories', 'US'); + $temp += self::_getFile('supplementalData', '/supplementalData/measurementData/paperSize[@type=\'A4\']', 'territories', 'A4'); + $temp += self::_getFile('supplementalData', '/supplementalData/measurementData/paperSize[@type=\'US-Letter\']', 'territories', 'US-Letter'); + break; + + case 'months': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/default', 'choice', 'context'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'format\']/default', 'choice', 'default'); + $temp['format']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'format\']/monthWidth[@type=\'abbreviated\']/month', 'type'); + $temp['format']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'format\']/monthWidth[@type=\'narrow\']/month', 'type'); + $temp['format']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'format\']/monthWidth[@type=\'wide\']/month', 'type'); + $temp['stand-alone']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'stand-alone\']/monthWidth[@type=\'abbreviated\']/month', 'type'); + $temp['stand-alone']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'stand-alone\']/monthWidth[@type=\'narrow\']/month', 'type'); + $temp['stand-alone']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'stand-alone\']/monthWidth[@type=\'wide\']/month', 'type'); + break; + + case 'month': + if (empty($value)) { + $value = array("gregorian", "format", "wide"); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/months/monthContext[@type=\'' . $value[1] . '\']/monthWidth[@type=\'' . $value[2] . '\']/month', 'type'); + break; + + case 'days': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/default', 'choice', 'context'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'format\']/default', 'choice', 'default'); + $temp['format']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'format\']/dayWidth[@type=\'abbreviated\']/day', 'type'); + $temp['format']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'format\']/dayWidth[@type=\'narrow\']/day', 'type'); + $temp['format']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'format\']/dayWidth[@type=\'wide\']/day', 'type'); + $temp['stand-alone']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'stand-alone\']/dayWidth[@type=\'abbreviated\']/day', 'type'); + $temp['stand-alone']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'stand-alone\']/dayWidth[@type=\'narrow\']/day', 'type'); + $temp['stand-alone']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'stand-alone\']/dayWidth[@type=\'wide\']/day', 'type'); + break; + + case 'day': + if (empty($value)) { + $value = array("gregorian", "format", "wide"); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/days/dayContext[@type=\'' . $value[1] . '\']/dayWidth[@type=\'' . $value[2] . '\']/day', 'type'); + break; + + case 'week': + $minDays = self::_calendarDetail($locale, self::_getFile('supplementalData', '/supplementalData/weekData/minDays', 'territories')); + $firstDay = self::_calendarDetail($locale, self::_getFile('supplementalData', '/supplementalData/weekData/firstDay', 'territories')); + $weekStart = self::_calendarDetail($locale, self::_getFile('supplementalData', '/supplementalData/weekData/weekendStart', 'territories')); + $weekEnd = self::_calendarDetail($locale, self::_getFile('supplementalData', '/supplementalData/weekData/weekendEnd', 'territories')); + + $temp = self::_getFile('supplementalData', "/supplementalData/weekData/minDays[@territories='" . $minDays . "']", 'count', 'minDays'); + $temp += self::_getFile('supplementalData', "/supplementalData/weekData/firstDay[@territories='" . $firstDay . "']", 'day', 'firstDay'); + $temp += self::_getFile('supplementalData', "/supplementalData/weekData/weekendStart[@territories='" . $weekStart . "']", 'day', 'weekendStart'); + $temp += self::_getFile('supplementalData', "/supplementalData/weekData/weekendEnd[@territories='" . $weekEnd . "']", 'day', 'weekendEnd'); + break; + + case 'quarters': + if (empty($value)) { + $value = "gregorian"; + } + $temp['format']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'format\']/quarterWidth[@type=\'abbreviated\']/quarter', 'type'); + $temp['format']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'format\']/quarterWidth[@type=\'narrow\']/quarter', 'type'); + $temp['format']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'format\']/quarterWidth[@type=\'wide\']/quarter', 'type'); + $temp['stand-alone']['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'stand-alone\']/quarterWidth[@type=\'abbreviated\']/quarter', 'type'); + $temp['stand-alone']['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'stand-alone\']/quarterWidth[@type=\'narrow\']/quarter', 'type'); + $temp['stand-alone']['wide'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/quarters/quarterContext[@type=\'stand-alone\']/quarterWidth[@type=\'wide\']/quarter', 'type'); + break; + + case 'quarter': + if (empty($value)) { + $value = array("gregorian", "format", "wide"); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/quarters/quarterContext[@type=\'' . $value[1] . '\']/quarterWidth[@type=\'' . $value[2] . '\']/quarter', 'type'); + break; + + case 'eras': + if (empty($value)) { + $value = "gregorian"; + } + $temp['names'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/eras/eraNames/era', 'type'); + $temp['abbreviated'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/eras/eraAbbr/era', 'type'); + $temp['narrow'] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/eras/eraNarrow/era', 'type'); + break; + + case 'era': + if (empty($value)) { + $value = array("gregorian", "Abbr"); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/eras/era' . $value[1] . '/era', 'type'); + break; + + case 'date': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'full\']/dateFormat/pattern', '', 'full'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'long\']/dateFormat/pattern', '', 'long'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'medium\']/dateFormat/pattern', '', 'medium'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'short\']/dateFormat/pattern', '', 'short'); + break; + + case 'time': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'full\']/timeFormat/pattern', '', 'full'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'long\']/timeFormat/pattern', '', 'long'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'medium\']/timeFormat/pattern', '', 'medium'); + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'short\']/timeFormat/pattern', '', 'short'); + break; + + case 'datetime': + if (empty($value)) { + $value = "gregorian"; + } + + $timefull = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'full\']/timeFormat/pattern', '', 'full'); + $timelong = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'long\']/timeFormat/pattern', '', 'long'); + $timemedi = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'medium\']/timeFormat/pattern', '', 'medi'); + $timeshor = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/timeFormatLength[@type=\'short\']/timeFormat/pattern', '', 'shor'); + + $datefull = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'full\']/dateFormat/pattern', '', 'full'); + $datelong = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'long\']/dateFormat/pattern', '', 'long'); + $datemedi = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'medium\']/dateFormat/pattern', '', 'medi'); + $dateshor = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/dateFormatLength[@type=\'short\']/dateFormat/pattern', '', 'shor'); + + $full = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateTimeFormats/dateTimeFormatLength[@type=\'full\']/dateTimeFormat/pattern', '', 'full'); + $long = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateTimeFormats/dateTimeFormatLength[@type=\'long\']/dateTimeFormat/pattern', '', 'long'); + $medi = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateTimeFormats/dateTimeFormatLength[@type=\'medium\']/dateTimeFormat/pattern', '', 'medi'); + $shor = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateTimeFormats/dateTimeFormatLength[@type=\'short\']/dateTimeFormat/pattern', '', 'shor'); + + $temp['full'] = str_replace(array('{0}', '{1}'), array($timefull['full'], $datefull['full']), $full['full']); + $temp['long'] = str_replace(array('{0}', '{1}'), array($timelong['long'], $datelong['long']), $long['long']); + $temp['medium'] = str_replace(array('{0}', '{1}'), array($timemedi['medi'], $datemedi['medi']), $medi['medi']); + $temp['short'] = str_replace(array('{0}', '{1}'), array($timeshor['shor'], $dateshor['shor']), $shor['shor']); + break; + + case 'dateitem': + if (empty($value)) { + $value = "gregorian"; + } + $_temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateTimeFormats/availableFormats/dateFormatItem', 'id'); + foreach($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateTimeFormats/availableFormats/dateFormatItem[@id=\'' . $key . '\']', '', $key); + } + break; + + case 'dateinterval': + if (empty($value)) { + $value = "gregorian"; + } + $_temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateTimeFormats/intervalFormats/intervalFormatItem', 'id'); + foreach($_temp as $key => $found) { + $temp[$key] = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateTimeFormats/intervalFormats/intervalFormatItem[@id=\'' . $key . '\']/greatestDifference', 'id'); + } + break; + + case 'field': + if (empty($value)) { + $value = "gregorian"; + } + $temp2 = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/fields/field', 'type'); + foreach ($temp2 as $key => $keyvalue) { + $temp += self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/fields/field[@type=\'' . $key . '\']/displayName', '', $key); + } + break; + + case 'relative': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/fields/field/relative', 'type'); + break; + + case 'symbols': + $temp = self::_getFile($locale, '/ldml/numbers/symbols/decimal', '', 'decimal'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/group', '', 'group'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/list', '', 'list'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/percentSign', '', 'percent'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/nativeZeroDigit', '', 'zero'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/patternDigit', '', 'pattern'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/plusSign', '', 'plus'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/minusSign', '', 'minus'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/exponential', '', 'exponent'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/perMille', '', 'mille'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/infinity', '', 'infinity'); + $temp += self::_getFile($locale, '/ldml/numbers/symbols/nan', '', 'nan'); + break; + + case 'nametocurrency': + $_temp = self::_getFile($locale, '/ldml/numbers/currencies/currency', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $key . '\']/displayName', '', $key); + } + break; + + case 'currencytoname': + $_temp = self::_getFile($locale, '/ldml/numbers/currencies/currency', 'type'); + foreach ($_temp as $key => $keyvalue) { + $val = self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $key . '\']/displayName', '', $key); + if (!isset($val[$key])) { + continue; + } + if (!isset($temp[$val[$key]])) { + $temp[$val[$key]] = $key; + } else { + $temp[$val[$key]] .= " " . $key; + } + } + break; + + case 'currencysymbol': + $_temp = self::_getFile($locale, '/ldml/numbers/currencies/currency', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $key . '\']/symbol', '', $key); + } + break; + + case 'question': + $temp = self::_getFile($locale, '/ldml/posix/messages/yesstr', '', 'yes'); + $temp += self::_getFile($locale, '/ldml/posix/messages/nostr', '', 'no'); + break; + + case 'currencyfraction': + $_temp = self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info', 'iso4217'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\'' . $key . '\']', 'digits', $key); + } + break; + + case 'currencyrounding': + $_temp = self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info', 'iso4217'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\'' . $key . '\']', 'rounding', $key); + } + break; + + case 'currencytoregion': + $_temp = self::_getFile('supplementalData', '/supplementalData/currencyData/region', 'iso3166'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\'' . $key . '\']/currency', 'iso4217', $key); + } + break; + + case 'regiontocurrency': + $_temp = self::_getFile('supplementalData', '/supplementalData/currencyData/region', 'iso3166'); + foreach ($_temp as $key => $keyvalue) { + $val = self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\'' . $key . '\']/currency', 'iso4217', $key); + if (!isset($val[$key])) { + continue; + } + if (!isset($temp[$val[$key]])) { + $temp[$val[$key]] = $key; + } else { + $temp[$val[$key]] .= " " . $key; + } + } + break; + + case 'regiontoterritory': + $_temp = self::_getFile('supplementalData', '/supplementalData/territoryContainment/group', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/territoryContainment/group[@type=\'' . $key . '\']', 'contains', $key); + } + break; + + case 'territorytoregion': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/territoryContainment/group', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/territoryContainment/group[@type=\'' . $key . '\']', 'contains', $key); + } + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'scripttolanguage': + $_temp = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'scripts', $key); + if (empty($temp[$key])) { + unset($temp[$key]); + } + } + break; + + case 'languagetoscript': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'scripts', $key); + } + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if (empty($found3)) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'territorytolanguage': + $_temp = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'territories', $key); + if (empty($temp[$key])) { + unset($temp[$key]); + } + } + break; + + case 'languagetoterritory': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'territories', $key); + } + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if (empty($found3)) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'timezonetowindows': + $_temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone', 'other'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone[@other=\'' . $key . '\']', 'type', $key); + } + break; + + case 'windowstotimezone': + $_temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone[@type=\'' .$key . '\']', 'other', $key); + } + break; + + case 'territorytotimezone': + $_temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem', 'type'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem[@type=\'' . $key . '\']', 'territory', $key); + } + break; + + case 'timezonetoterritory': + $_temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem', 'territory'); + foreach ($_temp as $key => $found) { + $temp += self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem[@territory=\'' . $key . '\']', 'type', $key); + } + break; + + case 'citytotimezone': + $_temp = self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type'); + foreach($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\'' . $key . '\']/exemplarCity', '', $key); + } + break; + + case 'timezonetocity': + $_temp = self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type'); + $temp = array(); + foreach($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\'' . $key . '\']/exemplarCity', '', $key); + if (!empty($temp[$key])) { + $temp[$temp[$key]] = $key; + } + unset($temp[$key]); + } + break; + + case 'phonetoterritory': + $_temp = self::_getFile('telephoneCodeData', '/supplementalData/telephoneCodeData/codesByTerritory', 'territory'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('telephoneCodeData', '/supplementalData/telephoneCodeData/codesByTerritory[@territory=\'' . $key . '\']/telephoneCountryCode', 'code', $key); + } + break; + + case 'territorytophone': + $_temp = self::_getFile('telephoneCodeData', '/supplementalData/telephoneCodeData/codesByTerritory', 'territory'); + foreach ($_temp as $key => $keyvalue) { + $val = self::_getFile('telephoneCodeData', '/supplementalData/telephoneCodeData/codesByTerritory[@territory=\'' . $key . '\']/telephoneCountryCode', 'code', $key); + if (!isset($val[$key])) { + continue; + } + if (!isset($temp[$val[$key]])) { + $temp[$val[$key]] = $key; + } else { + $temp[$val[$key]] .= " " . $key; + } + } + break; + + case 'numerictoterritory': + $_temp = self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes', 'type'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes[@type=\'' . $key . '\']', 'numeric', $key); + } + break; + + case 'territorytonumeric': + $_temp = self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes', 'numeric'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes[@numeric=\'' . $key . '\']', 'type', $key); + } + break; + + case 'alpha3toterritory': + $_temp = self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes', 'type'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes[@type=\'' . $key . '\']', 'alpha3', $key); + } + break; + + case 'territorytoalpha3': + $_temp = self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes', 'alpha3'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes[@alpha3=\'' . $key . '\']', 'type', $key); + } + break; + + case 'postaltoterritory': + $_temp = self::_getFile('postalCodeData', '/supplementalData/postalCodeData/postCodeRegex', 'territoryId'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('postalCodeData', '/supplementalData/postalCodeData/postCodeRegex[@territoryId=\'' . $key . '\']', 'territoryId'); + } + break; + + case 'numberingsystem': + $_temp = self::_getFile('numberingSystems', '/supplementalData/numberingSystems/numberingSystem', 'id'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('numberingSystems', '/supplementalData/numberingSystems/numberingSystem[@id=\'' . $key . '\']', 'digits', $key); + if (empty($temp[$key])) { + unset($temp[$key]); + } + } + break; + + case 'chartofallback': + $_temp = self::_getFile('characters', '/supplementalData/characters/character-fallback/character', 'value'); + foreach ($_temp as $key => $keyvalue) { + $temp2 = self::_getFile('characters', '/supplementalData/characters/character-fallback/character[@value=\'' . $key . '\']/substitute', '', $key); + $temp[current($temp2)] = $key; + } + break; + + case 'fallbacktochar': + $_temp = self::_getFile('characters', '/supplementalData/characters/character-fallback/character', 'value'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('characters', '/supplementalData/characters/character-fallback/character[@value=\'' . $key . '\']/substitute', '', $key); + } + break; + + case 'localeupgrade': + $_temp = self::_getFile('likelySubtags', '/supplementalData/likelySubtags/likelySubtag', 'from'); + foreach ($_temp as $key => $keyvalue) { + $temp += self::_getFile('likelySubtags', '/supplementalData/likelySubtags/likelySubtag[@from=\'' . $key . '\']', 'to', $key); + } + break; + + case 'unit': + $_temp = self::_getFile($locale, '/ldml/units/unit', 'type'); + foreach($_temp as $key => $keyvalue) { + $_temp2 = self::_getFile($locale, '/ldml/units/unit[@type=\'' . $key . '\']/unitPattern', 'count'); + $temp[$key] = $_temp2; + } + break; + + default : + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception("Unknown list ($path) for parsing locale data."); + break; + } + + if (isset(self::$_cache)) { + self::$_cache->save( serialize($temp), $id); + } + + return $temp; + } + + /** + * Read the LDML file, get a single path defined value + * + * @param string $locale + * @param string $path + * @param string $value + * @return string + * @access public + */ + public static function getContent($locale, $path, $value = false) + { + $locale = self::_checkLocale($locale); + + if (!isset(self::$_cache) && !self::$_cacheDisabled) { + require_once 'Zend/Cache.php'; + self::$_cache = Zend_Cache::factory( + 'Core', + 'File', + array('automatic_serialization' => true), + array()); + } + + $val = $value; + if (is_array($value)) { + $val = implode('_' , $value); + } + $val = urlencode($val); + $id = strtr('Zend_LocaleC_' . $locale . '_' . $path . '_' . $val, array('-' => '_', '%' => '_', '+' => '_')); + if (!self::$_cacheDisabled && ($result = self::$_cache->load($id))) { + return unserialize($result); + } + + switch(strtolower($path)) { + case 'language': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/languages/language[@type=\'' . $value . '\']', 'type'); + break; + + case 'script': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/scripts/script[@type=\'' . $value . '\']', 'type'); + break; + + case 'country': + case 'territory': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/territories/territory[@type=\'' . $value . '\']', 'type'); + break; + + case 'variant': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/variants/variant[@type=\'' . $value . '\']', 'type'); + break; + + case 'key': + $temp = self::_getFile($locale, '/ldml/localeDisplayNames/keys/key[@type=\'' . $value . '\']', 'type'); + break; + + case 'defaultcalendar': + $temp = self::_getFile($locale, '/ldml/dates/calendars/default', 'choice', 'default'); + break; + + case 'monthcontext': + if (empty ($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/default', 'choice', 'context'); + break; + + case 'defaultmonth': + if (empty ($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/months/monthContext[@type=\'format\']/default', 'choice', 'default'); + break; + + case 'month': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", "format", "wide", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/months/monthContext[@type=\'' . $value[1] . '\']/monthWidth[@type=\'' . $value[2] . '\']/month[@type=\'' . $value[3] . '\']', 'type'); + break; + + case 'daycontext': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/default', 'choice', 'context'); + break; + + case 'defaultday': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/days/dayContext[@type=\'format\']/default', 'choice', 'default'); + break; + + case 'day': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", "format", "wide", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/days/dayContext[@type=\'' . $value[1] . '\']/dayWidth[@type=\'' . $value[2] . '\']/day[@type=\'' . $value[3] . '\']', 'type'); + break; + + case 'quarter': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", "format", "wide", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/quarters/quarterContext[@type=\'' . $value[1] . '\']/quarterWidth[@type=\'' . $value[2] . '\']/quarter[@type=\'' . $value[3] . '\']', 'type'); + break; + + case 'am': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/am', '', 'am'); + break; + + case 'pm': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/pm', '', 'pm'); + break; + + case 'era': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", "Abbr", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/eras/era' . $value[1] . '/era[@type=\'' . $value[2] . '\']', 'type'); + break; + + case 'defaultdate': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/dateFormats/default', 'choice', 'default'); + break; + + case 'date': + if (empty($value)) { + $value = array("gregorian", "medium"); + } + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/dateFormats/dateFormatLength[@type=\'' . $value[1] . '\']/dateFormat/pattern', '', 'pattern'); + break; + + case 'defaulttime': + if (empty($value)) { + $value = "gregorian"; + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value . '\']/timeFormats/default', 'choice', 'default'); + break; + + case 'time': + if (empty($value)) { + $value = array("gregorian", "medium"); + } + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/timeFormats/timeFormatLength[@type=\'' . $value[1] . '\']/timeFormat/pattern', '', 'pattern'); + break; + + case 'datetime': + if (empty($value)) { + $value = array("gregorian", "medium"); + } + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp); + } + + $date = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/dateFormats/dateFormatLength[@type=\'' . $value[1] . '\']/dateFormat/pattern', '', 'pattern'); + $time = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/timeFormats/timeFormatLength[@type=\'' . $value[1] . '\']/timeFormat/pattern', '', 'pattern'); + $datetime = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/dateTimeFormats/dateTimeFormatLength[@type=\'' . $value[1] . '\']/dateTimeFormat/pattern', '', 'pattern'); + $temp = str_replace(array('{0}', '{1}'), array(current($time), current($date)), current($datetime)); + break; + + case 'dateitem': + if (empty($value)) { + $value = array("gregorian", "yyMMdd"); + } + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/dateTimeFormats/availableFormats/dateFormatItem[@id=\'' . $value[1] . '\']', ''); + break; + + case 'dateinterval': + if (empty($value)) { + $value = array("gregorian", "yMd", "y"); + } + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp, $temp[0]); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/dateTimeFormats/intervalFormats/intervalFormatItem[@id=\'' . $value[1] . '\']/greatestDifference[@id=\'' . $value[2] . '\']', ''); + break; + + case 'field': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/fields/field[@type=\'' . $value[1] . '\']/displayName', '', $value[1]); + break; + + case 'relative': + if (!is_array($value)) { + $temp = $value; + $value = array("gregorian", $temp); + } + $temp = self::_getFile($locale, '/ldml/dates/calendars/calendar[@type=\'' . $value[0] . '\']/fields/field/relative[@type=\'' . $value[1] . '\']', '', $value[1]); + break; + + case 'decimalnumber': + $temp = self::_getFile($locale, '/ldml/numbers/decimalFormats/decimalFormatLength/decimalFormat/pattern', '', 'default'); + break; + + case 'scientificnumber': + $temp = self::_getFile($locale, '/ldml/numbers/scientificFormats/scientificFormatLength/scientificFormat/pattern', '', 'default'); + break; + + case 'percentnumber': + $temp = self::_getFile($locale, '/ldml/numbers/percentFormats/percentFormatLength/percentFormat/pattern', '', 'default'); + break; + + case 'currencynumber': + $temp = self::_getFile($locale, '/ldml/numbers/currencyFormats/currencyFormatLength/currencyFormat/pattern', '', 'default'); + break; + + case 'nametocurrency': + $temp = self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $value . '\']/displayName', '', $value); + break; + + case 'currencytoname': + $temp = self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $value . '\']/displayName', '', $value); + $_temp = self::_getFile($locale, '/ldml/numbers/currencies/currency', 'type'); + $temp = array(); + foreach ($_temp as $key => $keyvalue) { + $val = self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $key . '\']/displayName', '', $key); + if (!isset($val[$key]) or ($val[$key] != $value)) { + continue; + } + if (!isset($temp[$val[$key]])) { + $temp[$val[$key]] = $key; + } else { + $temp[$val[$key]] .= " " . $key; + } + } + break; + + case 'currencysymbol': + $temp = self::_getFile($locale, '/ldml/numbers/currencies/currency[@type=\'' . $value . '\']/symbol', '', $value); + break; + + case 'question': + $temp = self::_getFile($locale, '/ldml/posix/messages/' . $value . 'str', '', $value); + break; + + case 'currencyfraction': + if (empty($value)) { + $value = "DEFAULT"; + } + $temp = self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\'' . $value . '\']', 'digits', 'digits'); + break; + + case 'currencyrounding': + if (empty($value)) { + $value = "DEFAULT"; + } + $temp = self::_getFile('supplementalData', '/supplementalData/currencyData/fractions/info[@iso4217=\'' . $value . '\']', 'rounding', 'rounding'); + break; + + case 'currencytoregion': + $temp = self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\'' . $value . '\']/currency', 'iso4217', $value); + break; + + case 'regiontocurrency': + $_temp = self::_getFile('supplementalData', '/supplementalData/currencyData/region', 'iso3166'); + $temp = array(); + foreach ($_temp as $key => $keyvalue) { + $val = self::_getFile('supplementalData', '/supplementalData/currencyData/region[@iso3166=\'' . $key . '\']/currency', 'iso4217', $key); + if (!isset($val[$key]) or ($val[$key] != $value)) { + continue; + } + if (!isset($temp[$val[$key]])) { + $temp[$val[$key]] = $key; + } else { + $temp[$val[$key]] .= " " . $key; + } + } + break; + + case 'regiontoterritory': + $temp = self::_getFile('supplementalData', '/supplementalData/territoryContainment/group[@type=\'' . $value . '\']', 'contains', $value); + break; + + case 'territorytoregion': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/territoryContainment/group', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/territoryContainment/group[@type=\'' . $key . '\']', 'contains', $key); + } + $temp = array(); + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if ($found3 !== $value) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'scripttolanguage': + $temp = self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $value . '\']', 'scripts', $value); + break; + + case 'languagetoscript': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'scripts', $key); + } + $temp = array(); + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if ($found3 !== $value) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'territorytolanguage': + $temp = self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $value . '\']', 'territories', $value); + break; + + case 'languagetoterritory': + $_temp2 = self::_getFile('supplementalData', '/supplementalData/languageData/language', 'type'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('supplementalData', '/supplementalData/languageData/language[@type=\'' . $key . '\']', 'territories', $key); + } + $temp = array(); + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if ($found3 !== $value) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'timezonetowindows': + $temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone[@other=\''.$value.'\']', 'type', $value); + break; + + case 'windowstotimezone': + $temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/mapTimezones[@type=\'windows\']/mapZone[@type=\''.$value.'\']', 'other', $value); + break; + + case 'territorytotimezone': + $temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem[@type=\'' . $value . '\']', 'territory', $value); + break; + + case 'timezonetoterritory': + $temp = self::_getFile('supplementalData', '/supplementalData/timezoneData/zoneFormatting/zoneItem[@territory=\'' . $value . '\']', 'type', $value); + break; + + case 'citytotimezone': + $temp = self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\'' . $value . '\']/exemplarCity', '', $value); + break; + + case 'timezonetocity': + $_temp = self::_getFile($locale, '/ldml/dates/timeZoneNames/zone', 'type'); + $temp = array(); + foreach($_temp as $key => $found) { + $temp += self::_getFile($locale, '/ldml/dates/timeZoneNames/zone[@type=\'' . $key . '\']/exemplarCity', '', $key); + if (!empty($temp[$key])) { + if ($temp[$key] == $value) { + $temp[$temp[$key]] = $key; + } + } + unset($temp[$key]); + } + break; + + case 'phonetoterritory': + $temp = self::_getFile('telephoneCodeData', '/supplementalData/telephoneCodeData/codesByTerritory[@territory=\'' . $value . '\']/telephoneCountryCode', 'code', $value); + break; + + case 'territorytophone': + $_temp2 = self::_getFile('telephoneCodeData', '/supplementalData/telephoneCodeData/codesByTerritory', 'territory'); + $_temp = array(); + foreach ($_temp2 as $key => $found) { + $_temp += self::_getFile('telephoneCodeData', '/supplementalData/telephoneCodeData/codesByTerritory[@territory=\'' . $key . '\']/telephoneCountryCode', 'code', $key); + } + $temp = array(); + foreach($_temp as $key => $found) { + $_temp3 = explode(" ", $found); + foreach($_temp3 as $found3) { + if ($found3 !== $value) { + continue; + } + if (!isset($temp[$found3])) { + $temp[$found3] = (string) $key; + } else { + $temp[$found3] .= " " . $key; + } + } + } + break; + + case 'numerictoterritory': + $temp = self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes[@type=\''.$value.'\']', 'numeric', $value); + break; + + case 'territorytonumeric': + $temp = self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes[@numeric=\''.$value.'\']', 'type', $value); + break; + + case 'alpha3toterritory': + $temp = self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes[@type=\''.$value.'\']', 'alpha3', $value); + break; + + case 'territorytoalpha3': + $temp = self::_getFile('supplementalData', '/supplementalData/codeMappings/territoryCodes[@alpha3=\''.$value.'\']', 'type', $value); + break; + + case 'postaltoterritory': + $temp = self::_getFile('postalCodeData', '/supplementalData/postalCodeData/postCodeRegex[@territoryId=\'' . $value . '\']', 'territoryId'); + break; + + case 'numberingsystem': + $temp = self::_getFile('numberingSystems', '/supplementalData/numberingSystems/numberingSystem[@id=\'' . strtolower($value) . '\']', 'digits', $value); + break; + + case 'chartofallback': + $_temp = self::_getFile('characters', '/supplementalData/characters/character-fallback/character', 'value'); + foreach ($_temp as $key => $keyvalue) { + $temp2 = self::_getFile('characters', '/supplementalData/characters/character-fallback/character[@value=\'' . $key . '\']/substitute', '', $key); + if (current($temp2) == $value) { + $temp = $key; + } + } + break; + + $temp = self::_getFile('characters', '/supplementalData/characters/character-fallback/character[@value=\'' . $value . '\']/substitute', '', $value); + break; + + case 'fallbacktochar': + $temp = self::_getFile('characters', '/supplementalData/characters/character-fallback/character[@value=\'' . $value . '\']/substitute', ''); + break; + + case 'localeupgrade': + $temp = self::_getFile('likelySubtags', '/supplementalData/likelySubtags/likelySubtag[@from=\'' . $value . '\']', 'to', $value); + break; + + case 'unit': + $temp = self::_getFile($locale, '/ldml/units/unit[@type=\'' . $value[0] . '\']/unitPattern[@count=\'' . $value[1] . '\']', ''); + break; + + default : + require_once 'Zend/Locale/Exception.php'; + throw new Zend_Locale_Exception("Unknown detail ($path) for parsing locale data."); + break; + } + + if (is_array($temp)) { + $temp = current($temp); + } + if (isset(self::$_cache)) { + self::$_cache->save( serialize($temp), $id); + } + + return $temp; + } + + /** + * Returns the set cache + * + * @return Zend_Cache_Core The set cache + */ + public static function getCache() + { + return self::$_cache; + } + + /** + * Set a cache for Zend_Locale_Data + * + * @param Zend_Cache_Core $cache A cache frontend + */ + public static function setCache(Zend_Cache_Core $cache) + { + self::$_cache = $cache; + } + + /** + * Returns true when a cache is set + * + * @return boolean + */ + public static function hasCache() + { + if (self::$_cache !== null) { + return true; + } + + return false; + } + + /** + * Removes any set cache + * + * @return void + */ + public static function removeCache() + { + self::$_cache = null; + } + + /** + * Clears all set cache data + * + * @return void + */ + public static function clearCache() + { + self::$_cache->clean(); + } + + /** + * Disables the cache + * + * @param unknown_type $flag + */ + public static function disableCache($flag) + { + self::$_cacheDisabled = (boolean) $flag; + } +} diff --git a/lib/zend/Zend/Locale/Data/Translation.php b/lib/zend/Zend/Locale/Data/Translation.php new file mode 100644 index 0000000000..c1d6b07c35 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/Translation.php @@ -0,0 +1,96 @@ + 'AU', + 'Austria' => 'AT', + 'Belgium' => 'BE', + 'Brazil' => 'BR', + 'Canada' => 'CA', + 'China' => 'CN', + 'Czech Republic' => 'CZ', + 'Denmark' => 'DK', + 'Finland' => 'FI', + 'France' => 'FR', + 'Germany' => 'DE', + 'Greece' => 'GR', + 'Hong Kong SAR' => 'HK', + 'Hungary' => 'HU', + 'Iceland' => 'IS', + 'Ireland' => 'IE', + 'Italy' => 'IT', + 'Japan' => 'JP', + 'Korea' => 'KP', + 'Mexiko' => 'MX', + 'The Netherlands' => 'NL', + 'New Zealand' => 'NZ', + 'Norway' => 'NO', + 'Poland' => 'PL', + 'Portugal' => 'PT', + 'Russia' => 'RU', + 'Singapore' => 'SG', + 'Slovakia' => 'SK', + 'Spain' => 'ES', + 'Sweden' => 'SE', + 'Taiwan' => 'TW', + 'Turkey' => 'TR', + 'United Kingdom' => 'GB', + 'United States' => 'US', + + 'Chinese' => 'zh', + 'Czech' => 'cs', + 'Danish' => 'da', + 'Dutch' => 'nl', + 'English' => 'en', + 'Finnish' => 'fi', + 'French' => 'fr', + 'German' => 'de', + 'Greek' => 'el', + 'Hungarian' => 'hu', + 'Icelandic' => 'is', + 'Italian' => 'it', + 'Japanese' => 'ja', + 'Korean' => 'ko', + 'Norwegian' => 'no', + 'Polish' => 'pl', + 'Portuguese' => 'pt', + 'Russian' => 'ru', + 'Slovak' => 'sk', + 'Spanish' => 'es', + 'Swedish' => 'sv', + 'Turkish' => 'tr' + ); +} diff --git a/lib/zend/Zend/Locale/Data/aa.xml b/lib/zend/Zend/Locale/Data/aa.xml new file mode 100644 index 0000000000..98e976d954 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/aa.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + Qafar + Arabic + German + English + Spanish + French + Hindi + Italian + Japanese + Portuguese + Russian + Chinese + + + + + + Brazil + China + Germany + Yabuuti + Eretria + Otobbia + France + United Kingdom + India + Italy + Japan + Russia + United States + + + + [a-z] + + + + + + + + Qun + Nah + Cig + Agd + Cax + Qas + Qad + Leq + Way + Dit + Xim + Kax + + + Qunxa Garablu + Kudo + Ciggilta Kudo + Agda Baxis + Caxah Alsa + Qasa Dirri + Qado Dirri + Liiqen + Waysu + Diteli + Ximoli + Kaxxa Garablu + + + + + Q + N + C + A + C + Q + Q + L + W + D + X + K + + + + + + + Aca + Etl + Tal + Arb + Kam + Gum + Sab + + + Acaada + Etleeni + Talaata + Arbaqa + Kamiisi + Gumqata + Sabti + + + + + A + E + T + A + K + G + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + saaku + carra + + + Yaasuusuk Duma + Yaasuusuk Wadir + + + + + + EEEE, MMMM dd, y + + + + + dd MMMM y + + + + + dd-MMM-y + + + + + dd/MM/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + diff --git a/lib/zend/Zend/Locale/Data/aa_DJ.xml b/lib/zend/Zend/Locale/Data/aa_DJ.xml new file mode 100644 index 0000000000..91f128f522 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/aa_DJ.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + Naharsi Kudo + Agda Baxisso + Leqeeni + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/aa_ER.xml b/lib/zend/Zend/Locale/Data/aa_ER.xml new file mode 100644 index 0000000000..bc79e536fe --- /dev/null +++ b/lib/zend/Zend/Locale/Data/aa_ER.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/aa_ER_SAAHO.xml b/lib/zend/Zend/Locale/Data/aa_ER_SAAHO.xml new file mode 100644 index 0000000000..aae4a0a79a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/aa_ER_SAAHO.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + Nab + San + Sal + Rab + Cam + Jum + Qun + + + Naba Sambat + Sani + Salus + Rabuq + Camus + Jumqata + Qunxa Sambat + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/aa_ET.xml b/lib/zend/Zend/Locale/Data/aa_ET.xml new file mode 100644 index 0000000000..d69fc154ce --- /dev/null +++ b/lib/zend/Zend/Locale/Data/aa_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/af.xml b/lib/zend/Zend/Locale/Data/af.xml new file mode 100644 index 0000000000..2a2f450632 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/af.xml @@ -0,0 +1,822 @@ + + + + + + + + + + + Afrikaans + Ander Afro-Asiaties + Amharies + Arabies + Aramees + Ander Kunsmatig + Assamees + Aserbeidjaans + Ander Balties + Wit-Russies + Berbers + Bulgaars + Bihari + Bengaals + Bantoe + Bretons + Bosnies + Katalaans + Ander Kelties + Cherokees + Kopties + Tsjeggies + Kerkslawies + Wallies + Deens + Duits + Antieke Egipties + Grieks + Engels + Esperanto + Spaans + Latyns-Amerikaanse Spaans + Estnies + Baskies + Persies + Fins + Filippyns + Fidjiaans + Faroëes + Frans + Fries + Iers + Skots-Gaelies + Ander Germaans + Galicies + Guarani + Goties + Antieke Grieks + Gujarati + Manx + Hebreeus + Hindi + Hetities + Kroaties + Hongaars + Armeens + Interlingua + Indonesies + Interlingue + Ander Indo-Europees + Yslands + Italiaans + Japannees + Javaans + Georgies + Ander Khoi-San + Khmer + Kannada + Koreaans + kru + Koerdies + Kornies + Kirgisies + Latyn + Limburgs + Lingala + Laotanees + Litaus + Letties + Masai + Malgassies + Macedonies + Malabaars + Mongalees + Mahratti + Maleisies + Maltees + Veelvuldige tale + Birmaans + Noord-Ndebele + Nepalees + Nederlands + Vlaams + Noorweegse Nynorsk + Noors + Suid-Ndebele + Sepedi + Occitaans + Oria + Pandjabi + Fenisies + Pools + Pasjtoe + Portugees + Brasiliaanse Portugees + Roemeens + Russies + Sanskrit + Skots + Sindhi + Ander Semities + Gebaretaal + Serwo-Kroaties + Singalees + Slowaaks + Sloweens + Ander Slawies + Shona + Somalies + Albanees + Serwies + Swazi + Suid-Sotho + Soedanees + Sweeds + Swahili + Tamil + Telugees + Thais + Tigrinya + Turkmeens + Klingon + Tswana + Turks + Tsonga + Twi + Uighoers + Oekraïens + Onbepaald + Oerdoe + Oesbekies + Venda + Viëtnamees + Xhosa + Jiddisj + Sjinees + Vereenvoudigde Sjinees + Tradisionele Sjinees + Zoeloe + + + + + + + + + + + + + + + + + + + + + + + + + + + Wêreld + Afrika + Suid-Amerika + Oseanië + Wes-Afrika + Sentraal-Amerika + Oos-Afrika + Noord-Afrika + Midde-Afrika + Suider-Afrika + Amerikas + Noord-Amerika + Karibies + Oos-Asië + Suid-Asië + Suidoos-Asië + Suid-Europa + Australië en Nieu-Seeland + Melanesië + Polinesië + Asië + Sentraal-Asië + Wes-Asië + Europa + Oos-Europa + Noord-Europa + Wes-Europa + Statebond + Andorra + Verenigde Arabiese Emirate + Afganistan + Antigua en Barbuda + Albanië + Armenië + Nederlands-Antille + Angola + Antarktika + Argentinië + Amerikaans Samoa + Oostenryk + Australië + Aserbeidjan + Bosnië en Herzegowina + Bangladesj + België + Boerkina Fasso + Bulgarye + Bahrein + Benin + Broenei + Bolivië + Brasilië + Bahamas + Bhoetan + Botswana + Wit-Rusland + Kanada + Sentraal-Afrikaanse Republiek + Kongo + Switserland + Ivoorkus + Chili + Kameroen + Sjina + Costa Rica + Serwië en Montenegro + Kuba + Kaap Verde + Ciprus + Tjeggiese Republiek + Duitsland + Djiboeti + Denemarke + Dominikaanse Republiek + Algerië + Estland + Egipte + Wes-Sahara + Spanje + Ethiopië + Finland + Fidji + Falklandeilande + Mikronesië + Faroëreilande + Frankryk + Gaboen + Groot-Brittanje + Georgië + Frans-Guyana + Ghana + Groenland + Gambië + Guinee + Ekwatoriaal-Guinee + Griekeland + Guinee-Bissau + Hongkong + Kroasië + Haïti + Hongarye + Indonesië + Ierland + Israel + Indië + Irak + Iran + Ysland + Italië + Jamaika + Jordanië + Japan + Kenia + Kirgisië + Kambodja + Comore + Saint Kitts en Nevis + Noord-Korea + Suid-Korea + Koeweit + Kaaimanseilande + Kasakstan + Laos + Libanon + Liechtenstein + Sri Lanka + Liberië + Lesotho + Litaue + Luxemburg + Letland + Libië + Marokko + Monaco + Madagaskar + Marshall-eilande + Macedonië + Mali + Mongolië + Macao + Mouritanië + Malta + Mauritius + Maldive + Meksiko + Maleisië + Mosambiek + Namibië + Nieu-Kaledonië + Niger + Nigerië + Nicaragua + Nederland + Noorweë + Naoeroe + Nieu-Seeland + Oman + Panama + Peru + Papoea Nieu-Guinee + Filippyne + Pakistan + Pole + Puerto Rico + Portugal + Paraguay + Katar + Réunion + Roemenië + Rusland + Rwanda + Saoedi-Arabië + Solomon Eilande + Seychelle + Soedan + Swede + Singapoer + Slowenië + Slowakye + Sierra Leone + San Marino + Senegal + Somalië + Suriname + Sao Tome en Principe + Salvador + Sirië + Swaziland + Tsjaad + Thailand + Tadjikistan + Turkmenië + Tunisië + Tonga + Turkye + Trinidad en Tobago + Taiwan + Tanzanië + Oekraine + Uganda + Verenigde State van Amerika + Oesbekistan + Vatikaan + Saint Vincent en die Grenadine + Venezuela + Viëtnam + Samoa + Jemen + Suid-Afrika + Zambië + Zimbabwe + + + Tradisionele Duitse ortografie + Duitse ortografie van 1996 + Hersiene ortografie + + + Kalender + Vergelyking + Geldeenheid + + + Tradisionele Sjinees (Groot5) + Sjinese kalender + Vereenvoudigde Sjinees + Gregoriaanse kalender + Hebreeuse kalender + Islamitiese kalender + Japannese kalender + Telefoongidsvolgorde + Tradisioneel + + + VSA + Metriek + + + Taal: {0} + Skrif: {0} + Omgewing: {0} + + + + [a á â b-e é è ê ë f-i î ï j-o ô ö p-u û v-z] + [à å-ç ñ ø œ ß] + [a-z] + + + ‘ + ’ + “ + ” + + + + + + + + Jan + Feb + Mar + Apr + Mei + Jun + Jul + Aug + Sep + Okt + Nov + Des + + + Januarie + Februarie + Maart + April + Mei + Junie + Julie + Augustus + September + Oktober + November + Desember + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + So + Ma + Di + Wo + Do + Vr + Sa + + + Sondag + Maandag + Dinsdag + Woensdag + Donderdag + Vrydag + Saterdag + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + 1ste kwartaal + 2de kwartaal + 3de kwartaal + 4de kwartaal + + + + vm. + nm. + + + voor Christus + na Christus + + + v.C. + n.C. + + + + + + EEEE dd MMMM y + + + + + dd MMMM y + + + + + dd MMM y + + + + + yyyy/MM/dd + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + d MMMM + dd MMMM + MM/dd + Q yy + yyyy/MM + MMMM y + + + {0} - {1} + + M-M + + + E, MM-dd - E, MM-dd + E, MM-dd - E, MM-dd + + + MMM-MMM + + + E, MMM d - E, MMM d + E, MMM d - E, MMM d + + + MMM d - MMM d + MMM d-d + + + MM-dd - MM-dd + MM-dd - MM-dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + yyyy-MM - yyyy-MM + yyyy-MM - yyyy-MM + + + E, yyyy-MM-dd - E, yyyy-MM-dd + E, yyyy-MM-dd - E, yyyy-MM-dd + E, yyyy-MM-dd - E, yyyy-MM-dd + + + y MMM-MMM + y MMM - y MMM + + + E, y MMM dd - E, y MMM dd + E, y MMM dd - E, y MMM dd + E, y MMM dd - E, y MMM dd + + + y MMM d - MMM d + y MMM d-d + y MMM d - y MMM d + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + + + + + + Tydperk + + + Jaar + + + Maand + + + Week + + + Dag + + + Dag van die week + + + Uur + + + Minuut + + + Sekonde + + + Tydsone + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Suidpool + + + Bagrein + + + Sjanghai + + + Mexikostad + + + Lissabon + + + Moskou + + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + Reaal + + + Switserse frank + + + Joean + + + Euro + + + Britse pond + + + Italiaanse lier + + + Japannese jen + + + Namibiese dollar + + + Roebel + + + Ou Turkse lier + + + Turkse lier + + + Amerikaanse dollar + + + Onbekende of ongeldige geldeenheid + + + Rand + + + + + + ja:j + nee:n + + + + diff --git a/lib/zend/Zend/Locale/Data/af_NA.xml b/lib/zend/Zend/Locale/Data/af_NA.xml new file mode 100644 index 0000000000..b96798af21 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/af_NA.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + yyyy-MM-dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + MM-dd + yyyy-MM + + + + + + + + + + ¤ #,##0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/af_ZA.xml b/lib/zend/Zend/Locale/Data/af_ZA.xml new file mode 100644 index 0000000000..86030ac891 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/af_ZA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ak.xml b/lib/zend/Zend/Locale/Data/ak.xml new file mode 100644 index 0000000000..b5e077ae48 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ak.xml @@ -0,0 +1,190 @@ + + + + + + + + + + [a b d e ɛ f-i k-o ɔ p r-u w y] + [c j q v z] + + + + + + + + S-Ɔ + K-Ɔ + E-Ɔ + E-O + E-K + O-A + A-K + D-Ɔ + F-Ɛ + Ɔ-A + Ɔ-O + M-Ɔ + + + Sanda-Ɔpɛpɔn + Kwakwar-Ɔgyefuo + Ebɔw-Ɔbenem + Ebɔbira-Oforisuo + Esusow Aketseaba-Kɔtɔnimba + Obirade-Ayɛwohomumu + Ayɛwoho-Kitawonsa + Difuu-Ɔsandaa + Fankwa-Ɛbɔ + Ɔbɛsɛ-Ahinime + Ɔberɛfɛw-Obubuo + Mumu-Ɔpɛnimba + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Kwe + Dwo + Ben + Wuk + Yaw + Fia + Mem + + + Kwesida + Dwowda + Benada + Wukuda + Yawda + Fida + Memeneda + + + + + K + D + B + W + Y + F + M + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AN + EW + + + Ansa Kristo + Kristo Ekyiri + + + AK + KE + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Sidi + + + + + diff --git a/lib/zend/Zend/Locale/Data/ak_GH.xml b/lib/zend/Zend/Locale/Data/ak_GH.xml new file mode 100644 index 0000000000..f0210566be --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ak_GH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/am.xml b/lib/zend/Zend/Locale/Data/am.xml new file mode 100644 index 0000000000..b4112f11d9 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/am.xml @@ -0,0 +1,1409 @@ + + + + + + + + + + + አፋርኛ + አብሐዚኛ + አፍሪካንስኛ + አማርኛ + ዐርቢኛ + አሳሜዛዊ + አያማርኛ + አዜርባይጃንኛ + ባስኪርኛ + ቤላራሻኛ + ቡልጋሪኛ + ቢሃሪ + ቢስላምኛ + በንጋሊኛ + ትበትንኛ + ብሬቶንኛ + ቦስኒያንኛ + ብሊን + ካታላንኛ + ኮርሲካኛ + ቼክኛ + ወልሽ + ዴኒሽ + ጀርመን + ድዞንግኻኛ + ግሪክኛ + እንግሊዝኛ + ኤስፐራንቶ + ስፓኒሽ + ኤስቶኒአን + ባስክኛ + ፐርሲያኛ + ፊኒሽ + ፊሊፕንኛ + ፊጂኛ + ፋሮኛ + ፈረንሳይኛ + ፍሪስኛ + አይሪሽ + እስኮትስ ጌልክኛ + ግዕዝኛ + ጋለጋኛ + ጓራኒኛ + ጉጃርቲኛ + ሃውሳኛ + ዕብራስጥ + ሐንድኛ + ክሮሽያንኛ + ሀንጋሪኛ + አርመናዊ + ኢንቴርሊንጓ + እንዶኒሲኛ + እንተርሊንግወ + እኑፒያቅኛ + አይስላንድኛ + ጣሊያንኛ + እኑክቲቱትኛ + ጃፓንኛ + ጃቫንኛ + ጊዮርጊያን + ካዛክኛ + ካላሊሱትኛ + ክመርኛ + ካናዳኛ + ኮሪያኛ + ካሽሚርኛ + ኩርድሽኛ + ኪርጊዝኛ + ላቲንኛ + ሊንጋላኛ + ላውስኛ + ሊቱአኒያን + ላትቪያን + ማላጋስኛ + ማዮሪኛ + ማከዶኒኛ + ማላያላምኛ + ሞንጎላዊኛ + ሞልዳቫዊና + ማራዚኛ + ማላይኛ + ማልቲስኛ + ቡርማኛ + ናኡሩ + ኔፓሊኛ + ደች + የኖርዌ አዲሱ ኖርዌጅያንኛ + ኖርዌጂያን + ኦኪታንኛ + ኦሮምኛ + ኦሪያኛ + ፓንጃቢኛ + ፖሊሽ + ፑሽቶኛ + ፖርቱጋሊኛ + ፖርቱጋሊኛ (የብራዚል) + ፖርቱጋሊኛ (የፖርቱጋል) + ኵቿኛ + ሮማንስ + ሩንዲኛ + ሮማኒያን + ራሽኛ + ኪንያርዋንድኛ + ሳንስክሪትኛ + ሲንድሂኛ + ሳንጎኛ + ሰርቦ-ክሮኤሽያኛ + ስንሃልኛ + ሲዳምኛ + ስሎቫክኛ + ስሎቪኛ + ሳሞአኛ + ሾናኛ + ሱማልኛ + ልቤኒኛ + ሰርቢኛ + ስዋቲኛ + ሶዞኛ + ሱዳንኛ + ስዊድንኛ + ስዋሂሊኛ + ታሚልኛ + ተሉጉኛ + ታጂኪኛ + ታይኛ + ትግርኛ + ትግረ + ቱርክመንኛ + ታጋሎገኛ + ክሊንግኦንኛ + ጽዋናዊኛ + ቶንጋ + ቱርክኛ + ጾንጋኛ + ታታርኛ + ትዊኛ + ኡዊግሁርኛ + ዩክረኒኛ + ያልተወሰነ + ኡርዱኛ + ኡዝበክኛ + ቪትናምኛ + ቮላፑክኛ + ዎሎፍኛ + ዞሳኛ + ይዲሻዊኛ + ዮሩባዊኛ + ዡዋንግኛ + ቻይንኛ + ዙሉኛ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ዓለም + አፍሪካ + ደቡባዊ አሜሪካ + ኦሽኒያ + ምዕራባዊ አፍሪካ + መካከለኛ አሜሪካ [013] + ምስራቃዊ አፍሪካ + ሰሜናዊ አፍሪካ + መካከለኛ አፍሪካ + ደቡባዊ አፍሪካ + አሜሪካዎች + ሰሜናዊ አሜሪካ + ካሪቢያን + ደቡብ-ምሥራቃዊ እስያ [030] + ምሥራቃዊ እስያ + ደቡብ-ምሥራቃዊ እስያ [035] + ደቡባዊ አውሮፓ + አውስትራሊያ እና ኒው ዚላንድ + ሜላኔሲያ + ሚክሮኔዢያ [057] + ፖሊኔዢያ + እስያ + መካከለኛ አሜሪካ [143] + ምዕራባዊ እስያ + አውሮፓ + ምስራቃዊ አውሮፓ + ሰሜናዊ አውሮፓ + ምዕራባዊ አውሮፓ + አንዶራ + የተባበሩት አረብ ኤምሬትስ + አፍጋኒስታን + አንቲጓ እና ባሩዳ + አንጉኢላ + አልባኒያ + አርሜኒያ + ኔዘርላንድስ አንቲልስ + አንጐላ + አንታርክቲካ + አርጀንቲና + የአሜሪካ ሳሞአ + ኦስትሪያ + አውስትሬሊያ + አሩባ + የአላንድ ደሴቶች + አዘርባጃን + ቦስኒያ እና ሄርዞጎቪኒያ + ባርቤዶስ + ባንግላዲሽ + ቤልጄም + ቡርኪና ፋሶ + ቡልጌሪያ + ባህሬን + ብሩንዲ + ቤኒን + ቤርሙዳ + ብሩኒ + ቦሊቪያ + ብራዚል + ባሃማስ + ቡህታን + የቦውቬት ደሴት + ቦትስዋና + ቤላሩስ + ቤሊዘ + ካናዳ + ኮኮስ ኬሊንግ ደሴቶች + ኮንጎ + የመካከለኛው አፍሪካ ሪፐብሊክ + ኮንጐ + ስዊዘርላንድ + ኮት ዲቯር + ኩክ ደሴቶች + ቺሊ + ካሜሩን + ቻይና + ኮሎምቢያ + ኮስታ ሪካ + ሰርቢያ + ኩባ + ኬፕ ቬርዴ + የገና ደሴቶች + ሳይፕረስ + ቼክ ሪፑብሊክ + ጀርመን + ጂቡቲ + ዴንማርክ + ዶሚኒካ + ዶሚኒክ ሪፑብሊክ + አልጄሪያ + ኢኳዶር + ኤስቶኒያ + ግብጽ + ምዕራባዊ ሳህራ + ኤርትራ + ስፔን + ኢትዮጵያ + ፊንላንድ + ፊጂ + የፎልክላንድ ደሴቶች + ሚክሮኔዢያ + የፋሮይ ደሴቶች + ፈረንሳይ + ጋቦን + እንግሊዝ + ግሬናዳ + ጆርጂያ + የፈረንሳይ ጉዊአና + ጋና + ጊብራልታር + ግሪንላንድ + ጋምቢያ + ጊኒ + ጉዋደሉፕ + ኢኳቶሪያል ጊኒ + ግሪክ + ደቡብ ጆርጂያ እና የደቡድ ሳንድዊች ደሴቶች + ጉዋቲማላ + ጉዋም + ቢሳዎ + ጉያና + ሆንግ ኮንግ + የኧርድ እና የማክዶናልድ ደሴቶች + ሆንዱራስ + ክሮኤሽያ + ሀይቲ + ሀንጋሪ + ኢንዶኔዢያ + አየርላንድ + እስራኤል + ህንድ + የብሪታኒያ ህንድ ውቂያኖስ ግዛት + ኢራቅ + ኢራን + አይስላንድ + ጣሊያን + ጃማይካ + ጆርዳን + ጃፓን + ኬንያ + ካምቦዲያ + ኪሪባቲ + ኮሞሮስ + ቅዱስ ኪትስ እና ኔቪስ + ሰሜን ኮሪያ + ደቡብ ኮሪያ + ክዌት + ካይማን ደሴቶች + ላኦስ + ሊባኖስ + ሴንት ሉቺያ + ሊችተንስታይን + ሲሪላንካ + ላይቤሪያ + ሌሶቶ + ሊቱዌኒያ + ሉክሰምበርግ + ላትቪያ + ሊቢያ + ሞሮኮ + ሞናኮ + ሞልዶቫ + ማዳጋስካር + ማርሻል አይላንድ + ማከዶኒያ + ማሊ + ማያንማር + ሞንጎሊያ + ማካዎ + የሰሜናዊ ማሪያና ደሴቶች + ማርቲኒክ + ሞሪቴኒያ + ሞንትሴራት + ማልታ + ማሩሸስ + ማልዲቭስ + ማላዊ + ሜክሲኮ + ማሌዢያ + ሞዛምቢክ + ናሚቢያ + ኒው ካሌዶኒያ + ኒጀር + ኖርፎልክ ደሴት + ናይጄሪያ + ኒካራጓ + ኔዘርላንድ + ኖርዌ + ኔፓል + ናኡሩ + ኒኡይ + ኒው ዚላንድ + ኦማን + ፓናማ + ፔሩ + የፈረንሳይ ፖሊኔዢያ + ፓፑዋ ኒው ጊኒ + ፊሊፒንስ + ፓኪስታን + ፖላንድ + ቅዱስ ፒዬር እና ሚኩኤሎን + ፒትካኢርን + ፖርታ ሪኮ + የፍልስጤም ግዛት + ፖርቱጋል + ፓላው + ፓራጓይ + ኳታር + ወጣ ያለ ኦሽኒያ + ሪዩኒየን + ሮሜኒያ + ራሺያ + ሩዋንዳ + ሳውድአረቢያ + ሰሎሞን ደሴት + ሲሼልስ + ሱዳን + ስዊድን + ሲንጋፖር + ሴንት ሄለና + ስሎቬኒያ + የስቫልባርድ እና ዣን ማየን ደሴቶች + ስሎቫኪያ + ሴራሊዮን + ሳን ማሪኖ + ሴኔጋል + ሱማሌ + ሱሪናም + ሳኦ ቶሜ እና ፕሪንሲፔ + ኤል ሳልቫዶር + ሲሪያ + ሱዋዚላንድ + የቱርኮችና የካኢኮስ ደሴቶች + ቻድ + የፈረንሳይ ደቡባዊ ግዛቶች + ቶጐ + ታይላንድ + ታጃኪስታን + ቶክላው + ምስራቅ ቲሞር + ቱርክሜኒስታን + ቱኒዚያ + ቶንጋ + ቱርክ + ትሪኒዳድ እና ቶባጎ + ቱቫሉ + ታይዋን + ታንዛኒያ + ዩክሬን + ዩጋንዳ + የአሜሪካ ራቅ ያሉ አናሳ ደሴቶች + አሜሪካ + ኡራጓይ + ዩዝበኪስታን + ቫቲካን + ቅዱስ ቪንሴንት እና ግሬናዲንስ + ቬንዙዌላ + የእንግሊዝ ድንግል ደሴቶች + የአሜሪካ ቨርጂን ደሴቶች + ቬትናም + ቫኑአቱ + ዋሊስ እና ፉቱና ደሴቶች + ሳሞአ + የመን + ሜይኦቴ + ደቡብ አፍሪካ + ዛምቢያ + ዚምቧቤ + + + የቀን መቁጠሪያ + የጽሑፎች ንፅፅር + ገንዘብ + + + የቻይና ባህላዊ ቅደም ተከተል (Big5) + የቡድሐ የቀን መቁጠሪያ + የቻይና የቀን መቁጠሪያ + ቀጥታ የቃላት ንፅፅር + የቀለል ያለ ቻይንኛ (GB2312) ቅደም ተከተል + የግሪጐሪ የቀን መቁጠሪያ + የእብራይስጥ የቀን መቁጠሪያ + የእስላም የቀን መቁጠሪያ + የእስላም ሕዝባዊ የቀን መቁጠሪያ + የጃፓን የቀን መቁጠሪያ + የስልክ ማውጫ ቅደም ተከተል + የፒንዪን ቅደም ተከተል + የጭረት/የመቀቢያ ቅደም ተከተል + ባህላዊ ቅደም ተከተል + + + ሜትሪክ + + + + [\u135F ሀ-ሆ ለ-ቆ ቈ ቊ-ቍ በ-ኆ ኈ ኊ-ኍ ነ-ኮ ኰ ኲ-ኵ ኸ-ኾ ወ-ዎ ዐ-ዖ ዘ-ዷ ጀ-ጎ ጐ ጒ-ጕ ጠ-ፚ] + [᎐-᎙ ሇ ⶀ ᎀ-ᎃ ⶁ-ⶄ ቇ ቐ-ቖ ቘ ቚ-ቝ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዀ ዂ-ዅ ዏ ⶋ ⶌ ዸ-ዿ ⶍ ⶎ ጏ ጘ-ጟ ⶓ-ⶖ ⶏ-ⶑ ᎈ-ᎏ ⶒ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + « + » + ‹ + › + + + + + + + ዓ/ዓ + ዓ/ም + + + + + + + + መስከ + ጥቅም + ኅዳር + ታኅሣ + ጥር + የካቲ + መጋቢ + ሚያዝ + ግንቦ + ሰኔ + ሐምሌ + ነሐሴ + ጳጉሜ + + + መስከረም + ጥቅምት + ኅዳር + ታኅሣሥ + ጥር + የካቲት + መጋቢት + ሚያዝያ + ግንቦት + ሰኔ + ሐምሌ + ነሐሴ + ጳጉሜን + + + + + + + + + ጃንዩ + ፌብሩ + ማርች + ኤፕረ + ሜይ + ጁን + ጁላይ + ኦገስ + ሴፕቴ + ኦክተ + ኖቬም + ዲሴም + + + ጃንዩወሪ + ፌብሩወሪ + ማርች + ኤፕረል + ሜይ + ጁን + ጁላይ + ኦገስት + ሴፕቴምበር + ኦክተውበር + ኖቬምበር + ዲሴምበር + + + + + ጃ + ፌ + ማ + ኤ + ሜ + ጁ + ጁ + ኦ + ሴ + ኦ + ኖ + ዲ + + + + + + + እሑድ + ሰኞ + ማክሰ + ረቡዕ + ሐሙስ + ዓርብ + ቅዳሜ + + + እሑድ + ሰኞ + ማክሰኞ + ረቡዕ + ሐሙስ + ዓርብ + ቅዳሜ + + + + + እ + ሰ + ማ + ረ + ሐ + ዓ + ቅ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ጡዋት + ከሳዓት + + + ዓ/ዓ + ዓ/ም + + + + + + EEEE፣ dd MMMM ቀን y G + + + + + dd MMMM y + + + + + MMM d y + + + + + dd/MM/yy + + + + + + + hh:mm:ss a zzzz + + + + + hh:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + MMMM d + dd MMMM + dd/MM + MM/yy + Q yy + MMMM y + + + {0} - {1} + + M-M + + + E, MM-dd - E, MM-dd + E, MM-dd - E, MM-dd + + + MMM-MMM + + + E, MMM d - E, MMM d + E, MMM d - E, MMM d + + + MMM d - MMM d + MMM d-d + + + MM-dd - MM-dd + MM-dd - MM-dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + yyyy-MM - yyyy-MM + yyyy-MM - yyyy-MM + + + E, yyyy-MM-dd - E, yyyy-MM-dd + E, yyyy-MM-dd - E, yyyy-MM-dd + E, yyyy-MM-dd - E, yyyy-MM-dd + + + y MMM-MMM + y MMM - y MMM + + + E, y MMM dd - E, y MMM dd + E, y MMM dd - E, y MMM dd + E, y MMM dd - E, y MMM dd + + + y MMM d - MMM d + y MMM d-d + y MMM d - y MMM d + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + + + + + + ዘመን + + + ዓመት + + + ወር + + + ሳምንት + + + ቀን + + + ሰዓት + + + ደቂቃ + + + + + + + + ሙሀረም + ሳፈር + ረቢዑል አወል + ረቢዑል አኺር + ጀማደል አወል + ጀማደል አኺር + ረጀብ + ሻእባን + ረመዳን + ሸዋል + ዙልቂዳህ + ዙልሂጃህ + + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + ሮተራ + + + ፓልመር + + + South_Pole + + + ስዮዋ + + + ማውሰን + + + ዴቪስ + + + ቮስቱክ + + + ቼሲ + + + ዱሞንትዱርቪል + + + ማክሙርዶ + + + Rio_Gallegos + + + ሜንዶዛ + + + San_Juan + + + La_Rioja + + + ካታማርካ + + + ጁጁይ + + + ኮርዶባ + + + ቡኤኖስ-ኤይሪስ + + + ፕርዝ + + + ዳርዊን + + + አዴላኢደ + + + ብሮከን ሂል + + + ሜልቦኡመ + + + ሆባርት + + + ሊንደማን + + + ሲድኒ + + + ቢሪስባን + + + ሎርድ ሆዌ + + + ኢሩኔፕ + + + ሪኦ ብራንኮ + + + ፖርቶ ቨልሆ + + + ቦአ ቪስታ + + + ማናኡስ + + + ኩባ + + + Campo_Grande + + + በለም + + + አራጉአኢና + + + ሳኦ ፓውሎ + + + America/Bahia + + + ፎርታለዛ + + + ማቺዎ + + + ሪሲፋይ + + + ኖሮሃ + + + ዳውሰን + + + ሁዋይትሆርስ + + + ኢኑቪክ + + + ቫንኩቨር + + + ዳውሰን ክሪክ + + + የሎውናይፍ + + + ኤድመንተን + + + ስዊፍት ከረንት + + + ካምብሪጅ ቤይ + + + ሬጂና + + + ዊኒፔግ + + + ሬኒ ሪቨር + + + ራንኪን ኢንሌት + + + ተንደር ቤይ + + + ኒፒጎን + + + ቶሮንቶ + + + ሞንትሪያል + + + ኢካሊኡት + + + ፓንግኒርቱንግ + + + ሀሊፋክስ + + + ጉዝ ቤይ + + + ግሌስ ቤይ + + + ሴንት ጆንስ + + + ኪንሻሳ + + + ሉቡምባሺ + + + ኢስተር + + + ሳንቲያጎ + + + ካሽጋር + + + ኡሩምኪ + + + ቾንግኪንግ + + + ሻንጋይ + + + ባርቢን + + + ጋላፓጎስ + + + ጓያኪል + + + ካናሪ + + + ኬውታ + + + ማርድሪድ + + + ትሩክ + + + ፖኔፕ + + + ኮስራይ + + + ሎንዶን + + + ቱለ + + + ጐድታኽብ + + + ስኮረስቢሱንድ + + + ዴንማርክ + + + ጃካርታ + + + ፖንቲአንካ + + + ማካሳር + + + ጃያፑራ + + + እንደርቡርይ + + + ኪሪቲማቲ + + + ታራዋ + + + አክታው + + + ኦራል + + + አክቶቤ + + + ኪዝያሎርዳ + + + አልማቲ + + + ክዋጃላይን + + + ማጁሮ + + + ባማኮ + + + ሆቭድ + + + ኡላንባታር + + + ቾይባልሳን + + + ቲጁአና + + + ሄርሞሲሎ + + + ማዛቲአን + + + ቺኽዋኽዋ + + + ሞንተሪ + + + ሜክሲኮ ሲቲ + + + ሜሪዳ + + + ካንኩን + + + ኳላልምፑር + + + ኩቺንግ + + + ቻትሃም + + + ኦክላንድ + + + ታሂቲ + + + ማሩኩሳስ + + + ጋምባየር + + + አዞረስ + + + ማዴኢራ + + + ሊስቦን + + + ካሊኒንጋርድ + + + ማስኮ + + + ሳማራ + + + የካተሪንበርግ + + + ኦምስክ + + + ኖቮሲቢርስክ + + + ክራስኖያሽክ + + + ኢርኩትስክ + + + ያኩትስክ + + + ቭላዲቮስቱክ + + + ሳክሃሊን + + + ማጋዳን + + + ካምቻትካ + + + አናዲር + + + ኡዝጎሩድ + + + ካይቭ + + + ሲምፈሮፖል + + + ዛፖሮዝሂይ + + + ሚድዌ + + + ጆንስቶን + + + ዌክ + + + አዳክ + + + ኖሜ + + + ሆኖሉሉ + + + አንኮራጅ + + + ያኩታት + + + ጁነአኡ + + + ሎስ አንጀለስ + + + ቦይስ + + + ፎኔክስ + + + ዴንቨር + + + መካከል + + + ቺካጐ + + + መኖሚኔ + + + ክኖክስ + + + ማሬንጎ + + + ኢንዲያናፖሊስ + + + ሉዊስቪለ + + + ቬቫይ + + + ሞንቲሴሎ + + + ዲትሮይት + + + ኒውዮርክ + + + ሳማርካንድ + + + ታሽኬንት + + + + + + . + , + + + + + #,##0.00 ¤ + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + + + የኢትዮጵያ ብር + ብር + + + ዩሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + + + + + + አዎን:y + አይ:n + + + diff --git a/lib/zend/Zend/Locale/Data/am_ET.xml b/lib/zend/Zend/Locale/Data/am_ET.xml new file mode 100644 index 0000000000..c14a190cf3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/am_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar.xml b/lib/zend/Zend/Locale/Data/ar.xml new file mode 100644 index 0000000000..66afe27d55 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar.xml @@ -0,0 +1,3118 @@ + + + + + + + + + + + {0} ({1}) + ، + + + الأفارية + الأبخازية + الأتشينيزية + الأكولية + الأدانجمية + الأديجه + الأفستية + الأفريقية + لغة أفرو آسيوية + الأفريهيلية + الآينوية + الأكانية + الأكادية + الأليوتية + اللغات الأمريكية الهندية + الألطائية الجنوبية + الأمهرية + الأراجونية + الانجليزية القديمة + الأنجيكا + اللغات الأباتشية + العربية + الآرامية + الأروكانية + الأراباهو + الصناعية - أخرى + الأراواكية + الأسامية + الأسترية + اللغات الأزباسكانية + اللغات الأسترالية + الأفاريكية + الأوادية + الأيمارا + الأذرية + الباشكيرية + الباندا + اللغات الباميليكية + البلوشية + اللغة البالية + الباسا + البلطيقية - أخرى + البيلوروسية + البيجا + البيمبا + البربرية + البلغارية + البيهارية + البهوجبرية + البيسلامية + البيكولية + البينية + السيكسيكية + البامبارا + البنغالية + البانتو + التبتية + البريتونية + البراجية + البوسنية + الباتاكية + البرياتية + البجينيزية + البلينية + الكاتالوينية + الكادو + الهندية الأمريكية الوسطى - أخرى + الكاريبية + القوقازية - أخرى + الأتسام + الشيشانية + السيبيونو + السلتية - أخرى + التشامورو + التشيبشا + التشاجاتاى + التشكيزية + الماري + الشينوك جارجون + الشوكتو + الشيباوايان + الشيروكى + الشايان + اللغات التشاميكية + الكورسيكية + قبطية + الكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس الأنجليزية + الكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس الفرنسية + الكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس البرتغالية + الكرى + تركى كريمين، لغة توركية كريمينية + الكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب - أخرى + التشيكية + الكاشبايان + سلافية كنسية + الكشيتيك - أخرى + التشفاش + الولزية + الدانماركية + الداكوتا + الدارجوا + الدياك + الألمانية + الألمانية النمساوية + الألمانية العليا السويسرية + الديلوير + السلافية + الدوجريب + الدنكا + الدوجرى + الدرافيدين - أخرى + الصربية السفلى + الديولا + الهولندية الوسطى + المالديفية + الدايلا + الزونخاية + الايوي + الافيك + المصرية القديمة + الاكاجك + اليونانية + الامايت + الانجليزية + الانجليزية الأسترالية + الإنجليزية الكندية + الانجليزية البريطانية + إنجليزية الولايات المتحدة + الانجليزية الوسطى + اسبرانتو + الأسبانية + أسبانية أمريكا اللاتينية + الأسبانية الأيبيرية + الأستونية + لغة الباسك + الايوندو + الفارسية + الفانج + الفانتى + الفلة + الفنلندية + الفلبينية + فينو أجرايان - أخرى + الفيجية + الفارويز + الفون + الفرنسية + الفرنسية الكندية + الفرنسية السويسرية + الفرنسية الوسطى + الفرنسية القديمة + الفريزينية الشمالية + الفريزينية الشرقية + الفريلايان + الفريزيان + الأيرلندية + الجا + الجايو + الجبيا + الغيلية الأسكتلندية + لغة جرمانية + الجيز + لغة أهل جبل طارق + الجاليكية + الألمانية العليا الوسطى + الجوارانى + الألمانية العليا القديمة + الجندى + الجورونتالو + القوطية + الجريبو + اليونانية القديمة + الألمانية السويسرية + الغوجاراتية + المنكية + الهوسا + الهيدا + لغة أهل الهاواى + العبرية + الهندية + الهيليجينون + الهيماتشالى + الحثية + الهمونجية + الهيرى موتو + الكرواتية + الصربية العليا + الهايتية + الهنغارية + الهبا + الأرمينية + الهيريرو + اللّغة الوسيطة + الايبان + الأندونيسية + الانترلينج + الايجبو + السيتشيون يى + الايجو + الاينبياك + الايلوكو + الهندية - أخرى + الهندية الأوروبية - أخرى + الانجوشية + الايدو + الايرانية + اللغات الايروكويانية + الأيسلاندية + الايطالية + الاينكتيتت + اليابانية + اللوجبان + الجيدو الفارسى + الجيدو العربى + الجاوية + الجورجية + الكارا-كالباك + القبيلية + الكاتشين + الجو + الكامبا + الكاريين + الكوي + الكاباردايان + الكورو + الكونغو + الكازية + الخويسان - أخرى + الخوتانيز + الكيكيو + الكيونياما + الكازاخستانية + الكالاليست + الخميرية + الكيمبندو + الكانادا + الكورية + الكونكانية + الكوسراين + الكبيل + الكانيوري + الكاراتشاي-بالكار + الكريلية + الكرو + الكاشميرية + الكردية + الكميك + الكتيناي + الكومي + الكورنية + القيرغستانية + اللاتينية + الاسباعبرية + اللاهندا + اللامبا + اللوكسمبرجية + الليزجهايانية + الجاندا + الليمبرجيشية + اللينجالا + اللاوية + منغولى + اللوزى + اللتوانية + اللبا-كاتانجا + اللبا-لؤلؤ + اللوسينو + اللوندا + اللو + اللشاي + اللاتفية + المادريز + الماجا + المايثيلي + الماكاسار + الماندينغ + الأوسترونيسيان + الماساي + الموكشا + الماندار + الميند + المالاجاشية + الأيرلندية الوسطى + المارشالية + الماورية + الميكماكيونية + المينانجكاباو + اللغات المتنوعة + المقدونية + المون خمير- أخرى + الماليالام + المنغولية + المانشو + المانيبرى + لغات مانوبو + المولدوفية + الموهوك + الموسي + الماراثى + لغة الملايو + المالطية + اللغات المتعددة + لغات المندا + الكريك + الميرانديز + الماروارى + البورمية + لغات المايا + اللغة الارزية + النورو + الناهيوتل + الهندية الأمريكية الشمالية - أخرى + اللغة النابولية + البوكمالية النرويجية + النديبيل الشمالى + الألمانية السفلى + النيبالية + النيواري + الندونجا + النياس + النيجر - كوردوفانايان + النيوي + الهولندية + النينورسك النرويجي + النرويجية + النوجاى + النورس القديم + انكو + النديبيل الجنوبى + السوتو الشمالية + اللغات النوبية + النافاجو + النوارية التقليدية + النيانجا، التشيتشوا، التشوا + النيامويزى + النيانكول + النيورو + النزيما + الأوكيتانية + الأوجيبوا + الأورومو + الأورييا + الأوسيتيك + الأوساج + التركية العثمانية + اللغات الأوتومية + البنجابية + الغينية - أخرى + البانجاسينان + البهلوية + البامبانجا + البابيامينتو + البالوان + الفارسية القديمة + الفليبينية - أخرى + الفينيقية + البالية + البولندية + البوهنبيايان + اللغات البراقريطية + البروفانسية القديمة + البشتونية + البرتغالية + البرتغالية البرازيلية + البرتغالية الأيبيرية + الكويتشوا + الراجاسثانية + الرابانى + الراروتونجانى + الرهايتو-رومانس + الرندى + الرومانية + الرومانسية - أخرى + rom + الجذر + الروسية + الأرومانيان + الكينيارواندا + السنسكريتية + السانداوى + الياكت + الهندية الأمريكية الجنوبية - أخرى + لغات ساليشان + الآرامية السومارية + الساساك + السانتالى + السردينية + الصقلية + الأسكتلندية + السيندى + السامي الشمالى + السيلكب + السامية - أخرى + السانجو + الأيرلندية القديمة + لغات الإشارة + الشانية + السريلانكية + السيدامو + لغات السيويون + الصينية التيبتية - أخرى + السلوفاكية + السلوفانية + السلافية - أخرى + الساموائية + السامي الجنوبى + اللغات السامية - أخرى + اللول سامى + الاينارى سامى + السكولت سامى + الشونا + السونينك + الصومالية + السوجدين + السونجهاى + الألبانية + الصربية + السرانان تونجو + السرر + السواتى + النيلية الصحراوية - أخرى + السوتو الجنوبية + السودانية + السوكوما + السوسو + السومارية + السويدية + السواحلية + سريانية تقليدية + السريانية + التاميلية + تاى - أخرى + التيلجو + التيمن + التيرينو + التيتم + الطاجيكية + التايلاندية + التيجرينيا + التيجر + التيف + التركمانية + التوكيلاو + التاغالوغية + الكلينجون + التلينغيتية + التاماشيك + التسوانية + تونجا - جزر تونجا + تونجا - نياسا + التوك بيسين + التركية + السونجا + التسيمشيان + التتارية + التامبوكا + اللغات التوبية + الألطائية - أخرى + التوفالو + التوي + التاهيتية + الأدمرت + الأغورية + اليجاريتيك + الأوكرانية + الأمبندو + غير محدده + الأردية + الاوزباكية + الفاى + الفيندا + الفيتنامية + الفوتيك + الولونية + لغات الواكاشان + الوالامو + الواراى + الواشو + اللغات الصربية + الولوف + الكالميك + الياو + اليابيز + اليديشية + اليوروبية + اللغات اليوبيكية + الزهيونج + الزابوتيك + الزيناجا + الصينية + الصينية المبسطة + الصينية التقليدية + الزاند + الزولو + الزونية + بدون محتوى لغوي + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + العالم + افريقيا + أمريكا الشمالية + أمريكا الجنوبية + أوقيانوسيا + غرب افريقيا + أمريكا الوسطى + شرق افريقيا + شمال افريقيا + وسط افريقيا + جنوب افريقيا + الأمريكتين + شمال أمريكا + الكاريبي + شرق آسيا + جنوب آسيا + جنوب شرق آسيا + جنوب أوروبا + أستراليا ونيوزيلندا + ميلانيزيا + الجزر الميكرونيزية + بولينيزيا + جنوب وسط آسيا + آسيا + وسط آسيا + غرب آسيا + أوروبا + شرق أوروبا + شمال أوروبا + غرب أوروبا + كومنولث الدول المستقلة + أمريكا اللاتينية و الكاريبي + أندورا + الامارات العربية المتحدة + أفغانستان + أنتيجوا وبربودا + أنجويلا + ألبانيا + أرمينيا + جزر الأنتيل الهولندية + أنجولا + القطب الجنوبي + الأرجنتين + ساموا الأمريكية + النمسا + أستراليا + آروبا + جزر أولان + أذربيجان + البوسنة والهرسك + بربادوس + بنجلاديش + بلجيكا + بوركينا فاسو + بلغاريا + البحرين + بوروندي + بنين + برمودا + بروناي + بوليفيا + البرازيل + الباهاما + بوتان + جزيرة بوفيه + بتسوانا + روسيا البيضاء + بليز + كندا + جزر كوكوس + جمهورية الكونغو الديمقراطية + جمهورية افريقيا الوسطى + الكونغو - برازافيل + سويسرا + ساحل العاج + جزر كوك + شيلي + الكاميرون + الصين + كولومبيا + كوستاريكا + صربيا والجبل الأسود + كوبا + الرأس الأخضر + جزيرة الكريسماس + قبرص + جمهورية التشيك + ألمانيا + جيبوتي + الدانمرك + دومينيكا + جمهورية الدومينيك + الجزائر + الاكوادور + استونيا + مصر + الصحراء الغربية + اريتريا + أسبانيا + اثيوبيا + فنلندا + فيجي + جزر فوكلاند + ميكرونيزيا + جزر فارو + فرنسا + الجابون + المملكة المتحدة + جرينادا + جورجيا + غويانا + غانا + جبل طارق + جرينلاند + غامبيا + غينيا + جوادلوب + غينيا الاستوائية + اليونان + جورجيا الجنوبية وجزر ساندويتش الجنوبية + جواتيمالا + جوام + غينيا بيساو + غيانا + هونج كونج الصينية + جزيرة هيرد وماكدونالد + هندوراس + كرواتيا + هايتي + المجر + اندونيسيا + أيرلندا + اسرائيل + جزيرة مان + الهند + المحيط الهندي البريطاني + العراق + ايران + أيسلندا + ايطاليا + جيرسي + جامايكا + الأردن + اليابان + كينيا + قرغيزستان + كمبوديا + كيريباتي + جزر القمر + سانت كيتس ونيفيس + كوريا الشمالية + كوريا الجنوبية + الكويت + جزر الكايمن + كازاخستان + لاوس + لبنان + سانت لوسيا + ليختنشتاين + سريلانكا + ليبيريا + ليسوتو + ليتوانيا + لوكسمبورج + لاتفيا + ليبيا + المغرب + موناكو + مولدافيا + الجبل الأسود + سانت مارتين + مدغشقر + جزر المارشال + مقدونيا + مالي + ميانمار + منغوليا + ماكاو الصينية + جزر ماريانا الشمالية + مارتينيك + موريتانيا + مونتسرات + مالطا + موريشيوس + جزر الملديف + ملاوي + المكسيك + ماليزيا + موزمبيق + ناميبيا + كاليدونيا الجديدة + النيجر + جزيرة نورفوك + نيجيريا + نيكاراجوا + هولندا + النرويج + نيبال + نورو + نيوي + نيوزيلاندا + عمان + بنما + بيرو + بولينيزيا الفرنسية + بابوا غينيا الجديدة + الفيلبين + باكستان + بولندا + سانت بيير وميكولون + بتكايرن + بورتوريكو + فلسطين + البرتغال + بالاو + باراجواي + قطر + أوقيانوسيا النائية + الاتحاد الاوروبي + روينيون + رومانيا + صربيا + روسيا + رواندا + المملكة العربية السعودية + جزر سليمان + سيشل + السودان + السويد + سنغافورة + سانت هيلنا + سلوفينيا + سفالبارد وجان مايان + سلوفاكيا + سيراليون + سان مارينو + السنغال + الصومال + سورينام + ساو تومي وبرينسيبي + السلفادور + سوريا + سوازيلاند + جزر الترك وجايكوس + تشاد + المقاطعات الجنوبية الفرنسية + توجو + تايلند + طاجكستان + توكيلو + تيمور الشرقية + تركمانستان + تونس + تونجا + تركيا + ترينيداد وتوباغو + توفالو + تايوان + تانزانيا + أوكرانيا + أوغندا + جزر الولايات المتحدة البعيدة الصغيرة + الولايات المتحدة الأمريكية + أورجواي + أوزبكستان + الفاتيكان + سانت فنسنت وغرنادين + فنزويلا + جزر فرجين البريطانية + جزر فرجين الأمريكية + فيتنام + فانواتو + جزر والس وفوتونا + ساموا + اليمن + مايوت + جمهورية جنوب افريقيا + زامبيا + زيمبابوي + منطقة غير معرفة + + + التهجئة الألمانية التقليدية + التهجئة الألمانية لعام 1996 + أرمنية شرقية + أرمنية غربية + الأبجدية التركية اللاتينية الموحدة + أحادي النغمة + لهجة ناتيسون + متعدد النغمات + حاسب آلي + تهجئة تم مراجعتها + بلنسية + + + التقويم + الترتيب + العملات + + + الترتيب الصيني التقليدي - Big5 + التقويم البوذي + التقويم الصيني + ترتيب مباشر + الترتيب الصيني المبسط - GB2312 + التقويم الميلادي + التقويم العبري + التقويم الهجري + تقويم اسلامي مدني + التقويم الياباني + ترتيب دليل الهاتف + ترتيب تقليدي + + + النظام الأمريكي + النظام المتري + + + اللغة: {0} + نظام الكتابة: {0} + المنطقة: {0} + + + + + + + [\u064B-\u0652 ء-غ ف-ي] + [\u0640 \u200C-\u200F] + [a-z] + + + “ + ” + ‘ + ’ + + + + + + + التقويم البوذي + + + + + + + + توت + بابه + هاتور + كيهك + طوبة + أمشير + برمهات + برمودة + بشنس + بؤونة + أبيب + مسرى + نسيئ + + + توت + بابه + هاتور + كيهك + طوبة + أمشير + برمهات + برمودة + بشنس + بؤونة + أبيب + مسرى + نسيئ + + + + + + + + + مسكريم + تكمت + هدار + تهساس + تر + يكتت + مجابيت + ميازيا + جنبت + سين + هامل + نهاس + باجمن + + + مسكريم + تكمت + هدار + تهساس + تر + يكتت + مجابيت + ميازيا + جنبت + سين + هامل + نهاس + باجمن + + + + + + + + + يناير + فبراير + مارس + أبريل + مايو + يونيو + يوليو + أغسطس + سبتمبر + أكتوبر + نوفمبر + ديسمبر + + + يناير + فبراير + مارس + أبريل + مايو + يونيو + يوليو + أغسطس + سبتمبر + أكتوبر + نوفمبر + ديسمبر + + + + + ي + ف + م + أ + و + ن + ل + غ + س + ك + ب + د + + + + + + + أحد + إثنين + ثلاثاء + أربعاء + خميس + جمعة + سبت + + + الأحد + الإثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + ح + ن + ث + ر + خ + ج + س + + + + + + + الربع الأول + الربع الثاني + الربع الثالث + الربع الرابع + + + الربع الأول + الربع الثاني + الربع الثالث + الربع الرابع + + + + + ١ + ٢ + ٣ + ٤ + + + + ص + م + + + قبل الميلاد + ميلادي + + + ق.م + م + + + + + + EEEE، d MMMM، y + + + + + d MMMM، y + + + + + dd‏/MM‏/yyyy + + + + + d‏/M‏/yyyy + + + + + + + zzzz h:mm:ss a + + + + + z h:mm:ss a + + + + + h:mm:ss a + + + + + h:mm a + + + + + + H:mm + L + E، d-M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + dd‏/MM + d/‏M + d + mm:ss + y + M‏/yyyy + EEE، d/‏M/‏yyyy + MMM y + EEE، d MMMM y + MMMM y + yyyy Q + y QQQ + Q yy + MM‏/yyyy + MMMM، y + + + {0} – {1} + + M-M + + + E، d/‏M - E، d/‏M + E، d/‏M -‏ E، d/‏M + + + MMM-MMM + + + E، d MMM - E، d MMM + E، d - E، d MMM + + + LLLL-LLLL + + + d MMM - d MMM + d-d MMM + + + d‏/M - d‏/M + d‏/M - d‏/M + + + d-d + + + h a - h a + h–h a + + + h:mm a - h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + v h:mm a - h:mm a + v h:mm–h:mm a + v h:mm–h:mm a + + + v h a - h a + v h–h a + + + y-y + + + M‏/yyyy - M‏/yyyy + M‏/yyyy - M‏/yyyy + + + E، d‏/M‏/yyyy - E، d‏/M‏/yyyy + E، dd‏/MM‏/yyyy - E، dd‏/MM‏/yyyy + E، d‏/M‏/yyyy - E، d‏/M‏/yyyy + + + MMM - MMM، y + MMM، y - MMM، y + + + E، d MMM - E، d MMM، y + E، d - ِE، d MMM، yyyy + E، d MMM، y - E، d MMM، y + + + MM ‏– MM‏-yyyy‏ + MM -‏ MM–‏yyyy + + + d MMM - d MMM، yyyy + d-d MMM، y + d MMM، y - d MMM، y + + + d‏/M‏/yyyy - d‏/M‏/yyyy + d‏/M‏/yyyy - d‏/M‏/yyyy + d‏/M‏/yyyy - d‏/M‏/yyyy + + + + + + العصر + + + السنة + + + الشهر + + + الأسبوع + + + يوم + أمس + اليوم + غدًا + بعد الغد + + + اليوم + + + ص/م + + + الساعات + + + الدقائق + + + الثواني + + + التوقيت + + + + + + + + تشري + مرحشوان + كيسلو + طيفت + شباط + آذار الأول + آذار الثاني + نيسان + أيار + سيفان + تموز + آب + أيلول + + + تشري + مرحشوان + كيسلو + طيفت + شباط + آذار الأول + آذار الثاني + نيسان + أيار + سيفان + تموز + آب + + + + + + + + + محرم + صفر + ربيع الأول + ربيع الآخر + جمادى الأولى + جمادى الآخرة + رجب + شعبان + رمضان + شوال + ذو القعدة + ذو الحجة + + + + + م + ص + ر + ر + ج + ج + ر + ش + ر + ش + ذ + ذ + + + + ص + م + + + هـ + + + + + d‏/M + M‏/yyyy + + + + + + + تيكا + هاكتشي + هاكهو + شتشو + تيهو + كيين + وادو + رييكي + يورو + جينكي + تمبيو + تمبيو-كامبو + تمبيو-شوهو + تمبيو-هوجي + تمفو-جينجو + جينجو-كيين + هوكي + تن-أو + إنرياكو + ديدو + كونين + تنتشو + شووا + كاجو + نينجو + سيكو + تنان + جوجان + جينكيي + نينا + كامبيو + شوتاي + انجي + انتشو + شوهيي + تنجيو + تنرياكو + تنتوكو + أووا + كوهو + آنا + تينروكو + تن-ان + جوجن + تنجن + إيكان + كانا + اي-ان + ايسو + شورياكو + تشوتوكو + تشوهو + كانكو + تشووا + كانين + جاين + مانجو + تشوجين + تشورياكو + تشوكيو + كانتوكو + ايشو + تينجي + كوهيي + جيرياكو + انكيو + شوهو + شورياكو + ايهو + أوتوكو + كانجي + كاهو + ايتشو + شوتوكو + كووا + تشوجي + كاشو + تنين + تن-اي + ايكيو + جن-اي + هوان + تنجي + ديجي + تنشو + تشوشو + هوين + ايجي + كوجي + تنيو + كيوان + نينبيي + كيوجو + هجين + هيجي + ايرياكو + أوهو + تشوكان + ايمان + نين-ان + كاو + شون + أنجين + جيشو + يووا + جيي + جنريوكو + بنجي + كنكيو + شوجي + كنين + جنكيو + كن-اي + شوجن + كنرياكو + كنبو + شوكيو + جو + جيننين + كروكو + أنتيي + كنكي + جويي + تمبكو + بنرياكو + كاتيي + رياكنين + ان-أو + نينجي + كنجين + هوجي + كنتشو + كوجن + شوكا + شوجن + بن-أو + كوتشو + بن-اي + كنجي + كوان + شوو + اينين + شوان + كنجن + كجن + توكجي + انكي + أوتشو + شووا + بنبو + جنو + جنكيو + شوتشو + كريكي + جنتكو + جنكو + كمو + إنجن + كوككو + شوهي + كنتكو + بنتشو + تنجو + كورياكو + كووا + جنتشو + مييتكو + كاكي + كو + مييتكو + أويي + شوتشو + ايكيو + ككيتسو + بن-أن + هوتكو + كيوتكو + كوشو + تشوركو + كنشو + بنشو + أونين + بنمي + تشوكيو + انتكو + ميو + بنكي + ايشو + تييي + كيوركو + تنمن + كوجي + ايركو + جنكي + تنشو + بنركو + كيتشو + جنوا + كان-اي + شوهو + كيان + شوو + ميرياكو + منجي + كنبن + انبو + تنوا + جوكيو + جنركو + هويي + شوتكو + كيوهو + جنبن + كنبو + انكيو + كان-ان + هورياكو + مييوا + ان-اي + تنمي + كنسي + كيووا + بنكا + بنسي + تنبو + كوكا + كاي + أنسي + من-ان + بنكيو + جنجي + كيو + ميجي + تيشو + شووا + هيسي + + + + + + + + فرفردن + أذربيهشت + خرداد + تار + مرداد + شهرفار + مهر + آيان + آذر + دي + بهمن + اسفندار + + + فرفردن + أذربيهشت + خرداد + تار + مرداد + شهرفار + مهر + آيان + آذر + دي + بهمن + اسفندار + + + + + + ه‍.ش + + + + + + +HH:mm;-HH:mm + {0} + + غير معروف + + + روثيرا + + + بالمير + + + القطب الجنوبي + + + سايووا + + + ماوسون + + + دافيز + + + فوستوك + + + كاساي + + + دي مونت دو روفيل + + + ماك موردو + + + ريو جالييوس + + + ميندوزا + + + سان خوان + + + أشوا + + + لا ريوجا + + + سان لويس + + + كاتاماركا + + + جوجو + + + تاكمان + + + كوردوبا + + + بوينوس أيرس + + + برثا + + + دارون + + + استراليا(توقيت أدليادا + + + بروكن هيل + + + ميلبورن + + + هوبارت + + + ليندمان + + + سيدني + + + برسيبان + + + لورد هاو + + + ايرونبي + + + ريوبرانكو + + + بورتو فيلو + + + باو فيستا + + + ماناوس + + + كيابا + + + كومبو جراند + + + بلم + + + أروجوانيا + + + ساو باولو + + + باهيا + + + فورتاليزا + + + ماشيو + + + ريسيف + + + نوروناه + + + داوسان + + + وايت هورس + + + اينوفيك + + + فانكوفر + + + داوسن كريك + + + يلونيف + + + ايدمونتون + + + سوفت كارنت + + + كامبرديج باي + + + ريجينا + + + وينيبيج + + + راني ريفر + + + رانكن انلت + + + كورال هاربر + + + ثندر باي + + + نيبيجون + + + تورونتو + + + مونتريال + + + اكويلت + + + بانجينتينج + + + وينكتون + + + هاليفاكس + + + جوس باي + + + جلاس باي + + + سانت جونس + + + كينشاسا + + + لومبباشا + + + استر + + + سانتيجو + + + كاشجار + + + أرومكي + + + تشونجكينج + + + العالمية + + + هاربين + + + جلاباجوس + + + جواياكيل + + + كناري + + + سيتا + + + مدريد + + + ترك + + + باناب + + + كوسرا + + + لندن + + + جيرونسى + + + ثيل + + + جودثاب + + + سكورسبيسند + + + دانمرك شافن + + + جاكرتا + + + بونتيانك + + + ماكسار + + + جايابيورا + + + إيطاليا + + + جيرسى + + + اندربيرج + + + كيريتي ماتي + + + تاراوا + + + أكتاو + + + أورال + + + أكتوب + + + كيزيلوردا + + + ألماتي + + + الجبل الأسود + + + كواجالين + + + ماجورو + + + باماكو + + + هوفد + + + آلانباتار + + + تشوبالسان + + + تيخوانا + + + هيرموسيلو + + + مازاتلان + + + تشيواوا + + + مونتيري + + + مدينة المكسيك + + + ميريدا + + + كانكن + + + كوالالمبور + + + كيشينج + + + تشاثام + + + أوكلاند + + + تاهيتي + + + ماركيساس + + + جامبير + + + أزورس + + + ماديرا + + + ليسبون + + + صربيا + + + كالينجراد + + + موسكو + + + فولوجراد + + + سمراء + + + يكاترنبيرج + + + أومسك + + + نوفوسبيرسك + + + كراسنويارسك + + + ايركيتسك + + + ياكتسك + + + فلاديفوستك + + + سكالين + + + مجادن + + + كامتشاتكا + + + أندير + + + لونجيربن + + + أوزجرود + + + كييف + + + سيمفروبول + + + زابوروزي + + + ميدواي + + + جونستون + + + واك + + + أداك + + + نوم + + + هونولولو + + + أنشوراج + + + ياكوتات + + + جوني + + + لوس انجلوس + + + بويس + + + فينكس + + + شيبروك + + + دنفر + + + نيو ساليم + + + سنتر + + + شيكاغو + + + مينوميني + + + فينسينس + + + بيترسبرغ + + + كونكس + + + ويناماك + + + مارنجو + + + إنديانابوليس + + + لويس فيل + + + فيفاي + + + مونتيسيلو + + + ديترويت + + + نيويورك + + + سمرقند + + + طشقند + + + + + arab + + ٫ + ٬ + ؛ + ٪ + ٠ + # + + + - + اس + ؉ + ∞ + ليس رقم + + + + + #,##0.###;#,##0.###- + + + + + + + ¤ #,##0.00;¤ #,##0.00- + + + {0} {1} + {0} {1} + {0} {1} + {0} {1} + {0} {1} + {0} {1} + + + + بيستا أندوري + + + درهم اماراتى + د.إ.‏ + + + أفغاني - 1927-2002 + + + أفغاني + + + ليك ألباني + + + درام أرمينى + + + جلدر هولندى [ANG] + + + كوانزا أنجولي + + + كوانزا أنجولى - 1977-1990 + + + كوانزا أنجولى جديدة - 1990-2000 + + + كوانزا أنجولى معدلة - 1995 - 1999 + + + استرال أرجنتيني + + + بيزو أرجنتينى - 1983-1985 + + + بيزو أرجنتينى + + + شلن نمساوى + + + دولار أسترالى + + + جلدر أروبى + + + مانات أذريبجانى + + + دينار البوسنة و الهرسك + + + مارك البوسنة و الهرسك قابل للتحويل + + + دولار بربادوسى + + + تاكا بنجلاديشى + + + فرنك بلجيكي (قابل للتحويل) + + + فرنك بلجيكى + + + فرنك بلجيكي (مالي) + + + ليف بلغارى + + + ليف بلغارى جديد + + + دينار بحرينى + د.ب.‏ + + + فرنك بروندى + + + دولار برمودى + + + دولار بروناى + + + بوليفاريو + + + بيزو بوليفى + + + مفدول بوليفى + + + نوفو كروزايرو برازيلى - 1967-1986 + + + كروزادو برازيلى + + + كروزايرو برازيلى - 1990-1993 + + + ريال برازيلي + ر.ب.‏ + + + دولار باهامى + + + نولتوم بوتانى + + + كيات بورمى + + + بولا بتسوانى + + + روبل بيلاروسى جديد - 1994-1999 + + + روبل بيلاروسى + + + دولار بليزى + + + دولار كندى + + + فنك كونغولى + + + فرنك سويسرى + + + بيزو شيلى + + + يوان صيني + ى.ص + + + بيزو كولومبى + + + كولن كوستا ريكى + + + دينار صربى + + + كرونة تشيكوسلوفاكيا + + + بيزو كوبى + + + اسكودو الرأس الخضراء + + + جنيه قبرصى + + + كرونة تشيكية + + + أوستمارك المانى شرقى + + + مارك المانى + + + فرنك جيبوتى + + + كرونة دانماركى + + + بيزو الدومنيكان + + + دينار جزائري + د.ج.‏ + + + كرونة استونية + + + جنيه مصرى + ج.م.‏ + + + ناكفا أريترى + + + بيزيتا اسباني + + + بير أثيوبى + + + يورو + + + ماركا فنلندى + + + دولار فيجى + + + جنيه جزر فوكلاند + + + فرنك فرنسى + + + جنيه سترليني + + + لارى جورجى + + + سيدى غانى + + + جنيه جبل طارق + + + دلاسي جامبي + + + فرنك غينيا + + + سيلى غينيا + + + اكويل جونينا غينيا الاستوائيّة + + + دراخما يونانى + + + كوتزال جواتيمالا + + + اسكود برتغالى غينيا + + + بيزو غينيا بيساو + + + دولار غيانا + + + دولار هونج كونج + + + ليمبيرا هنداروس + + + دينار كرواتى + + + كونا كرواتى + + + جوردى هايتى + + + فورينت مجرى + + + روبية اندونيسية + + + جنيه ايرلندى + + + جنيه اسرائيلى + + + شيكل اسرائيلى جديد + + + روبيه هندي + ر.ه.‏ + + + دينار عراقى + د.ع.‏ + + + ريال ايرانى + + + كرونه أيسلندى + + + ليرة ايطالية + + + دولار جامايكى + + + دينار أردنى + د.أ.‏ + + + ين ياباني + + + شلن كينيي + + + سوم قيرغستانى + + + رييال كمبودى + + + فرنك جزر القمر + ف.ج.ق.‏ + + + وون كوريا الشمالية + + + وون كوريا الجنوبية + + + دينار كويتى + د.ك.‏ + + + دولار جزر كيمن + + + تينغ كازاخستانى + + + كيب لاوسى + + + جنية لبنانى + ل.ل.‏ + + + روبية سريلانكية + + + دولار ليبيري + + + لوتى ليسوتو + + + الليتا الليتوانية + + + تالوناس ليتوانى + + + فرنك لوكسمبرج قابل للتحويل + + + فرنك لوكسمبرج + + + فرنك لوكسمبرج المالى + + + لاتس لاتفيا + + + روبل لاتفيا + + + دينار ليبى + د.ل.‏ + + + درهم مغربى + د.م.‏ + + + فرنك مغربي + + + لاو مولدوفى + + + ارياري مدغشقر + + + فرنك مدغشقر + + + دينار مقدونى + + + فرنك مالى + + + كيات ميانمار + + + توغروغ منغولى + + + باتاكا ماكاوى + + + أوقية موريتانية + أ.م.‏ + + + ليرة مالطية + + + جنيه مالطى + + + روبي موريشي + + + روفيه جزر المالديف + + + كواشا مالاوى + + + بيزو مكسيكى + + + بيزو فضى مكسيكى - 1861-1992 + + + رينغيت ماليزى + + + اسكود موزمبيقى + + + دولار نامبيا + + + نايرا نيجيرى + + + كوردوبة نيكاراجوا + + + جلدر هولندى + + + كرونة نرويجية + + + روبية نيبالي + + + دولار نيوزيلندى + + + ريال عمانى + ر.ع.‏ + + + بالبوا بنمى + + + كينا بابوا غينيا الجديدة + + + بيزو فلبينى + + + روبية باكستاني + + + زلوتى بولندى + + + زلوتى بولندى - 1950-1995 + + + اسكود برتغالى + + + جواراني باراجواي + + + ريال قطرى + ر.ق.‏ + + + دولار روديسى + + + ليو رومانى قديم + + + روبل روسي + ر.ر.‏ + + + روبل روسى - 1991-1998 + + + فرنك رواندى + + + ريال سعودى + ر.س.‏ + + + دولار جزر سليمان + + + روبية سيشيلية + + + دينار سوداني + د.س.‏ + + + جنيه سودانى + ج.س.‏ + + + كرونة سويدية + + + دولار سنغافورى + + + جنيه سانت هيلين + + + تولار سلوفيني + + + كرونة سلوفاكية + + + ليون سيراليونى + + + شلن صومالى + + + دولار سورينامى + + + جلدر سورينامى + + + دوبرا ساو تومي وبرينسيبي + + + روبل سوفيتى + + + كولون سلفادورى + + + جنيه سورى + ل.س.‏ + + + ليلانجيني سوازيلندى + + + باخت تايلاندى + + + روبل طاجيكستانى + + + سوموني طاجيكستانى + + + مانات تركمنستانى + + + دينارتونسى + د.ت.‏ + + + اسكود تيمورى + + + ليرة تركي + + + ليرة تركية جديدة + + + دولار ترينداد و توباجو + + + دولار تايوانى + + + شلن تنزانى + + + هريفنيا أوكرانى + + + شلن أوغندى - 1966-1987 + + + شلن أوغندى + + + دولار أمريكي + + + دولار أمريكي (اليوم التالي)‏ + + + دولار أمريكي (نفس اليوم)‏ + + + بيزو أوروجواى - 1975-1993 + + + سوم أوزبكستانى + + + بوليفار فنزويلي + + + دونج فيتنامى + + + فرنك افريقي + ف.ا.‏ + + + فضة + + + ذهب + + + الوحدة الأوروبية المركبة + + + الوحدة المالية الأوروبية + + + الوحدة الحسابية الأوروبية + + + XBD + + + دولار شرق الكاريبى + + + حقوق السحب الخاصة + + + وحدة النقد الأوروبية + + + فرنك فرنسى ذهبى + + + XFU + + + البلاتين + + + كود اختبار العملة + + + بدون عملة + *** + + + دينار يمنى + + + ريال يمنى + ر.ي.‏ + + + دينار يوغسلافى + + + دينار يوغسلافى قابل للتحويل + + + راند جنوب أفريقيا -مالى + + + راند جنوب أفريقيا + + + كواشا زامبى + + + زائير زائيرى جديد + + + زائير زائيرى + + + دولار زمبابوى + + + + + + {0} أيام + {0} يوماً + يوم + {0} يوم + يومان + لا أيام + + + {0} ساعات + {0} ساعةً + ساعة + {0} ساعة + ساعتان + لا ساعات + + + {0} دقائق + {0} دقيقةً + دقيقة + {0} دقيقة + دقيقتان + لا دقائق + + + {0} أشهر + {0} شهراً + شهر + {0} شهر + شهران + لا أشهر + + + {0} ثوان + {0} ثانيةً + ثانية + {0} ثانية + ثانيتان + لا ثوان + + + {0} أسابيع + {0} أسبوعاً + أسبوع + {0} أسبوع + أسبوعان + لا أسابيع + + + {0} سنوات + {0} سنةً + سنة + {0} سنة + سنتان + لا سنوات + + + + + نعم:ن + لا:ل + + + diff --git a/lib/zend/Zend/Locale/Data/ar_AE.xml b/lib/zend/Zend/Locale/Data/ar_AE.xml new file mode 100644 index 0000000000..d0877405e6 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_AE.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_BH.xml b/lib/zend/Zend/Locale/Data/ar_BH.xml new file mode 100644 index 0000000000..cec4765f56 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_BH.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_DZ.xml b/lib/zend/Zend/Locale/Data/ar_DZ.xml new file mode 100644 index 0000000000..3d56cef723 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_DZ.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + M‏-M + + + d‏-d MMM + + + d‏-d + + + y‏-y + + + + + + + + latn + + 0 + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_EG.xml b/lib/zend/Zend/Locale/Data/ar_EG.xml new file mode 100644 index 0000000000..96bc7b8556 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_EG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_IQ.xml b/lib/zend/Zend/Locale/Data/ar_IQ.xml new file mode 100644 index 0000000000..6ed861fcf1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_IQ.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_JO.xml b/lib/zend/Zend/Locale/Data/ar_JO.xml new file mode 100644 index 0000000000..2be0543eef --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_JO.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + كانون الثاني + شباط + آذار + نيسان + أيار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + كانون الثاني + شباط + آذار + نيسان + أيار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_KW.xml b/lib/zend/Zend/Locale/Data/ar_KW.xml new file mode 100644 index 0000000000..12c3e2c0fa --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_KW.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_LB.xml b/lib/zend/Zend/Locale/Data/ar_LB.xml new file mode 100644 index 0000000000..aaa0c294c3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_LB.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + كانون الثاني + شباط + آذار + نيسان + نوار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + كانون الثاني + شباط + آذار + نيسان + نوار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_LY.xml b/lib/zend/Zend/Locale/Data/ar_LY.xml new file mode 100644 index 0000000000..f4063b1b05 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_LY.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_MA.xml b/lib/zend/Zend/Locale/Data/ar_MA.xml new file mode 100644 index 0000000000..806c33de53 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_MA.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + d‏-d MMM + + + d‏-d + + + y‏-y + + + MM ‏- MM ‏–yyyy + + + d‏–d MMM، y + + + + + + + + latn + + 0 + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_OM.xml b/lib/zend/Zend/Locale/Data/ar_OM.xml new file mode 100644 index 0000000000..7ab81698f6 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_OM.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_QA.xml b/lib/zend/Zend/Locale/Data/ar_QA.xml new file mode 100644 index 0000000000..434c169318 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_QA.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + + + + #0.###;#0.###- + + + + + + + ¤#0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_SA.xml b/lib/zend/Zend/Locale/Data/ar_SA.xml new file mode 100644 index 0000000000..e3599cf6e4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_SA.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + + + + #0.###;#0.###- + + + + + + + ¤#0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_SD.xml b/lib/zend/Zend/Locale/Data/ar_SD.xml new file mode 100644 index 0000000000..9b6d9acbb1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_SD.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_SY.xml b/lib/zend/Zend/Locale/Data/ar_SY.xml new file mode 100644 index 0000000000..e1a0c6155a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_SY.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + كانون الثاني + شباط + آذار + نيسان + نوار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + كانون الثاني + شباط + آذار + نيسان + نوار + حزيران + تموز + آب + أيلول + تشرين الأول + تشرين الثاني + كانون الأول + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + + + + #0.###;#0.###- + + + + + + + ¤#0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_TN.xml b/lib/zend/Zend/Locale/Data/ar_TN.xml new file mode 100644 index 0000000000..18eb5821c6 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_TN.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + M‏-M + + + d‏-d MMM + + + d‏-d + + + y‏-y + + + d‏-d MMM، y + + + + + + + + latn + + 0 + E + + + + + #0.###;#0.###- + + + + + + + ¤#0.00 + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ar_YE.xml b/lib/zend/Zend/Locale/Data/ar_YE.xml new file mode 100644 index 0000000000..a66b31ac5a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ar_YE.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + الأحد + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + + + + + + + + + + + #0.###;#0.###- + + + + + + + ¤#0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/as.xml b/lib/zend/Zend/Locale/Data/as.xml new file mode 100644 index 0000000000..cfd8da660f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/as.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + অসমীয়া + উপস্থাপন ভাষা + কম্বোডিয়ান + + + + + + এন্টাৰ্টিকা + ব্ৰাজিল + বভেট দ্বীপ + চীন + জাৰ্মানি + ফ্ৰান্স + সংযুক্ত ৰাজ্য + দক্ষিণ জৰ্জিয়া আৰু দক্ষিণ চেণ্ডৱিচ্‌ দ্বীপ + হাৰ্ড দ্বীপ আৰু মেক্‌ডোনাল্ড দ্বীপ + ভাৰত + ব্ৰিটিশ্ব ইণ্ডিয়ান মহাসাগৰৰ অঞ্চল + ইটালি + জাপান + ৰুচ + দক্ষিণ ফ্ৰান্সৰ অঞ্চল + যুক্তৰাষ্ট্ৰ + অজ্ঞাত বা অবৈধ অঞ্চল + + + পঞ্জিকা + শৰীকৰণ + মুদ্ৰা + + + পৰম্পৰাগত চীনা শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম - Big5 + বৌদ্ধ পঞ্জিকা + চীনা পঞ্জিকা + পোনপটীয়াকৈ শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + সৰল চীনা শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম - GB2312 + গ্ৰিগোৰীয় পঞ্জিকা + হীব্ৰু পঞ্জিকা + ভাৰতীয় ৰাষ্ট্ৰীয় পঞ্জিকা + ইচলামী পঞ্জিকা + ইচলামী-নাগৰিকৰ পঞ্জিকা + জাপানী পঞ্জিকা + টেলিফোন বহিৰ মতেশৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + পিন্‌য়িন শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + চীনা গণৰাজ্যৰ পঞ্জিকা + স্ট্ৰোক শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + পৰম্পৰাগতভাবে শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + + + + [় অ-ঋ ৠ ঌ ৡ এ ঐ ও ঔ ং ঁ ঃ ক-ড {ড়} ঢ {ঢ়} ণ ত ৎ থ-ন প-য {য়} ৰ ল ৱ শ-হ ঽ-ৄ ৢ ৣ ে ৈ ো-্ ৗ] + [\u200C \u200D ৲] + + + + + + + + জানু + ফেব্ৰু + মাৰ্চ + এপ্ৰিল + মে + জুন + জুলাই + আগ + সেপ্ট + অক্টো + নভে + ডিসে + + + জানুয়াৰী + ফেব্ৰুয়াৰী + মাৰ্চ + এপ্ৰিল + মে + জুন + জুলাই + আগষ্ট + সেপ্টেম্বৰ + অক্টোবৰ + নভেম্বৰ + ডিসেম্বৰ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ৰবি + সোম + মঙ্গল + বুধ + বৃহষ্পতি + শুক্ৰ + শনি + + + দেওবাৰ + সোমবাৰ + মঙ্গলবাৰ + বুধবাৰ + বৃহষ্পতিবাৰ + শুক্ৰবাৰ + শনিবাৰ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + পূৰ্বা + অপ + + + BCE + CE + + + + + + EEEE, d MMMM, y + + + + + d MMMM, y + + + + + dd-MM-yyyy + + + + + d-M-yyyy + + + + + + + h.mm.ss a zzzz + + + + + h.mm.ss a z + + + + + h.mm.ss a + + + + + h.mm. a + + + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM, y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + এলাহাৱাদ + + + + ভাৰতীয় সময় + + + ভা. স. + + true + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + টকা + + + + diff --git a/lib/zend/Zend/Locale/Data/as_IN.xml b/lib/zend/Zend/Locale/Data/as_IN.xml new file mode 100644 index 0000000000..1475eb64be --- /dev/null +++ b/lib/zend/Zend/Locale/Data/as_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/az.xml b/lib/zend/Zend/Locale/Data/az.xml new file mode 100644 index 0000000000..1b9218d284 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/az.xml @@ -0,0 +1,2716 @@ + + + + + + + + + + + afarca + abxazca + akin dili + akoli dili + adangme dili + aduge dili + avestanca + Afrikaanca + afro-aziat dili + afrihili dili + aynuca + akanca + akadianca + aleutca + algonguyan dili + cənub altay dili + amarikcə + aragonca + qədimi ingiliscə + angikə dili + apaçi dili + Ərəbcə + aramik dili + araukanca + arapaho dili + suni dil + aravakça + as + asturicə + atapaskanca + avstraliyca + avarikcə + avadicə + aymarca + azərbaycanca + başkir dili + banda dili + bamilek dili + baluc dili + balincə + basa dili + baltik dili + belarusca + beja dili + bemba dili + berber dili + bolqarca + biharicə + bxoçpuri dili + bislama dili + bikolca + bini dili + siksikə dili + bambara dili + Benqal dili + bantu dili + tibet dili + Bretonca + braj dili + bosniya dili + batak dili + buryat dili + bugin dili + bilincə + katalanca + kado dili + mərkəzi amerika indus dili + karib dili + qavqaz dili + atsamca + çeçen dili + kebuano dili + kelt dili + çamoro dili + çibçə dili + çağatay dili + çukiz dili + mari dili + çinuk ləhçəsi + çoktau dili + çipevyan dili + çiroki dili + çeyen dili + çamik dili + korsikan dili + kopt dili + inglis kreol dili + fransız kreol dili + portugal kreol dili + kri dili + krım türkçə + kreol dili + çex dili + kaşubyan dili + kilsə slav dili + kuşitik dili + çuvaş dili + uelscə + danimarka dili + dakota dili + darqva dili + dayak dili + almanca + almanca (AT) + isveç yüksək almancası + delaver dili + slavey + doqrib dili + dinka dili + doqri dili + dravid dili + aşağı sorbca + duala dili + ortacaq hollandca + diveh dili + dyula dili + dzonqa dili + eve dili + efik dili + qədimi misir dili + ekacuk dili + yunanca + elamit dili + ingiliscə + ingiliscə (AU) + ingiliscə (CA) + ingiliscə (GB) + ingiliscə (ABŞ) + ortacaq ingiliscə + esperanto dili + ispanca + latın amerika ispancası + iber-ispanca + estonca + bask dili + evondo dili + farsca + fang dili + fanti dili + fula dili + fincə + taqaloqca + fin-uğri dili + fiji dili + farer dili + fon dili + fransızca + fransızca (CA) + isveç fransızca + ortacaq fransızca + qədimi fransızca + şimal fris dili + friul dili + frisk dili + irlandca + qa dili + qayo dili + qabaya dili + skot gaelik dili + Alman dili + qez dili + qilbert gili + qalisian dili + ortacaq yüksək almanca + quaranicə + qədimi almanca + qondi dili + qorontalo dili + gotça + qrebo dili + qədimi yunanca + isveç almanca + gujarati dili + manks dili + qviçin dili + Hausa dili + hayda dili + Qavayca + ivritcə + hindi dili + hiliqaynon dili + himaçali dili + hittit dili + monq dili + hiri motu dili + xorvatca + yuxarı sorbca + haiti dili + macarca + hupa dili + Ermənicə + Herer dili + interlingua dili + iban dili + indoneziya dili + interlingue dili + iqbo dili + siçuan yi dili + ico dili + inupiaq dili + iloko dili + diqər hint dili + hint-yevropa dili + inquş dili + ido dili + iranca + irokuay dili + isləndcə + italyanca + inuktikut dili + yaponca + loğban dili + judo-farsca + jude-ərəbcə + yavaca dili + gürcü dili + qara-qalpaq dili + kabule dili + kaçinca + ju dili + kamba dili + karen dili + kavi dili + kabardca + tiyap dili + koro dili + konqo dili + xazi dili + xoyzan dili + xotan dili + kikuyu dili + kuanyama dili + qazax dili + kalalisut dili + kambodiya dili + kimbundu dili + kannada dili + koreya dili + konkan dili + kosreyan dili + kpelle dili + kanur dili + qaraçay-balkar dili + karelyan dili + kru dili + kurux dili + kəşmir dili + kürdcə + kumuk dili + kutenay dili + komi dili + korniş dili + qırğızca + latınca + ladin dili + laxnda dili + lamba dili + luksemburq dili + ləzqi dili + qanda dili + limburqiş dili + Linqala dili + laos dili + monqo dili + lozi dili + litva dili + luba-katanqa dili + luba-lulua dili + luyseno dili + lunda dili + luo dili + lushayca + latışca + maduriz dili + maqahi dili + maitili dili + makasar dili + məndinqo dili + avstronezicə + masay dili + mokşa dili + mandar dili + mende dili + malaqas dili + ortacaq irlandca + marşal dili + maori dili + mikmak dili + minanqkaban dili + çeşitli diller + makedoniya dili + mon-xmer dili + malayalamca + monqolca + mançu dili + manipüri dili + manobo dili + moldavca + moxak dili + mosi dili + marati dili + malayca + malta dili + digər dillər + munda dili + krik dili + mirand dili + maruari dili + burmis dili + maya dili + erzya dili + nauru dili + nahuatl dili + şimal amerika yerli dili + neapolital dili + norvec bokmal dili + şimal ndebele dili + aşağı almanca + nepalca + nevari dili + nqonka dili + nyas dili + niger-kordofyan dili + niyuan dili + hollandca + flem dili + norveç ninorsk dili + norveç dili + noqay dili + qədimi norsca + nqo dili + cənub ndebele dili + şimal soto dili + nubiy dili + navayo dili + nyanca dili + nyamvezi dili + nyankol dili + niyoro dili + nizima dili + oksitanca + ocibva dili + oromo dili + Oriyə dili + osetik dili + osage dili + osman dili + otomian dili + puncab dili + papua dili + panqasinan dili + paxlavi dili + pampanqa dili + papyamento dili + palayanca + qədimi farsca + filipin dili + foyenik dili + pali dili + Polish dili + ponpeyan dili + prakrit dili + qədimi provensialca + Puştu dili + portuqalca + İber portuqalca + kuechya dili + racastan dili + rapanu dili + rarotonqan dili + rundi dili + rumın + roman dili + rut dili + rusca + aromanca + kinyarvanda dili + Sanskrit dili + sandave dili + yakut dili + cənub amerika yerli dili + salişan dili + samaritan dili + sasak dili + santal dili + sardin dili + sisili dili + skots dili + sindhi dili + şimal sami dili + selkup dili + ivrit dili + sanqo dili + qədimi irlandca + işarət dili + serb-xorvatca + şan dili + sinhaliscə + sidamo dili + sioyan dili + sino-tibet dili + slovakca + slovencə + slav dili + samoa dili + cənub sami dili + səmi dili + lule sami dili + inari sami + skolt dili + şona dili + soninke dili + somali dili + soqdiyen dili + sonqay dili + Albanca + serb dili + sranan tonqo dili + serer dilii + svati dili + nilo-sahara dili + Sesoto dili + sundanca + sukuma dili + susu dili + sumeryan dili + isveçcə + suahilicə + siryak dili + tamilcə + tay dili + teluqu dili + timne dili + tereno dili + tetum dili + tacik dili + tayca + tiqrin dili + tiqre dili + tiv dili + türkməncə + tokelay dili + taqaloq dili + klinqon + tlinqit dili + tamaşek dili + svana dili + tonqa dili + niyasa tonga dili + tok pisin dili + türkcə + sonqa dili + simşyan dili + tatarca + tumbuka dili + tupi dili + altaik dili + tuvalu dili + Tvi dili + taxiti dili + tuvinyan dili + udmurt dili + uyğurca + uqaritik dili + ukraynaca + umbundu dili + bilinməyən vəya gəcərsiz dil + urduca + özbəkcə + vay dili + venda dili + vyetnamca + volapük dili + votik dili + valun dili + vakaşan dili + valamo dili + varay dili + vaşo dili + sorb dili + volof dili + kalmıqca + xosa dili + yao dili + yapiz dili + Yahudi dili + yoruba dili + yupik dili + juənq dili + zapotek dili + blisimbols dili + zenaqa dili + çincə + adi çincə + gələnəksəl çincə + zande dili + zulu dili + zuni dili + zaza dili + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dünya + Afrika + Şimal Amerika + Cənub Amerika + Okeyaniya + Qərb afrika + Orta Amerika + Şərq Afrika + Şimal Afrika + Orta Afrika + 018 + Amerikalar + 021 + Kariyıplar + Şərq Asiya + Cənub Asiya + Cənub Şərq Asiya + Cənub Avropa + Avstraliya və Yeni Zelandiya + Melanesya + Mikronesiya reqionu + Polineziya + Cənub Orta Asiya + Aziya + Orta Aziya + Qərb Asiya + Avropa + Şərq Avropa + Şimal Avropa + Qərb Avropa + 172 + Latın Amerikası və Kariblər + Andorra + Birləşmiş Ərəb Emiratları + Əfqənistan + Antiqua və Barbuda + Anquila + Albaniya + Ermənistan + Hollandiya antilleri + Angola + Antarktika + Arqentina + Amerika Samoası + Avstriya + Avstraliya + Aruba + Aland Adaları + Azərbaycan + Bosniya və Herzokovina + Barbados + Banqladeş + Belçika + Burkina Faso + Bolqariya + Bahreyn + Burundi + Benin + Seynt Bartelemey + Bermuda + Bruney + Boliviya + Braziliya + Bahamalar + Butan + Bove Adası + Botsvana + Belarus + Beliz + Kanada + Kokos Adaları + Konqo - Kinşasa + Orta Afrika respublikası + Konqo - Brazavil + isveçriya + İvori Sahili + Kuk Adaları + Çile + Kamerun + Çin + Kolumbiya + Kosta Rika + Kuba + Kape Verde + Çristmas Adası + Kipr + Çex respublikası + Almaniya + Ciboti + Danemarka + Dominika + Dominik Respublikası + Cezayır + Ekvador + Estoniya + Misir + Qərb Sahara + Eritreya + İspaniya + Efiopiya + Finlandiya + Fici + Folkland Adaları + Mikronesiya + Faro Adaları + Fransa + Qabon + Birləşmiş Krallıq + Qrenada + Gürcüstan + Fransız Quyanası + Görnsey + Qana + Gibraltar + Qrinland + Qambiya + Qvineya + Qvadalup + Ekvator Qineya + Yunanıstan + Cənub Gürcüstan və Cənub Sandvilç Adaları + Qvatemala + Quam + Qvineya-Bisau + Quyana + Honk Konq çina + Hörd və Makdonald Adaları + Qonduras + Xorvatiya + Haiti + Macaristan + İndoneziya + İrlandiya + İzrail + Man Adası + Hindistan + Britaniya-Hindistan Okeanik territoriyası + İrak + İran + İslandiya + İtaliya + Cörsi + Yamayka + Ürdün + Yaponiya + Kenya + Kırqızstan + Kambodiya + Kiribati + Komoros + Seynt Kits və Nevis + Şimal Koreya + Cənub Koreya + Kuveyt + Kayman Adaları + Kazaxstan + Laos + Lebanon + Seynt Lusiya + Lixtenşteyn + Şri Lanka + Liberiya + Lesoto + Litva + Lüksemburq + Latviya + Libya + Morokko + Monako + Moldova + Monteneqro + Seynt Martin + Madaqaskar + Marşal Adaları + Masedoniya + Mali + Myanmar + Monqoliya + Makao Çina + Şimal Mariana Adaları + Martiniqu + Mavritaniya + Montserat + Malta + Mavritis + Maldiv + Malavi + Meksika + Malaysiya + Mazambik + Namibiya + Yeni Kaledoniya + nijer + Norfolk Adası + Nijeriya + Nikaraqua + Hollandiya + Norvec + Nepal + Nauru + Niye + Yeni Zelandiya + Oman + Panama + Peru + Fransız Polineziya + Papua Yeni Qvineya + Filipin + Pakistan + Polşa + Seynt Piyer və Mikelon + Pitkarn + Puerto Riko + Fələstin Bölqüsü + Portuqal + Palav + Paraqvay + Qatar + Uzak Okeyaniya + Avropa Birləşliyi + Reyunion + Romaniya + Serbiya + Rusiya + Rvanda + Saudi Ərəbistan + Solomon Adaları + Seyçels + sudan + isveç + Sinqapur + Seynt Elena + Sloveniya + svalbard və yan mayen + Slovakiya + Siyera Leon + San Marino + Seneqal + Somaliya + surinamə + Sao Tom və Prinsip + El Salvador + siriya + svazilənd + Türk və Kaykos Adaları + Çad + Fransız Cənub teritoriyası + Toqo + tayland + tacikistan + Tokelau + Şərq Timor + Türkmənistan + Tunisiya + Tonqa + Türkiya + Trinidan və Tobaqo + Tuvalu + tayvan + tanzaniya + Ukraina + Uqanda + Birləşmiş Ştatların uzaq adaları + Amerika Birləşmiş Ştatları + Uruqvay + Özbəkistan + Vatikan + Seynt Vinsent və Qrenada + Venesuela + Britaniya Virgin Adaları + ABŞ Virqin Adaları + Vyetnam + Vanuatu + Valis və Futuna + Samoa + Yemen + Mayot + Cənub Afrika + Zambiya + Zimbabve + bilinmir + + + Budist təqvimi + Çin təqvimi + Qreqoriy təqvimi + Yahudi təqvimi + Hindi təqvimi + Müsəlman təqvimi + Ivrit təqvimi + Yapon təqvimi + Pinyin təqvimi + Çin respublikası təqvimi + + + ABŞ + metr + + + Dil: {0} + Yazı: {0} + Rayon: {0} + + + + [a-c ç d e ə f g ğ h x ı i İ {i\u0307} j k q l-o ö p r s ş t u ü v y z] + [w] + + + “ + ” + ‘ + ’ + + + + + + + + yan + fev + mar + apr + may + iyn + iyl + avq + sen + okt + noy + dek + + + Yanvar + Fevral + Mart + Aprel + May + İyun + İyul + Avqust + Sentyabr + Oktyabr + Noyabr + Dekabr + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + B. + B.E. + Ç.A. + Ç. + C.A. + C + Ş. + + + bazar + bazar ertəsi + çərşənbə axşamı + çərşənbə + cümə axşamı + cümə + şənbə + + + + + 7 + 1 + 2 + 3 + 4 + 5 + 6 + + + + + + + 1-ci kv. + 2-ci kv. + 3-cü kv. + 4-cü kv. + + + 1-ci kvartal + 2-ci kvartal + 3-cü kvartal + 4-cü kvartal + + + + AM + PM + + + eramızdan əvvəl + bizim eramızın + + + e.ə. + b.e. + + + + + + EEEE, d, MMMM, y + + + + + d MMMM , y + + + + + d MMM, y + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + era + + + il + + + ay + + + həftə + + + bu gün + üç gün əvvəl + dünən + bu gün + sabah + üç gün sonra + + + həftə günü + + + saat + + + dəqiqə + + + saniyə + + + zona + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Bilinmir + + + rofera + + + çənub polus + + + syova + + + moson + + + Deyvis + + + vostok + + + Keysi + + + Dumont de Urvile + + + makmurdo + + + rio qayegos + + + mendoza + + + san xuan + + + uşuya + + + La Rioha + + + san luis + + + Katamarka + + + Cucuy + + + tukuman + + + Kordoba + + + Buenos Ayres + + + perf + + + Yukla + + + Darvin + + + Adelayd + + + Broken Hil + + + Kuriye + + + melburn + + + sidney + + + Brisbeyn + + + Lord Hove + + + İrunepe + + + Rio Branko + + + porto velo + + + Kuyaba + + + Kampo Qrande + + + Araguayna + + + sao paulo + + + Bahiya + + + Maseyo + + + resif + + + noronha + + + Douson + + + vaythors + + + İnuvik + + + vənkuver + + + Douson Krik + + + yelounayf + + + Edmondton + + + svift kurent + + + Kəmbric Bey + + + recina + + + vinipeq + + + resolut + + + reyni river + + + rankin inlet + + + Koral Harbor + + + funder bey + + + nipiqon + + + toronto + + + montreal + + + İqalut + + + panqnirtanq + + + monkton + + + Halifaks + + + Qus Bey + + + Qleys Bey + + + Blank-Sablon + + + St Johns + + + Kinşasa + + + Lubumbaşi + + + İster + + + Kaşqar + + + urumçi + + + Conqinq + + + Qalapaqos + + + Kanari + + + Seuta + + + ponape + + + Kosraye + + + tul + + + skoresbisund + + + Danmarkşavn + + + Cakarta + + + pontiyanak + + + Makasar + + + Cayapura + + + Enderböri + + + Kirimati + + + tarava + + + Aktau + + + qüzülorda + + + Almati + + + Kvajaleyn + + + Maxiro + + + ulanbatar + + + Coybalsan + + + tixuana + + + Hermosilo + + + mazaltan + + + Cihuvava + + + monterey + + + mexiko + + + Kankun + + + Kuçinq + + + Çatam + + + Markuyesas + + + Qambiyer + + + Madeyra + + + Kalininqrad + + + moskva + + + volqoqrad + + + samara + + + yekaterinburq + + + novosibirsk + + + İrkutsk + + + yakutsk + + + vladivostok + + + saxalin + + + Maqadan + + + Kamçatka + + + Anadır + + + ujgorod + + + Kiyev + + + simferopol + + + zaporojye + + + midvey + + + Conston + + + veyk + + + nom + + + Ankorac + + + yakutat + + + Cüneau + + + Los Anceles + + + Boyse + + + finiks + + + şiprok + + + nyu salem + + + Orta, Şimal Dakota + + + Cikaqo + + + menomini + + + vinsenes + + + pitersburq + + + tell şəhəri + + + Noks + + + vinamak + + + Marenqo + + + İndianapolis + + + Luisvil + + + vevey + + + montiçelo + + + Detroyt + + + nyu york + + + səmərkənd + + + + Orta Avropa + Orta Avropa/yay + + + Orta Avropa/standart + Orta Avropa/yaz + + + + + Şərq Avropa + Şərq Avropa/yay + + + Şərq Avropa/standart + Şərq Avropa/yaz + + true + + + + Kuybuşev + Kuybuşev/yay + + + + + Moskva + Moskva/standart + Moskva/yay + + true + + + + Samara + Samara/yay + + + + + Türkiya + Türkiya/yay + + true + + + + Volqoqrad + Volqoqrad/yay + + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + ¤ #,##0.00 + + + + + + Andora pesetası + Andora pesetası + + + Birləşmiş ərəb emiratlar dirhamı + BƏE dirhamı + + + Əfgəni (AFA) + Əfgən (AFA) + + + Əfgəni + Əfgən + + + Alban leki + Alban leki + + + Erməni dramı + Erməni dramı + + + Hollandiya antila gilderi + Hollandiya Antila gilderi + + + Anqola kvanzası + Anqola kvanzasi + + + Anqola kvanzasi (1977-1990) + Anqola kvanzasi (AOK) + + + Anqola yeni kvanzası (1990-2000) + Anqola yeni kvanzasi (AON) + + + Anqola kvanzası (1995-1999) + Anqola kvanzasi (AOR) + + + Argentina avstralı + Argentina avstralı + + + Argentina pesosu (1983-1985) + Argentina pesosu (ARP) + + + Argentina pesosu + Argentina pesosu + + + Avstriya şilingi + Avstriya şilingi + + + Avstraliya dolları + Avstraliya dolları + + + Aruba qilderi + Aruba qilderi + + + Manat + Azərbaycan manatı (AZM) + + + Azərbaycan manatı + Azərbaycan manatı + + + Bosniya-Herzeqovina dinarı + Bosniya-Herzeqovina dinarı + + + Bosniya-Herzeqovina markası + Bosniya-Herzeqovina markası + + + Barbados dolları + Barbados dolları + + + Banqladeş takası + Banqladeş takası + + + Belçika frankı (deyşirik) + Belçika frankı (deyşirik) + + + Belçika frankı + Belçika frankı + + + Belçika frankı (finans) + Belçika frankı (finans) + + + Bolqariya levası + Bolqariya levası + + + Bolqariya yeni levası + Bolqariya yeni levası + + + Bahreyn dinarı + Bahreyn dinarı + + + Burundi frankası + Burundi frankası + + + Bermuda dolları + Bermuda dolları + + + Bruney dolları + Bruney dolları + + + Boliviano + Boliviano + + + Boliviya pesosu + Boliviya pesosu + + + Boliviya mvdolı + Boliviya mvdolı + + + Braziliya kruzeyro novası + Braziliya kruzeyro novası + + + Braziliya kruzadosu + Braziliya kruzadosu + + + Braziliya kruzeyrosu (1990-1993) + Braziliya kruzeyrosu (BRE) + + + Braziliya realı + Braziliya realı + + + Braziliya kruzado novası + Braziliya kruzado novası + + + Braziliya kruzeyrosu + Braziliya kruzeyrosu + + + Bahama dolları + Bahama dolları + + + Butan ngultrumu + Butan ngultrumu + + + Burmis kyatı + Burmis kyatı + + + Botsvana pulası + Botsvana pulası + + + Belarusiya yeni rublu + Belarusiya yeni rublu + + + Belarusiya rublu + Belarusiya rublu + + + Beliz dolları + Beliz dolları + + + Kanadiya dolları + Kanada dolları + + + Konqoliz frank konqolaysı + Konqoliz frank konqolaysı + + + WIR Yevrosu + WIR Yevrosu + + + İsveçriya frankası + İsveçriya frankası + + + WIR frankası + WIR frankası + + + Çili pesosu + Çili pesosu + + + Çin yuan renminbi + Çin yuanı + + + Kolombiya pesosu + Kolombiya pesosu + + + Kosta rika kolonu + Kosta Rika kolonu + + + Qədimi Serb dinarı + Qədimi serb dinarı + + + Çexoslavakiya korunası + Çexoslavakiya korunası + + + Kuba pesosu + Kuba pesosu + + + Kape Verde eskudosu + Kape Verde eskudosu + + + Kipr paundu + Kipr paundu + + + Çex respublikası korunası + Cex respublika korunası + + + şərq almaniya ostmarkı + Şərq Almaniya ostmarkı + + + alman markası + Alman markası + + + jibouti frankası + Jibouti frankası + + + Danemarka kronası + Danemarka kronası + + + dominika pesosu + Dominika pesosu + + + Alcəzir dinarı + Alcəzir dinarı + + + ekvador sukresi + Ekvador sukresi + + + Estoniya krunu + Estoniya krunu + + + misir paundu + Misir paundu + + + Eirtreya nakfası + Eritreya nakfası + + + İspan pesetası (A) + İspan pesetası (A account) + + + İspan pesetası (dəyşirik) + İspan pesetası (dəyşirik) + + + İspan pesetası + İspan pesetası + + + Efiopiya birası + Efiopiya birası + + + Yevro + yevro + + + Fin markası + Fin markası + + + Fici dolları + Fici dolları + + + Folkland Adası paundu + Folkland adası paundu + + + Fransız markası + Fransız markası + + + Britaniya paund sterlingi + Britaniya paund sterlingi + + + Gürcüstan kupon lariti + Gürcüstan kupon lariti + + + Gürcüstan larisi + Gürcüstan larisi + + + Qana sedisi (1979-2007) + Qana sedisi (GHC) + + + Qana sedisi + Qana sedisi + + + Gibraltar paundu + Gibraltar paundu + + + Qambiya dalasi + Qambiya dalasi + + + Qvineya frankası + qvineya frankası + + + Qvineya sulisi + Gineya sulisi + + + Ekvatoriya Gvineya ekvele quneanası + Ekvatoriya Gvineya ekvele quneanası + + + Yunan draçması + Yunan draxması + + + Qvatemala küetzalı + Qvatemala küetzalı + + + Portugal Qvineya eskudosu + Portugal Qvineya eskudosu + + + Qvineya-Bisau pesosu + Qvineya-Bisau pesosu + + + Quyana dolları + Quyana dolları + + + Honk Konq dolları + Honk Konq dolları + + + Honduras lempirası + Honduras lempirası + + + Xorvatiya dinarı + Xorvatiya dinarı + + + Xorvatiya kunu + Xorvatiya kunu + + + Haiti qourdu + Haiti qourdu + + + Macarıstan forinti + Macarıstan forinti + + + İndoneziya rupisi + İndoneziya rupisi + + + İrlandiya paundu + İrlandiya paundu + + + İzrail paundu + İzrail paundu + + + İzrail yeni şekeli + İzrail ail yeni şekeli + + + Hindistan rupisi + Hindistan rupisi + + + İraq dinarı + İraq dinarı + + + İran rialı + İran rialı + + + Aysland kronası + Aysland kronası + + + İtaliya lirası + İtaliya lirası + + + Yamayka dolları + Yamayka dolları + + + İordaniya dinarı + İordaniya dinarı + + + Yapon yeni + Yapon yeni + + + Kenya şillingi + Kenya şillingi + + + Kırğızstan somu + Kırğızstan somu + + + Kambodiya riyeli + Kambodiya riyeli + + + Komoro frankı + Komoro frankı + + + Şimal koreya vonu + Şimal Koreya vonu + + + Cənub koreya vonu + Cənub Koreya vonu + + + Kuveyt dinarı + Kuveyt dinarı + + + Keyman Adaları dolları + Keyman Adaları dolları + + + Kazaxstan tenqesi + Kazaxstan tenqesi + + + Laotiya kipi + Laotiya kipi + + + Lebanon paundu + Lebanon paundu + + + Şri Lanka rupisi + Şri Lanka rupisi + + + Liberiya dolları + Liberiya dolları + + + Lesoto lotisi + Lesoto lotisi + + + Litva litası + Litva litası + + + Litva talonası + Litva talonası + + + Luksemburq frankası (dəyişik) + Luksemburq dəyişik frankası + + + Luksemburq frankası + Luksemburq frankası + + + Luksemburq frankası (finans) + Luksemburq finans frankası + + + Latviya latsı + Latviya latsı + + + Latviya rublu + Latviya rublu + + + Liviya dinarı + Liviya dinarı + + + Morokko dirhamı + Morokko dirhamı + + + Morokko frankası + Morokko frankası + + + Moldova leyusu + Moldova leyusu + + + Madaqaskar ariarisi + Madaqaskar ariarisi + + + Madaqaskar frankası + Madaqaskar frankası + + + Masedoniya denarı + Masedoniya denarı + + + Mali frankı + Mali frankı + + + Myanmar kiyatı + Myanmar kiyatı + + + Monqoliya tuqriki + Monqoliya tuqriki + + + Makao patakası + Makao patakası + + + Mavritaniya oyuquyası + Mavritaniya oyuquyası + + + Maltiz paundu + Maltiz paundu + + + Mavritis rupiyi + Mavritis rupiyi + + + Maldiv Adaları rufiyi + Maldiv adaları rufiyi + + + Malavi kvaçası + Malavi kvaçası + + + Meksika pesosu + Meksika pesosu + + + Meksika gümüş pesosu + Meksika gümüş pesosu + + + Malaysiya rinqiti + Malaysiya rinqiti + + + Mozambik eskudosu + Mozambik eskudosu + + + Qədim Mozambik metikalı + Qədim mozambik metikalı + + + Mozambik metikalı + Mozambik metikalı + + + Namibiya dolları + Namibiya dolları + + + Nigeriya nairi + Nigeriya nairi + + + Nikaraqua kordobu + Nikaraqua kordobu + + + Hollandiya gilderi + Hollandiya gilderi + + + Norveç kronu + Norveç kronu + + + Nepal rupiyi + Nepal rupiyi + + + Yeni Zelandiya dolları + Yeni Zelandiya dolları + + + Mman rialı + Oman rialı + + + Panamaniya balboa + Panamaniya balboa + + + Peru inti + Peru inti + + + Peru sol nuyevosu + Peru sol nuyevosu + + + Peru solu + Peru solu + + + Papua Yeni Qvineya kini + Papua Yeni Qvineya kini + + + Filipin pesosu + Filipin pesosu + + + Pakistan rupiyi + Pakistan rupiyi + + + Polsha zlotisi + Polsha zlotisi + + + Polsha zlotisi (1950-1995) + Polsha zlotisi (PLZ) + + + Portuqal eskudosu + Portuqal eskudosu + + + Paraqvay quarani + Paraqvay quarani + + + Qatar rialı + Qatar rialı + + + Rodezian dolları + Rodezian dolları + + + Qədim Roman leyu + Roman qədimi leyu + + + Roman leyu + Roman leyu + + + Serbiya dinarı + Serbiya dinarı + + + Rusiya rublu + Rusiya rublu + + + Rusiya rublu (1991-1998) + Rusiya rublu (RUR) + + + Rvanda frankı + Rvanda frankı + + + Saudi riyalı + Saudi riyalı + + + Solomon Adaları dolları + Solomon Adaları dolları + + + Seyçel rupiyi + Seyçel rupiyi + + + Sudan paundu + Sudan paundu + + + İsveç kronu + İsveç kronu + + + Sinqapur dolları + Sinqapur dolları + + + Sloveniya toları + Sloveniya toları + + + Slovak korunası + Slovak korunası + + + Somaliya şillingi + Somaliya şillingi + + + Surinam dolları + Surinam dolları + + + Sovet rublu + Sovet rublu + + + el salvador kolonu + El Salvador kolonu + + + Siriya paundu + Siriya paundu + + + Svazilənd lilangeni + Svazilənd lilangeni + + + tay bahtı + Tay bahtı + + + Tacikistan rublu + Tacikistan rublu + + + Tacikistan somoni + Tacikistan somoni + + + Türkmənistan manatı + Türkmənistan manatı + + + Tunis dinarı + Tunis dinarı + + + Tonqa panqası + Tonqa panqası + + + Timor eskudu + Timor eskudu + + + Türk köhnə lirası + Türk köhnə lirası + + + Türk lirası + Türk lira + + + Tayvan yeni dolları + Tayvan yeni dolları + + + Tanzaniya şilingi + Tanzaniya şilingi + + + Ukraina hrivnyası + Ukraina hrivnyası + + + Ukraina karbovenesası + Ukraina karbovenesası + + + Uqanda şelingi (1966-1987) + Uqanda şelingi (UGS) + + + Uqanda şelingi + Uqanda şelingi + + + ABŞ dolları + ABŞ dolları + + + ABŞ dolları (yeni gün) + ABŞ dolları (yeni gün) + + + ABŞ dolları (həmin gün) + ABŞ dolları (həmin gün) + + + Uruqvay pesosu Unidades Indexadas + Uruqvay pesosu unidades indexadas + + + Uruqvay pesosu (1975-1993) + Uruqvay pesosu (UYP) + + + Uruqvay pesosu (Uruguayo) + Uruqvay pesosu + + + özbəkistan sumu + Özbəkistan sumu + + + venesuela bolivarı + Venesuela bolivarı + + + venesuela bolivar fuerti + Venesuela Bolivar fuerti + + + vyetnam donqu + Vyetnam donqu + + + qərb samoa talası + Qərb Samoa talası + + + gümüş + gümüş + + + qızıl + qızıl + + + şərq karib dolları + Şərq karib dolları + + + Fransız gızıl frankı + Fransız gızıl frankı + + + Fransız UİC frankı + Fransız UİC frankı + + + CFA franka BCEAO + CFA franka BCEAO + + + Palladium + Palladium + + + CFP frankı + CFP frankı + + + platinum + platinum + + + bilinməyən vəya gəcərsiz + bilinməyən vəya gəcərsiz + + + yemen dinarı + Yemen dinarı + + + yemen rialı + Yemen rialı + + + Yuqoslaviya dinarı (hard) + Yuqoslaviya dinarı (hard) + + + Yuqoslaviya yeni dinarı (hard) + Yuqoslaviya yeni dinarı (hard) + + + Yuqoslaviya dinarı (dəyişik) + Yuqoslaviya dinarı (dəyişik) + + + Cənub afrika randı (finans) + Cənub Afrika randı (finans) + + + Cənub afrika randı + Cənub Afrika randı + + + Zambiya kvaçı + Zambiya kvaçı + + + Zair yeni zairi + Zair yeni zairi + + + Zair zairi + Zair zairi + + + Zimbabve dolları + Zimbabve dolları + + + + + + {0} gün + + + {0} saat + + + {0} dəqiqə + + + {0} ay + + + {0} saniyə + + + {0} həftə + + + {0} il + + + + + hə:h + yox:y + + + + diff --git a/lib/zend/Zend/Locale/Data/az_AZ.xml b/lib/zend/Zend/Locale/Data/az_AZ.xml new file mode 100644 index 0000000000..2b1e6c7337 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/az_AZ.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/az_Cyrl.xml b/lib/zend/Zend/Locale/Data/az_Cyrl.xml new file mode 100644 index 0000000000..b4d24d8e50 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/az_Cyrl.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + Свет + Афрыка + Паўночная Амэрыка + Паўднёвая Амэрыка + Акіянія + Заходняя Афрыка + Цэнтральная Амэрыка + Усходняя Афрыка + Паўночная Афрыка + Цэнтральная Афрыка + Паўднёвая Афрыка + Паўночная і Паўднёвая Амерыкі + ЗША і Канада + Карыбскія астравы + Усходняя Азія + Паўднёвая Азія + Паўднёва-Усходняя Азія + Паўднёвая Еўропа + Аўстралія і Новая Зэландыя + Палінезія + Паўднёва-Цэнтральная Азія + Азія + Цэнтральная Азія + Заходняя Азія + Еўропа + Усходняя Еўропа + Паўночная Еўропа + Заходняя Еўропа + Садружнасць Незалежных Дзяржаў + Андора + Аб'яднаныя Арабскія Эміраты + Афганістан + Антыгуа і Барбуда + Ангуілля + Албанія + Арменія + Нідэрландскія Антылы + Ангола + Антарктыка + Аргенціна + Амерыканскае Самоа + Аўстрыя + Аўстралія + Аруба + Аландскія астравы + Азербайджан + Боснія і Герцагавіна + Барбадас + Бангладэш + Бельгія + Буркіна-Фасо + Балгарыя + Бахрэйн + Бурундзі + Бенін + Бермудскія астравы + Бруней-Дарусалам + Балівія + Бразілія + Багамскія Астравы + Бутан + Бувэ востраў + Батсвана + Беларусь + Беліз + Канада + Какосавыя астравы + Конга, Дэмакратычная Рэспубліка + Цэнтральна-Афрыканская Рэспубліка + Конга + Швейцарыя + Кука астравы + Чылі + Камерун + Кітай + Калумбія + Коста-Рыка + Куба + Каба-Вердэ + Калядаў востраў + Кіпр + Чэхія + Германія + Джыбуці + Данія + Дамініка + Дамініканская Рэспубліка + Алжыр + Эквадор + Эстонія + Егіпет + Заходняя Сахара + Эрытрэя + Іспанія + Эфіопія + Фінляндыя + Фіджы + Фолклэндскія астравы + Мікранезія + Францыя + Габон + Велікабрытанія + Грэнада + Грузія + Французская Гвіяна + Гана + Гібралтар + Грэнландыя + Гамбія + Гвінея + Гвадэлупа + Экватарыяльная Гвінея + Грэцыя + Паўднёвая Джорджыя і Паўднёвыя Сандвічавы астравы + Гватэмала + Гвінея-Бісаў + Гаяна + Гон-Конг, Кітай (САР) + Гэрда востраў і МакДоналда астравы + Гандурас + Харватыя + Гаіці + Венгрыя + Інданезія + Ірландыя + Ізраіль + Індыя + Брытанская тэрыторыя Індыйскага акіяну + Ірак + Іран, Ісламская Рэспубліка + Ісландыя + Італія + Ямайка + Іарданія + Японія + Кенія + Кыргызстан + Камбоджа + Кірыбаці + Каморскія Астравы + Сэнт-Кітс і Нэвіс + Паўночная Карэя + Паўднёвая Карэя + Кувейт + Кайманавы астравы + Казахстан + Лаоская Народна-Дэмакратычная Рэспубліка + Ліван + Сэнт-Люсія + Ліхтэнштэйн + Шры-Ланка + Ліберыя + Лесота + Літва + Люксембург + Латвія + Лівійская Арабская Джамахірыя + Марока + Манака + Малдова + Чарнагорыя + Мадагаскар + Маршалавы Астравы + Македонія, БЮР + Малі + М'янма + Манголія + Макао, Кітай (САР) + Паўночныя Марыянскія астравы + Марцініка + Маўрытанія + Монсэрат + Мальта + Маўрыкій + Мальдыўскія Астравы + Малаві + Мексіка + Малайзія + Мазамбік + Намібія + Новая Каледонія + Нігер + Норфалкскія астравы + Нігерыя + Нікарагуа + Нідэрланды + Нарвегія + Непал + Науру + Ніуэ + Новая Зеландыя + Аман + Панама + Перу + Франузская Палінэзія + Папуа-Новая Гвінея + Філіпіны + Пакістан + Польшча + Палестынскія тэрыторыі + Партугалія + Палаў + Парагвай + Катар + Вонкавая Акіянія + Еўрапейскі Звяз + Рэюньён + Румынія + Сербія + Расія + Руанда + Саудаўская Аравія + Саламонавы Астравы + Сейшэльскія Астравы + Судан + Швецыя + Сінгапур + Святой Алены, Востраў + Славенія + Свальбард (Паўночна-Усходняя Зямля) і Ян-Маен + Славакія + Сьера-Леонэ + Сенегал + Самалі + Сурынам + Сан-Томэ і Прынсіпі + Сальвадор + Сірыйская Арабская Рэспубліка + Свазіленд + Тэркс і Кайкас астравы + Чад + Французскія Паўднёвыя тэрыторыі + Тога + Тайланд + Таджыкістан + Такелаў + Усходні Тымор + Туркменістан + Туніс + Тангійская + Турцыя + Трынідад і Табага + Тувалу + Тайвань + Танзанія, Аб'яднаная Рэспубліка + Украіна + Уганда + Злучаныя Штаты + Уругвай + Узбекістан + Ватыкан + Сэнт-Вінсэнт і Грэнадыны + Венесуэла + Віргінскія астравы + Віргінскія астравы, ЗША + В'етнам + Вануату + Уоліс і Футуна + Самоа (Заходняе) + Емен + Паўднёва-Афрыканская Рэспубліка + Замбія + Зімбабвэ + Невядомы рэгіён + + + каляндар + параўнаньне тэксту + валюта + + + будысцкі каляндар + кітайскі каляндар + грэгарыянскі каляндар + іудэйскі каляндар + мусульманскі каляндар + мусульманскі свецкі каляндар + японскі каляндар + + + ЗША + метрычная + + + Мова: {0} + Пісьмо: {0} + Рэгіён: {0} + + + + lowercase-words + + + [а-д {дж} {дз} е ё ж з і й-у ў ф-ш ы-я] + [] + [a-z] + + + „ + ” + « + » + + + + + + + + EEEE, d MMMM y G + + + + + d MMMM y G + + + + + d MMM y G + + + + + d.M.yy + + + + + + + + + сту + лют + сак + кра + май + чэр + ліп + жні + вер + кас + ліс + сне + + + т + + + студзень + люты + сакавік + красавік + май + чэрвень + ліпень + жнівень + верасень + кастрычнік + лістапад + снежань + + + + + тра + + + с + л + с + к + м + ч + л + ж + в + к + л + с + + + травень + + + + + + + нд + пн + аў + ср + чц + пт + сб + + + нядзеля + панядзелак + аўторак + серада + чацвер + пятніца + субота + + + + + н + п + а + с + ч + п + с + + + + + + + 1-шы кв. + 2-гі кв. + 3-ці кв. + 4-ты кв. + + + 1-шы квартал + 2-гі квартал + 3-ці квартал + 4-ты квартал + + + + + 1 + 2 + 3 + 4 + + + + да палудня + пасля палудня + + + да н.э. + н.э. + + + да н.е. + н.е. + + + да н.э. + н.э. + + + + + + EEEE, d MMMM y + + + + + d MMMM y + + + + + d.M.yyyy + + + + + d.M.yy + + + + + + + HH.mm.ss zzzz + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + H.mm + H.mm.ss + L + E, d MMM + LLL + E, d MMM + MMMM d, EEEE + MMMM d + d MMM + d.M + d + h.mm a + h.mm.ss a + mm:ss + y + MM/yyyy + EEE, dd/MM/yyyy + MMM y + EEE, d MMM y + MMMM y + Q 'кв'. y + QQQ y + Q yy + MM/yyyy + MMMM y + + + {0} - {1} + + M-M + + + E, d.M - E, d.M + E, d.M - E, d.M + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + d.M - d.M + d.M - d.M + + + d-d + + + HH-HH + + + HH.mm-HH.mm + HH.mm-HH.mm + + + HH.mm-HH.mm v + HH.mm-HH.mm v + + + HH-HH v + + + y-y + + + M.yy - M.yy + M.yy - M.yy + + + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + + + MMM-MMM y + MMM y - MMM y + + + E, d MMM - E, d MMM y + E, d - E, d MMM y + E, d MMM y - E, d MMM y + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + d.M.yy - d.M.yy + d.M.yy - d.M.yy + d.M.yy - d.M.yy + + + + + + эра + + + год + + + месяц + + + тыдзень + + + дзень + пазаўчора + учора + сёння + заўтра + паслязаўтра + + + дзень тыдня + + + Dayperiod + + + гадзіна + + + хвіліна + + + секунда + + + Zone + + + + + + +HH:mm;-HH:mm + GMT{0} + Час: {0} + {1} ({0}) + + Невядомы + + + Рыё Бранка + + + Кампа Грандэ + + + Сан-Паўлу + + + Ганалулу + + + Анкорыдж + + + Лос-Анджэлас + + + Фэнікс + + + Дэнвэр + + + Чыкага + + + Індыянапаліс + + + Нью-Ёрк + + + + Паўночнаамэрыканскі цэнтральны час + Паўночнаамэрыканскі цэнтральны стандартны час + Паўночнаамэрыканскі цэнтральны летні час + + + + + Паўночнаамэрыканскі усходні час + Паўночнаамэрыканскі усходні стандартны час + Паўночнаамэрыканскі усходні летні час + + + + + Паўночнаамэрыканскі горны час + Паўночнаамэрыканскі горны стандартны час + Паўночнаамэрыканскі горны летні час + + + + + Ціхаакіянскі час + Ціхаакіянскі стандартны час + Ціхаакіянскі летні час + + + + + Атлянтычны час + Атлянтычны стандартны час + Атлянтычны летні час + + + + + Цэнтральнаэўрапейскі час + Цэнтральнаэўрапейскі летні час + + + + + Усходнеэўрапейскі час + Усходнеэўрапейскі летні час + + + + + Заходнеэўрапейскі час + Заходнеэўрапейскі летні час + + + + + Грынвічскі час + + true + + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + аўстралійскі даляр + + + бразільскі рэал + + + Руб + + + беларускі рубель + + + кітайскі юань Renminbi + + + эрытрэйская накфа + + + еўра + + + англійскі фунт + + + індыйская рупія + + + японская іена + ¥ + + + нарвэская крона + + + рускі рубель + рас. руб. + + + долар ЗША + $ + + + невядомая або недапушчальная валюта + + + + + + {0} дні + {0} дзён + {0} дзень + {0} дня + + + {0} гадзіны + {0} гадзін + {0} гадзіна + {0} гадзіны + + + {0} хвіліны + {0} хвілін + {0} хвіліна + {0} хвіліны + + + {0} месяца + {0} месяцаў + {0} месяц + {0} месяца + + + {0} сэкунды + {0} сэкунд + {0} сэкунда + {0} сэкунды + + + {0} тыдні + {0} тыдняў + {0} тыдзень + {0} тыдня + + + {0} гады + {0} гадоў + {0} год + {0} году + + + + + так:т + не:н + + + + diff --git a/lib/zend/Zend/Locale/Data/be_BY.xml b/lib/zend/Zend/Locale/Data/be_BY.xml new file mode 100644 index 0000000000..f353ea4efa --- /dev/null +++ b/lib/zend/Zend/Locale/Data/be_BY.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/bg.xml b/lib/zend/Zend/Locale/Data/bg.xml new file mode 100644 index 0000000000..cc28f845f4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/bg.xml @@ -0,0 +1,3966 @@ + + + + + + + + + + + {0} ({1}) + , + + + афар + абхазски + ачински + аколи + адангме + адиге + авестски + африканс + афро-азиатски + африхили + айну + акан + акадски + алеутски + алгонквин + южноалтайски + амхарски + арагонски + староанглийски + ангика + езици на апахите + арабски + арамейски + мапуче + арапахо + изкуствен + аравак + асамски + астурски + атабаски езици + австралийски езици + аварски + авади + аймара + азърбайджански + башкирски + банда + бамикеле + балучи + балинейски + баса + балтийски + беларуски + бея + бемба + берберски + български + бихари + божпури + бислама + биколски + бини + сиксика + бамбара + бенгалски + банту + тибетски + бретонски + брадж + босненски + батак + бурятски + бугински + биленски + каталонски + каддо + централноамерикански индиански + карибски + кавказски + атсам + чеченски + себуано + келтски + чаморо + чибча + чагатай + чуук + марийски + жаргон чинуук + чокто + чиипувски + чероки + чейенски + чамски + корсикански + коптски + креолски или пиджин от английски + креолски и пиджин от френски + креолски или пиджин от португалски + крии + кримскотатарски + креолски или пиджини + чешки + кашубски + църковно славянски + кушитски езици + чувашки + уелски + датски + дакотски + даргва + даякски + немски + австрийски немски + швейцарски горногермански + делауер + слейви + догриб + динка + догри + дравидски езици + долносербски + дуала + средновековен холандски + дивехи + диула + дзонха + еуе + ефик + египетски + екажук + гръцки + еламитски + английски + австралийски английски + канадски английски + британски английски + американски английски + средновековен английски + есперанто + испански + латиноамерикански испански + иберийски испански + естонски + баски + евондо + персийски + фанг + фанти + фула + фински + филипински + угрофински + фиджийски + фарьорски + фон + френски + канадски френски + швейцарски френски + средновековен френски + старофренски + северен фризски + източен фризски + фриулиански + фризийски + ирландски + га + гайо + гбая + шотландски галски + германски + гииз + гилбертски + галисийски + средновековен немски + гуарани + старовисоконемски + гонди + горонтало + готически + гребо + древногръцки + швейцарски немски + гуджарати + манкски + гвичин + хауза + хайда + хавайски + иврит + хинди + хилигайнон + химачали + хитски + хмонг + хири моту + хърватски + горносербски + хаитянски + унгарски + хупа + арменски + хереро + интерлингва + ибан + индонезийски + оксидентал + игбо + сечуански + иджо + инупиак + илоко + индийска група + индо-европейски + ингушетски + идо + ирански + ироквиански езици + исландски + италиански + инуктитут + японски + лоджбан + еврейско-персийски + еврейско-арабски + явански + грузински + каракалпашки + кабилски + качински + жжи + камба + каренски + кави + кабардиан + туап + коро + конгоански + кхаси + езици коисан + котски + кикуйу + кваняма + казахски + гренландски ескимоски + кхмерски + кимбунду + каннада + корейски + конкани + косраен + кпеле + канури + карачай-балкарски + карелски + кру + курук + кашмирски + кюрдски + кумикски + кутенай + Коми + корнуолски келтски + киргизски + латински + ладино + лахнда + ламба + люксембургски + лезгински + ганда + лимбургски + лингала + лаоски + монго + лози + литовски + луба катанга + луба-лулуа + луисеньо + лунда + луо + лушаи + латвийски + мадурски + магахи + майтхили + макасар + мандинго + австронезийски + масайски + мокша + мандар + менде + малгашки + средновековен ирландски + маршалезе + маорски + микмак + минангбау + други езици + македонски + мон-кхмерски език + малаялам + монголски + манчжурски + манипури + манобо + молдовски + мохавк + моси + маратхи + малайски + малтийски + многоезични + мунда + крик + мирандийски + марвари + бирмански + майя език + ерзиа + науру + нахуатл + северноамерикански индиански + неаполитански + норвежки бокмал + северен ндебеле + долносаксонски + непалски + неварски + ндонга + ниас + нигер-кордофански + ниуеан + холандски + фламандски + съвременен норвежки + норвежки + ногаи + старонорвежски + н’ко + южен ндебеле + северен сото + нубийски езици + навахо + класически невари + чинянджа + ниамвези + нианколе + нуоро + нзима + окситански + оджибва + оромо + ория + осетски + оседжи + отомански турски + старотурски езици + пенджабски + папуаски + пангасинан + пехлевийски + пампанга + папиаменту + палауан + староперсийски + филипински (други) + финикийски + пали + полски + похнпеиан + пракритски език + провансалски + пущу + португалски + кечуа + раджастански + рапа нуи + рапотонган + реторомански + рунди + румънски + романски + цигански език + роот + руски + арумънски + киняруанда + санкскритски + сандве + якутски + южноамерикански индиански + салишански език + самаритански арамейски + сасак + сантали + сардински + сицилиански + шотландски + синдхи + северен сами + селкуп + семитски + санго + староирландски + жестомимичен език + сърбохърватски + шан + синхалски + сидамо + език сиу + синотибетски + словашки + словенски + славянски + самоански + южносаамски + саамски езици + луле-саамски + инари-саамски + сколт-саамски + шона + сонинке + сомалийски + согдийски + сонгхай + албански + сръбски + сранан тонго + серер + суази + нило-сахарски език + сесуто + сундански + сукума + сусу + шумерски + шведски + суахили + класически сирийски + сирийски + тамилски + тайландски + телугу + темне + терено + тетум + таджикски + таи + тигриня + тигре + тив + туркменски + токелайски + тагалог + клингон + тлингит + тамашек + тсвана + тонга + нианса тонга + ток писин + турски + тсонга + цимшиански + татарски + тумбука + тупи + алтайски + тувалуански + туи + таитянски + тувински + удмуртски + уйгурски + угаритски + украински + умбунду + неопределен + урду + узбекски + ваи + венда + виетнамски + волапюк + вотик + валонски + вакашански език + валамо + варай + уашо + лужишки език + волоф + калмик + ксоса + яо + япезе + идиш + йоруба + юпик + зуанг + запотек + блис символи + зенага + китайски + опростен китайски + традиционен китайски + занде + зулуски + зуни + без лингвистично съдържание + заза + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Земята + Африка + Северноамерикански континент + Южна Америка + Океания + Западна Афирка + Централна Америка + Източна Африка + Северна Африка + Централна Африка + Южноафрикански регион + Америка + Северна Америка + Карибски о-ви + Източна Азия + Южна Азия + Югоизточна Азия + Южна Европа + Австралия и Нова Зеландия + Меланезия + Микронезия + Полинезия + Южна Азия [062] + Азия + Централна Азия + Западна Азия + Европа + Източна Европа + Северна Европа + Западна Европа + Общност на независимите държави + Латинска Америка и Карибски басейн + Нормандски о-ви + Андора + Обединени арабски емирства + Афганистан + Антигуа и Барбуда + Ангуила + Албания + Армения + Холандски Антили + Ангола + Антарктика + Аржентина + Американско Самоа + Австрия + Австралия + Аруба + Аландски о-ви + Азербайджан + Босна и Херцеговина + Барбадос + Бангладеш + Белгия + Буркина Фасо + България + Бахрейн + Бурунди + Бенин + Сейнт Бартоломей + Бермуда + Бруней Дарусалам + Боливия + Бразилия + Бахами + Бутан + Остров Буве + Ботсуана + Беларус + Белиз + Канада + Кокосови (Кийлинг) острови + Демократична република Конго + Централноафриканска Република + Конго + Швейцария + Бряг на слоновата кост + Острови Кук + Чили + Камерун + Китай + Колумбия + Коста Рика + Сърбия и Черна гора + Куба + Кабо Верде + Остров Кристмас + Кипър + Чешка република + Германия + Джибути + Дания + Доминика + Доминиканска република + Алжир + Еквадор + Естония + Египет + Западна Сахара + Еритрея + Испания + Етиопия + Финландия + Фиджи + Фолклендски острови + Микронезия, Обединени Щати + Фарьорски острови + Франция + Габон + Обединено кралство + Гренада + Грузия + Френска Гвиана + о. Гърнзи + Гана + Гибралтар + Гренландия + Гамбия + Гвинея + Гваделупа + Екваториална Гвинея + Гърция + Южна Джорджия и Южни Сандвичеви Острови + Гватемала + Гуам + Гвинея-Бисау + Гвиана + Хонг-Конг О.А.Р. на Китай + Остров Хърд и Острови Макдоналд + Хондурас + Хърватска + Хаити + Унгария + Индонезия + Ирландия + Израел + о.Ман + Индия + Британски територии в Индийския океан + Ирак + Иран, Ислямска република + Исландия + Италия + о. Джързи + Ямайка + Йордания + Япония + Кения + Киргизстан + Камбоджа + Кирибати + Комори + Сейнт Китс и Невис + Корея, Северна + Корея, Южна + Кувейт + Кайманови острови + Казахстан + Народна демократична република Лаос + Ливан + Сейнт Лусия + Лихтенщайн + Шри Ланка + Либерия + Лесото + Литва + Люксембург + Латвия + Либийска арабска джамахирия + Мароко + Монако + Молдова, Република + Черна гора + Сейнт Мартин + Мадагаскар + Маршалови острови + Македония, Република + Мали + Мианмар + Монголия + Макао О.А.Р. на Китай + Северни Мариански Острови + Мартиника + Мавритания + Монсерат + Малта + Мавриций + Малдиви + Малави + Мексико + Малайзия + Мозамбик + Намибия + Нова Каледония + Нигер + Остров Норфолк + Нигерия + Никарагуа + Холандия + Норвегия + Непал + Науру + Ниуе + Нова Зеландия + Оман + Панама + Перу + Френска Полинезия + Папуа Нова Гвинея + Филипини + Пакистан + Полша + Сен Пиер и Мигелон + Питкайрн + Пуерто Рико + Палестински територии + Португалия + Палау + Парагвай + Катар + Океания [QO] + Европейски съюз + Реюниън + Румъния + Сърбия + Руска федерация + Руанда + Саудитска Арабия + Соломонови острови + Сейшели + Судан + Швеция + Сингапур + Света Елена + Словения + Свалбард и Ян Майен + Словакия + Сиера Леоне + Сан Марино + Сенегал + Сомалия + Суринам + Сао Томе и Принципе + Ел Салвадор + Сирийска арабска република + Суазиленд + Острови Туркс и Кайкос + Чад + Френски южни територии + Того + Тайланд + Таджикистан + Токелау + Източен Тимор + Туркменистан + Тунис + Тонга + Турция + Тринидад и Тобаго + Тувалу + Тайван + Танзания + Украйна + Уганда + САЩ - външни острови + САЩ + Уругвай + Узбекистан + Свещено море (Ватиканска държава) + Сейнт Винсънт и Гренадини + Венецуела + Британски Вирджински острони + САЩ, Вирджински острови + Виетнам + Вануату + Уолис и Футуна + Самоа + Йемен + Мейот + Южна Африка + Замбия + Зимбабве + Непозната или несъществуваща област + + + Традиционен немски правопис + Стандартен резиански правопис + Немски правопис от 1996 + Късен средновековен френски до 1606 + Ранен съвременен френски + Източно арменски + Западно арменски + Унифицирана тюркска азбука + Диалект Сан Джорджио/Била + Бунтлинг + Международна фонетична азбука + Уралска фонетична азбука + Диалект Липовац + Монотонично + Диалект Натисоне + Диалект Нджива + Диалект Осеако/Осояне + Политонично + Компютърен + Променен правопис + Резиански + Сахо + Шотландски английски + Ливърпулски диалект + Диалект Столвиза + Тарашкевица + Валенсиански + + + Календар + Сортиране + Валута + + + Традиционен китайски (Big5) + Будистки календар + Китайски календар + Директно + Опростен китайски (GB2312) + Григориански календар + Еврейски календар + Индийски граждански календар + Ислямски календар + Ислямски цивилен календар + Японски календар + Азбучен ред + Сортиране Пинин + Календар на Република Китай + Сортиране по щрих + Традиционно + + + Американска + Метрична + + + + lowercase-words + + + [а-ъ ь ю я] + [i v x {а\u0300} ѐ ѝ {о\u0300} {у\u0300} {ъ\u0300} ѣ {ю\u0300} {я\u0300} ѫ] + + + „ + “ + ‘ + ’ + + + + + + + + ян. + февр. + март + апр. + май + юни + юли + авг. + септ. + окт. + ноем. + дек. + + + януари + февруари + март + април + май + юни + юли + август + септември + октомври + ноември + декември + + + + + я + ф + м + а + м + ю + ю + а + с + о + н + д + + + + + + + нд + пн + вт + ср + чт + пт + сб + + + неделя + понеделник + вторник + сряда + четвъртък + петък + събота + + + + + н + п + в + с + ч + п + с + + + + + + + I трим. + II трим. + III трим. + IV трим. + + + 1-во тримесечие + 2-ро тримесечие + 3-то тримесечие + 4-то тримесечие + + + + пр. об. + сл. об. + + + пр.Хр. + сл.Хр. + + + пр. н. е. + от н. е. + + + сл.н.е. + + + + + + dd MMMM y, EEEE + + + + + dd MMMM y + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + E d + H + HH:mm + HH:mm:ss + d MMM, E + d MMMM + dd MMMM + dd.MM + h:mm a + h:mm:ss a + mm:ss + MM.yy + Q yy + y + MM.yyyy + MMMM y + QQQQ y 'г'. + + + {0} - {1} + + M-M + + + dd.MM, E - dd.MM, E + dd.MM, E - dd.MM, E + + + MMM-MMM + + + d MMM, E - d MMM, E + d MMM, E - d MMM, E + + + dd MMM - dd MMM + dd-dd MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + dd.MM.yy, E - dd.MM.yy, E + dd.MM.yy, E - dd.MM.yy, E + dd.MM.yy, E - dd.MM.yy, E + + + MMM-MMM y + MMM y - MMM y + + + d MMM y, E - d MMM y, E + d MMM y, E - d MMM y, E + d MMM y, E - d MMM y, E + + + dd MMM - dd MMM y + dd-dd MMM y + dd MMM y - dd MMM y + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + ера + + + година + + + месец + + + седмица + + + Ден + Онзи ден + Вчера + Днес + Утре + Вдругиден + + + Ден от седмицата + + + ден + + + час + + + минута + + + секунда + + + зона + + + + + + + + тишри + хешван + кислев + тебет + шебат + адар I + адар + нисан + иар + сиван + тамуз + + + тишри + хешван + кислев + тебет + шебат + адар I + адар + нисан + иар + сиван + тамуз + + + + + тишри + хешван + кислев + тебет + шебат + адар I + адар + нисан + иар + сиван + тамуз + + + + + + + + + чайтра + вайсакха + джаинтха + асадха + сравана + бхада + азвина + картика + аграхайана + пауза + магха + пхалгуна + + + чайтра + вайсакха + джаинтха + асадха + сравана + бхада + азвина + картика + аграхайана + пауза + пхалгуна + + + + + чайтра + вайсакха + джаинтха + асадха + сравана + бхада + азвина + картика + аграхайана + пауза + магха + пхалгуна + + + + + + + + + мухарам + сафар + раби-1 + раби-2 + джумада-1 + джумада-2 + раджаб + шабан + рамазан + Шавал + Дхул-Каада + Дхул-хиджа + + + мухарам + сафар + раби-1 + раби-2 + джумада-1 + джумада-2 + раджаб + шабан + рамазан + Шавал + Дхул-Каада + Дхул-хиджа + + + + + раби-1 + раби-2 + джумада-1 + джумада-2 + раджаб + шабан + рамазан + + + мухарам + сафар + раби-1 + раби-2 + джумада-1 + джумада-2 + раджаб + шабан + Рамазан + Шавал + Дхул-Каада + Дхул-хиджа + + + + + + + +HHmm;-HHmm + Гриинуич{0} + Гриинуич + {0} + {1} ({0}) + + Неизвестен + + + Андора + + + Дубай + + + Кабул + + + Антигуа + + + Ангила + + + Тирана + + + Ереван + + + Кюрасао + + + Луанда + + + Ротера + + + Палмър + + + Южен полюс + + + Суова + + + Моусън + + + База Дейвис + + + Восток + + + Кейси + + + Дюмон Дюрвил + + + Мак Мърдоу + + + Рио Галегос + + + Мендоса + + + Сан Хуан + + + Ушуая + + + Ла Риоха + + + Сан Луис + + + Катамарка + + + Салта + + + Джуджую + + + Тукуман + + + Кордоба + + + Буенос Айрес + + + Паго Паго + + + Виена + + + Пърт + + + Юкла + + + Даруин + + + Аделаида + + + Броукън Хил + + + Кери + + + Мелбърн + + + Хоубарт + + + Линдеман + + + Сидни + + + Бризбейн + + + Лорд Хов + + + Аруба + + + Баку + + + Бриджтаун + + + Дака + + + Брюксел + + + Уагадугу + + + София + + + Бахрейн + + + Бужумбура + + + Порто Ново + + + Бермудски О-ви + + + Бруней + + + Ла Пас + + + Ейрунепе + + + Рио Бранко + + + Порту Вельо + + + Буа Виста + + + Мануас + + + Чуяба + + + Сантарем + + + Кампо Гранде + + + Белем + + + Арагуайна + + + Сао Пауло + + + Бахиа + + + Фортацела + + + Масейо + + + Ресифе + + + Норонха + + + Насау + + + Тхимпу + + + Габороне + + + Минск + + + Белмопан + + + Доусън + + + Уайтхорс + + + Инувик + + + Ванкувър + + + Доусън Крийк + + + Йелоунайф + + + Едмънтън + + + Суифт Кърент + + + Кеймбридж Бей + + + Регина + + + Уинипег + + + Резолют + + + Рейни Ривър + + + Ранкин Инлет + + + Корал Харбър + + + Тъндър Бей + + + Нипигон + + + Торонто + + + Монреал + + + Иквалуит + + + Пангниртунг + + + Монктон + + + Халифакс + + + Гус Бей + + + Глейс Бей + + + Блан-Саблон + + + Сейнт Джоунс + + + Кокос + + + Киншаса + + + Лубумбаши + + + Банги + + + Бразавил + + + Цюрих + + + Абиджан + + + Раротонга + + + Великденски о-ви + + + Сантиаго + + + Дуала + + + Кашгар + + + Урумчи + + + Чунцин + + + Шанхай + + + Харбин + + + Богота + + + Сан Хосе + + + Хавана + + + Кабо Верде + + + Коледни о-ви + + + Никозия + + + Берлин + + + Джибути + + + Копенхаген + + + Доминика + + + Санто Доминго + + + Алжир + + + о-ви Галапагос + + + Гуаякил + + + Талин + + + Кайро + + + Ел Аюн + + + Асмера + + + Канарски о-ви + + + Сеута + + + Мадрид + + + Адис Абеба + + + Хелзинки + + + Фиджи + + + Стенли + + + о-ви Трук + + + о. Понапе + + + о. Косрае + + + Фарьорите + + + Париж + + + Либървил + + + Лондон + + + Сент Джорджес + + + Тбилиси + + + Кайен + + + Акра + + + Гибралтар + + + Туле + + + Готхоб + + + Сгорсбисон + + + Данмаркшавн + + + Банджул + + + Конакри + + + Бас Тер + + + Малабо + + + Атина + + + Южна Джорджия + + + Гватемала + + + Гуам + + + Бисау + + + Джорджтаун + + + Хонг Конг + + + Порт-о-Пренс + + + Будапеща + + + Джакарта + + + Понтианак + + + Макасарски проток + + + Джаяпура + + + Дъблин + + + Йерусалим + + + Чагос + + + Багдад + + + Техеран + + + Рейкявик + + + Рим + + + Кингстън + + + Аман + + + Токио + + + Найроби + + + Бишкек + + + Пном Пен + + + о. Ендърбъри + + + о. Рождество + + + о. Тарава + + + Коморски о-ви + + + Сейнт Китс + + + Пхенян + + + Сеул + + + Кувейт + + + Кайманите + + + Актау + + + Арал + + + Актобе + + + Язилорда + + + Алма Ата + + + Виентян + + + Бейрут + + + Св. Лучия + + + Вадуц + + + Коломбо + + + Монровия + + + Масеру + + + Вилнюс + + + Люксембург + + + Рига + + + Триполи + + + Казабланка + + + Монако + + + Кишинев + + + Антананариво + + + Квайджален + + + Мажуро + + + Бамако + + + Рангун + + + Кобдо + + + Уланбатор + + + Чойбалсан + + + Макау + + + Сайпан + + + Мартиник + + + Нуакшот + + + Монсерат + + + Ла Валета + + + Мавриций + + + Малдивски О-ви + + + Блантайр + + + Тихуана + + + Хермосило + + + Мацатлан + + + Чиуауа + + + Монтерей + + + Мексико + + + Мерида + + + Канкун + + + Куала Лумпур + + + Кучин + + + Мапуту + + + Виндхук + + + Нумеа + + + Ниамей + + + Норфолк + + + Лагос + + + Манагуа + + + Амстердам + + + Осло + + + Катманду + + + Науру + + + Ниуе + + + о-ви Чатам + + + Окланд + + + Мускат + + + Панама + + + Лима + + + Таити + + + Маркизки о-ви + + + Гамбиер + + + Порт Морсби + + + Манила + + + Карачи + + + Варшава + + + Микелон + + + Питкерн + + + Пуерто Рико + + + Газа + + + Азорски о-ви + + + Мадейра + + + Лисабон + + + Палау + + + Асунсион + + + Катар + + + Реюнион + + + Букурещ + + + Калининград + + + Москва + + + Волгоград + + + Самара + + + Екатерининбург + + + Омск + + + Новосибирск + + + Красноярск + + + Иркутск + + + Якутск + + + Владивосток + + + Сахалин + + + Магадан + + + п-в Камчатка + + + Анадир + + + Кигали + + + Рияд + + + Гуадалканал + + + Махе + + + Хартум + + + Стокхолм + + + Сингапур + + + Св. Елена + + + Лонгирбюен + + + Фрийтаун + + + Дакар + + + Могадишо + + + Парамарибо + + + Сао Томе + + + Сан Салвадор + + + Дамаск + + + Мбабане + + + Гранд Тюрк + + + Нджамена + + + Кергелен + + + Ломе + + + Бангкок + + + Душанбе + + + Факаофо + + + Дили + + + Ашхабад + + + Тунис + + + Тонгатапу + + + Истанбул + + + Порт ъф Спейн + + + Фунафути + + + Тайпей + + + Дар ес Салаам + + + Ужгород + + + Киев + + + Севастопол + + + Запорожие + + + Кампала + + + о. Мидуей + + + о. Джонсън + + + о. Уейк + + + Адак + + + Ноум + + + Хонолулу + + + Анкоридж + + + Якутат + + + Джуно + + + Лос Анжелис + + + Буаз + + + Финикс + + + Шипрок + + + Денвър + + + Ню Салем, Северна Дакота + + + Сентър + + + Чикаго + + + Меномнии + + + Винсенс, Индиана + + + Петерсбург, Индиана + + + Тел Сити, Индиана + + + Нокс + + + Уинамак, Индиана + + + Маренго + + + Индианополис + + + Луизвил + + + Веве + + + Монтичело + + + Детройт + + + Ню Йорк + + + Монтевидео + + + Самарканд + + + Ташкент + + + Св. Винсент + + + Каракас + + + Тортола + + + Св. Томас + + + Сайгон + + + Ефате + + + Уолис + + + Апиа + + + Аден + + + Майоте + + + Йоханесбург + + + Лусака + + + Хараре + + + + Часова зона Аляска + Лятна часова зона Аляска + + + + + Американска централна часова зона + Американска централна лятна часова зона + + + + + Американска източна часова зона + Американска източна лятна часова зона + + + + + Американска планинска часова зона + Американска планинска лятна часова зона + + + + + Тихоокеанска часова зона + Тихоокеанска лятна часова зона + + + + + AQTT (Актау) + AQTST (Актау) + + + + + AQTT (Актобе) + AQTST (Актобе) + + + + + AST (Саудитска Арабия) + ADT (Саудитска Арабия) + + + + + AMT (Армения) + AMST (Армения) + + + + + Атлантическа часова зона + Атлантическа лятна часова зона + + + + + Китайска часова зона + + + CST (Китай) + CDT (Китай) + + + + + CST (Куба) + CDT (Куба) + + + + + Централноевропейска часова зона + Централноевропейска лятна часова зона + + + + + Източноевропейска часова зона + Източноевропейска лятна часова зона + + + + + Часова зона Гринуич + + + + + GST (Гуам) + + + + + Часова зона Израел + Лятна часова зона Израел + + + IST (Израел) + + + + + Японска часова зона + Японска часова зона + + + + + Часова зона Нюфаундленд + Лятна часова зона Нюфаундленд + + + + + SAMT (Самарканд) + SAMST (Самарканд) + + + + + GST (Южна Джорджия) + + + + + + + , +   + ; + % + 0 + + + - + ‰ + ∞ + Н/Ч + + + + + #,##0.### + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + + + + Андорска песета + андорска песета + андорски песети + + + Обединени арабски емирства-дирхам + Обединени арабски емирства-дирхам + Обединени арабски емирства-дирхама + + + Афганистански афган (1927-2002) + афганистански афган (AFA) + афганистански афгана (AFA) + + + Афганистански афган + афганистански афган + афганистански афгана + + + Албански лек + албански лек + албански лека + + + Арменски драм + арменски драм + арменски драма + + + Антилски гулден + антилски гулден + антилски гулдена + + + Анголска кванца + анголска кванца + анголски кванци + + + Анголска кванца (1977-1990) + анголска кванца (AOK) + анголски кванци (AOK) + + + Анголска нова кванца (1990-2000) + анголска нова кванца (AON) + анголски нови кванци (AON) + + + Анголска нова кванца (1995-1999) + анголска нова кванца (AOR) + анголски нови кванци (AOR) + + + Аржентински австрал + аржентински австрал + аржентински австрала + + + Аржентинско песо (1983-1985) + аржентинско песо (ARP) + аржентински песо (ARP) + + + Аржентинско песо + аржентинско песо + аржентински песо + + + Австрийски шилинг + австрийски шилинг + австрийски шилинга + + + Австралийски долар + австралийски долар + австралийски долара + + + Арубски гилдер - о. Аруба + арубски гилдер + арубски гилдера + + + Азербайджански манат (1993-2006) + азербайджански манат (AZM) + азербайджански маната (AZM) + + + Азербайджански манат + азербайджански манат + + + Босна и Херцеговина-динар + Босна и Херцеговина-динар + Босна и Херцеговина-динара + + + Босненска конвертируема марка + босненска конвертируема марка + босненски конвертируеми марки + + + Барбейдоски долар + барбейдоски долар + барбейдоски долара + + + Бангладешка така + бангладешка така + бангладешки таки + + + Белгийски франк (конвертируем) + белгийски франк (конвертируем) + белгийски франка (конвертируеми) + + + Белгийски франк + белгийски франк + белгийски франка + + + Белгийски франк (финансов) + белгийски франк (финансов) + белгийски франка (финансови) + + + Български конвертируем лев (1962-1999) + български конвертируем лев + български конвертируеми лева + + + Български лев + български лев + български лева + лв. + + + Бахрейнски динар + бахрейнски динар + бахрейнски динара + + + Бурундийски франк + бурундийски франк + бурундийски франка + + + Бермудски долар + бермудски долар + бермудски долара + + + Брунейски долар + брунейски долар + брунейски долара + + + Боливийско боливиано + боливийско боливиано + боливийски боливиано + + + Боливийско песо + боливийско песо + боливийски песо + + + Боливийски мвдол + + + Бразилско ново крузейро (1967-1986) + + + Бразилско крозадо + + + Бразилско крузейро (1990-1993) + + + Бразилски реал + бразилски реал + бразилски реала + + + Бразилско ново крозадо + + + Бразилско крузейро + + + Бахамски долар + бахамски долар + бахамски долара + + + Бутански нгултрум + бутански нгултрум + бутански нгултрума + + + Киат + + + Ботсуанска пула + ботсуанска пула + ботсуански пули + + + Беларуска нова рубла (1994-1999) + беларуска нова рубла (BYB) + беларуски нови рубли (BYB) + + + Беларуска рубла + беларуска рубла + беларуски рубли + + + Белизийски долар + белизийски долар + белизийски долара + + + Канадски долар + канадски долар + канадски долара + + + Конгоански фран½к + конгоански франк + конгоански франка + + + WIR евро + + + Швейцарски франк + швейцарски франк + швейцарски франка + + + WIR франк + + + Условна разчетна единица на Чили + + + Чилийско песо + чилийско песо + чилийски песо + + + Китайски ренминби юан + китайски ренминби юан + китайски ренминби юана + + + Колумбийско песо + колумбийско песо + колумбийски песо + + + Колумбийска единица на реалната стойност + + + Костарикански колон + костарикански колон + костарикански колона + + + Стар сръбски динар + + + Чехословашка конвертируема крона + чехословашка конвертируема крона + чехословашки конвертируеми крони + + + Кубинско песо + кубинско песо + кубински песо + + + Кабо Верде ескудо + + + Кипърска лира + кипърска лира + кипърски лири + + + Чешка крона + чешка крона + чешки крони + + + Източногерманска марка + + + Германска марка + германска марка + германски марки + + + Джибутски франк + джибутски франк + джибутски франка + + + Датска крона + датска крона + датски крони + + + Доминиканско песо + доминиканско песо + доминикански песо + + + Алжирски динар + алжирски динар + алжирски динара + + + Еквадорско сукре + еквадорско сукре + + + Еквадорска банкова единица + + + Естонска крона + естонска крона + естонски крони + + + Египетска лира + египетска лира + египетски лири + + + Еритрейска накфа + еритрейска накфа + еритрейски накфи + + + Испанска песета + испанска песета + испански песети + + + Етиопски бир + етиопски бир + етиопски бира + + + Евро + + + Финландска марка + финландска марка + финландски марки + + + Фиджи - долар + Фиджи - долар + Фиджи - долара + + + Фолкландска лира + фолкландска лира + фолкландски лири + + + Френски франк + френски франк + френски франка + + + Британска лира + британска лира + британски лири + + + Грузински купон + + + Грузински лари + грузински лари + грузински лари + + + Ганайско седи (1979-2007) + ганайско седи (GHC) + ганайски седи (GHC) + + + Ганайско седи + + + Гибралтарска лира + гибралтарска лира + гибралтарски лири + + + Гамбийски даласи + гамбийски даласи + гамбийски даласи + + + Гвинейски франк + гвинейски франк + гвинейски франка + + + Гвинейска сили + + + Екваториално гвинейско еквеле + + + Гръцка драхма + гръцка драхма + гръцки драхми + + + Гватемалски кветзал + гватемалски кветзал + гватемалски кветзала + + + Ескудо от Португалска Гвинея + + + Гвинея-Бисау песо + + + Гаянски долар + гаянски долар + гаянски долара + + + Хонгконгски долар + хонгконгски долар + хонгконгски долара + + + Хондураска лемпира + хондураска лемпира + хондураски лемпири + + + Хърватски динар + хърватски динар + хърватски динара + + + Хърватска куна + хърватска куна + хърватски куни + + + Хаитски гурд + хаитски гурд + хаитски гурда + + + Унгарски форинт + унгарски форинт + унгарски форинта + + + Индонезийска рупия + индонезийска рупия + индонезийски рупии + + + Ирландска лира + ирландска лира + ирландски лири + + + Израелска лира + израелска лира + израелски лири + + + Израелски нов шекел + израелски нов шекел + израелски нови шекела + + + Индийска рупия + индийска рупия + индийски рупии + + + Иракски динар + иракски динар + иракски динара + + + Ирански риал + ирански риал + ирански риала + + + Исландска крона + исландска крона + исландски крони + + + Италианска лира + италианска лира + италиански лири + + + Ямайски долар + ямайски долар + ямайски долара + + + Йордански динар + йордански динар + йордански динара + + + Японска йена + японска йена + японски йени + + + Кенийски шилинг + кенийски шилинг + кенийски шилинга + + + Киргистански сом + киргистански сом + киргистански сома + + + Камбоджански риел + камбоджански риел + камбоджански риела + + + Коморски франк + коморски франк + коморски франка + + + Севернокорейски вон + севернокорейски вон + севернокорейски вона + + + КНДР вон + КНДР вона + + + Кувейтски динар + кувейтски динар + кувейтски динара + + + Кайманови острови - долар + Кайманови острови - долара + + + Казахстанско тенге + казахстанско тенге + казахстански тенге + + + Лаоски кип + лаоски кип + лаоски кипа + + + Ливанска лира + ливанска лира + ливански лири + + + Шриланкска рупия + шриланкска рупия + шриланкски рупии + + + Либерийски долар + либерийски долар + либерийски долара + + + Лесотско лоти + лесотско лоти + лесотски лоти + + + Литовски литаз + литовски литаз + литовски литаза + + + Литовски талон + + + Люксембургски франк + люксембургски франк + люксембургски франка + + + Латвийски лат + латвийски лат + латвийски лата + + + Латвийска рубла + латвийска рубла + латвийски рубли + + + Либийски динар + либийски динар + либийски динара + + + Марокански дирхам + марокански дирхам + марокански дирхама + + + Марокански франк + марокански франк + марокански франка + + + Молдовско леу + молдовско леу + молдовски леу + + + Малагасийски ариари + + + Малгашки франк - Мадагаскар + малгашки франк - Мадагаскар + малгашки франка - Мадагаскар + + + Македонски денар + македонски денар + македонски денара + + + Малийски франк + + + Миянмарски (Бирма) кият + миянмарски кият + миянмарски кията + + + Монголски тугрик + монголски тугрик + монголски тугрика + + + Макао - патака + + + Мавританска огия + мавританска огия + мавритански огии + + + Малтийска лира + малтийска лира + малтийски лири + + + Малтийски лири + + + Маврицийска рупия + маврицийска рупия + маврицийски рупии + + + Малдивска руфия + малдивска руфия + малдивски руфии + + + Малавийска квача + малавийска квача + малавийски квачи + + + Мексиканско ново песо + мексиканско ново песо + мексикански нови песо + + + Мексиканско сребърно песо (1861-1992) + мексиканско сребърно песо (MXP) + мексикански сребърни песо (MXP) + + + Мексиканска конвертируема единица (UDI) + + + Малайзийски рингит + малайзийски рингит + малайзийски рингити + + + Мозамбикско ескудо + мозамбикско ескудо + мозамбикски ескудо + + + Мозамбикски метикал + мозамбикски метикал + мозамбикски метикала + + + Мозамбишки метикал + + + Намибийски долар + намибийски долар + намибийски долара + + + Нигерийска найра + нигерийска найра + нигерийски найри + + + Никарагуанска кордоба + никарагуанска кордоба + никарагуански кордоби + + + Никарагуанска златна кордоба + + + Холандски гулден + холандски гулден + холандски гулдена + + + Норвежка крона + норвежка крона + норвежки крони + + + Непалска рупия + непалска рупия + непалски рупии + + + Новозеландски долар + новозеландски долар + новозеландски долара + + + Омански риал + омански риал + омански риала + + + Панамски балбоа + панамски балбоа + панамски балбоа + + + Перуанско инти + + + Перуански нов сол + перуански нов сол + + + Перуански сол + перуански сол + + + Папуа-новогвинейска кина + + + Филипинско песо + филипинско песо + филипински песо + + + Пакистанска рупия + пакистанска рупия + пакистански рупии + + + Полска злота + полска злота + полски злоти + + + Полска злота (1950-1995) + полска злота (PLZ) + полски злоти (PLZ) + + + Португалско ескудо + португалско ескудо + португалски ескудо + + + Парагвайско гуарани + парагвайско гуарани + парагвайски гуарани + + + Катарски риал + катарски риал + катарски риала + + + Родезийски долар + + + Стара румънска лея + стара румънска лея + стари румънски леи + + + Румънска лея + румънска лея + румънски леи + + + Сръбски динар + сръбски динар + сръбски динара + + + Руска рубла + руска рубла + руски рубли + Руб. + + + Руска рубла (1991-1998) + руска рубла (RUR) + руски рубли (RUR) + + + Руандски франк + руандски франк + руандски франка + + + Саудитскоарабски риал + саудитскоарабски риал + саудитскоарабски риала + + + Соломонови острови - долар + Соломонови острови - долара + + + Сейшелска рупия + сейшелска рупия + сейшелски рупии + + + Судански динар + судански динар + судански динара + + + Судански лири + + + Суданска лира + суданска лира + судански лири + + + Шведска крона + шведска крона + шведски крони + + + Сингапурски долар + сингапурски долар + сингапурски долара + + + Света Елена лира + + + Словенски толар + словенски толар + словенски толара + + + Словашка крона + словашка крона + словашки крони + + + Сиералеонско леоне + сиералеонско леоне + сиералеонски леоне + + + Сомалийски шилинг + сомалийски шилинг + сомалийски шилинга + + + Суринамски долар + + + Суринамски гилдер + суринамски гилдер + суринамски гилдера + + + Сао Томе и Принсипи - добра + + + Съветска рубла + съветска рубла + съветски рубли + + + Салвадорски колон + салвадорски колон + салвадорски колона + + + Сирийска лира + сирийска лира + сирийски лири + + + Свазилендски лилангени + свазилендски лилангени + свазилендски лилангени + + + Тайландски бат + тайландски бат + тайландски бата + + + Таджикистанска рубла + таджикистанска рубла + таджикистански рубли + + + Таджикистански сомони + таджикистански сомони + таджикистански сомони + + + Туркменистански манат + туркменистански манат + туркменистански маната + + + Тунизийски динар + тунизийски динар + тунизийски динара + + + Тонга - па анга + + + Тиморско ескудо + тиморско ескудо + тиморски ескудо + + + Турска лира + турска лира + турски лири + + + Нова турска лира + нова турска лира + нови турски лири + + + Тринидат и Тобаго - долар + Тринидат и Тобаго - долара + + + Тайвански долар + тайвански долар + тайвански долара + + + Танзанийски шилинг + танзанийски шилинг + танзанийски шилинга + + + Украинска хривня + украинска хривня + украински хривни + + + Украински карбованец + украински карбованец + украински карбованеца + + + Угандийски шилинг (1966-1987) + угандийски шилинг (UGS) + угандийски шилинга (UGS) + + + Угандийски нов шилинг + угандийски нов шилинг + угандийски нови шилинга + + + САЩ долар + САЩ долара + + + Уругвайско песо (индекс на инфлацията) + + + Уругвайско песо (1975-1993) + уругвайско песо (UYP) + уругвайски песо (UYP) + + + Уругвайско песо + уругвайско песо + уругвайски песо + + + Узбекистански сум + узбекистански сум + узбекистански сума + + + Венецуелски боливар + венецуелски боливар + венецуелски боливара + + + Венецуелски боливар фуерте + + + Виетнамски донг + виетнамски донг + виетнамски донга + + + Вануату - вату + + + Самоа - тала + + + Буркина Фасо - CFA - франк + + + Злато + + + Източнокарибски долар - Антигуа + източнокарибски долар + източнокарибски долара + + + Еку на ЕИО + + + Френски златен франк + френски златен франк + френски златна франка + + + Бенин - CFA франк + + + Френскополинезийски франк + френскополинезийски франк + френскополинезийски франка + + + Непозната или невалидна валута + + + Йеменски динар + йеменски динар + йеменски динара + + + Йеменски риал + йеменски риал + йеменски риала + + + Югославски твърд динар + + + Югославски динар + югославски динар + югославски динара + + + Югославски конвертируем динар + югославски конвертируем динар + югославски конвертируеми динара + + + Южноафрикански ранд (финансов) + южноафрикански ранд (финансов) + южноафрикански ранда (финансови) + + + Южноафрикански ранд + южноафрикански ранд + южноафрикански ранда + + + Замбийска квача + замбийска квача + замбийски квачи + + + Заирско ново зайре + заирско ново зайре + заирски нови зайре + + + Заирско зайре + заирско зайре + заирски зайре + + + Зимбабвийски долар + зимбабвийски долар + зимбабвийски долара + + + + + + {0} ден + {0} дена + + + {0} час + {0} часа + + + {0} минута + {0} минути + + + {0} месец + {0} месеца + + + {0} секунда + {0} секунди + + + {0} седмица + {0} седмици + + + {0} година + {0} години + + + + + да:д + не:н + + + diff --git a/lib/zend/Zend/Locale/Data/bg_BG.xml b/lib/zend/Zend/Locale/Data/bg_BG.xml new file mode 100644 index 0000000000..865deb21f3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/bg_BG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/bn.xml b/lib/zend/Zend/Locale/Data/bn.xml new file mode 100644 index 0000000000..4b118df4c4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/bn.xml @@ -0,0 +1,2834 @@ + + + + + + + + + + + {0} ({1}) + , + + + আফার + আব্খাজিয় + আচিনিয় + আকোলী + অদাগ্মে + আদেগে + আবেস্তীয় + আফ্রিকান্স + অফ্রো-এশিয়াটিক + আফ্রিহিলি + আইনু + আকান + আক্কাদিয়ান + আলেউত + আলগোঙকুইআন + দক্ষিন আলতাই + আমহারিক + আর্গোনিজ + প্রাচীন ইংরেজী + আঙ্গীকা + অ্যাপাচি + আরবী + আরামাইক + অ্যারোকেনিয় + আরাপাহো + কৃত্রিম + আরাওয়াক + আসামি + আস্তুরিয় + আথাপাস্কান + অস্ট্রেলিয় + আভেরিক + আওয়াধি + আয়মারা + আজারবাইজানীয় + বাশকির + বান্দা + বামিলেকে ভাষা + বেলুচী + বালিনীয় + বাসা + বাল্টিক ভাষা + বেলারুশিয় + বেজা + বেম্বা + বেরবের + বুলগেরিয় + বিহারি + ভোজপুরি + বিসলামা + বিকোল + বিনি + সিকসিকা + বামবারা + বাংলা + বান্টু + তিব্বতি + ব্রেটোন + ব্রাজ + বসনীয় + বাতাক + বুরিয়াত + বুগিনি + ব্লিন + কাতালান + ক্যাডো + মধ্য যুক্তরাষ্ঠের আদিবাসীদের ভাষা + ক্যারিব + ককেশীয + আত্সাম + চেচেন + চেবুয়ানো + কেল্টিক + চামেরো + চিবচা + চাগাতাই + চুকি + মারি + চিনুক পরিভাষা + চক্টো + চিপেওয়ান + চেরোকি + শাইয়েন + চামিক ভাষা + কর্সিকান + কপটিক + ইংরেজি জাত ক্রেওল অথবা পিজিন + ফরাসি জাত ক্রেওল অথবা পিজিন + পোর্তুগিজ-ভিত্তিক ক্রেওল বা পিজন + ক্রি + ক্রিমিয়ান তুর্কি + ক্রেওল অথবা পিজিন + চেক + কাশুবিয়ান + চার্চ স্লাভিও + কুশিতিক ভাষা + চুবাস + ওয়েলশ + ডেনিশ + ডাকোটা + দার্গওয়া + দায়াক + জার্মান + অস্ট্রিয়ান জার্মানি + সুইস উচ্চ জার্মানি + ডেলাওয়ের + স্ল্যাভ + দোগ্রীব + ডিংকা + দোগরি + দ্রাবীড় ভাষা + নিম্নতর সোর্বিয়ান + দুয়ালা + মধ্য ডাচ + দিবেহি + ডিউলা + ভুটানি + ইওয়ে + এফিক + প্রাচীন মিশরীয় + ইকাজুক + গ্রিক + এলামাইট + ইংরেজি + অস্ট্রেলীয় ইংরেজি + কানাডীয় ইংরেজি + ব্রিটিশ ইংরেজি + যুক্তরাষ্ট্র ইংরেজি + মধ্য ইংরেজি + এস্পেরান্তো + স্পেনীয় + ল্যাটিন আমেরিকান স্প্যানিশ + আইবেরিয়ান স্প্যানিশ + এস্তোনীয় + বাস্ক + ইওন্ডো + ফার্সি + ফ্যাঙ্গ + ফান্তি + ফুলাহ্ + ফিনিশ + ফিলিপিনো + ফিনো-ইউগ্রিক + ফিজিও + ফেরাউনি + ফন + ফরাসি + কানাডীয় ফরাসি + সুইস ফরাসি + মধ্য ফরাসি + প্রাচীন ফরাসি + উত্তরাঞ্চলীয় ফ্রিসিয়ান + পূর্ব ফ্রিসিয় + ফ্রিউলিয়ান + পশ্চিম ফ্রিসিয় + আইরিশ + গা + গায়ো + বায়া + স্কটস-গ্যেলিক + জার্মানিক ভাষা + গীজ + গিলবার্টিজ + গ্যালিশিয় + মধ্য-উচ্চ জার্মানি + গুয়ারানি + প্রাচীন উচ্চ জার্মানি + গোন্ডি + গোরোন্তালো + গথিক + গ্রেবো + প্রাচীন গ্রীক + সুইস জার্মান + গুজরাটি + ম্যাঙ্কস + গওইচ্’ইন + হাউসা + হাইডা + হাওয়াইয়ান + হিব্রু + হিন্দি + হিলিগ্যায়নোন + হিমাচালি + হিট্টিট + হ্‌মোঙ + হিরি মোতু + ক্রোয়েশীয় + উচ্চ সোর্বিয়ান + হাইতিয়ান + হাঙ্গেরীয় + হুপা + আর্মেনিয় + হেরেরো + ইন্টারলিঙ্গুয়া + ইবান + ইন্দোনেশীয় + ইন্টারলিঙ্গ + ইগ্‌বো + সিচুয়ান য়ি + ইজো + ইনুপিয়াক + ইলোকো + ভারতীয় ভাষা + ইন্দো-ইউরোপীয় ভাষা + ইঙ্গুশ + ইডো + ইরানী ভাষা + ইরোকোইয়ান ভাষা + আইসল্যান্ডীয় + ইতালীয় + ইনুক্টিটুট + জাপানি + লোজবান + জুদেও ফার্সি + জুদেও আরবি + জাভানি + জর্জিয়ান + কারা-কাল্পাক + কাবাইলে + কাচিন + অজ্জু + কাম্বা + কারেন + কাউই + কাবার্ডিয়ান + টাইয়াপ + কোরো + কোঙ্গো + খাশি + খোয়েশান ভাষা + খোটানিজ + কিকু্ইয়ু + কোয়ানিয়ামা + কাজাখ + ক্যালাল্লিসুট + খমের + কিম্বুন্দু + কান্নাড়ী + কোরিয়ান + কোঙ্কানি + কোস্রাইন + ক্‌পেল্লে + কানুরি + কারচে-বাল্কার + কারেলিয়ান + ক্রু + কুরুখ + কাশ্মীরী + কুর্দি + কুমিক + কুটেনাই + কোমি + কর্ণিশ + কির্গিজ + লাটিন + লাডিনো + লান্ডা + লাম্বা + লুক্সেমবার্গীয় + লেজঘিয়ান + গ্যান্ডা + লিম্বুর্গিশ + লিঙ্গালা + লাও + মোঙ্গো + লোজি + লিথুয়েনীয + লুবা-কাটাঙ্গা + লুবা-লুলুয়া + লুইসেনো + লুন্ডা + লুয়ো + লুশাই + লাত্‌ভীয় + মাদুরেসে + মাগাহি + মৈথিলি + ম্যাকাসার + ম্যান্ডিঙ্গো + অস্ট্রোনেশীয় + মাসাই + মোকশা + ম্যাণ্ডার + মেন্ডে + মালাগাসি + মধ্য আইরিশ + মার্শালিজ + মাওরি + মিকম্যাক + মিনাঙ্গ্‌কাবাউ + বিবিধ ভাষা + ম্যাসেডোনীয + মন-খমের ভাষা + মালেয়ালাম + মঙ্গোলিয় + মাঞ্চু + মণিপুরী + ম্যানোবো ভাষা + মলদাভিয় + মোহাওক + মসি + মারাঠি + মালে + মল্টিয় + বহুগুণিতক ভাষাসমূহ + মুণ্ডা ভাষা + ক্রিক + মিরান্ডিজ + মারোয়ারি + বর্মি + মায়ান ভাষা + এরজিয়া + নাউরু + নাহুৎল + উত্তৱ আমেরিকার ইন্ডিয়ান ভাষা + নেয়াপোলিটান + নরওয়ে বোকমাল + উত্তর এন্দেবিলি + নিম্ন জার্মানি + নেপালী + নেওয়ারি + এন্দোঙ্গা + নিয়াস + নাইজার-কোর্ডোফানিয়ান ভাষা + নিউয়ান + ডাচ + ফ্লেমিশ + নরওয়েজীয়ান নিনর্স্ক + নরওয়েজীয় + নোগাই + প্রাচীন নর্স + এন’কো + দক্ষিণ এনডেবেলে + উত্তরাঞ্চলীয় সোথো + নুবিয়ান ভাষা + নাভাজো + প্রাচীন নেওয়ারী + নায়াঞ্জা + ন্যায়ামওয়েজি + ন্যায়াঙ্কোলে + ন্যোরো + এন্.জিমা + অক্সিটান + ওজিবওয়া + অরোমো + উড়িয়া + ওসেটিক + ওসেজ + অটোমান তুর্কি + অটোমান ভাষা + পাঞ্জাবী + পাপুয়ান ভাষা + পাঙ্গাসিনান + পাহ্লাভি + পাম্পাঙ্গা + পাপিয়ামেন্টো + পালায়ুয়ান + প্রাচীন ফার্সি + ফিলিপাইন ভাষা + ফোনিশীয়ান + পালি + পোলিশ + পোহ্নপেইয়ান + প্রাকৃত ভাষা + প্রাচীন প্রোভেনসাল + পশ্তু + পর্তুগীজ + ব্রাজিলীয় পর্তুগীজ + আইবেরিয়ান পর্তুগিজ + কেচুয়া + রাজস্থানী + রাপানুই + রারোটোংগান + রেটো-রোমানীয় + রুন্দি + রোমানীয় + রোমান ভাষা + রোমানি + মূল + রুশ + আরোমানিয় + কিনয়ারোয়ান্ডা + সংষ্কৃত + স্যান্ডাওয়ে + ইয়াকুট + উত্তর আমেরিকান ইন্ডিয়ান ভাষা + শালিশান ভাষা + সামারিটান আরামিক + সাসাক + সাঁওতালি + সার্ডিনিয়ান + সিসিলিয়ান + স্কটস + সিন্ধি + উত্তরাঞ্চলীয় সামি + সেল্কুপ + সেমেটিক ভাষা + সাঙ্গো + প্রাচীন আইরিশ + চিহ্ন ভাষা + সার্বো-ক্রোয়েশিয় + শান + সিংহলী + সিডামো + সিওয়ুয়ান ভাষা + সিনো-তিব্বোতীয় ভাষা + স্লোভাক + স্লোভেনীয় + স্ল্যাভিক ভাষা + সামোয়ান + দক্ষিণাঞ্চলীয় সামি + সামি ভাষা + লুলে সামি + ইনারি সামি + স্কোল্ট সামি + শোনা + সোনিঙ্কে + সোমালী + সোগডিয়ান + সোঙ্গহাই + আলবেনীয় + সার্বীয় + স্রানান টোঙ্গো + সেরের + সোয়াতি + নিলো-সাহারান ভাষা + দক্ষিন সোথো + সুদানী + সুকুমা + সুসু + সুমেরীয় + সুইডিশ + সোয়াহিলি + প্রাচীন সিরিও + সিরিয়াক + তামিল + তাই ভাষা + তেলেগু + টাইম্নে + তেরেনো + তেতুম + তাজিক + থাই + তিগরিনিয়া + টাইগ্রে + টিভ + তুর্কমেনী + টোকেলাউ + তাগালগ + ক্লিঙ্গন + ত্লিঙ্গিট + তামাশেক + সোয়ানা + টঙ্গা + নায়াসা টোঙ্গা + টোক পিসিন + তুর্কী + সঙ্গা + সিমশিয়ান + তাতার + তুম্বুকা + তুপি ভাষা + আলতায়ীক ভাষা + টুভালু + টোয়াই + তাহিতিয়ান + টুভিনিয়ান + উডমুর্ট + উইঘুর + উগারিটিক + ইউক্রেনীয় + উম্বুন্দু + অজানা বা ভুল ভাষা + উর্দু + উজবেকীয় + ভাই + ভেন্ডা + ভিয়েতনামী + ভোলাপুক + ভোটিক + ওয়ালুন + ওয়াকাশান ভাষা + ওয়ালামো + ওয়ারে + ওয়াশো + সোরবিয়ান ভাষা + উওলোফ + কাল্মইক + জোসা + ইয়াও + ইয়াপেসে + য়িদ্দিশ + ইওরুবা + ইয়ুপিক ভাষা + ঝু্য়াঙ + জাপোটেক + চিত্র ভাষা + জেনাগা + চীনা + সহজ চীনা + প্রথাগত চীনা + জান্ডে + জুলু + জুনি + ভাষাতাত্তিক বিষয়সূচী বহির্ভুত + জাজা + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + পৃথিবী + আফ্রিকা + উত্তর আমেরিক + দক্ষিন আমেরিকা + ওসানিয়া + পশ্চিমাঞ্চলীয় আফ্রিকা + মধ্য আমেরিকা + পূর্ব আফ্রিকা + উত্তর আফ্রিকা + মধ্য আফ্রিকা + দক্ষিণাঞ্চলীয় আফ্রিকা + আমেরিকাস + উত্তরাঞ্চলীয় আমেরিকা + ক্যারাবিয়ান + পূর্ব এশিয়া + দক্ষিণাঞ্চলীয় এশিয়া + দক্ষিন পূর্ব এশিয়া + দক্ষিণাঞ্চলীয় ইউরোপ + অস্ট্রেলিয়া এবং নিউজিল্যান্ড + ম্যালেনেশিয়া + ম্যালেনিশা অঞ্চল + পলিনেশিয়া + দক্ষিন মধ্য এশিয়া + এশিয়া + মধ্য এশিয়া + পশ্চিমাঞ্চলীয় এশিয়া + ইউরোপ + পূর্ব ইউরোপ + উত্তরাঞ্চলীয় ইউরোপ + পশ্চিমাঞ্চলীয় ইউরোপ + স্বাধীন রাষ্ট্রের কমনওয়েলথ + চেকোস্লোভাকিয়া + ল্যাটিন আমেরিকা এবং ক্যারাবিয়ান + চ্যানেল দ্বীপপুঞ্জ + এ্যান্ডোরা + সংযুক্ত আরব আমিরাত + আফগানিস্তান + এন্টিগুয়া ও বারবুডা + এ্যাঙ্গুইলা + আলব্যানিয়া + আর্মেনিয়া + নেদারল্যান্ডস এ্যান্টিলিস + এ্যাঙ্গোলা + এন্টার্কটিকা + আর্জেণ্টাইনা + আমেরিকান সামোয়া + অস্ট্রিয়া + অস্ট্রেলিয়া + আরুবা + আলান্ড দ্বীপপুঞ্জ + আজারবাইজান + বসনিয়া ও হার্জেগোভিনা + বারবাদোস + বাংলাদেশ + বেলজিয়াম + বুরকিনা ফাসো + বুলগেরিয়া + বাহরাইন + বুরুন্ডি + বেনিন + সেন্ট বারথেলিমি + বারমুডা + ব্রুনেই + বোলিভিয়া + ব্রাজিল + বাহামা দ্বীপপুঞ্জ + ভুটান + বোভেট দ্বীপ + বতসোয়ানা + বেলোরুশিয়া + বেলিয + কানাডা + কোকোস দ্বীপপুঞ্জ + কঙ্গো - কিনসাসা + মধ্য আফ্রিকান প্রজাতন্ত্র + কঙ্গো + সুইজর্লণ্ড + আইভরি কোস্ট + কুক দ্বীপপুঞ্জ + চিলি + ক্যামেরুন + চীন + কোলোম্বিয়া + কোস্টারিকা + সারবিয়ান এবং মন্টেনিগ্রো + কিউবা + কেপভার্দে + ক্রিসমাস দ্বীপ + সাইপ্রাস + চেক প্রজাতন্ত্র + জার্মানি + জিবুতি + ডেনমার্ক + ডোমিনিকা + ডোমেনিকান প্রজাতন্ত্র + এলজিরিয়া + ইকুয়েডর + এস্তোনিয়া + মিশর + পশ্চিমী সাহারা + ইরিত্রিয়া + স্পেন + ইফিওপিয়া + ফিন্ল্যাণ্ড + ফিজি + ফকল্যান্ড দ্বীপপুঞ্জ + মাইক্রোনেশিয়া + ফ্যারও দ্বীপপুঞ্জ + ফ্রান্স + গ্যাবন + গ্রেটবৃটেন + গ্রেনাডা + জর্জিয়া + ফরাসী গায়ানা + গ্রাঞ্জি + ঘানা + জিব্রাল্টার + গ্রীনল্যান্ড + গাম্বিয়া + গিনি + গুয়াদেলৌপ + নিরক্ষীয় গিনি + গ্রীস্ + দক্ষিণ জর্জিয়া ও দক্ষিণ স্যান্ডউইচ দ্বীপপুঞ + গোয়াটিমালা + গুয়াম + গিনি-বিসাউ + গিয়ানা + হংকং এসএআর চীনা + হার্ড দ্বীপ এবং ম্যাকডোনাল্ড দ্বীপপুঞ্জ + হণ্ডুরাস + ক্রোয়েশিয়া + হাইতি + হাঙ্গেরি + ইন্দোনেশিয়া + আয়ার্লণ্ড + ইস্রায়েল + ম্যানদ্বীপ + ভারত + ব্রিটিশ ভারত মহাসাগরীয় অঞ্চল + ইরাক + ইরান + আইসলণ্ড + ইতালী + জার্সি + জ্যামেকা + জর্ডন + জাপান + কেনিয়া + কির্গিজিয়া + কাম্বোজ + কিরিবাতি + কমোরোস + সেন্ট কিটস ও নেভিস + উত্তর কোরিয়া + দক্ষিণ কোরিয়া + কুয়েত + কেম্যান দ্বীপপুঞ্জ + কাজাকস্থান + লাওস + লেবানন + সেন্ট লুসিয়া + লিচেনস্টেইন + শ্রীলঙ্কা + লাইবেরিয়া + লেসোথো + লিত্ভা + লাক্সেমবার্গ + লাত্ভিয়া + লিবিয়া + মোরক্কো + মোনাকো + মোল্দাভিয়া + মন্টিনিগ্রো + সেন্ট মার্টিন + মাদাগাস্কার + মার্শাল দ্বীপপুঞ্জ + ম্যাসাডোনিয়া + মালি + মায়ানমার + মঙ্গোলিয়া + ম্যাকাও এসএআর চীনা + উত্তরাঞ্চলীয় মারিয়ানা দ্বীপপুঞ্জ + মার্টিনিক + মরিতানিয়া + মন্টসেরাট + মাল্টা + মরিশাস + মালদ্বীপ + মালাউই + মক্সিকো + মাল্যাশিয়া + মোজাম্বিক + নামিবিয়া + নিউ ক্যালেডোনিয়া + নাইজার + নিরফোক দ্বীপ + নাইজেরিয়া + নিকারাগুয়া + হলণ্ড + নরওয়ে + নেপাল + নাউরু + নিউয়ে + নিউ জিলণ্ড + ওমান + পানামা + পিরু + ফরাসী পলিনেশিয়া + পাপুয়া নিউ গিনি + ফিলিপাইন + পাকিস্তান + পোল্যাণ্ড + সেন্ট পিয়ের ও মিকুয়েলন + পিটকেয়ার্ন + পুয়ের্টোরিকো + ফিলিস্তিন অঞ্চল + পর্তুগাল + পালাউ + প্যারাগোয়ে + কাতার + আউটলাইনিং ওসানিয়া + ইউরোপীয় ইউনিয়ন + রিইউনিয়ন + রুমানিয়া + সারবিয়া + রাশিয়া + রুয়ান্ডা + সাউদি আরব + সলোমন দ্বীপপুঞ্জ + সিসিলি + সুদান + সুইডেন + সিঙ্গাপুর + সেন্ট হেলেনা + স্লোভানিয়া + স্বালবার্ড ও জান মেয়েন + শ্লোভাকিয়া + সিয়েরালিওন + সান মারিনো + সেনেগাল + সোমালি + সুরিনাম + সাওটোমা ও প্রিন্সিপি + এল সালভেদর + সিরিয়া + সোয়াজিল্যান্ড + তুর্কস ও কাইকোস দ্বীপপুঞ্জ + চাদ + ফরাসী দক্ষিণাঞ্চল + টোগো + থাই + তাজিকস্থান + টোকেলাউ + পূর্ব-তিমুর + তুর্কমেনিয়া + টিউনিস্ + টোঙ্গা + তুরস্ক + ত্রিনিনাদ ও টোব্যাগো + টুভালু + তাইওয়ান + তাঞ্জানিয়া + ইউক্রেইন + উগান্ডা + যুক্তরাষ্ট্রের ক্ষুদ্র ও পার্শ্ববর্তী দ্বীপপুঞ্জ + মার্কিন যুক্তরাষ্ট্র + উরুগোয়ে + উজ্বেকিস্থান + ভ্যাটিকান সিটি + সেন্ট ভিনসে‡ন্ট ও দ্যা গ্রেনাডিনস + ভেনেজুয়েলা + ব্রিটিশ ভার্জিন দ্বীপপুঞ্জ + মার্কিন ভার্জিন দ্বীপপুঞ্জ + ভিয়েতনাম + ভানুয়াটু + ওয়ালিস ও ফুটুনা + সামোয়া + ইমেন + মায়োত্তে + দক্ষিণ আফ্রিকা + জাম্বিয়া + জিম্বাবুয়ে + অজানা অথবা ভুল স্থান + + + ক্যালেন্ডার + সজ্জাক্রম + মুদ্রা + + + প্রথাগত চীনা সজ্জাক্রম - বিগ৫ + বৌদ্ধ বর্ষপঞ্জী + চীনা বর্ষপঞ্জী + প্রত্যক্ষ সজ্জাক্রম + সাধারণ চীনা সজ্জাক্রম - জিবি২৩১২ + গ্রিগোরিয়ান বর্ষপঞ্জী + হিব্রু বর্ষপঞ্জী + ভারতীয় জাতীয় বর্ষপঞ্জী + ইসলামিক বর্ষপঞ্জী + ইসলামিক-সিভিল বর্ষপঞ্জী + জাপানি বর্ষপঞ্জী + ফোনবুক সজ্জাক্রম + পিনিন সজ্জাক্রম + গণপ্রজাতন্ত্রী চীনা বর্ষপঞ্জী + আবর্তিত সজ্জাক্রম + প্রথাগত সজ্জাক্রম + + + মার্কিন + মেট্রিক + + + ভাষা: {0} + লিপি: {0} + অঞ্চল: {0} + + + + [় ঁ-ঃ ৺ অ-ঋ ৠ ঌ ৡ এ ঐ ও-ড {ড়} ঢ {ঢ়} ণ ত ৎ থ-ন প-য {য়} র ল শ-হ ঽ-ৄ ৢ ৣ ে ৈ ো-্ ৗ] + [\u200C \u200D ৺ ৸ ৹ ৲-৷ a d e E h l L m M q Q s v y ৠ ঌ ৡ ৰ ৱ ঽ ৄ ৢ ৣ] + [৳] + + + “ + ” + ‘ + ’ + + + + + + + + জানুয়ারী + ফেব্রুয়ারী + মার্চ + এপ্রিল + মে + জুন + জুলাই + আগস্ট + সেপ্টেম্বর + অক্টোবর + নভেম্বর + ডিসেম্বর + + + জানুয়ারী + ফেব্রুয়ারী + মার্চ + এপ্রিল + মে + জুন + জুলাই + আগস্ট + সেপ্টেম্বর + অক্টোবর + নভেম্বর + ডিসেম্বর + + + + + জা + ফে + মা + এ + মে + জুন + জু + আ + সে + অ + ন + ডি + + + + + + + রবি + সোম + মঙ্গল + বুধ + বৃহস্পতি + শুক্র + শনি + + + রবিবার + সোমবার + মঙ্গলবার + বুধবার + বৃহষ্পতিবার + শুক্রবার + শনিবার + + + + + র + সো + ম + বু + বৃ + শু + শ + + + + + + + চতুর্থাংশ ১ + চতুর্থাংশ ২ + চতুর্থাংশ ৩ + চতুর্থাংশ ৪ + + + প্রথম চতুর্থাংশ + দ্বিতীয় চতুর্থাংশ + তৃতীয় চতুর্থাংশ + চতুর্থ চতুর্থাংশ + + + + + ১ + ২ + ৩ + ৪ + + + + পূর্বাহ্ণ + অপরাহ্ণ + + + খৃষ্টপূর্ব + খৃষ্টাব্দ + + + + + + EEEE, d MMMM, y + + + + + d MMMM, y + + + + + d MMM, y + + + + + d/M/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + d EEE + HH:mm + L + E, d-M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + dd-MM + d/M + d + mm:ss + y + M/yyyy + EEE, d/M/yyy + MMM y + EEE, d MMM, y + MMMM y + Q y + QQQ y + Q yy + MM-yyyy + MMMM y + + + {0} – {1} + + M-M + + + E, d/M – E, d/M + E, d/M – E, d/M + + + LLL-LLL + + + E, d MMM – E, d MMM + E, d MMM – E, d MMM + + + LLLL-LLLL + + + d MMM – d MMM + d–d MMM + + + d/M - d/M + d/M - d/M + + + d-d + + + h a – h a + h–h a + + + h:mm a – h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + h:mm a – h:mm a v + h:mm–h:mm a v + h:mm–h:mm a v + + + h a – h a v + h–h a v + + + y-y + + + M/yy – M/yy + M/yy – M/yy + + + E, d/M/yy – E, d/M/yy + E, d/M/yy – E, d/M/yy + E, d/M/yy – E, d/M/yy + + + MMM–MMM y + MMM y – MMM y + + + E, d MMM – E, d MMM, y + E, d MMM – E, d MMM, y + E, d MMM, y – E, d MMM, y + + + MM – MM -yyyy + MM-yyyy – MM-yyyy + + + d MMM – d MMM, y + d–d MMM, y + d MMM, y – d MMM, y + + + d/M/yy – d/M/yy + d/M/yy – d/M/yy + d/M/yy – d/M/yy + + + + + + যুগ + + + বছর + + + মাস + + + সপ্তাহ + + + দিন + গত তরশু + গত পরশু + গতকাল + আজ + আগামীকাল + আগামী পরশু + আগামী তরশু + + + সপ্তাহের দিন + + + পূর্বাহ্ণ/অপরাহ্ণ + + + ঘন্টা + + + মিনিট + + + সেকেন্ড + + + এলাকা + + + + + + + + চৈত্র + বৈশাখ + জৈষ্ঠ্য + আষাঢ় + শ্রাবণ + ভাদ্র + আশ্বিন + কার্তিক + অগ্রহায়ণ + পৌষ + মাঘ + ফাল্গুন + + + চৈত্র + বৈশাখ + জৈষ্ঠ্য + আষাঢ় + শ্রাবণ + ভাদ্র + আশ্বিন + কার্তিক + অগ্রহায়ণ + পৌষ + মাঘ + ফাল্গুন + + + + + ১ + ২ + ৩ + ৪ + ৫ + ৬ + ৭ + ৮ + ৯ + ১০ + ১১ + ১২ + + + + পূর্বাহ্ন + অপরাহ্ন + + + সাল + + + + + + + + মহরম + সফর + রবিউল আউয়াল + রবিউস সানি + জমাদিউল আউয়াল + জমাদিউস সানি + রজব + শা'বান + রমজান + শাওয়াল + জ্বিলকদ + জ্বিলহজ্জ + + + মহররম + সফর + রবিউল আউয়াল + রবিউস সানি + জমাদিউল আউয়াল + জমাদিউস সানি + রজব + শা'বান + রমজান + শাওয়াল + জ্বিলকদ + জ্বিলহজ্জ + + + + + ১ + ২ + ৩ + ৪ + ৫ + ৬ + ৭ + ৮ + ৯ + ১০ + ১১ + ১২ + + + + পূর্বাহ্ন + অপরাহ্ন + + + যুগ + + + + + + +HH:mm;-HH:mm + গ্রীনিচ মান সময় {0} + গ্রীনিচ মান সময় + {0} সময় + {1} ({0}) + + অজানা + + + রথেরা + + + পামার + + + দক্ষিণ মেরু + + + সিওয়া + + + মসোন + + + ডেভিস + + + ভস্টোক + + + কেইসি + + + ডুমন্ট ডি’উরভিল + + + ম্যাকমুর্ডো + + + রিও গায়েগোস + + + মেন্ডোজা + + + সান হুয়ান + + + উশুয়াইয়া + + + লা রিওহা + + + সান লুইস + + + ক্যাটামার্কা + + + হুহুই + + + টুকুমান + + + কর্ডোবা + + + বুয়েনোস আয়েরেস + + + পার্থ + + + ইউক্লা + + + ডারউইন + + + এ্যাডেলেইড + + + ব্রোকেন হিল + + + কিউরি + + + মেলবার্ন + + + হোবার্ট + + + লিনডেম্যান + + + সিডনি + + + ব্রিসবেন + + + লর্ড হাও + + + আইরুনেপে + + + রিও ব্রাঙ্কো + + + পোর্তো ভেল্‌হো + + + বোয়া ভিস্তা + + + মানাউস + + + কুইয়াবা + + + কাম্পো গ্রান্ডে + + + বেলেম + + + আরাগুয়াইনা + + + সাও পাউলো + + + বাহিয়া + + + ফোর্টালেজা + + + মাসেয়ো + + + রেসিফে + + + নরোন্‌হা + + + ডসোন + + + হো্য়াইট হর্স + + + ইনুভ্যাক + + + ভ্যাঙ্কুভার + + + ডসোন ক্রিক + + + ইয়েলোনাইফ + + + এডমন্টোন + + + সুইফ্ট কারেন্ট + + + কেমব্রিজ বে + + + রেজিনা + + + উইনিপেগ + + + রেসোলুট + + + রেইনি রিভার + + + র‌্যাঙ্কিন ইনলেট + + + কোরাল হার্বার + + + থান্ডার বে + + + নিপিগোন + + + টোরন্টো + + + মন্ট্রিয়াল + + + ইকুয়ালুইট + + + প্যাঙ্গনির্টুং + + + মঙ্কটোন + + + হ্যালিফ্যাক্স + + + গুস বে + + + গ্লাস বে + + + ব্লাঙ্ক-সাব্লোন + + + সেন্ট জন্স + + + কিনশাসা + + + লুবুম্বাশি + + + ইস্টার + + + ক্যাশগার + + + উরুমকি + + + চোঙকিং + + + হার্বিন + + + গ্যালাপ্যাগোস + + + কানেরি + + + সেউটা + + + ট্রুক + + + পোনাপে + + + কোসরায় + + + থুলি + + + স্কোর্সবায়সুন্ড + + + ডানমার্কশ্যাভন + + + জাকার্তা + + + পন্টিয়ান্যাক + + + মাকাসসার + + + জয়াপুরা + + + এন্ডারবারি + + + কিরিতিমাতি + + + টারাওয়া + + + আকটাউ + + + ওরাল + + + আকটোবে + + + কিজিলর্ডা + + + আলমাটি + + + কোয়াজালেইন + + + মাজুরো + + + হোভ্ড + + + উলানবাতার + + + চোইবাল্‌স্যান + + + তিয়াওয়ানা + + + হারমোসিল্লো + + + মাজাটলান + + + চিহুয়াহুয়া + + + মন্টেরি + + + মেক্সিকো সিটি + + + মেরিডা + + + ক্যানকুন + + + কুচিং + + + চ্যাঠাম + + + মার্কেসাস + + + গাম্বিয়ের + + + আজোরেস + + + মাডেইরা + + + কালিনিঙগ্রাড + + + মস্কো + + + ভোল্গোগ্রাদ + + + সামারা + + + ইয়েকাটেরিনবার্গ + + + ওম্স্ক + + + নভোসিবির্স্ক + + + ক্রাসনোইয়ার্স্ক + + + ইর্কুট্স্ক + + + ইয়াকুট্স্ক + + + ভ্লাদিভস্তোক + + + সাখালিন + + + ম্যাগাডান + + + কামচাটকা + + + অ্যানাডির + + + উঝগোরোড + + + কিয়েভ + + + সিমফেরোপোল + + + জাপোরোঝা + + + মিডওয়ে + + + জনস্টন + + + ওয়েক + + + আডাক + + + নোম + + + হনোলুলু + + + এনকোরেজ + + + ইয়াকুটাট + + + জুনো + + + লস এ্যাঞ্জেলেস + + + বয়জি + + + ফিনিক্স + + + শিপ্রক + + + ডেনভার + + + নিউ সালেম, উত্তর ডাকোটা + + + মধ্য, উত্তর ডাকোটা + + + শিকাগো + + + মেনোমিনি + + + ভিনসেন্নেস, ইন্ডিয়ানা + + + পিটারর্সবার্গ, ইন্ডিয়ানা + + + টেলসিটি, ইন্ডিয়ানা + + + নক্স, ইন্ডিয়ানা + + + উইনাম্যাক, ইন্ডিয়ানা + + + মারেঙ্গো, ইন্ডিয়ানা + + + ইন্ডিয়ানাপোলিস + + + লুইসভিল + + + ভেভেয়, ইন্ডিয়ানা + + + মন্টিচেলো, কেন্টাকি + + + ডেট্রোইট + + + নিউইয়র্ক + + + সমরখন্দ + + + + বাংলাদেশ সময় + + + + + + beng + + . + , + ; + % + ০ + # + + + - + E + ‰ + ∞ + সংখ্যা না + + + + + #,##,##0.### + + + + + + + #E0 + + + + + + + #,##,##0% + + + + + + + #,##,##0.00¤;(#,##,##0.00¤) + + + {0} {1} + {0} {1} + + + + এ্যান্ডোরান পেসেতা + + + সংযুক্ত আরব আমিরাত দিরহাম + + + আফগানি (১৯২৭-২০০২) + + + আফগানি + + + আলবেনিয়ান লেক + + + আরমেনিয়ান দ্রাম + + + নেদারল্যান্ড এ্যান্টিলিয়ান গুল্ডের + + + এ্যাঙ্গোলান কওয়ানজা + + + এ্যাঙ্গোলান কওয়ানজা (১৯৭৭-১৯৯০) + + + এ্যাঙ্গোলান নতুন কওয়ানজা (১৯৯৫-২০০০) + + + এ্যাঙ্গোলান কওয়ানজা (১৯৯৫-১৯৯৯) + + + আর্জেন্টিনা অস্ট্রাল + + + আর্জেন্টিনা পেসো (১৯৮৩-১৯৮৫) + + + আর্জেন্টিনা পেসো + + + অস্ট্রিয়ান শিলিং + + + অস্ট্রেলিয়ান ডলার + + + আরুবা গিল্ডার + + + আজারবাইজান মানাত (১৯৯৩-২০০৬) + + + আজারবাইজান মানাত + + + বসনিয়া এবং হার্জেগোভিনা দিনার + + + বসনিয়া এবং হার্জেগোভিনা মার্ক + + + বার্বেডোজ ডলার + + + বাংলাদেশী টাকা + ৳ + + + বেলজিয়ান ফ্রাঙ্ক (রূপান্তরযোগ্য) + + + বেলজিয়ান ফ্রাঙ্ক + + + বেলজিয়ান ফ্রাঙ্ক (আর্থিক) + + + বুলগেরীয় হার্ড লেভ + + + বুলগেরীয় নিউ লেভ + + + বাহরাইনি দিনার + + + বুরুন্ডি ফ্রাঙ্ক + + + বারমিউডান ডলার + + + ব্রুনেই ডলার + + + বলিভিয়ানো + + + বলিভিয়ান পেসো + + + বলিভিয়ান মভডোল + + + ব্রাজিলিয়ান ক্রুজেয়রোনোভো (১৯৬৭-১৯৮৬) + + + ব্রাজিলিয়ান ক্রুজেইডাউ + + + ব্রাজিলিয়ান ক্রুজেয়রো (১৯৯০-১৯৯৩) + + + ব্রাজিলিয়ান রিয়েল + + + ব্রাজিলিয়ান ক্রুজেইডো নোভো + + + ব্রাজিলিয়ান ক্রুজেয়রো + + + বাহামিয়ান ডলার + + + ভুটানি এনগুল্ট্রুম + + + বর্মি কিয়াৎ + + + বতসোয়ানা পুলা + + + বেলারুশিয়ান নিউ রুবেল (১৯৯৪-১৯৯৯) + + + বেলারুশিয়ান রুবেল + + + বেলিজ ডলার + + + কম্বোডিয়ান ডলার + + + কঙ্গো ফ্র্যাঙ্ক কঙ্গোলাইস + + + সুইজারল্যান্ড ইউরো + + + সুইস ফ্রাঙ্ক + + + সুইজারল্যান্ড ফ্রাঙ্ক + + + চিলিয়ান উনিদাদেস দি ফোমেন্তো + + + চিলি পেসো + + + চীনা য়ুয়ান রেন্মিন্‌বি + + + কলোম্বিয়ান পেসো + + + উনিদাদ দি ভ্যালোর রিয়েল + + + কোস্টা রিকা কোলোন + + + প্রাচীন সারবিয়ান দিনার + + + চেকোস্লোভাক হার্ড কোরুনা + + + কিউবান পেসো + + + কেপ ভার্দে এসকুডো + + + সাইপ্রাস পাউন্ড + + + চেকোস্লোভাক কোরুনা + + + পূর্ব জার্মান মার্ক + + + ডয়চ্ মার্ক + + + জিবুতি ফ্রাঙ্ক + + + ড্যানিশ ক্রৌন + + + ডোমিনিকান পেসো + + + আলজেরীয় দিনার + + + ইকুয়াডোর সুক্রে + + + ইকুয়াডোর উনিদাদেস দি ভেলর কনসতান্তে (ইউভিসি) + + + এস্তোনিয়া ক্রুনি + + + মিশরীয় পাউন্ড + + + এরিট্রিয়েন নাকফা + + + স্প্যানিশ পেসেতা (একই হিসাব) + + + স্প্যানিশ পেসেতা (রূপান্তরযোগ্য হিসাব) + + + স্প্যানিশ পেসেতা + + + ইথিওপিয়ান বির + + + ইউরো + + + ফিনিস মার্কা + + + ফিজি ডলার + + + ফকল্যান্ড দ্বীপপুঞ্জ পাউন্ড + + + ফরাসি ফ্রাঙ্ক + + + ব্রিটিশ পাউন্ড স্টার্লিং + + + জর্জিয়ান কুপন লারিট + + + জর্জিয়ান লারি + + + ঘানা সেডি (১৯৭৯-২০০৭) + + + ঘানা সেডি + + + জিব্রাল্টার পাউন্ড + + + গাম্বিয়া ডালাসি + + + গিনি ফ্রাঙ্ক + + + গিনি সাইলি + + + ইকুয়েটোরিয়াল গিনি ইকুয়িলি + + + গ্রীক দ্রাচমা + + + গুয়াতেমালা কুয়েৎজাল + গুয়াতেমালা কুয়েৎজাল + + + পর্তুগিজ গিনি এসকুডো + + + গিনি বিসাউ পেসো + + + গাইয়েনা ডলার + + + হংকং ডলার + + + হন্ডুরাস লেম্পিরা + + + ক্রোয়েশিয়ান দিনার + + + ক্রোয়েশিয়ান কুনা + ক্রোয়েশিয়ান কুনাস + + + হাইতি গৌর্দে + + + হাঙ্গেরিয়ান ফোরিন্ট + + + ইন্দোনেশিয়ান রুপিয়াহ + + + ইরিশ পাউন্ড + + + ইস্রাইলি পাউন্ড + + + ইস্রাইলি নতুন শেকেল + + + ভারতীয় রুপি + টাকা + + + ইরাকি দিনার + + + ইরানিয়ান রিয়াল + + + আইসল্যান্ড ক্রৌন + + + ইতালীয় লিরা + + + জ্যামাইকান ডলার + + + জর্ডানিয়ান দিনার + + + জাপানিজ ইয়েন + + + কেনিয়ান শিলিং + + + কিরগিজস্তান সোম + + + কম্বোডিয়ান রিয়েল + + + কম্বোরো ফ্রাঙ্ক + + + নাইজেরিয়ান পাউন্ড + + + দক্ষিণ কোরিয়ান ওন + + + কুয়েতি দিনার + + + কেম্যান দ্বীপপুঞ্জের ডলার + + + কাজাক্সটান টেঙ্গে + + + লেউশান কিপ + + + লেবানিজ পাউন্ড + + + শ্রীলঙ্কান রুপি + + + লাইবেরিয়ান ডলার + + + লেসুটু লোটি + + + লিথুইনিয়ান লিটা + + + লিথুইনিয়ান টালোন্যাস + + + লুক্সেমবার্গ রুপান্তযোগ্য ফ্রাঙ্ক + + + লুক্সেমবার্গ ফ্রাঙ্ক + + + লুক্সেমবার্গ ফাইনেনশিয়াল ফ্রাঙ্ক + + + ল্যাটভিয়ান ল্যাট্‌স + + + ল্যাটভিয়ান রুবল + + + লিবিয়ান ডলার + + + মোরোক্কান দিরহাম + + + মোরোক্কান ফ্রাঙ্ক + + + মোল্ডোভান লেয়ু + + + মাদাগাস্কার আরিয়ারি + + + মাদাগাস্কার ফ্রাঙ্ক + + + ম্যাসেডোনিয়ান দিনার + + + মালি ফ্রাঙ্ক + + + মায়ানমার কিয়াত + + + মঙ্গোলিয়ান তুগরিক + + + ম্যাক্যাও পাটাকা + + + মৌরিতানিয়ান ওউগুইয়া + + + মাল্টা লিরা + + + মাল্টা পাউন্ড + + + মৌরিতানিয়ান রুপি + + + মালদিভিয়ান রুফিয়া + + + মালাউই॰¯়ান কওয়াচ + + + ম্যাক্সিকান পেসো + + + ম্যাক্সিকান সিলভার পেসো (১৮৬১-১৯৯২) + + + মেক্সিকান উনিদাদ দি ইনভার্সান (UDI) + + + মালয়েশিয়ান রিঙ্গিৎ + + + মোজাম্বিক এসকুডো + + + প্রাচীন মোজাম্বিক মেটিকেল + + + মোজাম্বিক মেটিকেল + + + নামিবিয়া ডলার + + + নাইজেরিয়ান নায়রা + + + নিকারাগুয়ান কর্ডোবা + + + নিকারাগুয়ান কর্ডোবা ওরো + + + নেদারল্যান্ড গুল্ডের + + + নরওয়ে ক্রৌন + + + নেপালি রুপি + + + নিউজিল্যান্ড ডলার + + + ওমানি রিয়াল + + + পানামা বেলবোয়া + + + পেরুভিয়ান ইন্তি + + + পেরুভিয়ান সোল নুয়েভো + + + পেরুভিয়ান সোল + + + পপুয়ানিউগিনি কিনা + + + ফিলিপাইন পেসো + + + পাকিস্তানি রুপি + + + পোলিশ জ্লোটি + + + পোলিশ জ্লোটি (১৯৫০-১৯৯৫) + + + পর্তুগিজ এসকুডো + + + প্যারগুয়ান + + + কাতার রিয়্যাল + + + রোডেশিয়ান ডলার + + + প্রাচীন রুমানিয়া লেয়ু + + + রুমানিয়া লেয়ু + + + সারবিয়ান দিনার + + + রাশিয়ান রুবেল + + + রাশিয়ান রুবল (১৯৯১-১৯৯৮) + + + রুয়ান্ডান ফ্রাঙ্ক + + + সৌদি রিয়্যাল + + + সলোমন দ্বীপপুঞ্জ ডলার + + + সেয়চেল্লোইস রুপি + + + প্রাচীন সুদানি দিনার + + + সুদানি পাউন্ড + সুদানি পাউন্ড + + + প্রাচীন সুদানি পাউন্ড + + + সুইডিশ ক্রোনা + + + সিঙ্গাপুর ডলার + + + সেন্ট হেলেনা পাউন্ড + + + স্লোভানিয়া টোলার + + + স্লোভাক কোরুনা + + + সিয়েরালিয়ন লিয়ন + + + সোমালি শিলিং + + + সুরিনাম ডলার + + + সুরিনাম গিল্ডার + + + সাও টোমে এবং প্রিন্সিপে ডোবরা + + + সোভিয়েত রুবল + + + এল স্যালভোডোর কোলোন + + + সিরিয়ান পাউন্ড + + + সোয়াজিল্যান্ড লিলাঙ্গেনি + + + থাই বাত + + + তাজিকিস্তান রুবল + + + তাজিকিস্তান সোমোনি + + + তুর্কমেনিস্টানি মানাত + + + তুর্কমেনিস্তান নতুন মানত + + + তিউনেশিয়ান দিনার + + + টোঙ্গা পা’আঙ্গা + + + তিমুর এসকুডো + + + প্রাচীন তুর্কি লিরা + + + তুর্কি লিরা + + + ত্রিনিদাদ এবং টোবাগো ডলার + + + নূতন তাইওয়ান ক্যারাবিয়ান ডলার + + + তাঞ্জনিয়া শিলিং + + + ইউক্রেইন হৃভনিয়া + + + ইউক্রেইন কার্বোভ্যান্টস + + + উগান্ডান শিলিং (১৯৬৬-১৯৮৭) + + + উগান্ডান শিলিং + + + মার্কিন ডলার + + + মার্কিন ডলার (পরবর্তী দিন) + + + মার্কিন ডলার (একই দিন) + + + উরুগুয়ায়ান পেসো এন উনিদাদেস ইনডেক্সেডাস + + + উরুগুয়ে পেসো (১৯৭৫-১৯৯৩) + + + উরুগুয়ে পেসো উরুগুয়েও + + + উজবেকিস্তানি সোম + + + ভেনিজুয়েলান বলিভার + + + ভেনিজুয়েলীয় বলিভার র্ফুতে + + + ভিয়েতনামি ডঙ্গ + + + ভানুয়াতু ভাতু + + + পশ্চিমাঞ্চলীয় সামোয়ান টালা + + + সিএফএ ফ্র্যাঙ্ক বিইএসি + + + সিলভার + + + গোল্ড + + + ইউরোপীয় আর্থিক একক + + + পূর্ব ক্যারাবিয়ান ডলার + + + ইউরোপীয় মুদ্রা একক + + + ফরাসি গোল্ড ফ্রাঙ্ক + + + ফরাসি ইউআইসি - ফ্রাঙ্ক + + + সিএফএ ফ্র্যাঙ্ক বিসিইএও + + + প্যালেডিয়াম + + + সিএফপি ফ্র্যাঙ্ক + + + প্লাটিনাম + + + অজানা বা ভুল মুদ্রা + + + ইয়েমেনি দিনার + + + ইয়েমেনি রিয়াল + + + যুগোশ্লাভিয় হার্ড দিনার + + + যুগোশ্লাভিয় নোভি দিনার + + + যুগোশ্লাভিয় রুপান্তরযোগ্য দিনার + + + দক্ষিণ আফ্রিকান র‌্যান্ড + + + দক্ষিণ আফ্রিকান রেন্ড + + + জাম্বিয়ান কওয়াচা + + + জাইরিয়ান নিউ জাইরে + + + জাইরিয়ান জাইরে + + + জিম্বাবুয়ে ডলার + + + জিম্বাবুয়ে ডলার (২০০৯) + + + জিম্বাবুয়ে ডলার (২০০৮) + + + + + + {0} দিন + {0} দিন + + + {0} ঘন্টা + {0} ঘন্টা + + + {0} মিনিট + {0} মিনিট + + + {0} মাস + {0} মাস + + + {0} সেকেন্ড + {0} সেকেন্ড + + + {0} সপ্তাহ + {0} সপ্তাহ + + + {0} বছর + {0} বছর + + + + + হাঁ + না + + + diff --git a/lib/zend/Zend/Locale/Data/bn_BD.xml b/lib/zend/Zend/Locale/Data/bn_BD.xml new file mode 100644 index 0000000000..94fb24b179 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/bn_BD.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/bn_IN.xml b/lib/zend/Zend/Locale/Data/bn_IN.xml new file mode 100644 index 0000000000..f7a4a690e7 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/bn_IN.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + আবখাজিয়ান + অ্যাচাইনিজ + আকোলি + আফ্রো-এশিয়াটিক ভাষা + আলগোনকিউয়ান ভাষা + আঙ্গিকা + চামোরো + চিনুক জার্গন + চকটোও + চিপেওয়াইয়ান + চেয়েনি + চার্চ স্লাভিক + অস্ট্রিয়ান জারমান + ডোগরি + অস্ট্রেলিয়ান ইংরাজী + ক্যানাডিয়ান ইংরেজি + ব্রিটিশ ইংরেজী + ক্যানাডিয়ান ফরাসী + অস্ট্রোনেসিয়ান + আরমেনিয়ান + আলটাইক + ব্লিসসিম্বলস + + + diff --git a/lib/zend/Zend/Locale/Data/bo.xml b/lib/zend/Zend/Locale/Data/bo.xml new file mode 100644 index 0000000000..6d495d6a45 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/bo.xml @@ -0,0 +1,441 @@ + + + + + + + + + + + པོད་སྐད་ + འཇར་མན་གྱི། + རྫོང་ཁ + ཨིང་ལིཤ་སྐད། + ཨིང་ལིཤ་སྐད། (ཁེ་ན་ཌ་) + ཨིང་ལིཤ་སྐད། (རྦི་རི་ཊིཤ་) + ཨིང་ལིཤ་སྐད། (ཨ་རི་) + ཞི་པན་ཡའི། + ཧྥ་རན་སིའི་། + གཱ་སྐད། + གུཇ་རཱཏི་སྐད། + ཧིན་དི + དབྱི་ཏ་་ལའི་མི། + རི་པིན་སྐད་ + ལེ་ཊིན་སྐད། + ནེ་པ་ལི + ཕི་ཐོ་ཡའི། + པ་ཞའི་མི། ཕི་ཐོ་ཡའི་མི། + ཨུ་རུ་སུ་སྐད་ + མིའི་ཤེས་རྟོགས་མ་བྱུང་བ། ཡང་ན་ཆད་ལྷག་ཅན་གྱི་སྐད་བརྡ། + ཟེ་ན་གཱ་སྐད། + རྒྱ་སྐད་ + སྟབས་བརྡའི། ཀྲུང་གོའི། + སྲོལ་རྒྱུན་གྱི། + ཟུ་ལུ་སྐད། + ཟུ་ནི་སྐད། + ཟ་ཟཱ་སྐད། + + + + + + + + + + + + + འཛམ་གླིང་། + ཨཕྲི་ཀ། + ཨ་མེ་རི་ཀ། + ཨསྟྲེ་ལི་ཡ་དང་། ནིའུ་ཛི་ལན྄ཌ། + ཨེ་ཤི་ཡ། + ཡུ་རོབ། + ཨེན་ཌོ་ར། + ཨ་རབ། ཨི་མི་རཊ྄། ཆིག་སྒྲིལ་རྒྱལ་ཁབ། + ཨཕ་ག་ནི་སྟཱན། + ཨེན་ཊི་གུ་དང་། བྷར་བུ་ཌ། + ཨང་གུའི་ལ། + ཨལ་བཱ་ནི་ཡ། + ཨར་མེ་ནི་ཡ། + ཨང་གཽ་ལ། + ལྷོ་རྩེའི་མཐའ་གླིང་། + ཨར་ཇེན་ཊི་ན། + ཨསྟྲི་ཡ། + ཨསྟྲེ་ལི་ཡ། + ཨ་རུ་བ། + ཨཛར་བཡེ་ཇན། + བོསྣི་ཡ་དང་ཧརྫོ་གོ་ཝི་ན། + བཱརྦ་ཌོས྄། + བངྒ་ལ་དེཤ། + བེལ་ཇི་ཡམ། + བརཀི་ན། ཕསོ། + བུལ་ག་རི་ཡ། + བྷཱ་རེན། + བུ་རུན་ཌི། + བཱེ་ནིན། + བར་མུ་ཌ། + བུ་རུ་ནེ། + བོ་ལི་ཝིཡ། + བ་རཱ་ཛིལ། + བྷཱ་མས྄། + འབྲུག་ཡུལ། + བོཙ་ཝ་ན། + བེ་ལུ་རུ་སུ། + བེ་ལིཛ། + ཁེ་ན་ཌ། + ཀོ་ཊེ་ཌི། ཨི་ཝོ་རེ། + ཀཱུག གླིང་ཕྲེན་རྒྱལ་ཁབ། + ཅི་ལི། + ཀ་མེ་རུན། + རྒྱ་ནག + ཀོ་ལོམ་བི་ཡ། + ཀོ་ས྄ཊ་རི་ཀ། + ཁྱུའུ་བ། + སཱཡེ་པ་རས྄། + ཅཻག་སྤྱི་མཐུན་རྒྱལ་ཁབ། + འཇར་མན་ + ཛི་བུ་ཏི། + ཌེན་མཱརྐ། + ཌོ་མིན་ནི་ཀ། + ཌོ་མིནནི་ཀན་སྤྱི་མཐུན་རྒྱལ་ཁབ། + ཨལ་ཇི་རི་ཡ། + ཨི་ཁྭ་ཌོར། + ཨིསྟོ་ནི་ཡ། + ཨི་ཇིབྚ། + ཨེ་རི་ཏྲེ་ཨ། + སི་པན། + ཨི་ཐིའོ་པི་ཡ། + ཕིན་ལན྄ཌ། + ཕི་ཇི། + ཕལྐ་ལནྜ་གླིང་ཕྲན། + ཕ་རཱན་སི། + གེ་བཽན། + དབྱིན་ཇི་ + གྷ་རི་ན་ཌ། + ཇོར་ཇི་ཡ། + གྷ་ན། + ཇིབ་རཱལ་ཊར། + གྷམ་བི་ཡ། + གྷི་ནི་ཡ། + གྷི་རཱི་སི། + གྷོ་ཊེ་མ་ལ། + གྷི་ནི་ཡ་བིས྄་སོ། + གྷུ་ཡཱ་ན། + ཧོང་ཀོང༌། + ཧོན་དུ་རས྄། + ཀུརོ་ཤི་ཡ། + ཧེ་ཏི། + ཧངྒ་རི། + ཨིན་ཌོ་ནེ་ཤི་ཡ། + ཨ་ཡར་ལནཌ། + ཨི་ཛ྄་རེལ། + རྒྱ་གར་ + ཨི་རག། + ཨི་རཱན། + ཨ་ཨི་སི་ལནད། + ཨི་ཀྲར་ལི་ + ཛ་མེ་ཀ། + ཇོར་ཌན། + རི་པིན་ + ཁེན་ཉི་ཡ། + ཁིར་གིཛ་སྟཱན། + ཀམ་བོ་ཌི་ཡ། + ཀི་རི་བཱ་ཏི། + སེནྚ། ཀིཊྚས྄། དང༌། ནེ་བིས྄། + ཀོ་རི་ཡ། ལྷོ་མ། + ཀུ་ཝེད་རྒྱལ་ཁབ། + ཁེ་མེན་གླིང་ཕྲན། + ཁ་ཛཱག་སྟཱན། + ལཱ་འོས། + ལེབ་ནོན། + སེནྚ། ལུ་ཤི་ཡ། + ལེག་ཏེན་ཚིན། + ཤྲཱི་ལང་ཀ། + ལི་བེ་རི་ཡ། + ལེ་སོ་ཐོ། + ལི་ཐུ་ཨེ་ནི་ཡ། + ལཀ་ཛམ་བོརྒ། + ལཏ་བི་ཡ། + ལི་བི་ཡ། + མོ་རོ་ཀྐོ། + མོ་ན་ཀོ། + མ་དཱ་གྷསྐཱར། + མཱར་ཤལ་གླིང་ཕྲེན། + མ་ལི། + འབར་མ། + སོག་ཡུལ། + མེ་ཀའོ། + མཽ་རི་ཏ་ནི་ཡ། + མལ་ཊ། + མཽ་རིཤས྄། + མལ་དྭིབ། + མཱ་ལཱ་ཝི། + མེཀ་སི་ཀོ། + མ་ལེ་ཤི་ཡ། + མོ་ཛམ་བིག། + ན་མི་བི་ཡ། + ནའི་ཇར། + ནཱའི་ཇི་རི་ཡ། + ནི་ཀ་ར་གུ་ཨ། + ནེ་ཐར་ལནྜ། + ནོར་ཝེ། + བར་ཡུལ་ + ནཽ་རུ། + ནིའུ་ཝ། + ནིའུ་ཛི་ལན྄ཌ། + ཨོ་མན། + པ་ནཱ་མ། + པེ་རུ། + པ་པུ་ཨ། ནིའུ། གྷི་ནི། + ཕི་ལི་པིནས྄། + པཀི་སྟཱན། + པོ་ལནྜ། + པོར་ཏུ་གྷལ། + པ་ལཽ། + པཱ་ར་གེ། + ཀ་ཏཱར། + རོ་མཱ་ནིཡ། + སེར་བི་ཡ། + ཨུ་རུ་སུ་ + རུ་ཝན་ཌ། + སཽ་དྷི་ཨ་རཱ་བི་ཡ། + སོ་ལོ་མོན། གླིང་ཕྲན་ཚོ་ཁག། + སཱ་ཤཻལ། + སུ་དཱན། + སིངྒ་པུར། + སེནྚ། ཧེ་ལི་ན། + ས་ལཽ་ཝེ་ནི་ཡ། + ས་ལཽ་ཝཀྱ། + སེ་ཡར་ར། ལིའོན། + སན་མེ་རི་ནོ། + སེ་ནི་གྷལ། + སོ་མཱལི་ཡ། + སུ་རི་ནཱམ། + ས་འོ་ཏོད་མད། དང༌། པ྄རིན་སི་པེ། + ཨེལ། སཱལ་ཝ་ཌོར། + ཅཻཌ། + ཏུརཀི། + ཐུ་ཝ་ལུ། + ཡུ་ཀརེན། + ཡུ་གན་ཌ། + ཨ་མེ་རི་ཀ་ + ཨུ་རུ་གྷེ། + ཨུཛ་བེ་ཀིསྟཱན། + ཝེ་ཊི་ཀན། + སེནྚ། ཝིན་སན། དང༌། གྷིརིན་ཌིན། + ཝེ་ནི་ཛུའེ་ལ། + ཝེད་ནམ། + ཝ་ནུ་ཨ་ཐུ། + ནུ་བ་ས་མོ་འ། + ཡེ་མེན། + ལྷོ་ ཨཕྲི་ཀ། + ཛམ་བི་ཡ། + ཛིམ་བྷཱ་བེ། + མིའི་ཤེས་རྟོགས་མ་བྱུང་བའི་ཁོར་ཡུག + + + ཨ་མེ་རི་ཀའི། + + + + [\u0F7E ཿ ་ ། ༎ ༠-༩ ཀ {ཀ\u0FB5} \u0F90 {\u0F90\u0FB5} ཁ \u0F91 ག {ག\u0FB7} \u0F92 {\u0F92\u0FB7} ང \u0F94 ཅ \u0F95 ཆ \u0F96 ཇ \u0F97 ཉ \u0F99 ཊ \u0F9A ཋ \u0F9B ཌ {ཌ\u0FB7} \u0F9C {\u0F9C\u0FB7} ཎ \u0F9E ཏ \u0F9F ཐ \u0FA0 ད {ད\u0FB7} \u0FA1 {\u0FA1\u0FB7} ན \u0FA3 པ \u0FA4 ཕ \u0FA5 བ {བ\u0FB7} \u0FA6 {\u0FA6\u0FB7} མ \u0FA8 ཙ \u0FA9 ཚ \u0FAA ཛ {ཛ\u0FB7} \u0FAB {\u0FAB\u0FB7} ཝ \u0FAD \u0FBA ཞ \u0FAE ཟ \u0FAF འ \u0FB0 ཡ \u0FB1 \u0FBB ར ཪ \u0FB2 \u0FBC ལ \u0FB3 ཤ \u0FB4 ཥ \u0FB5 ས \u0FB6 ཧ \u0FB7 ཨ \u0FB8 \u0F71 \u0F72 {\u0F71\u0F72} \u0F80 {\u0F71\u0F80} \u0F74 {\u0F71\u0F74} {\u0FB2\u0F80} \u0F77 {\u0FB3\u0F80} \u0F79-\u0F7D \u0F84] + [ༀ] + + + + + + + + ཟླ་༡ + ཟླ་༢ + ཟླ་༣ + ཟླ་༤ + ཟླ་༥ + ཟླ་༦ + ཟླ་༧ + ཟླ་༨ + ཟླ་༩ + ཟླ་༡༠ + ཟླ་༡༡ + ཟླ་༡༢ + + + ཟླ་བ་དང་པོ་ + ཟླ་བ་གཉིས་པ་ + ཟླ་བ་སུམ་པ་ + ཟླ་བ་བཞི་པ་ + ཟླ་བ་ལྔ་པ་ + ཟླ་བ་དྲུག་པ་ + ཟླ་བ་བདུན་པ་ + ཟླ་བ་བརྒྱད་པ་ + ཟླ་བ་དགུ་པ་ + ཟླ་བ་བཅུ་པ་ + ཟླ་བ་བཅུ་གཅིག་པ་ + ཟླ་བ་བཅུ་གཉིས་པ་ + + + + + + + ཉི་མ་ + ཟླ་བ་ + མིག་དམར་ + ཧླག་པ་ + ཕུར་བུ་ + སངས་ + སྤེན་པ་ + + + གཟའ་ཉི་མ་ + གཟའ་ཟླ་བ་ + གཟའ་མིག་དམར་ + གཟའ་ཧླག་པ་ + གཟའ་ཕུར་བུ་ + གཟའ་སངས་ + གཟའ་སྤེན་པ་ + + + + + ཉི + ཟླ + མི + ཧླ + ཕུ + ས + སྤེ + + + + + + + དུས་ཚིགས་དང་པོ། + དུས་ཚིགས་གཉིས་པ། + ་དུས་ཚིགས་གསུམ་པ། + དུས་ཚིགས་བཞི་པ། + + + + སྔ་དྲོ་ + ཕྱི་དྲོ་ + + + སྤྱི་ལོ་སྔོན། + སྤྱི་ལོ། + + + + + + སྦྱི་ལོ་y MMMMའི་ཙེས་dད + + + + + y ལོ་འི་MMMཙེས་d + + + + + + ལོ་རིམ། + + + ལོ། + + + ཟླ་བ་ + + + གཟའ་འཁོར། + + + ཉིན། + ཁས་ཉིན་ཀ་ + ཁས་ས་ + དེ་རིང་ + སང་ཉིན་ + གནངས་ཉིན་ཀ་ + + + གཟའ་འཁོར་གཅིག + + + སྔ་དྲོ། ཕྱི་དྲོ། + + + ཆུ་ཙོ་ + + + སྐར་མ། + + + སྐར་ཆ། + + + དུས་ཚོད། + + + + + + + མ་རྟོགས་པ + + + + + tibt + + . + , + ༠ + ཨང་མེན་ + + + + + #,##0.### + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + + + + ཡུ་ཨན་ + + + རྒྱ་གར་སྒོར་མོ་ + + + མ་རྟོགས་པའི་ནུས་མེད་དངུལ་ལོར + + + + + + ཡིན།:Y + མེད།:N + + + + diff --git a/lib/zend/Zend/Locale/Data/bo_CN.xml b/lib/zend/Zend/Locale/Data/bo_CN.xml new file mode 100644 index 0000000000..c8ad01f86c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/bo_CN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/bo_IN.xml b/lib/zend/Zend/Locale/Data/bo_IN.xml new file mode 100644 index 0000000000..88c32dc922 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/bo_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/bs.xml b/lib/zend/Zend/Locale/Data/bs.xml new file mode 100644 index 0000000000..29b580e775 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/bs.xml @@ -0,0 +1,330 @@ + + + + + + + + + + + afrikaans + amharski + arapski + asameski + azerbejdžanski + bjeloruski + bugarski + bihari + bengalski + tibetanski + bretonac + bosanski + katalonski + češki + velški + danski + njemački + grčki + engleski + esperanto + španjolski + estonski + baskijski + perzijski + finski + filipinski + farski + francuski + frizijski + irski + škotski gelski + galicijski + guarani + gudžarati + hebrejski + hindu + hrvatski + mađarski + armenski + interlingua + indonezijski + međujezični + islandski + talijanski + japanski + javanski + gruzijski + kambodžanski + kannada + koreanski + kurdski + kirgiski + latinski + n/a + laothian + litvanski + latvijski + makedonski + malajalamski + mongolski + marati + malajski + malteški + nepalski + holandski + norveški (novonorveški) + norveški + oksitanski + indijski + pendžabi + poljski + pakistanski + portugalski + portugalski (Brazil) + portugalski (Portugal) + rumunski + ruski + sanskrit + sindi + srpsko-hrvatski + sinhaleski + slovački + slovenački + somalski + albanski + srpski + sesoto + sudanski + švedski + svahili + tamilski + telugu + tajlandski + tigrinya (eritrejski) + turkmenski + klingonski + turski + twi + uighur + ukrajinski + nepoznati ili nevažeći jezik + urdu + uzbekistanski + vijetnamski + bantu + jidiš + kineski + zulu + + + + + + + Bosna i Hercegovina + Crna Gora + Srbija + Tonga + Nepoznata ili nevažeća oblast + + + + [a-c ć č d đ {dž} e-l {lj} m n {nj} o p r s š t-v z ž] + [q w-y] + + + ‘ + ’ + “ + ” + + + + + + + + Jan + Feb + Mar + Apr + Maj + Jun + Jul + Avg + Sep + Okt + Nov + Dec + + + Januar + Februar + Mart + April + Maj + Juni + Juli + Avgust + Septembar + Oktobar + Novembar + Decembar + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Ned + Pon + Uto + Sri + Čet + Pet + Sub + + + Nedjelja + Ponedjeljak + Utorak + Srijeda + Četvrtak + Petak + Subota + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + Prvi kvartal + Drugi kvartal + Treći kvartal + Četvrti kvartal + + + + AM + PM + + + BC + AD + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Nepoznati ili nevažeći grad + + + + + + , + . + + + + Konvertibilna marka + + + Nepoznata ili nevažeća valuta + + + + + + da:d + ne:n + + + diff --git a/lib/zend/Zend/Locale/Data/bs_BA.xml b/lib/zend/Zend/Locale/Data/bs_BA.xml new file mode 100644 index 0000000000..70584353fc --- /dev/null +++ b/lib/zend/Zend/Locale/Data/bs_BA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/byn.xml b/lib/zend/Zend/Locale/Data/byn.xml new file mode 100644 index 0000000000..c4fa0e334a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/byn.xml @@ -0,0 +1,502 @@ + + + + + + + + + + + አፋርኛ + አብሐዚኛ + አፍሪቃንስኛ + አማርኛ + ዐርቢኛ + አሳሜዛዊ + አያማርኛ + አዜርባይጃንኛ + ባስኪርኛ + ቤላራሻኛ + ቡልጋሪኛ + ቢሃሪ + ቢስላምኛ + በንጋሊኛ + ትበትንኛ + ብሬቶንኛ + ብሊን + ካታላንኛ + ኮርሲካኛ + ቼክኛ + ወልሽ + ዴኒሽ + ጀርመን + ድዞንግኻኛ + ግሪክኛ + እንግሊዝኛ + ኤስፐራንቶ + ስፓኒሽ + ኤስቶኒአን + ባስክኛ + ፐርሲያኛ + ፊኒሽ + ፊጂኛ + ፋሮኛ + ፈረንሳይኛ + ፍሪስኛ + አይሪሽ + እስኮትስ ጌልክኛ + ግዕዝኛ + ጋለጋኛ + ጓራኒኛ + ጉጃርቲኛ + ሃውሳኛ + ዕብራስጥ + ሐንድኛ + ክሮሽያንኛ + ሀንጋሪኛ + አርመናዊ + ኢንቴርሊንጓ + እንዶኒሲኛ + እንተርሊንግወ + እኑፒያቅኛ + አይስላንድኛ + ጣሊያንኛ + እኑክቲቱትኛ + ጃፓንኛ + ጃቫንኛ + ጊዮርጊያን + ካዛክኛ + ካላሊሱትኛ + ክመርኛ + ካናዳኛ + ኮሪያኛ + ካሽሚርኛ + ኩርድሽኛ + ኪርጊዝኛ + ላቲንኛ + ሊንጋላኛ + ላውስኛ + ሊቱአኒያን + ላትቪያን + ማላጋስኛ + ማዮሪኛ + ማከዶኒኛ + ማላያላምኛ + ሞንጎላዊኛ + ሞልዳቫዊና + ማራዚኛ + ማላይኛ + ማልቲስኛ + ቡርማኛ + ናኡሩ + ኔፓሊኛ + ደች + ኖርዌጂያን + ኦኪታንኛ + ኦሮምኛ + ኦሪያኛ + ፓንጃቢኛ + ፖሊሽ + ፑሽቶኛ + ፖርቱጋሊኛ + ኵቿኛ + ሮማንስ + ሩንዲኛ + ሮማኒያን + ራሽኛ + ኪንያርዋንድኛ + ሳንስክሪትኛ + ሲንድሂኛ + ሳንጎኛ + ስንሃልኛ + ሲዳምኛ + ስሎቫክኛ + ስሎቪኛ + ሳሞአኛ + ሾናኛ + ሱማልኛ + ልቤኒኛ + ሰርቢኛ + ስዋቲኛ + ሶዞኛ + ሱዳንኛ + ስዊድንኛ + ስዋሂሊኛ + ታሚልኛ + ተሉጉኛ + ታጂኪኛ + ታይኛ + ትግርኛ + ትግረ + ቱርክመንኛ + ታጋሎገኛ + ጽዋናዊኛ + ቶንጋ + ቱርክኛ + ጾንጋኛ + ታታርኛ + ትዊኛ + ኡዊግሁርኛ + ዩክረኒኛ + ኡርዱኛ + ኡዝበክኛ + ቪትናምኛ + ቮላፑክኛ + ዎሎፍኛ + ዞሳኛ + ይዲሻዊኛ + ዮሩባዊኛ + ዡዋንግኛ + ቻይንኛ + ዙሉኛ + + + + + + አንዶራ + የተባበሩት አረብ ኤምሬትስ + አልባኒያ + አርሜኒያ + ኔዘርላንድስ አንቲልስ + አርጀንቲና + ኦስትሪያ + አውስትሬሊያ + አዘርባጃን + ቦስኒያ እና ሄርዞጎቪኒያ + ባርቤዶስ + ቤልጄም + ቡልጌሪያ + ባህሬን + ቤርሙዳ + ቦሊቪያ + ብራዚል + ቡህታን + ቤላሩስ + ቤሊዘ + ኮንጎ + የመካከለኛው አፍሪካ ሪፐብሊክ + ስዊዘርላንድ + ቺሊ + ካሜሩን + ቻይና + ኮሎምቢያ + ሰርቢያ + ኬፕ ቬርዴ + ሳይፕረስ + ቼክ ሪፑብሊክ + ጀርመን + ዴንማርክ + ዶሚኒካ + ዶሚኒክ ሪፑብሊክ + አልጄሪያ + ኢኳዶር + ኤስቶኒያ + ግብጽ + ምዕራባዊ ሳህራ + ኤርትራ + ስፔን + ኢትዮጵያ + ፊንላንድ + ፊጂ + ሚክሮኔዢያ + ፈረንሳይ + እንግሊዝ + ጆርጂያ + የፈረንሳይ ጉዊአና + ጋምቢያ + ጊኒ + ኢኳቶሪያል ጊኒ + ግሪክ + ቢሳዎ + ጉያና + ሆንግ ኮንግ + ክሮኤሽያ + ሀይቲ + ሀንጋሪ + ኢንዶኔዢያ + አየርላንድ + እስራኤል + ህንድ + ኢራቅ + አይስላንድ + ጣሊያን + ጃማይካ + ጆርዳን + ጃፓን + ካምቦዲያ + ኮሞሮስ + ደቡብ ኮሪያ + ሰሜን ኮሪያ + ክዌት + ሊባኖስ + ሊቱዌኒያ + ላትቪያ + ሊቢያ + ሞሮኮ + ሞልዶቫ + ማከዶኒያ + ሞንጎሊያ + ማካዎ + ሞሪቴኒያ + ማልታ + ማሩሸስ + ሜክሲኮ + ማሌዢያ + ናሚቢያ + ኒው ካሌዶኒያ + ናይጄሪያ + ኔዘርላንድ + ኖርዌ + ኔፓል + ኒው ዚላንድ + ፔሩ + የፈረንሳይ ፖሊኔዢያ + ፓፑዋ ኒው ጊኒ + ፖላንድ + ፖርታ ሪኮ + ሮሜኒያ + ራሺያ + ሳውድአረቢያ + ሱዳን + ስዊድን + ሲንጋፖር + ስሎቬኒያ + ስሎቫኪያ + ሴኔጋል + ሱማሌ + ሲሪያ + ቻድ + የፈረንሳይ ደቡባዊ ግዛቶች + ታይላንድ + ታጃኪስታን + ምስራቅ ቲሞር + ቱኒዚያ + ቱርክ + ትሪኒዳድ እና ቶባጎ + ታንዛኒያ + ዩጋንዳ + አሜሪካ + ዩዝበኪስታን + ቬንዙዌላ + የእንግሊዝ ድንግል ደሴቶች + የአሜሪካ ቨርጂን ደሴቶች + የመን + ደቡብ አፍሪካ + ዛምቢያ + + + + [\u135F ሀ-ሆ ለ-ሟ ረ-ቆ ቈ ቊ-ቍ ቐ-ቖ ቘ ቚ-ቝ በ-ኆ ኈ ኊ-ኍ ነ-ኮ ኰ ኲ-ኵ ኸ-ኾ ዀ ዂ-ዅ ወ-ዎ ዐ-ዖ ዘ-ዮ ደ-ዷ ጀ-ጎ ጐ ጒ-ጕ ጘ-ጟ ⶓ-ⶖ ጠ-ጯ ጸ-ጿ ፈ-ፗ] + [᎐-᎙ ሇ ⶀ ᎀ-ᎃ ⶁ ሠ-ሧ ⶂ-ⶄ ቇ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዏ ⶋ ዯ ⶌ ዸ-ዿ ⶍ ⶎ ጏ ⶏ-ⶑ ፇ ᎈ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ልደት + ካብኽ + ክብላ + ፋጅኺ + ክቢቅ + ም/ት + ኰር + ማርያ + ያኸኒ + መተሉ + ም/ም + ተሕሳ + + + ልደትሪ + ካብኽብቲ + ክብላ + ፋጅኺሪ + ክቢቅሪ + ምኪኤል ትጟኒሪ + ኰርኩ + ማርያም ትሪ + ያኸኒ መሳቅለሪ + መተሉ + ምኪኤል መሽወሪ + ተሕሳስሪ + + + + + ል + ካ + ክ + ፋ + ክ + ም + ኰ + ማ + ያ + መ + ም + ተ + + + + + + + ሰ/ቅ + ሰኑ + ሰሊጝ + ለጓ + ኣምድ + ኣርብ + ሰ/ሽ + + + ሰንበር ቅዳዅ + ሰኑ + ሰሊጝ + ለጓ ወሪ ለብዋ + ኣምድ + ኣርብ + ሰንበር ሽጓዅ + + + + + ሰ + ሰ + ሰ + ለ + ኣ + ኣ + ሰ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ፋዱስ ጃብ + ፋዱስ ደምቢ + + + ይጅ + ኣድ + + + + + + EEEE፡ dd MMMM ግርጋ y G + + + + + dd MMMM y + + + + + dd-MMM-y + + + + + dd/MM/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + + + የኢትዮጵያ ብር + + + አውሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + + + + + diff --git a/lib/zend/Zend/Locale/Data/byn_ER.xml b/lib/zend/Zend/Locale/Data/byn_ER.xml new file mode 100644 index 0000000000..ac761cdf93 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/byn_ER.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ca.xml b/lib/zend/Zend/Locale/Data/ca.xml new file mode 100644 index 0000000000..136204399f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ca.xml @@ -0,0 +1,3253 @@ + + + + + + + + + es_ES + + + {0} ({1}) + , + + + àfar + abkhaz + atjeh + acoli + adangme + adigué + avèstic + afrikaans + llengua afroasiàtica + afrihili + ainu + àkan + accadi + aleuta + llengua algonquina + altaic meridional + amhàric + aragonès + anglès antic + angika + llengua apatxe + àrab + arameu + araucà + arapaho + llengua artificial + arauac + assamès + asturià + llengua atapascana + llengua australiana + àvar + awadhi + aimara + àzeri + baixkir + banda + bamileké + balutxi + balinès + basa + llengua bàltica + bielorús + beja + bemba + berber + búlgar + bihari + bhojpuri + bislama + bicol + bini + blackfoot + bambara + bengalí + bantu + tibetà + bretó + braj + bosnià + batak + buriat + bugui + bilin + català + caddo + llengua ameríndia d'Amèrica Central + carib + llengua caucàsica + atsam + txetxè + cebuano + llengua cèltica + chamorro + txibtxa + txagatai + chuuk + mari + pidgin chinook + choctaw + chipewyan + cherokee + xeienne + txam + cors + copte + llengua criolla o pidgin basada en l'anglès + llengua criolla o pidgin basada en el francès + llengua criolla o pidgin basada en el portuguès + cree + tàtar de Crimea + llengua criolla o pidgin + txec + caixubi + eslau eclesiàstic + llengua cuixítica + txuvaix + gal·lès + danès + dakota + darguà + daiak + alemany + alemany austríac + alt alemany suís + delaware + slavey + dogrib + dinka + dogri + llengua dravídica + baix sòrab + duala + neerlandès mitjà + divehi + jula + dzongka + ewe + efik + egipci antic + ekajuk + grec + elamita + anglès + anglès australià + anglès canadenc + anglès britànic + anglès americà + anglès mitjà + esperanto + espanyol + espanyol d'Hispanoamèrica + espanyol d'Espanya + estonià + basc + ewondo + persa + fang + fanti + ful + finès + filipí + llengua finoúgrica + fijià + feroès + fon + francès + francès canadenc + francès suís + francès mitjà + francès antic + frisó septentrional + frisó occidental + friülà + frisó oriental + irlandès + ga + gayo + gbaya + gaèlic escocès + llengua germànica + gueez + gilbertès + gallec + alt alemany mitjà + guaraní + alt alemany antic + gondi + gorontalo + gòtic + grebo + grec antic + alemany suís + gujarati + manx + gwichin + haussa + haida + hawaià + hebreu + hindi + hiligainon + himachali + hitita + hmong + hiri motu + croat + alt sòrab + haitià + hongarès + hupa + armeni + herero + interlingua + iban + indonesi + interlingue + igbo + yi sichuan + ijo + inupiak + ilocà + llengua índica + llengua indoeuropea + ingúix + ido + llengua irànica + iroquès + islandès + italià + inuktitut + japonès + lojban + judeopersa + judeoàrab + javanès + georgià + karakalpak + cabilenc + katxin + jju + kamba + karen + kawi + kabardí + tyap + koro + kongo + khasi + llengua khoisan + khotanès + kikuiu + kuanyama + kazakh + grenlandès + khmer + kimbundu + kannada + coreà + konkani + kosraeà + kpelle + kanuri + karatxai + carelià + kru + kurukh + caixmiri + kurd + kúmik + kutenai + komi + còrnic + kirguís + llatí + ladí + panjabi occidental + lamba + luxemburguès + lesguià + ganda + limburguès + lingala + laosià + mongo + lozi + lituà + luba katanga + luba-lulua + luisenyo + lunda + luo + mizo + letó + madurès + magahi + maithili + makassar + mandinga + llengua austronèsia + massai + mordovià moksa + mandar + mende + malgaix + gaèlic irlandès mitjà + marshallès + maori + micmac + minangkabau + llengua miscel·lània + macedoni + llengua monkhmer + malaialam + mongol + manxú + manipurí + llengua manobo + moldau + mohawk + moré + marathi + malai + maltès + llengües vàries + llengua munda + creek + mirandès + marwari + birmà + llengua maia + mordovià erza + nauruà + nàhuatl + llengua ameríndia septentrional + napolità + noruec bokmål + ndebele septentrional + baix alemany + nepalès + newari + ndonga + nias + llengua nigerokurdufaniana + niueà + neerlandès + flamenc + noruec nynorsk + noruec + nogai + nòrdic antic + n’Ko + ndebele meridional + sotho septentrional + llengua nubiana + navaho + newari clàssic + nyanja + nyamwesi + nyankore + nyoro + nzema + occità + ojibwa + oromo + oriya + osset + osage + turc otomà + llengua otomangueana + panjabi + llengua papú + pangasi + pahlavi + pampangà + papiamento + palauà + persa antic + llengua filipina + fenici + pali + polonès + ponapeà + pràcrit + provençal antic + paixto + portuguès + portuguès de Brasil + portuguès de Portugal + quètxua + rajasthani + rapanui + rarotongà + retoromànic + rundi + romanès + llengua romànica + romaní + arrel + rus + aromanès + ruandès + sànscrit + sandawe + iacut + llengua ameríndia meridional + llengua salish + arameu samarità + sasak + santali + sard + sicilià + escocès + sindhi + sami septentrional + selkup + llengua semítica + sango + irlandès antic + llengua de signes + serbocroat + xan + singalès + sidamo + llengua sioux + llengua sinotibetana + eslovac + eslovè + llengua eslava + samoà + sami meridional + llengua sami + sami lule + sami d'Inari + sami skolt + shona + soninke + somali + sogdià + songhai + albanès + serbi + sranan + serer + siswati + llengua nilosahariana + sotho meridional + sundanès + sukuma + susú + sumeri + suec + suahili + siríac clàssic + siríac + tàmil + llengua tai + telugu + temne + terena + tetun + tadjik + thai + tigrinya + tigre + tiv + turcman + tokelauès + tagàlog + klingonià + tlingit + tamazight + tswana + tongalès + tonga + tok pisin + turc + tsonga + tsimshià + tàtar + tumbuka + llengua tupí + llengua altaica + tuvaluà + twi + tahitià + tuvinià + udmurt + uigur + ugarític + ucraïnès + umbundu + idioma desconegut o no vàlid + urdú + uzbek + vai + venda + vietnamita + volapük + vòtic + való + llengua wakash + ameto + waray-waray + washo + sòrab + wòlof + calmuc + xosa + yao + yapeà + jiddisch + ioruba + llengua iupik + zhuang + zapoteca + símbols Bliss + zenaga + xinès + xinès simplificat + xinès tradicional + zande + zulu + zuni + sense contingut lingüístic + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Món + Àfrica + Amèrica del Nord + Amèrica del Sud + Oceania + Àfrica Occidental + Amèrica Central + Àfrica Oriental + Àfrica septentrional + Àfrica Central + Àfrica meridional + Amèrica + Amèrica septentrional + Carib + Àsia Oriental + Àsia meridional + Àsia Sud-oriental + Europa meridional + Austràlia i Nova Zelanda + Melanèsia + Regió de la Micronèsia + Polinèsia + Àsia Sud-central + Àsia + Àsia Central + Àsia Occidental + Europa + Europa Oriental + Europa septentrional + Europa Occidental + Comunitat d'Estats Independents + Amèrica Llatina i Carib + Andorra + Unió dels Emirats Àrabs + Afganistan + Antigua i Barbuda + Anguilla + Albània + Armènia + Antilles Neerlandeses + Angola + Antàrtida + Argentina + Samoa Americana + Àustria + Austràlia + Aruba + Illes Åland + Azerbaidjan + Bòsnia i Hercegovina + Barbados + Bangla Desh + Bèlgica + Burkina Faso + Bulgària + Bahrain + Burundi + Benín + Saint Barthélemy + Bermudes + Brunei + Bolívia + Brasil + Bahames + Bhutan + Illa Bouvet + Botswana + Bielorússia + Belize + Canadà + Illes Cocos + República Democràtica del Congo + República Centreafricana + Congo + Suïssa + Costa d’Ivori + Illes Cook + Xile + Camerun + Xina + Colòmbia + Costa Rica + Sèrbia i Montenegro + Cuba + Cap Verd + Illa Christmas + Xipre + República Txeca + Alemanya + Djibouti + Dinamarca + Dominica + República Dominicana + Algèria + Equador + Estònia + Egipte + Sàhara Occidental + Eritrea + Espanya + Etiòpia + Finlàndia + Fiji + Illes Malvines + Micronèsia + Illes Fèroe + França + Gabon + Regne Unit + Grenada + Geòrgia + Guaiana Francesa + Guernsey + Ghana + Gibraltar + Grenlàndia + Gàmbia + Guinea + Guadeloupe + Guinea Equatorial + Grècia + Illes Geòrgia del Sud i Sandwich del Sud + Guatemala + Guam + Guinea Bissau + Guyana + Regió administrativa especial xinesa de Hong Kong + Illa Heard i Illes McDonald + Hondures + Croàcia + Haití + Hongria + Indonèsia + Irlanda + Israel + Illa de Man + Índia + Territori Britànic de l'Oceà Índic + Iraq + Iran + Islàndia + Itàlia + Jersey + Jamaica + Jordània + Japó + Kenya + Kirguizistan + Cambodja + Kiribati + Comores + Saint Christopher i Nevis + Corea del Nord + Corea del Sud + Kuwait + Illes Caiman + Kazakhstan + Laos + Líban + Saint Lucia + Liechtenstein + Sri Lanka + Libèria + Lesotho + Lituània + Luxemburg + Letònia + Líbia + Marroc + Mònaco + Moldàvia + Montenegro + Saint Martin + Madagascar + Illes Marshall + Macedònia + Mali + Myanmar + Mongòlia + Regió administrativa especial xinesa de Macau + Illes Mariannes del Nord + Martinica + Mauritània + Montserrat + Malta + Maurici + Maldives + Malawi + Mèxic + Malàisia + Moçambic + Namíbia + Nova Caledònia + Níger + Illa Norfolk + Nigèria + Nicaragua + Països Baixos + Noruega + Nepal + Nauru + Niue + Nova Zelanda + Oman + Panamà + Perú + Polinèsia Francesa + Papua Nova Guinea + Filipines + Pakistan + Polònia + Saint Pierre i Miquelon + Illes Pitcairn + Puerto Rico + Palestina + Portugal + Palau + Paraguai + Qatar + Territoris allunyats d'Oceania + Unió Europea + Illa de la Reunió + Romania + Sèrbia + Rússia + Rwanda + Aràbia Saudita + Illes Salomó + Seychelles + Sudan + Suècia + Singapur + Saint Helena + Eslovènia + Svalbard i Jan Mayen + Eslovàquia + Sierra Leone + San Marino + Senegal + Somàlia + Surinam + São Tomé i Príncipe + El Salvador + Síria + Swazilàndia + Illes Turks i Caicos + Txad + Territoris Francesos del Sud + Togo + Tailàndia + Tadjikistan + Tokelau + Timor Oriental + Turkmenistan + Tunísia + Tonga + Turquia + Trinitat i Tobago + Tuvalu + Taiwan + Tanzània + Ucraïna + Uganda + Illes Perifèriques Menors dels EUA + Estats Units + Uruguai + Uzbekistan + Vaticà + Saint Vincent i les Grenadines + Veneçuela + Illes Verges Britàniques + Illes Verges Nord-americanes + Vietnam + Vanuatu + Wallis i Futuna + Samoa + Iemen + Mayotte + República de Sud-àfrica + Zàmbia + Zimbabwe + Regió desconeguda o no vàlida + + + ortografia alemanya tradicional + ortofrafia resiana estandarditzada + ortografia alemanya de 1996 + francès mitjà tardà fins el 1606 + francès modern primerenc + armeni oriental + armeni occidental + alfabet llatí turc unificat + dialecte de San Giorgio/Bila + Boontling + alfabet fonètic internacional + sistema fonètic UPA + dialecte Lipovaz del resià + monotònic + dialecte de Natisone + dialecte de Gniva/Njiva + dialecte d'Oseacco/Osojane + politònic + ordenador + ortografia revisada + resià + saho + anglès estàndard d'Escòcia + scouse + dialecte de Stolvizza/Solbica + ortografia taraskievica + valencià + + + calendari + ordre alfabètic + moneda + + + ordre del xinès tradicional - Big5 + calendari budista + calendari xinès + ordre directe + ordre del xinès simplificat - GB2312 + calendari gregorià + calendari hebreu + calendari hindú + calendari musulmà + calendari civil islàmic + calendari japonès + ordre de la guia telefònica + ordre pinyin + calendari de la República Popular de Xina + ordre dels traços + ordre tradicional + + + imperial + mètric + + + Idioma: {0} + Escriptura: {0} + Regió: {0} + + + + [a à b c ç d e é è f-i í ï j-l ŀ m-o ó ò p-u ú ü v-z] + [á ă â å ä ã ā æ-è ĕ ê ë ē ì ĭ î ï ī ñ º ò ŏ ô ö ø ō œ ß ù ŭ û ū ÿ] + [a-c č d-l ł m-o º p-z] + + + ‘ + ’ + “ + ” + + + + + + + + gen. + febr. + març + abr. + maig + juny + jul. + ag. + set. + oct. + nov. + des. + + + gener + febrer + març + abril + maig + juny + juliol + agost + setembre + octubre + novembre + desembre + + + + + g + f + m + a + m + j + j + a + s + o + n + d + + + + + + + dg. + dl. + dt. + dc. + dj. + dv. + ds. + + + diumenge + dilluns + dimarts + dimecres + dijous + divendres + dissabte + + + + + dg + dl + dt + dc + dj + dv + ds + + + g + l + t + c + j + v + s + + + + + + + 1T + 2T + 3T + 4T + + + 1r trimestre + 2n trimestre + 3r trimestre + 4t trimestre + + + + + 1 + 2 + 3 + 4 + + + + a.m. + p.m. + + + aC + dC + + + + + + EEEE d 'de' MMMM 'de' y + + + + + d 'de' MMMM 'de' y + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + H:mm:ss zzzz + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + EEE d + HH:mm:ss + H:mm + L + E d/M + LLL + E d MMM + E d MMMM + d 'de' MMMM + d MMM + d/M + d + mm:ss + mm:ss + y + M/yyyy + E d/M/yyyy + MMM y + EEE d MMM y + LLLL 'del' y + Q yyyy + QQQ y + Q yy + MM/yyyy + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E d 'de' MMM - E d 'de' MMM + E d - E d 'de' MMM + + + LLLL-LLLL + + + d 'de' MMM - d 'de' MMM + d-d 'de' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + H-H + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + H-H v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM 'de' y + MMM 'de' y - MMM 'de' y + + + E d 'de' MMM - E d 'de' MMM 'de' y + E d - E d 'de' MMM 'de' y + E d 'de' MMM 'de' y - E d 'de' MMM 'de' y + + + MM – MM-yyyy + MM-yyyy – MM-yyyy + + + d 'de' MMM - d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y - d 'de' MMM 'de' y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + era + + + any + + + mes + + + setmana + + + dia + fa tres dies + abans d'ahir + ahir + avui + demà + demà passat + d'aquí a tres dies + + + dia de la setmana + + + a.m./p.m. + + + hora + + + minut + + + segon + + + zona + + + + + + +HH:mm;-HH:mm + GMT{0} + Hora de: {0} + {1} ({0}) + + Zona desconeguda + + + Tirana + + + Pol sud + + + Río Gallegos + + + Tucumán + + + Córdoba + + + Viena + + + Brussel·les + + + Eirunepé + + + Río Branco + + + Cuiabá + + + Belém + + + Araguaína + + + São Paulo + + + Maceió + + + Belise + + + Zuric + + + Illa de Pasqua + + + Urumchi + + + Bogotà + + + Cap Verd + + + Pasqua + + + Praga + + + Berlín + + + Copenhaguen + + + Alger + + + Galápagos + + + El Caire + + + Illes Canàries + + + Hèlsinki + + + Fèroe + + + París + + + Londres + + + Granada + + + Guadalupe + + + Atenes + + + Geòrgia del Sud + + + Port Príncep + + + Makasar + + + Dublín + + + Bagdad + + + Teheran + + + Roma + + + Tòquio + + + St. Kitts + + + Seül + + + Caiman + + + Aqtaū + + + Aķtöbe + + + St. Lucia + + + Luxemburg + + + Mònaco + + + Martinica + + + Maurici + + + Les Maldives + + + Mazatlán + + + Mèxic + + + Mérida + + + Numea + + + Katmandú + + + Panamà + + + Tahití + + + Marqueses + + + Varsòvia + + + Açores + + + Lisboa + + + Asunción + + + Reunió + + + Bucarest + + + Moscou + + + Jekaterinburg + + + Krasnoiarsk + + + Jakutsk + + + Kamtxatka + + + Anadyr' + + + Estocolm + + + Singapur + + + Sao Tomé + + + Salvador + + + Damasc + + + Illes Turks i Caicos + + + Tunísia + + + Port Espanya + + + Kíev + + + New Salem, Dakota del Nord + + + Center, Dakota del Nord + + + Nova York + + + Samarcanda + + + Sant Vicenç + + + Sant Tomàs + + + + Hora d'Àfrica Central + + + + + Hora d'Àfrica Oriental + + + + + Hora d'Àfrica Austral + + + + + Hora d'Àfrica Occidental + Hora d'estiu d'Àfrica Occidental + + + + + Hora central + Hora estàndard central + Hora d'estiu central + + + CT + CST + CDT + + + + + Hora oriental + Hora estàndard oriental + Hora d'estiu oriental + + + ET + EST + EDT + + + + + Hora de muntanya + Hora estàndard de muntanya + Hora d'estiu de muntanya + + + MT + MST + MDT + + + + + Hora del Pacífic + Hora estàndard del Pacífic + Hora d'estiu del Pacífic + + + PT + PST + PDT + + + + + Hora d'Aràbia + Hora estàndard d'Aràbia + Hora d'estiu d'Aràbia + + + AT (Aràbia) + AST (Aràbia) + ADT (Aràbia) + + + + + Hora de l'Atlàntic + Hora estàndard de l'Atlàntic + Hora d'estiu de l'Atlàntic + + + AT + AST + ADT + + + + + Hora estàndard de la Xina + + + CST (Xina) + + + + + Hora d'Espanya + Hora Central Europea + Hora Central Europea de l'estiu + + + Hora d'Espanya + CET + CEST + + + + + Hora d'Europa de l'Est + Hora d'estiu d'Europa de l'Est + + + EET + EEST + + + + + Hora d'Europa Occidental + Hora d'estiu d'Europa Occidental + + + WET + WEST + + + + + Hora mitjana de Greenwich + + + GMT + + + + + Hora estàndard de l'Índia + + + + + Hora estàndard d'Israel + Hora d'estiu d'Israel + + + IST (Israel) + + + + + Hora estàndard del Japó + + + + + Hora estàndard de Corea + + + + + Hora de Kujbysev + Hora d'estiu de Kujbysev + + + + + Hora de Moscou + Hora d'estiu de Moscou + + + + + Hora de Samara + Hora d'estiu de Samara + + + + + Hora de Turquia + Hora d'estiu de Turquia + + + + + Hora de Volgograd + Hora d'estiu de Volgograd + + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + pesseta andorrana + pesseta andorrana + pessetes andorranes + + + dirhem dels Emirats Àrabs Units + dirhem dels Emirats Àrabs Units + dirhems dels Emirats Àrabs Units + + + afgani afganès (1927-2002) + afgani afganès (AFA) + afganis afganesos (AFA) + + + afgani afganès + afgani afganès + afganis afganesos + + + lek albanès + lek albanès + lekë albanesos + + + dram armeni + dram armeni + drams armenis + + + florí de les Antilles Neerlandeses + florí de les Antilles Neerlandeses + florins de les Antilles Neerlandeses + + + kwanza angolès + kwanza angolès + kwanzas angolesos + + + kwanza angolès (1977-1990) + kwanza angolès (AOK) + kwanzas angolesos (AOK) + + + nou kwanza angolès (1990-2000) + nou kwanza angolès (AON) + nous kwanzas angolesos (AON) + + + kwanza angolès reajustat (1995-1999) + kwanza angolès reajustat (AOR) + kwanzas angolesos reajustats (AOR) + + + austral argentí + austral argentí + australs argentins + + + peso argentí (1983-1985) + peso argentí (ARP) + pesos argentins (ARP) + + + peso argentí + peso argentí + pesos argentins + + + xíling austríac + xíling austríac + xílings austríacs + + + dòlar australià + dòlar australià + dòlars australians + + + florí d'Aruba + florí d'Aruba + florins d'Aruba + + + manat azerbaidjanès (1993-2006) + manat azerbaidjanès (AZM) + manats azerbaidjanesos (AZM) + + + manat azerbaidjanès + manat azerbaidjanès + manats azerbaidjanesos + + + dinar de Bòsnia i Hercegovina + dinar de Bòsnia i Hercegovina + dinars de Bòsnia i Hercegovina + + + marc convertible de Bòsnia i Hercegovina + marc convertible de Bòsnia i Hercegovina + marcs convertibles de Bòsnia i Hercegovina + + + dòlar de Barbados + dòlar de Barbados + dòlars de Barbados + + + taka de Bangla Desh + taka de Bangla Desh + taka de Bangla Desh + + + franc belga (convertible) + franc belga (convertible) + francs belgues (convertibles) + + + franc belga + franc belga + francs belgues + + + franc belga (financer) + franc belga (financer) + francs belgues (financers) + + + lev fort búlgar + lev fort búlgar + leva forts búlgars + + + lev búlgar + lev búlgar + leva búlgars + + + dinar de Bahrain + dinar de Bahrain + dinars de Bahrain + + + franc de Burundi + franc de Burundi + francs de Burundi + + + dòlar de les Bermudes + dòlar de les Bermudes + dòlars de les Bermudes + + + dòlar de Brunei + dòlar de Brunei + dòlars de Brunei + + + boliviano + boliviano + bolivianos + + + peso bolivià + peso bolivià + pesos bolivians + + + MVDOL bolivià + MVDOL bolivià + MVDOL bolivians + + + cruzeiro novo brasiler (1967-1986) + cruzeiro novo brasiler (BRB) + cruzeiros novos brasilers (BRB) + + + cruzado brasiler + cruzado brasiler + cruzados brasilers + + + cruzeiro brasiler (1990-1993) + cruzeiro brasiler (BRE) + cruzeiros brasilers (BRE) + + + real brasiler + real brasiler + reais brasilers + + + cruzado novo brasiler + cruzado novo brasiler + cruzados novos brasilers + + + cruzeiro brasiler + cruzeiro brasiler + cruzeiros brasilers + + + dòlar de les Bahames + dòlar de les Bahames + dòlars de les Bahames + + + ngultrum de Bhutan + ngultrum de Bhutan + ngultrums de Bhutan + + + kyat birmà + kyat birmà + kyats birmans + + + pula de Botswana + pula de Botswana + pula de Botswana + + + nou ruble bielorús (1994-1999) + nou ruble bielorús (BYB) + nous rubles bielorussos (BYB) + + + ruble bielorús + ruble bielorús + rubles bielorussos + + + dòlar de Belize + dòlar de Belize + dòlars de Belize + + + dòlar canadenc + dòlar canadenc + dòlars canadencs + + + franc congolès + franc congolès + francs congolesos + + + euro WIR + euro WIR + euros WIR + + + franc suís + franc suís + francs suïssos + + + franc WIR + franc WIR + francs WIR + + + unidad de fomento xilena + unidad de fomento xilena + unidades de fomento xilenes + + + peso xilè + peso xilè + pesos xilens + + + iuan renmimbi xinès + iuan xinès + iuan xinesos + + + peso colombià + peso colombià + pesos colombians + + + unidad de valor real colombiana + unidad de valor real colombiana + unidades de valor real colombianes + + + colón costa-riqueny + colón costa-riqueny + colones costa-riquenys + + + dinar serbi antic + dinar serbi antic + dinars serbis antics + + + corona forta txecoslovaca + corona forta txecoslovaca + corones fortes txecoslovaques + + + peso cubà + peso cubà + pesos cubans + + + escut de Cap Verd + escut de Cap Verd + escuts de Cap Verd + + + lliura xipriota + lliura xipriota + lliures xipriotes + + + corona txeca + corona txeca + corones txeques + + + marc de l'Alemanya Oriental + marc de l'Alemanya Oriental + marcs de l'Alemanya Oriental + + + marc alemany + marc alemany + marcs alemanys + + + franc de Djibouti + franc de Djibouti + francs de Djibouti + + + corona danesa + corona danesa + corones daneses + + + peso dominicà + peso dominicà + pesos dominicans + + + dinar algerià + dinar algerià + dinars algerians + + + sucre equatorià + sucre equatorià + sucres equatorians + + + unidad de valor constante (UVC) equatoriana + unidad de valor constante (UVC) equatoriana + unidades de valor constante (UVC) equatorianes + + + corona estoniana + corona estoniana + corones estonianes + + + lliura egípcia + lliura egípcia + lliures egípcies + + + nakfa eritreu + nakfa eritreu + nakfes eritreus + + + pesseta espanyola (compte A) + pesseta espanyola (compte A) + pessetes espanyoles (compte A) + + + pesseta espanyola (compte convertible) + pesseta espanyola (compte convertible) + pessetes espanyoles (compte convertible) + + + ¤ #,##0;-¤ #,##0 + pesseta espanyola + pesseta espanyola + pessetes espanyoles + ₧ + , + . + + + birr etíop + birr etíop + birrs etíops + + + euro + euro + euros + + + marc finlandès + marc finlandès + marcs finlandesos + + + dòlar fijià + dòlar fijià + dòlars fijians + + + lliura de les illes Malvines + lliura de les illes Malvines + lliures de les illes Malvines + + + franc francès + franc francès + francs francesos + + + lliura esterlina britànica + lliura esterlina britànica + lliures esterlines britàniques + + + cupó de lari georgià + cupó de lari georgià + cupons de lari georgians + + + lari georgià + lari georgià + laris georgians + + + cedi ghanès (1979-2007) + cedi ghanès (GHC) + cedis ghanesos (GHC) + + + cedi ghanès + cedi ghanès + cedis ghanesos + + + lliura de Gibraltar + lliura de Gibraltar + lliures de Gibraltar + + + dalasi gambià + dalasi gambià + dalasis gambians + + + franc guineà + franc guineà + francs guineans + + + syli guineà + syli guineà + sylis guineans + + + ekwele de Guinea Equatorial + ekwele de Guinea Equatorial + bipkwele de Guinea Equatorial + + + dracma grega + dracma grega + dracmes gregues + + + quetzal guatemalenc + quetzal guatemalenc + quetzals guatemalencs + + + escut de la Guinea Portuguesa + escut de la Guinea Portuguesa + escuts de la Guinea Portuguesa + + + peso de Guinea Bissau + peso de Guinea Bissau + pesos de Guinea Bissau + + + dòlar de Guyana + dòlar de Guyana + dòlars de Guyana + + + dòlar de Hong Kong + dòlar de Hong Kong + dòlars de Hong Kong + + + lempira hondurenya + lempira hondurenya + lempires hondurenyes + + + dinar croat + dinar croat + dinars croats + + + kuna croata + kuna croata + kunes croates + + + gourde haitià + gourde haitià + gourdes haitians + + + fòrint hongarès + fòrint hongarès + fòrints hongaresos + + + rupia indonèsia + rupia indonèsia + rupies indonèsies + + + lliura irlandesa + lliura irlandesa + lliures irlandeses + + + lliura israeliana + lliura israeliana + lliures israelianes + + + xéquel israelià + xéquel israelià + xéquel israelià + + + nou xéquel israelià + nou xéquel israelià + nous xéquels israelians + + + rupia índia + rupia índia + rupies índies + + + dinar iraquià + dinar iraquià + dinars iraquians + + + rial iranià + rial iranià + rials iranians + + + corona islandesa antiga + corona islandesa antiga + corones islandeses antigues + + + corona islandesa + corona islandesa + corones islandeses + + + lira italiana + lira italiana + lires italianes + + + dòlar jamaicà + dòlar jamaicà + dòlars jamaicans + + + dinar jordà + dinar jordà + dinars jordans + + + ien japonès + ien japonès + iens japonesos + + + xíling kenyà + xíling kenyà + xílings kenyans + + + som kirguís + som kirguís + soms kirguisos + + + riel cambodjà + riel cambodjà + riels cambodjans + + + franc de les Comores + franc de les Comores + francs de les Comores + + + won nord-coreà + won nord-coreà + wons nord-coreans + + + won sud-coreà + won sud-coreà + wons sud-coreans + + + dinar kuwaitià + dinar kuwaitià + dinars kuwaitians + + + dòlar de les illes Caiman + dòlar de les illes Caiman + dòlars de les illes Caiman + + + tenge kazakh + tenge kazakh + tenges kazakhs + + + kip laosià + kip laosià + kips laosians + + + lliura libanesa + lliura libanesa + lliures libaneses + + + rupia de Sri Lanka + rupia de Sri Lanka + rupies de Sri Lanka + + + dòlar liberià + dòlar liberià + dòlars liberians + + + loti de Lesotho + loti de Lesotho + maloti de Lesotho + + + litas lituà + litas lituà + litai lituans + + + talonas lituà + talonas lituà + talonai lituans + + + franc convertible luxemburguès + franc convertible luxemburguès + francs convertibles luxemburguesos + + + franc luxemburguès + franc luxemburguès + francs luxemburguesos + + + franc financer luxemburguès + franc financer luxemburguès + francs financers luxemburguesos + + + lats letó + lats letó + lati letons + + + ruble letó + ruble letó + rubles letons + + + dinar libi + dinar libi + dinars libis + + + dírham marroquí + dírham marroquí + dírhams marroquins + + + franc marroquí + franc marroquí + francs marroquins + + + leu moldau + leu moldau + lei moldaus + + + ariary malgaix + ariary malgaix + ariarys malgaixos + + + franc malgaix + franc malgaix + francs malgaixos + + + denar macedoni + denar macedoni + denari macedonis + + + franc malià + franc malià + francs malians + + + kyat de Myanmar + kyat de Myanmar + kyats de Myanmar + + + tögrög mongol + tögrög mongol + tögrögs mongols + + + pataca de Macau + pataca de Macau + pataques de Macau + + + ouguiya maurità + ouguiya maurità + ouguiyas mauritans + + + lira maltesa + lira maltesa + lires malteses + + + lliura maltesa + lliura maltesa + lliures malteses + + + rupia de Maurici + rupia de Maurici + rupies de Maurici + + + rupia de les Maldives + rupia de les Maldives + rupies de les Maldives + + + kwacha malawià + kwacha malawià + kwachas malawians + + + peso mexicà + peso mexicà + pesos mexicans + + + peso de plata mexicà (1861-1992) + peso de plata mexicà (MXP) + pesos de plata mexicans (MXP) + + + unidad de inversión (UDI) mexicana + unidad de inversión (UDI) mexicana + unidades de inversión (UDI) mexicanes + + + ringgit de Malàisia + ringgit de Malàisia + ringgits de Malàisia + + + escut moçambiquès + escut moçambiquès + escuts moçambiquesos + + + antic metical moçambiquès + antic metical moçambiquès + antics meticals moçambiquesos + + + metical moçambiquès + metical moçambiquès + meticals moçambiquesos + + + dòlar namibià + dòlar namibià + dòlars namibians + + + naira nigerià + naira nigerià + naires nigerians + + + córdoba nicaragüenca + córdoba nicaragüenca + córdobas nicaragüenques + + + córdoba oro nicaragüenca + córdoba oro nicaragüenca + córdobas oro nicaragüenques + + + florí neerlandès + florí neerlandès + florins neerlandesos + + + corona noruega + corona noruega + corones noruegues + + + rupia nepalesa + rupia nepalesa + rupies nepaleses + + + dòlar neozelandès + dòlar neozelandès + dòlars neozelandesos + + + rial omanita + rial omanita + rials omanites + + + balboa panameny + balboa panameny + balboes panamenys + + + inti peruà + inti peruà + intis peruans + + + nou sol peruà + nou sol peruà + nous sols peruans + + + sol peruà + sol peruà + sols peruans + + + kina de Papua Nova Guinea + kina de Papua Nova Guinea + kines de Papua Nova Guinea + + + peso filipí + peso filipí + pesos filipins + + + rupia pakistanesa + rupia pakistanesa + rupies pakistaneses + + + zloty polonès + zloty polonès + zlote polonesos + + + zloty polonès (1950-1995) + zloty polonès (PLZ) + zlote polonesos (PLZ) + + + escut portuguès + escut portuguès + escuts portuguesos + + + guaraní paraguaià + guaraní paraguaià + guaranís paraguaians + + + riyal de Qatar + riyal de Qatar + riyals de Qatar + + + dòlar rhodesià + dòlar rhodesià + dòlars rhodesians + + + antic leu romanès + antic leu romanès + antics lei romanesos + + + leu romanès + leu romanès + lei romanesos + + + dinar serbi + dinar serbi + dinars serbis + + + ruble rus + ruble rus + rubles russos + + + ruble rus (1991-1998) + ruble rus (RUR) + rubles russos (RUR) + + + franc rwandès + franc rwandès + francs rwandesos + + + riyal saudita + riyal saudita + riyals saudites + + + dòlar de les illes Salomó + dòlar de les illes Salomó + dòlars de les illes Salomó + + + rupia de les Seychelles + rupia de les Seychelles + rupies de les Seychelles + + + dinar sudanès + dinar sudanès + dinars sudanesos + + + lliura sudanesa + lliura sudanesa + lliures sudaneses + + + antiga lliura sudanesa + antiga lliura sudanesa + antigues lliures sudaneses + + + corona sueca + corona sueca + corones sueques + + + dòlar de Singapur + dòlar de Singapur + dòlars de Singapur + + + lliura de Santa Helena + lliura de Santa Helena + lliures de Santa Helena + + + tolar eslovè + tolar eslovè + tolars eslovens + + + corona eslovaca + corona eslovaca + corones eslovaques + + + leone de Sierra Leone + leone de Sierra Leone + leones de Sierra Leone + + + xíling somali + xíling somali + xílings somalis + + + dòlar de Surinam + dòlar de Surinam + dòlars de Surinam + + + florí de Surinam + florí de Surinam + florins de Surinam + + + dobra de São Tomé i Príncipe + dobra de São Tomé i Príncipe + dobras de São Tomé i Príncipe + + + ruble soviètic + ruble soviètic + rubles soviètics + + + colón salvadorenc + colón salvadorenc + colones salvadorencs + + + lliura síria + lliura síria + lliures síries + + + lilangeni swazi + lilangeni swazi + emalangeni swazis + + + baht tailandès + baht tailandès + bahts tailandesos + + + ruble tadjik + ruble tadjik + rubles tadjiks + + + somoni tadjik + somoni tadjik + somonis tadjiks + + + manat turcman + manat turcman + manats turcmans + + + dinar tunisià + dinar tunisià + dinars tunisians + + + pa‘anga tongà + pa‘anga tongà + pa‘angas tongans + + + escut de Timor + escut de Timor + escuts de Timor + + + antiga lira turca + antiga lira turca + antigues lires turques + + + lira turca + lira turca + lires turques + + + dòlar de Trinitat i Tobago + dòlar de Trinitat i Tobago + dòlars de Trinitat i Tobago + + + nou dòlar de Taiwan + nou dòlar de Taiwan + nous dòlars de Taiwan + + + xíling tanzà + xíling tanzà + xílings tanzans + + + hrívnia ucraïnesa + hrívnia ucraïnesa + hrívnies ucraïneses + + + karbóvanets ucraïnès + karbóvanets ucraïnès + karbóvantsiv ucraïnesos + + + xíling ugandès (1966-1987) + xíling ugandès (UGS) + xílings ugandesos (UGS) + + + xíling ugandès + xíling ugandès + xílings ugandesos + + + dòlar dels Estats Units + dòlar dels Estats Units + dòlars dels Estats Units + + + dòlar dels Estats Units (dia següent) + dòlar dels Estats Units (dia següent) + dòlars dels Estats Units (dia següent) + + + dòlar dels Estats Units (mateix dia) + dòlar dels Estats Units (mateix dia) + dòlars dels Estats Units (mateix dia) + + + peso uruguaià en unitats indexades + peso uruguaià en unitats indexades + pesos uruguaians en unitats indexades + + + peso uruguaià (1975-1993) + peso uruguaià (UYP) + pesos uruguaians (UYP) + + + peso uruguaià + peso uruguaià + pesos uruguaians + + + som uzbek + som uzbek + soms uzbeks + + + bolívar veneçolà + bolívar veneçolà + bolívars veneçolans + + + bolívar fort veneçolà + bolívar fort veneçolà + bolívars forts veneçolans + + + dong vietnamita + dong vietnamita + dongs vietnamites + + + vatu de Vanuatu + vatu de Vanuatu + vatus de Vanuatu + + + tala samoà + tala samoà + tales samoans + + + franc CFA BEAC + franc CFA BEAC + francs CFA BEAC + + + plata + plata + plata + + + or + or + or + + + unitat compensatòria europea + unitat compensatòria europea + unitats compensatòries europees + + + unitat monetària europea + unitat monetària europea + unitats monetàries europees + + + unitat de compte europea (XBC) + unitat de compte europea (XBC) + unitats de compte europees (XBC) + + + unitat de compte europea (XBD) + unitat de compte europea (XBD) + unitats de compte europees (XBD) + + + dòlar del Carib Oriental + dòlar del Carib Oriental + dòlars del Carib Oriental + + + drets especials de gir + drets especials de gir + drets especials de gir + + + unitat de moneda europea + unitat de moneda europea + unitats de moneda europees + + + franc or francès + franc or francès + francs or francesos + + + franc UIC francès + franc UIC francès + francs UIC francesos + + + franc CFA BCEAO + franc CFA BCEAO + francs CFA BCEAO + + + pal·ladi + pal·ladi + pal·ladi + + + franc CFP + franc CFP + francs CFP + + + platí + platí + platí + + + fons RINET + fons RINET + fons RINET + + + codi reservat per a proves + codi reservat per a proves + codi reservat per a proves + + + moneda desconeguda/no vàlida + moneda desconeguda/no vàlida + monedes desconegudes/no vàlides + + + dinar iemenita + dinar iemenita + dinars iemenites + + + rial iemenita + rial iemenita + rials iemenites + + + dinar fort iugoslau + dinar fort iugoslau + dinars forts iugoslaus + + + nou dinar iugoslau + nou dinar iugoslau + nous dinars iugoslaus + + + dinar convertible iugoslau + dinar convertible iugoslau + dinars convertibles iugoslaus + + + rand sud-africà (financer) + rand sud-africà (financer) + rands sud-africans (financers) + + + rand sud-africà + rand sud-africà + rands sud-africans + + + kwacha zambià + kwacha zambià + kwacha zambians + + + nou zaire zairès + nou zaire zairès + nous zaires zairesos + + + zaire zairès + zaire zairès + zaires zairesos + + + dòlar zimbabuès + dòlar zimbabuès + dòlars zimbabuesos + + + + + + {0} dia + {0} dies + + + {0} hora + {0} hores + + + {0} minut + {0} minuts + + + {0} mes + {0} mesos + + + {0} segon + {0} segons + + + {0} setmana + {0} setmanes + + + {0} any + {0} anys + + + + + sí:s + no:n + + + + diff --git a/lib/zend/Zend/Locale/Data/ca_ES.xml b/lib/zend/Zend/Locale/Data/ca_ES.xml new file mode 100644 index 0000000000..1d9cbd9369 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ca_ES.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/cch.xml b/lib/zend/Zend/Locale/Data/cch.xml new file mode 100644 index 0000000000..6e5221cfa1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/cch.xml @@ -0,0 +1,189 @@ + + + + + + + + + + [a {a\u0331} b c {ch} d {dy} e-g {g\u0331} {gb} {gw} {gy} h {hy} i-k ḵ {kp} {kw} l {ly} m n ṉ {ny} o p {ph} {py} r {ry} s {sh} t-w {wh} y {y\u0331} z ʼ] + + + + + + + + Dyon + Baa + Atat + Anas + Atyo + Achi + Atar + Awur + Shad + Shak + Naba + Nata + + + Pen Dyon + Pen Ba'a + Pen Atat + Pen Anas + Pen Atyon + Pen Achirim + Pen Atariba + Pen Awurr + Pen Shadon + Pen Shakur + Pen Kur Naba + Pen Kur Natat + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Yok + Tung + T. Tung + Tsan + Nas + Nat + Chir + + + Wai Yoka Bawai + Wai Tunga + Toki Gitung + Tsam Kasuwa + Wai Na Nas + Wai Na Tiyon + Wai Na Chirim + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + Gabanin Miladi + Miladi + + + GM + M + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Aman + + + + + diff --git a/lib/zend/Zend/Locale/Data/cch_NG.xml b/lib/zend/Zend/Locale/Data/cch_NG.xml new file mode 100644 index 0000000000..4c81cc0d01 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/cch_NG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/characters.xml b/lib/zend/Zend/Locale/Data/characters.xml new file mode 100644 index 0000000000..8d68b644c3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/characters.xml @@ -0,0 +1,482 @@ + + + + + + + + + + (C) + + + << + + + - + + + (R) + + + >> + + + 1/4 + + + 1/2 + + + 3/4 + + + AE + + + ss + + + ae + + + 'n + + + OE + + + oe + + + Ş + + + ş + + + Ţ + + + ţ + + + - + + + ' + + + " + + + , + + + ' + + + - + + + - + + + - + + + - + + + - + + + - + + + ' + + + ' + + + , + + + ' + + + " + + + " + + + ,, + + + " + + + · + + + · + + + / + + + CE + + + CRC + + + ¢ + + + Cr + + + Fr. + + + L. + + + NGN + + + Pts + + + KRW + + + ILS + + + VND + + + EUR + + + LAK + + + MNT + + + GRD + + + PHP + + + PYG + + + GHS + + + Rx + + + 1/3 + + + 2/3 + + + 1/5 + + + 2/5 + + + 3/5 + + + 4/5 + + + 1/6 + + + 5/6 + + + 1/8 + + + 3/8 + + + 5/8 + + + 7/8 + + + 1/ + + + Π + + + Σ + + + - + + + / + + + \ + + + | + + + || + + + + + + dm² + + + dm³ + + + mm² + + + cm² + + + m² + + + km² + + + mm³ + + + cm³ + + + m³ + + + km³ + + + m/s + + + m/s² + + + rad/s + + + rad/s² + + + CC + + + C/kg + + + pH + + + V/m + + + A/m + + + ſt + + + (( + + + )) + + + ゛ + + + ゜ + + + ㅤ + + + ㄱ + + + ㄲ + + + ㄳ + + + ㄴ + + + ㄵ + + + ㄶ + + + ㄷ + + + ㄸ + + + ㄹ + + + ㄺ + + + ㄻ + + + ㄼ + + + ㄽ + + + ㄾ + + + ㄿ + + + ㅀ + + + ㅁ + + + ㅂ + + + ㅃ + + + ㅄ + + + ㅅ + + + ㅆ + + + ㅇ + + + ㅈ + + + ㅉ + + + ㅊ + + + ㅋ + + + ㅌ + + + ㅍ + + + ㅎ + + + ㅏ + + + ㅐ + + + ㅑ + + + ㅒ + + + ㅓ + + + ㅔ + + + ㅕ + + + ㅖ + + + ㅗ + + + ㅘ + + + ㅙ + + + ㅚ + + + ㅛ + + + ㅜ + + + ㅝ + + + ㅞ + + + ㅟ + + + ㅠ + + + ㅡ + + + ㅢ + + + ㅣ + + + ¯ + + + + diff --git a/lib/zend/Zend/Locale/Data/cop.xml b/lib/zend/Zend/Locale/Data/cop.xml new file mode 100644 index 0000000000..2a32e3ca06 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/cop.xml @@ -0,0 +1,198 @@ + + + + + + + + + + [α-ρ σ ϲ τ-ω ϣ ϥ ϧ ϩ ϫ ϭ ϯ] + + + + + + + + ωογτ + Παοπι + Αθορ + Χοιακ + Τωβι + Μεϣιρ + Παρεμϩατ + Φαρμοθι + Παϣαν + Παωνι + Επηπ + Μεϲωρη + Πικογϫι μαβοτ + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + diff --git a/lib/zend/Zend/Locale/Data/cs.xml b/lib/zend/Zend/Locale/Data/cs.xml new file mode 100644 index 0000000000..09d7bca0f5 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/cs.xml @@ -0,0 +1,2440 @@ + + + + + + + + + + + afarština + abcházština + acehština + ačoli + adangme + adygejština + avestánština + afrikánština + afroasijské jazyky (jiné) + afrihili + ainština + akanština + akkadština + aleutština + algonkinské jazyky (jiné) + amharština + aragonština + staroangličtina + angika + apačské jazyky + arabština + aramejština + araukánština + arapažština + umělé jazyky (jiné) + arawacké jazyky + assaméština + athapaskánské jazyky + australské jazyky + avarština + awadhština + aymárština + azerbajdžánština + baskirština + banda + bamileke (jiné) + balúčština + balijština + basa + baltské jazyky (jiné) + běloruština + bedža + bembštiva + berberské jazyky (jiné) + bulharština + biharština + bhojpurština + bislámština + bikolština + bini + siksika + bambarština + bengálština + bantuské jazyky (jiné) + tibetština + bretaňština + bradžština + bosenština + batačtina + burjatština + bugiština + katalánština + caddo + středoamerické indiánské jazyky (jiné) + karibština + kavkazské jazyky (jiné) + čečenština + cebuánština + keltské jazyky (jiné) + čamoro + čibča + čagatajština + čukština + marijština + činuk pidžin + choctawština + chipewyan + cherokee + čejenština + čamština + korsičtina + koptština + kreolština a jiné pidginy na základě angličtiny + kreolština a jiné pidginy na základě francouzštiny + kreolština a jiné pidginy na základě portugalštiny + krí + krymská turečtina + kreolština a jiné pidginy + čeština + staroslověnština + kúšitské jazyky (jiné) + čuvašština + velština + dánština + dakotština + dajáčtina + němčina + německy (Rakousko) + delaware + slave + dogrib + dinkština + dórgí + drávidské jazyky (jiné) + dualština + středoholandština + divehi + djula + bhútánština + eweština + efik + egyptština stará + ekajuk + řečtina + elamitština + angličtina + anglicky (Kanada) + angličtina (USA) + středoangličtina + esperanto + španělština + estonština + baskičtina + ewondo + perština + fang + fantština + fulahština + finština + tagalogština + ugrofinské jazyky (jiné) + fidži + faerština + francouzština + francouzsky (Kanada) + středofrancouzština + starofrancouzština + furlandština + fríština + irština + ga + gayo + gbaja + skotská galština + germánské jazyky (jiné) + geez + kiribatština + haličština + hornoněmčina stará + guaranština + stará hornoněmčina + góndština + gorontalo + gótština + grebo + starořečtina + gujaratština + manština + gwichʼin + hausa + haida + havajský + hebrejština + hindština + hiligayonština + himáčalština + chetitština + hmongština + hiri motu + chorvatština + maďarština + hupa + arménština + herero + interlingua + iban + indonéština + interlingue + igboština + idžo + inupiakština + ilokánština + indické jazyky (jiné) + indoevropské jazyky (jiné) + inguština + íránské jazyky (jiné) + irokézské jazyky (jiné) + islandština + italština + inuktitutština + japonština + javánština + gruzínština + karakalpačtina + kabylština + kačijština + kambština + karenština + kawi + kabardinština + konžština + khásí + khoisanské jazyky (jiné) + chotánština + kikujština + kuaňamština + kazachština + grónština + kambodžština + kimbundština + kannadština + korejština + kónkánština + kosrajština + kpelle + kanuri + kru + krukukhština + kašmírština + kurdština + kumyčtina + kutenai + komijština + kornština + kirgizština + latina + ladinština + lahndština + lambština + Lucemburština + lezginština + ganda + lingalština + laoština + mongština + lozština + litevština + lubu-katanžština + luba-luluaština + luiseňo + lundština + luoština + lišáí + lotyština + madurština + magadhiština + maithiliština + makasarština + mandingština + austronéské jazyky (jiné) + masajština + mandar + mende + malgaština + středoirština + maršálština + maorština + micmac + minangkabau + různé jazyky + makedonština + mon-khmerské jazyky (jiné) + malabarština + mongolština + mandžuština + manipurština + manobo jazyky + moldavština + mohawk + mosi + marathi + malajština + maltština + více jazyků + mundské jazyky (jiné) + muskogee (creek) + márvárština + barmština + mayské jazyky + nauru + nahuatl + severoamerické indiánské jazyky (jiné) + neapolština + norština (Bokmål) + ndebele (Zimbabwe) + dolnoněmčina + nepálština + névárština + ndondština + nias + nigero-kordofánské jazyky (jiné) + niue + nizozemština + norština (nynorsk) + norština + norština historická + ndebele (Jižní Afrika) + severní sotho + núbijské jazyky + navažština + ňandžština + ňamwežština + nyakolština + nyorština + nzima + occitan + odžibvejština + Oromo (Afan) + oriya + osetština + osage + osmanská turečtina + otomijské jazyky + paňdžábština + papuánské jazyky (jiné) + pangasinan + pahlaví + papangau + papiamento + palauština + staroperština + filipínské jazyky (jiné) + féničtina + pálí + polština + pohnpeiština + prákritské jazyky + provensálština + Pashto (Pushto) + portugalština + kečuánština + rádžastánština + rapanuiština + rarotongaština + rétorománština + kirundi + rumunština + románské jazyky (jiné) + romština + ruština + kinyarwandština + sanskrt + sandawština + jakutština + jihoamerické indiánské jazyky (jiné) + salishské jazyky + samarština + sasakština + santálí + sardština + skotština + sindhi + selkupština + semitské jazyky (jiné) + sangho + staroirština + znakové jazyky + srbochorvatština + šanština + sinhálština + sidamo + siouxské jazyky + tibetočínské jazyky (jiné) + slovenština + slovinština + slovanský jazyk + samoyština + sami jazyky + shona + sonikština + somálština + sogdština + songhajština + albánština + srbština + serer + siswatština + nilo-saharské jazyky (jiné) + sesotho + sundanština + sukuma + susu + sumerský + švédština + svahilština + syrština + tamilština + thajské jazyky (jiné) + telugština + temne + tereno + tetumština + tádžičtina + thajština + tigrinijština + tigrejština + tivština + turkmenština + tokelauština + tagalog + klingonština + tlingit + tamašek + setswanština + tonga + tok pisin + turečtina + tsonga + tsimshijské jazyky + tatarština + tumbukština + altajské jazyky (jiné) + tuvalština + twi + tahitština + tuvinština + udmurtština + uighurština + ugaritština + ukrajinština + umbundu + neznámý nebo neplatný jazyk + urdština + uzbečtina + vai + vendština + vietnamština + volapuk + votiatština + valonština + wakashské jazyky + walamština + waray + washo + lužickosrbské jazyky + wolof + kalmyčtina + xhosa + jaoština + yapese + jidiš + yoruba + yupik + zhuang + zapotéčtina + zenaga + čínština + čínština (zjednodušená) + čínština (tradiční) + zandština + zulu + zunijština + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Svět + Afrika + 003 + Jižní Amerika + Oceánie + Západní Afrika + Střední Amerika + Východní Afrika + Severní Afrika + Střední Afrika + Jižní Afrika + Amerika + Severní Amerika + Karibik + Východní Asie + Jižní Asie + Jihovýchodní Asie + Jižní Evropa + Austrálie a Nový Zéland + Melanésie + Mikronésie + Polynésie + Jižní a centrální Asie + Asie + Střední Asie + Západní Asie + Evropa + Východní Evropa + Severní Evropa + Západní Evropa + Společenství nezávislých států + Československo + Latinská Amerika a Karibské moře + Normanské ostrovy + Andorra + Spojené arabské emiráty + Afghánistán + Antigua a Barbuda + Anguila + Albánie + Arménie + Nizozemské Antily + Angola + Antarktida + Argentina + Americká Samoa + Rakousko + Austrálie + Aruba + Alandy + Ázerbájdžán + Bosna a Hercegovina + Barbados + Bangladéš + Belgie + Burkina Faso + Bulharsko + Bahrajn + Burundi + Benin + Svatý Bartoloměj + Bermudy + Brunej Darussalam + Bolívie + Brazílie + Bahamy + Bhútán + Ostrov Bouvet + Botswana + Bělorusko + Belize + Kanada + Kokosové ostrovy + Demokratická republika Kongo + Středoafrická republika + Kongo + Švýcarsko + Pobřeží slonoviny + Cookovy ostrovy + Chile + Kamerun + Čína + Kolumbie + Kostarika + Srbsko a Černá Hora + Kuba + Kapverdy + Vánoční ostrovy + Kypr + Česká republika + Německo + Džibuti + Dánsko + Dominika + Dominikánská republika + Alžírsko + Ekvádor + Estonsko + Egypt + Západní Sahara + Eritrea + Španělsko + Etiopie + Finsko + Fidži + Falklandské ostrovy + Mikronézie + Faerské ostrovy + Francie + Gabon + Velká Británie + Grenada + Gruzie + Francouzská Guyana + Guernsey + Ghana + Gibraltar + Grónsko + Gambie + Guinea + Guadeloupe + Rovníková Guinea + Řecko + Jižní Georgie a Jižní Sandwichovy ostrovy + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong, zvláštní administrativní oblast Číny + Ostrovy Heard a McDonald + Honduras + Chorvatsko + Haiti + Maďarsko + Indonésie + Irsko + Izrael + Ostrov Man + Indie + Britské území v Indickém oceánu + Irák + Írán + Island + Itálie + Jersey + Jamajka + Jordánsko + Japonsko + Keňa + Kyrgyzstán + Kambodža + Kiribati + Komory + Svatý Kitts a Nevis + Severní Korea + Jižní Korea + Kuvajt + Kajmanské ostrovy + Kazachstán + Lidově demokratická republika Laos + Libanon + Svatá Lucie + Lichtenštejnsko + Srí Lanka + Libérie + Lesotho + Litva + Lucembursko + Lotyšsko + Libye + Maroko + Monako + Moldavsko, republika + Černá Hora + Svatý Martin + Madagaskar + Marshallovy ostrovy + Macedonia + Mali + Myanmar + Mongolsko + Zvláštní administrativní oblast Číny Macao + Severní Mariany + Martinik + Mauritánie + Montserrat + Malta + Mauricius + Maladivy + Malawi + Mexiko + Malajsie + Mosambik + Namibie + Nová Kaledonie + Niger + Norfolk + Nigérie + Nikaragua + Nizozemsko + Norsko + Nepál + Nauru + Niue + Nový Zéland + Omán + Panama + Peru + Francouzská Polynésie + Papua-Nová Guinea + Filipíny + Pákistán + Polsko + Svatý Pierre a Miquelon + Pitcairn + Portoriko + Palestinian Territory + Portugalsko + Palau + Paraguay + Katar + Vnější Oceánie + Evropská unie + Réunion + Rumunsko + Srbsko + Rusko + Rwanda + Saúdská Arábie + Šalamounovy ostrovy + Seychely + Súdán + Švédsko + Singapur + Svatá Helena + Slovinsko + Svalbard a Jan Mayen + Slovensko + Sierra Leone + San Marino + Senegal + Somálsko + Surinam + Svatý Tomáš + El Salvador + Sýrie + Svazijsko + Ostrovy Caicos a Turks + Čad + Francouzská jižní teritoria + Togo + Thajsko + Tádžikistán + Tokelau + Východní Timor + Turkmenistán + Tunisko + Tonga + Turecko + Trinidad a Tobago + Tuvalu + Tchaj-wan + Tanzanie + Ukrajina + Uganda + Menší odlehlé ostrovy USA + Spojené státy + Uruguay + Uzbekistán + Svatý stolec + Svatý Vincent a Grenadiny + Venezuela + Britské Panenské ostrovy + Americké Panenské ostrovy + Vietnam + Vanuatu + Wallis a Futuna + Samoa + Jemen + Mayotte + Jihoafrická republika + Zambie + Zimbabwe + Neznámá nebo neplatná oblast + + + Kalendář + Třídění + Měna + + + Buddhistický kalendář + Čínský kalendář + Gregoriánský kalendář + Hebrejský kalendář + Indický národní kalendář + Muslimský kalendář + Muslimský občanský kalendář + Japonský kalendář + + + USA + Metrický + + + Jazyk: {0} + Skript: {0} + Region: {0} + + + + titlecase-firstword + lowercase-words + + + [a á b c č d ď e é ě f-h {ch} i í j-n ň o ó p-r ř s š t ť u ú ů v-y ý z ž] + + + „ + “ + ‚ + ‘ + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + ledna + února + března + dubna + května + června + července + srpna + září + října + listopadu + prosince + + + + + 1. + 2. + 3. + 4. + 5. + 6. + 7. + 8. + 9. + 10. + 11. + 12. + + + l + ú + b + d + k + č + č + s + z + ř + l + p + + + leden + únor + březen + duben + květen + červen + červenec + srpen + září + říjen + listopad + prosinec + + + + + + + ne + po + út + st + čt + pá + so + + + neděle + pondělí + úterý + středa + čtvrtek + pátek + sobota + + + + + N + P + Ú + S + Č + P + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1. čtvrtletí + 2. čtvrtletí + 3. čtvrtletí + 4. čtvrtletí + + + + + 1 + 2 + 3 + 4 + + + + dop. + odp. + + + př.Kr. + po Kr. + + + + + + EEEE, d. MMMM y + + + + + d. MMMM y + + + + + d.M.yyyy + + + + + d.M.yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + H + HH:mm + HH:mm:ss + d. MMMM + d.M + mm:ss + Q yy + y + M.yyyy + MMMM y + + + {0} - {1} + + M.-M. + + + E, d.M. - E, d.M. + E, d.M. - E, d.M. + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. - E, d. MMM + + + LLLL-LLLL + + + d. MMM - d. MMM + d.-d. MMM + + + d.M. - d.M. + d.M. - d.M. + + + d.-d. + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + M.yy - M.yy + M.yy - M.yy + + + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + + + MMM-MMM y + MMM y - MMM y + + + E, d. MMM - E, d. MMM y + E, d. - E, d. MMM y + E, d. MMM y - E, d. MMM y + + + LLLL-LLLL y + LLLL y - LLLL y + + + d. MMM - d. MMM y + d.-d. MMM y + d. MMM y - d. MMM y + + + d.M.yy - d.M.yy + d.M.yy - d.M.yy + d.M.yy - d.M.yy + + + + + + Epocha + + + Rok + + + Měsíc + + + Týden + + + Den + Předevčírem + Včera + Dnes + Zítra + Pozítří + + + Den v týdnu + + + Část dne + + + Hodina + + + Minuta + + + Sekunda + + + Pásmo + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Není známo + + + Dubaj + + + Kábul + + + Tirana + + + Jerevan + + + Jižní pól + + + Dumont D'Urville + + + Kordoba + + + Vídeň + + + Dháka + + + Brusel + + + Sofie + + + Bahrajn + + + Bermudy + + + Brunej + + + Belém + + + Bahía + + + St. Johns + + + Curych + + + Velikonoční ostrov + + + Kašghar + + + Urumči + + + Čchung-čching + + + Šanghaj + + + Charbin + + + Kostarika + + + Kapverdy + + + Vánoční ostrov + + + Lefkosía + + + Berlín + + + Džibuti + + + Kodaň + + + Alžír + + + Galapágy + + + Káhira + + + Kanárské ostrovy + + + Fidži + + + Paříž + + + Londýn + + + Atény + + + Jižní Georgia + + + Budapešť + + + Jeruzalém + + + Bagdád + + + Teherán + + + Reykjavík + + + Řím + + + Jamajka + + + Ammán + + + Tokio + + + Biškek + + + Phnompenh + + + St. Kitts + + + Pchjongjang + + + Soul + + + Kuvajt + + + Bejrút + + + St. Lucia + + + Lucembursko + + + Tripolis + + + Rangún + + + Ulánbátar + + + Martinik + + + Mauricius + + + Maledivy + + + Tichuana + + + Cancún + + + Karáčí + + + Varšava + + + Portoriko + + + Azorské ostrovy + + + Lisabon + + + Katar + + + Bukurešť + + + Moskva + + + Jekatěrinburg + + + Krasnojarsk + + + Jakutsk + + + Sachalin + + + Kamčatka + + + Rijád + + + Chartúm + + + Singapur + + + Sv. Helena + + + Mogadišo + + + Svatý Tomáš + + + Salvador + + + Damašek + + + Dušanbe + + + Ašgabad + + + Užhorod + + + Kyjev + + + Záporoží + + + Aljašský čas + + + Taškent + + + St. Vincent + + + St. Thomas + + + + Aljašský standardní čas + Aljašský letní čas + + + + + Centrální standardní čas + Centrální letní čas + + + + + Východní standardní čas + Východní letní čas + + + + + Horský standardní čas + Horský letní čas + + + + + Pacifický standardní čas + Pacifický letní čas + + + + + Atlantický standardní čas + Atlantický letní čas + + + + + Čínský standardní čas + + + + + Středoevropský standardní čas + Středoevropský letní čas + + + + + Východoevropský standardní čas + Východoevropský letní čas + + + + + Greenwichský střední čas + + + + + Izraelský standardní čas + Izraelský letní čas + + + + + Japonský standardní čas + Japonský letní čas + + + + + Newfoundlandský standardní čas + Newfoundlandský letní čas + + + + + + + , +   + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + + + + Peseta andorrská + + + Dirham SAE + + + Afghán (1927-2002) + + + Afghán + + + Lek + + + Dram arménský + + + Zlatý Nizozemských Antil + + + Kwanza + + + Kwanza (1977-1990) + + + Kwanza nová (1990-2000) + + + Kwanza reajustado (1995-1999) + + + Austral + + + Peso argentinské (1983-1985) + + + Peso argentinské + + + Šilink + + + Dolar australský + + + Zlatý arubský + + + Manat ázerbajdžánský + + + Dinár Bosny a Hercegoviny + + + Marka konvertibilní + + + Dolar barbadoský + + + Taka + + + Frank konvertibilní belgický + + + Frank belgický + + + Frank finanční belgický + + + Lev + + + Lev Bulharský + + + Dinár bahrajnský + + + Frank burundský + + + Dolar bermudský + + + Dolar brunejský + + + Boliviano + + + Peso + + + Mvdol + + + Cruzeiro (1967-1986) + + + Cruzado + + + Cruzeiro (1990-1993) + + + Real brazilský + + + Cruzado nové + + + Cruzeiro real + + + Dolar bahamský + + + Ngultrum + + + Kyat barmský + + + Pula + + + Rubl nový běloruský (1994-1999) + + + Rubl běloruský + + + Dolar belizský + + + Dolar kanadský + + + Frank konžský + + + Frank švýcarský + + + Unidades de fomento + + + Peso chilské + + + Juan renminbi + + + Peso kolumbijské + + + Colón kostarický + + + Koruna československá + + + Peso kubánské + + + Escudo kapverdské + + + Libra kyperská + + + Koruna česká + + + Marka NDR + + + Marka německá + + + Frank džibutský + + + Koruna dánská + + + Peso dominikánské + + + Dinár alžírský + + + Sucre ekvádorský + + + Ecuador Unidad de Valor Constante (UVC) + + + Kroon + + + Libra egyptská + + + Nakfa + + + Peseta španělská („A“ účet) + + + Konvertibilní pesetové účty + + + Peseta španělská + + + Birr etiopský + + + Euro + + + Markka + + + Dolar fidžijský + + + Libra falklandská + + + Frank francouzský + + + Libra šterlinků + + + Georgian Kupon Larit + + + Lari + + + Cedi + + + Libra gibraltarská + + + Dalasi + + + Frank guinejský + + + Guinea Syli + + + Equatorial Guinea Ekwele Guineana + + + Drachma + + + Quetzal + + + Escudo guinejské + + + Peso Guinnea-Bissau + + + Dolar guyanský + + + Dolar hongkongský + + + Lempira + + + Dinar chorvatský + + + Kuna chorvatská + + + Gourde + + + Forint + + + Rupie indonézská + + + Libra irská + + + Libra izraelská + + + Šekel nový izraelský + + + Rupie indická + + + Dinár irácký + + + Rijál íránský + + + Koruna islandská + + + Lira italská + + + Dolar jamajský + + + Dinár jordánský + + + Jen + + + Šilink keňský + + + Som + + + Riel + + + Frank komorský + + + Won severokorejský + + + Won jihokorejský + + + Dinár kuvajtský + + + Dolar Kajmanských ostrovů + + + Tenge + + + Kip + + + Libra libanonská + + + Rupie srílanská + + + Dolar liberijský + + + Loti + + + Litus litevský + + + Talon + + + Frank konvertibilní lucemburský + + + Frank lucemburský + + + Frank finanční lucemburský + + + Lat lotyšský + + + Rubl lotyšský + + + Dinár lybijský + + + Dirham marocký + + + Frank marocký + + + Leu moldavský + + + Ariary madagaskarský + + + Frank madagaskarský + + + Denár + + + Frank malijský + + + Kyat + + + Tugrik + + + Pataca + + + Ouguiya + + + Lira maltská + + + Libra maltská + + + Rupie mauricijská + + + Rufiyaa + + + Kwacha malawská + + + Peso mexické + + + Peso stříbrné mexické (1861-1992) + + + Mexican Unidad de Inversion (UDI) + + + Ringgit malajskijský + + + Escudo Mosambiku + + + Metical + + + Dolar namibijský + + + Naira + + + Cordoba + + + Cordoba oro + + + Zlatý holandský + + + Koruna norská + + + Rupie nepálská + + + Dolar novozélandský + + + Rijál ománský + + + Balboa + + + Inti + + + Nuevo sol + + + Sol + + + Kina + + + Peso filipínské + + + Rupie pákistánská + + + Zlotý + + + Zlotý (1950-1995) + + + Escudo portugalské + + + Guarani + + + Rijál katarský + + + Lei + + + Leu rumunské + + + Dinár srbský + + + Rubl ruský + + + Rubl ruský (1991-1998) + + + Frank rwandský + + + Rijál saudský + + + Dolar Šalamounových ostrovů + + + Rupie seychelská + + + Dinár súdánský + + + Libra súdánská + + + Koruna švédská + + + Dolar singapurský + + + Libra Svaté Heleny + + + Tolar + + + Koruna slovenská + + + Leone + + + Šilink somálský + + + Zlatý surinamský + + + Dobra + + + Rubl + + + Colon salvadorský + + + Libra syrská + + + Lilangeni + + + Baht + + + Tajikistan Ruble + + + Somoni + + + Manat + + + Dinár tuniský + + + Paʻanga + + + Escudo timorské + + + Lira turecká + + + Lira nová turecká + + + Dolar Trinidad a Tobago + + + Dolar tchajvanský nový + + + Šilink tanzanský + + + Hřivna + + + Karbovanec + + + Šilink ugandský (1966-1987) + + + Šilink ugandský + + + Dolar americký + + + Dolar americký (příští den) + + + Dolar americký (týž den) + + + Peso uruguayské (1975-1993) + + + Peso uruguayské + + + Sum uzbecký + + + Bolivar + + + Dong vietnamský + + + Vatu + + + Tala + + + Frank BEAC/CFA + + + Stříbro + + + Zlato + + + Evropská smíšená jednotka + + + Evropská peněžní jednotka + + + Evropská jednotka účtu 9 (XBC) + + + Evropská jednotka účtu 17 (XBD) + + + Dolar východokaribský + + + SDR + + + Evropská měnová jednotka + + + Frank zlatý + + + Frank UIC + + + Frank BCEAO/CFA + + + Paladium + + + Frank CFP + + + Platina + + + Kód fondů RINET + + + Kódy zvlášť vyhrazené pro testovací účely + + + Neznámá nebo neplatná měna + + + Dinár jemenský + + + Rijál jemenský + + + Dinár jugoslávský nový [YUD] + + + Dinár jugoslávský nový [YUM] + + + Dinár jugoslávský konvertibilní + + + Rand finanční + + + Rand + + + Kwacha zambijská + + + Zaire nový + + + Zaire + + + Dolar zimbabwský + + + + + + {0} dny + {0} den + {0} dní + + + {0} hodiny + {0} hodina + {0} hodin + + + {0} minuty + {0} minuta + {0} minut + + + {0} měsíce + {0} měsíc + {0} měsíců + + + {0} sekundy + {0} sekunda + {0} sekund + + + {0} týdny + {0} týden + {0} týdnů + + + {0} roky + {0} rok + {0} let + + + + + ano:a + ne:n + + + + diff --git a/lib/zend/Zend/Locale/Data/cs_CZ.xml b/lib/zend/Zend/Locale/Data/cs_CZ.xml new file mode 100644 index 0000000000..96294e377d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/cs_CZ.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/cy.xml b/lib/zend/Zend/Locale/Data/cy.xml new file mode 100644 index 0000000000..b33f784566 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/cy.xml @@ -0,0 +1,783 @@ + + + + + + + + + + + Affricaneg + Amhareg + Arabeg + Asameg + Azerbaijani + Belarwsiyn + Bwlgareg + Bihari + Bengali; Bangla + Llydaweg + Bosnieg + Catalaneg + Tsiec + Cymraeg + Daneg + Almaeneg + Groeg + Saesneg + Esperanto + Sbaeneg + Estoneg + Basgeg + Persieg + Ffineg + Tagalog + Ffaroeg + Ffrangeg + Ffrisieg + Gwyddeleg + Gaeleg yr Alban + Galiseg + Guarani + Gwjarati + Hebraeg + Hindi + Croateg + Hwngareg + Armeneg + Interlingua + Indonesieg + Interlingue + Islandeg + Eidaleg + Siapaneeg + Jafanaeg + Georgeg + Cambodieg + Kannada + Corëeg + Cwrdeg + Kyrgyz + Lladin + Lingala + Laoeg + Lithwaneg + Latfieg + Macedoneg + Malayalam + Mongoleg + Marathi + Malai + Malteseg + Nepali + Iseldireg + Norwyeg (Nynorsk) + Norwyeg + Ocsitaneg + Oriya + Pwnjabi + Pwyleg + Pashto + Portiwgaleg + Rwmaneg + Rwsieg + Sansgrit + Sindhi + Serbo-Croateg + Sinhaleg + Slofaceg + Slofeneg + Somaleg + Albaneg + Serbeg + Sesotheg + Sundaneg + Swedeg + Swahili + Tamil + Telugu + Tai + Tigrinya + Tyrcmeneg + Klingon + Twrceg + Twi + Uighur + Wcreineg + anh + Urdu + Wsbeceg + Fietnameg + Xhosa + Iddew-Almaeneg + Tseineeg + Zwlw + + + + + + Y Byd + Affrica + De America + Oceania + Gorllewin Affrica + Canolbarth America + Dwyrain Affrica + Gogledd Affrica + Canol Affrica + De Affrica [018] + Americas + Gogledd America + Y Caribî + Dwyrain Asia + De ddwyrain Asia + De Ewrop + Awstralia a Seland Newydd + Melanesia + Micronesia [057] + Polynesia + De Canol Asia + Asia + Gorllewin Asia + Ewrop + Dwyrain Ewrop + Gogledd Ewrop + Gorllewin Ewrop + Ynysoedd y Sianel + Andorra + Emiraethau Arabaidd Unedig + Affganistan + Antigwa a Barbuda + Anguilla + Albania + Armenia + Ynysoedd Caribî yr Iseldiroedd + Angola + Antarctica + Yr Ariannin + Samoa Americanaidd + Awstria + Awstralia + Aruba + Ynysoedd Aland + Azerbaijan + Bosnia a Herzegovina + Barbados + Bangladesh + Gwlad Belg + Burkina Faso + Bwlgaria + Bahrain + Burundi + Benin + Bermwda + Brunei + Bolifia + Brasil + Y Bahamas + Bhwtan + Ynys Bouvet + Botswana + Belarws + Belize + Canada + Ynysoedd Cocos (Keeling) + Gweriniaeth Ddemocrataidd y Congo + Gweriniaeth Canol Affrica + Congo + Y Swistir + Côte d’Ivoire + Ynysoedd Cook + Chile + Y Camerŵn + Tseina + Colombia + Costa Rica + Ciwba + Cape Verde + Ynys y Nadolig + Cyprus + Gweriniaeth Tsiec + Yr Almaen + Djibouti + Denmarc + Dominica + Y Weriniaeth Ddominicaidd + Algeria + Ecwador + Estonia + Yr Aifft + Gorllewin Sahara + Eritrea + Sbaen + Ethiopia + Y Ffindir + Fiji + Ynysoedd y Falkland + Micronesia + Ynysoedd Ffaröe + Ffrainc + Gabon + Prydain Fawr + Grenada + Georgia + Giana Ffrengig + Ghana + Gibraltar + Yr Ynys Las + Gambia + Gini + Guadeloupe + Gini Gyhydeddol + Gwlad Groeg + Ynysoedd De Georgia a De Sandwich + Guatemala + Guam + Guinea-Bissau + Guyana + Hong Kong S.A.R., Tseina + Ynys Heard ac Ynysoedd McDonald + Hondwras + Croatia + Haiti + Hwngari + Indonesia + Iwerddon + Israel + Ynys Manaw + India + Tiriogaeth Cefnfor India Prydain + Irac + Iran + Gwlad yr Iâ + Yr Eidal + Jamaica + Yr Iorddonen + Siapan + Cenia + Cirgistan + Cambodia + Kiribati + Comoros + Saint Kitts a Nevis + Gogledd Corea + De Corea + Coweit + Ynysoedd Cayman + Kazakhstan + Laos + Libanus + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lithwania + Lwcsembwrg + Latfia + Libia + Moroco + Monaco + Moldofa + Madagascar + Ynysoedd Marshall + Macedonia + Mali + Myanmar + Mongolia + Macao S.A.R., Tseina + Ynysoedd Gogledd Mariana + Martinique + Mawritania + Montserrat + Malta + Mawrisiws + Maldives + Malawi + Mecsico + Malaysia + Mozambique + Namibia + Caledonia Newydd + Niger + Ynys Norfolk + Nigeria + Nicaragwa + Yr Iseldiroedd + Norwy + Nepal + Nawrw + Niue + Seland Newydd + Oman + Panama + Perw + Polynesia Ffrainc + Papua Gini Newydd + Philipinau + Pacistan + Gwlad Pwyl + Saint Pierre a Miquelon + Pitcairn + Puerto Rico + Tiriogaeth Palesteina + Portiwgal + Palau + Paraguay + Qatar + Ynysoedd Pellenig y De + Réunion + Rwmania + Rwsia + Rwanda + Sawdi-Arabia + Ynysoedd Solomon + Seychelles + Y Swdan + Sweden + Singapore + Saint Helena + Slofenia + Svalbard a Jan Mayen + Slofacia + Sierra Leone + San Marino + Senegal + Somalia + Swrinam + Sao Tome a Principe + El Salfador + Syria + Swaziland + Ynysoedd Turks a Caicos + Chad + Tiriogaethau Ffrengig y De + Togo + Gwlad Thai + Tajicistan + Tokelau + Timor-Leste + Tyrcmenistan + Tiwnisia + Tonga + Twrci + Trinidad a Thobago + Twfalw + Taiwan + Tansanïa + Wcráin + Uganda + Mân Ynysoedd Pellenig yr Unol Daleithiau + Yr Unol Daleithiau + Uruguay + Wsbecistan + Y Fatican + Saint Vincent a’r Grenadines + Venezuela + Ynysoedd Prydeinig y Wyryf + Ynysoedd Americanaidd y Wyryf + Fietnam + Vanuatu + Wallis a Futuna + Samoa + Yemen + Mayotte + De Affrica + Sambia + Simbabwe + + + UD + Metrig + + + + [a á à â ä b c {ch} d {dd} e é è ê ë f {ff} g-i í ì î ï l {ll} m n {ng} o ó ò ô ö p {ph} r {rh} s t {th} u ú ù û ü w ẃ ẁ ŵ ẅ y ý ỳ ŷ ÿ] + [j k q v x z] + + + ‘ + ’ + “ + ” + + + + + + + + Ion + Chwef + Mawrth + Ebrill + Mai + Meh + Gorff + Awst + Medi + Hyd + Tach + Rhag + + + Ionawr + Chwefror + Mawrth + Ebrill + Mai + Mehefin + Gorffenaf + Awst + Medi + Hydref + Tachwedd + Rhagfyr + + + + + Chwe + Maw + Ebr + Gor + + + I + C + M + E + M + M + G + A + M + H + T + R + + + Gorffennaf + + + + + + + Sul + Llun + Maw + Mer + Iau + Gwen + Sad + + + Dydd Sul + Dydd Llun + Dydd Mawrth + Dydd Mercher + Dydd Iau + Dydd Gwener + Dydd Sadwrn + + + + + Gwe + + + S + L + M + M + I + G + S + + + + + + + Ch1 + Ch2 + Ch3 + Ch4 + + + Chwarter 1af + 2il chwarter + 3ydd chwarter + 4ydd chwarter + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Cyn Crist + Oed Crist + + + CC + OC + + + C + O + + + + + + EEEE, dd MMMM y + + + + + dd MMMM y + + + + + d MMM y + + + + + dd/MM/yyyy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + HH:mm + HH:mm:ss + dd MMMM + dd/MM + d/M + hh:mm a + hh:mm:ss a + yy-MM-dd + Q yy + QQQQ yy + MM/yyyy + MMMM y + + + {0} – {1} + + M-M + + + E, d/M – E, d/M + E, d/M – E, d/M + + + MMM-MMM + + + E, d MMM – E, d MMM + E, d MMM – E, d MMM + + + LLLL-LLLL + + + d MMM – d MMM + MMM d–d + + + d/M – d/M + d/M – d/M + + + d-d + + + h a – h a + h–h a + + + h:mm a – h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + h:mm a – h:mm a v + h:mm–h:mm a v + h:mm–h:mm a v + + + h a – h a v + h–h a v + + + y-y + + + M/yy – M/yy + M/yy – M/yy + + + E, d/M/yy - E, d/M/yy + E, d/M/yy - E, d/M/yy + E, d/M/yy - E, d/M/yy + + + MMM - MMM, y + MMM y - MMM y + + + E, d MMM - E, d MMM, y + E, d MMM - E, d MMM, y + E, d MMM, y - E, d MMM, y + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + d MMM - d MMM, y + d-d MMM, y + d MMM, y - d MMM, y + + + d/M/yy - d/M/yy + d/M/yy - d/M/yy + d/M/yy - d/M/yy + + + + + + Oes + + + Blwyddyn + + + Mis + + + Wythnos + + + Dydd + Dridiau yn ôl + Echdoe + Drennydd + Ymhen tridiau + + + Dydd o'r Wythnos + + + AM/PM + + + Awr + + + Munud + + + Eiliad + + + Cylchfa + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + Pegwn y De + + + St. John’s + + + Llundain + + + Dinas Mecsico + + + Efrog Newydd + + + + + + + + ¤#,##0.00 + + + + + + Real Brasil + + + Yuan Renminbi Tseina + + + Ewro + + + Punt Sterling Prydain + + + Rwpî India + + + Yen Siapan + + + Rwbl Rwsia + + + Doler yr UDA + + + + diff --git a/lib/zend/Zend/Locale/Data/cy_GB.xml b/lib/zend/Zend/Locale/Data/cy_GB.xml new file mode 100644 index 0000000000..47baacb840 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/cy_GB.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/da.xml b/lib/zend/Zend/Locale/Data/da.xml new file mode 100644 index 0000000000..0add6be8fb --- /dev/null +++ b/lib/zend/Zend/Locale/Data/da.xml @@ -0,0 +1,3130 @@ + + + + + + + + + nb nn sv en + + + {0} ({1}) + , + + + afar + abkhasisk + achinesisk + acoli + adangme + adyghe + avestan + afrikaans + afro-asiatisk sprog + afrihili + ainu + akan + akkadisk + aleutisk + algonkisk sprog + sydaltaisk + amharisk + aragonesisk + oldengelsk + angika + apachesprog + arabisk + aramæisk + araukansk + arapaho + kunstsprog + arawak + assamesisk + asturisk + athapaskisk sprog + australsk sprog + avarisk + awadhi + aymara + aserbajdsjansk + bashkir + banda + bamilekisk sprog + baluchi + balinesisk + basa + baltisk sprog + hviderussisk + beja + bemba + berberisk + bulgarsk + bihari + bhojpuri + bislama + bikol + bini + siksika + bambara + bengalsk + bantu + tibetansk + bretonsk + braj + bosnisk + batak + buriatisk + buginesisk + blin + katalansk + caddo + mellemamerikansk indiansk sprog + caribisk + kaukasisk sprog + atsam + tjetjensk + cebuano + keltisk sprog + chamorro + chibcha + chagatai + chuukese + mari + chinook + choctaw + chipewyan + cherokee + cheyenne + chamiske sprog + korsikansk + koptisk + engelsk baseret kreolsk eller pidgin + fransk baseret kreolsk eller pidginsprog + portugisisk baseret kreolsk eller pidginsprog + cree + krim tyrkisk + kreolsk eller pidginsprog + tjekkisk + kasjubisk + kirkeslavisk + kusjitisk sprog + chuvash + walisisk + dansk + dakota + dargwa + dayak + tysk + østrigsk tysk + schweizerhøjtysk + delaware + athapaskisk + dogrib + dinka + dogri + dravidisk sprog + nedersorbisk + duala + middelhollandsk + divehi + dyula + dzongkha + ewe + efik + oldegyptisk + ekajuk + græsk + elamitisk + engelsk + australsk engelsk + canadisk engelsk + britisk engelsk + amerikansk engelsk + middelengelsk + esperanto + spansk + latinamerikansk spansk + castiliansk spansk + estisk + baskisk + ewondo + persisk + fang + fanti + fulah + finsk + filippinsk + finsk-ugrisk sprog + fijiansk + færøsk + fon + fransk + canadisk fransk + schweizisk fransk + middelfransk + oldfransk + nordfrisisk + østfrisisk + friulian + frisisk + irsk + ga + gayo + gbaya + skotsk gælisk + germansk sprog + geez + gilbertesisk + galicisk + middelhøjtysk + guarani + oldhøjtysk + gondi + gorontalo + gotisk + grebo + oldgræsk + schweizertysk + gujarati + manx + gwichin + hausa + haida + hawaiiansk + hebraisk + hindi + hiligaynon + himachali + hittitisk + hmong + Hiri Motu + kroatisk + øvresorbisk + haitisk + ungarsk + hupa + armensk + herero + interlingua + iban + indonesisk + interlingue + igbo + sichuan yi + ijo + inupiaq + iloko + indisk sprog + indo-europæisk sprog + ingush + ido + iransk sprog + irokesisk sprog + islandsk + italiensk + inuktitut + japansk + lojban + jødisk-persisk + jødisk-arabisk + javanesisk + georgisk + karakalpakisk + kabyle + kachin + jju + kamba + karen + kawi + kabardian + tyap + koro + kongo + khasi + khoisansprog + khotanesisk + kikuyu + kuanyama + kasakhisk + grønlandsk + khmer + kimbundu + kannaresisk + koreansk + konkani + kosraean + kpelle + kanuri + karatjai-balkar + karelsk + kru + kurukh + kashmiri + kurdisk + kymyk + kutenaj + komi + cornisk + kirgisisk + latin + ladino + lahnda + lamba + luxembourgsk + lezghian + ganda + limburgsk + lingala + laotisk + mongo + lozi + litauisk + luba-Katanga + luba-Lulua + luiseno + lunda + luo + lushai + lettisk + madurese + magahi + maithili + makasar + mandingo + austronesisk sprog + masai + moksha + mandar + mende + malagasy + middelirsk + marshallese + maori + micmac + minangkabau + diverse sprog + makedonsk + mon-khmer sprog + malayalam + mongolsk + manchu + manipuri + manobo sprog + moldovisk + mohawk + mossi + marathisk + malay + maltesisk + flere sprog + mundasprog + creek + mirandesisk + marwari + burmesisk + mayasprog + erzya + nauru + nahuatl + nordamerikansk indiansk sprog + neapolitansk + norsk bokmål + nordndebele + nedertysk + nepalesisk + newari + ndonga + nias + Niger-Congo sprog + niuean + hollandsk + flamsk + nynorsk + norsk + nogai + oldislandsk + n-ko + sydndebele + nordsotho + nubisk sprog + navajo + klassisk newarisk + nyanja + nyamwezi + nyankole + nyoro sprog + nzima + occitansk + ojibwa + oromo + oriya + ossetisk + osage + osmannisk-tyrkisk + otomi sprog + punjabi + papua-australsk sprog + pangasinan + pahlavi + pampanga + papiamento + palauansk + oldpersisk + filippinsk sprog + fønikisk + pali + polsk + ponape + prakritsprog + oldprovencalsk + pashto + portugisisk + brasiliansk portugisisk + iberisk portugisisk + quechua + rajasthani + rapanui + rarotongan + rætoromansk + rundi + rumænsk + romansk sprog + romani + rot + russisk + arumænsk + kinyarwanda + sanskrit + sandawe + yakut + sydamerikansk indiansk sprog + salikisk sprog + samaritansk + sasak + santali + sardinsk + siciliansk + skotsk + sindhi + nordsamisk + selkupisk + semitisk sprog + sango + oldirsk + tegnsprog + serbokroatisk + shan + singalesisk + sidamo + sioux sprog + sino-tibetansk sprog + slovakisk + slovensk + slavisk sprog + samoansk + sydsamisk + samisk sprog + lule sami + inari sami + skolt sami + shona + soninke + somalisk + sogdiansk + songhai + albansk + serbisk + sranan tongo + serer + swati + nilo-saharansk sprog + sydsotho + sundanesisk + sukuma + susu + sumerisk + svensk + swahili + klassisk syrisk + syrisk + tamilsk + thaisprog + telugu + temne + tereno + tetum + tajik + thailandsk + tigrinya + tigre + tivi + turkmensk + tokelau + tagalog + klingon + tlingit + tamashek + tswana + tongansk + nyasa tongansk + Tok Pisin + tyrkisk + tsonga + tsimshisk + tatarisk + tumbuka + tupisprog + altaisk sprog + tuvalu + twi + tahitiansk + tuvinian + udmurt + uigurisk + ugaristisk + ukrainsk + umbundu + ukendt eller ugyldigt sprog + urdu + usbekisk + vai + venda + vietnamesisk + volapyk + votisk + vallonsk + wakashansk sprog + walamo + waray + washo + vendisk sprog + wolof + kalmyk + xhosa + yao + yap + jiddisch + yoruba + yupisk sprog + zhuang + zapotec + blissymboler + zenaga + kinesisk + forenklet kinesisk + traditionelt kinesisk + zande + zulu + zuni + intet sprogligt indhold + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Verden + Afrika + Nordamerika + Sydamerika + Oceanien + Vestafrika + Mellemamerika + Østafrika + Nordafrika + Centralafrika + Det sydlige Afrika + Amerika + Det nordlige Amerika + Caribien + Østasien + Sydasien + Sydøstasien + Sydeuropa + Australien og New Zealand + Melanesien + Mikronesien + Polynesien + Sydcentralasien + Asien + Centralasien + Vestasien + Europa + Østeuropa + Nordeuropa + Vesteuropa + Sammenslutningen af uafhængige stater + Latinamerika og Caribien + Andorra + Forenede Arabiske Emirater + Afghanistan + Antigua og Barbuda + Anguilla + Albanien + Armenien + Hollandske Antiller + Angola + Antarktis + Argentina + Amerikansk Samoa + Østrig + Australien + Aruba + Åland + Aserbajdsjan + Bosnien-Hercegovina + Barbados + Bangladesh + Belgien + Burkina Faso + Bulgarien + Bahrain + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei Darussalam + Bolivia + Brasilien + Bahamas + Bhutan + Bouvetø + Botswana + Hviderusland + Belize + Canada + Cocosøerne + Congo-Kinshasa + Centralafrikanske Republik + Congo + Schweiz + Elfenbenskysten + Cook-øerne + Chile + Cameroun + Kina + Colombia + Costa Rica + Serbien og Montenegro + Cuba + Kap Verde + Juleøen + Cypern + Tjekkiet + Tyskland + Djibouti + Danmark + Dominica + Den Dominikanske Republik + Algeriet + Ecuador + Estland + Egypten + Vestsahara + Eritrea + Spanien + Etiopien + Finland + Fiji-øerne + Falklandsøerne + Mikronesiens Forenede Stater + Færøerne + Frankrig + Gabon + Storbritannien + Grenada + Georgien + Fransk Guyana + Guernsey + Ghana + Gibraltar + Grønland + Gambia + Guinea + Guadeloupe + Ækvatorialguinea + Grækenland + South Georgia og De Sydlige Sandwichøer + Guatemala + Guam + Guinea-Bissau + Guyana + SAR Hongkong + Heard- og McDonald-øerne + Honduras + Kroatien + Haiti + Ungarn + Indonesien + Irland + Israel + Isle of Man + Indien + Det Britiske Territorium i Det Indiske Ocean + Irak + Iran + Island + Italien + Jersey + Jamaica + Jordan + Japan + Kenya + Kirgisistan + Cambodja + Kiribati + Comorerne + Saint Kitts og Nevis + Nordkorea + Sydkorea + Kuwait + Caymanøerne + Kasakhstan + Laos + Libanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litauen + Luxembourg + Letland + Libyen + Marokko + Monaco + Republikken Moldova + Montenegro + Saint Martin + Madagaskar + Marshalløerne + Republikken Makedonien + Mali + Myanmar + Mongoliet + SAR Macao + Nordmarianerne + Martinique + Mauretanien + Montserrat + Malta + Mauritius + Maldiverne + Malawi + Mexico + Malaysia + Mozambique + Namibia + Ny Caledonien + Niger + Norfolk Island + Nigeria + Nicaragua + Holland + Norge + Nepal + Nauru + Niue + New Zealand + Oman + Panama + Peru + Fransk Polynesien + Papua Ny Guinea + Filippinerne + Pakistan + Polen + Saint Pierre og Miquelon + Pitcairn + Puerto Rico + De palæstinensiske områder + Portugal + Palau + Paraguay + Qatar + Ydre Oceanien + EU + Reunion + Rumænien + Serbien + Rusland + Rwanda + Saudi-Arabien + Salomonøerne + Seychellerne + Sudan + Sverige + Singapore + St. Helena + Slovenien + Svalbard og Jan Mayen + Slovakiet + Sierra Leone + San Marino + Senegal + Somalia + Surinam + Sao Tome og Principe + El Salvador + Syrien + Swaziland + Turks- og Caicosøerne + Tchad + Franske Besiddelser i Det Sydlige Indiske Ocean + Togo + Thailand + Tadsjikistan + Tokelau + Timor-Leste + Turkmenistan + Tunesien + Tonga + Tyrkiet + Trinidad og Tobago + Tuvalu + Taiwan + Tanzania + Ukraine + Uganda + De Mindre Amerikanske Oversøiske Øer + USA + Uruguay + Usbekistan + Vatikanstaten + St. Vincent og Grenadinerne + Venezuela + De britiske jomfruøer + De amerikanske jomfruøer + Vietnam + Vanuatu + Wallis og Futunaøerne + Samoa + Yemen + Mayotte + Sydafrika + Zambia + Zimbabwe + Ukendt eller ugyldigt område + + + traditionel tysk retskrivning + tysk retskrivning fra 1996 + østarmensk + boontling + det internationale fonetiske alfabet + det uraliske fonetiske alfabet + lipovaz + computer + revideret retskrivning + + + Kalender + Sortering + Valuta + + + sorteringsrækkefølge uforkortet kinesisk - Big5 + buddhistisk kalender + kinesisk kalender + direkte sorteringsrækkefølge + sorteringsrækkefølge forkortet kinesisk - GB2312 + gregoriansk kalender + jødisk kalender + indisk nationalkalender + islamisk kalender + verdslig islamisk kalender + japansk kalender + sorteringsrækkefølge i telefonbøger + pinyin-baseret sorteringsrækkefølge + kalender for Republikken Kina + stregbaseret sorteringsrækkefølge + traditionel sorteringsrækkefølge + + + De amerikanske målesystemer + Det metriske system + + + Sprog: {0} + Instruks: {0} + Område: {0} + + + + titlecase-firstword + lowercase-words + titlecase-firstword + titlecase-firstword + lowercase-words + lowercase-words + lowercase-words + titlecase-firstword + lowercase-words + lowercase-words + lowercase-words + + + [a-z æ ø å] + [á é è ê ë ß ü ä ö] + [a-z] + + + ” + ” + ” + ” + + + {0}–{1} + + + + + + EEEE d. MMMM y G + + + + + d. MMMM y G + + + + + d. MMM y G + + + + + d/M/yyyy + + + + + + + + + jan. + feb. + mar. + apr. + maj + jun. + jul. + aug. + sep. + okt. + nov. + dec. + + + januar + februar + marts + april + maj + juni + juli + august + september + oktober + november + december + + + + + jan + feb + mar + apr + maj + jun + jul + aug + sep + okt + nov + dec + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + søn + man + tir + ons + tor + fre + lør + + + søndag + mandag + tirsdag + onsdag + torsdag + fredag + lørdag + + + + + S + M + T + O + T + F + L + + + + + + + K1 + K2 + K3 + K4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + + 1 + 2 + 3 + 4 + + + + f.m. + e.m. + + + f.Kr. + e.Kr. + + + f.Kr. + e.Kr. + + + + + + EEEE 'den' d. MMMM y + + + + + d. MMM y + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + HH.mm.ss zzzz + + + + + HH:mm:ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + H + HH.mm.ss + HH.mm + M + E. d-M + MMM + E d MMM + E, d. MMMM + d. MMMM + d. MMM + dd/MM + d/M + d. + h.mm a + h.mm.ss a + mm.ss + y + M-yyyy + EEE. d-M-yyyy + MMM y + EEE. d. MMM y + MMMM y + Q yyyy + QQQ y + MM/yy + MMM yy + Q. 'kvartal' yy + y + MM/yyyy + MMM y + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E 'den' d. MMM - E 'den' d. MMM + E 'den' d. - E 'den' d. MMM + + + MMMM-MMMM + + + d. MMM - d. MMM + d.-d. MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d.-d. + + + HH-HH + HH-HH + + + HH.mm-HH.mm + HH.mm-HH.mm + HH.mm-HH.mm + + + HH.mm-HH.mm v + HH.mm-HH.mm v + HH.mm-HH.mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM y + MMM y - MMM y + + + E 'den' d. MMM - E 'den' d. MMM y + E 'den' d. - E 'den' d. MMM y + E 'den' d. MMM y - E 'den' d. MMM y + + + MM-MM yyyy + MM yyyy - MM yyyy + + + d. MMM - d. MMM y + d.-d. MMM y + d. MMM y - d. MMM y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + æra + + + år + + + måned + + + uge + + + dag + for tre dage siden + i forgårs + i går + i dag + i morgen + i overmorgen + om tre dage + + + ugedag + + + dagtid + + + time + + + minut + + + sekund + + + zone + + + + + + +HH.mm;-HH.mm + GMT{0} + {0} + {1} ({0}) + + Ukendt + + + Sydpolen + + + Dumont d’Urville + + + Wien + + + Bruxelles + + + St. Johns + + + Zürich + + + Påskeøen + + + Kap Verde + + + Juleøen + + + København + + + Algier + + + De Kanariske Øer + + + Færøerne + + + Nuuk + + + Athen + + + Hongkong + + + Teheran + + + Rom + + + St. Kitts + + + St. Lucia + + + Macao + + + Maldiverne + + + Warszawa + + + Azorerne + + + Lissabon + + + Réunion + + + Bukarest + + + Moskva + + + Salvador + + + Alaska + + + St. Vincent + + + St. Thomas + + + + Acre-tid + Acre-sommertid + + + + + Afghansk tid + + + + + centralafrikansk tid + + + + + østafrikansk tid + + + + + sydafrikansk tid + sydafrikansk normaltid + + + + + vestafrikansk tid + vestafrikansk sommertid + + + + + Aktyubinsk-tid + Aktyubinsk-sommertid + + + + + Alaska-tid + Alaska-normaltid + Alaska-sommertid + + + + + Alaska-Hawaii-tid + Alaska-Hawaii-normaltid + Alaska-Hawaii-sommertid + + + + + Almaty-tid + Almaty-sommertid + + + + + Amazonas-tid + Amazonas-sommertid + + + + + Central-tid + Central-normaltid + Central-sommertid + + + + + Eastern-tid + Eastern-normaltid + Eastern-sommertid + + + + + Mountain-tid + Mountain-normaltid + Mountain-sommertid + + + + + Pacific-tid + Pacific-normaltid + Pacific-sommertid + + + + + Anadyr-tid + Anadyr-sommertid + + + + + Aqtau-tid + Aqtau-sommertid + + + + + Aqtobe-tid + Aqtobe-sommertid + + + + + Arabisk tid + Arabisk normaltid + Arabisk sommertid + + + AT (arabisk) + AST (arabisk) + ADT (arabisk) + + + + + Argentinsk tid + Argentinsk sommertid + + + + + Vestargentinsk tid + + + + + Armensk tid + Armensk sommertid + + + AMST (Armenien) + + + + + Ashkhabad-tid + Ashkhabad-sommertid + + + + + Atlantic-tid + Atlantic-normaltid + Atlantic-sommertid + + + + + Centralaustralsk tid + Centralaustralsk normaltid + Centralaustralsk sommertid + + + + + Vestlig centralaustralsk tid + Vestlig centralaustralsk normaltid + Vestlig centralaustralsk sommertid + + + + + Østaustralsk tid + Østaustralsk normaltid + Østaustralsk sommertid + + + + + Vestaustralsk tid + Vestaustralsk normaltid + Vestaustralsk sommertid + + + + + Aserbajdsjansk tid + Aserbajdsjansk sommertid + + + + + Baku-tid + Baku-sommertid + + + + + Bangladeshisk tid + + + + + Bering-tid + Bering-normaltid + Bering-sommertid + + + + + Bhutanesisk tid + + + + + Boliviansk tid + + + + + Borneo-tid + Borneo-sommertid + + + + + Brasiliansk tid + Brasiliansk sommertid + + + + + Brunei Darussalam-tid + + + + + Changbai-tid + + + + + Chilensk tid + Chilensk sommertid + + + + + Kinesisk tid + Kinesisk normaltid + Kinesisk sommertid + + + CT (Kina) + CST (Kina) + CDT (Kina) + + + + + Choibalsan-tid + Choibalsan-sommertid + + + + + Colombiansk tid + Colombiansk sommertid + + + + + Cubansk tid + Cubansk normaltid + Cubansk sommertid + + + + + Dacca-tid + + + + + Davis-tid + + + + + Dumont-d'Urville-tid + + + + + Dushanbe-tid + Dushanbe-sommertid + + + + + Hollandsk Guiana-tid + + + + + Østtimor-tid + + + + + Ecuadoriansk tid + + + + + mellemeuropæisk tid + mellemeuropæisk normaltid + mellemeuropæisk sommertid + + true + + + + østeuropæisk tid + østeuropæisk normaltid + østeuropæisk sommertid + + true + + + + vesteuropæisk tid + vesteuropæisk normaltid + vesteuropæisk sommertid + + true + + + + Fransk Guiana-tid + + + + + Frunze-tid + Frunze-sommertid + + + + + Verdenstid + + true + + + + Georgiansk tid + Georgiansk sommertid + + + + + Centralgrønlandsk tid + Centralgrønlandsk sommertid + + + + + Østgrønlandsk tid + Østgrønlandsk sommertid + + + + + Vestgrønlandsk tid + Vestgrønlandsk sommertid + + + + + Guyana-tid + + + + + Hongkong-tid + Hongkong-sommertid + + + + + Hovd-tid + Hovd-sommertid + + + + + Indisk normaltid + + + + + Indokinesisk tid + + + + + Centralindonesisk tid + + + + + Østindonesisk tid + + + + + Vestindonesisk tid + + + + + Israelsk normaltid + Israelsk sommertid + + + IST (Israel) + + + + + Japansk tid + Japansk normaltid + Japansk sommertid + + + + + Koreansk normaltid + + + + + Lord Howe-tid + Lord Howe-normaltid + Lord Howe-sommertid + + + + + Mawson-tid + + + + + Moskva-normaltid + Moskva-sommertid + + + + + Newzealandsk tid + Newzealandsk normaltid + Newzealandsk sommertid + + + + + Newfoundland-tid + Newfoundland-normaltid + Newfoundland-sommertid + + + + + Fernando de Noronha-tid + Fernando de Noronha-sommertid + + + + + Paraguayansk tid + Paraguayansk sommertid + + + + + Peruviansk tid + Peruviansk sommertid + + + + + Pierre- og Miquelon-tid + Pierre- og Miquelon-normaltid + Pierre- og Miquelon-sommertid + + + + + Rothera-tid + + + + + Surinam-tid + + + + + Syowa-tid + + + + + Uruguayansk tid + Uruguayansk sommertid + + + + + Venezuelansk tid + + + + + Vostok-tid + + + + + Yukon-tid + Yukon-normaltid + Yukon-sommertid + + + + + + + , + . + , + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + Andorransk peseta + Andorranske pesetas + + + Dirham fra de Forenede Arabiske Emirater + + + Afghani (1927-2002) + + + Afghani + + + Albansk lek + Albansk lek + Albanske lek + + + Armensk dram + Armenske dram + + + Gylden fra De Hollandske Antiller + + + Angolansk kwanza + Angolanske kwanza + + + Angolansk kwanza (1977-1990) + Angolanske kwanza (AOK) + + + Ny angolansk kwanza (1990-2000) + + + Angolansk kwanza reajustado (1995-1999) + + + Argentinsk austral + Argentinsk austral + Argentinske austral + + + Argentinsk peso (1983-1985) + Argentinsk pesos (APR) + Argentinske pesos (ARP) + + + Argentinsk peso + Argentinsk pesos + Argentinske pesos + + + Østrigsk schilling + Østrigsk schilling + Østrigske schilling + + + Australsk dollar + Australsk dollar + Australske dollar + + + Arubansk gylden + Arubanske gylden + + + Aserbajdsjansk manat 1993-2006 + + + Aserbajdsjansk manat + Aserbajdsjansk manat + Aserbajdsjanske manat + + + Bosnien-Hercegovinsk dinar + Bosnien-Hercegovinske dinarer + + + Bosnien-Hercegovinsk konvertibel mark + Bosnien-Hercegovinske konvertible mark + + + Barbadisk dollar + Barbadiske dollar + + + Bangladeshisk taka + Bangladeshiske taka + + + Belgisk franc (konvertibel) + Belgisk franc (konvertibel) + Belgiske franc (konvertible) + + + Belgisk franc + Belgisk franc + Belgiske franc + + + Belgisk franc (financial) + Belgisk franc (financial) + Belgiske franc (financial) + + + Bulgarsk hard lev + Bulgarske hard lev + + + Ny bulgarsk lev + Ny bulgarske lev + + + Bahrainsk dinar + Bahrainske dinarer + + + Burundisk franc + Burundiske franc + + + Bermudansk dollar + Bermudanske dollar + + + Bruneisk dollar + Bruneiske dollar + + + Boliviansk boliviano + Bolivianske boliviano + + + Boliviansk peso + Bolivianske pesos + + + Boliviansk mvdol + + + Brasiliansk cruzeiro novo (1967-1986) + + + Brasiliansk cruzado + Brasilianske cruzado + + + Brasiliansk cruzeiro (1990-1993) + + + Brasiliansk real + Brasiliansk real + Brasilianske real + + + Brasiliansk cruzado novo + Brasilianske cruzado novo + + + Brasiliansk cruzeiro + Brasiliansk cruzeiro + Brasilianske cruzeiro + + + Bahamansk dollar + Bahamanske dollar + + + Bhutansk ngultrum + + + Burmesisk kyat + + + Botswansk pula + + + Ny hviderussisk rubel (1994-1999) + + + Hviderussisk rubel + Hviderussiske rubler + + + Belizisk dollar + + + Canadisk dollar + Canadisk dollar + Canadiske dollar + + + Congolesisk franc congolais + + + WIR euro + + + Schweizisk franc + Schweizisk franc + Schweiziske franc + + + WIR franc + + + Chilensk unidades de fomento + + + Chilensk peso + Chilensk pesos + Chilenske pesos + + + Kinesisk yuan renminbi + + + Colombiansk peso + Colombiansk pesos + Colombianske pesos + + + Unidad de Valor Real + + + Costaricansk colon + Costaricansk colon + Costaricanske colon + + + Gammel serbisk dinar + + + Tjekkoslovakisk hard koruna + Tjekkoslovakisk hard koruna + Tjekkoslovakiske hard koruna + + + Cubansk peso + Cubansk pesos + Cubanske pesos + + + Kapverdisk escudo + Kapverdiske escudos + + + Cypriotisk pund + Cypriotisk pund + Cypriotiske pund + + + Tjekkisk koruna + Tjekkisk koruna + Tjekkiske koruna + + + Østtysk mark + Østtyske mark + + + Tysk mark + Tysk mark + Tyske mark + + + Djiboutisk franc + + + Dansk krone + Dansk krone + Danske kroner + kr + + + Dominikansk peso + Dominikanske pesos + + + Algerisk dinar + Algerisk dinar + Algeriske dinarer + + + Ecuadoriansk sucre + Ecuadorianske sucre + + + Ecuadoriansk Unidad de Valor Constante (UVC) + + + Estisk kroon + Estisk kroon + Estiske kroon + + + Egyptisk pund + Egyptisk pund + Egyptiske pund + + + Eritreisk nakfa + + + Spansk peseta (A-konto) + + + Spansk peseta (konvertibel konto) + + + Spansk peseta + Spansk pesetas + Spanske pesetas + + + Etiopisk birr + Etiopiske birr + + + Euro + + + Finsk mark + Finsk mark + Finske mar + + + Fijiansk dollar + Fijiansk dollar + Fijianske dollar + + + Pund fra Falklandsøerne + + + Fransk franc + Fransk franc + Franske franc + + + Britisk pund + Britisk pund + Britiske pund + + + Georgisk kupon larit + Georgisk kupon larit + Georgiske kupon larit + + + Georgisk lari + Georgisk lari + Georgiske lari + + + Ghanesisk cedi 1979-2007 + Ghanesiske cedi + + + Ghanesisk cedi + + + Gibraltarisk pund + Gibraltarisk pund + Gibraltariske pund + + + Gambisk dalasi + Gambiske dalasi + + + Guineansk franc + Guineanske franc + + + Guineansk syli + Guineanske syli + + + Ækvatorialguineask ekwele guineana + + + Græsk drakme + Græsk drakmer + Græske drakmer + + + Guatemalansk quetzal + + + Portugisisk guinea escudo + Portugisiske guinea escudo + + + Guineansk peso + Guinea-Bissau-pesos + + + Guyansk dollar + Guyanske dollar + + + Hongkong dollar + + + Honduransk lempira + + + Kroatisk dinar + Kroatisk dinar + Kroatiske dinarer + + + Kroatisk kuna + Kroatisk kuna + Kroatiske kuna + + + Haitisk gourde + Haitiske gourde + + + Ungarsk forint + Ungarsk forint + Ungarske forint + + + Indonesisk pupiah + Indonesiske rupiah + + + Irsk pund + Irske pund + + + Israelsk pund + Israelsk pund + Israelske pund + + + Ny israelsk shekel + Ny israelsk shekel + Nye israelske shekel + + + Indisk rupee + Indisk rupee + Indiske rupees + + + Irakisk dinar + Irakisk dinar + Irakiske dinarer + + + Iransk rial + Iransk rial + Iranske rial + + + Islansk krone + Islandsk krone + Islandske kroner + + + Italiensk lire + Italiensk lire + Italienske lire + + + Jamaicansk dollar + Jamaicanske dollar + + + Jordansk dinar + Jordanske dinarer + + + Japansk yen + Japansk yen + Japanske yen + + + Kenyansk shilling + Kenyanske shilling + + + Kirgisisk som + Kirgisiske som + + + Cambodjansk riel + Cambodjanske riel + + + Comorisk franc + Comoriske franc + + + Nordkoreansk won + Nordkoreansk won + Nordkoreanske won + + + Sydkoreansk won + Sydkoreansk won + Sydkoreanske won + + + Kuwaitisk dinar + Kuwaitiske dinarer + + + Dollar fra Caymanøerne + + + Kasakhisk tenge + Kasakhiske tenge + + + Laotisk kip + Laotiske kip + + + Libanesisk pund + Libanesiske pund + + + Srilankansk rupee + Srilankanske rupees + + + Liberisk dollar + Liberiske dollar + + + Lesothisk loti + Lesothiske loti + + + Litauisk lita + Litauiske lita + + + Litauisk talonas + Litauiske talonas + + + Luxembourgsk konvertibel franc + + + Luxembourgsk franc + Luxembourgsk franc + Luxembourgske franc + + + Luxembourgsk finansiel franc + + + Lettisk lat + Lettisk lat + Lettiske lat + + + Lettisk rubel + Lettisk rubel + Lettiske rubler + + + Libysk dinar + Libyske dinarer + + + Marokkansk dirham + Marokkanske dirham + + + Marokkansk franc + Marokkanske franc + + + Moldovisk leu + Moldoviske leu + + + Madagaskisk ariary + Madagaskiske ariary + + + Madagaskisk franc + Madagaskiske franc + + + Makedonsk denar + Makedonske denarer + + + Malisk franc + Maliske franc + + + Myanmarsk kyat + Myanmarske kyat + + + Mongolsk tugrik + + + Macaosk pataca + + + Mauritansk ouguiya + + + Maltesisk lira + Maltesiske lira + + + Maltesisk pund + Maltesiske pund + + + Mauritisk rupee + Mauritiske rupees + + + Maldivisk rufiyaa + Maldiviske rufiyaa + + + Malawisk kwacha + Malawiske kwacha + + + Mexicansk peso + Mexicansk pesos + Mexicanske pesos + + + Mexicansk silver peso (1861-1992) + + + Mexicansk Unidad de Inversion (UDI) + + + Malaysisk ringgit + Malaysiske ringgit + + + Mozambiquisk escudo + + + Gammel mozambiquisk metical + + + Mozambiquisk metical + + + Namibisk dollar + Namibiske dollar + + + Nigeriansk naira + Nigerianske naira + + + Nicaraguansk cordoba + Nicaraguanske cordoba + + + Nicaraguansk cordoba oro + Nicaraguanske cordoba oro + + + Hollandsk guilder + Hollandsk gylden + Hollandske gylden + + + Norsk krone + Norsk krone + Norske kroner + + + Nepalesisk rupee + Nepalesiske rupees + + + New Zealandsk dollar + New Zealandsk dollar + New Zealandske dollar + + + Omansk rial + Omanske rial + + + Panamansk balboa + + + Peruviansk inti + Peruvianske inti + + + Peruviansk sol nuevo + + + Peruviansk sol + + + Papuansk kina + + + Filippinsk peso + Filippinsk pesos + Filippinske pesos + + + Pakistansk rupee + Pakistanske rupees + + + Polsk zloty + Polsk zloty + Polske zloty + + + Polsk zloty (1950-1995) + + + Portugisisk escudo + Portugisiske escudo + + + Paraguaysk guarani + Paraguayske guarani + + + Qatarsk rial + + + Gammel rumænsk leu + + + Rumænsk leu + + + Serbisk dinar + Serbiske dinarer + + + Russisk rubel + Russiske rubler + + + Russisk rubel (1991-1998) + + + Rwandisk franc + + + Saudisk riyal + Saudiske riyal + + + Salomonsk dollar + + + Seychellisk rupee + + + Sudansk dinar + + + Sudanesisk pund + + + Sudansk pund + + + Svensk krone + Svensk krone + Svenske kroner + + + Singaporeansk dollar + Singaporeanske dollar + + + Pund fra Saint Helena + + + Slovensk tolar + Slovenske tolar + + + Slovakisk koruna + + + Sierraleonsk leone + + + Somalisk shilling + Somaliske shilling + + + Surinamsk dollar + + + Surinamsk guilder + + + Dobra fra Sao Tome og Principe + + + Sovjetisk rubel + Sovjetisk rubel + Sovjetiske rubler + + + Salvadoransk colon + Salvadoranske colon + + + Syrisk pund + Syrisk pund + Syriske pund + + + Swazilandsk lilangeni + + + Thailandsk baht + Thailandsk baht + Thailandske baht + + + Tadsjikisk rubel + + + Tadsjikisk somoni + Tadsjikiske somoni + + + Turkmensk manat + + + Tunesisk dinar + Tunesiske dinarer + + + Tongask paʻanga + Tongaske paʻanga + + + Escudo fra Timor + + + Tyrkisk lire + Tyrkisk lire + Tyrkiske lire + + + Ny tyrkisk lire + Tyrkiske lira + + + Dollar fra Trinidad og Tobago + + + Ny taiwansk dollar + Taiwanske dollar + + + Tanzanisk shilling + Tanzaniske shilling + + + Ukrainsk grynia + Ukrainske grynia + + + Ukrainsk karbovanetz + + + Ugandisk shilling (1966-1987) + + + Ugandisk shilling + Ugandiske shilling + + + Amerikansk dollar + Amerikansk dollar + Amerikanske dollar + $ + + + Amerikansk dollar (næste dag) + + + Amerikansk dollar (samme dag) + + + Uruguayan Peso en Unidades Indexadas + + + Uruguaysk peso (1975-1993) + + + Uruguaysk peso uruguayo + + + Usbekisk sum + Usbekiske sum + + + Venezuelansk bolivar + + + Venezuelansk bolivar fuerte + + + Vietnamesisk dong + Vietnamesiske dong + + + Vanuaisk vatu + + + Samoansk tala + Samoanske tala + + + Beninsk CFA-franc + + + Sølv + + + Guld + + + EURCO + + + EMU + + + Østkaribisk dollar + Østkaribiske dollar + + + SDR + + + ECU + + + Fransk guldfranc + + + Fransk UIC-franc + + + CFA-franc BCEAO + + + Palladium + + + CFP-franc + + + Platinum + + + RINET-fond + + + testvalutakode + testvaluta + testvaluta + + + Ukendt eller ugyldig valuta + ukendt valuta + ukendt valuta + + + Yemenitisk dinar + Yemenitiske dinarer + + + Yemenitisk rial + Yemenitiske rial + + + Jugoslavisk hard dinar + + + Jugoslavisk noviy dinar + + + Jugoslavisk konvertibel dinar + + + Sydafrikansk rand (financial) + + + Sydafrikansk rand + Sydafrikanske rand + + + Zambisk kwacha + Zambiske kwacha + + + Ny zairisk zaire + + + Zairisk zaire + Zairiske zaire + + + Zimbabwisk dollar + Zimbabwiske dollar + + + + + + {0} dag + {0} dage + + + {0} time + {0} timer + + + {0} minut + {0} minutter + + + {0} måned + {0} måneder + + + {0} sekund + {0} sekunder + + + {0} uge + {0} uger + + + {0} år + {0} år + + + + + ja:j + nej:n + + + + diff --git a/lib/zend/Zend/Locale/Data/da_DK.xml b/lib/zend/Zend/Locale/Data/da_DK.xml new file mode 100644 index 0000000000..ea499c7838 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/da_DK.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/de.xml b/lib/zend/Zend/Locale/Data/de.xml new file mode 100644 index 0000000000..53972f25f9 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/de.xml @@ -0,0 +1,2950 @@ + + + + + + + + + + + {0} ({1}) + , + + + Afar + Abchasisch + Aceh-Sprache + Acholi-Sprache + Adangme + Adygeisch + Avestisch + Afrikaans + Afroasiatische Sprachen + Afrihili + Ainu-Sprache + Akan + Akkadisch + Aleutisch + Algonkin-Sprachen + Süd-Altaisch + Amharisch + Aragonesisch + Altenglisch + Angika + Apachen-Sprache + Arabisch + Aramäisch + Araukanisch + Arapaho-Sprache + Kunstsprache + Arawak-Sprachen + Assamesisch + Asturianisch + Athapaskische Sprachen + Australische Sprachen + Awarisch + Awadhi + Aymara + Aserbaidschanisch + Baschkirisch + Banda-Sprache + Bamileke-Sprache + Belutschisch + Balinesisch + Basaa-Sprache + Baltische Sprachen + Weißrussisch + Bedauye + Bemba-Sprache + Berbersprache + Bulgarisch + Biharisch + Bhodschpuri + Bislama + Bikol-Sprache + Bini-Sprache + Blackfoot-Sprache + Bambara-Sprache + Bengalisch + Bantusprachen + Tibetisch + Bretonisch + Braj-Bhakha + Bosnisch + Batak + Burjatisch + Buginesisch + Blin + Katalanisch + Caddo + Zentralamerikanische Indianersprache + Karibische Sprachen + Kaukasische Sprache + Atsam + Tschetschenisch + Cebuano + Keltische Sprachen + Chamorro-Sprache + Chibcha-Sprache + Tschagataisch + Trukesisch + Tscheremissisch + Chinook + Choctaw + Chipewyan + Cherokee + Cheyenne + Cham-Sprachen + Korsisch + Koptisch + Kreolisch-Englische Sprache + Kreolisch-Französische Sprache + Kreolisch-Portugiesische Sprache + Cree + Krimtatarisch + Kreolische Sprache + Tschechisch + Kaschubisch + Kirchenslawisch + Kuschitische Sprachen + Tschuwaschisch + Walisisch + Dänisch + Dakota-Sprache + Darginisch + Dajak + Deutsch + Österreichisches Deutsch + Schweizer Hochdeutsch + Delaware-Sprache + Slave + Dogrib + Dinka-Sprache + Dogri + Drawidische Sprache + Niedersorbisch + Duala + Mittelniederländisch + Maledivisch + Dyula-Sprache + Bhutanisch + Ewe-Sprache + Efik + Ägyptisch + Ekajuk + Griechisch + Elamisch + Englisch + Australisches Englisch + Kanadisches Englisch + Britisches Englisch + Amerikanisches Englisch + Mittelenglisch + Esperanto + Spanisch + Lateinamerikanisches Spanisch + Iberisches Spanisch + Estnisch + Baskisch + Ewondo + Persisch + Pangwe-Sprache + Fanti-Sprache + Ful + Finnisch + Filipino + Finnougrische Sprachen + Fidschianisch + Färöisch + Fon-Sprache + Französisch + Kanadisches Französisch + Schweizer Französisch + Mittelfranzösisch + Altfranzösisch + Nordfriesisch + Ostfriesisch + Friulisch + Friesisch + Irisch + Ga-Sprache + Gayo + Gbaya-Sprache + Schottisches Gälisch + Germanische Sprachen + Geez + Gilbertesisch + Galizisch + Mittelhochdeutsch + Guarani + Althochdeutsch + Gondi-Sprache + Mongondou + Gotisch + Grebo-Sprache + Altgriechisch + Schweizerdeutsch + Gujarati + Manx + Kutchin-Sprache + Hausa + Haida-Sprache + Hawaiisch + Hebräisch + Hindi + Hiligaynon-Sprache + Himachali + Hethitisch + Miao-Sprachen + Hiri-Motu + Kroatisch + Obersorbisch + Haitianisch + Ungarisch + Hupa + Armenisch + Herero-Sprache + Interlingua + Iban + Indonesisch + Interlingue + Igbo-Sprache + Sichuan Yi + Ijo-Sprache + Inupiak + Ilokano-Sprache + Indoarische Sprache + Indogermanische Sprachen + Inguschisch + Ido-Sprache + Iranische Sprachen + Irokesische Sprache + Isländisch + Italienisch + Inukitut + Japanisch + Lojban + Jüdisch-Persisch + Jüdisch-Arabisch + Javanisch + Georgisch + Karakalpakisch + Kabylisch + Kachin-Sprache + Jju + Kamba + Karenisch + Kawi + Kabardinisch + Tyap + Koro + Kongo + Khasi-Sprache + Khoisan-Sprache + Sakisch + Kikuyu-Sprache + Kwanyama + Kasachisch + Grönländisch + Kambodschanisch + Kimbundu-Sprache + Kannada + Koreanisch + Konkani + Kosraeanisch + Kpelle-Sprache + Kanuri-Sprache + Karatschaiisch-Balkarisch + Karelisch + Kru-Sprachen + Oraon-Sprache + Kaschmirisch + Kurdisch + Kumükisch + Kutenai-Sprache + Komi-Sprache + Kornisch + Kirgisisch + Latein + Ladino + Lahnda + Lamba-Sprache + Luxemburgisch + Lesgisch + Ganda-Sprache + Limburgisch + Lingala + Laotisch + Mongo + Rotse-Sprache + Litauisch + Luba-Katanga + Luba-Lulua + Luiseno-Sprache + Lunda-Sprache + Luo-Sprache + Lushai-Sprache + Lettisch + Maduresisch + Khotta + Maithili + Makassarisch + Manding-Sprache + Austronesische Sprachen + Massai-Sprache + Moksha + Mandaresisch + Mende-Sprache + Malagassi-Sprache + Mittelirisch + Marschallesisch + Maori + Micmac-Sprache + Minangkabau-Sprache + Verschiedene Sprachen + Mazedonisch + Mon-Khmer-Sprache + Malayalam + Mongolisch + Mandschurisch + Meithei-Sprache + Manobo-Sprache + Moldauisch + Mohawk-Sprache + Mossi-Sprache + Marathi + Malaiisch + Maltesisch + Mehrsprachig + Munda-Sprachen + Muskogee-Sprachen + Mirandesisch + Marwari + Birmanisch + Maya-Sprachen + Ersja-Mordwinisch + Nauruisch + Nahuatl + Nordamerikanische Indianersprache + Neapolitanisch + Norwegisch Bokmål + Nord-Ndebele-Sprache + Niederdeutsch + Nepalesisch + Newari + Ndonga + Nias-Sprache + Nigerkordofanische Sprachen + Niue-Sprache + Niederländisch + Flämisch + Norwegisch Nynorsk + Norwegisch + Nogai + Altnordisch + N’Ko + Süd-Ndebele-Sprache + Nord-Sotho-Sprache + Nubische Sprachen + Navajo-Sprache + Alt-Newari + Nyanja-Sprache + Nyamwezi-Sprache + Nyankole + Nyoro + Nzima + Okzitanisch + Ojibwa-Sprache + Oromo + Orija + Ossetisch + Osage-Sprache + Osmanisch + Otomangue-Sprachen + Pandschabisch + Papuasprachen + Pangasinan-Sprache + Mittelpersisch + Pampanggan-Sprache + Papiamento + Palau + Altpersisch + Philippinen-Austronesische Sprachen + Phönikisch + Pali + Polnisch + Ponapeanisch + Prakrit + Altprovenzalisch + Paschtu + Portugiesisch + Brasilianisches Portugiesisch + Iberisches Portugiesisch + Quechua + Rajasthani + Osterinsel-Sprache + Rarotonganisch + Rätoromanisch + Rundi-Sprache + Rumänisch + Romanische Sprachen + Romani + Root + Russisch + Aromunisch + Ruandisch + Sanskrit + Sandawe-Sprache + Jakutisch + Südamerikanische Indianersprache + Salish-Sprache + Samaritanisch + Sasak + Santali + Sardisch + Sizilianisch + Schottisch + Sindhi + Nord-Samisch + Selkupisch + Semitische Sprachen + Sango + Altirisch + Gebärdensprache + Serbo-Kroatisch + Schan-Sprache + Singhalesisch + Sidamo + Sioux-Sprachen + Sinotibetische Sprache + Slowakisch + Slowenisch + Slawische Sprachen + Samoanisch + Süd-Samisch + Lappisch + Lule-Lappisch + Inari-Lappisch + Skolt-Lappisch + Shona + Soninke-Sprache + Somali + Sogdisch + Songhai-Sprache + Albanisch + Serbisch + Srananisch + Serer-Sprache + Swazi + Nilosaharanische Sprachen + Süd-Sotho-Sprache + Sundanesisch + Sukuma-Sprache + Susu + Sumerisch + Schwedisch + Suaheli + Altsyrisch + Syrisch + Tamilisch + Thaisprache + Telugu + Temne + Tereno-Sprache + Tetum-Sprache + Tadschikisch + Thailändisch + Tigrinja + Tigre + Tiv-Sprache + Turkmenisch + Tokelauanisch + Tagalog + Klingonisch + Tlingit-Sprache + Tamaseq + Tswana-Sprache + Tongaisch + Tsonga-Sprache + Neumelanesisch + Türkisch + Tsonga + Tsimshian-Sprache + Tatarisch + Tumbuka-Sprache + Tupi-Sprachen + Altaische Sprache + Elliceanisch + Twi + Tahitisch + Tuwinisch + Udmurtisch + Uigurisch + Ugaritisch + Ukrainisch + Mbundu-Sprache + Unbestimmte Sprache + Urdu + Usbekisch + Vai-Sprache + Venda-Sprache + Vietnamesisch + Volapük + Wotisch + Wallonisch + Wakashanisch + Walamo-Sprache + Waray + Washo-Sprache + Sorbisch + Wolof + Kalmückisch + Xhosa + Yao-Sprache + Yapesisch + Jiddisch + Yoruba + Yupik-Sprache + Zhuang + Zapotekisch + Bliss-Symbole + Zenaga + Chinesisch + Chinesisch (vereinfacht) + Chinesisch (traditionell) + Zande-Sprache + Zulu + Zuni-Sprache + Keine Sprachinhalte + Zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Welt + Afrika + Nordamerika + Südamerika + Ozeanien + Westafrika + Mittelamerika + Ostafrika + Nordafrika + Zentralafrika + Südliches Afrika + Amerika + Nördliches Amerika + Karibik + Ostasien + Südasien + Südostasien + Südeuropa + Australien und Neuseeland + Melanesien + Mikronesisches Inselgebiet + Polynesien + Süd-Zentralasien + Asien + Zentralasien + Westasien + Europa + Osteuropa + Nordeuropa + Westeuropa + Gemeinschaft Unabhängiger Staaten + Lateinamerika und Karibik + Kanalinseln + Andorra + Vereinigte Arabische Emirate + Afghanistan + Antigua und Barbuda + Anguilla + Albanien + Armenien + Niederländische Antillen + Angola + Antarktis + Argentinien + Amerikanisch-Samoa + Österreich + Australien + Aruba + Alandinseln + Aserbaidschan + Bosnien und Herzegowina + Barbados + Bangladesch + Belgien + Burkina Faso + Bulgarien + Bahrain + Burundi + Benin + St. Barthélemy + Bermuda + Brunei Darussalam + Bolivien + Brasilien + Bahamas + Bhutan + Bouvetinsel + Botsuana + Belarus + Belize + Kanada + Kokosinseln + Demokratische Republik Kongo + Zentralafrikanische Republik + Kongo + Schweiz + Côte d’Ivoire + Cookinseln + Chile + Kamerun + China + Kolumbien + Costa Rica + Serbien und Montenegro + Kuba + Kap Verde + Weihnachtsinsel + Zypern + Tschechische Republik + Deutschland + Dschibuti + Dänemark + Dominica + Dominikanische Republik + Algerien + Ecuador + Estland + Ägypten + Westsahara + Eritrea + Spanien + Äthiopien + Finnland + Fidschi + Falklandinseln + Mikronesien + Färöer + Frankreich + Gabun + Vereinigtes Königreich + Grenada + Georgien + Französisch-Guayana + Guernsey + Ghana + Gibraltar + Grönland + Gambia + Guinea + Guadeloupe + Äquatorialguinea + Griechenland + Südgeorgien und die Südlichen Sandwichinseln + Guatemala + Guam + Guinea-Bissau + Guyana + Sonderverwaltungszone Hongkong + Heard- und McDonald-Inseln + Honduras + Kroatien + Haiti + Ungarn + Indonesien + Irland + Israel + Isle of Man + Indien + Britisches Territorium im Indischen Ozean + Irak + Iran + Island + Italien + Jersey + Jamaika + Jordanien + Japan + Kenia + Kirgisistan + Kambodscha + Kiribati + Komoren + St. Kitts und Nevis + Demokratische Volksrepublik Korea + Republik Korea + Kuwait + Kaimaninseln + Kasachstan + Laos + Libanon + St. Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litauen + Luxemburg + Lettland + Libyen + Marokko + Monaco + Republik Moldau + Montenegro + St. Martin + Madagaskar + Marshallinseln + Mazedonien + Mali + Myanmar + Mongolei + Sonderverwaltungszone Macao + Nördliche Marianen + Martinique + Mauretanien + Montserrat + Malta + Mauritius + Malediven + Malawi + Mexiko + Malaysia + Mosambik + Namibia + Neukaledonien + Niger + Norfolkinsel + Nigeria + Nicaragua + Niederlande + Norwegen + Nepal + Nauru + Niue + Neuseeland + Oman + Panama + Peru + Französisch-Polynesien + Papua-Neuguinea + Philippinen + Pakistan + Polen + St. Pierre und Miquelon + Pitcairn + Puerto Rico + Palästinensische Gebiete + Portugal + Palau + Paraguay + Katar + Äußeres Ozeanien + Europäische Union + Réunion + Rumänien + Serbien + Russische Föderation + Ruanda + Saudi-Arabien + Salomonen + Seychellen + Sudan + Schweden + Singapur + St. Helena + Slowenien + Svalbard und Jan Mayen + Slowakei + Sierra Leone + San Marino + Senegal + Somalia + Suriname + São Tomé und Príncipe + El Salvador + Syrien + Swasiland + Turks- und Caicosinseln + Tschad + Französische Süd- und Antarktisgebiete + Togo + Thailand + Tadschikistan + Tokelau + Osttimor + Turkmenistan + Tunesien + Tonga + Türkei + Trinidad und Tobago + Tuvalu + Taiwan + Tansania + Ukraine + Uganda + Amerikanisch-Ozeanien + Vereinigte Staaten + Uruguay + Usbekistan + Vatikanstadt + St. Vincent und die Grenadinen + Venezuela + Britische Jungferninseln + Amerikanische Jungferninseln + Vietnam + Vanuatu + Wallis und Futuna + Samoa + Jemen + Mayotte + Südafrika + Sambia + Simbabwe + Unbekannte oder ungültige Region + + + Alte deutsche Rechtschreibung + Standardisierte Resianische Rechtschreibung + Neue deutsche Rechtschreibung + Spätes Mittelfranzösisch + Klassisches Französisch + Ostarmenisch + Westarmenisch + Einheitliches Türkisches Alphabet + Bela-Dialekt + Boontling + IPA Phonetisch + Phonetisch (UPA) + Lipovaz-Dialekt + Monotonisch + Natisone-Dialekt + Njiva-Dialekt + Osojane-Dialekt + Polytonisch + Posix + Revidierte Rechtschreibung + Resianisch + Saho + Schottisches Standardenglisch + Scouse-Dialekt + Solbica-Dialekt + Taraskievica-Orthographie + Valencianisch + + + Kalender + Sortierung + Währung + + + Traditionelles Chinesisch - Big5 + Buddhistischer Kalender + Chinesischer Kalender + Direkte Sortierregeln + Vereinfachtes Chinesisch - GB2312 + Gregorianischer Kalender + Hebräischer Kalender + Indischer Nationalkalender + Islamischer Kalender + Bürgerlicher islamischer Kalender + Japanischer Kalender + Telefonbuch-Sortierregeln + Pinyin-Sortierregeln + Kalender der Republik China + Strichfolge + Traditionelle Sortierregeln + + + Angloamerikanisch + Metrisch + + + Sprache: {0} + Schrift: {0} + Region: {0} + + + + [a ä b-o ö p-s ß t u ü v-z] + [á à ă â å ä ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ß ú ù ŭ û ü ū ÿ] + [a-z] + + + „ + “ + ‚ + ‘ + + + {0}−{1} + + + vorm. + nachm. + + + + EEEE d. MMMM y G + + + + + d. MMMM y G + + + + + d. MMM y G + + + + + d.M.yyyy + + + + + + vorm. + nachm. + + + vorm. + nachm. + + + + + + Jan + Feb + Mär + Apr + Mai + Jun + Jul + Aug + Sep + Okt + Nov + Dez + + + Januar + Februar + März + April + Mai + Juni + Juli + August + September + Oktober + November + Dezember + + + + + Mär + Jul + Aug + Sep + Okt + Nov + Dez + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + So. + Mo. + Di. + Mi. + Do. + Fr. + Sa. + + + Sonntag + Montag + Dienstag + Mittwoch + Donnerstag + Freitag + Samstag + + + + + S + M + D + M + D + F + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1. Quartal + 2. Quartal + 3. Quartal + 4. Quartal + + + + + 1 + 2 + 3 + 4 + + + + vorm. + nachm. + + + v. Chr. + n. Chr. + + + v. Chr. + n. Chr. + + + + + + EEEE, d. MMMM y + + + + + d. MMMM y + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d. EEE + E d. + H + HH:mm + HH:mm:ss + H:mm + L + E, d.M. + LLL + E d. MMM + E d. MMMM + d. MMMM + dd. MMMM + d. MMM + d.MM. + dd.MM. + d.M. + d + mm:ss + mm:ss + y + yyyy-M + EEE, yyyy-M-d + MMM y + EEE, d. MMM y + MMMM y + Q yyyy + QQQ y + MM.yy + MMM yy + dd.MM.yy + Q yy + QQQQ yy + y + MMMM y + + + {0} - {1} + + M.-M. + + + E, dd.MM. - E, dd.MM. + E, dd.MM. - E, dd.MM. + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. - E, d. MMM + + + LLLL-LLLL + + + d. MMM - d. MMM + d.-d. MMM + + + dd.MM. - dd.MM. + dd.MM. - dd.MM. + + + d.-d. + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM y + MMM y - MMM y + + + E, d. MMM - E, d. MMM y + E, d. - E, d. MMM y + E, d. MMM y - E, d. MMM y + + + MM – MM.yyyy + MM.yyyy – MM.yyyy + + + d. MMM - d. MMM y + d.-d. MMM y + d. MMM y - d. MMM y + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + Epoche + + + Jahr + + + Monat + + + Woche + + + Tag + Vor drei Tagen + Vorgestern + Gestern + Heute + Morgen + Übermorgen + In drei Tagen + + + Wochentag + + + Tageshälfte + + + Stunde + + + Minute + + + Sekunde + + + Zone + + + + + vorm. + nachm. + + + vorm. + nachm. + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Unbekannt + + + Tirana + + + Erivan + + + Curaçao + + + Südpol + + + Wostok + + + Dumont D'Urville + + + Wien + + + Brüssel + + + Wagadugu + + + Bermudas + + + Zürich + + + Osterinsel + + + Havanna + + + Kap Verde + + + Weihnachts-Inseln + + + Nikosia + + + Dschibuti + + + Kopenhagen + + + Algier + + + Kairo + + + El Aaiún + + + Kanaren + + + Addis Abeba + + + Fidschi + + + Färöer + + + Tiflis + + + Akkra + + + Athen + + + Süd-Georgien + + + Hongkong + + + Bagdad + + + Teheran + + + Rom + + + Jamaika + + + Tokio + + + Bischkek + + + Komoren + + + St. Kitts + + + Pjöngjang + + + Kaimaninseln + + + Aktobe + + + St. Lucia + + + Wilna + + + Luxemburg + + + Tripolis + + + Kischinau + + + Macao + + + Malediven + + + Mexiko-Stadt + + + Niger + + + Muskat + + + Warschau + + + Azoren + + + Lissabon + + + Asunción + + + Katar + + + Réunion + + + Bukarest + + + Moskau + + + Jekaterinburg + + + Nowosibirsk + + + Krasnojarsk + + + Jakutsk + + + Wladiwostok + + + Sachalin + + + Kamtschatka + + + Riad + + + Khartum + + + Singapur + + + St. Helena + + + Mogadischu + + + São Tomé + + + Salvador + + + Damaskus + + + Duschanbe + + + Port-of-Spain + + + Taipeh + + + Daressalam + + + Uschgorod + + + Kiew + + + Saporischja + + + Knox + + + Taschkent + + + St. Vincent + + + St. Thomas + + + + Acre-Zeit + Acre-Sommerzeit + + + + + Afghanistan-Zeit + + + + + Zentralafrikanische Zeit + + + + + Ostafrikanische Zeit + + + + + Südafrikanische Zeit + Südafrikanische Standardzeit + + + + + Westafrikanische Zeit + Westafrikanische Sommerzeit + + + + + Aktyubinsk-Zeit + Aktyubinsk-Sommerzeit + + + + + Alaska-Zeit + Alaska-Standardzeit + + true + + + + Alaska-Hawaii-Zeit + Alaska-Hawaii-Standardzeit + + + + + Almaty-Zeit + Almaty-Sommerzeit + + + + + Amazonas-Sommerzeit + + + + + Mitteleuropäische Zeit + Mitteleuropäische Sommerzeit + + + MEZ + MESZ + + true + + + + Osteuropäische Zeit + Osteuropäische Sommerzeit + + + OEZ + OESZ + + + + + Westeuropäische Zeit + Westeuropäische Sommerzeit + + + WEZ + WESZ + + + + + Moskauer Zeit + Moskauer Sommerzeit + + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + Andorranische Pesete + Andorranische Peseten + + + UAE Dirham + UAE Dirham + + + Afghani (1927-2002) + Afghani (1927-2002) + + + Afghani + Afghani + + + Lek + Albanische Lek + + + Dram + Armenische Dram + + + Niederl. Antillen Gulden + Niederländische-Antillen-Gulden + + + Kwanza + Angolanische Kwanza + + + Angolanischer Kwanza (1977-1990) + Angolanische Kwanza (AOK) + + + Neuer Kwanza + Angolanische Neue Kwanza (AON) + + + Kwanza Reajustado + Angolanische Kwanza Reajustado (AOR) + + + Argentinischer Austral + Argentinische Austral + + + Argentinischer Peso (1983-1985) + Argentinische Peso (ARP) + + + Argentinischer Peso + Argentinische Peso + + + Österreichischer Schilling + Österreichische Schilling + öS + + + Australischer Dollar + Australische Dollar + + + Aruba Florin + Aruba Florin + + + Aserbaidschan-Manat (1993-2006) + Aserbaidschan-Manat (AZM) + + + Aserbaidschan-Manat + Aserbaidschan-Manat + + + Bosnien und Herzegowina Dinar + Bosnien und Herzegowina Dinar + + + Konvertierbare Mark + Bosnien und Herzegowina Konvertierbare Mark + + + Barbados-Dollar + Barbados-Dollar + + + Taka + Taka + + + Belgischer Franc (konvertibel) + Belgische Franc (konvertibel) + + + Belgischer Franc + Belgische Franc + + + Belgischer Finanz-Franc + Belgische Finanz-Franc + + + Lew (1962-1999) + Bulgarische Lew + + + Lew + Bulgarische Lew (BGN) + + + Bahrain-Dinar + Bahrain-Dinar + + + Burundi-Franc + Burundi-Franc + + + Bermuda-Dollar + Bermuda-Dollar + + + Brunei-Dollar + Brunei-Dollar + + + Boliviano + Boliviano + + + Bolivianischer Peso + Bolivianische Peso + + + Mvdol + Bolivianische Mvdol + + + Brasilianischer Cruzeiro Novo (1967-1986) + Brasilianische Cruzeiro Novo (BRB) + + + Brasilianischer Cruzado + Brasilianische Cruzado + + + Brasilianischer Cruzeiro (1990-1993) + Brasilianische Cruzeiro (BRE) + + + Real + Brasilianische Real + + + Brasilianischer Cruzado Novo + Brasilianische Cruzado Novo + + + Brasilianischer Cruzeiro + Brasilianische Cruzeiro + + + Bahama-Dollar + Bahama-Dollar + + + Ngultrum + Bhutanische Ngultrum + + + Birmanischer Kyat + Birmanische Kyat + + + Pula + Botswanische Pula + + + Belarus Rubel (alt) + Belarus-Rubel (BYB) + + + Belarus Rubel (neu) + Belarus-Rubel + + + Belize-Dollar + Belize-Dollar + + + Kanadischer Dollar + Kanadische Dollar + + + Franc congolais + Franc congolais + + + WIR-Euro + + + Schweizer Franken + Schweizer Franken + + + WIR Franken + WIR Franken + + + Unidades de Fomento + Chilenische Unidades de Fomento + + + Chilenischer Peso + Chilenische Pesos + + + Renminbi Yuan + Renminbi Yuan + + + Kolumbianischer Peso + Kolumbianische Pesos + + + Unidad de Valor Real + Unidad de Valor Real + + + Costa Rica Colon + Costa Rica Colon + + + Alter Serbischer Dinar + Alte Serbische Dinar + + + Tschechoslowakische Krone + Tschechoslowakische Kronen + + + Kubanischer Peso + Kubanische Pesos + + + Kap Verde Escudo + Kap Verde Escudo + + + Zypern-Pfund + Zypern Pfund + + + Tschechische Krone + Tschechische Kronen + + + Mark der DDR + Mark der DDR + + + Deutsche Mark + Deutsche Mark + + + Dschibuti-Franc + Dschibuti-Franc + + + Dänische Krone + Dänische Kronen + + + Dominikanischer Peso + Dominikanische Pesos + + + Algerischer Dinar + Algerische Dinar + + + Ecuadorianischer Sucre + Ecuadorianische Sucre + + + Verrechnungseinheit für EC + Verrechnungseinheiten für EC + + + Estnische Krone + Estnische Kronen + + + Ägyptisches Pfund + Ägyptische Pfund + + + Nakfa + Eritreische Nakfa + + + Spanische Peseta (A-Konten) + Spanische Peseten (A-Konten) + + + Spanische Peseta (konvertibel) + Spanische Peseten (konvertibel) + + + Spanische Peseta + Spanische Peseten + + + Birr + Äthiopische Birr + + + Euro + Euro + + + Finnische Mark + Finnische Mark + + + Fidschi-Dollar + Fidschi Dollar + + + Falkland-Pfund + Falkland Pfund + + + Französischer Franc + Französische Franc + + + Pfund Sterling + Pfund Sterling + + + Georgischer Kupon Larit + Georgische Kupon Larit + + + Georgischer Lari + Georgische Lari + + + Cedi + Cedi + + + Ghanaische Cedi + + + Gibraltar-Pfund + Gibraltar Pfund + + + Dalasi + Gambische Dalasi + + + Guinea-Franc + Guinea Franc + + + Guineischer Syli + Guineische Syli + + + Ekwele + Äquatorialguinea-Ekwele + + + Griechische Drachme + Griechische Drachmen + + + Quetzal + Quetzal + + + Portugiesisch Guinea Escudo + Portugiesisch Guinea Escudo + + + Guinea Bissau Peso + Guinea-Bissau Pesos + + + Guyana-Dollar + Guyana Dollar + + + Hongkong-Dollar + Hongkong-Dollar + + + Lempira + Lempira + + + Kroatischer Dinar + Kroatische Dinar + + + Kuna + Kuna + + + Gourde + Gourde + + + Forint + Forint + + + Rupiah + Rupiah + + + Irisches Pfund + Irische Pfund + + + Israelisches Pfund + Israelische Pfund + + + Schekel + Neue Schekel + + + Indische Rupie + Indische Rupien + + + Irak Dinar + Irak Dinar + + + Rial + Rial + + + Isländische Krone + Isländische Kronen + + + Italienische Lira + Italienische Lire + ₤ + + + Jamaika-Dollar + Jamaika Dollar + + + Jordanischer Dinar + Jordanische Dinar + + + Yen + Yen + ¥ + + + Kenia-Schilling + Kenia Schilling + + + Som + Som + + + Riel + Riel + + + Komoren Franc + Komoren-Franc + + + Nordkoreanischer Won + Nordkoreanische Won + + + Südkoreanischer Won + Südkoreanische Won + + + Kuwait Dinar + Kuwait Dinar + + + Kaiman-Dollar + Kaiman-Dollar + + + Tenge + Tenge + + + Kip + Kip + + + Libanesisches Pfund + Libanesische Pfund + + + Sri Lanka Rupie + Sri Lanka Rupie + + + Liberianischer Dollar + Liberianische Dollar + + + Loti + Loti + + + Litauischer Litas + Litauische Litas + + + Litauischer Talonas + Litauische Talonas + + + Luxemburgischer Franc (konvertibel) + Luxemburgische Franc (konvertibel) + + + Luxemburgischer Franc + Luxemburgische Franc + + + Luxemburgischer Finanz-Franc + Luxemburgische Finanz-Franc + + + Lettischer Lats + Lettische Lats + + + Lettischer Rubel + Lettische Rubel + + + Libyscher Dinar + Libysche Dinar + + + Marokkanischer Dirham + Marokkanische Dirham + + + Marokkanischer Franc + Marokkanische Franc + + + Moldau Leu + Moldau Leu + + + Madagaskar Ariary + Madagaskar Ariary + + + Madagaskar-Franc + Madagaskar-Franc + + + Denar + Denar + + + Malischer Franc + Malische Franc + + + Kyat + Kyat + + + Tugrik + Tugrik + + + Pataca + Pataca + + + Ouguiya + Ouguiya + + + Maltesische Lira + Maltesische Lira + + + Maltesisches Pfund + Maltesische Pfund + + + Mauritius-Rupie + Mauritius Rupie + + + Rufiyaa + Rufiyaa + + + Malawi Kwacha + Malawi-Kwacha + + + Mexikanischer Peso + Mexikanische Pesos + + + Mexikanischer Silber-Peso (1861-1992) + Mexikanische Silber-Pesos (MXP) + + + Mexican Unidad de Inversion (UDI) + Mexikanische Unidad de Inversion (UDI) + + + Malaysischer Ringgit + Malaysische Ringgit + + + Mosambikanischer Escudo + Mozambikanische Escudo + + + Alter Metical + Alte Metical + + + Metical + Metical + + + Namibia-Dollar + Namibia-Dollar + + + Naira + Naira + + + Cordoba + Cordoba + + + Gold-Cordoba + Gold-Cordoba + + + Holländischer Gulden + Holländische Gulden + + + Norwegische Krone + Norwegische Kronen + + + Nepalesische Rupie + Nepalesische Rupien + + + Neuseeland-Dollar + Neuseeland-Dollar + + + Rial Omani + Rial Omani + + + Balboa + Balboa + + + Peruanischer Inti + Peruanische Inti + + + Neuer Sol + Neue Sol + + + Sol + Sol + + + Kina + Kina + + + Philippinischer Peso + Philippinische Peso + + + Pakistanische Rupie + Pakistanische Rupien + + + Zloty + Zloty + + + Zloty (1950-1995) + Zloty (PLZ) + + + Portugiesischer Escudo + Portugiesische Escudo + + + Guarani + Guarani + + + Katar Riyal + Katar Riyal + + + Rhodesischer Dollar + Rhodesische Dollar + + + Leu + Leu + + + Rumänischer Leu + Rumänische Leu + + + Serbischer Dinar + Serbische Dinar + + + Russischer Rubel (neu) + Russische Rubel (neu) + + + Russischer Rubel (alt) + Russische Rubel (alt) + + + Ruanda-Franc + Ruanda-Franc + + + Saudi Riyal + Saudi Riyal + + + Salomonen-Dollar + Salomonen-Dollar + + + Seychellen-Rupie + Seychellen-Rupien + + + Sudanesischer Dinar + Sudanesische Dinar + + + Sudanesisches Pfund + Sudanesische Pfund + + + Sudanesisches Pfund (alt) + Sudanesische Pfund (alt) + + + Schwedische Krone + Schwedische Kronen + + + Singapur-Dollar + Singapur-Dollar + + + St. Helena Pfund + St. Helena-Pfund + + + Tolar + Tolar + + + Slowakische Krone + Slowakische Kronen + + + Leone + Leone + + + Somalia-Schilling + Somalia-Schilling + + + Surinamischer Dollar + Surinamische Dollar + + + Suriname Gulden + Suriname-Gulden + + + Dobra + Dobra + + + Sowjetischer Rubel + Sowjetische Rubel + + + El Salvador Colon + El Salvador-Colon + + + Syrisches Pfund + Syrische Pfund + + + Lilangeni + Lilangeni + + + Baht + Baht + + + Tadschikistan Rubel + Tadschikistan-Rubel + + + Tadschikistan Somoni + Tadschikistan-Somoni + + + Turkmenistan-Manat + Turkmenistan-Manat + + + Tunesischer Dinar + Tunesische Dinar + + + Paʻanga + Paʻanga + + + Timor-Escudo + Timor-Escudo + + + Alte Türkische Lira + Alte Türkische Lira + Alte Türkische Lire + + + Türkische Lira + Türkische Lira + Türkische Lira + + + Trinidad- und Tobago-Dollar + Trinidad und Tobago-Dollar + + + Neuer Taiwan-Dollar + Neuer Taiwan Dollar + + + Tansania-Schilling + Tansania-Schilling + + + Hryvnia + Hryvnia + + + Ukrainischer Karbovanetz + Ukrainische Karbovanetz + + + Uganda-Schilling (1966-1987) + Uganda-Schilling (UGS) + + + Uganda-Schilling + Uganda-Schilling + + + US-Dollar + US-Dollar + $ + + + US Dollar (Nächster Tag) + US-Dollar (Nächster Tag) + + + US Dollar (Gleicher Tag) + US-Dollar (Gleicher Tag) + + + UYU + + + Uruguayischer Neuer Peso (1975-1993) + Uruguayische Pesos (UYP) + + + Uruguayischer Peso + Uruguayische Pesos + + + Usbekistan Sum + Usbekistan-Sum + + + Bolivar + Bolivar + + + Bolívar Fuerte + + + Dong + Dong + + + Vatu + Vatu + + + Tala + Tala + + + CFA Franc (Äquatorial) + CFA-Franc (BEAC) + + + Unze Silber + Unze Silber + Silber + + + Unze Gold + Unze Gold + Gold + + + Europäische Rechnungseinheit + Europäische Rechnungseinheiten + + + Europäische Währungseinheit (XBB) + Europäische Währungseinheiten (XBB) + + + Europäische Rechnungseinheit (XBC) + Europäische Rechnungseinheiten (XBC) + + + Europäische Rechnungseinheit (XBD) + Europäische Rechnungseinheiten (XBD) + + + Ostkaribischer Dollar + Ostkaribische Dollar + + + Sonderziehungsrechte + Sonderziehungsrechte + + + Europäische Währungseinheit (XEU) + Europäische Währungseinheiten (XEU) + + + Französischer Gold-Franc + Französische Gold-Franc + + + Französischer UIC-Franc + Französische UIC-Franc + + + CFA Franc (West) + CFA-Franc (BCEAO) + + + Unze Palladium + Unze Palladium + Palladium + + + CFP Franc + CFP-Franc + + + Unze Platin + Unze Platin + Platin + + + RINET Funds + RINET Funds + + + Testwährung + Testwährung + + + Unbekannte Währung + Unbekannte Währung + Unbekannte Währung + + + Jemen-Dinar + Jemen-Dinar + + + Jemen-Rial + Jemen-Rial + + + Jugoslawischer Dinar (1966-1990) + Jugoslawische Dinar + + + Neuer Dinar + Jugoslawische Neue Dinar + + + Jugoslawischer Dinar (konvertibel) + Jugoslawische Dinar (konvertibel) + + + Südafrikanischer Rand (Finanz) + Südafrikanischer Rand (Finanz) + Südafrikanischer Rand (Finanz) + + + Südafrikanischer Rand + Südafrikanischer Rand + Rand + + + Kwacha + Kwacha + + + Neuer Zaire + Neue Zaire + + + Zaire + Zaire + + + Simbabwe-Dollar + Simbabwe-Dollar + + + + + + {0} Tag + {0} Tage + + + {0} Stunde + {0} Stunden + + + {0} Minute + {0} Minuten + + + {0} Monat + {0} Monate + + + {0} Sekunde + {0} Sekunden + + + {0} Woche + {0} Wochen + + + {0} Jahr + {0} Jahre + + + + + ja:j + nein:n + + + + diff --git a/lib/zend/Zend/Locale/Data/de_AT.xml b/lib/zend/Zend/Locale/Data/de_AT.xml new file mode 100644 index 0000000000..dbe90a15fd --- /dev/null +++ b/lib/zend/Zend/Locale/Data/de_AT.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + Jän + + + Jänner + + + + + + + EEEE, dd. MMMM y + + + + + dd. MMMM y + + + + + + + E, dd. MMM - E, dd. MMM + E, dd. - E, dd. MMM + + + dd. MMM - dd. MMM + dd.-dd. MMM + + + E, dd. MMM - E, dd. MMM y + E, dd. - E, dd. MMM y + E, dd. MMM y - E, dd. MMM y + + + dd. MMM - dd. MMM y + dd.-dd. MMM y + dd. MMM y - dd. MMM y + + + + + + + + + + + ¤ #,##0.00 + + + + + + diff --git a/lib/zend/Zend/Locale/Data/de_BE.xml b/lib/zend/Zend/Locale/Data/de_BE.xml new file mode 100644 index 0000000000..2f225b6391 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/de_BE.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + Son + Mon + Die + Mit + Don + Fre + Sam + + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d/MM/yy + + + + + + + HH 'h' mm 'min' ss 's' zzzz + + + + + + d MMMM + MM/yy + + + + M-M + + + E d/MM - E d/MM + E d/MM - E d/MM + + + E d MMM - E d MMM + E d - E d MMM + + + d MMM - d MMM + d-d MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + E d MMM - E d MMM y + E d - E d MMM y + E d MMM y - E d MMM y + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + + Franken + + + + + diff --git a/lib/zend/Zend/Locale/Data/de_CH.xml b/lib/zend/Zend/Locale/Data/de_CH.xml new file mode 100644 index 0000000000..ae86a65f8a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/de_CH.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + Weissrussisch + + + Bangladesh + Brunei + Botswana + Weissrussland + Kapverden + Djibouti + Grossbritannien + Marshall-Inseln + Äusseres Ozeanien + Rwanda + Salomon-Inseln + Sao Tomé und Principe + Zimbabwe + + + + « + » + ‹ + › + + + + + + + MM-dd + + + + + + + + . + ' + + + + + ¤ #,##0.00;¤-#,##0.00 + + + + + + diff --git a/lib/zend/Zend/Locale/Data/de_DE.xml b/lib/zend/Zend/Locale/Data/de_DE.xml new file mode 100644 index 0000000000..3c89254317 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/de_DE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/de_LI.xml b/lib/zend/Zend/Locale/Data/de_LI.xml new file mode 100644 index 0000000000..cf4f93264f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/de_LI.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + . + ' + + + + + ¤ #,##0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/de_LU.xml b/lib/zend/Zend/Locale/Data/de_LU.xml new file mode 100644 index 0000000000..810fe1e871 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/de_LU.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + F + . + , + + + + diff --git a/lib/zend/Zend/Locale/Data/dv.xml b/lib/zend/Zend/Locale/Data/dv.xml new file mode 100644 index 0000000000..22b155366e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/dv.xml @@ -0,0 +1,226 @@ + + + + + + + + + + + ދިވެހިބަސް + + + ދިވެހި ރާއްޖެ + + + + + + + [ހ-ޗ \u07A6-\u07B0] + [\u200C \u200D ޙ ޚ ޜ ޢ ޣ ޥ ޛ ޘ ޠ ޡ ޤ ޝ-ޟ ޱ] + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + dd-MM-yyyy + + + + + d-M-yy + + + + + + + hh:mm:ss a zzzz + + + + + hh:mm:ss a z + + + + + hh:mm:ss a + + + + + hh:mm a + + + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + ، + ٠ + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + ރ. + + + + + diff --git a/lib/zend/Zend/Locale/Data/dv_MV.xml b/lib/zend/Zend/Locale/Data/dv_MV.xml new file mode 100644 index 0000000000..b15766bc3a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/dv_MV.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/dz.xml b/lib/zend/Zend/Locale/Data/dz.xml new file mode 100644 index 0000000000..1506c09f18 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/dz.xml @@ -0,0 +1,407 @@ + + + + + + + + + + + ཨེ་ར་སྦིག + བཟོ་བཟོཝ (གཞན) + ཨ་ས་མི་སི + བི་ཧ་ལི + བེངྒ་ལི + བོད་ཁ + ཅེཀ + ཌེ་ནིཤ + ཇཱར་མཱན + དི་བེ་ཧི + རྫོང་ཁ + ཨི་ཇིཔ་ཤཱན (སྔ་དུས་ཀྱི) + གིརིཀ + ཨིང་ལིཤ + སིཔེ་ནིཤ + པར་ཤི་ཡན + ཕེ་རེནཆེ + ཨའི་རིཤ + གིརིཀ, སྔ་དུས་ཀྱི (༡༤༥༣) + ཧི་བུརུ + ཧིན་དི + ཧི་མ་ཅ་ལི + ཨིན་ཌིཀ (གཞན) + ཨི་ཊ་ལི་རན + ཁེ་མར + ཀ་ན་ཌ + ཀོ་རིཡན + ཀེཤ་མི་རི + ལའོ + མ་ལ་ཡ་ལམ + སོག་པོའི་ཁ + མཱན་ཅུ + མ་ནི་པུ་རི + མ་ར་ཐི + བར་མིསི + ནེ་པ་ལི + ནི་ཝ་རི + ཌཆ + ནོར་ཝི་ཇི་ཡན + ཨོ་རི་ཡ + པཱན་ཇ་བི + པ་ལི + ར་ཤི་ཡན + སཾསྐྲྀཏ + སིན་ཧ་ལིསི + ཏ་མིལ + ཏེ་ལུ་གུ + ཐཱའེ + ཨུར་དུ + རགྱ་མི་ཁ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ཡུ་ནའི་ཊེཊ་ཨ་ར བ་ཨེ་མི་རེཊསི + ཨཕ་ག་ནིསི་ཏཱན + ཨེན་ཊཱག་ཊི་ཀ + ཨར་ཇེན་ཊི་ན + ཨས་ཊི་ཡ + ཨས་ཊེཡེ་ལི་ཡ + བངྒ་ལ་དེཤ + བེལ་ཇིཡམ + བཧ་རེན + བཱརཱ་ཛིལ + འབྲུག + ཀེ་ན་ཌ + སུའིཊ་ཛར་ལེན + རྒྱ་མི + ཀིའུ་སྦ + ཅེཀ་རི་པབ་ལིཀ + ཇཱར་མ་ནི + ཌེན་མཱཀ + ཨི་ཇིཔཊ + སིཔཱེན + ཕིན་ལེནཌ + ཕརཱནསི + ཡུ་ནའི་ཊེཊ་ཀིང་ཌམ + གིརིསི + ཧོང་ཀོང + ཨའིརི་ལེནཌ + ཨིཛ་རཱེལ + རྒྱ་གར + ཨི་རཀ + ཨི་རཱན + ཨའིསི་ལེནཌ + ཨྀཊ་ལི + ཇ་མའི་ཀ + ཇ་པཱན + ཀེ་ནི་ཡ + ཀམ་བོ་ཌི་ཡ + བྱང་ཀོ་རི་ཡ + ལྷོ་ཀོ་རི་ཡ + ཀུ་ཝེཊ + ལ་འོསུ + ལེ་བཱ་ནཱོན + ཤྲཱྀ་ལངཀ + མེ་མར + སོག་པོ + མོན་ས་རཊི + མོ་རི་ཤིཡསི + མཱལ་ཌིབས + མེཀསི་ཀོ + མ་ལེ་ཤི་ཡ + ནེ་དར་ལེནཌསི + ནོ་ཝེ + བལ་ཡུལ + ནིའུ་ཛི་ལེནཌ + པ་ན་མཱ + པ་ཀིསི་ཏཱན + པེ་ལིསི་ཊི་ནིཡ ན་ཊེ་རི་ངོ་རི + པོར་ཅུ་གལ + ཀ་ཏར + སའུ་དི་ཨེ་ར་སྦི་ཡ + སུའི་ཌན + སིལོ་བེ་ནི་ཡ + ཐཱའི་ལེནཌ + ཏ་ཇག་ཀིསི་ཏཱན + ཏའི་ཝཱན + ཡུ་ནའིཊེཊ་སི་ཊེསི + ཨུཛ་བེ་ཀིསི་ཏཱན + བེཊ་ནཱམ + སའུཐ་ཨཕ་རི་ཀ + ཛམ་བི་ཡ + ཛིམ་བབ་ཝེ + + + གནས་སདུད་རིམ་ སགྲིག + + + ལུགས་སྲོལ + + + + [ཀ \u0F90 ཁ \u0F91 ག \u0F92 ང \u0F94 ཅ-ཇ \u0F97 ཉ \u0F99 ཏ \u0F9F ཐ ད \u0FA1 ན \u0FA3 པ \u0FA4 ཕ བ \u0FA6 མ \u0FA8 ཙ \u0FA9 ཚ ཛ \u0FAB ཝ \u0FAD ཞ-ཡ \u0FB1 ར \u0FB2 ལ \u0FB3 ཤ \u0FB5 ས ཧ \u0FB7 ཨ \u0F72 \u0F74 \u0F7A \u0F7C] + [ཊ-ཌ ཎ ཥ] + + + " + " + ' + ' + + + + + + + + ཟླ་ ༡ + ཟླ་ ༢ + ཟླ་ ༣ + ཟླ་ ༤ + ཟླ་ ༥ + ཟླ་ ༦ + ཟླ་ ༧ + ཟླ་ ༨ + ཟླ་ ༩ + ཟླ་ ༡༠ + ཟླ་ ༡༡ + ཟླ་ ༡༢ + + + སྤྱི་ཟླཝ་དངཔ་ + སྤྱི་ཟླཝ་གཉིས་པ་ + སྤྱི་ཟླཝ་གསུམ་པ་ + སྤྱི་ཟླཝ་བཞི་པ་ + སྤྱི་ཟླཝ་ལྔ་པ་ + སྤྱི་ཟླཝ་དྲུག་པ་ + སྤྱི་ཟླཝ་བདུན་པ་ + སྤྱི་ཟླཝ་བརྒྱད་པ་ + སྤྱི་ཟླཝ་དགུ་པ་ + སྤྱི་ཟླཝ་བཅུ་པ་ + སྤྱི་ཟླཝ་བཅུ་གཅིག་པ་ + སྤྱི་ཟླཝ་བཅུ་གཉིས་པ་ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ཟླ་ + མིར་ + ལྷག་ + ཕུར་ + སངས་ + སྤེན་ + ཉི་ + + + གཟའ་ཟླ་བ་ + གཟའ་མིག་དམར་ + གཟའ་ལྷག་པ་ + གཟའ་ཕུར་བུ་ + གཟའ་པ་སངས་ + གཟའ་སྤེན་པ་ + གཟའ་ཉི་མ་ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + བཞི་དཔྱ་༡ + བཞི་དཔྱ་༢ + བཞི་དཔྱ་༣ + བཞི་དཔྱ་༤ + + + བཞི་དཔྱ་དང་པ་ + བཞི་དཔྱ་གཉིས་པ་ + བཞི་དཔྱ་གསུམ་པ་ + བཞི་དཔྱ་བཞི་པ་ + + + + སྔ་ཆ་ + ཕྱི་ཆ་ + + + BCE + CE + + + + + + སྤྱི་ལོ་y ཟླ་ MMMM ཚེས་ dd + + + + + སྤྱི་ལོ་y ཟླ་ MMMM ཚེས་ dd + + + + + སྤྱི་ལོ་y ཟླ་ MMM ཚེས་ dd + + + + + yyyy-MM-dd + + + + + + + + ཆུ་ཚོད་ h སྐར་མ་ mm སྐར་ཆཱ་ ss a zzzz + + + + + ཆུ་ཚོད་ h སྐར་མ་ mm སྐར་ཆཱ་ ss a z + + + + + ཆུ་ཚོད་h:mm:ss a + + + + + ཆུ་ཚོད་ h སྐར་མ་ mm a + + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + ཐིམ་ཕུག + + + + Bhutan Time + Bhutan Standard Time + + + BT + BST + + + + + + + དང་ + བརྒ་ཆཱ + ༠ + གྲངས་མེད + ཨང་མད + + + + + #,##,##0.### + + + + + + + #E+00 + + + + + + + #,##,##0 % + + + + + + + ¤#,##,##0.00 + + + + + + དངུལ་ཀྲམ་ + + + + + diff --git a/lib/zend/Zend/Locale/Data/dz_BT.xml b/lib/zend/Zend/Locale/Data/dz_BT.xml new file mode 100644 index 0000000000..44fc6706cc --- /dev/null +++ b/lib/zend/Zend/Locale/Data/dz_BT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ee.xml b/lib/zend/Zend/Locale/Data/ee.xml new file mode 100644 index 0000000000..f311a9af54 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ee.xml @@ -0,0 +1,193 @@ + + + + + + + + + + [a b d {dz} ɖ e ɛ f ƒ g {gb} ɣ h i k {kp} l-n {ny} ŋ o ɔ p r-t {ts} u v ʋ w-z] + [c j q] + + + + + + + + Dzv + Dzd + Ted + Afɔ + Dam + Mas + Sia + Dea + Any + Kel + Ade + Dzm + + + Dzove + Dzodze + Tedoxe + Afɔfiɛ + Dama + Masa + Siamlɔm + Deasiamime + Anyɔnyɔ + Kele + Adeɛmekpɔxe + Dzome + + + + + D + D + T + A + D + M + S + D + A + K + A + D + + + + + + + Kɔs Kwe + Dzo + Bra + Kuɖ + Yaw + Fiɖ + Mem + + + Kɔsiɖa + Dzoɖa + Braɖa + Kuɖa + Yawoɖa + Fiɖa + Memleɖa + + + + + K + D + B + K + Y + F + M + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AN + EW + + + Hafi Yesu Va Do ŋgɔ na Yesu + Yesu Ŋɔli + + + HY + YŊ + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Siɖi + + + Sefa + + + + + diff --git a/lib/zend/Zend/Locale/Data/ee_GH.xml b/lib/zend/Zend/Locale/Data/ee_GH.xml new file mode 100644 index 0000000000..0f70ec6471 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ee_GH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ee_TG.xml b/lib/zend/Zend/Locale/Data/ee_TG.xml new file mode 100644 index 0000000000..8458f7843e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ee_TG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/el.xml b/lib/zend/Zend/Locale/Data/el.xml new file mode 100644 index 0000000000..6cbbce706a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/el.xml @@ -0,0 +1,4125 @@ + + + + + + + + + + + Αφάρ + Αμπχαζικά + Αχινίζ + Ακολί + Αντάνγκμε + Αντιγκέα + Αβεστάν + Αφρικάανς + Αφροασιατική γλώσσα + Αφριχίλι + Αϊνού + Ακάν + Ακάντιαν + Αλούτ + Γλώσσα Αλγκονκιάν + Νότια Αλαταϊκά + Αμαρικά + Αραγκονικά + Παλαιά Αγγλικά + Ανγκικά + Γλώσσα Απάτσι + Αραβικά + Αραμαϊκά + Αρουκάνιαν + Αράπαχο + Τεχνητή γλώσσα + Αραγουάκ + Ασαμεζικά + Αστουριανά + Γλώσσα Αθαπάσκαν + Αυστραλιανή γλώσσα + Άβαρικ + Αγουαντί + Αϊμάρα + Αζερμπαϊτζανικά + Μπασκίρ + Μπάντα + Γλώσσα Μπαμιλέκ + Μπαλούτσι + Μπαλινίζ + Μπάσα + Βαλτική γλώσσα + Λευκορωσικά + Μπέζα + Μπέμπα + Μπέρμπερ + Βουλγαρικά + Μπιχάρι + Μποζπούρι + Μπισλάμα + Μπικόλ + Μπίνι + Σικσίκα + Μπαμπάρα + Μπενγκάλι + Μπαντού + Θιβετιανά + Βρετονικά + Μπρατζ + Βοσνιακά + Μπατάκ + Μπουριάτ + Μπουγκίζ + Μπλιν + Καταλανικά + Κάντο + Ινδιανική γλώσσα Κεντρικής Αμερικής + Καρίμπ + Καυκάσια γλώσσα + Ατσάμ + Τσέτσνιαν + Κεμπουάνο + Κελτική γλώσσα + Καμόρρο + Τσίμπτσα + Τσαγκατάι + Τσουκίζι + Μάρι + Ιδιωματικά Σινούκ + Τσοκτάου + Τσίπιουαν + Τσερόκι + Σεγιέν + Χαμική γλώσσα + Κορσικανικά + Κοπτικά + Κρεόλ ή Πίντγκιν βάσει Αγγλικών + Κρεόλ ή Πίντγκιν βάσει Γαλλικών + Κρεόλ και Πίντγκιν βάσει Πορτογαλικών + Κρι + Τουρκικά Κριμαίας + Κρεόλ ή Πίντγκιν + Τσεχικά + Κασούμπιαν + Εκκλησιαστικά Σλαβικά + Γλώσσα Κουσιτίκ + Χουβάς + Ουαλικά + Δανικά + Ντακότα + Ντάργκουα + Νταγιάκ + Γερμανικά + Γερμανικά Αυστρίας + Γερμανικά Ελβετίας + Ντέλαγουερ + Σλαβικά + Ντόγκριμπ + Ντίνκα + Ντόγκρι + Γλώσσα Ντραβίδιαν + Γλώσσα Κάτω Λουσατίας + Ντουάλα + Μέσα Ολλανδικά + Ντιβέχι + Ντογιούλα + Ντζόνγκχα + Γι + Εφίκ + Αρχαία Αιγυπτιακά + Εκατζούκ + Ελληνικά + Ελαμάιτ + Αγγλικά + Αγγλικά Αυστραλίας + Αγγλικά Καναδά + Αγγλικά Ηνωμένου Βασιλείου + Αγγλικά Η.Π.Α. + Μέσα Αγγλικά + Εσπεράντο + Ισπανικά + Ισπανικά Λατινικής Αμερικής + Ισπανικά Ιβηρικής + Εσθονικά + Βασκικά + Εγουόντο + Περσικά + Φανγκ + Φάντι + Φουλάχ + Φινλανδικά + Φιλιππινεζικά + Φιννο-Ούγκριαν + Φίτζι + Φαρόε + Φον + Γαλλικά + Γαλλικά Καναδά + Γαλλικά Ελβετίας + Μέσα Γαλλικά + Παλαιά Γαλλικά + Βόρεια Φριζιανά + Ανατολικά Φριζιανά + Φριούλιαν + Δυτικά Φριζιανά + Ιρλανδικά + Γκα + Γκάγιο + Γκμπάγια + Σκωτικά Κελτικά + Γερμανική γλώσσα + Γκιζ + Γκιλμπερτίζ + Γαλικιανά + Μέσα Άνω Γερμανικά + Γκουαρανί + Παλαιά Άνω Γερμανικά + Γκόντι + Γκοροντάλο + Γοτθικά + Γκρίμπο + Αρχαία Ελληνικά + Ελβετικά Γερμανικά + Γκουγιαράτι + Μανξ + Γκουίτσιν + Χάουσα + Χάιντα + Χαβανεζικά + Εβραϊκά + Χίντι + Χιλιγκαγιόν + Χιματσάλι + Χιτίτε + Χμονγκ + Χίρι Μότου + Κροατικά + Γλώσσα Άνω Λουσατίας + Αϊτιανά + Ουγγρικά + Χούπα + Αρμενικά + Χερέρο + Ιντερλίνγκουα + Ιμπάν + Ινδονησιακά + Ιντερλίνγκουε + Ίγκμπο + Σικουάν Γι + Ιζό + Ινουπιάκ + Ιλόκο + Ινδική γλώσσα + Ινδοευρωπαϊκή γλώσσα + Ινγκούς + Ίντο + Ιρανική γλώσσα + Γλώσσα Ιροκόιαν + Ισλανδικά + Ιταλικά + Ινουκτιτούτ + Ιαπωνικά + Λόζμπαν + Ιουδαϊκά-Περσικά + Ιουδαϊκά-Αραβικά + Ιαβανεζικά + Γεωργιανά + Κάρα-Καλπάκ + Καμπίλε + Κατσίν + Τζου + Κάμπα + Καρέν + Κάουι + Καμπαρντιανά + Τουάπ + Κόρο + Κονγκό + Κάσι + Γλώσσα Κοϊσάν + Κοτανικά + Κικούγιου + Κουανιγιάμα + Καζακικά + Καλααλισούτ + Καμποτζιανά + Κιμπούντου + Κανάντα + Κορεατικά + Κονκάνι + Κοσραενικά + Κπέλε + Κανούρι + Καρατσάι-Μπαλκάρ + Καρελιακά + Κρου + Κουρούχ + Κασμίρι + Κουρδικά + Κουμγιούκ + Κουτενάι + Κόμι + Κόρνις + Κυργιζικά + Λατινικά + Λαδίνο + Λάχδα + Λάμπα + Λουξεμβουργικά + Λαζγκιάν + Γκάντα + Λιμβουργιανά + Λινγκάλα + Λαοθιανά + Μόνγκο + Λόζι + Λιθουανικά + Λούμπα-Κατάνγκα + Λούμπα-Λουλούα + Λουισένο + Λούντα + Λούο + Λουσάι + Λετονικά + Μαντουρίζ + Μαγκάχι + Μαϊτχίλι + Μακαζάρ + Μαντίνγκο + Οστρονέζιαν + Μασάι + Μόκσα + Μανδάρ + Μέντε + Μαλαγάσι + Μέσα Ιρλανδικά + Μάρσαλ + Μάορι + Μικμάκ + Μινανγκαμπάου + Διάφορες γλώσσες + Σλαβομακεδονικά + Γλώσσα Μον-Χμερ + Μαλαγιαλάμ + Μογγολικά + Μαντσού + Μανιπούρι + Γλώσσα Μανόμπο + Μολδαβικά + Μοχόκ + Μόσι + Μαράθι + Μαλάι + Μαλτεζικά + Πολλαπλές γλώσσες + Γλώσσα Μούντα + Κρικ + Μιραντεζικά + Μαργουάρι + Βιρμανικά + Γλώσσα Μάγιαν + Έρζυα + Ναούρου + Ναχουάτλ + Ινδιανική γλώσσα Βόρειας Αμερικής + Ναπολιτανικά + Νορβηγικά Μποκμάλ + Ντεμπέλε Βορρά + Κάτω Γερμανικά + Νεπάλι + Νεγουάρι + Ντόνγκα + Νίας + Γλώσσα Νίγηρα-Κορδοφάνιαν + Νιούεαν + Ολλανδικά + Φλαμανδικά + Νορβηγικά Νινόρσκ + Νορβηγικά + Νογκάι + Παλαιά Νορβηγικά + Ν'Κο + Ντεμπέλε Νότου + Βόρεια Σόθο + Γλώσσα Νούμπιαν + Νάβαχο + Κλασικά Νεουάρι + Νιάντζα + Νιαμγουέζι + Νιανκόλε + Νιόρο + Νζίμα + Οκσιτανικά + Οζιβίγουα + Ορόμο + Ορίγια + Οσετικά + Οσάζ + Οθωμανικά Τουρκικά + Οθωμανική γλώσσα + Παντζαπικά + Παπούα + Πανγκασινάν + Παχλάβι + Παμπάνγκα + Παπιαμέντο + Παλάουαν + Αρχαία Περσικά + Φιλιππινεζική γλώσσα + Φοινικικά + Πάλι + Πολωνικά + Ποχπέιαν + Γλώσσα Πράκριτ + Παλαιά Προβενσιάλ + Πάστο + Πορτογαλικά + Πορτογαλικά Βραζιλίας + Πορτογαλικά Ιβηρικής + Κετσούα + Ραζασθάνι + Ραπανούι + Ραροτονγκάν + Ρετο-Ρομανικά + Ρούντι + Ρουμανικά + Ρομανική γλώσσα + Ρομανί + Ρουτ + Ρωσικά + Αρομανικά + Κινιαρβάντα + Σανσκριτικά + Σαντάγουε + Γιακούτ + Ινδιανική γλώσσα Νότιας Αμερικής + Γλώσσα Σαλισάν + Σαμαρίτικα Αραμαϊκά + Σασάκ + Σαντάλι + Σαρδινικά + Σικελιανά + Σκωτικά + Σίντι + Βόρεια Σάμι + Σελκούπ + Σημητική γλώσσα + Σάνγκο + Παλαιά Ιρλανδικά + Νοηματική γλώσσα + Σερβοκροατικά + Σαν + Σινχαλεζικά + Σιντάμο + Γλώσσα Σιουάν + Σινοθιβετιανή γλώσσα + Σλοβακικά + Σλοβενικά + Σλαβική γλώσσα + Σαμόαν + Νότια Σάμι + Γλώσσα Σάμι + Λούλε Σάμι + Ινάρι Σάμι + Σκολτ Σάμι + Σχόνα + Σονίνκε + Σομάλι + Σογκντιέν + Σονγκχάι + Αλβανικά + Σερβικά + Σρανάρ Τόνγκο + Σερέρ + Σουάτι + Νιλο-Σαχαριανή γλώσσα + Νότια Σόθο + Σουδανικά + Σουκούμα + Σούσου + Σουμερικά + Σουηδικά + Σουαχίλι + Κλασικά Συριακά + Συριακά + Ταμίλ + Ταϊλανδική γλώσσα + Τελούγκου + Τίμνε + Τερένο + Τέτουμ + Τατζίκ + Ταϊλανδικά + Τιγκρίνυα + Τίγκρε + Τιβ + Τουρκμενικά + Τοκελάου + Ταγκαλόγκ + Κλίνγκον + Τλίνγκιτ + Ταμασέκ + Τσιγουάνα + Τόνγκα + Νιάσα Τόνγκα + Τοκ Πισίν + Τουρκικά + Τσόνγκα + Τσίμσιαν + Τατάρ + Τουμπούκα + Γλώσσα Τούπι + Αλταϊκή γλώσσα + Τουβαλού + Τούι + Ταϊτιανά + Τουβίνιαν + Ουντμούρτ + Ουιγουρικά + Ουγκαρίτικ + Ουκρανικά + Ουμπούντου + Άγνωστη ή ακατάλληλη γλώσσα + Ουρντού + Ουζμπεκικά + Βάι + Βένδα + Βιετναμεζικά + Βόλαπικ + Βότικ + Γουαλούν + Γλώσσα Γουακασάν + Γουάλαμο + Γουάρει + Γουασό + Διάλεκτος Άνω Λουσατίας + Γουόλοφ + Καλμίκ + Ζόσα + Γιάο + Γιαπίζ + Γίντις + Γιορούμπα + Γλώσσα Γιούπικ + Ζουάνγκ + Ζάποτεκ + Σύμβολα Bliss + Ζενάγκα + Κινεζικά + Απλοποιημένα Κινεζικά + Παραδοσιακά Κινεζικά + Ζάντε + Ζουλού + Ζούνι + Χωρίς γλωσσολογικό περιεχόμενο + Ζάζα + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Κόσμος + Αφρική + Βόρεια Αμερική + Νότια Αμερική + Ωκεανία + Δυτική Αφρική + Κεντρική Αμερική + Ανατολική Αφρική + Βόρεια Αφρική + Μέση Αφρική + Νότιος Αφρική + Αμερική + Βόρειος Αμερική + Καραϊβική + Ανατολική Ασία + Νότια Ασία + Νοτιοανατολική Ασία + Νότια Ευρώπη + Αυστραλία και Νέα Ζηλανδία + Μελανησία + Περιοχή Μικρονησίας + Πολυνησία + Νότια Κεντρική Ασία + Ασία + Κεντρική Ασία + Δυτική Ασία + Ευρώπη + Ανατολική Ευρώπη + Βόρεια Ευρώπη + Δυτική Ευρώπη + Κοινοπολιτεία Ανεξαρτήτων Πολιτειών + Λατινική Αμερική και Καραϊβική + Νησιά Τσάνελ + Ανδόρα + Ηνωμένα Αραβικά Εμιράτα + Αφγανιστάν + Αντίγκουα και Μπαρμπούντα + Ανγκουίλα + Αλβανία + Αρμενία + Ολλανδικές Αντίλλες + Ανγκόλα + Ανταρκτική + Αργεντινή + Αμερικανική Σαμόα + Αυστρία + Αυστραλία + Αρούμπα + Νήσοι Άλαντ + Αζερμπαϊτζάν + Βοσνία - Ερζεγοβίνη + Μπαρμπάντος + Μπανγκλαντές + Βέλγιο + Μπουρκίνα Φάσο + Βουλγαρία + Μπαχρέιν + Μπουρούντι + Μπενίν + Άγιος Βαρθολομαίος + Βερμούδες + Μπρουνέι + Βολιβία + Βραζιλία + Μπαχάμες + Μπουτάν + Νήσος Μπουβέ + Μποτσουάνα + Λευκορωσία + Μπελίσε + Καναδάς + Νήσοι Κόκος + Κονγκό - Κινσάσα + Κεντροαφρικανική Δημοκρατία + Κονγκό - Μπραζαβίλ + Ελβετία + Ακτή Ελεφαντοστού + Νήσοι Κουκ + Χιλή + Καμερούν + Κίνα + Κολομβία + Κόστα Ρίκα + Σερβία και Μαυροβούνιο + Κούβα + Πράσινο Ακρωτήριο + Νήσος Χριστουγέννων + Κύπρος + Τσεχία + Γερμανία + Τζιμπουτί + Δανία + Ντομίνικα + Δομινικανή Δημοκρατία + Αλγερία + Ισημερινός + Εσθονία + Αίγυπτος + Δυτική Σαχάρα + Ερυθραία + Ισπανία + Αιθιοπία + Φινλανδία + Φίτζι + Νήσοι Φώκλαντ + Μικρονησία + Νήσοι Φερόε + Γαλλία + Γκαμπόν + Ηνωμένο Βασίλειο + Γρενάδα + Γεωργία + Γαλλική Γουιάνα + Γκερνσέι + Γκάνα + Γιβραλτάρ + Γροιλανδία + Γκάμπια + Γουινέα + Γουαδελούπη + Ισημερινή Γουινέα + Ελλάδα + Νότια Γεωργία και Νότιες Νήσοι Σάντουιτς + Γουατεμάλα + Γκουάμ + Γουινέα-Μπισάου + Γουιάνα + Χονγκ Κονγκ ΕΔΠ Κίνας + Νήσοι Χερντ και Μακντόναλντ + Ονδούρα + Κροατία + Αϊτή + Ουγγαρία + Ινδονησία + Ιρλανδία + Ισραήλ + Νήσος Μαν + Ινδία + Βρετανικά Εδάφη Ινδικού Ωκεανού + Ιράκ + Ιράν + Ισλανδία + Ιταλία + Υερσέη + Τζαμάικα + Ιορδανία + Ιαπωνία + Κένυα + Κιργιζία + Καμπότζη + Κιριμπάτι + Κομόρος + Σαιντ Κιτς και Νέβις + Βόρεια Κορέα + Νότια Κορέα + Κουβέιτ + Νήσοι Κέιμαν + Καζακστάν + Λάος + Λίβανος + Αγία Λουκία + Λιχτενστάιν + Σρι Λάνκα + Λιβερία + Λεσότο + Λιθουανία + Λουξεμβούργο + Λετονία + Λιβύη + Μαρόκο + Μονακό + Μολδαβία + Μαυροβούνιο + Άγιος Μαρτίνος + Μαδαγασκάρη + Νήσοι Μάρσαλ + ΠΓΔ Μακεδονίας + Μάλι + Μιανμάρ + Μογγολία + Μακάο ΕΔΠ Κίνας + Βόρειες Μαριάνες Νήσοι + Μαρτινίκα + Μαυριτανία + Μονσεράτ + Μάλτα + Μαυρίκιος + Μαλδίβες + Μαλάουι + Μεξικό + Μαλαισία + Μοζαμβίκη + Ναμίμπια + Νέα Καληδονία + Νίγηρας + Νήσος Νόρφολκ + Νιγηρία + Νικαράγουα + Ολλανδία + Νορβηγία + Νεπάλ + Ναούρου + Νιούε + Νέα Ζηλανδία + Ομάν + Παναμάς + Περού + Γαλλική Πολυνησία + Παπούα Νέα Γουινέα + Φιλιππίνες + Πακιστάν + Πολωνία + Σαιντ Πιέρ και Μικελόν + Πίτκερν + Πουέρτο Ρίκο + Παλαιστινιακά Εδάφη + Πορτογαλία + Παλάου + Παραγουάη + Κατάρ + Περιφερειακή Ωκεανία + Ευρωπαϊκή Ένωση + Ρεϋνιόν + Ρουμανία + Σερβία + Ρωσία + Ρουάντα + Σαουδική Αραβία + Νήσοι Σολομώντος + Σεϋχέλλες + Σουδάν + Σουηδία + Σιγκαπούρη + Αγία Ελένη + Σλοβενία + Σβαλμπάρντ και Γιαν Μαγιέν + Σλοβακία + Σιέρα Λεόνε + Άγιος Μαρίνος + Σενεγάλη + Σομαλία + Σουρινάμ + Σάο Τομέ και Πρίνσιπε + Ελ Σαλβαδόρ + Συρία + Ζουαζηλάνδη + Νήσοι Τερκς και Κάικος + Τσαντ + Γαλλικά Νότια Εδάφη + Τόγκο + Ταϊλάνδη + Τατζικιστάν + Τοκελάου + Ανατολικό Τιμόρ + Τουρκμενιστάν + Τυνησία + Τόνγκα + Τουρκία + Τρινιντάντ και Τομπάγκο + Τουβαλού + Ταϊβάν + Τανζανία + Ουκρανία + Ουγκάντα + Απομακρυσμένες Νησίδες Η.Π.Α. + Ηνωμένες Πολιτείες της Αμερικής + Ουρουγουάη + Ουζμπεκιστάν + Βατικανό + Άγιος Βικέντιος και Γρεναδίνες + Βενεζουέλα + Βρετανικές Παρθένοι Νήσοι + Αμερικανικές Παρθένοι Νήσοι + Βιετνάμ + Βανουάτου + Νήσοι Ουαλλίς και Φουτουνά + Σαμόα + Υεμένη + Μαγιότ + Νότια Αφρική + Ζάμπια + Ζιμπάμπουε + Άγνωστη ή μη έγκυρη περιοχή + + + Παραδοσιακή γερμανική ορθογραφία + Τυποποιημένη ορθογραφία Ρεσιάν + Γερμανική ορθογραφία του 1996 + Νεότερα Μέσα Γαλλικά του 1606 + Πρώιμα Σύγχρονα Γαλλικά + Ανατολικά Αρμενικά + Δυτικά Αρμενικά + Ενοποιημένη τουρκική λατινική αλφάβητος + Διάλεκτος Σαν Τζιόρτζιο/Βίλα + Μπούντλινγκ + Διεθνής φωνητική αλφάβητος + Ουραλική φωνητική αλφάβητος + Διάλεκτος Λιποβάζ της Ρεσιάν + Μονοτονικό + Διάλεκτος Νατισόνε + Διάλεκτος Γκνιβά/Ντζιβά + Διάλεκτος Οσεακό/Οσοτζάν + Πολυτονικό + Υπολογιστής + Αναθεωρημένη ορθογραφία + Ρεσιάν + Σάχο + Σκοτσεζικά τυποποιημένα Αγγλικά + Σκουζ + Διάλεκτος Στολβιτζά/Σολμπικά + Ταρασκιεβική ορθογραφία + Βαλενθιανά + + + ημερολόγιο + τακτοποίηση + νόμισμα + + + Σειρά ταξινόμησης Παραδοσιακών Κινεζικών - Big5 + Βουδιστικό ημερολόγιο + Κινεζικό ημερολόγιο + Άμεση σειρά ταξινόμησης + Σειρά ταξινόμησης Απλουστευμένων Κινεζικών - GB2312 + Γρηγοριανό ημερολόγιο + Εβραϊκό ημερολόγιο + Ινδικό εθνικό ημερολόγιο + Ισλαμικό ημερολόγιο + Ισλαμικό αστικό ημερολόγιο + Ιαπωνικό ημερολόγιο + Σειρά ταξινόμησης τηλεφωνικού καταλόγου + Σειρά ταξινόμησης Πινγίν + Ημερολόγιο της Δημοκρατίας της Κίνας + Σειρά ταξινόμησης κινήσεων + Παραδοσιακή σειρά ταξινόμησης + + + Αγγλοσαξωνικό + Μετρικό + + + Γλώσσα: {0} + Σύστημα γραφής: {0} + Περιοχή: {0} + + + + lowercase-words + + + [α ά β-ε έ ζ η ή θ ι ί ϊ ΐ κ-ο ό π ρ σ ς τ υ ύ ϋ ΰ φ-ω ώ] + + + « + » + ‘ + ’ + + + + + π.μ. + μ.μ. + + + + EEEE, d MMMM, y G + + + + + d MMMM, y G + + + + + d MMM, y G + + + + + d/M/yyyy + + + + + + E, d/M + E, d MMM + E, d MMMM + d MMMM + d MMM + d/M + EEE, d/M/y + EEE, d MMM, y + LLLL, y + + + + + π.μ. + μ.μ. + + + π.μ. + μ.μ. + + + π.μ. + μ.μ. + + + + + + Ιαν + Φεβ + Μαρ + Απρ + Μαϊ + Ιουν + Ιουλ + Αυγ + Σεπ + Οκτ + Νοε + Δεκ + + + Ιανουαρίου + Φεβρουαρίου + Μαρτίου + Απριλίου + Μαΐου + Ιουνίου + Ιουλίου + Αυγούστου + Σεπτεμβρίου + Οκτωβρίου + Νοεμβρίου + Δεκεμβρίου + + + + + Ι + Φ + Μ + Α + Μ + Ι + Ι + Α + Σ + Ο + Ν + Δ + + + Ιανουάριος + Φεβρουάριος + Μάρτιος + Απρίλιος + Μάιος + Ιούνιος + Ιούλιος + Αύγουστος + Σεπτέμβριος + Οκτώβριος + Νοέμβριος + Δεκέμβριος + + + + + + + Κυρ + Δευ + Τρι + Τετ + Πεμ + Παρ + Σαβ + + + Κυριακή + Δευτέρα + Τρίτη + Τετάρτη + Πέμπτη + Παρασκευή + Σάββατο + + + + + Κ + Δ + Τ + Τ + Π + Π + Σ + + + + + + + Τ1 + Τ2 + Τ3 + Τ4 + + + 1ο τρίμηνο + 2ο τρίμηνο + 3ο τρίμηνο + 4ο τρίμηνο + + + + + Τ1 + Τ2 + Τ3 + Τ4 + + + 1 + 2 + 3 + 4 + + + + π.μ. + μ.μ. + + + π.Χ. + μ.Χ. + + + π.Χ. + μ.Χ. + + + + + + EEEE, dd MMMM y + + + + + dd MMMM y + + + + + dd MMM y + + + + + dd/MM/yyyy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + EEE d + E d + H + HH:mm + HH:mm:ss + H:mm + L + E, d/M + LLL + E, d MMM + E, d MMMM + d MMMM + dd MMMM + d MMM + dd/MM + d/M + d + mm:ss + mm:ss + y + M/yyyy + EEE, d/M/yyyy + MMM y + EEE, d MMM y + LLLL y + y Q + y QQQ + MM/yy + MMM yy + Q yy + QQQQ yy + y + MM/yyyy + MMMM y + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + LLL-LLL + + + E, dd MMM - E, dd MMM + E, dd - E, dd MMM + + + LLLL-LLLL + + + dd MMM - dd MMM + dd-dd MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + + + LLL-LLL y + LLL y - LLL y + + + E, dd MMM - E, dd MMM y + E, dd - E, dd MMM y + E, dd MMM y - E, dd MMM y + + + MM-MM/yyyy + MM/yyyy-MM/yyyy + + + dd MMM - dd MMM y + dd-dd MMM y + dd MMM y - dd MMM y + + + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + Περίοδος + + + Έτος + + + Μήνας + + + Εβδομάδα + + + Ημέρα + Πριν από τρεις ημέρες + Προχτές + Χτες + Σήμερα + Αύριο + Μεθαύριο + Σε τρεις ημέρες από τώρα + + + Ημέρα εβδομάδας + + + π.μ./μ.μ. + + + Ώρα + + + Λεπτό + + + Δευτερόλεπτο + + + Ζώνη + + + + + π.μ. + μ.μ. + + + π.μ. + + + + + π.μ. + μ.μ. + + + π.μ. + μ.μ. + + + π.μ. + μ.μ. + + + + EEEE, d MMMM, y G + + + + + d MMMM, y G + + + + + d MMM, y G + + + + + d/M/yy + + + + + + E, d MMM + d MMMM + d/M + MM/yy GGGGG + MMM yy GGGGG + yy GGGGG Q + + + + + π.μ. + μ.μ. + + + π.μ. + μ.μ. + + + Πριν R.O.C. + R.O.C. + + + + + + EEEE, d MMMM, y G + + + + + d MMMM, y G + + + + + d MMM, y G + + + + + d/M/y G + + + + + + E, d/M + E, d MMM + d MMM + d/M + y G + M/y G + EEE, d/M/y G + MMM, y G + EEE, d MMM, y G + y G Q + QQQ y G + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + Άγνωστη + + + Ανδόρα + + + Ντουμπάι + + + Καμπούλ + + + Αντίγκουα + + + Ανγκουίλλα + + + Τίρανα + + + Γερεβάν + + + Κουρακάο + + + Αγκόλα + + + Ροθέρα + + + Πάλμερ + + + Νότιος Πόλος + + + Σύοβα + + + Μόουσον + + + Ντέιβις + + + Βόστοκ + + + Κάσεϊ + + + Ντυμόντ Ντερβίλ + + + Μακμέρντο + + + Ρίο Γκαγιέγκος + + + Μεντόζα + + + Σαν Χουάν + + + Ουσουάια + + + Λα Ριόχα + + + Σαν Λούις + + + Καταμάρκα + + + Σάλτα + + + Χουχούι + + + Τουκουμάν + + + Κόρδοβα + + + Μπουένος Άιρες + + + Πάγκο Πάγκο + + + Βιέννη + + + Περθ + + + Εούκλα + + + Ντάργουιν + + + Αδελαΐδα + + + Μπρόκεν Χιλ + + + Κιουρί + + + Μελβούρνη + + + Χόμπαρτ + + + Λίντεμαν + + + Σίδνεϊ + + + Μπρίσμπεϊν + + + Λορντ Χάουι + + + Αρούμπα + + + Μπακού + + + Μπαρμπέιντος + + + Ντάκα + + + Βρυξέλλες + + + Μπουρκίνα Φάσο + + + Σόφια + + + Μπαχρέιν + + + Μπουρούντι + + + Μπενίν + + + Βερμούδα + + + Μπρούνεϊ + + + Λα Παζ + + + Εϊρουνέπε + + + Ρίο Μπράνκο + + + Πόρτο Βέλο + + + Μπόα Βίστα + + + Μανάος + + + Κουϊάμπα + + + Σανταρέμ + + + Κάμπο Γκράντε + + + Μπέλεμ + + + Αραγκουάινα + + + Σάο Πάολο + + + Μπάχια + + + Φορταλέζα + + + Μασέιο + + + Ρεσίφε + + + Νορόνχα + + + Νασάου + + + Τρίμφου + + + Γκαμπορόνε + + + Μινσκ + + + Μπελίζ + + + Ντόσον + + + Γουάιτχορς + + + Ινούβικ + + + Βανκούβερ + + + Ντόσον Κρικ + + + Γέλοουναϊφ + + + Έντμοντον + + + Σουίφτ Κάρρεντ + + + Κέμπριτζ Μπέι + + + Ρετζίνα + + + Γούνιπεγκ + + + Ρέσολουτ + + + Ρέινι Ρίβερ + + + Ρέινκιν Ίνλετ + + + Κόραλ Χάρμπουρ + + + Θάντερ Μπέι + + + Νιπιγκόν + + + Τορόντο + + + Μόντρεαλ + + + Ικαλούτ + + + Πανγκνίρτουνγκ + + + Μονκτόν + + + Χάλιφαξ + + + Γκους Μπέι + + + Γκλέις Μπέι + + + Μπλαν Σαμπλόν + + + Σεντ Τζονς + + + Κόκος + + + Κινσάσα + + + Λουμπουμπάσι + + + Κεντροαφρικανική Δημοκρατία + + + Μπράζαβιλ + + + Ζυρίχη + + + Ακτή Ελεφαντοστού + + + Ραροτόνγκα + + + Νήσος Πάσχα + + + Σαντιάγκο + + + Καμερούν + + + Κάσγκαρ + + + Ουρουμκί + + + Τσονγκίνγκ + + + Σανγκάη + + + Χαρμπίν + + + Μπογκοτά + + + Κόστα Ρίκα + + + Αβάνα + + + Νήσοι Χριστουγέννων + + + Λευκωσία + + + Βερολίνο + + + Τζιμπουτί + + + Κοπεγχάγη + + + Δομινίκα + + + Σάντο Ντομίνγκο + + + Αλγέρι + + + Γκαλαπάγκος + + + Γκουαγιακύλ + + + Ταλίν + + + Αίγυπτος + + + Δυτική Σαχάρα + + + Ασμέρα + + + Κανάρια + + + Κέουτα + + + Μαδρίτη + + + Αιθιοπία + + + Ελσίνκι + + + Φίτζι + + + Στάνλεϋ + + + Τρουκ + + + Πονάπε + + + Κοσράη + + + Φερόες + + + Παρίσι + + + Γκαμπόν + + + Λονδίνο + + + Γρενάδα + + + Τμπιλίσι + + + Καγιένε + + + Άκκρα + + + Γιβραλτάρ + + + Τούλε + + + Γκόνθαμπ + + + Σκορεσμπίσουντ + + + Ντανμαρκσάβν + + + Γκάμπια + + + Γουινέα + + + Γουαδελούπη + + + Ισημερινή Γουινέα + + + Αθήνα + + + Νότια Γεωργία + + + Γουατεμάλα + + + Γκουάμ + + + Γουινέα Μπισσάου + + + Γουιάνα + + + Χονγκ Κονγκ + + + Πορτ-Ο-Πρενς + + + Βουδαπέστη + + + Τζακάρτα + + + Πόντιανακ + + + Μακασάρ + + + Χαγιαπούρα + + + Δουβλίνο + + + Ιερουσαλήμ + + + Τσάγκος + + + Βαγδάτη + + + Τεχεράνη + + + Ρέυκιαβικ + + + Ρώμη + + + Τζαμάικα + + + Αμάν + + + Τόκυο + + + Κένυα + + + Μπισχέκ + + + Πιόμ Πενχ + + + Εντερμπέρυ + + + Κιριτιμάτι + + + Ταράουα + + + Κομόρο + + + Σαιν Κιττς + + + Πυόνγκ Γιάνγκ + + + Σεούλ + + + Κέυμαν + + + Ακτάου + + + Όραλ + + + Ακτόμπε + + + Κτζιλ-Ορντά + + + Αλμάτυ + + + Βιεντιάνε + + + Βηρυτός + + + Αγ. Λουκία + + + Βαντούζ + + + Κολόμπο + + + Λιβερία + + + Λεσόθο + + + Βίλνιους + + + Λουξεμβούργο + + + Ρίγα + + + Λιβύη + + + Καζαμπλάνκα + + + Μονακό + + + Τσισινάου + + + Ανταναναρίβο + + + Κουαχαλέιν + + + Μαχούρο + + + Μπαμάκο + + + Ρανγκούν + + + Χοβντ + + + Ουλάν Μπατόρ + + + Χόιμπαλσαν + + + Μακάο + + + Σάιπαν + + + Μαρτινίκα + + + Μαυριτανία + + + Μονσεράτ + + + Μάλτα + + + Μαυρίκιος + + + Μαλδίβες + + + Μαλάουι + + + Τιχουάνα + + + Ερμοσίγιο + + + Μαζατλάν + + + Τσιουάουα + + + Μοντερέι + + + Πόλη του Μεξικού + + + Μέριντα + + + Κανκούν + + + Κουάλα Λουμπούρ + + + Κουτσίνγκ + + + Μαπούτο + + + Γουιντχόεκ + + + Νουμέα + + + Νιαμέυ + + + Νόρφολκ + + + Λάγος + + + Μανάγκουα + + + Άμστερνταμ + + + Όσλο + + + Κατμαντού + + + Ναούρου + + + Νιούε + + + Τσάταμ + + + Όκλαντ + + + Μουσκάτ + + + Παναμάς + + + Λίμα + + + Αϊτή + + + Μαρκέσας + + + Γκάμπιερ + + + Πορτ Μόρεσμπυ + + + Μανίλα + + + Καράτσι + + + Βαρσοβία + + + Μικελόν + + + Πιτκέιρν + + + Πουέρτο Ρίκο + + + Γάζα + + + Αζόρες + + + Μαδέρα + + + Λισσαβώνα + + + Παλάου + + + Ασουνσιόν + + + Κατάρ + + + Ρεϋνιόν + + + Βουκουρέστι + + + Καλλίπολη + + + Μόσχα + + + Βόλγκοκραντ + + + Σαμάρα + + + Αικατερινούπολη + + + Ομσκ + + + Νοβοσιμπίρσκ + + + Κρασνογιάρσκ + + + Ιρκούτσκ + + + Γιάκουτσκ + + + Βλαδιβοστόκ + + + Σακαλίνσκ + + + Μαγκαντάν + + + Καμτσάτκα + + + Αναντίρ + + + Κιγκάλι + + + Ριάντ + + + Γκουανταλκανάλ + + + Μάχε + + + Σουδάν + + + Στοκχόλμη + + + Σιγκαπούρη + + + Αγ. Ελένη + + + Σιέρα Λεόνε + + + Ντακάρ + + + Μογκαντίσου + + + Παραμαρίνμπο + + + Σάο Τόμε + + + Σαλβαδόρ + + + Δαμασκός + + + Ζουαζιλάνδη + + + Γραντ Τουρκ + + + Ντζαμένα + + + Κέργκουελεν + + + Λόμε + + + Μπανγκόκ + + + Ντουσχάνμπη + + + Φακαόφο + + + Ντίλι + + + Ασγκάμπατ + + + Τυνησία + + + Τονγκατάπου + + + Κωνσταντινούπολη + + + Πορτ-Οφ-Σπέιν + + + Φουναφούτι + + + Ταϊπέι + + + Νταρ Ες Σαλάμ + + + Ουζκόροντ + + + Κίεβο + + + Συμφερούπολη + + + Ζαπορόζιε + + + Καμπάλα + + + Μίντγουεϊ + + + Τζόνστον + + + Γουέικ + + + Άντακ + + + Νόμε + + + Χονολουλού + + + Άνκορατζ + + + Γιακούτατ + + + Τζούνο + + + Λος Άντζελες + + + Μπόιζ + + + Φοίνιξ + + + Σίπροκ + + + Ντένβερ + + + Νιου Σάλεμ, Βόρεια Ντακότα + + + Κέντρο, Βόρεια Ντακότα + + + Σικάγο + + + Μενομίνε + + + Βίνκενες, Ιντιάνα + + + Πίτερσμπεργκ, Ιντιάνα + + + Τελ Σίτυ, Ιντιάνα + + + Νοξ, Ιντιάνα + + + Γουίναμακ, Ιντιάνα + + + Μαρένγκο, Ιντιάνα + + + Ινδιανάπολη + + + Λούισβιλ + + + Βεβάι, Ιντιάνα + + + Μοντιτσέλο, Κεντάκι + + + Ντητρόιτ + + + Νέα Υόρκη + + + Μοντεβίδεο + + + Σαμαρκάνδη + + + Τασκένδη + + + Αγ. Βικέντιος + + + Καράκας + + + Τορτόλα + + + Σαιντ Τόμας + + + Σαϊγκόν + + + Εφάτε + + + Γουόλις + + + Άπια + + + Έιντεν + + + Μαγιότε + + + Γιοχάνεσμπουργκ + + + Ζάμπια + + + Ζιμπάμπουε + + + + ACT (Ακρ) + ACST (Ακρ) + + + + + ώρα Κεντρικής Αφρικής + + + + + ώρα Ανατολικής Αφρικής + + + + + ώρα Νότιας Αφρικής + τυπική ώρα Νότιας Αφρικής + + + + + ώρα Δυτικής Αφρικής + καλοκαιρινή ώρα Δυτικής Αφρικής + + + + + AQTT (Ακτάου) + AQTST (Ακτάου) + + + + + AQTT (Ακτοβε) + AQTST (Ακτοβε) + + + + + BST (Μπερίνγκ) + BDT (Μπερίνγκ) + + + + + CST (Κούβα) + CDT (Κούβα) + + + + + SAMT (Σάμαρκαντ) + SAMST (Σάμαρκαντ) + + + + + + + , + . + , + % + 0 + # + + + - + e + ‰ + ∞ + NaN + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + + + + Πεσέτα Ανδόρας + πεσέτα Ανδόρας + πεσέτες Ανδόρας + + + Ντιράμ Ηνωμένων Αραβικών Εμιράτων + ντιράμ Ηνωμένων Αραβικών Εμιράτων + ντιράμ Ηνωμένων Αραβικών Εμιράτων + + + Αφγανί Αφγανιστάν (1927-2002) + αφγάνι Αφγανιστάν (AFA) + αφγάνι Αφγανιστάν (AFA) + + + Αφγανί Αφγανιστάν + αφγάνι Αφγανιστάν + Αφγάνι Αφγανιστάν + + + Λεκ Αλβανίας + λεκ Αλβανίας + λεκ Αλβανίας + + + Ντραμ Αρμενίας + ντραμ Αρμενίας + ντραμ Αρμενίας + + + Γκίλντα Ολλανδικών Αντιλλών + γκίλντα Ολλανδικών Αντιλλών + γκίλντα Ολλανδικών Αντιλλών + + + Κουάνζα Ανγκόλας + κουάνζα Ανγκόλας + κουάνζα Ανγκόλας + + + Κουάνζα Ανγκόλας (1977-1990) + κουάνζα Ανγκόλας (AOK) + κουάνζα Ανγκόλας (AOK) + + + Νέα Κουάνζα Ανγκόλας (1990-2000) + νέο κουάνζα Ανγκόλας (AON) + νέα κουάνζα Ανγκόλας (AON) + + + Κουάνζα Reajustado Ανγκόλας (1995-1999) + κουάνζα Reajustado Ανγκόλας (AOR) + κουάνζα Reajustado Ανγκόλας (AOR) + + + Ωστράλ Αργετινής + αουστράλ Αργεντινής + αουστράλ Αργεντινής + + + Πέσο Αργεντινής (1983-1985) + πέσο Αργεντινής (ARP) + πέσο Αργεντινής (ARP) + + + Πέσο Αργεντινής + πέσο Αργεντινής + πέσο Αργεντινής + + + Σελίνι Αυστρίας + σελίνι Αυστρίας + σελίνια Αυστρίας + + + Δολάριο Αυστραλίας + δολάριο Αυστραλίας + δολάρια Αυστραλίας + + + Γκίλντα Αρούμπα + γκίλντα Αρούμπα + γκίλντα Αρούμπα + + + Μανάτ Αζερμπαϊτζάν (1993-2006) + μανάτ Αζερμπαϊτζάν (1993-2006) + μανάτ Αζερμπαϊτζάν (1993-2006) + + + Μανάτ Αζερμπαϊτζάν + μανάτ Αζερμπαϊτζαν + μανάτ Αζερμπαϊτζαν + + + Δηνάριο Βοσνίας-Ερζεγοβίνης + δηνάριο Βοσνίας-Ερζεγοβίνης + δηνάρια Βοσνίας-Ερζεγοβίνης + + + Μετατρέψιμο Μάρκο Βοσνίας-Ερζεγοβίνης + μάρκο Βοσνίας-Ερζεγοβίνης + μάρκα Βοσνίας-Ερζεγοβίνης + + + Δολάριο Μπαρμπάντος + δολάριο Μπαρμπάντος + δολάρια Μπαρμπάντος + + + Τάκα Μπαγκλαντές + τάκα Μπαγκλαντές + τάκα Μπαγκλαντές + + + Φράγκο Βελγίου (μετατρέψιμο) + φράγκο Βελγίου (μετατρέψιμο) + φράγκα Βελγίου (μετατρέψιμα) + + + Φράγκο Βελγίου + φράγκο Βελγίου + φράγκα Βελγίου + + + Φράγκο Βελγίου (οικονομικό) + φράγκο Βελγίου (οικονομικό) + φράγκα Βελγίου (οικονομικό) + + + Μεταλλικό Λεβ Βουλγαρίας + μεταλλικό λεβ Βουλγαρίας + μεταλλικά λεβ Βουλγαρίας + + + Νέο Λεβ Βουλγαρίας + νέο λεβ Βουλγαρίας + νέα λεβ Βουλγαρίας + + + Δηνάριο Μπαχρέιν + δηνάριο Μπαχρέιν + δηνάρια Μπαχρέιν + + + Φράγκο Μπουρούντι + φράγκο Μπουρούντι + φράγκα Μπουρούντι + + + Δολάριο Βερμούδων + δολάριο Βερμούδων + δολάρια Βερμούδων + + + Δολάριο Μπρουνέι + δολάριο Μπρουνέι + δολάρια Μπρουνέι + + + Μπολιβιάνο Βολιβίας + μπολιβιάνο Βολιβίας + μπολιβιάνο Βολιβίας + + + Πέσο Βολιβίας + πέσο Βολιβίας + πέσο Βολιβίας + + + Μβδολ Βολιβίας + μβντολ Βολιβίας + μβντολ Βολιβίας + + + Νέο Κρουζιέρο Βραζιλίας (1967-1986) + νέο κρουζέιρο Βραζιλίας (BRB) + νέα κρουζέιρο Βραζιλίας (BRB) + + + Κρουζάντο Βραζιλίας + κρουζάντο Βραζιλίας + κρουζάντο Βραζιλίας + + + Κρουζιέρο Βραζιλ»ίας (1990-1993) + κρουζέιρο Βραζιλίας (BRE) + κρουζέιρο Βραζιλίας (BRE) + + + Ρεάλ Βραζιλίας + ρεάλ Βραζιλίας + ρεάλ Βραζιλίας + + + Νέο Κρουζάντο Βραζιλίας + νέο κρουζάντο Βραζιλίας + νέα κρουζάντο Βραζιλίας + + + Κρουζιέρο Βραζιλίας + κρουζέιρο Βραζιλίας + κρουζέιρο Βραζιλίας + + + Δολάριο Μπαχάμες + δολάριο Μπαχάμες + δολάρια Μπαχάμες + + + Νγκούλτρουμ Μπουτάν + νγκούλτρουμ Μπουτάν + νγκούλτρουμ Μπουτάν + + + Κιατ Βιρμανίας + κιάτ Βιρμανίας + κιάτ Βιρμανίας + + + Πούλα Μποτσουάνας + πούλα Μποτσουάνας + πούλα Μποτσουάνας + + + Νέο Ρούβλι Λευκορωσίας (1994-1999) + νέο ρούβλι Λευκορωσίας (1994-1999) + νέα ρούβλια Λευκορωσίας (1994-1999) + + + Ρούβλι Λευκορωσίας + ρούβλι Λευκορωσίας + ρούβλια Λευκορωσίας + + + Δολάριο Μπελίζ + δολάριο Μπελίζ + δολάρια Μπελίζ + + + Δολάριο Καναδά + δολάριο Καναδά + δολάρια Καναδά + + + Φράγκο Κονγκό + φράγκο Κονγκό + φράγκα Κονγκό + + + Ευρώ WIR + ευρώ WIR + ευρώ WIR + + + Φράγκο Ελβετίας + φράγκο Ελβετίας + φράγκα Ελβετίας + + + Φράγκο WIR + φράγκο WIR + φράγκα WIR + + + Unidades de Fomento Χιλής + ουνιδάδες ντε φομέντο Χιλής + ουνιδάδες ντε φομέντο Χιλής + + + Πέσο Χιλής + πέσο Χιλής + πέσο Χιλής + + + Γιουάν Ρενμίμπι Κίνας + γιουάν Κίνας + γιουάν Κίνας + + + Πέσο Κολομβίας + πέσο Κολομβίας + πέσο Κολομβίας + + + unidad de valor real + unidad de valor real + unidad de valor reals + + + Κολόν Κόστα Ρίκα + κολόν Κόστα Ρίκα + κολόν Κόστα Ρίκα + + + Παλαιό Δηνάριο Σερβίας + παλιό δινάρη Σερβίας + παλιά δινάρια Σερβίας + + + Σκληρή Κορόνα Τσεχοσλοβακίας + σκληρή κορόνα Τσεχοσλοβακίας + σκληρές κορόνες Τσεχοσλοβακίας + + + Πέσο Κούβας + πέσο Κούβας + πέσο Κούβας + + + Εσκούδο Πράσινου Ακρωτηρίου + εσκούδο Πράσινου Ακρωτηρίου + εσκούδο Πράσινου Ακρωτηρίου + + + Λίρα Κύπρου + λίρα Κύπρου + λίρες Κύπρου + + + Κορόνα Τσέχικης Δημοκρατίας + κορόνα Τσέχικης Δημοκρατίας + κορόνες Τσέχικης Δημοκρατίας + + + Οστμάρκ Ανατολικής Γερμανίας + όστμαρκ Ανατολικής Γερμανίας + όστμαρκ Ανατολικής Γερμανίας + + + Μάρκο Γερμανίας + μάρκο Γερμανίας + μάρκα Γερμανίας + + + Φράγκο Τζιμπουτί + φράγκο Τζιμπουτί + φράγκα Τζιμπουτί + + + Κορόνα Δανίας + κορόνα Δανίας + κορόνες Δανίας + + + Πέσο Δομίνικου + πέσο Δομίνικου + πέσο Δομινικανής Δημοκρατίας + + + Δηνάριο Αλγερίας + δηνάριο Αλγερίας + δηνάρια Αλγερίας + + + Σούκρε Εκουαδόρ + σούκρε Εκουαδόρ + σούκρε Εκουαδόρ + + + Unidad de Valor Constante (UVC) Ισημερινού + Unidad de Valor Constante (UVC) Ισημερινού + Unidads de Valor Constante (UVC) Ισημερινού + + + Κορόνα Εσθονίας + κορόνα Εσθονίας + κορόνες Εσθονίας + + + Λίρα Αιγύπτου + λίρα Αιγύπτου + λίρες Αιγύπτου + + + Νάκφα Ερυθραίας + νάκφα Ερυθραίας + νάκφα Ερυθραίας + + + πεσέτα Ισπανίας (λογαριασμός Α) + πεσέτα Ισπανίας (λογαριασμός Α) + πεσέτες Ισπανίας (λογαριασμός Α) + + + πεσέτα Ισπανίας (μετατρέψιμος λογαριασμός) + πεσέτα Ισπανίας (μετατρέψιμος λογαριασμός) + πεσέτες Ισπανίας (μετατρέψιμες) + + + Πεσέτα Ισπανίας + πεσέτα Ισπανίας + πεσέτες Ισπανίας + + + Μπιρ Αιθιοπίας + μπιρ Αιθιοπίας + μπιρ Αιθιοπίας + + + Ευρώ + ευρώ + ευρώ + + + Μάρκο Φινλανδίας + μάρκο Φινλανδίας + μάρκα Φινλανδίας + + + Δολάριο Φίτζι + δολάριο Φίτζι + δολάρια Φίτζι + + + Λίρα Νησιών Φώλκλαντ + λίρα Νησιών Φώλκλαντ + λίρες Νησιών Φώλκλαντ + + + Φράγκο Γαλλίας + φράγκο Γαλλίας + φράγκα Γαλλίας + + + Λίρα Στερλίνα Βρετανίας + λίρα στερλίνα Βρετανίας + λίρες στερλίνες Βρετανίας + + + Κούπον Λάρι Γεωργίας + κούπον λάρι Γεωργίας + κούπον λάρι Γεωργίας + + + Λάρι Γεωργίας + λάρι Γεωργίας + λάρι Γεωργίας + + + Σέντι Γκάνας (1979-2007) + σέντι Γκάνας (GHC) + σέντι Γκάνας (GHC) + + + Σέντι Γκάνας + σέντι Γκάνας + σέντι Γκανά + + + Λίρα Γιβραλτάρ + λίρα Γιβραλτάρ + λίρες Γιβραλτάρ + + + Νταλάσι Γκάμπιας + νταλάσι Γκάμπιας + νταλάσι Γκάμπιας + + + Φράγκο Γουινέας + φράγκο Γουινέας + φράγκα Γουινέας + + + Συλί Γουινέας + συλί Γουινέας + συλί Γουινέας + + + Εκγουέλε Ισημερινής Γουινέας + εκουέλε Ισημερινής Γουινέας + εκουέλε Ισημερινής Γουινέας + + + #,##0.00 ¤;-#,##0.00 ¤ + Δραχμή Ελλάδας + δραχμή Ελλάδας + δραχμές Ελλάδας + Δρχ + , + . + + + Κουετσάλ Γουατεμάλας + κουετσάλ Γουατεμάλας + κουετσάλ Γουατεμάλας + + + Γκινέα Εσκούδο Πορτογαλίας + γκινέα εσκούδο Πορτογαλίας + γκινέα εσκούδο Πορτογαλίας + + + Πέσο Γουινέας-Μπισάου + πέσο Γουινέα-Μπισάου + πέσο Γουινέα-Μπισάου + + + Δολάριο Γουιάνας + δολάριο Γουιάνας + δολάρια Γουιάνας + + + Δολάριο Χονγκ Κονγκ + δολάριο Χονγκ Κονγκ + δολάρια Χονγκ Κονγκ + + + Λεμπίρα Ονδούρας + λεμπίρα Ονδούρας + λεμπίρα Ονδούρας + + + Δηνάριο Κροατίας + δηνάριο Κροατίας + δηνάρια Κροατίας + + + Κούνα Κροατίας + κούνα Κροατίας + κούνα Κροατίας + + + Γκουρντ Αϊτής + γκουρντ Αϊτής + γκουρντ Αϊτής + + + Φιορίνι Ουγγαρίας + φιορίνι Ουγγαρίας + φιορίνια Ουγγαρίας + + + Ρούπια Ινδονησίας + ρούπι Ινδονησίας + ρούπια Ινδονησίας + + + Λίρα Ιρλανδίας + λίρα Ιρλανδίας + λίρες Ιρλανδίας + + + Λίρα Ισραήλ + λίρα Ισραήλ + λίρες Ισραήλ + + + παλιό σεκέλ Ισραήλ + παλιό σεκέλ Ισραήλ + παλιά σεκέλ Ισραήλ + + + Νέο Σέκελ Ισραήλ + νέο σέκελ Ισραήλ + νέα σέκελ Ισραήλ + + + Ρούπια Ινδίας + ρούπι Ινδίας + ρούπια Ινδίας + + + Δηνάριο Ιράκ + δηνάριο Ιράκ + δηνάρια Ιράκ + + + Ριάλ Ιράν + ριάλ Ιράν + ριάλ Ιράν + + + Παλιά κορόνα Ισλανδίας + Παλιά κορόνα Ισλανδίας + παλιές κορόνες Ισλανδίας + + + Κορόνα Ισλανδίας + κορόνα Ισλανδίας + κορόνες Ισλανδίας + + + Λιρέτα Ιταλίας + λιρέτα Ιταλίας + λιρέτες Ιταλίας + + + Δολάριο Τζαμάικας + δολάριο Τζαμάικας + δολάρια Τζαμάικας + + + Δηνάριο Ιορδανίας + δηνάριο Ιορδανίας + δηνάρια Ιορδανίας + + + Γιεν Ιαπωνίας + γιεν Ιαπωνίας + γιεν Ιαπωνίας + + + Σελίνι Κένυας + σελίνι Κένυας + σελίνια Κένυας + + + Σομ Κιργιζίας + σομ Κιργιστάν + σομ Κιργιστάν + + + Ρίελ Καμπότζης + ρίελ Καμπότζης + ρίελ Καμπότζης + + + Φράγκο Κομόρος + φράγκο Κομόρος + φράγκα Κομόρο + + + Γον Βόρειας Κορέας + γουόν Βόρειας Κορέας + γουόν Βόρειας Κορέας + + + Γον Νότιας Κορέας + γουόν Νότιας Κορέας + γουόν Νότιας Κορέας + + + Δηνάριο Κουβέιτ + δηνάριο Κουβέιτ + δηνάρια Κουβέιτ + + + Δολάριο Νήσων Κάιμαν + δολάριο Νήσων Κάιμαν + δολάρια Νήσων Κάιμαν + + + Τένγκε Καζακστάν + τένγκε Καζακστάν + τένγκε Καζακστάν + + + Κιπ Λάος + κιπ Λάος + κιπ Λάος + + + Λίρα Λιβάνου + λίρα Λιβάνου + λίρες Λιβάνου + + + Ρούπια Σρι Λάνκα + ρούπι Σρι Λάνκα + ρούπια Σρι Λάνκα + + + Δολάριο Λιβερίας + δολάριο Λιβερίας + δολάρια Λιβερίας + + + Λότι Λεσότο + λότι Λεσόθο + λότι Λεσόθο + + + Λίτα Λιθουανίας + λίτα Λιθουανίας + λίτα Λιθουανίας + + + Ταλόνας Λιθουανίας + ταλόνας Λιθουανίας + ταλόνας Λιθουανίας + + + Μετατρέψιμο Φράγκο Λουξεμβούργου + LUC + LUC + + + Φράγκο Λουξεμβούργου + φράγκο Λουξεμβούργου + φράγκα Λουξεμβούργου + + + Οικονομικό Φράγκο Λουξεμβούργου + LUL + LUL + + + Λατς Λετονίας + λατς Λετονίας + λατς Λετονίας + + + Ρούβλι Λετονίας + ρούβλι Λετονίας + ρούβλια Λετονίας + + + Δηνάριο Λιβύης + δηνάριο Λιβύης + δηνάρια Λιβύης + + + Ντιράμ Μαρόκου + ντιράμ Μαρόκου + ντιράμ Μαρόκου + + + Φράγκο Μαρόκου + φράγκο Μαρόκου + φράγκα Μαρόκου + + + Λέι Μολδαβίας + λέι Μολδαβίας + λέι Μολδαβίας + + + Αριανί Μαδαγασκάρης + αριάρι Μαδαγασκάρης + αριάρι Μαδαγασκάρης + + + Φράγκο Μαδαγασκάρης + φράγκο Μαδαγασκάρης + φράγκα Μαδαγασκάρης + + + Δηνάριο Π.Γ.Δ.Μ. + δηνάριο Π.Γ.Δ.Μ. + δηνάρια Π.Γ.Δ.Μ. + + + Φράγκο Μαλί + φράγκο Μαλί + φράγκα Μαλί + + + Κυάτ Μιανμάρ + κυάτ Μιανμάρ + κυάτ Μιανμάρ + + + Τουγκρίκ Μογγολίας + τουγκρίκ Μογγολίας + τουγκρίκ Μογγολίας + + + Πατάκα Μακάο + πατάκα Μακάο + πατάκα Μακάο + + + Ουγκουίγκα Μαυριτανίας + ουγκουίγκα Μαυριτανίας + ουγκουίγκα Μαυριτανίας + + + Λιρέτα Μάλτας + λιρέτα Μάλτας + λιρέτες Μάλτας + + + Λίρα Μάλτας + λίρα Μάλτας + λίρες Μάλτας + + + Ρούπια Μαυρικίου + ρούπι Μαυρικίου + ρούπια Μαυρικίου + + + Ρουφίγια Νήσων Μαλδίβων + ρουφίγια Νήσων Μαλδίβων + ρουφίγια Νήσων Μαλδίβων + + + Κουάτσα Μαλάουι + κουάτσα Μαλάουι + κουάτσα Μαλάουι + + + Πέσο Μεξικού + πέσο Μεξικού + πέσο Μεξικού + + + Ασημένιο Πέσο Μεξικού (1861-1992) + ασημένιο πέσο Μεξικού (MXP) + ασημένια πέσο Μεξικού (MXP) + + + Unidad de Inversion (UDI) Μεξικού + Unidad de Inversion (UDI) Μεξικού + Unidads de Inversion (UDI) Μεξικού + + + Ρινγκίτ Μαλαισίας + ρινγκίτ Μαλαισίας + ρινγκίτ Μαλαισίας + + + Εσκούδο Μοζαμβίκης + εσκούδο Μοζαμβίκης + εσκούδο Μοζαμβίκης + + + Παλαιό Μετικάλ Μοζαμβίκης + παλιό μετικάλ Μοζαμβίκης + παλιά μετικάλ Μοζαμβίκης + + + Μετικάλ Μοζαμβίκης + μετικάλ Μοζαμβίκης + μετικάλ Μοζαμβίκης + + + Δολάριο Ναμίμπια + δολάριο Ναμίμπια + δολάρια Ναμίμπια + + + Νάιρα Νιγηρίας + νάιρα Νιγηρίας + νάιρα Νιγηρίας + + + Κόρδοβα Νικαράγουας + κόρδοβα Νικαράγουας + κόρδοβα Νικαράγουας + + + Χρυσή Κόρδοβα Νικαράγουας + χρυσή κόρδοβα Νικαράγουας + χρυσές κόρδοβα Νικαράγουας + + + Γκίλντα Ολλανδίας + γκίλντα Ολλανδίας + γκίλντα Ολλανδίας + + + Κορόνα Νορβηγίας + κορόνα Νορβηγίας + κορόνες Νορβηγίας + + + Ρούπια Νεπάλ + ρούπι Νεπάλ + ρούπια Νεπάλ + + + Δολάριο Νέας Ζηλανδίας + δολάριο Νέας Ζηλανδίας + δολάρια Νέας Ζηλανδίας + + + Ριάλ Ομάν + ριάλ Ομάν + ριάλ Ομάν + + + Μπαλμπόα Παναμά + μπαλμπόα Παναμά + μπαλμπόα Παναμά + + + Ίντι Περού + ίντι Περού + ίντι Περού + + + Νέο Σολ Περού + νέο σολ Περού + νέα Σολ Περού + + + Σολ Περού + σολ Περού + σολ Περού + + + Κίνα Παπούα Νέα Γουινέα + κίνα Παπούα Νέα Γουινέα + κίνα Παπούα Νέα Γουινέα + + + Πέσο Φιλιππίνων + πέσο Φιλιππίνων + πέσο Φιλιππίνων + + + Ρούπια Πακιστάν + ρούπι Πακιστάν + ρούπια Πακιστάν + + + Ζλότυ Πολωνίας + ζλότυ Πολωνίας + ζλότυ Πολωνίας + + + Ζλότυ Πολωνίας (1950-1995) + ζλότυ Πολωνίας (PLZ) + ζλότυ Πολωνίας (PLZ) + + + Εσκούδο Πορτογαλίας + εσκούδο Πορτογαλίας + εσκούδο Πορτογαλίας + + + Γκουαρανί Παραγουάης + γκουαρανί Παραγουάης + γκουαρανί Παραγουάης + + + Ριάλ Κατάρ + ριάλ Κατάρ + ριάλ Κατάρ + + + Δολάριο Ροδεσίας + δολάριο Ροδεσίας + δολάρια Ροδεσίας + + + Λέι Ρουμανίας + παλιό λέι Ρουμανίας + παλιά λέι Ρουμανίας + + + Λεβ Ρουμανίας + λεβ Ρουμανίας + λεβ Ρουμανίας + + + Δηνάριο Σερβίας + δηνάριο Σερβίας + δηνάρια Σερβίας + + + Ρούβλι Ρωσίας + ρούβλι Ρωσίας + ρούβλια Ρωσίας + + + Ρούβλι Ρωσίας (1991-1998) + ρούβλι Ρωσίας (RUR) + ρούβλια Ρωσίας (1991-1998) + + + Φράγκο Ρουάντας + φράγκο Ρουάντας + φράγκα Ρουάντας + + + Ριάλ Σαουδικής Αραβίας + ριάλ Σαουδικής Αραβίας + ριάλ Σαουδικής Αραβίας + + + Δολάριο Νήσων Σολομώντος + δολάριο Νήσων Σολομώντος + δολάρια Νήσων Σολομώντος + + + Ρούπια Σεϋχέλες + ρούπι Σεϋχέλες + ρούπια Σεϋχέλες + + + Δηνάριο Σουδάν + δηνάριο Σουδάν + δηνάρια Σουδάν + + + Λίρα Σουδάν + λίρα Σουδάν + λίρες Σουδάν + + + Παλαιά Λίρα Σουδάν + παλιά λίρα Σουδάν + παλαιές λίρες Σουδάν + + + Κορόνα Σουηδίας + κορόνα Σουηδίας + κορόνες Σουηδίας + + + Δολάριο Σιγκαπούρης + δολάριο Σιγκαπούρης + δολάρια Σιγκαπούρης + + + Λίρα Αγίας Ελένης + λίρα Αγίας Ελένης + λίρες Αγίας Ελένης + + + Τόλαρ Σλοβενίας + τόλαρ Σλοβενίας + τόλαρ Σλοβ + + + Κορόνα Σλοβενίας + κορόνα Σλοβενίας + κορόνες Σλοβενίας + + + Λεόνε Σιέρα Λεόνε + λεόνε Σιέρα Λεόνε + λεόνε Σιέρα Λεόνε + + + Σελίνι Σομαλίας + σελίνι Σομαλίας + σελίνια Σομαλίας + + + Δολάριο Σουρινάμ + δολάριο Σουρινάμ + δολάρια Σουρινάμ + + + Γκίλντα Σουρινάμ + γκίλντα Σουρινάμ + γκίλντα Σουρινάμ + + + Ντόμπρα Σάο Τομέ και Πρίνσιπε + ντόμπρα Σάο Τόμε και Πρίνσιπε + ντόμπρα Σάο Τόμε και Πρίνσιπε + + + Σοβιετικό Ρούβλι + σοβιετικό ρούβλι + σοβιετικά ρούβλια + + + Κολόν Ελ Σαλβαδόρ + κολόν Ελ Σαλβαδόρ + κολόν Ελ Σαλβαδόρ + + + Λίρα Συρίας + λίρα Συρίας + λίρες Συρίας + + + Λιλανγκένι Σουαζιλάνδη + λιλανγκένι Σουαζιλάνδη + λιλανγκένι Σουαζιλάνδη + + + Μπατ Ταϊλάνδης + μπατ Ταϊλάνδης + μπατ Ταϊλάνδης + + + Ρούβλι Τατζικιστάν + ρούβλι Τατζικιστάν + ρούβλια Τατζικιστάν + + + Σομόν Τατζικιστάν + σομόν Τατζικιστάν + σομόν Τατζικιστάν + + + Μανάτ Τουρκμενιστάν + μανάτ Τουρκμενιστάν + μανάτ Τουρκμενιστάν + + + Δηνάριο Τυνησίας + δηνάριο Τυνησίας + δηνάρια Τυνησίας + + + Παάνγκα Τόνγκας + πάνγκα Τόγκα + πάνγκα Τόγκα + + + Εσκούδο Τιμόρ + εσκούδο Τιμόρ + εσκούδο Τιμόρ + + + Λίρα Τουρκίας + παλιά λίρα Τουρκίας + παλιές λίρες Τουρκίας + + + Νέα Τουρκική Λίρα + λίρα Τουρκίας + λίρες Τουρκίας + + + Δολάριο Τρινιντάντ και Τομπάγκο + δολάριο Τρινιδάδ και Τομπάγκο + δολάρια Τρινιδάδ και Τομπάγκο + + + Νέο Δολάριο Ταϊβάν + νέο δολάριο Ταϊβάν + νέα δολάρια Ταϊβάν + + + Σελίνι Τανζανίας + σελίνι Τανζανίας + σελίνι Τανζανίας + + + Χρίφνα Ουκρανίας + χρίφνα Ουκρανίας + χρίφνα Ουκρανίας + + + Καρμποβανέτς Ουκρανίας + καρμποβανέτς Ουκρανίας + καρμποβανέτς Ουκρανίας + + + Σελίνι Ουγκάντας (1966-1987) + σελίνι Ουγκάντας (UGS) + σελίνια Ουγκάντας (UGS) + + + Σελίνι Ουγκάντας + σελίνι Ουγκάντας + σελίνια Ουγκάντας + + + Δολάριο ΗΠΑ + δολάριο Η.Π.Α. + δολάρια Η.Π.Α. + + + Δολάριο ΗΠΑ (επόμενη ημέρα) + δολάριο Η.Π.Α. (επόμενη ημέρα) + δολάρια Η.Π.Α. (επόμενη ημέρα) + + + Δολάριο ΗΠΑ (ίδια ημέρα) + δολάριο Η.Π.Α. (ίδια ημέρα) + δολάρια Η.Π.Α. (ίδια ημέρα) + + + Peso en Unidades Indexadas Ουρουγουάης + peso en unidades indexadas Ουρουγκουάης + pesos en unidades indexadas Ουρουγκουάης + + + Πέσο Ουρουγουάης (1975-1993) + πέσο Ουρουγουάης (UYP) + πέσο Ουρουγουάης (UYP) + + + Πέσο Ουρουγουάης + πέσο Ουρουγουάης + πέσο Ουρουγουάης + + + Σομ Ουζμπεκιστάν + σομ Ουζμπεκιστάν + σομ Ουζμπεκιστάν + + + Μπολιβάρ Βενεζουέλας + μπολιβάρ Βενεζουέλας + μπολιβάρ Βενεζουέλας + + + Βολιβάρ Φουέρτε Βενεζουέλας + βολιβάρ φουέρτε Βενεζουέλας + βολιβάρ φουέρτε Βενεζουέλας + + + Ντονγκ Βιετνάμ + ντονγκ Βιετνάμ + ντονγκ Βιετνάμ + + + Βατού Βανουάτου + βατού Βανουάτου + βατού Βανουάτου + + + Ταλά Δυτικής Σαμόας + Τάλα Σαμόας + τάλα Σαμόας + + + Φράγκο BEAC CFA + φράγκο BEAC CFA + φράγκα BEAC CFA + + + Χρυσός + XAU + XAU + + + Ευρωπαϊκή Σύνθετη Μονάδα + ευρωπαϊκή σύνθετη μονάδα + ευρωπαϊκές σύνθετες μονάδες + + + Ευρωπαϊκή Νομισματική Μονάδα + ευρωπαϊκή νομισματική μονάδα + ευρωπαϊκές νομισματικές μονάδες + + + Ευρωπαϊκή μονάδα λογαριασμού (XBC) + ευρωπαϊκή μονάδα λογαριασμού (XBC) + ευρωπαϊκές μονάδες λογαριασμού (XBC) + + + Ευρωπαϊκή μονάδα λογαριασμού (XBD) + ευρωπαϊκή μονάδα λογαριασμού (XBD) + ευρωπαϊκές μονάδες λογαριασμού (XBD) + + + Δολάριο Ανατολικής Καραϊβικής + δολάριο Ανατολικής Καραϊβικής + δολάρια Ανατολικής Καραϊβικής + + + Ειδικά Δικαιώματα Ανάληψης + ειδικό δικαίωμα ανάληψης + ειδικά δικαιώματα ανάληψης + + + Ευρωπαϊκή Συναλλαγματική Μονάδα + ευρωπαϊκή συναλλαγματική μονάδα + ευρωπαϊκές συναλλαγματικές μονάδες + + + Χρυσό Φράγκο Γαλλίας + χρυσό φράγκο Γαλλίας + χρυσά φράγκα Γαλλίας + + + UIC-Φράγκο Γαλλίας + UIC-φράγκο Γαλλίας + UIC-φράγκα Γαλλίας + + + Φράγκο BCEAO CFA + φράγκο BCEAO CFA + φράγκα BCEAO CFA + + + Φράγκο CFP + φράγκο CFP + φράγκα CFP + + + Άγνωστο ή μη έγκυρο νόμισμα + άγνωστο/μη έγκυρο νόμισμα + Άγνωστο ή μη έγκυρο νόμισμα + + + Δηνάριο Υεμένης + δηνάριο Υεμένης + δηνάρια Υεμένης + + + Ριάλ Υεμένης + ριάλ Υεμένης + ριάλ Υεμένης + + + Μεταλλικό Δηνάριο Γιουγκοσλαβίας + μεταλλικό δηνάριο Γιουγκοσλαβίας + μεταλλικά δηνάρια Γιουγκοσλαβίας + + + Νέο Δηνάριο Γιουγκοσλαβίας + νέο δηνάριο Γιουγκοσλαβίας + νέο δηνάριο Γιουγκοσλαβίας + + + Μετατρέψιμο Δηνάριο Γιουγκοσλαβίας + μετατρέψιμο δινάριο Γιουγκοσλαβίας + μετατρέψιμο δηνάριο Γιουγκοσλαβίας + + + Ραντ Νότιας Αφρικής (οικονομικό) + ραντ Νότιας Αφρικής (οικονομικό) + ραντ Νότιας Αφρικής (οικονομικό) + + + Ραντ Νότιας Αφρικής + ραντ Νότιας Αφρικής + ραντ Νότιας Αφρικής + + + Κουάνζα Ζαΐρ + κουάτσα Ζάμπιας + κουάτσα Ζάμπιας + + + Νέο Ζαΐρ Ζαΐρ + νέο ζαΐρ Ζαΐρ + νέα ζαΐρ Ζαΐρ + + + Ζαΐρ Ζαΐρ + ζαΐρ Ζαΐρ + ζαΐρ Ζαΐρ + + + Δολάριο Ζιμπάμπουε + δολάριο Ζιμπάμπουε + δολάρια Ζιμπάμπουε + + + + + + {0} ημέρα + {0} ημέρες + + + {0} ώρα + {0} ώρες + + + {0} λεπτό + {0} λεπτά + + + {0} μήνας + {0} μήνες + + + {0} δευτερόλεπτο + {0} δευτερόλεπτα + + + {0} εβδομάδα + {0} εβδομάδες + + + {0} έτος + {0} έτη + + + + + ναι:ν + όχι:ό + + + + diff --git a/lib/zend/Zend/Locale/Data/el_CY.xml b/lib/zend/Zend/Locale/Data/el_CY.xml new file mode 100644 index 0000000000..2647d1da45 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/el_CY.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + ¤#,##0.00 + + + + + + diff --git a/lib/zend/Zend/Locale/Data/el_GR.xml b/lib/zend/Zend/Locale/Data/el_GR.xml new file mode 100644 index 0000000000..7ecb6e7080 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/el_GR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/el_POLYTON.xml b/lib/zend/Zend/Locale/Data/el_POLYTON.xml new file mode 100644 index 0000000000..e204bce365 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/el_POLYTON.xml @@ -0,0 +1,542 @@ + + + + + + + + + + + + Ἀραβικά + Ἀραμαϊκά + Οὐαλικά + Αἰγυπτιακὰ (ἀρχαῖα) + Ἑλληνικά + Ἀγγλικά + Ἱσπανικά + Ἐσθονικά + Ἰρλανδικά + Σκωτικὰ κελτικά + Ἀρχαῖα Ἑλληνικά + Ἑβραϊκά + Οὑγγρικά + Ἀρμενικά + Ἰνδονησιακά + Ἰνδοευρωπαϊκὰ (ἄλλα) + Ἰρανικά + Ἰσλανδικά + Ἰταλικά + Ἰαπωνικά + Πολλαπλές γλῶσσες + Ἰνδιανικὰ βόρειας Ἀμερικῆς (ἄλλα) + Ὁλλανδικά + Τουρκικά, ὀθωμανικὰ (1500-1928) + Ἀρχαῖα περσικὰ (600-400 π.Χ.) + Φιλιππινέζικα (ἄλλα) + Σημιτικὰ (ἄλλα) + Σλαβικὰ (ἄλλα) + Ἀλβανικά + Οὐκρανικά + Ἰουδαϊκά + + + + + + + + + + Ἀνδόρα + Ἠνωμένα Ἀραβικὰ Ἐμιράτα + Ἀφγανιστάν + Ἀντίγκουα καὶ Μπαρμπούντα + Ἀνγκουίλα + Ἀλβανία + Ἀρμενία + Ὁλλανδικὲς Ἀντίλλες + Ἀνγκόλα + Ἀνταρκτική + Ἀργεντινή + Ἀμερικανικὴ Σαμόα + Αὐστρία + Αὐστραλία + Ἀρούμπα + Ἀζερμπαϊτζάν + Βοσνία - Ἐρζεγοβίνη + Βερμοῦδες + Νῆσος Μπουβέ + Νῆσοι Κόκος (Κήλινγκ) + Κονγκό, Λαϊκὴ Δημοκρατία τοῦ + Κεντροαφρικανικὴ Δημοκρατία + Ἑλβετία + Ἀκτὴ Ἐλεφαντοστού + Νῆσοι Κούκ + Πράσινο Ἀκρωτήριο + Νῆσος Χριστουγέννων + Δομινικανὴ Δημοκρατία + Ἀλγερία + Ἰσημερινός + Ἐσθονία + Αἴγυπτος + Δυτικὴ Σαχάρα + Ἐρυθραία + Ἱσπανία + Αἰθιοπία + Μικρονησία, Ὁμόσπονδες Πολιτεῖες τῆς + Νῆσοι Φερόες + Ἡνωμένο Βασίλειο + Γαλλικὴ Γουιάνα + Ἰσημερινὴ Γουινέα + Ἑλλάδα + Νότια Γεωργία καὶ Νότιες Νήσοι Σάντουιτς + Χὸνγκ Κόνγκ, Εἰδικὴ Διοικητικὴ Περιφέρεια τῆς Κίνας + Νῆσοι Χὲρντ καὶ Μακντόναλντ + Ὁνδούρα + Ἁϊτή + Οὑγγαρία + Ἰνδονησία + Ἰρλανδία + Ἰσραήλ + Ἰνδία + Βρετανικὰ Ἐδάφη Ἰνδικοῦ Ὠκεανοῦ + Ἰράκ + Ἰράν, Ἰσλαμικὴ Δημοκρατία τοῦ + Ἰσλανδία + Ἰταλία + Ἰορδανία + Ἰαπωνία + Σαὶντ Κὶτς καὶ Νέβις + Νῆσοι Κέιμαν + Λατινικὴ Ἀμερική + Ἁγία Λουκία + Σρὶ Λάνκα + Λουξεμβοῦργο + Μολδαβία, Δημοκρατία τῆς + Νῆσοι Μάρσαλ + Μαλί + Μακάο, Εἰδικὴ Διοικητικὴ Περιφέρεια τῆς Κίνας + Νῆσοι Βόρειες Μαριάνες + Νῆσος Νόρφολκ + Ὁλλανδία + Ὀμάν + Γαλλικὴ Πολυνησία + Σαὶντ Πιὲρ καὶ Μικελόν + Παλαιστινιακὰ Ἐδάφη + Σαουδικὴ Ἀραβία + Νῆσοι Σολομῶντος + Ἁγία Ἑλένη + Νῆσοι Σβάλμπαρ καὶ Γιὰν Μαγιέν + Ἅγιος Μαρίνος + Σάο Τομὲ καὶ Πρίνσιπε + Ἒλ Σαλβαδόρ + Συρία, Ἀραβικὴ Δημοκρατία τῆς + Νῆσοι Τὲρκς καὶ Κάικος + Τσάντ + Γαλλικὰ Νότια Ἐδάφη + Ἀνατολικὸ Τιμόρ + Τρινιδὰδ καὶ Τομπάγκο + Οὐκρανία + Οὐγκάντα + Ἀπομακρυσμένες Νησίδες τῶν Ἡνωμένων Πολιτειῶν + Ἡνωμένες Πολιτεῖες + Οὐρουγουάη + Οὐζμπεκιστάν + Ἁγία Ἕδρα (Βατικανό) + Ἅγιος Βικέντιος καὶ Γρεναδίνες + Βρετανικὲς Παρθένοι Νῆσοι + Ἀμερικανικὲς Παρθένοι Νῆσοι + Νῆσοι Οὐάλλις καὶ Φουτουνά + Ὑεμένη + Νότια Ἀφρική + + + Ἡμερολόγιο + + + Βουδιστικὸ ἡμερολόγιο + Κινεζικὸ ἡμερολόγιο + Σειρὰ Direct + Γρηγοριανὸ ἡμερολόγιο + Ἑβραϊκὸ ἡμερολόγιο + Ἰσλαμικὸ ἡμερολόγιο + Ἰσλαμικὸ ἀστικὸ ἡμερολόγιο + Ἰαπωνικὸ ἡμερολόγιο + Σειρὰ τηλεφωνικοῦ καταλόγου + Σειρὰ Πίνγιν + Σειρὰ Stroke + + + + [α ἀ ἄ ἂ ἆ ἁ ἅ ἃ ἇ ά ὰ ᾶ β-ε ἐ ἔ ἒ ἑ ἕ ἓ έ ὲ ζ η ἠ ἤ ἢ ἦ ἡ ἥ ἣ ἧ ή ὴ ῆ θ ι ἰ ἴ ἲ ἶ ἱ ἵ ἳ ἷ ί ὶ ῖ ϊ ΐ ῒ ῗ κ-ο ὄ ὂ ὃ ό ὸ π ρ σ ς τ υ ὐ ὔ ὒ ὖ ὑ ὕ ὓ ὗ ύ ὺ ῦ ϋ ΰ ῢ ῧ φ-ω ὤ ὢ ὦ ὥ ὣ ὧ ώ ὼ ῶ] + + + ‛ + + + + + + + + Ἰαν + Ἀπρ + Ἰουν + Ἰουλ + Αὐγ + Ὀκτ + + + Ἰανουαρίου + Ἀπριλίου + Ἰουνίου + Ἰουλίου + Αὐγούστου + Ὀκτωβρίου + + + + + Ἰαν + Ἀπρ + Ἰουν + Ἰουλ + Αὐγ + Ὀκτ + + + Ἰανουάριος + Ἀπρίλιος + Ἰούνιος + Ἰούλιος + Αὔγουστος + Ὀκτώβριος + + + + + + + + + + Πεσέτα Ἀνδόρας + + + Ντιρὰμ Ἡνωμένων Ἀραβικῶν Ἐμιράτων + + + Λὲκ Ἀλβανίας + + + Dram Ἀρμενίας + + + Γκίλντα Ὁλλανδικῶν Ἀντιλλῶν + + + Kwanza Ἀνγκόλας + + + Kwanza Ἀνγκόλας (1977-1990) + + + Νέα Kwanza Ἀνγκόλας (1990-2000) + + + Kwanza Reajustado Ἀνγκόλας (1995-1999) + + + Austral Ἀργεντινῆς + + + Πέσο Ἀργεντινῆς (1983-1985) + + + Πέσο Ἀργεντινῆς + + + Σελίνι Αὐστρίας + + + Δολάριο Αὐστραλίας + + + Γκίλντα Ἀρούμπα + + + Μανὰτ Ἀζερμπαϊτζάν + + + Δηνάριο Βοσνίας-Ἑρζεγοβίνης + + + Μάρκο Βοσνίας-Ἑρζεγοβίνης + + + Φράγκο Βελγίου (οἰκονομικό) + + + Μεταλλικὸ Λὲβ Βουλγαρίας + + + Νέο Λὲβ Βουλγαρίας + + + Δολάριο Καναδᾶ + + + Φράγκο Ἑλβετίας + + + Unidades de Fomento Χιλῆς + + + Πέσο Χιλῆς + + + Σκληρὴ Κορόνα Τσεχοσλοβακίας + + + Ἐσκούδο Πράσινου Ἀκρωτηρίου + + + Ostmark Ἀνατολικῆς Γερμανίας + + + Δηνάριο Ἀλγερίας + + + Sucre Ἰσημερινοῦ + + + Unidad de Valor Constante (UVC) Ἰσημερινοῦ + + + Κορόνα Ἐστονίας + + + Λίρα Αἰγύπτου + + + Nakfa Ἐρυθραίας + + + Πεσέτα Ἱσπανίας + + + Birr Αἰθιοπίας + + + Εὐρώ + + + Λίρα Νήσων Φώλκλαντ + + + Dalasi Γκάμπιας + + + Ekwele Guineana Ἰσημερινῆς Γουινέας + + + Quetzal Γουατεμάλας + + + Γκινέα Ἐσκούδο Πορτογαλίας + + + Δολάριο Χὸνγκ Κόνγκ + + + Gourde Ἁϊτῆς + + + Φιορίνι Οὑγγαρίας + + + Ρούπια Ἰνδονησίας + + + Λίρα Ἰρλανδίας + + + Λίρα Ἰσραήλ + + + Νέο Sheqel Ἰσραήλ + + + Ρούπια Ἰνδίας + + + Δηνάριο Ἰράκ + + + Rial Ἰράκ + + + Κορόνα Ἰσλανδίας + + + Λιρέτα Ἰταλίας + + + Δηνάριο Ἰορδανίας + + + Γιὲν Ἰαπωνίας + + + Ρούπια Σρὶ Λάνκας + + + Pataca Μακάου + + + Πέσο Μεξικοῦ + + + Ἀσημένιο Πέσο Μεξικοῦ (1861-1992) + + + Unidad de Inversion (UDI) Μεξικοῦ + + + Ἐσκούδο Μοζαμβίκης + + + Δολάριο Ναμίμπιας + + + Χρυσὴ Κόρδοβα Νικαράγουας + + + Γκίλντα Ὁλλανδίας + + + Μπαλμπόα Παναμᾶ + + + Kina Παπούα Νέα Γουινέας + + + Ἐσκούδο Πορτογαλίας + + + Γκουαρανὶ Παραγουάης + + + Δολάριο Νήσων Σολομῶντος + + + Ρούπια Σεϋχελῶν + + + Λίρα Ἀγίας Ἑλένης + + + Σοβιετικὸ Ρούβλι + + + Colon Ἒλ Σαλβαδόρ + + + Lilangeni Ζουαζιλάνδης + + + Μπὰτ Ταϊλάνδης + + + Μανὰτ Τουρκμενιστάν + + + Ἐσκούδο Τιμόρ + + + Δολάριο Τρινιδὰδ καὶ Τομπάγκο + + + Hryvnia Οὐκρανίας + + + Karbovanetz Οὐκρανίας + + + Σελίνι Οὐγκάντας (1966-1987) + + + Σελίνι Οὐγκάντας + + + Δολάριο ΗΠΑ (Ἑπόμενη ἡμέρα) + + + Δολάριο ΗΠΑ (Ἴδια ἡμέρα) + + + Πέσο Οὐρουγουάης (1975-1993) + + + Πέσο Uruguayo Οὐρουγουάης + + + Sum Οὐζμπεκιστάν + + + Μπολιβὰλ Βενεζουέλας + + + Tala Δυτικῆς Σαμόας + + + Εὐρωπαϊκὴ Σύνθετη Μονάδα + + + Εὐρωπαϊκὴ Νομισματικὴ Μονάδα + + + Εὐρωπαϊκὴ Μονάδα Λογαριασμοῦ (XBC) + + + Εὐρωπαϊκὴ Μονάδα Λογαριασμοῦ (XBD) + + + Δολάριο Ἀνατολικῆς Καραϊβικῆς + + + Εἰδικὰ Δικαιώματα Ἀνάληψης + + + Εὐρωπαϊκὴ Συναλλαγματικὴ Μονάδα + + + Χρυσὸ Φράγκο Γαλλίας + + + Δηνάριο Ὑεμένης + + + Rial Ὑεμένης + + + Μεταλλικὸ Δηνάριο Γιουγκοσλαβίας + + + Ραντ Νότιας Ἀφρικῆς (οἰκονομικό) + + + Ρὰντ Νότιας Ἀφρικῆς + + + + + + Ναί + Ὄχι + + + + diff --git a/lib/zend/Zend/Locale/Data/en.xml b/lib/zend/Zend/Locale/Data/en.xml new file mode 100644 index 0000000000..fcca722bee --- /dev/null +++ b/lib/zend/Zend/Locale/Data/en.xml @@ -0,0 +1,4095 @@ + + + + + + + + + + + {0} ({1}) + , + + + Afar + Abkhazian + Achinese + Acoli + Adangme + Adyghe + Avestan + Afrikaans + Afro-Asiatic Language + Afrihili + Ainu + Akan + Akkadian + Aleut + Algonquian Language + Southern Altai + Amharic + Aragonese + Old English + Angika + Apache Language + Arabic + Aramaic + Araucanian + Arapaho + Artificial Language + Arawak + Assamese + Asturian + Athapascan Language + Australian Language + Avaric + Awadhi + Aymara + Azerbaijani + Bashkir + Banda + Bamileke Language + Baluchi + Balinese + Basa + Baltic Language + Belarusian + Beja + Bemba + Berber + Bulgarian + Bihari + Bhojpuri + Bislama + Bikol + Bini + Siksika + Bambara + Bengali + Bantu + Tibetan + Breton + Braj + Bosnian + Batak + Buriat + Buginese + Blin + Catalan + Caddo + Central American Indian Language + Carib + Caucasian Language + Atsam + Chechen + Cebuano + Celtic Language + Chamorro + Chibcha + Chagatai + Chuukese + Mari + Chinook Jargon + Choctaw + Chipewyan + Cherokee + Cheyenne + Chamic Language + Corsican + Coptic + English-based Creole or Pidgin + French-based Creole or Pidgin + Portuguese-based Creole or Pidgin + Cree + Crimean Turkish + Creole or Pidgin + Czech + Kashubian + Church Slavic + Cushitic Language + Chuvash + Welsh + Danish + Dakota + Dargwa + Dayak + German + Austrian German + Swiss High German + Delaware + Slave + Dogrib + Dinka + Dogri + Dravidian Language + Lower Sorbian + Duala + Middle Dutch + Divehi + Dyula + Dzongkha + Ewe + Efik + Ancient Egyptian + Ekajuk + Greek + Elamite + English + Australian English + Canadian English + British English + U.S. English + Middle English + Esperanto + Spanish + Latin American Spanish + Iberian Spanish + Estonian + Basque + Ewondo + Persian + Fang + Fanti + Fulah + Finnish + Filipino + Finno-Ugrian Language + Fijian + Faroese + Fon + French + Canadian French + Swiss French + Middle French + Old French + Northern Frisian + Eastern Frisian + Friulian + Western Frisian + Irish + Ga + Gayo + Gbaya + Scottish Gaelic + Germanic Language + Geez + Gilbertese + Galician + Middle High German + Guarani + Old High German + Gondi + Gorontalo + Gothic + Grebo + Ancient Greek + Swiss German + Gujarati + Manx + Gwichʼin + Hausa + Haida + Hawaiian + Hebrew + Hindi + Hiligaynon + Himachali + Hittite + Hmong + Hiri Motu + Croatian + Upper Sorbian + Haitian + Hungarian + Hupa + Armenian + Herero + Interlingua + Iban + Indonesian + Interlingue + Igbo + Sichuan Yi + Ijo + Inupiaq + Iloko + Indic Language + Indo-European Language + Ingush + Ido + Iranian Language + Iroquoian Language + Icelandic + Italian + Inuktitut + Japanese + Lojban + Judeo-Persian + Judeo-Arabic + Javanese + Georgian + Kara-Kalpak + Kabyle + Kachin + Jju + Kamba + Karen + Kawi + Kabardian + Tyap + Koro + Kongo + Khasi + Khoisan Language + Khotanese + Kikuyu + Kuanyama + Kazakh + Kalaallisut + Khmer + Kimbundu + Kannada + Korean + Konkani + Kosraean + Kpelle + Kanuri + Karachay-Balkar + Karelian + Kru + Kurukh + Kashmiri + Kurdish + Kumyk + Kutenai + Komi + Cornish + Kirghiz + Latin + Ladino + Lahnda + Lamba + Luxembourgish + Lezghian + Ganda + Limburgish + Lingala + Lao + Mongo + Lozi + Lithuanian + Luba-Katanga + Luba-Lulua + Luiseno + Lunda + Luo + Lushai + Latvian + Madurese + Magahi + Maithili + Makasar + Mandingo + Austronesian Language + Masai + Moksha + Mandar + Mende + Malagasy + Middle Irish + Marshallese + Maori + Micmac + Minangkabau + Miscellaneous Language + Macedonian + Mon-Khmer Language + Malayalam + Mongolian + Manchu + Manipuri + Manobo Language + Moldavian + Mohawk + Mossi + Marathi + Malay + Maltese + Multiple Languages + Munda Language + Creek + Mirandese + Marwari + Burmese + Mayan Language + Erzya + Nauru + Nahuatl + North American Indian Language + Neapolitan + Norwegian Bokmål + North Ndebele + Low German + Nepali + Newari + Ndonga + Nias + Niger-Kordofanian Language + Niuean + Dutch + Flemish + Norwegian Nynorsk + Norwegian + Nogai + Old Norse + N’Ko + South Ndebele + Northern Sotho + Nubian Language + Navajo + Classical Newari + Nyanja + Nyamwezi + Nyankole + Nyoro + Nzima + Occitan + Ojibwa + Oromo + Oriya + Ossetic + Osage + Ottoman Turkish + Otomian Language + Punjabi + Papuan Language + Pangasinan + Pahlavi + Pampanga + Papiamento + Palauan + Old Persian + Philippine Language + Phoenician + Pali + Polish + Pohnpeian + Prakrit Language + Old Provençal + Pashto + Portuguese + Brazilian Portuguese + Iberian Portuguese + Quechua + Rajasthani + Rapanui + Rarotongan + Rhaeto-Romance + Rundi + Romanian + Romance Language + Romany + Root + Russian + Aromanian + Kinyarwanda + Sanskrit + Sandawe + Yakut + South American Indian Language + Salishan Language + Samaritan Aramaic + Sasak + Santali + Sardinian + Sicilian + Scots + Sindhi + Northern Sami + Selkup + Semitic Language + Sango + Old Irish + Sign Language + Serbo-Croatian + Shan + Sinhala + Sidamo + Siouan Language + Sino-Tibetan Language + Slovak + Slovenian + Slavic Language + Samoan + Southern Sami + Sami Language + Lule Sami + Inari Sami + Skolt Sami + Shona + Soninke + Somali + Sogdien + Songhai + Albanian + Serbian + Sranan Tongo + Serer + Swati + Nilo-Saharan Language + Southern Sotho + Sundanese + Sukuma + Susu + Sumerian + Swedish + Swahili + Classical Syriac + Syriac + Tamil + Tai Language + Telugu + Timne + Tereno + Tetum + Tajik + Thai + Tigrinya + Tigre + Tiv + Turkmen + Tokelau + Tagalog + Klingon + Tlingit + Tamashek + Tswana + Tonga + Nyasa Tonga + Tok Pisin + Turkish + Taroko + Tsonga + Tsimshian + Tatar + Tumbuka + Tupi Language + Altaic Language + Tuvalu + Twi + Tahitian + Tuvinian + Udmurt + Uighur + Ugaritic + Ukrainian + Umbundu + Unknown or Invalid Language + Urdu + Uzbek + Vai + Venda + Vietnamese + Volapük + Votic + Walloon + Wakashan Language + Walamo + Waray + Washo + Sorbian Language + Wolof + Kalmyk + Xhosa + Yao + Yapese + Yiddish + Yoruba + Yupik Language + Zhuang + Zapotec + Blissymbols + Zenaga + Chinese + Simplified Chinese + Traditional Chinese + Zande + Zulu + Zuni + No linguistic content + Zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + World + Africa + North America + South America + Oceania + Western Africa + Central America + Eastern Africa + Northern Africa + Middle Africa + Southern Africa + Americas + Northern America + Caribbean + Eastern Asia + Southern Asia + South-Eastern Asia + Southern Europe + Australia and New Zealand + Melanesia + Micronesian Region + Polynesia + South-Central Asia + Asia + Central Asia + Western Asia + Europe + Eastern Europe + Northern Europe + Western Europe + Commonwealth of Independent States + Czechoslovakia + Latin America and the Caribbean + Channel Islands + Andorra + United Arab Emirates + Afghanistan + Antigua and Barbuda + Anguilla + Albania + Armenia + Netherlands Antilles + Angola + Antarctica + Argentina + American Samoa + Austria + Australia + Aruba + Åland Islands + Azerbaijan + Bosnia and Herzegovina + Barbados + Bangladesh + Belgium + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei + Bolivia + British Antarctic Territory + Brazil + Bahamas + Bhutan + Bouvet Island + Botswana + Belarus + Belize + Canada + Cocos [Keeling] Islands + Congo - Kinshasa + Central African Republic + Congo - Brazzaville + Switzerland + Côte d’Ivoire + Cook Islands + Chile + Cameroon + China + Colombia + Costa Rica + Serbia and Montenegro + Canton and Enderbury Islands + Cuba + Cape Verde + Christmas Island + Cyprus + Czech Republic + East Germany + Germany + Djibouti + Denmark + Dominica + Dominican Republic + Algeria + Ecuador + Estonia + Egypt + Western Sahara + Eritrea + Spain + Ethiopia + Finland + Fiji + Falkland Islands + Micronesia + Faroe Islands + French Southern and Antarctic Territories + France + Metropolitan France + Gabon + United Kingdom + Grenada + Georgia + French Guiana + Guernsey + Ghana + Gibraltar + Greenland + Gambia + Guinea + Guadeloupe + Equatorial Guinea + Greece + South Georgia and the South Sandwich Islands + Guatemala + Guam + Guinea-Bissau + Guyana + Hong Kong SAR China + Heard Island and McDonald Islands + Honduras + Croatia + Haiti + Hungary + Indonesia + Ireland + Israel + Isle of Man + India + British Indian Ocean Territory + Iraq + Iran + Iceland + Italy + Jersey + Jamaica + Jordan + Japan + Johnston Island + Kenya + Kyrgyzstan + Cambodia + Kiribati + Comoros + Saint Kitts and Nevis + North Korea + South Korea + Kuwait + Cayman Islands + Kazakhstan + Laos + Lebanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lithuania + Luxembourg + Latvia + Libya + Morocco + Monaco + Moldova + Montenegro + Saint Martin + Madagascar + Marshall Islands + Midway Islands + Macedonia + Mali + Myanmar [Burma] + Mongolia + Macau SAR China + Northern Mariana Islands + Martinique + Mauritania + Montserrat + Malta + Mauritius + Maldives + Malawi + Mexico + Malaysia + Mozambique + Namibia + New Caledonia + Niger + Norfolk Island + Nigeria + Nicaragua + Netherlands + Norway + Nepal + Dronning Maud Land + Nauru + Neutral Zone + Niue + New Zealand + Oman + Panama + Pacific Islands Trust Territory + Peru + French Polynesia + Papua New Guinea + Philippines + Pakistan + Poland + Saint Pierre and Miquelon + Pitcairn Islands + Puerto Rico + Palestinian Territories + Portugal + U.S. Miscellaneous Pacific Islands + Palau + Paraguay + Panama Canal Zone + Qatar + Outlying Oceania + European Union + Réunion + Romania + Serbia + Russia + Rwanda + Saudi Arabia + Solomon Islands + Seychelles + Sudan + Sweden + Singapore + Saint Helena + Slovenia + Svalbard and Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Suriname + São Tomé and Príncipe + Union of Soviet Socialist Republics + El Salvador + Syria + Swaziland + Turks and Caicos Islands + Chad + French Southern Territories + Togo + Thailand + Tajikistan + Tokelau + Timor-Leste + Turkmenistan + Tunisia + Tonga + Turkey + Trinidad and Tobago + Tuvalu + Taiwan + Tanzania + Ukraine + Uganda + U.S. Minor Outlying Islands + United States + Uruguay + Uzbekistan + Vatican City + Saint Vincent and the Grenadines + North Vietnam + Venezuela + British Virgin Islands + U.S. Virgin Islands + Vietnam + Vanuatu + Wallis and Futuna + Wake Island + Samoa + People's Democratic Republic of Yemen + Yemen + Mayotte + South Africa + Zambia + Zimbabwe + Unknown or Invalid Region + + + Traditional German orthography + Standardized Resian orthography + German orthography of 1996 + Late Middle French to 1606 + Early Modern French + Academic + Eastern Armenian + Western Armenian + Unified Turkic Latin Alphabet + San Giorgio/Bila dialect + Boontling + IPA Phonetics + UPA Phonetics + Common Orthography + The Lipovaz dialect of Resian + Monotonic + Natisone dialect + Gniva/Njiva dialect + Oseacco/Osojane dialect + Pinyin Romanization + Polytonic + Computer + Revised Orthography + Resian + Saho + Scottish Standard English + Scouse + Stolvizza/Solbica dialect + Taraskievica orthography + Unified Orthography + Unified Revised Orthography + Valencian + Wade-Giles Romanization + + + Arabic-Indic Digits + Extended Arabic-Indic Digits + Armenian Numerals + Armenian Lowercase Numerals + Bengali Digits + Traditional Chinese Sort Order - Big5 + Buddhist Calendar + Chinese Calendar + Coptic Calendar + Devanagari Digits + Direct Sort Order + Ethiopic Numerals + Ethiopic Calendar + Ethiopic Amete Alem Calendar + Full Width Digits + Simplified Chinese Sort Order - GB2312 + Georgian Numerals + Gregorian Calendar + Greek Numerals + Greek Lowercase Numerals + Gujarati Digits + Gurmukhi Digits + Simplified Chinese Numerals + Simplified Chinese Financial Numerals + Traditional Chinese Numerals + Traditional Chinese Financial Numerals + Hebrew Numerals + Hebrew Calendar + Indian National Calendar + Islamic Calendar + Islamic-Civil Calendar + Japanese Calendar + Japanese Numerals + Japanese Financial Numerals + Khmer Digits + Kannada Digits + Lao Digits + Western Digits + Malayalam Digits + Mongolian Digits + Myanmar Digits + Oriya Digits + Persian Calendar + Phonebook Sort Order + Simplified Chinese Pinyin Sort Order + Republic of China Calendar + Roman Numerals + Roman Lowercase Numerals + Traditional Chinese Stroke Sort Order + Tamil Numerals + Telugu Digits + Thai Digits + Tibetan Digits + Traditional Sort Order + + + US + Metric + + + Language: {0} + Script: {0} + Region: {0} + + + + [a-z] + [á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ß ú ù ŭ û ü ū ÿ] + [a-c č d-l ł m-z] + + + “ + ” + ‘ + ’ + + + + + + + + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + + + January + February + March + April + May + June + July + August + September + October + November + December + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + Sun + Mon + Tue + Wed + Thu + Fri + Sat + + + Sunday + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + + + + + S + M + T + W + T + F + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1st quarter + 2nd quarter + 3rd quarter + 4th quarter + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Before Christ + Anno Domini + + + BC + AD + + + B + A + + + + + + EEEE, MMMM d, y + + + + + MMMM d, y + + + + + MMM d, y + + + + + M/d/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d EEE + H:mm + H:mm:ss + L + E, M/d + LLL + E, MMM d + E, MMMM d + MMMM d + MMM d + M/d + d + h:mm a + mm:ss + y + M/yyyy + EEE, M/d/yyyy + MMM y + EEE, MMM d, y + MMMM y + Q yyyy + QQQ y + + + {0} – {1} + + M–M + + + E, M/d – E, M/d + E, M/d – E, M/d + + + MMM–MMM + + + E, MMM d – E, MMM d + E, MMM d – E, MMM d + + + LLLL-LLLL + + + MMM d – MMM d + MMM d–d + + + M/d – M/d + M/d – M/d + + + d–d + + + h a – h a + h–h a + + + h:mm a – h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + h:mm a – h:mm a v + h:mm–h:mm a v + h:mm–h:mm a v + + + h a – h a v + h–h a v + + + y–y + + + M/yy – M/yy + M/yy – M/yy + + + E, M/d/yy – E, M/d/yy + E, M/d/yy – E, M/d/yy + E, M/d/yy – E, M/d/yy + + + MMM–MMM y + MMM y – MMM y + + + E, MMM d – E, MMM d, y + E, MMM d – E, MMM d, y + E, MMM d, y – E, MMM d, y + + + MMMM–MMMM y + MMMM y – MMMM y + + + MMM d – MMM d, y + MMM d–d, y + MMM d, y – MMM d, y + + + M/d/yy – M/d/yy + M/d/yy – M/d/yy + M/d/yy – M/d/yy + + + + + + Era + + + Year + + + Month + + + Week + + + Day + Yesterday + Today + Tomorrow + + + Day of the Week + + + AM/PM + + + Hour + + + Minute + + + Second + + + Zone + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} Time + {1} ({0}) + + Unknown + + + Dumont d’Urville + + + + British Summer Time + + + BST + + + + + Irish Summer Time + + + IST (Irish) + + + + + Acre Time + Acre Summer Time + + + + + Afghanistan Time + + + + + Central Africa Time + + + + + East Africa Time + + + + + South Africa Time + South Africa Standard Time + + + SAT + + + + + West Africa Time + West Africa Summer Time + + + + + Aktyubinsk Time + Aktyubinsk Summer Time + + + + + Alaska Time + Alaska Standard Time + Alaska Daylight Time + + + AKT + + true + + + + Alaska-Hawaii Time + Alaska-Hawaii Standard Time + Alaska-Hawaii Daylight Time + + + AHT + + + + + Almaty Time + Almaty Summer Time + + + + + Amazon Time + Amazon Summer Time + + + + + Central Time + Central Standard Time + Central Daylight Time + + + CT + + true + + + + Eastern Time + Eastern Standard Time + Eastern Daylight Time + + + ET + + true + + + + Mountain Time + Mountain Standard Time + Mountain Daylight Time + + + MT + + true + + + + Pacific Time + Pacific Standard Time + Pacific Daylight Time + + + PT + + true + + + + Anadyr Time + Anadyr Summer Time + + + + + Aqtau Time + Aqtau Summer Time + + + + + Aqtobe Time + Aqtobe Summer Time + + + + + Arabian Time + Arabian Standard Time + Arabian Daylight Time + + + AT (Arabian) + AST (Arabian) + ADT (Arabian) + + + + + Argentina Time + Argentina Summer Time + + + + + Western Argentina Time + + + + + Armenia Time + Armenia Summer Time + + + AMT (Armenia) + AMST (Armenia) + + + + + Ashkhabad Time + Ashkhabad Summer Time + + + + + Atlantic Time + Atlantic Standard Time + Atlantic Daylight Time + + + AT + + true + + + + Central Australia Time + Australian Central Standard Time + Australian Central Daylight Time + + + ACT + + + + + Australian Central Western Time + Australian Central Western Standard Time + Australian Central Western Daylight Time + + + ACWT + + + + + Eastern Australia Time + Australian Eastern Standard Time + Australian Eastern Daylight Time + + + AET + + + + + Western Australia Time + Australian Western Standard Time + Australian Western Daylight Time + + + AWT + + + + + Azerbaijan Time + Azerbaijan Summer Time + + + + + Azores Time + Azores Summer Time + + + + + Baku Time + Baku Summer Time + + + + + Bangladesh Time + + + + + Bering Time + Bering Standard Time + Bering Daylight Time + + + BT (Bering) + + + + + Bhutan Time + + + + + Bolivia Time + + + + + Borneo Time + Borneo Summer Time + + + + + Brasilia Time + Brasilia Summer Time + + + + + Brunei Darussalam Time + + + + + Cape Verde Time + Cape Verde Summer Time + + + + + Chamorro Time + Chamorro Standard Time + + + ChT + + + + + Changbai Time + + + + + Chatham Standard Time + Chatham Daylight Time + + + + + Chile Time + Chile Summer Time + + + + + China Time + China Standard Time + China Daylight Time + + + CT (China) + CST (China) + CDT (China) + + + + + Choibalsan Time + Choibalsan Summer Time + + + + + Christmas Island Time + + + + + Cocos Islands Time + + + + + Colombia Time + Colombia Summer Time + + + + + Cook Islands Time + Cook Islands Half Summer Time + + + + + Cuba Time + Cuba Standard Time + Cuba Daylight Time + + + CST (Cuba) + CDT (Cuba) + + + + + Dacca Time + + + + + Davis Time + + + + + Dumont-d'Urville Time + + + + + Dushanbe Time + Dushanbe Summer Time + + + + + Dutch Guiana Time + + + + + East Timor Time + + + + + Easter Island Time + Easter Island Summer Time + + + + + Ecuador Time + + + + + Central European Time + Central European Summer Time + + + + + Eastern European Time + Eastern European Summer Time + + + + + Western European Time + Western European Summer Time + + + + + Falkland Islands Time + Falkland Islands Summer Time + + + + + Fiji Time + Fiji Summer Time + + + + + French Guiana Time + + + + + French Southern and Antarctic Time + + + + + Frunze Time + Frunze Summer Time + + + + + Greenwich Mean Time + + true + + + + Galapagos Time + + + + + Gambier Time + + + + + Georgia Time + Georgia Summer Time + + + + + Gilbert Islands Time + + + + + Central Greenland Time + Central Greenland Summer Time + + + + + East Greenland Time + East Greenland Summer Time + + + + + West Greenland Time + West Greenland Summer Time + + + + + Guam Standard Time + + + GST (Guam) + + + + + Gulf Time + Gulf Standard Time + + + GT + + + + + Guyana Time + + + + + Hawaii-Aleutian Standard Time + + true + + + + Hong Kong Time + Hong Kong Summer Time + + + + + Hovd Time + Hovd Summer Time + + + + + India Standard Time + + + + + Indian Ocean Time + + + + + Indochina Time + + + + + Central Indonesia Time + + + + + Eastern Indonesia Time + + + + + Western Indonesia Time + + + + + Iran Standard Time + Iran Daylight Time + + + + + Irkutsk Time + Irkutsk Summer Time + + + + + Israel Time + Israel Standard Time + Israel Daylight Time + + + IST (Israel) + + + + + Japan Time + Japan Standard Time + Japan Daylight Time + + + JT + + + + + Petropavlovsk-Kamchatski Time + Petropavlovsk-Kamchatski Summer Time + + + + + Karachi Time + + + + + Kashgar Time + + + + + East Kazakhstan Time + East Kazakhstan Standard Time + + + + + West Kazakhstan Time + West Kazakhstan Standard Time + + + + + Kizilorda Time + Kizilorda Summer Time + + + + + Korean Time + Korean Standard Time + Korean Daylight Time + + + KT + + + + + Kosrae Time + + + + + Krasnoyarsk Time + Krasnoyarsk Summer Time + + + + + Kuybyshev Time + Kuybyshev Summer Time + + + + + Kwajalein Time + + + + + Kyrgystan Time + + + + + Lanka Time + + + + + Line Islands Time + + + + + Long-Shu Time + + + + + Lord Howe Time + Lord Howe Standard Time + Lord Howe Daylight Time + + + LHT + + + + + Macau Time + Macau Summer Time + + + + + Magadan Time + Magadan Summer Time + + + + + Malaya Time + + + + + Malaysia Time + + + + + Maldives Time + + + + + Marquesas Time + + + + + Marshall Islands Time + + + + + Mauritius Time + Mauritius Summer Time + + + + + Mawson Time + + + + + Ulan Bator Time + Ulan Bator Summer Time + + + + + Moscow Time + Moscow Standard Time + Moscow Summer Time + + + + + Myanmar Time + + + + + Nauru Time + + + + + Nepal Time + + + + + New Caledonia Time + New Caledonia Summer Time + + + + + New Zealand Time + New Zealand Standard Time + New Zealand Daylight Time + + + NZT + + + + + Newfoundland Time + Newfoundland Standard Time + Newfoundland Daylight Time + + + NT + + + + + Niue Time + + + + + Norfolk Islands Time + + + + + Fernando de Noronha Time + Fernando de Noronha Summer Time + + + + + North Mariana Islands Time + + + + + Novosibirsk Time + Novosibirsk Summer Time + + + + + Omsk Time + Omsk Summer Time + + + + + Pakistan Time + Pakistan Summer Time + + + + + Palau Time + + + + + Papua New Guinea Time + + + + + Paraguay Time + Paraguay Summer Time + + + + + Peru Time + Peru Summer Time + + + + + Philippine Time + Philippine Summer Time + + + + + Phoenix Islands Time + + + + + Pierre and Miquelon Time + Pierre and Miquelon Standard Time + Pierre and Miquelon Daylight Time + + + PMT + + + + + Pitcairn Time + + + + + Ponape Time + + + + + Qyzylorda Time + Qyzylorda Summer Time + + + + + Reunion Time + + + + + Rothera Time + + + + + Sakhalin Time + Sakhalin Summer Time + + + + + Samara Time + Samara Summer Time + + + + + Samarkand Time + Samarkand Summer Time + + + + + Samoa Standard Time + + + + + Seychelles Time + + + + + Shevchenko Time + Shevchenko Summer Time + + + + + Singapore Standard Time + + + + + Solomon Islands Time + + + + + South Georgia Time + + + GST (S. Georgia) + + + + + Suriname Time + + + + + Sverdlovsk Time + Sverdlovsk Summer Time + + + + + Syowa Time + + + + + Tahiti Time + + + + + Tajikistan Time + + + + + Tashkent Time + Tashkent Summer Time + + + + + Tbilisi Time + Tbilisi Summer Time + + + + + Tokelau Time + + + + + Tonga Time + Tonga Summer Time + + + + + Truk Time + + + + + Turkey Time + Turkey Summer Time + + + + + Turkmenistan Time + Turkmenistan Summer Time + + + + + Tuvalu Time + + + + + Ural'sk Time + Ural'sk Summer Time + + + + + Uruguay Time + Uruguay Summer Time + + + + + Urumqi Time + + + + + Uzbekistan Time + Uzbekistan Summer Time + + + + + Vanuatu Time + Vanuatu Summer Time + + + + + Venezuela Time + + + + + Vladivostok Time + Vladivostok Summer Time + + + + + Volgograd Time + Volgograd Summer Time + + + + + Vostok Time + + + + + Wake Island Time + + + + + Wallis and Futuna Time + + + + + Yakutsk Time + Yakutsk Summer Time + + + + + Yekaterinburg Time + Yekaterinburg Summer Time + + + + + Yerevan Time + Yerevan Summer Time + + + + + Yukon Time + Yukon Standard Time + Yukon Daylight Time + + + YT + + + + + + + . + , + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00;(¤#,##0.00) + + + {0} {1} + {0} {1} + + + + Andorran Peseta + Andorran peseta + Andorran pesetas + + + United Arab Emirates Dirham + UAE dirham + UAE dirhams + + + Afghan Afghani (1927-2002) + Afghan Afghani (AFA) + Afghan Afghanis (AFA) + + + Afghan Afghani + Afghan Afghani + Afghan Afghanis + + + Albanian Lek + Albanian lek + Albanian lekë + + + Armenian Dram + Armenian dram + Armenian drams + + + Netherlands Antillean Guilder + Netherlands Antillean guilder + Netherlands Antillean guilders + + + Angolan Kwanza + Angolan kwanza + Angolan kwanzas + + + Angolan Kwanza (1977-1990) + Angolan kwanza (AOK) + Angolan kwanzas (AOK) + + + Angolan New Kwanza (1990-2000) + Angolan new kwanza (AON) + Angolan new kwanzas (AON) + + + Angolan Kwanza Reajustado (1995-1999) + Angolan kwanza reajustado (AOR) + Angolan kwanzas reajustado (AOR) + + + Argentine Austral + Argentine austral + Argentine australs + + + Argentine Peso Ley + Argentine peso ley + Argentine pesos ley + + + Argentine Peso Moneda Nacional + Argentine peso moneda nacional + Argentine pesos moneda nacional + + + Argentine Peso (1983-1985) + Argentine peso (ARP) + Argentine pesos (ARP) + + + Argentine Peso + Argentine peso + Argentine pesos + + + Austrian Schilling + Austrian schilling + Austrian schillings + + + Australian Dollar + Australian dollar + Australian dollars + + + Aruban Florin + Aruban florin + Aruban florin + + + Azerbaijani Manat (1993-2006) + Azerbaijani manat (AZM) + Azerbaijani manats (AZM) + + + Azerbaijani Manat + Azerbaijani manat + Azerbaijani manats + + + Bosnia-Herzegovina Dinar + Bosnia-Herzegovina dinar + Bosnia-Herzegovina dinars + + + Bosnia-Herzegovina Convertible Mark + Bosnia-Herzegovina convertible mark + Bosnia-Herzegovina convertible marks + + + Bosnia-Herzegovina New Dinar + Bosnia-Herzegovina new dinar + Bosnia-Herzegovina new dinars + + + Barbadian Dollar + Barbadian dollar + Barbadian dollars + + + Bangladeshi Taka + Bangladeshi taka + Bangladeshi takas + + + Belgian Franc (convertible) + Belgian franc (convertible) + Belgian francs (convertible) + + + Belgian Franc + Belgian franc + Belgian francs + + + Belgian Franc (financial) + Belgian franc (financial) + Belgian francs (financial) + + + Bulgarian Hard Lev + Bulgarian hard lev + Bulgarian hard leva + + + Bulgarian Socialist Lev + Bulgarian socialist lev + Bulgarian socialist leva + + + Bulgarian Lev + Bulgarian lev + Bulgarian leva + + + Old Bulgarian Lev + Old Bulgarian lev + Old Bulgarian leva + + + Bahraini Dinar + Bahraini dinar + Bahraini dinars + + + Burundian Franc + Burundian franc + Burundian francs + + + Bermudan Dollar + Bermudan dollar + Bermudan dollars + + + Brunei Dollar + Brunei dollar + Brunei dollars + + + Bolivian Boliviano + Bolivian boliviano + Bolivian bolivianos + + + Old Bolivian Boliviano + Old Bolivian boliviano + Old Bolivian bolivianos + + + Bolivian Peso + Bolivian peso + Bolivian pesos + + + Bolivian Mvdol + Bolivian mvdol + Bolivian mvdols + + + Brazilian Cruzeiro Novo (1967-1986) + Brazilian cruzeiro novo (BRB) + Brazilian cruzeiros novo (BRB) + + + Brazilian Cruzado + Brazilian cruzado + Brazilian cruzados + + + Brazilian Cruzeiro (1990-1993) + Brazilian cruzeiro (BRE) + Brazilian cruzeiros (BRE) + + + Brazilian Real + Brazilian real + Brazilian reals + + + Brazilian Cruzado Novo + Brazilian cruzado novo + Brazilian cruzado novos + + + Brazilian Cruzeiro + Brazilian cruzeiro + Brazilian cruzeiros + + + Old Brazilian Cruzeiro + Old Brazilian cruzeiro + Old Brazilian cruzeiros + + + Bahamian Dollar + Bahamian dollar + Bahamian dollars + + + Bhutanese Ngultrum + Bhutanese ngultrum + Bhutanese ngultrums + + + Burmese Kyat + Burmese kyat + Burmese kyats + + + Botswanan Pula + Botswanan pula + Botswanan pulas + + + Belarusian New Ruble (1994-1999) + Belarusian new ruble (BYB) + Belarusian new rubles (BYB) + + + Belarusian Ruble + Belarusian ruble + Belarusian rubles + + + Belize Dollar + Belize dollar + Belize dollars + + + Canadian Dollar + Canadian dollar + Canadian dollars + + + Congolese Franc + Congolese franc + Congolese francs + + + WIR Euro + WIR euro + WIR euros + + + Swiss Franc + Swiss franc + Swiss francs + + + WIR Franc + WIR franc + WIR francs + + + Chilean Escudo + Chilean escudo + Chilean escudos + + + Chilean Unidades de Fomento + Chilean unidades de fomento + Chilean unidades de fomentos + + + Chilean Peso + Chilean peso + Chilean pesos + + + Chinese Yuan Renminbi + Chinese yuan + Chinese yuan + + + Colombian Peso + Colombian peso + Colombian pesos + + + Unidad de Valor Real + unidad de valor real + unidad de valor reals + + + Costa Rican Colón + Costa Rican colón + Costa Rican colóns + + + Old Serbian Dinar + Old Serbian dinar + Old Serbian dinars + + + Czechoslovak Hard Koruna + Czechoslovak hard koruna + Czechoslovak hard korunas + + + Cuban Convertible Peso + Cuban convertible peso + Cuban convertible pesos + + + Cuban Peso + Cuban peso + Cuban pesos + + + Cape Verdean Escudo + Cape Verdean escudo + Cape Verdean escudos + + + Cypriot Pound + Cypriot pound + Cypriot pounds + + + Czech Republic Koruna + Czech Republic koruna + Czech Republic korunas + + + East German Mark + East German mark + East German marks + + + German Mark + German mark + German marks + + + Djiboutian Franc + Djiboutian franc + Djiboutian francs + + + Danish Krone + Danish krone + Danish kroner + + + Dominican Peso + Dominican peso + Dominican pesos + + + Algerian Dinar + Algerian dinar + Algerian dinars + + + Ecuadorian Sucre + Ecuadorian sucre + Ecuadorian sucres + + + Ecuadorian Unidad de Valor Constante (UVC) + Ecuadorian unidad de valor Constante (UVC) + Ecuadorian unidads de valor Constante (UVC) + + + Estonian Kroon + Estonian kroon + Estonian kroons + + + Egyptian Pound + Egyptian pound + Egyptian pounds + + + Eritrean Nakfa + Eritrean nakfa + Eritrean nakfas + + + Spanish Peseta (A account) + Spanish peseta (A account) + Spanish pesetas (A account) + + + Spanish Peseta (convertible account) + Spanish peseta (convertible account) + Spanish pesetas (convertible account) + + + Spanish Peseta + Spanish peseta + Spanish pesetas + + + Ethiopian Birr + Ethiopian birr + Ethiopian birrs + + + Euro + euro + euros + + + Finnish Markka + Finnish markka + Finnish markkas + + + Fijian Dollar + Fijian dollar + Fijian dollars + + + Falkland Islands Pound + Falkland Islands pound + Falkland Islands pounds + + + French Franc + French franc + French francs + + + British Pound Sterling + British pound sterling + British pound sterlings + + + Georgian Kupon Larit + Georgian kupon larit + Georgian kupon larits + + + Georgian Lari + Georgian lari + Georgian laris + + + Ghanaian Cedi (1979-2007) + Ghanaian cedi (GHC) + Ghanaian cedis (GHC) + + + Ghanaian Cedi + Ghanaian cedi + Ghanaian cedis + + + Gibraltar Pound + Gibraltar pound + Gibraltar pounds + + + Gambian Dalasi + Gambian dalasi + Gambian dalasis + + + Guinean Franc + Guinean franc + Guinean francs + + + Guinean Syli + Guinean syli + Guinean sylis + + + Equatorial Guinean Ekwele + Equatorial Guinean ekwele + Equatorial Guinean ekwele + + + Greek Drachma + Greek drachma + Greek drachmas + + + Guatemalan Quetzal + Guatemalan quetzal + Guatemalan quetzals + + + Portuguese Guinea Escudo + Portuguese Guinea escudo + Portuguese Guinea escudos + + + Guinea-Bissau Peso + Guinea-Bissau peso + Guinea-Bissau pesos + + + Guyanaese Dollar + Guyanaese dollar + Guyanaese dollars + + + Hong Kong Dollar + Hong Kong dollar + Hong Kong dollars + + + Honduran Lempira + Honduran lempira + Honduran lempiras + + + Croatian Dinar + Croatian dinar + Croatian dinars + + + Croatian Kuna + Croatian kuna + Croatian kunas + + + Haitian Gourde + Haitian gourde + Haitian gourdes + + + Hungarian Forint + Hungarian forint + Hungarian forints + + + Indonesian Rupiah + Indonesian rupiah + Indonesian rupiahs + + + Irish Pound + Irish pound + Irish pounds + + + Israeli Pound + Israeli pound + Israeli pounds + + + Old Israeli Sheqel + Old Israeli sheqel + Old Israeli sheqels + + + Israeli New Sheqel + Israeli new sheqel + Israeli new sheqels + + + Indian Rupee + Indian rupee + Indian rupees + + + Iraqi Dinar + Iraqi dinar + Iraqi dinars + + + Iranian Rial + Iranian rial + Iranian rials + + + Old Icelandic Króna + Old Icelandic króna + Old Icelandic krónur + + + Icelandic Króna + Icelandic króna + Icelandic krónur + + + Italian Lira + Italian lira + Italian liras + + + Jamaican Dollar + Jamaican dollar + Jamaican dollars + + + Jordanian Dinar + Jordanian dinar + Jordanian dinars + + + Japanese Yen + Japanese yen + Japanese yen + ¥ + + + Kenyan Shilling + Kenyan shilling + Kenyan shillings + + + Kyrgystani Som + Kyrgystani som + Kyrgystani soms + + + Cambodian Riel + Cambodian riel + Cambodian riels + + + Comorian Franc + Comorian franc + Comorian francs + + + North Korean Won + North Korean won + North Korean won + + + South Korean Hwan + South Korean hwan + South Korean hwan + + + Old South Korean Won + Old South Korean won + Old South Korean won + + + South Korean Won + South Korean won + South Korean won + + + Kuwaiti Dinar + Kuwaiti dinar + Kuwaiti dinars + + + Cayman Islands Dollar + Cayman Islands dollar + Cayman Islands dollars + + + Kazakhstan Tenge + Kazakhstan tenge + Kazakhstan tenges + + + Laotian Kip + Laotian kip + Laotian kips + + + Lebanese Pound + Lebanese pound + Lebanese pounds + + + Sri Lanka Rupee + Sri Lanka rupee + Sri Lanka rupees + + + Liberian Dollar + Liberian dollar + Liberian dollars + + + Lesotho Loti + Lesotho loti + Lesotho lotis + + + Lithuanian Litas + Lithuanian litas + Lithuanian litai + + + Lithuanian Talonas + Lithuanian talonas + Lithuanian talonases + + + Luxembourgian Convertible Franc + Luxembourgian convertible franc + Luxembourgian convertible francs + + + Luxembourgian Franc + Luxembourgian franc + Luxembourgian francs + + + Luxembourg Financial Franc + Luxembourg financial franc + Luxembourg financial francs + + + Latvian Lats + Latvian lats + Latvian lati + + + Latvian Ruble + Latvian ruble + Latvian rubles + + + Libyan Dinar + Libyan dinar + Libyan dinars + + + Moroccan Dirham + Moroccan dirham + Moroccan dirhams + + + Moroccan Franc + Moroccan franc + Moroccan francs + + + Monegasque Franc + Monegasque franc + Monegasque francs + + + Moldovan Cupon + Moldovan cupon + Moldovan cupon + + + Moldovan Leu + Moldovan leu + Moldovan lei + + + Malagasy Ariary + Malagasy Ariary + Malagasy Ariaries + + + Malagasy Franc + Malagasy franc + Malagasy francs + + + Macedonian Denar + Macedonian denar + Macedonian denari + + + Old Macedonian Denar + Old Macedonian denar + Old Macedonian denari + + + Malian Franc + Malian franc + Malian francs + + + Myanma Kyat + Myanma kyat + Myanma kyats + + + Mongolian Tugrik + Mongolian tugrik + Mongolian tugriks + + + Macanese Pataca + Macanese pataca + Macanese patacas + + + Mauritanian Ouguiya + Mauritanian ouguiya + Mauritanian ouguiyas + + + Maltese Lira + Maltese lira + Maltese lira + + + Maltese Pound + Maltese pound + Maltese pounds + + + Mauritian Rupee + Mauritian rupee + Mauritian rupees + + + Maldivian Rupee + Maldivian rupee + Maldivian rupees + + + Maldivian Rufiyaa + Maldivian rufiyaa + Maldivian rufiyaas + + + Malawian Kwacha + Malawian Kwacha + Malawian Kwachas + + + Mexican Peso + Mexican peso + Mexican pesos + + + Mexican Silver Peso (1861-1992) + Mexican silver peso (MXP) + Mexican silver pesos (MXP) + + + Mexican Unidad de Inversion (UDI) + Mexican unidad de inversion (UDI) + Mexican unidads de inversion (UDI) + + + Malaysian Ringgit + Malaysian ringgit + Malaysian ringgits + + + Mozambican Escudo + Mozambican escudo + Mozambican escudos + + + Old Mozambican Metical + Old Mozambican metical + Old Mozambican meticals + + + Mozambican Metical + Mozambican metical + Mozambican meticals + + + Namibian Dollar + Namibian dollar + Namibian dollars + + + Nigerian Naira + Nigerian naira + Nigerian nairas + + + Nicaraguan Cordoba + Nicaraguan cordoba + Nicaraguan cordobas + + + Nicaraguan Cordoba Oro + Nicaraguan cordoba oro + Nicaraguan cordobas oro + + + Dutch Guilder + Dutch guilder + Dutch guilders + + + Norwegian Krone + Norwegian krone + Norwegian kroner + + + Nepalese Rupee + Nepalese rupee + Nepalese rupees + + + New Zealand Dollar + New Zealand dollar + New Zealand dollars + + + Omani Rial + Omani rial + Omani rials + + + Panamanian Balboa + Panamanian balboa + Panamanian balboas + + + Peruvian Inti + Peruvian inti + Peruvian intis + + + Peruvian Nuevo Sol + Peruvian nuevo sol + Peruvian nuevos soles + + + Peruvian Sol + Peruvian sol + Peruvian soles + + + Papua New Guinean Kina + Papua New Guinean kina + Papua New Guinean kina + + + Philippine Peso + Philippine peso + Philippine pesos + Php + + + Pakistani Rupee + Pakistani rupee + Pakistani rupees + + + Polish Zloty + Polish zloty + Polish zlotys + + + Polish Zloty (1950-1995) + Polish zloty (PLZ) + Polish zlotys (PLZ) + + + Portuguese Escudo + Portuguese escudo + Portuguese escudos + + + Paraguayan Guarani + Paraguayan guarani + Paraguayan guaranis + + + Qatari Rial + Qatari rial + Qatari rials + + + Rhodesian Dollar + Rhodesian dollar + Rhodesian dollars + + + Old Romanian Leu + Old Romanian leu + Old Romanian Lei + + + Romanian Leu + Romanian leu + Romanian lei + + + Serbian Dinar + Serbian dinar + Serbian dinars + + + Russian Ruble + Russian ruble + Russian rubles + + + Russian Ruble (1991-1998) + Russian ruble (RUR) + Russian rubles (RUR) + + + Rwandan Franc + Rwandan franc + Rwandan francs + + + Saudi Riyal + Saudi riyal + Saudi riyals + + + Solomon Islands Dollar + Solomon Islands dollar + Solomon Islands dollars + + + Seychellois Rupee + Seychellois rupee + Seychellois rupees + + + Old Sudanese Dinar + Old Sudanese dinar + Old Sudanese dinars + + + Sudanese Pound + Sudanese pound + Sudanese pounds + + + Old Sudanese Pound + Old Sudanese pound + Old Sudanese pounds + + + Swedish Krona + Swedish krona + Swedish kronor + + + Singapore Dollar + Singapore dollar + Singapore dollars + + + Saint Helena Pound + Saint Helena pound + Saint Helena pounds + + + Slovenian Tolar + Slovenian tolar + Slovenian tolars + + + Slovak Koruna + Slovak koruna + Slovak korunas + + + Sierra Leonean Leone + Sierra Leonean leone + Sierra Leonean leones + + + Somali Shilling + Somali shilling + Somali shillings + + + Surinamese Dollar + Surinamese dollar + Surinamese dollars + + + Suriname Guilder + Suriname guilder + Suriname guilders + + + São Tomé and Príncipe Dobra + São Tomé and Príncipe dobra + São Tomé and Príncipe dobras + + + Soviet Rouble + Soviet rouble + Soviet roubles + + + Salvadoran Colón + Salvadoran colón + Salvadoran colones + + + Syrian Pound + Syrian pound + Syrian pounds + + + Swazi Lilangeni + Swazi lilangeni + Swazi emalangeni + + + Thai Baht + Thai baht + Thai baht + + + Tajikistani Ruble + Tajikistani ruble + Tajikistani rubles + + + Tajikistani Somoni + Tajikistani somoni + Tajikistani somonis + + + Turkmenistani Manat + Turkmenistani manat + Turkmenistani manat + + + Turkmenistani New Manat + Turkmenistani new manat + Turkmenistani new manat + + + Tunisian Dinar + Tunisian dinar + Tunisian dinars + + + Tongan Paʻanga + Tongan paʻanga + Tongan paʻanga + + + Timorese Escudo + Timorese escudo + Timorese escudos + + + Old Turkish Lira + old Turkish lira + Old Turkish Lira + + + Turkish Lira + Turkish lira + Turkish Lira + + + Trinidad and Tobago Dollar + Trinidad and Tobago dollar + Trinidad and Tobago dollars + + + New Taiwan Dollar + New Taiwan dollar + New Taiwan dollars + + + Tanzanian Shilling + Tanzanian shilling + Tanzanian shillings + + + Ukrainian Hryvnia + Ukrainian hryvnia + Ukrainian hryvnias + + + Ukrainian Karbovanets + Ukrainian karbovanets + Ukrainian karbovantsiv + + + Ugandan Shilling (1966-1987) + Ugandan shilling (UGS) + Ugandan shillings (UGS) + + + Ugandan Shilling + Ugandan shilling + Ugandan shillings + + + US Dollar + US dollar + US dollars + $ + + + US Dollar (Next day) + US dollar (next day) + US dollars (next day) + + + US Dollar (Same day) + US dollar (same day) + US dollars (same day) + + + Uruguayan Peso en Unidades Indexadas + Uruguayan peso en unidades indexadas + Uruguayan pesos en unidades indexadas + + + Uruguayan Peso (1975-1993) + Uruguayan peso (UYP) + Uruguayan pesos (UYP) + + + Uruguayan Peso + Uruguayan peso + Uruguayan pesos + + + Uzbekistan Som + Uzbekistan som + Uzbekistan som + + + Venezuelan Bolívar + Venezuelan bolívar + Venezuelan bolívars + + + Venezuelan Bolívar Fuerte + Venezuelan bolívar fuerte + Venezuelan bolívars fuertes + + + Vietnamese Dong + Vietnamese dong + Vietnamese dong + + + Old Vietnamese Dong + Old Vietnamese dong + Old Vietnamese dong + + + Vanuatu Vatu + Vanuatu vatu + Vanuatu vatus + + + Samoan Tala + Samoan tala + Samoan tala + + + CFA Franc BEAC + CFA franc BEAC + CFA francs BEAC + + + Silver + Silver + + + Gold + Gold + + + European Composite Unit + European composite unit + European composite units + + + European Monetary Unit + European monetary unit + European monetary units + + + European Unit of Account (XBC) + European unit of account (XBC) + European units of account (XBC) + + + European Unit of Account (XBD) + European unit of account (XBD) + European units of account (XBD) + + + East Caribbean Dollar + East Caribbean dollar + East Caribbean dollars + + + Special Drawing Rights + special drawing rights + special drawing rights + + + European Currency Unit + European currency unit + European currency units + + + French Gold Franc + French gold franc + French gold francs + + + French UIC-Franc + French UIC-franc + French UIC-francs + + + CFA Franc BCEAO + CFA franc BCEAO + CFA francs BCEAO + + + Palladium + Palladium + + + CFP Franc + CFP franc + CFP francs + + + Platinum + Platinum + + + RINET Funds + RINET Funds + + + Testing Currency Code + Testing Currency Code + + + Unknown or Invalid Currency + unknown/invalid currency + + + Yemeni Dinar + Yemeni dinar + Yemeni dinars + + + Yemeni Rial + Yemeni rial + Yemeni rials + + + Yugoslavian Hard Dinar + Yugoslavian hard dinar + Yugoslavian hard dinars + + + Yugoslavian Noviy Dinar + Yugoslavian noviy dinar + Yugoslavian Noviy dinars + + + Yugoslavian Convertible Dinar + Yugoslavian convertible dinar + Yugoslavian convertible dinars + + + Yugoslavian Reformed Dinar + Yugoslavian reformed dinar + Yugoslavian reformed dinars + + + South African Rand (financial) + South African rand (financial) + South African rands (financial) + + + South African Rand + South African rand + South African rand + + + Zambian Kwacha + Zambian kwacha + Zambian kwachas + + + Zairean New Zaire + Zairean new zaire + Zairean new zaires + + + Zairean Zaire + Zairean zaire + Zairean zaires + + + Zimbabwean Dollar + Zimbabwean dollar + Zimbabwean dollars + + + Zimbabwean Dollar (2009) + Zimbabwean dollar (2009) + Zimbabwean dollars (2009) + + + Zimbabwean Dollar (2008) + Zimbabwean dollar (2008) + Zimbabwean dollars (2008) + + + + + + {0} day + {0} days + + + {0} hour + {0} hours + + + {0} minute + {0} minutes + + + {0} month + {0} months + + + {0} second + {0} seconds + + + {0} week + {0} weeks + + + {0} year + {0} years + + + + + yes:y + no:n + + + + diff --git a/lib/zend/Zend/Locale/Data/en_AS.xml b/lib/zend/Zend/Locale/Data/en_AS.xml new file mode 100644 index 0000000000..3cec648488 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/en_AS.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/en_AU.xml b/lib/zend/Zend/Locale/Data/en_AU.xml new file mode 100644 index 0000000000..4c8fad61bd --- /dev/null +++ b/lib/zend/Zend/Locale/Data/en_AU.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + EEEE, d MMMM y + + + + + d MMMM y + + + + + dd/MM/yyyy + + + + + d/MM/yy + + + + + + d MMMM + dd/MM + MM/yyyy + MMMM y + + + {0} - {1} + + M-M + + + E, d/MM - E, d/MM + E, d/MM - E, d/MM + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E, d/MM/yy - E, d/MM/yy + E, d/MM/yy - E, d/MM/yy + E, d/MM/yy - E, d/MM/yy + + + MMM-MMM y + MMM y - MMM y + + + E, d MMM - E, d MMM y + E, d - E, d MMM y + E, d MMM y - E, d MMM y + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + false + + + true + + + true + + + true + + + true + + + true + + + + + + + + ¤#,##0.00 + + + + + + $ + + + US$ + + + + diff --git a/lib/zend/Zend/Locale/Data/en_BE.xml b/lib/zend/Zend/Locale/Data/en_BE.xml new file mode 100644 index 0000000000..80cf449ae4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/en_BE.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + EEEE d MMMM y + + + + + d MMM y + + + + + dd MMM y + + + + + dd/MM/yy + + + + + + + HH 'h' mm 'min' ss 's' zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + dd/MM + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E d MMM - E d MMM + E d - E d MMM + + + d MMM - d MMM + d-d MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM y + MMM y - MMM y + + + E d MMM - E d MMM y + E d - E d MMM y + E d MMM y - E d MMM y + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + , + . + + + + + #,##0.00 ¤ + + + + + + #,##0.00 ¤;-#,##0.00 ¤ + , + . + + + + diff --git a/lib/zend/Zend/Locale/Data/en_BW.xml b/lib/zend/Zend/Locale/Data/en_BW.xml new file mode 100644 index 0000000000..8402335fd5 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/en_BW.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + EEEE dd MMMM y + + + + + dd MMMM y + + + + + dd/MM/yy + + + + + + dd/MM + MMMM y + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E dd MMM - E dd MMM + E dd - E dd MMM + + + dd MMM - dd MMM + dd-dd MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM y + MMM y - MMM y + + + E dd MMM - E dd MMM y + E dd - E dd MMM y + E dd MMM y - E dd MMM y + + + dd MMM - dd MMM y + dd-dd MMM y + dd MMM y - dd MMM y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + + + ¤#,##0.00 + + + + + + P + + + + diff --git a/lib/zend/Zend/Locale/Data/en_BZ.xml b/lib/zend/Zend/Locale/Data/en_BZ.xml new file mode 100644 index 0000000000..42cbf4738d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/en_BZ.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + dd MMMM y + + + + + dd MMMM y + + + + + dd-MMM-y + + + + + dd/MM/yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + dd/MM + MMMM y + + + {0} - {1} + + M-M + + + E, M/d - E, M/d + E, M/d - E, M/d + + + MMM-MMM + + + E, MMM d - E, MMM d + E, MMM d - E, MMM d + + + MMM d - MMM d + MMM d-d + + + M/d - M/d + M/d - M/d + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + M/yy - M/yy + M/yy - M/yy + + + E, M/d/yy - E, M/d/yy + E, M/d/yy - E, M/d/yy + E, M/d/yy - E, M/d/yy + + + MMM-MMM y + MMM y - MMM y + + + E, MMM d - E, MMM d, y + E, MMM d - E, MMM d, y + E, MMM d, y - E, MMM d, y + + + MMM d - MMM d, y + MMM d-d, y + MMM d, y - MMM d, y + + + M/d/yy - M/d/yy + M/d/yy - M/d/yy + M/d/yy - M/d/yy + + + + + + + + + + + ¤#,##0.00 + + + + + + $ + + + US$ + + + + diff --git a/lib/zend/Zend/Locale/Data/en_CA.xml b/lib/zend/Zend/Locale/Data/en_CA.xml new file mode 100644 index 0000000000..b689ee1efc --- /dev/null +++ b/lib/zend/Zend/Locale/Data/en_CA.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + yyyy-MM-dd + + + + + yy-MM-dd + + + + + + MM-dd + MMM-yy + + + {0} - {1} + + M-M + + + E, MM-dd - E, MM-dd + E, MM-dd - E, MM-dd + + + MMM-MMM + + + E, MMM d - E, MMM d + E, MMM d - E, MMM d + + + MMM d - MMM d + MMM d-d + + + MM-dd - MM-dd + MM-dd - MM-dd + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + yy-MM - yy-MM + yy-MM - yy-MM + + + E, yy-MM-dd - E, yy-MM-dd + E, yy-MM-dd - E, yy-MM-dd + E, yy-MM-dd - E, yy-MM-dd + + + MMM-MMM y + MMM y - MMM y + + + E, MMM d - E, MMM d, y + E, MMM d - E, MMM d, y + E, MMM d, y - E, MMM d, y + + + MMM d - MMM d, y + MMM d-d, y + MMM d, y - MMM d, y + + + yy-MM-dd - yy-MM-dd + yy-MM-dd - yy-MM-dd + yy-MM-dd - yy-MM-dd + + + + + + + + true + + + + + + + $ + + + US$ + + + + + diff --git a/lib/zend/Zend/Locale/Data/en_Dsrt.xml b/lib/zend/Zend/Locale/Data/en_Dsrt.xml new file mode 100644 index 0000000000..7ecd8dfe34 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/en_Dsrt.xml @@ -0,0 +1,1024 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 𐐎𐐲𐑉𐑊𐐼 + 𐐈𐑁𐑉𐐲𐐿𐐲 + 𐐤𐐱𐑉𐑃 𐐊𐑋𐐯𐑉𐐲𐐿𐐲 + 𐐝𐐵𐑃 𐐊𐑋𐐯𐑉𐐲𐐿𐐲 + 𐐄𐑇𐐨𐐰𐑌𐐨𐐲 + 𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐈𐑁𐑉𐐲𐐿𐐲 + 𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐊𐑋𐐯𐑉𐐲𐐿𐐲 + 𐐀𐑅𐐻𐐲𐑉𐑌 𐐈𐑁𐑉𐐲𐐿𐐲 + 𐐤𐐱𐑉𐑄𐐲𐑉𐑌 𐐈𐑁𐑉𐐲𐐿𐐲 + 𐐣𐐮𐐼𐑊 𐐈𐑁𐑉𐐮𐐿𐐲 + 𐐝𐐲𐑄𐐲𐑉𐑌 𐐈𐑁𐑉𐐲𐐿𐐲 + 𐐊𐑋𐐯𐑉𐐲𐐿𐐲𐑆 + 𐐤𐐱𐑉𐑄𐐲𐑉𐑌 𐐊𐑋𐐯𐑉𐐲𐐿𐐲 + 𐐗𐐯𐑉𐐲𐐺𐐨𐐲𐑌 + 𐐀𐑅𐐻𐐲𐑉𐑌 𐐁𐑈𐐲 + 𐐝𐐲𐑄𐐲𐑉𐑌 𐐁𐑈𐐲 + 𐐝𐐵𐑃-𐐀𐑅𐐻𐐲𐑉𐑌 𐐁𐑈𐐲 + 𐐝𐐲𐑄𐐲𐑉𐑌 𐐏𐐲𐑉𐐲𐐹 + 𐐉𐑅𐐻𐑉𐐩𐑊𐐨𐐲 𐐰𐑌𐐼 𐐤𐐭 𐐞𐐨𐑊𐐲𐑌𐐼 + 𐐣𐐯𐑊𐐲𐑌𐐨𐑈𐐲 + 𐐣𐐴𐐿𐑉𐐲𐑌𐐨𐑈𐐲𐑌 𐐡𐐨𐐾𐐲𐑌 + 𐐑𐐪𐑊𐐲𐑌𐐨𐑈𐐲 + 𐐝𐐵𐑃-𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐁𐑈𐐲 + 𐐁𐑈𐐲 + 𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐁𐑈𐐲 + 𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐁𐑈𐐲 + 𐐏𐐲𐑉𐐲𐐹 + 𐐀𐑅𐐻𐐲𐑉𐑌 𐐏𐐲𐑉𐐲𐐹 + 𐐤𐐱𐑉𐑄𐐲𐑉𐑌 𐐏𐐲𐑉𐐲𐐹 + 𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐏𐐲𐑉𐐲𐐹 + 𐐗𐐪𐑋𐐲𐑌𐐶𐐯𐑊𐑃 𐐲𐑂 𐐆𐑌𐐼𐐲𐐹𐐯𐑌𐐼𐐲𐑌𐐻 𐐝𐐻𐐩𐐻𐑅 + 𐐕𐐯𐐿𐐬𐑅𐑊𐐬𐑂𐐪𐐿𐐨𐐲 + 𐐢𐐰𐐻𐑌 𐐊𐑋𐐯𐑉𐐲𐐿𐐲 𐐰𐑌𐐼 𐑄 𐐗𐐯𐑉𐐲𐐺𐐨𐐲𐑌 + 𐐕𐐰𐑌𐐲𐑊 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐈𐑌𐐼𐐱𐑉𐐲 + 𐐏𐐭𐑌𐐴𐐼𐐮𐐼 𐐇𐑉𐐲𐐺 𐐇𐑋𐐲𐑉𐐩𐐻𐑅 + 𐐈𐑁𐑀𐐰𐑌𐐲𐑅𐐻𐐰𐑌 + 𐐈𐑌𐐻𐐨𐑀𐐶𐐲 𐐰𐑌𐐼 𐐒𐐪𐑉𐐺𐐷𐐭𐐼𐐲 + 𐐈𐑍𐑀𐐶𐐮𐑊𐐲 + 𐐈𐑊𐐺𐐩𐑌𐐨𐐲 + 𐐂𐑉𐑋𐐨𐑌𐐨𐐲 + 𐐤𐐯𐑄𐐲𐑉𐑊𐐲𐑌𐐼𐑆 𐐈𐑌𐐻𐐮𐑊𐐨𐑆 + 𐐈𐑌𐑀𐐬𐑊𐐲 + 𐐈𐑌𐐻𐐪𐑉𐐿𐐻𐐮𐐿𐐲 + 𐐂𐑉𐐾𐐲𐑌𐐻𐐨𐑌𐐲 + 𐐊𐑋𐐯𐑉𐐲𐐿𐐲𐑌 𐐝𐐲𐑋𐐬𐐲 + 𐐉𐑅𐐻𐑉𐐨𐐲 + 𐐉𐑅𐐻𐑉𐐩𐑊𐐨𐐲 + 𐐊𐑉𐐭𐐺𐐲 + 𐐈𐑊𐐰𐑌𐐼 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐈𐑆𐐲𐑉𐐺𐐴𐑈𐐪𐑌 + 𐐒𐐱𐑆𐑌𐐨𐐲 𐐰𐑌𐐼 𐐐𐐲𐑉𐐻𐑅𐐲𐑀𐐬𐑂𐐨𐑌𐐲 + 𐐒𐐪𐑉𐐺𐐩𐐼𐐬𐑅 + 𐐒𐐪𐑍𐑀𐑊𐐲𐐼𐐯𐑇 + 𐐒𐐯𐑊𐐾𐐲𐑋 + 𐐒𐐲𐑉𐐿𐐩𐑌𐐲 𐐙𐐰𐑅𐐬 + 𐐒𐐲𐑊𐑀𐐯𐑉𐐨𐐲 + 𐐒𐐪𐑉𐐩𐑌 + 𐐒𐐲𐑉𐐳𐑌𐐼𐐨 + 𐐒𐐲𐑌𐐨𐑌 + 𐐝𐐩𐑌𐐻 𐐒𐐪𐑉𐐻𐐩𐑊𐐲𐑋𐐨 + 𐐒𐐲𐑉𐑋𐐷𐐭𐐼𐐲 + 𐐒𐑉𐐭𐑌𐐴 + 𐐒𐐬𐑊𐐮𐑂𐐨𐐲 + 𐐒𐑉𐐮𐐼𐐮𐑇 𐐈𐑌𐐻𐐪𐑉𐐿𐐻𐐮𐐿 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨 + 𐐒𐑉𐐲𐑆𐐮𐑊 + 𐐒𐐲𐐸𐐪𐑋𐐲𐑅 + 𐐒𐐭𐐻𐐪𐑌 + 𐐒𐐭𐑂𐐩 𐐌𐑊𐐲𐑌𐐼 + 𐐒𐐪𐐻𐑅𐐶𐐪𐑌𐐲 + 𐐒𐐯𐑊𐐲𐑉𐐭𐑅 + 𐐒𐐲𐑊𐐨𐑆 + 𐐗𐐰𐑌𐐲𐐼𐐲 + 𐐗𐐬𐐿𐐬𐑆 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐗𐐪𐑍𐑀𐐬 - 𐐗𐐲𐑌𐑇𐐪𐑅𐐲 + 𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐈𐑁𐑉𐐲𐐿𐐲𐑌 𐐡𐐨𐐹𐐲𐐺𐑊𐐮𐐿 + 𐐗𐐪𐑍𐑀𐐬 - 𐐒𐑉𐐪𐑆𐐲𐑂𐐮𐑊 + 𐐝𐐶𐐮𐐻𐑅𐐲𐑉𐑊𐐲𐑌𐐼 + 𐐌𐑂𐑉𐐨 𐐗𐐬𐑅𐐻 + 𐐗𐐳𐐿 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐕𐐨𐑊𐐩 + 𐐗𐐰𐑋𐐲𐑉𐐭𐑌 + 𐐕𐐴𐑌𐐲 + 𐐗𐐲𐑊𐐲𐑋𐐺𐐨𐐲 + 𐐗𐐱𐑅𐐻𐐲 𐐡𐐨𐐿𐐲 + 𐐝𐐲𐑉𐐺𐐨𐐲 𐐰𐑌𐐼 𐐣𐐪𐑌𐐲𐑌𐐨𐑀𐑉𐐬 + 𐐗𐐰𐑌𐐻𐐪𐑌 𐐰𐑌𐐼 𐐇𐑌𐐼𐐲𐑉𐐺𐐯𐑉𐐨 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐗𐐷𐐭𐐺𐐲 + 𐐗𐐩𐐹 𐐚𐐯𐑉𐐼𐐨 + 𐐗𐑉𐐮𐑅𐑋𐐲𐑅 𐐌𐑊𐐲𐑌𐐼 + 𐐝𐐴𐐹𐑉𐐲𐑅 + 𐐕𐐯𐐿 𐐡𐐨𐐹𐐲𐐺𐑊𐐮𐐿 + 𐐀𐑅𐐻 𐐖𐐲𐑉𐑋𐐲𐑌𐐨 + 𐐖𐐲𐑉𐑋𐐲𐑌𐐨 + 𐐖𐐲𐐺𐐭𐐼𐐨 + 𐐔𐐯𐑌𐑋𐐪𐑉𐐿 + 𐐔𐐪𐑋𐐲𐑌𐐨𐐿𐐲 + 𐐔𐐲𐑋𐐮𐑌𐐲𐐿𐐲𐑌 𐐡𐐨𐐹𐐲𐐺𐑊𐐮𐐿 + 𐐈𐑊𐐾𐐮𐑉𐐨𐐲 + 𐐇𐐿𐐶𐐲𐐼𐐱𐑉 + 𐐇𐑅𐐻𐐬𐑌𐐨𐐲 + 𐐀𐐾𐐲𐐹𐐻 + 𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐝𐐲𐐸𐐱𐑉𐐲 + 𐐇𐑉𐐮𐐻𐑉𐐨𐐲 + 𐐝𐐹𐐩𐑌 + 𐐀𐑃𐐨𐐬𐐹𐐨𐐲 + 𐐙𐐮𐑌𐑊𐐲𐑌𐐼 + 𐐙𐐨𐐾𐐨 + 𐐙𐐪𐑊𐐿𐑊𐐲𐑌𐐼 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐣𐐴𐐿𐑉𐐲𐑌𐐨𐑈𐐲 + 𐐙𐐯𐑉𐐬 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐙𐑉𐐯𐑌𐐽 𐐝𐐲𐑄𐐲𐑉𐑌 𐐰𐑌𐐼 𐐈𐑌𐐻𐐪𐑉𐐿𐐻𐐮𐐿 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨𐑆 + 𐐙𐑉𐐰𐑌𐑅 + 𐐣𐐯𐐻𐑉𐐲𐐹𐐪𐑊𐐲𐐻𐐲𐑌 𐐙𐑉𐐰𐑌𐑅 + 𐐘𐐲𐐺𐐪𐑌 + 𐐏𐐭𐑌𐐴𐐻𐐲𐐼 𐐗𐐨𐑍𐐼𐐲𐑋 + 𐐘𐑉𐐲𐑌𐐩𐐼𐐲 + 𐐖𐐱𐑉𐐾𐐲 + 𐐙𐑉𐐯𐑌𐐽 𐐘𐐨𐐪𐑌𐐲 + 𐐘𐐲𐑉𐑌𐑆𐐨 + 𐐘𐐪𐑌𐐲 + 𐐖𐐲𐐺𐑉𐐱𐑊𐐻𐐲𐑉 + 𐐘𐑉𐐨𐑌𐑊𐐲𐑌𐐼 + 𐐘𐐰𐑋𐐺𐐨𐐲 + 𐐘𐐮𐑌𐐨 + 𐐘𐐶𐐪𐐼𐐲𐑊𐐭𐐹 + 𐐇𐐿𐐶𐐲𐐻𐐱𐑉𐐨𐐲𐑊 𐐘𐐮𐑌𐐨 + 𐐘𐑉𐐨𐑅 + 𐐝𐐵𐑃 𐐖𐐱𐑉𐐾𐐲 𐐰𐑌𐐼 𐑄 𐐝𐐵𐑃 𐐝𐐰𐑌𐐼𐐶𐐮𐐽 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐘𐐶𐐪𐐼𐐲𐑋𐐪𐑊𐐲 + 𐐘𐐶𐐪𐑋 + 𐐘𐐮𐑌𐐨-𐐒𐐮𐑅𐐵 + 𐐘𐐴𐐰𐑌𐐲 + 𐐐𐐬𐑍 𐐗𐐬𐑍 𐐝𐐈𐐡 𐐕𐐴𐑌𐐲 + 𐐐𐐲𐑉𐐼 𐐌𐑊𐐲𐑌𐐼 𐐰𐑌𐐼 𐐣𐐿𐐔𐐱𐑌𐐲𐑊𐐼 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐐𐐪𐑌𐐼𐐭𐑉𐐲𐑅 + 𐐗𐑉𐐬𐐩𐑇𐐲 + 𐐐𐐩𐐻𐐨 + 𐐐𐐲𐑍𐑀𐐲𐑉𐐨 + 𐐆𐑌𐐼𐐲𐑌𐐨𐑈𐐲 + 𐐌𐑉𐑊𐐲𐑌𐐼 + 𐐆𐑆𐑉𐐨𐐲𐑊 + 𐐌𐐲𐑊 𐐲𐑁 𐐣𐐰𐑌 + 𐐆𐑌𐐼𐐨𐐲 + 𐐒𐑉𐐮𐐼𐐮𐑇 𐐆𐑌𐐼𐐨𐐲𐑌 𐐄𐑇𐐲𐑌 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨 + 𐐆𐑉𐐰𐐿 + 𐐆𐑉𐐪𐑌 + 𐐌𐑅𐑊𐐲𐑌𐐼 + 𐐆𐐻𐐲𐑊𐐨 + 𐐖𐐲𐑉𐑆𐐨 + 𐐖𐐲𐑋𐐩𐐿𐐲 + 𐐖𐐱𐑉𐐼𐐲𐑌 + 𐐖𐐲𐐹𐐰𐑌 + 𐐖𐐪𐑌𐑅𐐻𐐲𐑌 𐐌𐑊𐐲𐑌𐐼 + 𐐗𐐯𐑌𐐷𐐲 + 𐐗𐐮𐑉𐑀𐐲𐑅𐐻𐐰𐑌 + 𐐗𐐰𐑋𐐺𐐬𐐼𐐨𐐲 + 𐐗𐐮𐑉𐐲𐐺𐐪𐐻𐐨 + 𐐗𐐪𐑋𐐲𐑉𐐬𐑆 + 𐐝𐐩𐑌𐐻 𐐗𐐮𐐻𐑅 𐐰𐑌𐐼 𐐤𐐨𐑂𐐮𐑅 + 𐐤𐐱𐑉𐑃 𐐗𐐲𐑉𐐨𐐲 + 𐐝𐐵𐑃 𐐗𐐲𐑉𐐨𐐲 + 𐐗𐐲𐐶𐐩𐐻 + 𐐗𐐩𐑋𐐲𐑌 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐗𐐲𐑆𐐪𐐿𐑅𐐻𐐪𐑌 + 𐐢𐐪𐐬𐑅 + 𐐢𐐯𐐺𐐲𐑌𐐪𐑌 + 𐐢𐐮𐐿𐐻𐐲𐑌𐑅𐐻𐐴𐑌 + 𐐟𐑉𐐨 𐐢𐐰𐑍𐐿𐐲 + 𐐢𐐴𐐺𐐮𐑉𐐨𐐲 + 𐐢𐐲𐑅𐐬𐑃𐐬 + 𐐢𐐮𐑃𐐲𐐶𐐩𐑌𐐨𐐲 + 𐐢𐐲𐐿𐑅𐐲𐑋𐐺𐐲𐑉𐑀 + 𐐢𐐰𐐻𐑂𐐨𐐲 + 𐐢𐐮𐐺𐐨𐐲 + 𐐣𐐲𐑉𐐪𐐿𐐬 + 𐐣𐐪𐑌𐐲𐐿𐐬 + 𐐣𐐱𐑊𐐼𐐬𐑂𐐲 + 𐐣𐐪𐑌𐐲𐑌𐐨𐑀𐑉𐐬 + 𐐝𐐩𐑌𐐻 𐐣𐐪𐑉𐐻𐑌 + 𐐣𐐰𐐼𐐲𐑀𐐰𐑅𐐿𐐲𐑉 + 𐐣𐐪𐑉𐑇𐐲𐑊 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐣𐐮𐐼𐐶𐐩 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐣𐐰𐑅𐐲𐐼𐐬𐑌𐐨𐐲 + 𐐣𐐪𐑊𐐨 + 𐐣𐐨𐐲𐑌𐑋𐐪𐑉 + 𐐣𐐪𐑍𐑀𐐬𐑊𐐨𐐲 + 𐐣𐐲𐐿𐐵 𐐝𐐈𐐡 𐐕𐐴𐑌𐐲 + 𐐤𐐱𐑉𐑄𐐲𐑉𐑌 𐐣𐐰𐑉𐐨𐐱𐑌𐐲 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐣𐐪𐑉𐐻𐑌𐐨𐐿 + 𐐣𐐱𐑉𐐲𐐻𐐩𐑌𐐨𐐲 + 𐐣𐐪𐑌𐐻𐑅𐐲𐑉𐐪𐐻 + 𐐣𐐱𐑊𐐻𐐲 + 𐐣𐐱𐑉𐐮𐑇𐐲𐑅 + 𐐣𐐪𐑊𐐼𐐨𐑂𐑆 + 𐐣𐐲𐑊𐐪𐐶𐐨 + 𐐣𐐯𐐿𐑅𐐲𐐿𐐬 + 𐐣𐐲𐑊𐐩𐑈𐐲 + 𐐣𐐬𐑆𐐰𐑋𐐺𐐨𐐿 + 𐐤𐐲𐑋𐐮𐐺𐐨𐐲 + 𐐤𐐭 𐐗𐐰𐑊𐐲𐐼𐐬𐑌𐐷𐐲 + 𐐤𐐴𐐾𐐲𐑉 + 𐐤𐐱𐑉𐑁𐐲𐐿 𐐌𐑊𐐲𐑌𐐼 + 𐐤𐐴𐐾𐐮𐑉𐐨𐐲 + 𐐤𐐮𐐿𐐲𐑉𐐪𐑀𐐶𐐲 + 𐐤𐐯𐑄𐐲𐑉𐑊𐐲𐑌𐐼𐑆 + 𐐤𐐱𐑉𐐶𐐩 + 𐐤𐐩𐐹𐐪𐑊 + 𐐔𐑉𐐱𐑌𐐮𐑍 𐐣𐐱𐐼 𐐢𐐰𐑌𐐼 + 𐐤𐐪𐐭𐑉𐐭 + 𐐤𐐭𐐻𐑉𐐲𐑊 𐐞𐐬𐑌 + 𐐤𐐷𐐭𐐩 + 𐐤𐐭 𐐞𐐨𐑊𐐲𐑌𐐼 + 𐐄𐑋𐐲𐑌 + 𐐑𐐰𐑌𐐲𐑋𐐪 + 𐐑𐐲𐑅𐐮𐑁𐐮𐐿 𐐌𐑊𐐲𐑌𐐼𐑆 𐐓𐑉𐐲𐑅𐐻 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨 + 𐐑𐐲𐑉𐐭 + 𐐙𐑉𐐯𐑌𐐽 𐐑𐐪𐑊𐐲𐑌𐐨𐑈𐐲 + 𐐑𐐰𐐹𐐷𐐳𐐲 𐐤𐐭 𐐘𐐮𐑌𐐨 + 𐐙𐐮𐑊𐐲𐐹𐐨𐑌𐑆 + 𐐑𐐰𐐿𐐲𐑅𐐻𐐰𐑌 + 𐐑𐐬𐑊𐐲𐑌𐐼 + 𐐝𐐩𐑌𐐻 𐐑𐐨𐐯𐑉 𐐰𐑌𐐼 𐐣𐐨𐐿𐐲𐑊𐐪𐑌 + 𐐑𐐮𐐻𐐿𐐯𐑉𐑌 + 𐐑𐐶𐐯𐑉𐐻𐐬 𐐡𐐨𐐿𐐬 + 𐐑𐐰𐑊𐐲𐑅𐐻𐐮𐑌𐐨𐐲𐑌 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨 + 𐐑𐐱𐑉𐐽𐐲𐑀𐐲𐑊 + 𐐏.𐐝. 𐐣𐐮𐑅𐐲𐑊𐐩𐑌𐐨𐐲𐑅 𐐑𐐲𐑅𐐮𐑁𐐮𐐿 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐑𐐲𐑊𐐵 + 𐐑𐐯𐑉𐐲𐑀𐐶𐐴 + 𐐑𐐰𐑌𐐲𐑋𐐪 𐐗𐐲𐑌𐐰𐑊 𐐞𐐬𐑌 + 𐐗𐐲𐐻𐐪𐑉 + 𐐍𐐻𐑊𐐴𐐮𐑍 𐐄𐑇𐐨𐐰𐑌𐐨𐐲 + 𐐏𐐲𐑉𐐲𐐹𐐨𐐲𐑌 𐐏𐐭𐑌𐐷𐐲𐑌 + 𐐡𐐨𐐷𐐭𐑌𐐷𐐲𐑌 + 𐐡𐐬𐑋𐐩𐑌𐐨𐐲 + 𐐝𐐲𐑉𐐺𐐨𐐲 + 𐐡𐐲𐑇𐐲 + 𐐡𐐲𐐶𐐪𐑌𐐼𐐲 + 𐐝𐐵𐐼𐐨 𐐊𐑉𐐩𐐺𐐨𐐲 + 𐐝𐐪𐑊𐐲𐑋𐐲𐑌 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐝𐐩𐑇𐐯𐑊𐑆 + 𐐝𐐭𐐼𐐰𐑌 + 𐐝𐐶𐐨𐐼𐑌 + 𐐝𐐮𐑍𐐲𐐹𐐱𐑉 + 𐐝𐐩𐑌𐐻 𐐐𐐯𐑊𐐲𐑌𐐲 + 𐐝𐑊𐐬𐑂𐐨𐑌𐐨𐐲 + 𐐝𐑂𐐪𐑊𐐺𐐪𐑉𐐼 𐐰𐑌𐐼 𐐖𐐰𐑌 𐐣𐐴𐐲𐑌 + 𐐝𐑊𐐬𐑂𐐪𐐿𐐨𐐲 + 𐐝𐐨𐐯𐑉𐐲 𐐢𐐨𐐬𐑌 + 𐐝𐐪𐑌 𐐣𐐲𐑉𐐨𐑌𐐬 + 𐐝𐐯𐑌𐐲𐑀𐐱𐑊 + 𐐝𐐲𐑋𐐪𐑊𐐨𐐲 + 𐐝𐐭𐑉𐐲𐑌𐐪𐑋 + 𐐝𐐵 𐐓𐐬𐑋 𐐰𐑌𐐼 𐐑𐑉𐐮𐑌𐐽𐐮𐐹𐐩 + 𐐏𐐭𐑌𐐷𐐲𐑌 𐐲𐑂 𐐝𐐬𐑂𐐨𐐯𐐻 𐐝𐐬𐑇𐐲𐑊𐐮𐑅𐐻 𐐡𐐨𐐹𐐲𐐺𐑊𐐮𐐿𐑅 + 𐐇𐑊 𐐝𐐰𐑊𐑂𐐲𐐼𐐱𐑉 + 𐐝𐐮𐑉𐐨𐐲 + 𐐝𐐶𐐪𐑆𐐨𐑊𐐰𐑌𐐼 + 𐐓𐐲𐑉𐐿𐑅 𐐰𐑌𐐼 𐐗𐐴𐐿𐐬𐑆 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐕𐐰𐐼 + 𐐙𐑉𐐯𐑌𐐽 𐐝𐐲𐑄𐐲𐑉𐑌 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨𐑆 + 𐐓𐐬𐑀𐐬 + 𐐓𐐴𐑊𐐰𐑌𐐼 + 𐐓𐐲𐐾𐐨𐐿𐐲𐑅𐐻𐐰𐑌 + 𐐓𐐬𐐿𐐯𐑊𐐵 + 𐐀𐑅𐐻 𐐓𐐨𐑋𐐱𐑉 + 𐐓𐐲𐑉𐐿𐑋𐐯𐑌𐐲𐑅𐐻𐐰𐑌 + 𐐓𐐪𐑍𐑀𐐲 + 𐐓𐐲𐑉𐐿𐐨 + 𐐓𐑉𐐮𐑌𐐮𐐼𐐰𐐼 𐐰𐑌𐐼 𐐓𐐲𐐺𐐩𐑀𐐬 + 𐐓𐐲𐑂𐐪𐑊𐐭 + 𐐓𐐴𐐶𐐪𐑌 + 𐐓𐐰𐑌𐑆𐐲𐑌𐐨𐐲 + 𐐏𐐭𐑀𐐰𐑌𐐼𐐲 + 𐐏𐐭𐑌𐐰𐐮𐐻𐐲𐐼 𐐝𐐻𐐩𐐻𐑅 𐐣𐐴𐑌𐐬𐑉 𐐍𐐻𐑊𐐴𐐨𐑍 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐏𐐭𐑌𐐴𐐻𐐲𐐼 𐐝𐐻𐐩𐐻𐑅 + 𐐏𐐳𐑉𐐲𐑀𐐶𐐴 + 𐐅𐑆𐐺𐐯𐐿𐐲𐑅𐐻𐐰𐑌 + 𐐚𐐰𐐼𐐲𐐿𐐲𐑌 + 𐐝𐐩𐑌𐐻 𐐚𐐮𐑌𐑅𐐲𐑌𐐻 𐐰𐑌𐐼 𐑄 𐐘𐑉𐐯𐑌𐐲𐐼𐐨𐑌𐑆 + 𐐤𐐱𐑉𐑃 𐐚𐐨𐐯𐐻𐑌𐐪𐑋 + 𐐒𐑉𐐮𐐼𐐮𐑇 𐐚𐐲𐑉𐐾𐐲𐑌 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐏.𐐝. 𐐚𐐲𐑉𐐾𐐲𐑌 𐐌𐑊𐐲𐑌𐐼𐑆 + 𐐚𐐨𐐯𐐻𐑌𐐪𐑋 + 𐐚𐐪𐑌𐐳𐐪𐐼𐐭 + 𐐎𐐪𐑊𐐮𐑅 𐐰𐑌𐐼 𐐙𐐭𐐻𐐭𐑌𐐲 + 𐐎𐐩𐐿 𐐌𐑊𐐲𐑌𐐼 + 𐐝𐐲𐑋𐐬𐐲 + 𐐑𐐨𐐹𐐲𐑊𐑆 𐐔𐐯𐑋𐐲𐐿𐑉𐐰𐐼𐐮𐐿 𐐡𐐨𐐹𐐲𐐺𐑊𐐮𐐿 𐐲𐑂 𐐏𐐯𐑋𐐲𐑌 + 𐐏𐐯𐑋𐐲𐑌 + 𐐣𐐪𐐷𐐱𐐻 + 𐐝𐐵𐑃 𐐈𐑁𐑉𐐲𐐿𐐲 + 𐐞𐐰𐑋𐐺𐐨𐐲 + 𐐞𐐮𐑋𐐺𐐪𐐺𐐶𐐩 + 𐐊𐑌𐐬𐑌 𐐬𐑉 𐐆𐑌𐑂𐐰𐑊𐐮𐐼 𐐡𐐨𐐾𐐲𐑌 + + + 𐐓𐑉𐐲𐐼𐐮𐑇𐐲𐑌𐑊 𐐖𐐲𐑉𐑋𐐲𐑌 𐐱𐑉𐑃𐐪𐑀𐑉𐐲𐑁𐐨 + 𐐖𐐲𐑉𐑋𐐲𐑌 𐐱𐑉𐑃𐐪𐑀𐑉𐐲𐑁𐐨 𐐲𐑂 1996 + 𐐢𐐩𐐻 𐐣𐐮𐐼𐑊 𐐙𐑉𐐯𐑌𐐽 𐐻𐐭 1606 + 𐐊𐑉𐑊𐐨 𐐣𐐪𐐼𐐲𐑉𐑌 𐐙𐑉𐐯𐑌𐐽 + 𐐀𐑅𐐻𐐲𐑉𐑌 𐐂𐑉𐑋𐐨𐑌𐐨𐐲𐑌 + 𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐂𐑉𐑋𐐨𐑌𐐨𐐲𐑌 + 𐐏𐐭𐑌𐐲𐑁𐐴𐐼 𐐓𐐲𐑉𐐿𐐮𐐿 𐐢𐐰𐐻𐑌 𐐈𐑊𐑁𐐲𐐺𐐲𐐻 + 𐐆𐐙𐐈 𐐙𐐬𐑌𐐯𐐻𐐮𐐿𐑅 + 𐐣𐐪𐑌𐐲𐐻𐐪𐑌𐐮𐐿 + 𐐑𐐱𐑊𐐨𐐻𐐱𐑌𐐮𐐿 + 𐐗𐐲𐑋𐐹𐐷𐐭𐐻𐐯𐑉 + 𐐡𐐲𐑂𐐴𐑆𐐼 𐐉𐑉𐑃𐐪𐑀𐑉𐐲𐑁𐐨 + 𐐝𐐿𐐪𐐼𐐮𐑇 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐆𐑍𐑊𐐮𐑇 + + + 𐐏𐐝 + 𐑋𐐯𐐻𐑉𐐮𐐿 + + + + [𐐨-𐑏] + [a-z] + [a-z] + + + + + + + + 𐐖𐐰𐑌 + 𐐙𐐯𐐺 + 𐐣𐐪𐑉 + 𐐁𐐹𐑉 + 𐐣𐐩 + 𐐖𐐭𐑌 + 𐐖𐐭𐑊 + 𐐂𐑀 + 𐐝𐐯𐐹 + 𐐉𐐿𐐻 + 𐐤𐐬𐑂 + 𐐔𐐨𐑅 + + + 𐐖 + 𐐙 + 𐐣 + 𐐁 + 𐐣 + 𐐖 + 𐐖 + 𐐂 + 𐐝 + 𐐉 + 𐐤 + 𐐔 + + + 𐐖𐐰𐑌𐐷𐐭𐐯𐑉𐐨 + 𐐙𐐯𐐺𐑉𐐭𐐯𐑉𐐨 + 𐐣𐐪𐑉𐐽 + 𐐁𐐹𐑉𐐮𐑊 + 𐐣𐐩 + 𐐖𐐭𐑌 + 𐐖𐐭𐑊𐐴 + 𐐂𐑀𐐲𐑅𐐻 + 𐐝𐐯𐐹𐐻𐐯𐑋𐐺𐐲𐑉 + 𐐉𐐿𐐻𐐬𐐺𐐲𐑉 + 𐐤𐐬𐑂𐐯𐑋𐐺𐐲𐑉 + 𐐔𐐨𐑅𐐯𐑋𐐺𐐲𐑉 + + + + + 𐐖𐐰𐑌 + 𐐣𐐪𐑉 + 𐐁𐐹𐑉 + 𐐣𐐩 + 𐐖𐐭𐑌 + 𐐖𐐭𐑊 + 𐐂𐑀 + 𐐝𐐯𐐹 + 𐐉𐐿𐐻 + 𐐤𐐬𐑂 + 𐐔𐐨𐑅 + + + 𐐖 + 𐐙 + 𐐣 + 𐐁 + 𐐣 + 𐐖 + 𐐖 + 𐐂 + 𐐝 + 𐐉 + 𐐤 + 𐐔 + + + 𐐖𐐰𐑌𐐷𐐭𐐯𐑉𐐨 + 𐐣𐐪𐑉𐐽 + 𐐁𐐹𐑉𐐮𐑊 + 𐐣𐐩 + 𐐖𐐭𐑌 + 𐐖𐐭𐑊𐐴 + 𐐂𐑀𐐲𐑅𐐻 + 𐐝𐐯𐐹𐐻𐐯𐑋𐐺𐐲𐑉 + 𐐉𐐿𐐻𐐬𐐺𐐲𐑉 + 𐐤𐐬𐑂𐐯𐑋𐐺𐐲𐑉 + 𐐔𐐨𐑅𐐯𐑋𐐺𐐲𐑉 + + + + + + + 𐐝𐐲𐑌 + 𐐣𐐲𐑌 + 𐐓𐐭𐑆 + 𐐎𐐯𐑌 + 𐐛𐐲𐑉 + 𐐙𐑉𐐴 + 𐐝𐐰𐐻 + + + 𐐝𐐲𐑌𐐼𐐩 + 𐐣𐐲𐑌𐐼𐐩 + 𐐓𐐭𐑆𐐼𐐩 + 𐐎𐐯𐑌𐑆𐐼𐐩 + 𐐛𐐲𐑉𐑆𐐼𐐩 + 𐐙𐑉𐐴𐐼𐐩 + 𐐝𐐰𐐻𐐲𐑉𐐼𐐩 + + + + + 𐐝 + 𐐣 + 𐐓 + 𐐎 + 𐐛 + 𐐙 + 𐐝 + + + + + + + 𐐗1 + 𐐗2 + 𐐗3 + 𐐗4 + + + 1𐑅𐐻 𐐿𐐶𐐪𐑉𐐻𐐲𐑉 + 2𐑌𐐼 𐐿𐐶𐐪𐑉𐐻𐐲𐑉 + 3𐑉𐐼 𐐿𐐶𐐪𐑉𐐻𐐲𐑉 + 4𐑉𐑃 𐐿𐐶𐐪𐑉𐐻𐐲𐑉 + + + + 𐐈𐐣 + 𐐑𐐣 + + + 𐐒𐐲𐑁𐐬𐑉 𐐗𐑉𐐴𐑅𐐻 + 𐐈𐑌𐐬 𐐔𐐱𐑋𐐮𐑌𐐨 + + + 𐐒𐐗 + 𐐈𐐔 + + + 𐐒 + 𐐈 + + + + + 𐐇𐑉𐐲 + + + 𐐏𐐨𐑉 + + + 𐐣𐐲𐑌𐑃 + + + 𐐎𐐨𐐿 + + + 𐐔𐐩 + 𐐛𐑉𐐨 𐐼𐐩𐑆 𐐲𐑀𐐬 + 𐐜 𐐼𐐩 𐐺𐐲𐑁𐐬𐑉 𐐷𐐯𐑅𐐻𐐲𐑉𐐼𐐩 + 𐐏𐐯𐑅𐐻𐐲𐑉𐐼𐐩 + 𐐓𐐲𐐼𐐩 + 𐐓𐐲𐑋𐐱𐑉𐐬 + 𐐜 𐐼𐐩 𐐰𐑁𐐻𐐲𐑉 𐐻𐐲𐑋𐐱𐑉𐐬 + 𐐛𐑉𐐨 𐐼𐐩𐑆 𐑁𐑉𐐲𐑋 𐑌𐐵 + + + 𐐔𐐩 𐐲𐑂 𐑄 𐐎𐐨𐐿 + + + 𐐈𐐣/𐐑𐐣 + + + 𐐍𐑉 + + + 𐐣𐐮𐑌𐐲𐐻 + + + 𐐝𐐯𐐿𐐲𐑌𐐼 + + + 𐐞𐐬𐑌 + + + + + + 𐐘𐐣𐐓 {0} + 𐐘𐐣𐐓 + {0} 𐐓𐐴𐑋 + + 𐐊𐑌𐑌𐐬𐑌 + + + 𐐝𐐵𐑃 𐐑𐐬𐑊 + + + 𐐣𐐮𐐼𐐶𐐩 + + + 𐐖𐐪𐑌𐑅𐐻𐐲𐑌 + + + 𐐎𐐩𐐿 + + + 𐐈𐐼𐐰𐐿 + + + 𐐤𐐬𐑋 + + + 𐐐𐐪𐑌𐐲𐑊𐐭𐑊𐐭 + + + 𐐁𐑍𐐿𐐲𐑉𐐮𐐾 + + + 𐐏𐐰𐐿𐐭𐐻𐐰𐐻 + + + 𐐖𐐭𐑌𐐬 + + + 𐐢𐐱𐑅 𐐈𐑌𐐾𐐲𐑊𐑅 + + + 𐐒𐐱𐐮𐑆𐐨 + + + 𐐙𐐨𐑌𐐮𐐿𐑅 + + + 𐐟𐐮𐐹𐑉𐐱𐐿 + + + 𐐔𐐯𐑌𐑂𐐲𐑉 + + + 𐐤𐐭 𐐝𐐩𐑊𐐲𐑋, 𐐤𐐱𐑉𐑃 𐐔𐐲𐐿𐐬𐐼𐐲 + + + 𐐝𐐯𐑌𐐻𐐲𐑉, 𐐤𐐱𐑉𐑃 𐐔𐐲𐐿𐐬𐐼𐐲 + + + 𐐟𐐮𐐿𐐪𐑀𐐬 + + + 𐐣𐐲𐑌𐐪𐑋𐐲𐑌𐐨 + + + 𐐚𐐮𐑌𐑅𐐯𐑌𐑆, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲 + + + 𐐑𐐨𐐻𐐲𐑉𐑆𐐺𐐲𐑉𐑀, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲 + + + 𐐓𐐯𐑊 𐐝𐐮𐐼𐐨, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲 + + + 𐐤𐐪𐐿𐑅, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲 + + + 𐐎𐐮𐑌𐐲𐑋𐐰𐐿, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲 + + + 𐐣𐐲𐑉𐐯𐑍𐑀𐐬, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲 + + + 𐐆𐑌𐐼𐐨𐐲𐑌𐐰𐐹𐐬𐑊𐐲𐑅 + + + 𐐢𐐭𐐶𐐨𐑂𐐮𐑊 + + + 𐐚𐐯𐑂𐐩, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲 + + + 𐐣𐐪𐑌𐐻𐐲𐑅𐐯𐑊𐐬, 𐐗𐐲𐑌𐐻𐐲𐐿𐐨 + + + 𐐔𐐲𐐻𐑉𐐱𐐮𐐻 + + + 𐐤𐐭 𐐏𐐱𐑉𐐿 + + + + 𐐊𐑊𐐰𐑅𐐿𐐲𐐓𐐴𐑋 + 𐐊𐑊𐐰𐑅𐐿𐐲 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋 + 𐐊𐑊𐐰𐑅𐐿𐐲𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + + + 𐐊𐐗𐐓 + 𐐊𐐗𐐝𐐓 + 𐐊𐐗𐐔𐐓 + + + + + 𐐊𐑊𐐰𐑅𐐿𐐲-𐐐𐐲𐐶𐐴𐐨 𐐓𐐴𐑋 + 𐐊𐑊𐐰𐑅𐐿𐐲-𐐐𐐲𐐶𐐴𐐨 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋 + 𐐊𐑊𐐰𐑅𐐿𐐲-𐐐𐐲𐐶𐐴𐐨 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + + + 𐐊𐐐𐐓 + 𐐊𐐐𐐝𐐓 + 𐐊𐐐𐐔𐐓 + + + + + 𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐓𐐴𐑋 + 𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋 + 𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + + + 𐐝𐐓 + 𐐝𐐝𐐓 + 𐐝𐐔𐐓 + + + + + 𐐀𐑅𐐻𐐲𐑉𐑌 𐐓𐐴𐑋 + 𐐀𐑅𐐻𐐲𐑉𐑌 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋 + 𐐀𐑅𐐻𐐲𐑉𐑌 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + + + 𐐀𐐓 + 𐐀𐐝𐐓 + 𐐀𐐔𐐓 + + + + + 𐐣𐐵𐑌𐐻𐐲𐑌 𐐓𐐴𐑋 + 𐐣𐐵𐑌𐐻𐐲𐑌 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋 + 𐐣𐐵𐑌𐐻𐐲𐑌 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + + + 𐐣𐐓 + 𐐣𐐝𐐓 + 𐐣𐐔𐐓 + + + + + 𐐑𐐲𐑅𐐮𐑁𐐮𐐿 𐐓𐐴𐑋 + 𐐑𐐲𐑅𐐮𐑁𐐮𐐿 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋 + 𐐑𐐲𐑅𐐮𐑁𐐮𐐿 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + + + 𐐑𐐓 + 𐐑𐐝𐐓 + 𐐑𐐔𐐓 + + + + + 𐐈𐐻𐑊𐐰𐑌𐐻𐐮𐐿 𐐓𐐴𐑋 + 𐐈𐐻𐑊𐐰𐑌𐐻𐐮𐐿 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋 + 𐐈𐐻𐑊𐐰𐑌𐐻𐐮𐐿 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + + + 𐐈𐐓 + 𐐈𐐝𐐓 + 𐐈𐐔𐐓 + + + + + 𐐒𐐯𐑉𐐮𐑍 𐐓𐐴𐑋 + 𐐒𐐯𐑉𐐮𐑍 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋 + 𐐒𐐯𐑉𐐮𐑍 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + + + 𐐒𐐓 (𐐒𐐯𐑉𐐮𐑍 ) + 𐐒𐐝𐐓 (𐐒𐐯𐑉𐐮𐑍 ) + 𐐒𐐔𐐓 (𐐒𐐯𐑉𐐮𐑍 ) + + + + + 𐐐𐐱𐑍 𐐗𐐱𐑍 𐐓𐐴𐑋 + 𐐐𐐱𐑍 𐐗𐐱𐑍 𐐝𐐲𐑋𐐲𐑉 𐐓𐐴𐑋 + + + 𐐐𐐗𐐓 + 𐐐𐐗𐐝𐐓 + + + + + 𐐤𐐭𐑁𐐲𐑌𐐼𐑊𐐲𐑌𐐼 𐐓𐐴𐑋 + 𐐤𐐭𐑁𐐲𐑌𐐼𐑊𐐲𐑌𐐼 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋 + 𐐤𐐭𐑁𐐲𐑌𐐼𐑊𐐲𐑌𐐼 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + + + 𐐤𐐓 + 𐐤𐐝𐐓 + 𐐤𐐔𐐓 + + + + + 𐐏𐐭𐐿𐐪𐑌 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + 𐐏𐐭𐐿𐐪𐑌 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋 + 𐐏𐐭𐐿𐐪𐑌 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋 + + + 𐐏𐐓 + 𐐏𐐝𐐓 + 𐐏𐐔𐐓 + + + + + + + {0} 𐐼𐐩 + {0} 𐐼𐐩𐑆 + + + {0} 𐐵𐑉 + {0} 𐐵𐑉𐑆 + + + {0} 𐑋𐐮𐑌𐐲𐐻 + {0} 𐑋𐐮𐑌𐐲𐐻𐑅 + + + {0} 𐑋𐐲𐑌𐑃𐑅 + {0} 𐑋𐐲𐑌𐑃 + + + {0} 𐑅𐐯𐐿𐐲𐑌𐐼 + {0} 𐑅𐐯𐐿𐐲𐑌𐐼𐑆 + + + {0} 𐐶𐐨𐐿 + {0} 𐐶𐐨𐐿𐑅 + + + {0} 𐐷𐐮𐑉 + {0} 𐐷𐐮𐑉𐑆 + + + + + 𐐷𐐯𐑅:𐐷 + 𐑌𐐬:𐑌 + + + diff --git a/lib/zend/Zend/Locale/Data/en_Dsrt_US.xml b/lib/zend/Zend/Locale/Data/en_Dsrt_US.xml new file mode 100644 index 0000000000..89b20cd0c4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/en_Dsrt_US.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mundo + África + América del Norte + Suramérica + Oceanía + África occidental + Centroamérica + África oriental + África septentrional + África central + África meridional + Américas + Norteamérica + Caribe + Asia oriental + Asia meridional + Sudeste asiático + Europa meridional + Australia y Nueva Zelanda + Melanesia + Micronesia [057] + Polinesia + Asia centromeridional + Asia + Asia central + Asia occidental + Europa + Europa oriental + Europa septentrional + Europa occidental + Comunidad de Estados Independientes + Latinoamérica y el Caribe + Andorra + Emiratos Árabes Unidos + Afganistán + Antigua y Barbuda + Anguila + Albania + Armenia + Antillas Neerlandesas + Angola + Antártida + Argentina + Samoa Americana + Austria + Australia + Aruba + Islas Åland + Azerbaiyán + Bosnia-Herzegovina + Barbados + Bangladesh + Bélgica + Burkina Faso + Bulgaria + Bahréin + Burundi + Benín + San Bartolomé + Bermudas + Brunéi + Bolivia + Brasil + Bahamas + Bután + Isla Bouvet + Botsuana + Bielorrusia + Belice + Canadá + Islas Cocos + República Democrática del Congo + República Centroafricana + Congo + Suiza + Costa de Marfil + Islas Cook + Chile + Camerún + China + Colombia + Costa Rica + Serbia y Montenegro + Cuba + Cabo Verde + Isla Christmas + Chipre + República Checa + Alemania + Yibuti + Dinamarca + Dominica + República Dominicana + Argelia + Ecuador + Estonia + Egipto + Sáhara Occidental + Eritrea + España + Etiopía + Finlandia + Fiyi + Islas Malvinas + Micronesia + Islas Feroe + Francia + Gabón + Reino Unido + Granada + Georgia + Guayana Francesa + Guernsey + Ghana + Gibraltar + Groenlandia + Gambia + Guinea + Guadalupe + Guinea Ecuatorial + Grecia + Islas Georgia del Sur y Sandwich del Sur + Guatemala + Guam + Guinea-Bissau + Guyana + Región Administrativa Especial de Hong Kong de la República Popular China + Islas Heard y McDonald + Honduras + Croacia + Haití + Hungría + Indonesia + Irlanda + Israel + Isla de Man + India + Territorio Británico del Océano Índico + Iraq + Irán + Islandia + Italia + Jersey + Jamaica + Jordania + Japón + Kenia + Kirguistán + Camboya + Kiribati + Comoras + San Cristóbal y Nieves + Corea del Norte + Corea del Sur + Kuwait + Islas Caimán + Kazajistán + Laos + Líbano + Santa Lucía + Liechtenstein + Sri Lanka + Liberia + Lesoto + Lituania + Luxemburgo + Letonia + Libia + Marruecos + Mónaco + Moldavia + Montenegro + San Martín + Madagascar + Islas Marshall + Macedonia + Mali + Myanmar + Mongolia + Región Administrativa Especial de Macao de la República Popular China + Islas Marianas del Norte + Martinica + Mauritania + Montserrat + Malta + Mauricio + Maldivas + Malaui + México + Malasia + Mozambique + Namibia + Nueva Caledonia + Níger + Isla Norfolk + Nigeria + Nicaragua + Países Bajos + Noruega + Nepal + Nauru + Isla Niue + Nueva Zelanda + Omán + Panamá + Perú + Polinesia Francesa + Papúa Nueva Guinea + Filipinas + Pakistán + Polonia + San Pedro y Miquelón + Pitcairn + Puerto Rico + Palestina + Portugal + Palau + Paraguay + Qatar + Territorios alejados de Oceanía + Unión Europea + Reunión + Rumanía + Serbia + Rusia + Ruanda + Arabia Saudí + Islas Salomón + Seychelles + Sudán + Suecia + Singapur + Santa Elena + Eslovenia + Svalbard y Jan Mayen + Eslovaquia + Sierra Leona + San Marino + Senegal + Somalia + Surinam + Santo Tomé y Príncipe + El Salvador + Siria + Suazilandia + Islas Turcas y Caicos + Chad + Territorios Australes Franceses + Togo + Tailandia + Tayikistán + Tokelau + Timor Oriental + Turkmenistán + Túnez + Tonga + Turquía + Trinidad y Tobago + Tuvalu + Taiwán + Tanzania + Ucrania + Uganda + Islas menores alejadas de los Estados Unidos + Estados Unidos + Uruguay + Uzbekistán + Ciudad del Vaticano + San Vicente y las Granadinas + Venezuela + Islas Vírgenes Británicas + Islas Vírgenes de los Estados Unidos + Vietnam + Vanuatu + Wallis y Futuna + Samoa + Yemen + Mayotte + Sudáfrica + Zambia + Zimbabue + Región desconocida o no válida + + + Ortografía alemana tradicional + Ortografía alemana de 1996 + Armenio oriental + alfabeto fonético internacional IPA + Monotónico + Politónico + Ordenador + Ortografía revisada + Valenciano + + + calendario + intercalación + moneda + + + orden del chino tradicional - Big5 + calendario budista + calendario chino + orden directo + orden del chino simplificado - GB2312 + calendario gregoriano + calendario hebreo + calendario nacional hindú + calendario islámico + calendario civil islámico + calendario japonés + orden de listín telefónico + orden pinyin + calendario de la República Popular de China + orden de los trazos + orden tradicional + + + estadounidense + métrico + + + Idioma: {0} + Dialecto: {0} + Región: {0} + + + + titlecase-firstword + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + + + [a á b-e é f-i í j-n ñ o ó p-u ú ü v-z] + [à ă â å ä ã ā æ-è ĕ ê ë ē ì ĭ î ï ī º ò ŏ ô ö ø ō œ ß ù ŭ û ū ÿ] + [a-z] + + + ‘ + ’ + “ + ” + + + {0} – {1} + + + + + + ene + feb + mar + abr + may + jun + jul + ago + sep + oct + nov + dic + + + enero + febrero + marzo + abril + mayo + junio + julio + agosto + septiembre + octubre + noviembre + diciembre + + + + + E + F + M + A + M + J + J + A + S + O + N + D + + + + + + + dom + lun + mar + mié + jue + vie + sáb + + + domingo + lunes + martes + miércoles + jueves + viernes + sábado + + + + + D + L + M + M + J + V + S + + + + + + + T1 + T2 + T3 + T4 + + + 1er trimestre + 2º trimestre + 3er trimestre + 4º trimestre + + + + + 1 + 2 + 3 + 4 + + + + a.m. + p.m. + + + antes de Cristo + anno Dómini + + + a.C. + d.C. + + + + + + EEEE d 'de' MMMM 'de' y + + + + + d 'de' MMMM 'de' y + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + EEE d + HH:mm + HH:mm:ss + H:mm + L + E, d-M + LLL + E d MMM + E d MMMM + d 'de' MMMM + d MMM + dd-MMM + d/MM + MM/dd + d/M + d + hh:mm a + hh:mm:ss a + mm:ss + mm:ss + y + M/yyyy + EEE d/M/yyyy + MMM y + EEE, d MMM y + MMMM 'de' y + Q yyyy + QQQ yyyy + MM/yy + MMM-yy + Q yy + QQQQ 'de' yy + MM/yyyy + + + {0} – {1} + + M–M + + + E d/M – E d/M + E d/M – E d/M + + + MMM–MMM + + + E d MMM – E d MMM + E d MMM – E d MMM + + + LLLL–LLLL + + + d MMM – d MMM + d–d MMM + + + d/M – d/M + d/M – d/M + + + d–d + + + H–H + H–H + + + H:mm – H:mm + H:mm – H:mm + H:mm – H:mm + + + H:mm – H:mm v + H:mm – H:mm v + H:mm – H:mm v + + + H–H v + H–H v + + + y–y + + + M/yy – M/yy + M/yy – M/yy + + + E d/M/yy – E d/M/yy + E d/M/yy – E d/M/yy + E d/M/yy – E d/M/yy + + + MMM–MMM y + MMM y – MMM y + + + E d MMM – E d MMM y + E d MMM – E d MMM y + E d MMM y – E d MMM y + + + MM–MM yyyy + MM-yyyy – MM-yyyy + + + d MMM – d MMM y + d–d MMM y + d MMM y – d MMM y + + + d/M/yy – d/M/yy + M/d/yy – M/d/yy + d/M/yy – d/M/yy + + + + + + era + + + año + + + mes + + + semana + + + día + Hace tres días + antes de ayer + ayer + hoy + mañana + pasado mañana + Dentro de tres días + + + día de la semana + + + periodo del día + + + hora + + + minuto + + + segundo + + + zona + + + + + + +HH:mm;-HH:mm + GMT{0} + Hora de {0} + {1} ({0}) + + Desconocida + + + Anguila + + + Tirana + + + Ereván + + + Polo Sur + + + Dumont d'Urville + + + Río Gallegos + + + Tucumán + + + Córdoba + + + Hora de Argentina (Buenos Aires) + + + Viena + + + Adelaida + + + Sídney + + + Bakú + + + Bruselas + + + Sofía + + + Bahráin + + + Portonovo + + + Bermudas + + + Brunéi + + + Eirunepé + + + Río Branco + + + Cuiabá + + + Belém + + + Araguaína + + + São Paulo + + + Bahía + + + Maceió + + + Belice + + + Hora de Canadá (Edmonton) + + + Hora de Canadá (Regina) + + + Hora de Canadá (Winnipeg) + + + Hora de Canadá (Halifax) + + + St. John’s + + + Zúrich + + + Isla de Pascua + + + Ürümqi + + + Bogotá + + + La Habana + + + Cabo Verde + + + Praga + + + Berlín + + + Yibuti + + + Copenhague + + + Argelia + + + Galápagos + + + Tallin + + + El Cairo + + + Islas Canarias + + + Addis Abeba + + + Fiyi + + + Chuuk + + + Islas Feroe + + + París + + + Londres + + + Granada + + + Tiflis + + + Cayena + + + Guadalupe + + + Atenas + + + Georgia del Sur + + + Puerto Príncipe + + + Yakarta + + + Makasar + + + Dublín + + + Jerusalén + + + Bagdad + + + Teherán + + + Reikiavik + + + Roma + + + Tokio + + + Comoras + + + St. Kitts + + + Seúl + + + Caimán + + + Aktau + + + Aktobe + + + Vientián + + + Santa Lucía + + + Vilna + + + Luxemburgo + + + Trípoli + + + Mónaco + + + Rangún + + + Ulán Bator + + + Macao + + + Martinica + + + Mauricio + + + Maldivas + + + Mazatlán + + + Ciudad de México + + + Mérida + + + Cancún + + + Katmandú + + + Panamá + + + Tahití + + + Varsovia + + + Miquelón + + + Islas Pitcairn + + + Lisboa + + + Palaos + + + Asunción + + + Reunión + + + Bucarest + + + Kaliningrado + + + Moscú + + + Volgogrado + + + Yekaterinburgo + + + Sajalín + + + Riad + + + Jartún + + + Estocolmo + + + Singapur + + + Santa Helena + + + Santo Tomé + + + Salvador + + + Damasco + + + Duchanbé + + + Asjabad + + + Túnez + + + Estambul + + + Puerto España + + + Honolulú + + + Los Ángeles + + + Centro + + + Indianápolis + + + Nueva York + + + Samarcanda + + + San Vicente + + + Johannesburgo + + + + Hora de Acre + Hora de verano de Acre + + + + + Hora de Afganistán + + + + + Hora de África central + + + + + Hora de África oriental + + + + + Hora de Sudáfrica + Hora estándar de África meridional + + + + + Hora de África occidental + Hora de verano de África occidental + + + + + Hora de Aktyubinsk + Hora de verano de Aktyubinsk + + + + + Hora de Alaska + Hora estándar de Alaska + Hora de verano de Alaska + + true + + + + Hora de Alaska-Hawái + Hora estándar de Alaska-Hawái + Hora de verano de Alaska-Hawái + + true + + + + Hora del Amazonas + Hora de verano del Amazonas + + + + + Hora central + Hora estándar central + Hora de verano central + + true + + + + Hora oriental + Hora estándar oriental + Hora de verano oriental + + true + + + + Hora de las Montañas + Hora estándar de Montaña + Hora de verano de Montaña + + true + + + + Hora del Pacífico + Hora estándar del Pacífico + Hora de verano del Pacífico + + true + + + + Hora de Aktau + Hora de verano de Aktau + + + AQTT (Aktau) + AQTST (Aktau) + + + + + Hora de Aktobe + Hora de verano de Aktobe + + + AQTT (Aktobe) + AQTST (Aktobe) + + + + + Hora de Arabia + Hora estándar de Arabia + Hora de verano de Arabia + + + AT (Arabia) + AST (Arabia) + ADT (Arabia) + + + + + Hora de Argentina + Hora de verano de Argentina + + + + + Hora de Argentina occidental + + + + + Hora de Armenia + Hora de verano de Armenia + + + + + Hora de Asjabad + Hora de verano de Asjabad + + + + + Hora del Atlántico + Hora estándar del Atlántico + Hora de verano del Atlántico + + + + + Hora de Australia central + Hora estándar de Australia central + Hora de verano de Australia central + + + + + Hora de Australia centroccidental + Hora estándar de Australia centroccidental + Hora de verano de Australia centroccidental + + + + + Hora de Australia oriental + Hora estándar de Australia oriental + Hora de verano de Australia oriental + + + + + Hora de Australia occidental + Hora estándar de Australia occidental + Hora de verano de Australia occidental + + + + + Hora de Azerbaiyán + Hora de verano de Azerbaiyán + + + + + Hora de las Azores + Hora de verano de las Azores + + + + + Hora de Bakú + Hora de verano de Bakú + + + + + Hora de Bangladesh + + + + + Hora de Bering + Hora estándar de Bering + Hora de verano de Bering + + + + + Hora de Bután + + + + + Hora de Bolivia + + + + + Hora de Borneo + Hora de verano de Borneo + + + + + Hora de Brasilia + Hora de verano de Brasilia + + + + + Hora de Cabo Verde + Hora de verano de Cabo Verde + + + + + Hora estándar de Chamorro + + + + + Hora de Changbai + + + + + Hora de Chile + Hora de verano de Chile + + + + + Hora de China + Hora estándar de China + Hora de verano de China + + + CST (China) + + + + + Hora de Choibalsan + Hora de verano de Choibalsan + + + + + Hora de Colombia + Hora de verano de Colombia + + + + + Hora de Cuba + Hora estándar de Cuba + Hora de verano de Cuba + + + + + Hora de Dacca + + + + + Hora de Dusambé + Hora de verano de Dusambé + + + + + Hora de la Guayana Holandesa + + + + + Hora de Timor Oriental + + + + + Hora de Ecuador + + + + + Hora estándar de Europa Central + Hora de verano de Europa Central + + + CET + CEST + + + + + Hora estándar de Europa del Este + Hora de verano de Europa del Este + + + EET + EEST + + + + + Hora de Europa Occidental + Hora de verano de Europa Occidental + + + + + Hora de la Guayana Francesa + + + + + Hora de Frunze + Hora de verano de Frunze + + + + + Hora media de Greenwich + + + + + Hora de Galápagos + + + + + Hora de Georgia + Hora de verano de Georgia + + + + + Hora de Groenlandia central + Hora de verano de Groenlandia central + + + + + Hora de Groenlandia oriental + Hora de verano de Groenlandia oriental + + + + + Hora de Groenlandia occidental + Hora de verano de Groenlandia occidental + + + + + Hora estándar de Guam + + + + + Hora estándar del Golfo + + + + + Hora de la Guyana + + + + + Hora de Hawái-Aleutianas + Hora estándar de Hawái-Aleutianas + Hora de verano de Hawái-Aleutianas + + true + + + + Hora de Hong Kong + Hora de verano de Hong Kong + + + + + Hora estándar de la India + + + + + Hora de Indochina + + + + + Hora de Indonesia central + + + + + Hora de Indonesia oriental + + + + + Hora de Indonesia occidental + + + + + Hora de Israel + Hora estándar de Israel + Hora de verano de Israel + + + IST (Israel) + + + + + Hora de Japón + Hora estándar de Japón + Hora de verano de Japón + + + + + Hora de Karachi + + + + + Hora de Kashgar + + + + + Hora estándar de Kazajistán oriental + + + + + Hora estándar de Kazajistán occidental + + + + + Hora de Kizil Orda + Hora de verano de Kizil Orda + + + + + Hora de Corea + Hora estándar de Corea + Hora de verano de Corea + + + + + Hora de Kuíbyshev + Hora de verano de Kuíbyshev + + + + + Hora de Kwajalein + + + + + Hora de Kirguistán + + + + + Hora de Sri Lanka + + + + + Hora de Long-Shu + + + + + Hora de Lord Howe + Hora estándar de Lord Howe + Hora de verano de Lord Howe + + + + + Hora de Macao + Hora de verano de Macao + + + + + Hora de Malaya + + + + + Hora de Malasia + + + + + Hora de las Islas Marshall + + + + + Hora de Ulán Bator + Hora de verano de Ulán Bator + + + + + Hora de Moscú + Hora estándar de Moscú + Hora de verano de Moscú + + + + + Hora de Myanmar + + + + + Hora de Nepal + + + + + Hora de Nueva Zelanda + Hora estándar de Nueva Zelanda + Hora de verano de Nueva Zelanda + + + + + Hora de Terranova + Hora estándar de Newfoundland + Hora de verano de Newfoundland + + + + + Hora de Fernando de Noronha + Hora de verano de Fernando de Noronha + + + + + Hora de las Islas Marianas del Norte + + + + + Hora de Pakistán + Hora de verano de Pakistán + + + + + Hora de Paraguay + Hora de verano de Paraguay + + + + + Hora de Perú + Hora de verano de Perú + + + + + Hora de Filipinas + Hora de verano de Filipinas + + + + + Hora de San Pedro y Miquelón + Hora estándar de San Pedro y Miquelón + Hora de verano de San Pedro y Miquelón + + + + + Hora de Qyzylorda + Hora de verano de Qyzylorda + + + + + Hora de Samara + Hora de verano de Samara + + + + + Hora de Samarcanda + Hora de verano de Samarcanda + + + SAMT (Samarcanda) + SAMST (Samarcanda) + + + + + Hora estándar de Samoa + + + + + Hora de Shevchenko + Hora de verano de Shevchenko + + + + + Hora de Georgia meridional + + + + + Hora de Surinam + + + + + Hora de Sverdlovsk + Hora de verano de Sverdlovsk + + + + + Hora de Tayikistán + + + + + Hora de Tashkent + Hora de verano de Tashkent + + + + + Hora de Tbilisi + Hora de verano de Tbilisi + + + + + Hora de Turquía + Hora de verano de Turquía + + + + + Hora de Turkmenistán + Hora de verano de Turkmenistán + + + + + Hora de Oral + Hora de verano de Oral + + + + + Hora de Uruguay + Hora de verano de Uruguay + + + + + Hora de Ürümqi + + + + + Hora de Uzbekistán + Hora de verano de Uzbekistán + + + + + Hora de Venezuela + + + + + Hora de Volgogrado + Hora de verano de Volgogrado + + + + + Hora de Yekaterinburgo + Hora de verano de Yekaterinburgo + + + + + Hora de Ereván + Hora de verano de Ereván + + + + + Hora del Yukón + Hora estándar del Yukón + Hora de verano del Yukón + + + + + + + , + . + ; + % + 0 + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + {0} {1} + + + + peseta andorrana + peseta andorrana + pesetas andorranas + + + dírham de los Emiratos Árabes Unidos + dirham de los Emiratos Árabes Unidos + dirhams de los Emiratos Árabes Unidos + + + afgani (1927-2002) + + + afgani + afgani afgano + afganis afganos + + + lek albanés + lek albanés + lekë albaneses + + + dram armenio + dram armenio + dram armenios + + + florín de las Antillas Neerlandesas + florín de las Antillas Neerlandesas + florines de las Antillas Neerlandesas + + + kwanza angoleño + kwanza angoleño + kwanzas angoleños + + + kwanza angoleño (1977-1990) + + + nuevo kwanza angoleño (1990-2000) + + + kwanza reajustado angoleño (1995-1999) + + + austral argentino + austral argentino + australes argentinos + + + peso argentino (1983-1985) + peso argentino (ARP) + pesos argentinos (ARP) + + + peso argentino + peso argentino + pesos argentinos + + + chelín austriaco + chelín austriaco + chelines austriacos + + + dólar australiano + dólar australiano + dólares australianos + + + florín de Aruba + florín de Aruba + florines de Aruba + + + manat azerí (1993-2006) + + + manat azerí + manat azerí + manat azeríes + + + dinar bosnio + dinar bosnio + dinares bosnios + + + marco convertible de Bosnia-Herzegovina + marco convertible de Bosnia-Herzegovina + marcos convertibles de Bosnia-Herzegovina + + + dólar de Barbados + dólar de Barbados + dólares de Barbados + + + taka de Bangladesh + taka de Bangladesh + taka de Bangladesh + + + franco belga (convertible) + franco belga (convertible) + francos belgas (convertibles) + + + franco belga + franco belga + francos belgas + + + franco belga (financiero) + franco belga (financiero) + francos belgas (financieros) + + + lev fuerte búlgaro + lev fuerte búlgaro + leva fuertes búlgaros + + + nuevo lev búlgaro + nuevo lev búlgaro + nuevos leva búlgaros + + + dinar bahreiní + dinar bahreiní + dinares bahreiníes + + + franco de Burundi + franco de Burundi + francos de Burundi + + + dólar de Bermudas + dólar de Bermudas + dólares de Bermudas + + + dólar de Brunéi + dólar de Brunéi + dólares de Brunéi + + + boliviano + boliviano + bolivianos + + + peso boliviano + peso boliviano + pesos bolivianos + + + MVDOL boliviano + MVDOL boliviano + MVDOL bolivianos + + + nuevo cruceiro brasileño (1967-1986) + nuevo cruzado brasileño (BRB) + nuevos cruzados brasileños (BRB) + + + cruzado brasileño + cruzado brasileño + cruzados brasileños + + + cruceiro brasileño (1990-1993) + cruceiro brasileño (BRE) + cruceiros brasileños (BRE) + + + real brasileño + real brasileño + reales brasileños + + + nuevo cruzado brasileño + nuevo cruzado brasileño + nuevos cruzados brasileños + + + cruceiro brasileño + cruceiro brasileño + cruceiros brasileños + + + dólar de las Bahamas + dólar de las Bahamas + dólares de las Bahamas + + + ngultrum butanés + ngultrum butanés + ngultrum butaneses + + + kyat birmano + kyat birmano + kyat birmanos + + + pula botsuano + pula botsuana + pula botsuanas + + + nuevo rublo bielorruso (1994-1999) + nuevo rublo bielorruso + nuevos rublos bielorrusos + + + rublo bielorruso + rublo bielorruso + rublos bielorrusos + + + dólar de Belice + dólar de Belice + dólares de Belice + + + dólar canadiense + dólar canadiense + dólares canadienses + + + franco congoleño + franco congoleño + francos congoleños + + + euro WIR + euro WIR + euros WIR + + + franco suizo + franco suizo + francos suizos + + + franco WIR + franco WIR + francos WIR + + + unidad de fomento chilena + unidad de fomento chilena + unidades de fomento chilenas + + + peso chileno + peso chileno + pesos chilenos + + + yuan renminbi chino + yuan renminbi chino + + + peso colombiano + peso colombiano + pesos colombianos + + + unidad de valor real colombiana + unidad de valor real + unidades de valor reales + + + colón costarricense + colón costarricense + colones costarricenses + + + antiguo dinar serbio + antiguo dinar serbio + antiguos dinares serbios + + + corona fuerte checoslovaca + corona fuerte checoslovaca + coronas fuertes checoslovacas + + + peso cubano + peso cubano + pesos cubanos + + + escudo de Cabo Verde + escudo de Cabo Verde + escudos de Cabo Verde + + + libra chipriota + libra chipriota + libras chipriotas + + + corona checa + corona checa + coronas checas + + + ostmark de Alemania del Este + marco de la República Democrática Alemana + marcos de la República Democrática Alemana + + + marco alemán + marco alemán + marcos alemanes + + + franco de Yibuti + + + corona danesa + corona danesa + coronas danesas + + + peso dominicano + peso dominicano + pesos dominicanos + + + dinar argelino + dinar argelino + dinares argelinos + + + sucre ecuatoriano + sucre ecuatoriano + sucres ecuatorianos + + + unidad de valor constante (UVC) ecuatoriana + unidad de valor constante (UVC) ecuatoriana + unidades de valor constante (UVC) ecuatorianas + + + corona estonia + corona estonia + coronas estonias + + + libra egipcia + libra egipcia + libras egipcias + + + nakfa eritreo + + + peseta española (cuenta A) + peseta española (cuenta A) + pesetas españolas (cuenta A) + + + peseta española (cuenta convertible) + peseta española (cuenta convertible) + pesetas españolas (cuenta convertible) + + + peseta española + peseta española + pesetas españolas + ₧ + + + birr etíope + + + euro + euro + euros + + + marco finlandés + marco finlandés + marcos finlandeses + + + dólar de las Islas Fiyi + + + libra de las Islas Malvinas + libra de las Islas Malvinas + libras de las Islas Malvinas + + + franco francés + franco francés + francos franceses + + + libra esterlina británica + libra esterlina británica + libras esterlinas británicas + + + kupon larit georgiano + + + lari georgiano + + + cedi ghanés + + + libra de Gibraltar + libra gibraltareña + libras gibraltareñas + + + dalasi gambiano + + + franco guineano + franco guineano + francos guineanos + + + syli guineano + + + ekuele de Guinea Ecuatorial + ekuele de Guinea Ecuatorial + ekueles de Guinea Ecuatorial + + + dracma griego + dracma griego + dracmas griegos + + + quetzal guatemalteco + quetzal guatemalteco + quetzales guatemaltecos + + + escudo de Guinea Portuguesa + + + peso de Guinea-Bissáu + + + dólar guyanés + + + dólar de Hong Kong + dólar de Hong Kong + dólares de Hong Kong + + + lempira hondureño + lempira hondureño + lempiras hondureños + + + dinar croata + dinar croata + dinares croatas + + + kuna croata + kuna croata + kunas croatas + + + gourde haitiano + + + florín húngaro + florín húngaro + florines húngaros + + + rupia indonesia + rupia indonesia + rupias indonesias + + + libra irlandesa + libra irlandesa + libras irlandesas + + + libra israelí + libra israelí + libras israelíes + + + nuevo sheqel israelí + + + rupia india + rupia india + rupias indias + + + dinar iraquí + dinar iraquí + dinares iraquíes + + + rial iraní + + + corona islandesa + corona islandesa + coronas islandesas + + + lira italiana + lira italiana + liras italianas + + + dólar de Jamaica + dólar de Jamaica + dólares de Jamaica + + + dinar jordano + dinar jordano + dinares jordanos + + + yen japonés + yen japonés + yenes japoneses + + + chelín keniata + + + som kirguís + + + riel camboyano + + + franco comorense + + + won norcoreano + + + won surcoreano + + + dinar kuwaití + + + dólar de las Islas Caimán + dólar de las Islas Caimán + dólares de las Islas Caimán + + + tenge kazako + + + kip laosiano + + + libra libanesa + libra libanesa + libras libanesas + + + rupia de Sri Lanka + rupia de Sri Lanka + rupias de Sri Lanka + + + dólar liberiano + dólar liberiano + dólares liberianos + + + loti lesothense + + + litas lituano + litas lituana + litas lituanas + + + talonas lituano + talonas lituana + talonas lituanas + + + franco convertible luxemburgués + franco convertible luxemburgués + francos convertibles luxemburgueses + + + franco luxemburgués + franco luxemburgués + francos luxemburgueses + + + franco financiero luxemburgués + franco financiero luxemburgués + francos financieros luxemburgueses + + + lats letón + lats letón + lats letones + + + rublo letón + rublo letón + rublos letones + + + dinar libio + dinar libio + dinares libios + + + dirham marroquí + dirham marroquí + dirhams marroquíes + + + franco marroquí + franco marroquí + francos marroquíes + + + leu moldavo + + + ariary malgache + + + franco malgache + + + dinar macedonio + dinar macedonio + dinares macedonios + + + franco malí + + + kyat de Myanmar + + + tugrik mongol + + + pataca de Macao + + + ouguiya mauritano + + + lira maltesa + lira maltesa + liras maltesas + + + libra maltesa + libra maltesa + libras maltesas + + + rupia mauriciana + + + rufiyaa de Maldivas + + + kwacha de Malawi + + + peso mexicano + peso mexicano + pesos mexicanos + + + peso de plata mexicano (1861-1992) + peso de plata mexicano (MXP) + pesos de plata mexicanos (MXP) + + + unidad de inversión (UDI) mexicana + unidad de inversión (UDI) mexicana + unidades de inversión (UDI) mexicanas + + + ringgit malasio + + + escudo mozambiqueño + escudo mozambiqueño + escudos mozambiqueños + + + antiguo metical mozambiqueño + + + metical mozambiqueño + + + dólar de Namibia + + + naira nigeriano + + + córdoba nicaragüense + córdoba nicaragüense + córdobas nicaragüenses + + + córdoba oro nicaragüense + córdoba oro nicaragüense + córdobas oro nicaragüenses + + + florín neerlandés + florín neerlandés + florines neerlandeses + + + corona noruega + corona noruega + coronas noruegas + + + rupia nepalesa + rupia nepalesa + rupias nepalesas + + + dólar neozelandés + dólar neozelandés + dólares neozelandeses + + + rial omaní + + + balboa panameño + balboa panameño + balboas panameños + + + inti peruano + inti peruano + intis peruanos + + + nuevo sol peruano + nuevo sol peruano + nuevos soles peruanos + + + sol peruano + sol peruano + soles peruanos + + + kina de Papúa Nueva Guinea + + + peso filipino + peso filipino + pesos filipinos + + + rupia pakistaní + + + zloty polaco + zloty polaco + zlotys polacos + + + zloty polaco (1950-1995) + zloty polaco (PLZ) + zlotys polacos (PLZ) + + + escudo portugués + escudo portugués + escudos portugueses + + + guaraní paraguayo + guaraní paraguayo + guaraníes paraguayos + + + riyal de Qatar + + + dólar rodesiano + + + antiguo leu rumano + antiguo leu rumano + antiguos lei rumanos + + + leu rumano + leu rumano + lei rumanos + + + dinar serbio + dinar serbio + dinares serbios + + + rublo ruso + rublo ruso + rublos rusos + + + rublo ruso (1991-1998) + rublo ruso (RUR) + rublos rusos (RUR) + + + franco ruandés + franco ruandés + francos ruandeses + + + riyal saudí + + + dólar de las Islas Salomón + dólar de las Islas Salomón + dólares de las Islas Salomón + + + rupia de Seychelles + + + dinar sudanés + dinar sudanés + dinares sudaneses + + + libra sudanesa + libra sudanesa + libras sudanesas + + + libra sudanesa antigua + libra sudanesa antigua + libras sudanesas antiguas + + + corona sueca + corona sueca + coronas suecas + + + dólar singapurense + + + libra de Santa Elena + libra de Santa Elena + libras de Santa Elena + + + tólar esloveno + tólar esloveno + tólares eslovenos + + + corona eslovaca + corona eslovaca + coronas eslovacas + + + leone de Sierra Leona + + + chelín somalí + chelín somalí + chelines somalíes + + + dólar surinamés + + + florín surinamés + + + dobra de Santo Tomé y Príncipe + + + rublo soviético + rublo soviético + rublos soviéticos + + + colón salvadoreño + colón salvadoreño + colones salvadoreños + + + libra siria + libra siria + libras sirias + + + lilangeni suazi + + + baht tailandés + + + rublo tayiko + + + somoni tayiko + + + manat turcomano + + + dinar tunecino + + + paʻanga tongano + + + escudo timorense + + + lira turca antigua + lira turca antigua + liras turcas antiguas + + + nueva lira turca + lira turca + liras turcas + + + dólar de Trinidad y Tobago + + + nuevo dólar taiwanés + + + chelín tanzano + + + grivna ucraniana + grivnia ucraniana + grivnias ucranianas + + + karbovanet ucraniano + karbovanet ucraniano + karbovanets ucranianos + + + chelín ugandés (1966-1987) + + + chelín ugandés + chelín ugandés + chelines ugandeses + + + dólar estadounidense + dólar estadounidense + dólares estadounidenses + + + dólar estadounidense (día siguiente) + dólar estadounidense (día siguiente) + dólares estadounidenses (día siguiente) + + + dólar estadounidense (mismo día) + dólar estadounidense (mismo día) + dólares estadounidenses (mismo día) + + + peso uruguayo en unidades indexadas + peso uruguayo en unidades indexadas + pesos uruguayos en unidades indexadas + + + peso uruguayo (1975-1993) + peso uruguayo (UYP) + pesos uruguayos (UYP) + + + peso uruguayo + peso uruguayo + pesos uruguayos + + + sum uzbeko + + + bolívar venezolano + bolívar venezolano + bolívares venezolanos + + + bolívar fuerte venezolano + bolívar fuerte venezolano + bolívares fuertes venezolanos + + + dong vietnamita + + + vatu vanuatuense + + + tala samoano + + + franco CFA BEAC + + + plata + plata + plata + + + oro + oro + oro + + + unidad compuesta europea + unidad compuesta europea + unidades compuestas europeas + + + unidad monetaria europea + unidad monetaria europea + unidades monetarias europeas + + + unidad de cuenta europea (XBC) + unidad de cuenta europea (XBC) + unidades de cuenta europeas (XBC) + + + unidad de cuenta europea (XBD) + unidad de cuenta europea (XBD) + unidades de cuenta europeas (XBD) + + + dólar del Caribe Oriental + dólar del Caribe Oriental + dólares del Caribe Oriental + + + derechos especiales de giro + + + unidad de moneda europea + unidad de moneda europea + unidades de moneda europeas + + + franco oro francés + franco oro francés + francos oro franceses + + + franco UIC francés + franco UIC francés + francos UIC franceses + + + franco CFA BCEAO + + + paladio + paladio + paladio + + + franco CFP + + + platino + platino + platino + + + fondos RINET + + + código reservado para pruebas + + + Sin divisa + moneda desconocida/no válida + monedas desconocidas/no válidas + + + dinar yemení + + + rial yemení + + + dinar fuerte yugoslavo + + + super dinar yugoslavo + + + dinar convertible yugoslavo + dinar convertible yugoslavo + dinares convertibles yugoslavos + + + rand sudafricano (financiero) + + + rand sudafricano + + + kwacha zambiano + + + nuevo zaire zaireño + + + zaire zaireño + + + dólar de Zimbabue + + + + + + {0} día + {0} días + + + {0} hora + {0} horas + + + {0} minuto + {0} minutos + + + {0} mes + {0} meses + + + {0} segundo + {0} segundos + + + {0} semana + {0} semanas + + + {0} año + {0} años + + + + + sí:si:s + no:n + + + + diff --git a/lib/zend/Zend/Locale/Data/es_AR.xml b/lib/zend/Zend/Locale/Data/es_AR.xml new file mode 100644 index 0000000000..810799e42a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_AR.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + Hong Kong + Macao + + + Ortografía revisada + + + estadounidense + métrico + + + + + + a.m. + p.m. + + + + HH'h'''mm:ss zzzz + + + + + H:mm:ss z + + + + + + E d-M + M-yyyy + + + {0} a el {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM 'de' y + MMM 'de' y 'a' MMM 'de' y + + + E d 'de' MMM 'al' E d 'de' MMM 'de' y + E d 'al' E d 'de' MMM 'de' y + E d 'de' MMM 'de' y 'al' E d 'de' MMM 'de' y + + + d 'de' MMM 'al' d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y 'al' d 'de' MMM 'de' y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + + $ + + + + diff --git a/lib/zend/Zend/Locale/Data/es_BO.xml b/lib/zend/Zend/Locale/Data/es_BO.xml new file mode 100644 index 0000000000..013d0f09dd --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_BO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/es_CL.xml b/lib/zend/Zend/Locale/Data/es_CL.xml new file mode 100644 index 0000000000..1560effd12 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_CL.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + mapudungun + iraníes + + + + + + Sudamérica + Antillas Holandesas + Azerbayán + Sahara Occidental + Territorio Palestino + Rumania + Arabia Saudita + Tanzanía + + + divisa + + + orden de directorio telefónico + + + + + + + + + dd-MM-yyyy + + + + + dd-MM-yy + + + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + {0} a el {1} + + M-M + + + E dd-MM - E dd-MM + E dd-MM - E dd-MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + dd-MM - dd-MM + dd-MM - dd-MM + + + d-d + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + MM-yy - MM-yy + MM-yy - MM-yy + + + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + + + MMM-MMM 'de' y + MMM 'de' y 'a' MMM 'de' y + + + E d 'de' MMM 'al' E d 'de' MMM 'de' y + E d 'al' E d 'de' MMM 'de' y + E d 'de' MMM 'de' y 'al' E d 'de' MMM 'de' y + + + d 'de' MMM 'al' d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y 'al' d 'de' MMM 'de' y + + + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + + + + + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + + + + $ + + + + + diff --git a/lib/zend/Zend/Locale/Data/es_CO.xml b/lib/zend/Zend/Locale/Data/es_CO.xml new file mode 100644 index 0000000000..da4081fcb1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_CO.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + d/MM/yyyy + + + + + d/MM/yy + + + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + {0} a el {1} + + M-M + + + E d/MM - E d/MM + E d/MM - E d/MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + MMM-MMM 'de' y + MMM 'de' y 'a' MMM 'de' y + + + E d 'de' MMM 'al' E d 'de' MMM 'de' y + E d 'al' E d 'de' MMM 'de' y + E d 'de' MMM 'de' y 'al' E d 'de' MMM 'de' y + + + d 'de' MMM 'al' d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y 'al' d 'de' MMM 'de' y + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + + $ + + + + + diff --git a/lib/zend/Zend/Locale/Data/es_CR.xml b/lib/zend/Zend/Locale/Data/es_CR.xml new file mode 100644 index 0000000000..3e03010737 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_CR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/es_DO.xml b/lib/zend/Zend/Locale/Data/es_DO.xml new file mode 100644 index 0000000000..4e959755a6 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_DO.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + . + , + + + diff --git a/lib/zend/Zend/Locale/Data/es_EC.xml b/lib/zend/Zend/Locale/Data/es_EC.xml new file mode 100644 index 0000000000..2a0353adbd --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_EC.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + {0} a el {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM 'de' y + MMM 'de' y 'a' MMM 'de' y + + + E d 'de' MMM 'al' E d 'de' MMM 'de' y + E d 'al' E d 'de' MMM 'de' y + E d 'de' MMM 'de' y 'al' E d 'de' MMM 'de' y + + + d 'de' MMM 'al' d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y 'al' d 'de' MMM 'de' y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + + + + $ + + + + + diff --git a/lib/zend/Zend/Locale/Data/es_ES.xml b/lib/zend/Zend/Locale/Data/es_ES.xml new file mode 100644 index 0000000000..0c7a412b0a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_ES.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/es_GT.xml b/lib/zend/Zend/Locale/Data/es_GT.xml new file mode 100644 index 0000000000..f626357ce0 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_GT.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + d/MM/yyyy + + + + + d/MM/yy + + + + + + {0} a el {1} + + M-M + + + E d/MM - E d/MM + E d/MM - E d/MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + MMM-MMM 'de' y + MMM 'de' y 'a' MMM 'de' y + + + E d 'de' MMM 'al' E d 'de' MMM 'de' y + E d 'al' E d 'de' MMM 'de' y + E d 'de' MMM 'de' y 'al' E d 'de' MMM 'de' y + + + d 'de' MMM 'al' d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y 'al' d 'de' MMM 'de' y + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + . + , + + + + Q + + + + diff --git a/lib/zend/Zend/Locale/Data/es_HN.xml b/lib/zend/Zend/Locale/Data/es_HN.xml new file mode 100644 index 0000000000..2e7910ea56 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_HN.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + EEEE dd 'de' MMMM 'de' y + + + + + dd 'de' MMMM 'de' y + + + + + + {0} a el {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E dd 'de' MMM 'al' E dd 'de' MMM + E dd 'al' E dd 'de' MMM + + + dd 'de' MMM 'al' dd 'de' MMM + dd-dd 'de' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM 'de' y + MMM 'de' y 'a' MMM 'de' y + + + E dd 'de' MMM 'al' E dd 'de' MMM 'de' y + E dd 'al' E dd 'de' MMM 'de' y + E dd 'de' MMM 'de' y 'al' E dd 'de' MMM 'de' y + + + dd 'de' MMM 'al' dd 'de' MMM 'de' y + dd-dd 'de' MMM 'de' y + dd 'de' MMM 'de' y 'al' dd 'de' MMM 'de' y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + + + . + , + + + + L + + + + diff --git a/lib/zend/Zend/Locale/Data/es_MX.xml b/lib/zend/Zend/Locale/Data/es_MX.xml new file mode 100644 index 0000000000..ff6a9b72c3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_MX.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + . + , + + + + $ + + + + diff --git a/lib/zend/Zend/Locale/Data/es_NI.xml b/lib/zend/Zend/Locale/Data/es_NI.xml new file mode 100644 index 0000000000..d6d32243b2 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_NI.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + . + , + + + diff --git a/lib/zend/Zend/Locale/Data/es_PA.xml b/lib/zend/Zend/Locale/Data/es_PA.xml new file mode 100644 index 0000000000..c3219155ae --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_PA.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + MM/dd/yyyy + + + + + MM/dd/yy + + + + + + {0} a el {1} + + M-M + + + E MM/dd - E MM/dd + E MM/dd - E MM/dd + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + MM/dd - MM/dd + MM/dd - MM/dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E MM/dd/yy - E MM/dd/yy + E MM/dd/yy - E MM/dd/yy + E MM/dd/yy - E MM/dd/yy + + + MMM-MMM 'de' y + MMM 'de' y 'a' MMM 'de' y + + + E d 'de' MMM 'al' E d 'de' MMM 'de' y + E d 'al' E d 'de' MMM 'de' y + E d 'de' MMM 'de' y 'al' E d 'de' MMM 'de' y + + + d 'de' MMM 'al' d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y 'al' d 'de' MMM 'de' y + + + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + + + + + + + + + . + , + + + + diff --git a/lib/zend/Zend/Locale/Data/es_PE.xml b/lib/zend/Zend/Locale/Data/es_PE.xml new file mode 100644 index 0000000000..0f7e7fc129 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_PE.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + d/MM/yy + + + + + + + HH'H'mm''ss" zzzz + + + + + + {0} a el {1} + + M-M + + + E d/MM - E d/MM + E d/MM - E d/MM + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + d/MM - d/MM + d/MM - d/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + MMM-MMM 'de' y + MMM 'de' y 'a' MMM 'de' y + + + E d 'de' MMM 'al' E d 'de' MMM 'de' y + E d 'al' E d 'de' MMM 'de' y + E d 'de' MMM 'de' y 'al' E d 'de' MMM 'de' y + + + d 'de' MMM 'al' d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y 'al' d 'de' MMM 'de' y + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + . + , + + + diff --git a/lib/zend/Zend/Locale/Data/es_PR.xml b/lib/zend/Zend/Locale/Data/es_PR.xml new file mode 100644 index 0000000000..2214f3b587 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_PR.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + MM/dd/yyyy + + + + + MM/dd/yy + + + + + + {0} a el {1} + + M-M + + + E MM/dd - E MM/dd + E MM/dd - E MM/dd + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + MM/dd - MM/dd + MM/dd - MM/dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E MM/dd/yy - E MM/dd/yy + E MM/dd/yy - E MM/dd/yy + E MM/dd/yy - E MM/dd/yy + + + MMM-MMM 'de' y + MMM 'de' y 'a' MMM 'de' y + + + E d 'de' MMM 'al' E d 'de' MMM 'de' y + E d 'al' E d 'de' MMM 'de' y + E d 'de' MMM 'de' y 'al' E d 'de' MMM 'de' y + + + d 'de' MMM 'al' d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y 'al' d 'de' MMM 'de' y + + + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + + + + + + + + + . + , + + + + $ + + + + + diff --git a/lib/zend/Zend/Locale/Data/es_PY.xml b/lib/zend/Zend/Locale/Data/es_PY.xml new file mode 100644 index 0000000000..cd0289bdb1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_PY.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/es_SV.xml b/lib/zend/Zend/Locale/Data/es_SV.xml new file mode 100644 index 0000000000..16805c80b4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_SV.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + . + , + + + diff --git a/lib/zend/Zend/Locale/Data/es_US.xml b/lib/zend/Zend/Locale/Data/es_US.xml new file mode 100644 index 0000000000..ac23e99a57 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_US.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + MMM d, y + + + + + M/d/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + MM/d + M/d + + + {0} a el {1} + + M-M + + + E M/d - E M/d + E M/d - E M/d + + + MMM-MMM + + + E d 'de' MMM 'al' E d 'de' MMM + E d 'al' E d 'de' MMM + + + d 'de' MMM 'al' d 'de' MMM + d-d 'de' MMM + + + M/d - M/d + M/d - M/d + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + M/yy - M/yy + M/yy - M/yy + + + E M/d/yy - E M/d/yy + E M/d/yy - E M/d/yy + E M/d/yy - E M/d/yy + + + MMM-MMM 'de' y + MMM 'de' y 'a' MMM 'de' y + + + E d 'de' MMM 'al' E d 'de' MMM 'de' y + E d 'al' E d 'de' MMM 'de' y + E d 'de' MMM 'de' y 'al' E d 'de' MMM 'de' y + + + d 'de' MMM 'al' d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y 'al' d 'de' MMM 'de' y + + + M/d/yy - M/d/yy + M/d/yy - M/d/yy + M/d/yy - M/d/yy + + + + + + + + + . + , + + + + ¥ + + + $ + + + + diff --git a/lib/zend/Zend/Locale/Data/es_UY.xml b/lib/zend/Zend/Locale/Data/es_UY.xml new file mode 100644 index 0000000000..43a9a2609b --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_UY.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + $ + + + + diff --git a/lib/zend/Zend/Locale/Data/es_VE.xml b/lib/zend/Zend/Locale/Data/es_VE.xml new file mode 100644 index 0000000000..018ea46adb --- /dev/null +++ b/lib/zend/Zend/Locale/Data/es_VE.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/et.xml b/lib/zend/Zend/Locale/Data/et.xml new file mode 100644 index 0000000000..c1f1953be8 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/et.xml @@ -0,0 +1,1984 @@ + + + + + + + + + en fi + + + afari + abhaasi + atšehi + akoli + adangme + adõgee + avesta + afrikaani + muu afroaasia + afrihili + ainu + akani + akadi + aleuudi + algonkini keeled + altai + amhari + aragoni + vanainglise + angika + apatši keeled + araabia + aramea + araukaani + arapaho + muu tehiskeel + aravaki + assami + astuuria + atapaski keeled + Austraalia keeled + avaari + avadhi + aimara + aserbaidžaani + baškiiri + banda + bamileke keeled + belutši + bali + basa + muu balti + valgevene + bedža + bemba + berberi + bulgaaria + bihaari + bhodžpuri + bislama + bikoli + edo + siksika + bambara + bengali + bantu + tiibeti + bretooni + bradži + bosnia + bataki + burjaadi + bugi + bilini + katalaani + kado + muu Kesk-Ameerika indiaani + kariibi + muu Kaukaasia + atsam + tšetšeeni + sebu + muu keldi + tšamorro + tšibtša + tšagatai + tšuugi + mari + tšinuki žargoon + tšokto + tšipevai + tšerokii + šaieeni + tšami keeled + korsika + kopti + muud inglispõhjalised kreool- ja pidžinkeeled + muud prantsuspõhjalised kreool- ja pidžinkeeled + muud portugalipõhjalised kreool- ja pidžinkeeled + krii + krimmitatari + muud kreool- ja pidžinkeeled + tšehhi + kašuubi + kirikuslaavi + muu kuši keel + tšuvaši + kõmri + taani + siuu + dargi + dajaki + saksa + delavari + sleivi + dogribi + dinka + dogri + muu draviidi keel + alamsorbi + duala + keskhollandi + maldiivi + djula + bhutani + eve + ibibio + muinasegiptuse + ekadžuki + kreeka + eelami + inglise + inglise (USA) + keskinglise + esperanto + hispaania + eesti + baski + evondo + pärsia + fangi + fanti + fulbe + soome + filipino + muu soomeugri + fidži + fääri + foni + prantsuse + keskprantsuse + vanaprantsuse + põhjafriisi + idafriisi + friuuli + läänefriisi + iiri + gaa + gajo + gbaja + gaeli + muu germaani + etioopia + kiribati + galeegi + keskülemsaksa + guaranii + vanaülemsaksa + gondi + gorontalo + gooti + grebo + vanakreeka + alemanni + gudžarati + mänksi + gvitšini + hausa + haida + havai + heebrea + hindi + hiligainoni + himtšali + heti + hmongi + motu + horvaadi + ülemsorbi + haiti + ungari + hupa + armeenia + herero + interlingua + ibani + indoneesia + interlingue + ibo + Sichuani jii + idžo + injupiaki + iloko + muu India + muu indoeuroopa + inguši + ido + muu Iraani + irokeesi keeled + islandi + itaalia + inuktituti + jaapani + lojbani + juudipärsia + juudiaraabia + jaava + gruusia + karakalpaki + kabiili + katšini + jju + kamba + kareni + kaavi + kabardi-tšerkessi + tyap + koro + kongo + khasi + muu khoisani + saki + kikuju + ambo + kasahhi + grööni + khmeeri + mbundu + kannada + korea + konkani + kosrae + kpelle + kanuri + karatšai-balkaari + karjala + kruu + oraoni + kašmiiri + kurdi + kumõki + kutenai + komi + korni + kirgiisi + ladina + ladiino + lahnda + lamba + letseburgi + lesgi + ganda + limburgi + lingala + lao + mongo + lozi + leedu + luba + lulua + luisenjo + lunda + luo + lušei + läti + madura + magali + maithili + makassari + malinke + austroneesia keeled + masai + mokša + mandari + mende + malagassi + keskiiri + maršalli + maoori + mikmaki + minangkabau + üksikkeeled + makedoonia + muu moni-khmeeri + malajalami + mongoli + mandžu + manipuri + manobo keeled + moldova + mohoogi + more + marathi + malai + malta + mitu keelt + munda keel + maskogi + miranda + marvari + birma + maia keeled + ersa + nauru + nahua + muu Põhja-Ameerika indiaani + napoli + norra bokmål + põhjandebele + alamsaksa + nepali + nevari + ndonga + niasi + muu Nigeri-Kordofani + niue + hollandi + norra nynorsk + norra + nogai + vanapõhjala + nkoo + lõunandebele + pedi + Nuubia keeled + navaho + vananevari + njandža + njamvesi + nkole + njoro + nzima + oksitaani + odžibvei + oromo + oria + osseedi + oseidži + osmanitürgi + otomi keeled + pandžabi + muu Paapua + pangasinani + pahlavi + pampanga + papiamento + belau + vanapärsia + muu Filipiini + foiniikia + paali + poola + poonpei + praakriti keeled + vanaprovansi + puštu + portugali + ketšua + radžastani + rapanui + rarotonga + retoromaani + rundi + rumeenia + muu romaani + mustlaskeel + vene + aromuuni + ruanda + sanskriti + sandave + jakuudi + muu Lõuna-Ameerika indiaani + sališi keeled + Samaaria aramea + sasaki + santali + sardiinia + sitsiilia + šoti + sindhi + põhjasaami + sölkupi + muu semi + sango + vanaiiri + viipekeeled + serbia-horvaadi + šani + singali + sidamo + siuu keeled + muu Hiina-Tiibeti + slovaki + sloveeni + muu slaavi + samoa + lõunasaami + muu saami + Lule saami + Inari saami + koltasaami + šona + soninke + somaali + sogdi + songai + albaania + serbia + sranani + sereri + svaasi + muu Niiluse-Sahara + lõunasotho + sunda + sukuma + susu + sumeri + rootsi + suahiili + süüria + tamili + muu tai keel + telugu + temne + tereno + tetumi + tadžiki + tai + tigrinja + tigree + tivi + türkmeeni + tokelau + tagalogi + klingoni + tlingiti + tamašeki + tsvana + tonga + tšitonga + uusmelaneesia + türgi + tsonga + tšimši keeled + tatari + tumbuka + tupii keeled + muu Altai + tuvalu + tvii + tahiti + tõva + udmurdi + uiguuri + ugariti + ukraina + umbundu + määramata + urdu + usbeki + vai + venda + vietnami + volapüki + vadja + vallooni + vakaši keeled + volamo + varai + vašo + sorbi keeled + volofi + kalmõki + koosa + jao + japi + jidiši + joruba + jupiki keeled + tšuangi + sapoteegi + zenaga + hiina + hiina keel - lihtsustatud + hiina keel - traditsiooniline + zande + suulu + sunji + mittekeeleline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + maailm + Aafrika + Põhja-Ameerika + Lõuna-Ameerika + Okeaania + Lääne-Aafrika + Kesk-Ameerika + Ida-Aafrika + Põhja-Aafrika + Kesk-Aafrika + Lõuna-Aafrika + Ameerika maailmajagu + Ameerika põhjaosa + Kariibi meri + Ida-Aasia + Lõuna-Aasia + Kagu-Aasia + Lõuna-Euroopa + Austraalia ja Uus-Meremaa + Melaneesia + Mikroneesia + Polüneesia + Kesk-Aasia lõunaosa + Aasia + Kesk-Aasia + Lääne-Aasia + Euroopa + Ida-Euroopa + Põhja-Euroopa + Lääne-Euroopa + Sõltumatute Riikide Ühendus + Ladina-Ameerika ja Kariibi meri + Andorra + Araabia Ühendemiraadid + Afganistan + Antigua ja Barbuda + Anguilla + Albaania + Armeenia + Hollandi Antillid + Angola + Antarktis + Argentina + Ameerika Samoa + Austria + Austraalia + Aruba + Ahvenamaa + Aserbaidžaan + Bosnia ja Hertsegoviina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaaria + Bahrein + Burundi + Benin + Bermuda + Brunei + Boliivia + Brasiilia + Bahama + Bhutan + Bouvet’ saar + Botswana + Valgevene + Belize + Kanada + Kookossaared + Kongo DV + Kesk-Aafrika Vabariik + Kongo Vabariik + Šveits + Côte d'Ivoire + Cooki saared + Tšiili + Kamerun + Hiina + Colombia + Costa Rica + Serbia ja Montenegro + Kuuba + Roheneemesaared + Jõulusaar + Küpros + Tšehhi + Saksamaa + Djibouti + Taani + Dominica + Dominikaani Vabariik + Alžeeria + Ecuador + Eesti + Egiptus + Lääne-Sahara + Eritrea + Hispaania + Etioopia + Soome + Fidži + Falklandi saared + Mikroneesia Liiduriigid + Fääri saared + Prantsusmaa + Gabon + Suurbritannia + Grenada + Gruusia + Prantsuse Guajaana + Guernsey + Ghana + Gibraltar + Gröönimaa + Gambia + Guinea + Guadeloupe + Ekvatoriaal-Guinea + Kreeka + Lõuna-Georgia ja Lõuna-Sandwichi saared + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong - Hiina erihalduspiirkond + Heard ja McDonald + Honduras + Horvaatia + Haiti + Ungari + Indoneesia + Iirimaa + Iisrael + Mani saar + India + Briti India ookeani ala + Iraak + Iraan + Island + Itaalia + Jersey + Jamaica + Jordaania + Jaapan + Kenya + Kõrgõzstan + Kambodža + Kiribati + Komoorid + Saint Kitts ja Nevis + Põhja-Korea + Lõuna-Korea + Kuveit + Kaimanisaared + Kasahstan + Laos + Liibanon + Saint Lucia + Liechtenstein + Sri Lanka + Libeeria + Lesotho + Leedu + Luksemburg + Läti + Liibüa + Maroko + Monaco + Moldova + Montenegro + Madagaskar + Marshalli Saared + Makedoonia + Mali + Myanmar + Mongoolia + Aomen - Hiina erihalduspiirkond + Põhja-Mariaanid + Martinique + Mauritaania + Montserrat + Malta + Mauritius + Maldiivid + Malawi + Mehhiko + Malaisia + Mosambiik + Namiibia + Uus-Kaledoonia + Niger + Norfolk + Nigeeria + Nicaragua + Holland + Norra + Nepal + Nauru + Niue + Uus-Meremaa + Omaan + Panama + Peruu + Prantsuse Polüneesia + Paapua Uus-Guinea + Filipiinid + Pakistan + Poola + Saint-Pierre ja Miquelon + Pitcairn + Puerto Rico + Palestiina ala + Portugal + Belau + Paraguay + Katar + Okeaania hajasaared + Euroopa Liit + Réunion + Rumeenia + Serbia + Venemaa + Rwanda + Saudi Araabia + Saalomoni Saared + Seišellid + Sudaan + Rootsi + Singapur + Saint Helena + Sloveenia + Svalbard ja Jan Mayen + Slovakkia + Sierra Leone + San Marino + Senegal + Somaalia + Suriname + São Tomé ja Príncipe + El Salvador + Süüria + Svaasimaa + Turks ja Caicos + Tšaad + Prantsuse Lõunaalad + Togo + Tai + Tadžikistan + Tokelau + Ida-Timor + Türkmenistan + Tuneesia + Tonga + Türgi + Trinidad ja Tobago + Tuvalu + Taiwan + Tansaania + Ukraina + Uganda + Ühendriikide hajasaared + Ameerika Ühendriigid + Uruguay + Usbekistan + Vatikan + Saint Vincent ja Grenadiinid + Venezuela + Briti Neitsisaared + USA Neitsisaared + Vietnam + Vanuatu + Wallis ja Futuna + Samoa + Jeemen + Mayotte + Lõuna-Aafrika Vabariik + Sambia + Zimbabwe + määramata + + + saksa traditsiooniline kirjaviis + saksa reformitud kirjaviis + Natisone murre + polütooniline + uus kirjaviis + Resia murre + saho murre + + + kalender + sortimine + vääring + + + hiina traditsiooniline - big5 + budistlik kalender + Hiina kalender + lisareegliteta + hiina lihtsustatud - GB2312 + Gregoriuse kalender + juudi kalender + islamikalender + islami ilmalik kalender + Jaapani kalender + telefoniraamat + elementide kirjutamise järjekorras + traditsiooniline + + + inglise mõõdustik + meetermõõdustik + + + + [a-s š z ž t-w õ ä ö ü x y] + [á à â å ā æ ç é è ê ë ē í ì î ï ī ñ ó ò ŏ ô ø ō œ ß ú ù û ū] + + + „ + “ + ‘ + ‚ + + + {0}−{1} + + + + + + jaan + veebr + märts + apr + mai + juuni + juuli + aug + sept + okt + nov + dets + + + jaanuar + veebruar + märts + aprill + mai + juuni + juuli + august + september + oktoober + november + detsember + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + P + E + T + K + N + R + L + + + pühapäev + esmaspäev + teisipäev + kolmapäev + neljapäev + reede + laupäev + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + AM + PM + + + enne meie aega + meie aja järgi + + + e.m.a. + m.a.j. + + + + + + EEEE, d, MMMM y + + + + + d MMMM y + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + H:mm:ss zzzz + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + d MMMM + dd.MM + mm:ss + Q yy + MM.yyyy + MMMM y + + + {0} - {1} + + M-M + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM y + MMM y - MMM y + + + E, d, MMM - E, d, MMM y + E, d - E, d, MMM y + E, d, MMM y - E, d, MMM y + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + määramata + + + Lõunapoolus + + + Dumont D'Urville + + + Viin + + + Brüssel + + + Bermuuda + + + Kookossaared + + + Zürich + + + Lihavõttesaar + + + Havanna + + + Roheneeme + + + Jõulud + + + Berliin + + + Kopenhaagen + + + Alžiir + + + Kairo + + + Kanaari saared + + + Madriid + + + Helsingi + + + Fidži + + + Fääri + + + Pariis + + + Ateena + + + Lõuna Gruusia + + + Rooma + + + St. Kitts + + + St. Lucia + + + Luksemburg + + + Riia + + + Maldiivid + + + Varssavi + + + Lissabon + + + Katar + + + Kokkutulek + + + Bukarest + + + Singapur + + + Salvador + + + Hispaania Sadam + + + Kiiev + + + Alaska aeg + + + St. Vincent + + + St. Thomas + + + + + + , +   + ; + % + 0 + # + + + − + ×10^ + ‰ + ∞ + ¤¤¤ + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + Andorra peseeta + + + Araabia Ühendemiraatide dirhem + + + Afganistani afgaani, 1927-2002 + + + Afganistani afgaani + + + Albaania lekk + + + Armeenia dramm + + + Hollandi Antillide kulden + + + Angola kvanza + + + Angola kvanza, 1977-1990 + + + Angola kvanza, 1990-2000 + + + Angola reformitud kvanza, 1995-1999 + + + Argentina austral + + + Argentina peeso, 1983-1985 + + + Argentina peeso + + + Austria šilling + + + Austraalia dollar + + + Aruba guilder + + + Aserbaidžaani manat, 1993-2006 + + + Aserbaidžaani manat + + + Bosnia-Hertsegoviina dinaar + + + Bosnia-Hertsegoviina mark + + + Barbadose dollar + + + Bangladeshi taka + + + Belgia konverteeritav frank + + + Belgia frank + + + Belgia arveldusfrank + + + Bulgaaria püsiv leev + + + Bulgaaria leev + + + Bahreini dinaar + + + Burundi frank + + + Bermuda dollar + + + Brunei dollar + + + boliviaano + + + Boliivia peeso + + + Brasiilia krusado + + + Brasiilia reaal + + + Birma kjatt + + + Botswana pula + + + Valgevene uus rubla, 1994-1999 + + + Valgevene rubla + + + Kanada dollar + + + Šveitsi frank + + + Tšiili peeso + + + Hiina jüaan + + + Kolumbia peeso + + + Serbia vana dinaar + + + Küprose nael + + + Tšehhi kroon + + + Saksa mark + + + Taani kroon + + + Alžeeria dinaar + + + Ecuadori sukre + + + kroon + kr + . + + + Egiptuse nael + + + Hispaania peseeta + + + Etioopia birr + + + euro + + + Soome mark + + + Fidži dollar + + + Falklandi saarte nael + + + Prantsuse frank + + + Suurbritannia naelsterling + + + Gruusia lari + + + Ghana sedi + + + Gibraltari nael + + + Gambia dalasi + + + Guinea syli + + + Kreeka drahm + + + Guatemala ketsal + + + Guinea-Bissau peeso + + + Guyana dollar + + + Hongkongi dollar + + + Hondurase lempiira + + + Horvaatia kuna + + + Haiti gurd + + + Ungari forint + + + Indoneesia ruupia + + + Iiri nael + + + Iisraeli nael + + + Iisraeli uus seekel + + + India ruupia + + + Iraagi dinaar + + + Iraani riaal + + + Islandi kroon + + + Itaalia liir + + + Jamaica dollar + + + Jaapani jeen + ¥ + + + Keenia šilling + + + Kõrgõzstani somm + + + Kambodža riaal + + + Põhja-Korea vonn + + + Lõuna-Korea vonn + + + Kuveidi dinaar + + + Kasahstani tenge + + + Laose kiip + + + Liibanoni nael + + + Leedu litt + + + Luksemburgi frank + + + Läti latt + + + Maroko dirhem + + + Moldova leu + + + Myanmari kjatt + + + Mongoolia tugrik + + + Macao pataka + + + Mauretaania ugia + + + Malta liir + + + Mauritiuse ruupia + + + Maldiivide ruupia + + + Malawi kvatša + + + Mehhiko peeso + + + Mehhiko peeso, 1861-1990 + + + Malaisia ringgit + + + Mosambiigi metikal + + + Nigeeria naira + + + Nicaragua kordoba + + + Nicaragua kuldkordoba + + + Hollandi kulden + + + Norra kroon + + + Nepali ruupia + + + Uus-Meremaa dollar + + + Omaani riaal + + + Panama balboa + + + Peruu inti + + + Peruu uus soll + + + Peruu soll + + + Paapua Uus-Guinea kina + + + Filipiinide peeso + + + Pakistani ruupia + + + Poola zlott + + + Poola zlott, 1950-1995 + + + Portugali eskuudo + + + Paraguai guaranii + + + Quatari riaal + + + Rumeenia lei, -2005 + + + Rumeenia lei + + + Serbia dinaar + + + Venemaa rubla + + + Venemaa rubla, 1991-1998 + + + Ruanda frank + + + Saudi-Araabia riaal + + + Saalomoni saarte dollar + + + Seišelli saarte ruupia + + + Sudaani nael + + + Rootsi kroon + + + Singapuri dollar + + + Saint Helena nael + + + Sloveenia tolar + + + Slovakkia kroon + + + Sierra Leone leoone + + + Somaalia šilling + + + Surinami kulden + + + São Tomé ja Príncipe dobra + + + NSVL rubla + + + Salvadori koloon + + + Süüria nael + + + Tai baat + + + Tadžikistani somoni + + + Türkmenistani manat + + + Tuneesia dinaar + + + Tonga pa'anga + + + Timori eskuudo + + + Türgi liir + + + Türgi uus liir + + + Taiwani dollar + + + Tansaania šilling + + + Ukraina grivna + + + Ukraina karbovanets + + + Uganda šilling + + + USA dollar + $ + + + USA järgmise päeva dollar + + + USA sama päeva dollar + + + Uruguai peeso + + + Usbekistani somm + + + Venezuela boliivar + + + Vietnami dong + + + Vanuatu vatu + + + Lääne-Samoa tala + + + CFA frank BEAC + + + hõbe + + + kuld + + + EURCO + + + Ida-Kariibi dollar + + + eküü + + + Prantsuse kuldfrank + + + pallaadium + + + plaatina + + + vääringute testkood + + + määramata + + + Jeemeni dinaar + + + Jugoslaavia uus dinaar + + + Jugoslaavia konverteeritav dinaar + + + LAVi rand + + + Sambia kvatša + + + Sairi zaire + + + Zimbabwe dollar + + + + + + {0} ööpäev + {0} ööpäeva + + + {0} tund + {0} tunniga + + + {0} minut + {0} minut + + + {0} kuu + {0} kuud + + + {0} sekund + {0} sekundit + + + {0} nädal + {0} nädalat + + + {0} aasta + {0} aastat + + + + + jah:j + ei:e + + + + diff --git a/lib/zend/Zend/Locale/Data/et_EE.xml b/lib/zend/Zend/Locale/Data/et_EE.xml new file mode 100644 index 0000000000..10698fecc8 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/et_EE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/eu.xml b/lib/zend/Zend/Locale/Data/eu.xml new file mode 100644 index 0000000000..4df5c968d2 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/eu.xml @@ -0,0 +1,1005 @@ + + + + + + + + + + + {0} ({1}) + , + + + afrikaans + amharikera + arabiera + assamera + azerbaijanera + bielorrusiera + bulgariera + bihariera + bengalera + bretoiera + bosniera + katalana + txekiera + galesera + daniera + alemanera + greziera + ingelera + ingelesa (Australia) + ingelesa (Erresuma Batua) + ingelesa (AEB) + esperantoa + espainiera + estoniera + euskara + pertsiera + finlandiera + tagalo + faroera + frantsesera + frisiarra + gaelikoa + eskoziar gaelikoa + galegoa + guaraniera + gujaratera + hebreera + hindia + kroaziera + hungariera + armeniera + interlingua + indonesiera + interlingue + islandiera + italiera + japoniera + javera + georgiera + khemerera + kannada + koreera + kurduera + kirgizera + latina + lingala + laosera + lituaniera + letoniera + mazedoniera + malayalamera + mongoliera + marathera + malaysiera + maltera + nepalera + nederlandera + norvegiera berria + norvegiera + okzitaniera + oriya + punjabera + poloniera + paxtuera + portugalera + portugesa (Brasil) + portugesa (Potugal) + errumaniera + errusiera + sanskritoa + sindhia + serbokroaziera + sinhala + eslovakiera + esloveniera + somaliera + albaniera + serbiera + sesothoera + sundanera + suediera + swahili + tamilera + telugua + thailandiera + tigrinya + turkmeniera + tagalog + klingonera + turkiera + twia + uigurrera + ukrainera + urdu + uzbekera + vietnamera + xhosa + yiddishera + txinera + txinera (soildua) + txinera (tradizionala) + zuluera + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Arabiar Emirrerri Batuak + Afganistan + Antigua eta Barbuda + Albania + Armenia + Holandarren Antillak + Angola + Antartika + Argentina + Amerikar Samoa + Austria + Australia + Aland Uharteak + Azerbaijan + Bosnia-Herzegovina + Bangladesh + Belgika + Burkina Faso + Bulgaria + Burundi + Benin + Bolibia + Brasil + Bahamak + Bhutan + Bouvet Uhartea + Botswana + Bielorrusia + Kanada + Cocos uharteak + Kongoko Errepublika Demokratikoa + Afrika Erdiko Errepublika + Kongo + Suitza + Boli Kosta + Cook uharteak + Txile + Kamerun + Txina + Kolonbia + Serbia eta Montenegro + Kuba + Cabo Verde + Christmas uhartea + Zipre + Txekiar errepublika + Alemania + Djibuti + Danimarka + Dominika + Dominikar Errepublika + Aljeria + Ekuador + Estonia + Egipto + Mendebaldeko Sahara + Eritrea + Espainia + Etiopia + Finlandia + Malvinak + Mikronesia + Faroe Uharteak + Frantzia + Gabon + Erresuma Batua + Georgia + Guyana Frantsesa + Guernsey + Ghana + Groenlandia + Gambia + Ginea + Ekuatore Ginea + Grezia + Hegoaldeko Georgia eta Hegoaldeko Sandwich uharteak + Ginea-Bissau + Heard eta McDonald Uharteak + Honduras + Kroazia + Haiti + Hungaria + Indonesia + Irlanda + Israel + Man uhartea + India + Indiako Ozeanoko Britainiar Lurraldea + Irak + Iran + Islandia + Italia + Jersey + Jamaika + Jordania + Japonia + Kenia + Kirgizistan + Kanbodia + Kiribati + Komoreak + Saint Kitts eta Nevis + Ipar Korea + Hego Korea + Kaiman Uharteak + Kazakhstan + Laos + Libano + Santa Luzia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Luxenburgo + Letonia + Libia + Maroko + Monako + Moldavia + Montenegro + Madagaskar + Marshall uharteak + Mazedonia + Mali + Birmania + Mongolia + Makau + Iparraldeko Mariana uharteak + Mauritania + Maurizio + Maldivak + Malawi + Mexiko + Malasia + Mozambike + Namibia + Kaledonia Berria + Niger + Norfolk uhartea + Nigeria + Nikaragua + Herbehereak + Norvegia + Nepal + Zeelanda Berria + Oman + Peru + Polinesia Frantsesa + Papua Ginea Berria + Filipinak + Pakistan + Polonia + Saint-Pierre eta Mikelune + Palestina + Portugal + Paraguai + Katar + Errumania + Serbia + Errusia + Ruanda + Saudi Arabia + Salomon uharteak + Seychelleak + Sudan + Suedia + Singapur + Saint Helena + Eslovenia + Svalbard eta Jan Mayen uharteak + Eslovakia + Sierra Leona + San Marino + Senegal + Somalia + Surinam + Sao Tomé eta Principe + Siria + Swazilandia + Turk eta Caico uharteak + Txad + Frantziaren Lurralde Australak + Togo + Tailandia + Tadjikistan + Tokelau + Ekialdeko Timor + Turkmenistan + Tunisia + Tonga + Turkia + Trinidad eta Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + Estatu Batuetatik urruti dauden uharte txikiak + Ameriketako Estatu Batuak + Uruguai + Uzbekistan + Vatikano + Saint Vincent eta Grenadinak + Venezuela + Birjina uharte britainiarrak + Birjina uharte amerikarrak + Vietnam + Vanuatu + Wallis eta Futuna + Samoa + Yemen + Hegoafrika + Zambia + Zimbabwe + + + POLITON + BERRIKUSIA + SAHO + ESKOZIAR INGELESA + VALENTZIERA + + + egutegia + alfabetoa + moneta + + + Txinera tradizionalaren alfabetoa-Big5 + egutegi budista + txinatar egutegia + Zuzena + Txinera sinplifikatuaren alfabetoa -GB2312 + egutegi gregoriarra + hebrear egutegia + indiar egutegia + islamiar egutegia + islamiar egutegi zibila + japoniar egutegia + Telefonoen zerrenda + Txinako Errepublikako egutegia + Tradizionala + + + US + Metriko + + + {0} + {0} + {0} + + + + [a-c ç d-n ñ o-z] + [] + [a-z] + + + “ + ” + ‘ + ’ + + + + + + + BG + + + + + + + + urt + ots + mar + api + mai + eka + uzt + abu + ira + urr + aza + abe + + + urtarrila + otsaila + martxoa + apirila + maiatza + ekaina + uztaila + abuztua + iraila + urria + azaroa + abendua + + + + + U + O + M + A + M + E + U + A + I + U + A + A + + + + + + + ig + al + as + az + og + or + lr + + + igandea + astelehena + asteartea + asteazkena + osteguna + ostirala + larunbata + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + 1Hh + 2Hh + 3Hh + 4Hh + + + 1. hiruhilekoa + 2. hiruhilekoa + 3. hiruhilekoa + 4. hiruhilekoa + + + + AM + PM + + + BCE + CE + + + + + + EEEE, y'eko' MMMM'ren' dd'a' + + + + + y'eko' MMM'ren' dd'a' + + + + + y MMM d + + + + + yyyy-MM-dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + d + Q yy + + + + + + + R.O.C. aurretik + R.O.C. + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Ezezaguna + + + Bahrein + + + Bermudak + + + Cabo Verde + + + Djibuti + + + Dominika + + + Espainia (Kanariak) + + + Madril + + + Guadalupe + + + Jamaika + + + Luxenburgo + + + Monako + + + Martinika + + + Maurizio + + + Maldivak + + + Singapur + + + Ameriketako Estatu Batuak (Erdialdea, Ipar Dakota) + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + + CET + CEST + + true + + + + EET + EEST + + true + + + + WET + WEST + + true + + + true + + + true + + + true + + + + GMT + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0.00 ¤ + + + {0}{1} + {0} {1} + + + + BRL + + + CNY + + + ¤ #,##0;-¤ #,##0 + ₧ + , + . + + + EUR + + + GBP + + + INR + + + JPY + + + RUB + + + USD + + + USN + + + USS + + + XAG + + + XAU + + + XBA + + + XBB + + + XBC + + + XBD + + + XDR + + + XEU + + + XFO + + + XFU + + + XPD + + + XPT + + + XRE + + + XTS + + + XXX + + + + + + {0} eguna + {0} egun + + + {0} ordua + {0} h + + + {0} minutu + {0} minutu + + + {0} hilea + + + {0} segundo + {0} s + + + {0} aste + {0} aste + + + {0} urtea + {0} y + + + + + bai:b + ez:e + + + + diff --git a/lib/zend/Zend/Locale/Data/eu_ES.xml b/lib/zend/Zend/Locale/Data/eu_ES.xml new file mode 100644 index 0000000000..cdf4f73d60 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/eu_ES.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/fa.xml b/lib/zend/Zend/Locale/Data/fa.xml new file mode 100644 index 0000000000..51a507c1ea --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fa.xml @@ -0,0 +1,3309 @@ + + + + + + + + + + + {0} ({1}) + ، + + + آفاری + آبخازی + آچئی + آچولیایی + آدانگمه‌ای + آدیجیایی + اوستایی + آفریکانس + زبان افریقا و آسیایی + آفریهیلی + آینویی + آکان + آکدی + آلئوتی + زبان آلگونکینی + آلتایی جنوبی + امهری + آراگونی + انگلیسی باستان + آنگیکا + زبان آپاچیایی + عربی + آرامی + آروکانیایی + آراپاهویی + زبان ساختگی + آراواکی + آسامی + زبان آتاپاسکایی + زبان استرالیایی + آواری + آیمارایی + ترکی آذربایجانی + باشغیری + باندایی + بلوچی + بالیایی + باسایی + زبان بالتیکی + بلوروسی + بجایی + بمبایی + بربری + بلغاری + بیهاری + بوجپوری + بیسلاما + بیکولی + بینی + بامبارایی + بنگالی + بانتویی + تبتی + برتانیایی + براج + بوسنیایی + باتاکی + بوریاتی + بوگیایی + بلین + کاتالونیایی + کادویی + زبان سرخپوستی امریکای مرکزی + کاریبی + زبان قفقازی + چچنی + سبویی + زبان سلتی + چامورویی + چیبچا + جغتایی + تروکی + ماریایی + چوکتویی + چیپه‌ویه‌ای + چروکیایی + شایانی + کورسی + قبطی + کریول یا پیجین مبتنی بر انگلیسی + کریول یا پیجین مبتنی بر فرانسوی + کریول یا پیجین مبتنی بر پرتغالی + کریایی + ترکی کریمه + کریول یا پیجین + چکی + کاشوبی + اسلاوی کلیسایی + زبان کوشی + چوواشی + ویلزی + دانمارکی + داکوتایی + دارقینی + دایاک + آلمانی + آلمانی اتریش + آلمانی علیای سوئیس + دلاواری + دوگریب + دینکایی + دوگری + زبان دراویدی + صُربی سفلی + دوآلایی + هلندی میانه + مالدیوی + دایولایی + جونخایی + اوه‌ای + افیکی + مصری کهن + اکاجوک + یونانی + عیلامی + انگلیسی + انگلیسی استرالیا + انگلیسی کانادا + نگلیسی بریتانیا + انگلیسی امریکا + انگلیسی میانه + اسپرانتو + اسپانیایی + اسپانیایی امریکای لاتین + اسپانیایی اسپانیا + استونیایی + باسکی + اواندو + فارسی + فانکی + فانتیایی + فولایی + فنلاندی + فیلیپینی + زبان فین و اوگرایی + فیجیایی + فارویی + فونی + فرانسوی + فرانسوی کانادا + فرانسوی سوئیس + فرانسوی میانه + فرانسوی باستان + فریزی شمالی + فریزی شرقی + فریولیایی + فریزی غربی + ایرلندی + گایی + گایویی + گبایایی + گیلی اسکاتلندی + زبان ژرمنی + گی‌ئزی + گیلبرتی + گالیسیایی + آلمانی علیای میانه + گوارانی + آلمانی علیای باستان + گوندی + گورونتالو + گوتی + گریبویی + یونانی کهن + آلمانی سوئیسی + گجراتی + مانی + گویچ این + هوسیایی + هایدایی + هاوائیایی + عبری + هندی + هیلی‌گاینونی + هیماچالی + هیتی + همونگ + موتویی هیری + کرواتی + صُربی علیا + هائیتیایی + مجاری + هوپا + ارمنی + هریرویی + میان‌زبان + آیبن + اندونزیایی + اکسیدنتال + ایگبویی + یی سیچوان + ایجویی + اینوپیک + ایلوکویی + زبان هندیک + زبان هند و اروپایی + اینگوشی + ایدو + زبان ایرانی + زبان ایروکوایی + ایسلندی + ایتالیایی + اینوکتیتوت + ژاپنی + لوجبان + فارسی یهودی + عربی یهودی + جاوه‌ای + گرجی + قره‌قالپاقی + قبایلی + کاچینی + جو + کامبایی + کارنی + کاویایی + کاباردینی + تایپه ای + کورو + کنگویی + خاسیایی + زبان خواسی + ختنی + کیکویویی + کوانیاما + قزاقی + گرینلندی + خمری + کیمبوندویی + کاناده‌ای + کره‌ای + کنکانی + کپله‌ای + کانوریایی + قره‌چایی‐بالکاری + کرویی + کوروخی + کشمیری + کردی + کومیکی + کوتنی + کومیایی + کرنوالی + قرقیزی + لاتینی + لادینو + لاهندا + لامبا + لوگزامبورگی + لزگی + گاندایی + لیمبورگی + لینگالا + لائوسی + مونگویی + لوزیایی + لیتوانیایی + لوبایی‐کاتانگا + لوبایی‐لولوا + لویسنو + لوندایی + لوئویی + لوشه‌ای + لتونیایی + مادورایی + ماگاهیایی + مایدیلی + ماکاسار + ماندینگویی + زبان آسترونیزیایی + ماسایی + مکشایی + ماندار + منده‌ای + مالاگاسیایی + ایرلندی میانه + مارشالی + مائوریایی + میکماکی + مینانگ‌کابویی + زبان متفرقه + مقدونی + زبان مون‌خمری + مالایالامی + مغولی + مانچویی + میته‌ای + زبان مانوبو + مولداویایی + موهاکی + ماسیایی + مراتی + مالزیایی + مالتی + چندین زبان + زبان موندایی + کریکی + مارواری + برمه‌ای + زبان مایایی + ارزیایی + نائورویی + ناواتلی + زبان سرخپوستی امریکای شمالی + ناپلی + بوکسمال نروژی + انده‌بله‌ای شمالی + آلمانی سفلی + نپالی + نواریایی + اندونگایی + نیاسی + نیویی + هلندی + فلمنگی + نرس جدید نروژی + نروژی + نغایی + نرس باستان + انده‌بله‌ای جنوبی + سوتویی شمالی + زبان نوبیایی + ناواهویی + نواریایی کلاسیک + نیانجایی + نیام‌وزیایی + نیانکوله‌ای + نیورویی + نزیمایی + اوکیتایی + اوجیبوایی + اورومویی + اوریه‌ای + آسی + اوسیجی + ترکی عثمانی + زبان اتومیایی + پنجابی + زبان پاپوایی + پانگاسینانی + پهلوی + پامپانگایی + پاپیامنتو + پالائویی + فارسی باستان + زبان فیلیپینی + فنیقی + پالی + لهستانی + پناپی + زبان پراکریتی + پرووانسی باستان + پشتو + پرتغالی + پرتغالی برزیل + پرتغالی پرتغال + کچوایی + راجستانی + راپانویی + راروتونگایی + رتو‐رومیایی + روندیایی + رومانیایی + زبان رومیایی + رومانویی + ریشه + روسی + کینیارواندایی + سنسکریت + سانداوه‌ای + یاقوتی + زبان سرخپوستی امریکای جنوبی + زبان سالیشی + آرامی سامری + ساساکی + سانتالی + ساردینیایی + سیسیلی + اسکاتلندی + سندی + سلکوپی + زبان سامی + سانگویی + ایرلندی باستان + زبان نشانه‌ای + صرب و کرواتی + شانی + سینهالی + سیدامویی + زبان سویی + زبان چین و تبتی + اسلواکی + اسلووینیایی + زبان اسلاوی + ساموآیی + شونایی + سونینکه‌ای + سومالیایی + سغدی + سونغایی + آلبانیایی + صربی + تاکی‌تاکی + سریری + سوازیایی + زبان نیلی و صحرایی + سوتویی جنوبی + سوندایی + سوکومایی + سوسویی + سومری + سوئدی + سواحلی + سریانی کلاسیک + سریانی + تامیلی + زبان تایی + تلوگویی + تمنه‌ای + ترنو + تتومی + تاجیکی + تایلندی + تیگرینیایی + تیگره‌ای + تیوی + ترکمنی + تاگالوگی + کلینگون + تلین‌گیتی + تاماشقی + تسوانایی + تونگایی + تونگایی نیاسا + زبان توک پیسینی + ترکی استانبولی + تسونگایی + تسیم‌شیانی + تاتاری + تومبوکایی + زبان توپیایی + زبان آلتاییک + تووالویی + توی‌یایی + تاهیتیایی + تووایی + اودمورتی + اویغوری + اوگاریتی + اوکراینی + امبوندویی + زبان نامشخص یا نامعتبر + اردو + ازبکی + ویایی + وندایی + ویتنامی + ولاپوک + وتی + والونی + زبان واکاشی + والامو + وارایی + واشویی + زبان صُربی + ولوفی + قلموقی + خوسایی + یائویی + یاپی + یدی + یوروبایی + زبان یوپیکی + چوانگی + زاپوتکی + زناگا + چینی + چینی ساده‌شده + چینی سنتی + زانده‌ای + زولویی + زونیایی + بدون محتوای زبانی + زازایی + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + جهان + افریقا + امریکای شمالی + امریکای جنوبی + اقیانوسیه + غرب افریقا + امریکای مرکزی + شرق افریقا + شمال افریقا + مرکز افریقا + جنوب افریقا + امریکا + شمال امریکا + کارائیب + شرق آسیا + جنوب آسیا + جنوب شرقی آسیا + جنوب اروپا + استرالیا و زلاند نو + ملانزی + ناحیهٔ میکرونزی + پلی‌نزی + جنوب آسیا و آسیای میانه + آسیا + آسیای مرکزی + غرب آسیا + اروپا + شرق اروپا + شمال اروپا + غرب اروپا + کشورهای مستقل مشترک‌المنافع + امریکای لاتین و کارائیب + آندورا + امارات متحدهٔ عربی + افغانستان + آنتیگوا و باربودا + آنگیل + آلبانی + ارمنستان + آنتیل هلند + آنگولا + جنوبگان + آرژانتین + ساموای امریکا + اتریش + استرالیا + آروبا + جزایر آلاند + جمهوری آذربایجان + بوسنی و هرزگوین + باربادوس + بنگلادش + بلژیک + بورکینافاسو + بلغارستان + بحرین + بوروندی + بنین + سنت بارتلیمی + برمودا + برونئی + بولیوی + برزیل + باهاما + بوتان + جزیرهٔ بووت + بوتسوانا + بیلوروسی + بلیز + کانادا + جزایر کوکوس + کنگو کینشاسا + جمهوری افریقای مرکزی + کنگو برازویل + سوئیس + ساحل عاج + جزایر کوک + شیلی + کامرون + چین + کلمبیا + کاستاریکا + صربستان و مونته‌نگرو + کوبا + کیپ ورد + جزیرهٔ کریسمس + قبرس + جمهوری چک + آلمان + جیبوتی + دانمارک + دومینیک + جمهوری دومینیکن + الجزایر + اکوادر + استونی + مصر + صحرای غربی + اریتره + اسپانیا + اتیوپی + فنلاند + فیجی + جزایر فالکلند + میکرونزی + جزایر فارو + فرانسه + گابون + بریتانیا + گرانادا + گرجستان + گویان فرانسه + گرنزی + غنا + جبل‌الطارق + گروئنلند + گامبیا + گینه + گوادلوپ + گینهٔ استوایی + یونان + جورجیای جنوبی و جزایر ساندویچ جنوبی + گواتمالا + گوام + گینهٔ بیسائو + گویان + هنگ‌کنگ، ناحیهٔ ویژهٔ حکومتی چین + جزیرهٔ هرد و جزایر مک‌دونالد + هندوراس + کرواسی + هاییتی + مجارستان + اندونزی + ایرلند + اسرائیل + جزیرهٔ مان + هند + مستعمره‌های بریتانیا در اقیانوس هند + عراق + ایران + ایسلند + ایتالیا + جرسی + جامائیکا + اردن + ژاپن + کنیا + قرقیزستان + کامبوج + کیریباتی + کومورو + سنت کیتس و نویس + کرهٔ شمالی + کرهٔ جنوبی + کویت + جزایر کِیمن + قزاقستان + لائوس + لبنان + سنت لوسیا + لیختن‌اشتاین + سری‌لانکا + لیبریا + لسوتو + لیتوانی + لوکزامبورگ + لتونی + لیبی + مراکش + موناکو + مولداوی + مونته‌نگرو + سنت مارتین + ماداگاسکار + جزایر مارشال + مقدونیه + مالی + میانمار + مغولستان + ماکائو، ناحیهٔ ویژهٔ حکومتی چین + جزایر ماریانای شمالی + مارتینیک + موریتانی + مونت‌سرات + مالت + موریس + مالدیو + مالاوی + مکزیک + مالزی + موزامبیک + نامیبیا + کالدونیای جدید + نیجر + جزیرهٔ نورفولک + نیجریه + نیکاراگوئه + هلند + نروژ + نپال + نائورو + نیوئه + زلاند نو + عمان + پاناما + پرو + پلی‌نزی فرانسه + پاپوا گینهٔ نو + فیلیپین + پاکستان + لهستان + سنت پیر و میکلون + پیتکایرن + پورتو ریکو + فلسطین + پرتغال + پالائو + پاراگوئه + قطر + بخش‌های دورافتادهٔ اقیانوسیه + اتحادیهٔ اروپا + ریونیون + رومانی + صربستان + روسیه + رواندا + عربستان سعودی + جزایر سلیمان + سیشل + سودان + سوئد + سنگاپور + سنت هلن + اسلوونی + اسوالبارد و جان ماین + اسلواکی + سیرالئون + سان مارینو + سنگال + سومالی + سورینام + سائو تومه و پرینسیپه + السالوادور + سوریه + سوازیلند + جزایر ترک و کایکوس + چاد + مستعمره‌های جنوبی فرانسه + توگو + تایلند + تاجیکستان + توکلائو + تیمور شرقی + ترکمنستان + تونس + تونگا + ترکیه + ترینیداد و توباگو + تووالو + تایوان + تانزانیا + اوکراین + اوگاندا + جزایر کوچک دورافتادهٔ ایالات متحده + ایالات متحدهٔ امریکا + اوروگوئه + ازبکستان + واتیکان + سنت وینسنت و گرنادین + ونزوئلا + جزایر ویرجین بریتانیا + جزایر ویرجین ایالات متحده + ویتنام + وانواتو + والیس و فیوتونا + ساموا + یمن + مایوت + افریقای جنوبی + زامبیا + زیمبابوه + ناحیهٔ نامشخص یا نامعتبر + + + رسم‌الخط سنتی آلمانی + رسم‌الخط آلمانی ۱۹۹۶ میلادی + ارمنی شرقی + ارمنی غربی + کامپیوتری + رسم‌الخط تجدیدنظرشده + ساهویی + انگلیسی معیار اسکاتلند + + + تقویم + ترتیب‌بندی + واحد پول + + + ترتیب چینی سنتی Big5 + تقویم بودایی + تقویم چینی + ترتیب مستقیم + ترتیب چینی ساده‌شده GB2312 + تقویم میلادی + تقویم عبری + تقویم ملی هند + تقویم هجری قمری + تقویم هجری قمری مدنی + تقویم ژاپنی + تقویم هجری شمسی + ترتیب دفتر تلفن + ترتیب پین‌یین چینی ساده‌شده + تقویم جمهوری چین + ترتیب حرکتی چینی سنتی + ترتیب سنتی + + + امریکایی + متریک + + + زبان: {0} + خط: {0} + ناحیه: {0} + + + + + + + [\u064B \u064D \u064C \u0651 \u0654 آ ا ء أ ؤ ئ ب پ ت-ج چ ح-ز ژ س-غ ف ق ک گ ل-ن و ه ة ی] + [\u064E-\u0650 \u0652 \u0656 \u0670 ۰-۹ \u200C-\u200F] + [a-z ﷼] + + + « + » + ‹ + › + + + {0} تا {1} + + + + + + ژانویهٔ + فوریهٔ + مارس + آوریل + مهٔ + ژوئن + ژوئیهٔ + اوت + سپتامبر + اکتبر + نوامبر + دسامبر + + + ژانویهٔ + فوریهٔ + مارس + آوریل + مهٔ + ژوئن + ژوئیهٔ + اوت + سپتامبر + اکتبر + نوامبر + دسامبر + + + + + ژ + ف + م + آ + م + ژ + ژ + ا + س + ا + ن + د + + + ژانویه + فوریه + مارس + آوریل + مه + ژوئن + ژوئیه + اوت + سپتامبر + اکتبر + نوامبر + دسامبر + + + + + + + یکشنبه + دوشنبه + سه‌شنبه + چهارشنبه + پنجشنبه + جمعه + شنبه + + + + + ی + د + س + چ + پ + ج + ش + + + + + + + س‌م۱ + س‌م۲ + س‌م۳ + س‌م۴ + + + سه‌ماههٔ اول + سه‌ماههٔ دوم + سه‌ماههٔ سوم + سه‌ماههٔ چهارم + + + + + ۱ + ۲ + ۳ + ۴ + + + + قبل از ظهر + بعد از ظهر + + + قبل از میلاد + میلادی + + + ق.م. + م. + + + ق + م + + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + yyyy/M/d + + + + + yy/M/d + + + + + + + H:mm:ss (zzzz) + + + + + H:mm:ss (z) + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1}، ساعت {0} + + + + + {1}، ساعت {0} + + + + + {1}،‏ {0} + + + + + {1}،‏ {0} + + + + EEE d + d MMMM y GGGG + HH:mm (Z) + H:mm + L + E M/d + LLL + E d LLL + E d LLLL + d LLLL + d LLL + M/d + d + mm:ss + mm:ss + y + yyyy/M + E yyyy/M/d + MMM y + E d MMM y + MMMM y + yyyy Q + y QQQ + Q yy + yyyy/M + MMMM y + EEEE d MMMM y + + + {1} {0} + + + {0} تا {1} + + M تا M + + + E M/d تا E M/d + E M/d تا E M/d + + + LLL تا LLL + + + E d LLL تا E d LLL + E d LLL تا E d LLL + + + LLLL تا LLLL + + + d LLL تا d LLL + d تا d LLL + + + M/d تا M/d + d/M تا d/M + + + d تا d + + + H تا H + H تا H + + + H:mm تا H:mm + H:mm تا H:mm + H:mm تا H:mm + + + H:mm تا H:mm (v) + H:mm تا H:mm (v) + H:mm تا H:mm (v) + + + H تا H (v) + H تا H (v) + + + y تا y + + + yyyy/M تا yyyy/M + yyyy/M تا yyyy/M + + + E yyyy/M/d تا E yyyy/M/d + E yyyy/M/d تا E yyyy/M/d + E yyyy/M/d تا E yyyy/M/d + + + LLL تا MMM y + MMM y تا MMM y + + + E d LLL تا E d MMM y + E d LLL تا E d MMM y + E d MMM y تا E d MMM y + + + LLLL تا MMMM y + MMMM y تا MMMM y + + + d LLL تا d MMM y + d تا d MMM y + d MMM y تا d MMM y + + + yyyy/M/d تا yyyy/M/d + yyyy/M/d تا yyyy/M/d + yyyy/M/d تا yyyy/M/d + + + + + + دوره + + + سال + + + ماه + + + هفته + + + روز + سه روز پیش + پریروز + دیروز + امروز + فردا + پس‌فردا + سه روز بعد + + + روز هفته + + + قبل/بعد از ظهر + + + ساعت + + + دقیقه + + + ثانیه + + + منطقهٔ زمانی + + + + + + + + تشری + حشوان + کسلو + طوت + شباط + آذار + واذار + نیسان + ایار + سیوان + تموز + آب + ایلول + + + + + ت + ح + ک + ط + ش + آ + و + ن + ا + س + ت + آ + ا + + + + + + + + + محرم + صفر + ربیع الاول + ربیع الثانی + جمادی الاول + جمادی الثانی + رجب + شعبان + رمضان + شوال + ذیقعدهٔ + ذیحجهٔ + + + + + م + ص + ر + ر + ج + ج + ر + ش + ر + ش + ذ + ذ + + + + قبل از ظهر + بعد از ظهر + + + هجری قمری + + + ه‍. ق. + + + + + + + EEEE d MMMM y GGGG + + + + + d MMMM y G + + + + + yyyy/M/d G + + + + + yy/M/d G + + + + + + + + + فروردین + اردیبهشت + خرداد + تیر + مرداد + شهریور + مهر + آبان + آذر + دی + بهمن + اسفند + + + + + ف + ا + خ + ت + م + ش + م + آ + آ + د + ب + ا + + + + قبل از ظهر + بعد از ظهر + + + هجری شمسی + + + ه‍. ش. + + + + + + +HH:mm;−HH:mm + GMT{0} + وقت {0} + {1} ({0}) + + نامشخص + + + آندورا + + + کابل + + + آنگویلا + + + روترا + + + پالمر + + + قطب جنوب + + + سی ووا + + + ماوسون + + + دیویس + + + ووستوک + + + کیسی + + + دومونت د اورویل + + + مک موردو + + + ریو گالگوس + + + مندوسا + + + سن خوان + + + اوشوایا + + + لاریوجا + + + سن لوئیس + + + کاتامارکا + + + خوخوئی + + + توکومن + + + کوردووا + + + بوئنوس‌آیرس + + + پرت + + + اوکلا + + + داروین + + + آدلاید + + + بروکن هیل + + + کوری + + + ملبورن + + + هوبارت + + + لیندمن + + + سیدنی + + + بریسبین + + + لردهاو + + + آروبا + + + باربادس + + + بحرین + + + برمودا + + + ایرونپه + + + ریو برانکو + + + پورتوولیو + + + بوئاویشتا + + + ماناوس + + + کویاوا + + + کمپو گرانده + + + بلم + + + آراگواینا + + + سائوپائولو + + + باهیا + + + فورتالزا + + + ماسیو + + + ریسایف + + + نورونیا + + + بلیز + + + داوسن + + + وایت‌هورس + + + اینوویک + + + ونکوور + + + داوسن کریک + + + یلونایف + + + ادمونتون + + + سوئیفت کورنت + + + خلیج کمبریج + + + رجاینا + + + وینیپگ + + + رسولوت + + + رینی‌ریور + + + خلیجک رنکین + + + کورال هاربر + + + ثاندر بی + + + نیپیگان + + + تورنتو + + + مونرئال + + + ایکلوئت + + + پانگنیرتونگ + + + مانکتون + + + هلیفکس + + + خلیج گوس + + + گلیس بی + + + بلنک-سابلن + + + سنت جان + + + کینشاسا + + + لوبومباشی + + + ایستر + + + سانتیاگو + + + کاشغر + + + ارومچی + + + چونگ کینگ + + + شانگهای + + + هاربین + + + کستا ریکا + + + کیپ ورد + + + دجیبوتی + + + دمونیکا + + + گالاپاگوس + + + گوایاکیل + + + قناری + + + سئوتا + + + مادرید + + + فیجی + + + تراک + + + پناپه + + + کوساره + + + گرینادا + + + جبل الطارق + + + تول + + + گودهوب + + + اسکورسبیساند + + + دانمارک شاون + + + گوادلوپ + + + گواتمالا + + + گوام + + + گویانا + + + هونگ کنگ + + + جاکارتا + + + پونتیاناک + + + ماکاسار + + + جیاپورا + + + تهران + + + جامایکا + + + اندربری + + + کریتیماتی + + + تاراوا + + + کویت + + + آکتا + + + اورال + + + آکتوبه + + + کویزیلوردا + + + آلماتی + + + لاکسمبورگ + + + موناکو + + + کواجالین + + + ماجورو + + + هود + + + اولان باتار + + + چیو بال سان + + + مکاو + + + مارتینیکو + + + منتسرات + + + مالتا + + + ماوریتیوس + + + مالدیو + + + تی جوانا + + + ارموسیو + + + ماساتلان + + + چیئوائوا + + + مونترئی + + + مکزیکوسیتی + + + مریدا + + + کانکون + + + کوچینگ + + + ناورو + + + نیوه + + + چاتام + + + پاناما + + + تاهیتی + + + مارکوس + + + گامبیر + + + پیتکیرن + + + پورتو ریکو + + + آزورس + + + مادریا + + + لیسبون + + + پالاو + + + قطر + + + ریونیون + + + کالینینگراد + + + مسکو + + + ولگاگراد + + + سامارا + + + یکاترینبرگ + + + اومسک + + + نووسیبیریسک + + + کراسنویارسک + + + ایرکوتسک + + + یاکوتسک + + + ولادی‌وستوک + + + ساخالین + + + مگادن + + + کامچاتکا + + + آنادیر + + + سنگاپور + + + ال سالوادر + + + اوژگورود + + + کیف + + + سیمفروپل + + + زاپوروژی + + + میدوی + + + جانستون + + + ویک + + + ایدک + + + نوم + + + هونولولو + + + انکریج + + + یاکوتات + + + جونو + + + لوس‌آنجلس + + + بویسی + + + فینکس + + + شیپراک + + + دنور + + + سالم جدید، داکوتای شمالی + + + سنتر، داکوتای شمالی + + + شیکاگو + + + منامینی + + + وینسنس ایندیانا + + + پترزبرگ + + + تل‌سیتی، ایندیانا + + + ناکس + + + ویناماک ایندیانا + + + مارنگو + + + ایندیاناپولیس + + + لوئیزویل + + + ویوی + + + مانتیسلو + + + دترویت + + + نیویورک + + + سمرقند + + + تاشکند + + + مایوته + + + + وقت افغانستان + وقت افغانستان + وقت تابستانی افغانستان + + + + + وقت مرکز افریقا + + + + + وقت شرق افریقا + + + + + وقت جنوب افریقا + وقت عادی جنوب افریقا + + + + + وقت غرب افریقا + وقت تابستانی غرب افریقا + + + + + وقت آلاسکا + وقت عادی آلاسکا + وقت تابستانی آلاسکا + + + + + وقت آلاسکا‐هاوائی + وقت عادی آلاسکا‐هاوائی + وقت تابستانی آلاسکا‐هاوائی + + + + + وقت آمازون + وقت تابستانی آمازون + + + + + وقت مرکز امریکا + وقت عادی مرکز امریکا + وقت تابستانی مرکز امریکا + + + + + وقت شرق امریکا + وقت عادی شرق امریکا + وقت تابستانی شرق امریکا + + + + + وقت کوهستانی امریکا + وقت عادی کوهستانی امریکا + وقت تابستانی کوهستانی امریکا + + + + + وقت غرب امریکا + وقت عادی غرب امریکا + وقت تابستانی غرب امریکا + + + + + وقت عربستان + وقت عادی عربستان + وقت تابستانی عربستان + + + + + وقت آرژانتین + وقت تابستانی آرژانتین + + + + + وقت غرب آرژانتین + + + + + وقت ارمنستان + وقت تابستانی ارمنستان + + + + + وقت عشق‌آباد + وقت تابستانی عشق‌آباد + + + + + وقت آتلانتیک + وقت عادی آتلانتیک + وقت تابستانی آتلانتیک + + + + + وقت مرکز استرالیا + وقت عادی مرکز استرالیا + وقت تابستانی مرکز استرالیا + + + + + وقت شرق استرالیا + وقت عادی شرق استرالیا + وقت تابستانی شرق استرالیا + + + + + وقت غرب استرالیا + وقت عادی غرب استرالیا + وقت تابستانی غرب استرالیا + + + + + وقت جمهوری آذربایجان + وقت تابستانی جمهوری آذربایجان + + + + + وقت باکو + وقت تابستانی باکو + + + + + وقت بنگلادش + + + + + وقت برینگ + وقت عادی برینگ + وقت تابستانی برینگ + + + + + وقت بوتان + + + + + وقت بولیوی + + + + + وقت برازیلیا + وقت تابستانی برازیلیا + + + + + وقت کیپ ورد + وقت تابستانی کیپ ورد + + + + + وقت شیلی + وقت تابستانی شیلی + + + + + وقت چین + وقت عادی چین + وقت تابستانی چین + + + + + وقت جزیرهٔ کریسمس + + + + + وقت جزایر کوکوس + + + + + وقت کلمبیا + وقت تابستانی کلمبیا + + + + + وقت جزایر کوک + + + + + وقت کوبا + وقت عادی کوبا + وقت تابستانی کوبا + + + + + وقت دیویس + + + + + وقت دوشنبه + وقت تابستانی دوشنبه + + + + + وقت گویان هلند + + + + + وقت تیمور شرقی + + + + + وقت جزیرهٔ ایستر + وقت تابستانی جزیرهٔ ایستر + + + + + وقت اکوادور + + + + + وقت مرکز اروپا + وقت تابستانی مرکز اروپا + + + + + وقت شرق اروپا + وقت تابستانی شرق اروپا + + + + + وقت غرب اروپا + وقت تابستانی غرب اروپا + + + + + وقت جزایر فالکلند + وقت تابستانی جزایر فالکلند + + + + + وقت فیجی + وقت تابستانی فیجی + + + + + وقت گویان فرانسه + + + + + وقت گرینویچ + + + + + وقت گالاپاگوس + + + + + وقت گرجستان + وقت تابستانی گرجستان + + + + + وقت مرکز گروئنلند + وقت تابستانی مرکز گروئنلند + + + + + وقت شرق گروئنلند + وقت تابستانی شرق گروئنلند + + + + + وقت غرب گروئنلند + وقت تابستانی غرب گروئنلند + + + + + وقت عادی گوام + + + + + وقت گویان + + + + + وقت هنگ‌کنگ + وقت تابستانی هنگ‌کنگ + + + + + وقت عادی هند + + + + + وقت اقیانوس هند + + + + + وقت هندوچین + + + + + وقت مرکز اندونزی + + + + + وقت شرق اندونزی + + + + + وقت غرب اندونزی + + + + + وقت ایران + وقت عادی ایران + وقت تابستانی ایران + + + + + وقت ایرکوتسک + وقت تابستانی ایرکوتسک + + + + + وقت اسرائیل + وقت عادی اسرائیل + وقت تابستانی اسرائیل + + + + + وقت ژاپن + وقت عادی ژاپن + وقت تابستانی ژاپن + + + + + وقت کراچی + + + + + وقت کاشغر + + + + + وقت شرق قزاقستان + وقت عادی شرق قزاقستان + + + + + وقت غرب قزاقستان + وقت عادی غرب قزاقستان + + + + + وقت کره + وقت عادی کره + وقت تابستانی کره + + + + + وقت قرقیزستان + + + + + وقت لانکا + + + + + وقت ماکائو + وقت تابستانی ماکائو + + + + + وقت مالزی + + + + + وقت مالدیو + + + + + وقت جزایر مارشال + + + + + وقت مسکو + وقت عادی مسکو + وقت تابستانی مسکو + + + + + وقت میانمار + + + + + وقت نائورو + + + + + وقت نپال + + + + + وقت زلاند نو + وقت عادی زلاند نو + وقت تابستانی زلاند نو + + + + + وقت جزایر ماریانای شمالی + + + + + وقت پاکستان + وقت تابستانی پاکستان + + + + + وقت پالائو + + + + + وقت پاپوا گینهٔ نو + + + + + وقت پاراگوئه + وقت تابستانی پاراگوئه + + + + + وقت پرو + وقت تابستانی پرو + + + + + وقت فیلیپین + وقت تابستانی فیلیپین + + + + + وقت سمرقند + وقت تابستانی سمرقند + + + + + وقت عادی ساموا + + + + + وقت سیشل + + + + + وقت عادی سنگاپور + + + + + وقت جزایر سلیمان + + + + + وقت جورجیای جنوبی + + + + + وقت سورینام + + + + + وقت تاهیتی + + + + + وقت تاجیکستان + + + + + وقت تاشکند + وقت تابستانی تاشکند + + + + + وقت تفلیس + وقت تابستانی تفلیس + + + + + وقت تونگا + وقت تابستانی تونگا + + + + + وقت ترکیه + وقت تابستانی ترکیه + + + + + وقت ترکمنستان + وقت تابستانی ترکمنستان + + + + + وقت تووالو + + + + + وقت اروگوئه + وقت تابستانی اروگوئه + + + + + وقت ارومچی + + + + + وقت ازبکستان + وقت تابستانی ازبکستان + + + + + وقت واناتو + وقت تابستانی واناتو + + + + + وقت ونزوئلا + + + + + وقت جزیرهٔ ویک + + + + + وقت یاکوتسک + وقت تابستانی یاکوتسک + + + + + وقت ایروان + وقت تابستانی ایروان + + + + + + arabext + + ٫ + ٬ + ؛ + ٪ + ۰ + # + + + − + ×۱۰^ + ؉ + ∞ + NaN + + + + + #,##0.###;'‪'-#,##0.###'‬' + + + + + + + #E0 + + + + + + + '‪'%#,##0'‬' + + + + + + + #,##0.00 ¤;'‪'-#,##0.00'‬' ¤ + + + {0} {1} + + + + پزتای آندورا + + + درهم امارات متحدهٔ عربی + + + افغانی افغانستان (۱۹۲۷ تا ۲۰۰۲) + + + افغانی افغانستان + + + لک آلبانی + + + درم ارمنستان + + + گیلدر آنتیل هلند + + + پزوی آرژانتین (۱۹۸۳ تا ۱۹۸۵)‏ + + + پزوی آرژانتین + + + شیلینگ اتریش + + + دلار استرالیا + + + فلورین آروبا + + + منات جمهوری آذربایجان (۱۹۹۳ تا ۲۰۰۶) + + + منات جمهوری آذربایجان + + + دینار بوسنی و هرزگوین + + + دلار باربادوس + + + فرانک بلژیک + + + فرانک بلژیک (مالی) + + + دینار بحرین + + + فرانک بوروندی + + + دلار برمودا + + + دلار برونئی + + + پزوی بولیوی + + + رئال برزیل + + + دلار باهاما + + + روبل جدید بیلوروسی (۱۹۹۴ تا ۱۹۹۹) + + + روبل بیلوروسی + + + دلار بلیز + + + دلار کانادا + + + فرانک کنگو + + + فرانک سوئیس + + + پزوی شیلی + + + یوآن چین + + + پزوی کلمبیا + + + دینار قدیم صربستان + + + پزوی کوبا + + + اسکودوی کیپ ورد + + + پوند قبرس + + + مارک آلمان شرقی + + + مارک آلمان + + + فرانک جیبوتی + + + کرون دانمارک + + + پزوی دومینیکا + + + دینار الجزایر + + + یورو + + + دلار فیجی + + + پوند جزایر فالکلند + + + فرانک فرانسه + + + پوند بریتانیا + + + پوند جبل‌الطارق + + + فرانک گینه + + + دراخمای یونان + + + پزوی گینهٔ بیسائو + + + دلار گویان + + + دلار هنگ‌کنگ + + + دینار کرواسی + + + فورینت مجارستان + + + روپیهٔ اندونزی + + + پوند ایرلند + + + روپیهٔ هند + + + دینار عراق + + + ریال ایران + ﷼ + + + لیرهٔ ایتالیا + + + دلار جامائیکا + + + دینار اردن + + + ین ژاپن + + + شیلینگ کنیا + + + فرانک کومورو + + + دینار کویت + + + دلار جزایر کِیمن + + + لیرهٔ لبنان + + + روپیهٔ سری‌لانکا + + + دلار لیبریا + + + فرانک لوکزامبورگ + + + فرانک مالی لوگزامبورگ + + + روبل لتونی + + + دینار لیبی + + + درهم مراکش + + + فرانک مراکش + + + فرانک ماداگاسکار + + + دینار مقدونیه + + + فرانک مالی + + + لیرهٔ مالت + + + پوند مالت + + + روپیهٔ موریس + + + پزوی مکزیک + + + پزوی نقرهٔ مکزیک (۱۸۶۱ تا ۱۹۹۲) + + + اسکودوی موزامبیک + + + دلار نامیبیا + + + گیلدر هلند + + + کرون نروژ + + + روپیهٔ نپال + + + دلار زلاند نو + + + ریال عمان + + + پزوی فیلیپین + + + روپیهٔ پاکستان + + + زواتی لهستان + + + اسکودوی پرتغال + + + ریال قطر + + + دلار رودزیا + + + دینار صربستان + + + روبل روسیه + + + روبل روسیه (۱۹۹۱ تا ۱۹۹۸) + + + فرانک رواندا + + + ریال سعودی + + + دلار جزایر سلیمان + + + روپیهٔ سیشل + + + دینار قدیم سودان + + + کرون سوئد + + + دلار سنگاپور + + + پوند سنت هلن + + + دلار سورینام + + + گیلدر سورینام + + + روبل شوروی + + + لیرهٔ سوریه + + + بات تایلند + + + روبل تاجیکستان + + + سامانی تاجیکستان + + + منات ترکمنستان + + + منات جدید ترکمنستان + + + دینار تونس + + + اسکودوی تیمور + + + لیرهٔ قدیم ترکیه + + + لیرهٔ ترکیه + + + دلار ترینیداد و توباگو + + + دلار جدید تایوان + + + شیلینگ تانزانیا + + + شیلینگ اوگاندا (۱۹۶۶ تا ۱۹۸۷) + + + شیلینگ اوگاندا + + + دلار امریکا + + + دلار امریکا (روز بعد) + + + دلار امریکا (همان روز) + + + پزوی اوروگوئه (۱۹۷۵ تا ۱۹۹۳) + + + پزوی اوروگوئه + + + سوم ازبکستان + + + نقره + + + طلا + + + دلار شرق کارائیب + + + فرانک طلای فرانسه + + + پالادیم + + + پلاتین + + + ارز نامشخص یا نامعتبر + + + دینار یمن + + + ریال یمن + + + راند افریقای جنوبی + + + دلار زیمبابوه + + + دلار زیمبابوه (۲۰۰۹) + + + دلار زیمبابوه (۲۰۰۸) + + + + + + {0} روز + + + {0} ساعت + + + {0} دقیقه + + + {0} ماه + + + {0} ثانیه + + + {0} هفته + + + {0} سال + + + + + بله:ب:آری:آ + نه:ن:خیر:خ + + + diff --git a/lib/zend/Zend/Locale/Data/fa_AF.xml b/lib/zend/Zend/Locale/Data/fa_AF.xml new file mode 100644 index 0000000000..4c6a01801f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fa_AF.xml @@ -0,0 +1,305 @@ + + + + + + + + + + + + هسپانوی + دری + فنلندی + آیرلندی + کروشیایی + اندونیزیایی + آیسلندی + ایتالوی + جاپانی + کوریایی + قرغزی + مغلی + نیپالی + هالندی + نارویژی + پولندی + پرتگالی + سویدنی + تاجکی + + + + + + اندورا + امارات متحدهٔ عربی + انتیگوا و باربودا + البانیا + انگولا + ارجنتاین + آسترالیا + بوسنیا و هرزه‌گوینا + بنگله‌دیش + بلجیم + بلغاریا + برونی + بولیویا + برازیل + بهاماس + روسیهٔ سفید + جمهوری دموکراتیک کانگو + افریقای مرکزی + کانگو + سویس + چلی + کولمبیا + کاستریکا + کیوبا + دنمارک + اکوادور + استونیا + اریتریا + هسپانیه + ایتوپیا + فنلند + میکرونزیا + گرینادا + گینیا + گینیا استوایی + گواتیمالا + گینیا بیسائو + گیانا + هاندوراس + کروشیا + هایتی + اندونیزیا + آیرلند + آیسلند + جاپان + کینیا + قرغزستان + کمپوچیا + کومور + سنت کیتس و نیویس + کوریای شمالی + کوریای جنوبی + سریلانکا + لیسوتو + لتوانیا + لاتویا + لیبیا + مادغاسکر + منگولیا + موریتانیا + مالتا + مکسیکو + مالیزیا + موزمبیق + نیجریا + نیکاراگوا + هالند + ناروی + نیپال + زیلاند جدید + پانامه + پیرو + پاپوا نیو گینیا + پولند + پرتگال + پاراگوای + رومانیا + روآندا + جزایر سلومون + سویدن + سینگاپور + سلونیا + سلواکیا + سیرالیون + سینیگال + سومالیه + سائو تومه و پرینسیپ + السلوادور + تاجکستان + اکراین + ایالات متحدهٔ امریکا + یوروگوای + سنت وینسنت و گرینادین + ونزویلا + ساموآ + زیمبابوی + + + + [\u0656 \u0670 \u200C \u200D ټ ځ څ ډ ړ ږ ښ ګ ڼ ي] + + + + + + + + جنو + مـی + جون + جول + دسم + + + جنوری + فبروری + مارچ + اپریل + می + جون + جولای + اگست + سپتمبر + اکتوبر + نومبر + دسمبر + + + + + ج + ف + م + ا + م + ج + ج + ا + س + ا + ن + د + + + + + + + + + حمل + ثور + جوزا + سرطان + اسد + سنبلهٔ + میزان + عقرب + قوس + جدی + دلو + حوت + + + + + ح + ث + ج + س + ا + س + ع + ق + ج + د + ح + + + حمل + ثور + جوزا + سرطان + اسد + سنبله + میزان + عقرب + قوس + جدی + دلو + حوت + + + + + + هجری شمسی + + + ه‍. ش. + + + + + + + + ٫ + ٬ + ٪ + ۰ + − + + + + + '‪'#,##0%'‬' + + + + + + ؋ + + + دالر آسترالیا + + + دالر برونی + + + روبل روسیهٔ سفید + + + دالر کانادا + + + فرانک سویس + + + کرون دنمارک + + + ین جاپان + + + پزوی مکسیکو + + + گیلدر هالند + + + کرون ناروی + + + کرون سویدن + + + دالر سینگاپور + + + سامانی تاجکستان + + + دالر امریکا + + + + + diff --git a/lib/zend/Zend/Locale/Data/fa_IR.xml b/lib/zend/Zend/Locale/Data/fa_IR.xml new file mode 100644 index 0000000000..939b8c1b5f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fa_IR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/fi.xml b/lib/zend/Zend/Locale/Data/fi.xml new file mode 100644 index 0000000000..4224475df8 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fi.xml @@ -0,0 +1,3830 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abhaasi + aceh + atšoli + adangme + adyge + avesta + afrikaans + afro-aasialainen kieli + afrihili + ainu + akan + akkadi + aleutti + algonkin-kieli + altai + amhara + aragonia + muinaisenglanti + angika + apaššikieli + arabia + aramea + araukaani + arapaho + keinotekoinen kieli + arawak + assami + asturia + athabasca-kieli + australialainen kieli + avaari + awadhi + aimara + azeri + baškiiri + banda + bamileke-kieli + belutši + bali + basa + balttilainen kieli + valkovenäjä + bedža + bemba + berberikieli + bulgaria + bihari + bhodžpuri + bislama + bikol + bini + mustajalka + bambara + bengali + bantukieli + tiibet + bretoni + bradž + bosnia + batak + burjaatti + bugi + bilin + katalaani + caddo + keskiamerikkalainen intiaanikieli + karibi + kaukasialainen kieli + atsam + tšetšeeni + cebuano + kelttiläinen kieli + tšamorro + tšibtša + tšagatai + chuuk + mari + chinook-jargon + choctaw + chipewyan + cherokee + cheyenne + tšam-kieli + korsika + kopti + englantiin perustuva kreoli- tai pidgin-kieli + ranskaan perustuva kreoli- tai pidgin-kieli + portugaliin perustuva kreoli- tai pidgin-kieli + cree + krimintataari + kreoli- tai pidgin-kieli + tšekki + kašubi + kirkkoslaavi + kuušilainen kieli + tšuvassi + kymri + tanska + dakota + dargi + dajakki + saksa + itävallansaksa + sveitsinyläsaksa + delaware + slevi + dogrib + dinka + dogri + dravidakieli + alasorbi + duala + keskihollanti + divehi + djula + dzongkha + ewe + efik + muinaisegypti + ekajuk + kreikka + elami + englanti + australianenglanti + kanadanenglanti + britannianenglanti + amerikanenglanti + keskienglanti + esperanto + espanja + amerikanespanja + espanjanespanja + viro + baski + ewondo + farsi + fang + fanti + fulani + suomi + filipino + suomalais-ugrilainen kieli + fidži + fääri + fon + ranska + kanadanranska + sveitsinranska + keskiranska + muinaisranska + pohjoisfriisi + itäfriisi + friuli + länsifriisi + iiri + ga + gajo + gbaja + gaeli + germaaninen kieli + ge’ez + kiribati + galicia + keskiyläsaksa + guarani + muinaisyläsaksa + gondi + gorontalo + gootti + grebo + muinaiskreikka + sveitsinsaksa + gudžarati + manx + gwitšin + hausa + haida + havaiji + heprea + hindi + hiligaino + himatšali + heetti + hmong + hiri-motu + kroatia + yläsorbi + haiti + unkari + hupa + armenia + herero + interlingua + iban + indonesia + interlingue + igbo + sichuanin-yi + idžo + inupiatun + iloko + indoarjalainen kieli + indoeurooppalainen kieli + inguuši + ido + iranilainen kieli + irokeesikieli + islanti + italia + inuktitut + japani + lojban + juutalaispersia + juutalaisarabia + jaava + georgia + karakalpakki + kabyyli + kachin + jju + kamba + karen + kavi + kabardi + tyap + norsunluurannikonkoro + kongo + khasi + khoisan-kieli + khotani + kikuju + kuanjama + kazakki + kalaallisut + khmer + kimbundu + kannada + korea + konkani + kosrae + kpelle + kanuri + karatšai-balkaari + karjala + kru-kieli + kurukh + kašmiri + kurdi + kumykki + kutenai + komi + korni + kirgiisi + latina + ladino + lahnda + lamba + luxemburg + lezgi + ganda + limburg + lingala + lao + mongo + lozi + liettua + katanganluba + luluanluba + luiseño + lunda + luo + lusai + latvia + madura + magahi + maithili + makassar + mandingo + austronesialainen kieli + maasai + mokša + mandar + mende + malagassi + keski-iiri + marshall + maori + micmac + minangkabau + luokittelematon kieli + makedonia + mon-khmer-kieli + malajalam + mongoli + mantšu + manipuri + manobo-kieli + moldavia + mohawk + mossi + marathi + malaiji + malta + monia kieliä + mundakieli + creek + mirandeesi + marwari + burma + maya-kieli + ersä + nauru + nahuatl + pohjoisamerikkalainen intiaanikieli + napoli + norjan bokmål + pohjois-ndebele + alasaksa + nepali + newari + ndonga + nias + nigeriläis-kongolainen kieli + niue + hollanti + flaami + norjan nynorsk + norja + nogai + muinaisnorja + n’ko + etelä-ndebele + pohjoissotho + nubialainen kieli + navajo + klassinen newari + njandža + nyamwezi + nyankole + nyoro + nzima + oksitaani + odžibwa + oromo + orija + osseetti + osage + osmani + otomi-kieli + pandžabi + papualaiskieli + pangasinan + pahlavi + pampanga + papiamentu + palau + muinaispersia + filippiiniläinen kieli + foinikia + paali + puola + pohnpei + prakrit-kieli + muinaisprovensaali + paštu + portugali + brasilianportugali + portugalinportugali + ketšua + radžastani + rapanui + rarotonga + retoromaani + rundi + romania + romaaninen kieli + romani + juuri + venäjä + aromania + ruanda + sanskrit + sandawe + jakuutti + eteläamerikkalainen intiaanikieli + sališilainen kieli + samarianaramea + sasak + santali + sardi + sisilia + skotti + sindhi + pohjoissaame + selkuppi + seemiläinen kieli + sango + muinaisiiri + viittomakieli + serbokroaatti + shan + sinhali + sidamo + sioux-kieli + sinotiibetiläinen kieli + slovakki + sloveeni + slaavilainen kieli + samoa + eteläsaame + saamelaiskieli + luulajansaame + inarinsaame + koltansaame + šona + soninke + somali + sogdi + songhai + albania + serbia + sranan + serer + swazi + niililäis-saharalainen kieli + eteläsotho + sunda + sukuma + susu + sumeri + ruotsi + swahili + muinaissyyria + syyria + tamil + thaikieli + telugu + temne + tereno + tetum + tadžikki + thai + tigrinja + tigre + tiv + turkmeeni + tokelau + tagalog + klingon + tlingit + tamašek + tswana + tongantonga + malawintonga + tok-pisin + turkki + tsonga + tsimši + tataari + tumbuka + tupi-kieli + altailainen kieli + tuvalu + twi + tahiti + tuva + udmurtti + uiguuri + ugarit + ukraina + umbundu + määrittämätön + urdu + uzbekki + vai + venda + vietnam + volapük + vatja + valloni + wakash-kieli + walamo + waray + washo + sorbin kieli + wolof + kalmukki + xhosa + jao + japi + jiddiš + joruba + jupikkikieli + zhuang + sapoteekki + blisskieli + zenaga + kiina + yksinkertaistettu kiina + perinteinen kiina + zande + zulu + zuni + ei kielellistä sisältöä + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + maailma + Afrikka + Pohjois-Amerikka + Etelä-Amerikka + Oseania + Länsi-Afrikka + Väli-Amerikka + Itä-Afrikka + Pohjois-Afrikka + Keski-Afrikka + eteläinen Afrikka + Amerikka + pohjoinen Amerikka + Karibia + Itä-Aasia + Etelä-Aasia + Kaakkois-Aasia + Etelä-Eurooppa + Australia ja Uusi-Seelanti + Melanesia + Mikronesia + Polynesia + Etelä- ja Keski-Aasia + Aasia + Keski-Aasia + Länsi-Aasia + Eurooppa + Itä-Eurooppa + Pohjois-Eurooppa + Länsi-Eurooppa + Itsenäisten valtioiden yhteisö + Latinalainen Amerikka ja Karibia + Kanaalisaaret + Andorra + Arabiemiirikunnat + Afganistan + Antigua ja Barbuda + Anguilla + Albania + Armenia + Alankomaiden Antillit + Angola + Antarktis + Argentiina + Amerikan Samoa + Itävalta + Australia + Aruba + Ahvenanmaa + Azerbaidžan + Bosnia ja Hertsegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Saint-Barthélemy + Bermuda + Brunei + Bolivia + Brasilia + Bahama + Bhutan + Bouvet’nsaari + Botswana + Valko-Venäjä + Belize + Kanada + Kookossaaret + Kongo-Kinshasa + Keski-Afrikan tasavalta + Kongo-Brazzaville + Sveitsi + Norsunluurannikko + Cookinsaaret + Chile + Kamerun + Kiina + Kolumbia + Costa Rica + Serbia ja Montenegro + Kuuba + Kap Verde + Joulusaari + Kypros + Tšekki + Saksa + Djibouti + Tanska + Dominica + Dominikaaninen tasavalta + Algeria + Ecuador + Viro + Egypti + Länsi-Sahara + Eritrea + Espanja + Etiopia + Suomi + Fidži + Falklandinsaaret + Mikronesian liittovaltio + Färsaaret + Ranska + Gabon + Britannia + Grenada + Georgia + Ranskan Guayana + Guernsey + Ghana + Gibraltar + Grönlanti + Gambia + Guinea + Guadeloupe + Päiväntasaajan Guinea + Kreikka + Etelä-Georgia ja Eteläiset Sandwichsaaret + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong – Kiinan erityishallintoalue + Heard- ja McDonaldinsaaret + Honduras + Kroatia + Haiti + Unkari + Indonesia + Irlanti + Israel + Mansaari + Intia + Brittiläinen Intian valtameren alue + Irak + Iran + Islanti + Italia + Jersey + Jamaika + Jordania + Japani + Kenia + Kirgisia + Kambodža + Kiribati + Komorit + Saint Kitts ja Nevis + Pohjois-Korea + Etelä-Korea + Kuwait + Caymansaaret + Kazakstan + Laos + Libanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Liettua + Luxemburg + Latvia + Libya + Marokko + Monaco + Moldova + Montenegro + Saint-Martin + Madagaskar + Marshallinsaaret + Makedonia + Mali + Myanmar + Mongolia + Macao – Kiinan erityishallintoalue + Pohjois-Mariaanit + Martinique + Mauritania + Montserrat + Malta + Mauritius + Malediivit + Malawi + Meksiko + Malesia + Mosambik + Namibia + Uusi-Kaledonia + Niger + Norfolkinsaari + Nigeria + Nicaragua + Alankomaat + Norja + Nepal + Nauru + Niue + Uusi-Seelanti + Oman + Panama + Peru + Ranskan Polynesia + Papua-Uusi-Guinea + Filippiinit + Pakistan + Puola + Saint-Pierre ja Miquelon + Pitcairn + Puerto Rico + Palestiina + Portugali + Palau + Paraguay + Qatar + ulkomeri + Euroopan unioni + Réunion + Romania + Serbia + Venäjä + Ruanda + Saudi-Arabia + Salomonsaaret + Seychellit + Sudan + Ruotsi + Singapore + Saint Helena + Slovenia + Huippuvuoret ja Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Surinam + São Tomé ja Príncipe + El Salvador + Syyria + Swazimaa + Turks- ja Caicossaaret + Tšad + Ranskan ulkopuoliset eteläiset alueet + Togo + Thaimaa + Tadžikistan + Tokelau + Itä-Timor + Turkmenistan + Tunisia + Tonga + Turkki + Trinidad ja Tobago + Tuvalu + Taiwan + Tansania + Ukraina + Uganda + Yhdysvaltain pienet erillissaaret + Yhdysvallat + Uruguay + Uzbekistan + Vatikaani + Saint Vincent ja Grenadiinit + Venezuela + Brittiläiset Neitsytsaaret + Yhdysvaltain Neitsytsaaret + Vietnam + Vanuatu + Wallis ja Futuna + Samoa + Jemen + Mayotte + Etelä-Afrikka + Sambia + Zimbabwe + tuntematon tai virheellinen alue + + + saksan perinteinen oikeinkirjoitus + sloveenin resian murteen yhdenmukaistettu oikeinkirjoitus + saksan uusi oikeinkirjoitus + myöhäiskeskiranska + varhaisnykyranska + valkovenäjän virallinen oikeinkirjoitus + itäarmenialainen + länsiarmenialainen + yhtenäistetty turkkilainen latinalainen aakkosto + sloveenin resian San Giorgion/Bilan alamurre + englannin boontling-murre + kansainvälinen foneettinen aakkosto IPA + uralilainen foneettinen aakkosto UPA + kornin yleiskirjoitus + sloveenin resian Lipovazin/Lipovecin alamurre + monotoninen kreikka + sloveenin natisonen murre + sloveenin resian Gnivan/Njivan alamurre + sloveenin resian Oseaccon/Osojanen alamurre + kiinan pinyin-latinaistus + polytoninen kreikka + tietokonemäärittely POSIX + uudistettu oikeinkirjoitus + sloveenin resian murre + afarin saho-murre + skotlanninenglanti + englannin scouse-murre + sloveenin resian Stolvizzan/Solbican alamurre + valkovenäjän taraškevitsa-oikeinkirjoitus + kornin yhtenäiskirjoitus + kornin uusittu yhtenäiskirjoitus + katalaanin valencian murre + kiinan Wade-Giles-latinaistus + + + kalenteri + lajittelu + valuutta + + + perinteinen kiinalainen järjestys Big5 + buddhalainen kalenteri + kiinalainen kalenteri + suora järjestys + yksinkertaistettu kiinalainen järjestys GB2312 + gregoriaaninen kalenteri + juutalainen kalenteri + intialainen kalenteri + islamilainen kalenteri + islamilainen siviilikalenteri + japanilainen kalenteri + puhelinluettelojärjestys + pinyin-järjestys + kiinan tasavallan kalenteri 1912–1949 + piirtojärjestys + perinteinen järjestys + + + amerikkalainen + metrinen + + + kieli: {0} + kirjoitusjärjestelmä: {0} + alue: {0} + + + + lowercase-words + + + [a-s š t-z ž å ä ö] + [á à â ã č ç đ é è ë ǧ ǥ ȟ í ï ǩ ń ñ ŋ ô õ œ ř ŧ ú ü ʒ ǯ æ ø] + [a-z] + + + ” + ” + ’ + ’ + + + {0}–{1} + + + + + + tammikuuta + helmikuuta + maaliskuuta + huhtikuuta + toukokuuta + kesäkuuta + heinäkuuta + elokuuta + syyskuuta + lokakuuta + marraskuuta + joulukuuta + + + tammikuuta + helmikuuta + maaliskuuta + huhtikuuta + toukokuuta + kesäkuuta + heinäkuuta + elokuuta + syyskuuta + lokakuuta + marraskuuta + joulukuuta + + + + + tammi + helmi + maalis + huhti + touko + kesä + heinä + elo + syys + loka + marras + joulu + + + T + H + M + H + T + K + H + E + S + L + M + J + + + tammikuu + helmikuu + maaliskuu + huhtikuu + toukokuu + kesäkuu + heinäkuu + elokuu + syyskuu + lokakuu + marraskuu + joulukuu + + + + + + + su + ma + ti + ke + to + pe + la + + + sunnuntaina + maanantaina + tiistaina + keskiviikkona + torstaina + perjantaina + lauantaina + + + + + S + M + T + K + T + P + L + + + sunnuntai + maanantai + tiistai + keskiviikko + torstai + perjantai + lauantai + + + + + + + 1. nelj. + 2. nelj. + 3. nelj. + 4. nelj. + + + 1. neljännes + 2. neljännes + 3. neljännes + 4. neljännes + + + + + 1 + 2 + 3 + 4 + + + + ap. + ip. + + + ennen Kristuksen syntymää + jälkeen Kristuksen syntymän + + + eKr. + jKr. + + + + + + EEEE d. MMMM y + + + + + d. MMMM y + + + + + d.M.yyyy + + + + + d.M.yyyy + + + + + + + H.mm.ss zzzz + + + + + H.mm.ss z + + + + + H.mm.ss + + + + + H.mm + + + + + + EEE d. + HH.mm.ss + H.mm + L + E d.M. + LLL + E d. MMM + E d. MMMM + d. MMMM + d. MMM + d.M. + d + h.mm a + h.mm.ss a + mm.ss + y + L.yyyy + EEE d.M.yyyy + LLL y + EEE d. MMM y + LLLL y + cccc, d. MMMM y + Q/yyyy + QQQ y + M/yy + MMM yy + Q/yy + M/yyyy + EEE d.M.yyyy + LLLL y + QQQQ y + + + {0}–{1} + + L.–L. + + + E d.M. – E d.M. + E d. – E d.M + + + LLL–LLLL + + + E d. MMMM – E d. MMMM + E d. – E d. MMMM + + + LLL–LLLL + + + d. MMMM – d. MMMM + d.–d. MMMM + + + d.M.–d.M. + d.–d.M. + + + d.–d. + + + H–H + H–H + + + H.mm–H.mm + H.mm–H.mm + H.mm–H.mm + + + H.mm–H.mm v + H.mm–H.mm v + H.mm–H.mm v + + + H–H v + H–H v + + + y–y + + + LLL–LLLL y + LLLL y – LLLL y + + + E d.M.yyyy – E d.M.yyyy + E d.M.yyyy – E d.M.yyyy + E d.M.yyyy – E d.M.yyyy + + + LLL–LLLL y + LLLL y – LLLL y + + + E d. MMMM – E d. MMMM y + E d. – E d. MMMM y + E d. MMMM y – E d. MMMM y + + + LLL–LLLL y + LLLL y – LLLL y + + + d. MMMM – d. MMMM y + d.–d. MMMM y + d. MMMM y – d. MMMM y + + + d.M.–d.M.yyyy + d.–d.M.yyyy + d.M.yyyy–d.M.yyyy + + + + + + aikakausi + + + vuosi + + + kuukausi + + + viikko + + + päivä + toissapäivänä + eilen + tänään + huomenna + ylihuomenna + + + viikonpäivä + + + ap/ip + + + tunti + + + minuutti + + + sekunti + + + aikavyöhyke + + + + + + + + tišrí + hešván + kislév + tevét + ševát + adár + adár II + nisán + ijjár + siván + tammúz + ab + elúl + + + tišríkuu + hešvánkuu + kislévkuu + tevétkuu + ševátkuu + adárkuu + adárkuu II + nisánkuu + ijjárkuu + sivánkuu + tammúzkuu + abkuu + elúlkuu + + + + + + + + + muharram + safar + rabi’ al-awwal + rabi’ al-akhir + džumada-l-ula + džumada-l-akhira + radžab + ša’ban + ramadan + šawwal + dhu-l-qa’da + dhu-l-hiddža + + + + + + + +H.mm;-H.mm + UTC{0} + UTC + {0} + {1} ({0}) + + tuntematon + + + Tirana + + + Jerevan + + + Etelänapa + + + Wien + + + Maarianhamina + + + Bryssel + + + São Paulo + + + St. Johns + + + Zürich + + + Pääsiäissaari + + + Havanna + + + Kap Verde + + + Joulu + + + Nikosia + + + Berliini + + + Kööpenhamina + + + Alger + + + Tallinna + + + Kairo + + + Kanariansaaret + + + Fidzi + + + Färsaaret + + + Pariisi + + + Lontoo + + + Qaanaaq + + + Nuuk + + + Ittoqqortoormiit + + + Ateena + + + Etelä-Georgia + + + Hongkong + + + Mansaari + + + Teheran + + + Rooma + + + Jamaika + + + Tokio + + + Komorit + + + Saint Kitts + + + Aqtöbe + + + Saint Lucia + + + Vilna + + + Luxemburg + + + Riika + + + Macao + + + Malediivit + + + Ciudad de México + + + Cancún + + + Niuesaari + + + Varsova + + + Azorit + + + Lissabon + + + Bukarest + + + Belgrad + + + Moskova + + + Jekaterinburg + + + Krasnojarsk + + + Jakutsk + + + Sahalin + + + Kamtšatka + + + Tukholma + + + San Salvador + + + Damaskos + + + Dušanbe + + + Užgorod + + + Kiova + + + Zaporižžja + + + keskinen Pohjois-Dakota + + + Taškent + + + Vatikaani + + + Saint Vincent + + + Saint Thomas + + + + Keski-Afrikan aika + + + + + Itä-Afrikan aika + + + + + Etelä-Afrikan aika + Etelä-Afrikan normaaliaika + + + + + Länsi-Afrikan aika + Länsi-Afrikan kesäaika + + + + + Alaskan normaaliaika + Alaskan kesäaika + + + + + Amazonin aika + Amazonin kesäaika + + + + + Yhdysvaltain keskinen aika + Yhdysvaltain keskinen normaaliaika + Yhdysvaltain keskinen kesäaika + + + CT + CST + CDT + + + + + Yhdysvaltain itäinen aika + Yhdysvaltain itäinen normaaliaika + Yhdysvaltain itäinen kesäaika + + + ET + EST + EDT + + + + + Kalliovuorten aika + Kalliovuorten normaaliaika + Kalliovuorten kesäaika + + + MT + MST + MDT + + + + + Yhdysvaltain Tyynenmeren aika + Yhdysvaltain Tyynenmeren normaaliaika + Yhdysvaltain Tyynenmeren kesäaika + + + PT + PST + PDT + + + + + Saudi-Arabian aika + Saudi-Arabian normaaliaika + Saudi-Arabian kesäaika + + + AT (SA) + + + + + Armenian aika + + + + + Ašgabatin aika + Ašgabatin kesäaika + + + + + Kanadan Atlantin aika + Kanadan Atlantin normaaliaika + Kanadan Atlantin kesäaika + + + AT + AST + ADT + + + + + Keski-Australian aika + Keski-Australian kesäaika + + + ACT + + + + + Läntisen Keski-Australian aika + Läntisen Keski-Australian normaaliaika + Läntisen Keski-Australian kesäaika + + + ACWT + + + + + Itä-Australian aika + Itä-Australian normaaliaika + Itä-Australian kesäaika + + + + + Länsi-Australian normaaliaika + Länsi-Australian kesäaika + + + AWT + + + + + Azerbaidžanin aika + Azerbaidžanin kesäaika + + + + + Azorien aika + Azorien kesäaika + + + + + Bakun kesäaika + + + + + Bangladeshin aika + + + + + Bhutanin aika + + + + + Borneon aika + Borneon kesäaika + + + + + Brunein aika + + + + + Kap Verden aika + Kap Verden kesäaika + + + + + Kiinan aika + Kiinan normaaliaika + Kiinan kesäaika + + + CT + CST (Kiina) + CDT (Kiina) + + + + + Tšoibalsan kesäaika + + + + + Joulusaaren aika + + + + + Kookossaarten aika + + + + + Keski-Euroopan normaaliaika + Keski-Euroopan kesäaika + + + CET + CEST + + + + + Itä-Euroopan normaaliaika + Itä-Euroopan kesäaika + + + EET + EEST + + + + + Länsi-Euroopan aika + Länsi-Euroopan kesäaika + + + WET + WEST + + + + + Falklandinsaarten kesäaika + + + + + Ranskan eteläisten ja antarktisten alueiden aika + + + + + Biškekin aika + Biškekin kesäaika + + + + + Greenwichin normaaliaika + + + GMT + + + + + Georgian aika + Georgian kesäaika + + + + + Arabiemiirikuntien normaaliaika + + + GT + + + + + Hongkongin aika + Hongkongin kesäaika + + + + + Hovdin kesäaika + + + + + Intian normaaliaika + + + + + In + + + + + Keski-Indonesian aika + + + + + Itä-Indonesian aika + + + + + Länsi-Indonesian aika + + + + + Israelin normaaliaika + Israelin kesäaika + + + IST (Israel) + + + + + Japanin normaaliaika + Japanin kesäaika + + + + + Karachin aika + + + + + Korean aika + Korean normaaliaika + + + KT + + + + + Krasnojarskin aika + Krasnojarskin kesäaika + + + + + Kuybyshevin aika + Kuybyshevin kesäaika + + + + + Sri Lankan aika + + + + + Lord Howen aika + Lord Howen normaaliaika + Lord Howen kesäaika + + + LHT + + + + + Macaon kesäaika + + + + + Malaijan aika + + + + + Malediivien aika + + + + + Mauritiuksen aika + + + + + Ulan Batorin kesäaika + + + + + Moskovan aika + Moskovan normaaliaika + Moskovan kesäaika + + + + + Myanmarin aikaMa + + + + + Nepalin aika + + + + + Uuden-Seelannin normaaliaika + + + NZT + + + + + Newfoundlandin normaaliaika + Newfoundlandin kesäaika + + + + + Novosibirskin aika + Novosibirskin kesäaika + + + + + Omskin aika + Omskin kesäaika + + + + + Pakistanin aika + Pakistanin kesäaika + + + + + Filippiinien aika + Filippiinien kesäaika + + + + + Sahalinin aika + + + + + Samaran aika + Samaran kesäaika + + + + + Etelä-Georgian aika + + + + + Tadžikistanin aika + + + + + Taškentin aika + Taškentin kesäaika + + + + + Tbilisin aika + + + + + Turkin kesäaika + + + + + Turkmenistanin aika + Turkmenistanin kesäaika + + + + + Oralin aika + Oralin kesäaika + + + + + Ürümqin aika + + + + + Uzbekistanin aika + Uzbekistanin kesäaika + + + + + Vladivostokin aika + + + + + Volgogradin aika + Volgogradin kesäaika + + + + + Jakutskin aika + Jakutskin kesäaika + + + + + Jekaterinburgin aika + Jekaterinburgin kesäaika + + + + + Jerevanin aika + Jerevanin kesäaika + + + + + + + , +   + ; + % + 0 + # + + + - + E + ‰ + ∞ + epäluku + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + Andorran peseta + Andorran peseta + Andorran pesetaa + + + Arabiemiirikuntien dirhami + Arabiemiirikuntien dirhami + Arabiemiirikuntien dirhamia + + + Afganistanin afgaani (1927–2002) + Afganistanin afgaani (1927-2002) + Afganistanin afgaania (1927-2002) + + + Afganistanin afgaani + Afganistanin afgaani + Afganistanin afgaania + AFN + + + Albanian lek + Albanian lek + Albanian lekiä + + + Armenian dram + Armenian dram + Armenian dramia + + + Alankomaiden Antillien guldeni + Alankomaiden Antillien guldeni + Alankomaiden Antillien guldenia + ANG + + + Angolan kwanza + Angolan kwanza + Angolan kwanzaa + AOA + + + Angolan kwanza (1977–1990) + Angolan kwanza (1977–1990) + Angolan kwanzaa (1977–1990) + + + Angolan uusi kwanza (1990–2000) + Angolan uusi kwanza (1990–2000) + Angolan uutta kwanzaa (1990–2000) + + + Angolan kwanza reajustado (1995–1999) + Angolan kwanza reajustado (1995–1999) + Angolan kwanza reajustadoa (1995–1999) + + + Argentiinan austral + Argentiinan austral + Argentiinan australia + ARA + + + ARL + + + ARM + + + Argentiinan peso (1983–1985) + Argentiinan peso (1983–1985) + Argentiinan pesoa (1983–1985) + + + Argentiinan peso + Argentiinan peso + Argentiinan pesoa + ARS + + + Itävallan šillinki + Itävallan šillinki + Itävallan šillinkiä + + + Australian dollari + Australian dollari + Australian dollaria + AUD + + + Aruban guldeni + Aruban guldeni + Aruban guldenia + AWG + + + Azerbaidžanin manat (1993–2006) + Azerbaidžanin manat (1993–2006) + Azerbaidžanin manatia (1993–2006) + + + Azerbaidžanin manat + Azerbaidžanin manat + Azerbaidžanin manatia + AZN + + + Bosnia-Hertsegovinan dinaari + Bosnia-Hertsegovinan dinaari + Bosnia-Hertsegovinan dinaaria + + + Bosnia-Hertsegovinan vaihdettava markka + Bosnia-Hertsegovinan vaihdettava markka + Bosnia-Hertsegovinan vaihdettavaa markkaa + BAM + + + Barbadosin dollari + Barbadosin dollari + Barbadosin dollaria + BBD + + + Bangladeshin taka + Bangladeshin taka + Bangladeshin takaa + BDT + + + Belgian vaihdettava frangi + Belgian vaihdettava frangi + Belgian vaihdettavaa frangia + + + Belgian frangi + Belgian frangi + Belgian frangia + BEF + + + Belgian rahoitusfrangi + Belgian rahoitusfrangi + Belgian rahoitusfrangia + + + Bulgarian kova lev + Bulgarian kova lev + Bulgarian kovaa levaa + + + Bulgarian uusi lev + Bulgarian uusi lev + Bulgarian uutta levaa + + + Bahrainin dinaari + Bahrainin dinaari + Bahrainin dinaaria + BHD + + + Burundin frangi + Burundin frangi + Burundin frangia + BIF + + + Bermudan dollari + Bermudan dollari + Bermudan dollaria + BMD + + + Brunein dollari + Brunein dollari + Brunein dollaria + BND + + + Bolivian boliviano + Bolivian boliviano + Bolivian bolivianoa + BOB + + + Bolivian peso + Bolivian peso + Bolivian pesoa + BOP + + + Bolivian mvdol + Bolivian mvdol + Bolivian mvdol'ia + + + Brasilian uusi cruzeiro (1967–1986) + Brasilian uusi cruzeiro (1967–1986) + Brasilian uutta cruzeiroa (1967–1986) + BRB + + + Brasilian cruzado + Brasilian cruzado + Brasilian cruzadoa + BRC + + + Brasilian cruzeiro (1990–1993) + Brasilian cruzeiro (1990–1993) + Brasilian cruzeiroa (1990–1993) + BRE + + + Brasilian real + Brasilian real + Brasilian realia + BRL + + + Brasilian uusi cruzado + Brasilian uusi cruzado + Brasilian uutta cruzadoa + BRN + + + Brasilian cruzeiro + Brasilian cruzeiro + Brasilian cruzeiroa + BRR + + + BRZ + + + Bahaman dollari + Bahaman dollari + Bahaman dollaria + BSD + + + Bhutanin ngultrum + Bhutanin ngultrum + Bhutanin ngultrumia + BTN + + + Burman kyat + Burman kyat + Burman kyatia + + + Botswanan pula + Botswanan pula + Botswanan pulaa + + + Valko-Venäjän uusi rupla (1994–1999) + Valko-Venäjän uusi rupla (1994–1999) + Valko-Venäjän uutta ruplaa (1994–1999) + + + Valko-Venäjän rupla + Valko-Venäjän rupla + Valko-Venäjän ruplaa + + + Belizen dollari + Belizen dollari + Belizen dollaria + BZD + + + Kanadan dollari + Kanadan dollari + Kanadan dollaria + CAD + + + Kongon frangi + Kongon frangi + Kongon frangia + + + Sveitsin WIR-euro + Sveitsin WIR-euro + Sveitsin WIR-euroa + + + Sveitsin frangi + Sveitsin frangi + Sveitsin frangia + CHF + + + Sveitsin WIR-frangi + Sveitsin WIR-frangi + Sveitsin WIR-frangia + + + CLE + + + Chilen unidades de fomento + Chilen unidades de fomento + Chilen unidades de fomentoa + + + Chilen peso + Chilen peso + Chilen pesoa + CLP + + + Kiinan yuan + Kiinan yuan + Kiinan yuania + CNY + + + Kolumbian peso + Kolumbian peso + Kolumbian pesoa + COP + + + Kolumbian unidad de valor real + Kolumbian unidad de valor real + Kolumbian unidad de valor realia + + + Costa Rican colon + Costa Rican colon + Costa Rican colonia + CRC + + + Serbian vanha dinaari + Serbian vanha dinaari + Serbian vanhaa dinaaria + + + Tšekkoslovakian kova koruna + Tšekkoslovakian kova koruna + Tšekkoslovakian kovaa korunaa + + + CUC + + + Kuuban peso + Kuuban peso + Kuuban pesoa + CUP + + + Kap Verden escudo + Kap Verden escudo + Kap Verden escudoa + CVE + + + Kyproksen punta + Kyproksen punta + Kyproksen puntaa + CYP + + + Tšekin koruna + Tšekin koruna + Tšekin korunaa + CZK + + + Itä-Saksan markka + Itä-Saksan markka + Itä-Saksan markkaa + + + Saksan markka + Saksan markka + Saksan markkaa + DEM + + + Djiboutin frangi + Djiboutin frangi + Djiboutin frangia + DJF + + + Tanskan kruunu + Tanskan kruunu + Tanskan kruunua + Tkr + + + Dominikaanisen tasavallan peso + Dominikaanisen tasavallan peso + Dominikaanisen tasavallan pesoa + DOP + + + Algerian dinaari + Algerian dinaari + Algerian dinaaria + DZD + + + Ecuadorin sucre + Ecuadorin sucre + Ecuadorin sucrea + + + Ecuadorin UVC + Ecuadorin UVC + Ecuadorin UVC'ta + + + Viron kruunu + Viron kruunu + Viron kruunua + EEK + + + Egyptin punta + Egyptin punta + Egyptin puntaa + EGP + + + Eritrean nakfa + Eritrean nakfa + Eritrean nakfaa + ERN + + + Espanjan peseta (A-tili) + Espanjan peseta (A-tili) + Espanjan pesetaa (A-tili) + + + Espanjan peseta (vaihdettava tili) + Espanjan peseta (vaihdettava tili) + Espanjan pesetaa (vaihdettava tili) + + + Espanjan peseta + Espanjan peseta + Espanjan pesetaa + ESP + + + Etiopian birr + Etiopian birr + Etiopian birriä + ETB + + + euro + euro + euroa + + + Suomen markka + Suomen markka + Suomen markkaa + + + Fidžin dollari + Fidžin dollari + Fidžin dollaria + FJD + + + Falklandinsaarten punta + Falklandinsaarten punta + Falklandinsaarten puntaa + FKP + + + Ranskan frangi + Ranskan frangi + Ranskan frangia + FRF + + + Englannin punta + Englannin punta + Englannin puntaa + + + Georgian kuponkilari + Georgian kuponkilari + Georgian kuponkilaria + + + Georgian lari + Georgian lari + Georgian laria + + + Ghanan cedi (1979–2007) + Ghanan cedi (1979–2007) + Ghanan cediä (1979–2007) + GHC + + + Ghanan cedi + Ghanan cedi + Ghanan cediä + GHS + + + Gibraltarin punta + Gibraltarin punta + Gibraltarin puntaa + GIP + + + Gambian dalasi + Gambian dalasi + Gambian dalasia + + + Guinean frangi + Guinean frangi + Guinean frangia + GNF + + + Guinean syli + Guinean syli + Guinean syliä + + + Päiväntasaajan Guinean ekwele (–1986) + Päiväntasaajan Guinean ekwele (–1986) + Päiväntasaajan Guinean ekweleä (–1986) + + + Kreikan drakma + Kreikan drakma + Kreikan drakmaa + GRD + + + Guatemalan quetzal + Guatemalan quetzal + Guatemalan quetzalia + + + Portugalin Guinean escudo + Portugalin Guinean escudo + Portugalin Guinean escudoa + + + Guinea-Bissaun peso + Guinea-Bissaun peso + Guinea-Bissaun pesoa + + + Guyanan dollari + Guyanan dollari + Guyanan dollaria + GYD + + + Hongkongin dollari + Hongkongin dollari + Hongkongin dollaria + HKD + + + Hondurasin lempira + Hondurasin lempira + Hondurasin lempiraa + + + Kroatian dinaari + Kroatian dinaari + Kroatian dinaaria + + + Kroatian kuna + Kroatian kuna + Kroatian kunaa + HRK + + + Haitin gourde + Haitin gourde + Haitin gourdea + + + Unkarin forintti + Unkarin forintti + Unkarin forinttia + HUF + + + Indonesian rupia + Indonesian rupia + Indonesian rupiaa + IDR + + + Irlannin punta + Irlannin punta + Irlannin puntaa + IEP + + + Israelin punta + Israelin punta + Israelin puntaa + ILP + + + Israelin vanha sekeli + Israelin vanha sekeli + Israelin vanhaa sekeliä + + + Israelin uusi sekeli + Israelin uusi sekeli + Israelin uutta sekeliä + ILS + + + Intian rupia + Intian rupia + Intian rupiaa + INR + + + Irakin dinaari + Irakin dinaari + Irakin dinaaria + + + Iranin rial + Iranin rial + Iranin rialia + + + Islannin vanha kruunu + Islannin vanha kruunu + Islannin vanhaa kruunua + + + Islannin kruunu + Islannin kruunu + Islannin kruunua + ISK + + + Italian liira + Italian liira + Italian liiraa + ITL + + + Jamaikan dollari + Jamaikan dollari + Jamaikan dollaria + JMD + + + Jordanian dinaari + Jordanian dinaari + Jordanian dinaaria + JOD + + + Japanin jeni + Japanin jeni + Japanin jeniä + ¥ + + + Kenian šillinki + Kenian šillinki + Kenian šillinkiä + KES + + + Kirgisian som + Kirgisian som + Kirgisian somia + + + Kambodžan riel + Kambodžan riel + Kambodžan rieliä + + + Komorien frangi + Komorien frangi + Komorien frangia + KMF + + + Pohjois-Korean won + Pohjois-Korean won + Pohjois-Korean wonia + KPW + + + Etelä-Korean won + Etelä-Korean won + Etelä-Korean wonia + KRW + + + Kuwaitin dinaari + Kuwaitin dinaari + Kuwaitin dinaaria + KWD + + + Caymansaarten dollari + Caymansaarten dollari + Caymansaarten dollaria + KYD + + + Kazakstanin tenge + Kazakstanin tenge + Kazakstanin tengeä + + + Laosin kip + Laosin kip + Laosin kipiä + LAK + + + Libanonin punta + Libanonin punta + Libanonin puntaa + LBP + + + Sri Lankan rupia + Sri Lankan rupia + Sri Lankan rupiaa + LKR + + + Liberian dollari + Liberian dollari + Liberian dollaria + LRD + + + Lesothon loti + Lesothon loti + Lesothon lotia + + + Liettuan liti + Liettuan liti + Liettuan litiä + LTL + + + Liettuan talonas + Liettuan talonas + Liettuan talonasia + + + Luxemburgin vaihdettava frangi + Luxemburgin vaihdettava frangi + Luxemburgin vaihdettavaa frangia + + + Luxemburgin frangi + Luxemburgin frangi + Luxemburgin frangia + + + Luxemburgin rahoitusfrangi + Luxemburgin rahoitusfrangi + Luxemburgin rahoitusfrangia + + + Latvian lati + Latvian lati + Latvian latia + LVL + + + Latvian rupla + Latvian rupla + Latvian ruplaa + + + Libyan dinaari + Libyan dinaari + Libyan dinaaria + LYD + + + Marokon dirhami + Marokon dirhami + Marokon dirhamia + + + Marokon frangi + Marokon frangi + Marokon frangia + + + Moldovan leu + Moldovan leu + Moldovan leuta + + + Madagaskarin ariary + Madagaskarin ariary + Madagaskarin ariarya + + + Madagaskarin frangi + Madagaskarin frangi + Madagaskarin frangia + + + Makedonian dinaari + Makedonian dinaari + Makedonian dinaaria + + + Malin frangi + Malin frangi + Malin frangia + + + Myanmarin kyat + Myanmarin kyat + Myanmarin kyatia + + + Mongolian tugrik + Mongolian tugrik + Mongolian tugrikia + MNT + + + Macaon pataca + Macaon pataca + Macaon patacaa + MOP + + + Mauritanian ouguiya + Mauritanian ouguiya + Mauritanian ouguiyaa + MRO + + + Maltan liira + Maltan liira + Maltan liiraa + MTL + + + Maltan punta + Maltan punta + Maltan puntaa + MTP + + + Mauritiuksen rupia + Mauritiuksen rupia + Mauritiuksen rupiaa + MUR + + + Malediivien rufiyaa + Malediivien rufiyaa + Malediivien rufiyaata + MVR + + + Malawin kwacha + Malawin kwacha + Malawin kwachaa + MWK + + + Meksikon peso + Meksikon peso + Meksikon pesoa + + + Meksikon hopeapeso (1861–1992) + Meksikon hopeapeso (1861–1992) + Meksikon hopeapesoa (1861–1992) + MXP + + + Meksikon UDI + Meksikon UDI + Meksikon UDI'ta + + + Malesian ringgit + Malesian ringgit + Malesian ringgitiä + MYR + + + Mosambikin escudo + Mosambikin escudo + Mosambikin escudoa + + + Mosambikin metical (1980–2006) + Mosambikin metical (1980–2006) + Mosambikin meticalia (1980–2006) + MZM + + + Mosambikin metical + Mosambikin metical + Mosambikin meticalia + MZN + + + Namibian dollari + Namibian dollari + Namibian dollaria + NAD + + + Nigerian naira + Nigerian naira + Nigerian nairaa + NGN + + + Nicaraguan cordoba + Nicaraguan cordoba + Nicaraguan cordobaa + + + Nicaraguan kultacordoba + Nicaraguan kultacordoba + Nicaraguan kultacordobaa + NIO + + + Alankomaiden guldeni + Alankomaiden guldeni + Alankomaiden guldenia + NLG + + + Norjan kruunu + Norjan kruunu + Norjan kruunua + + + Nepalin rupia + Nepalin rupia + Nepalin rupiaa + NPR + + + Uuden-Seelannin dollari + Uuden-Seelannin dollari + Uuden-Seelannin dollaria + NZD + + + Omanin rial + Omanin rial + Omanin rialia + + + Panaman balboa + Panaman balboa + Panaman balboaa + PAB + + + Perun inti + Perun inti + Perun intiä + PEI + + + Perun uusi sol + Perun uusi sol + Perun uutta solia + PEN + + + Perun sol + Perun sol + Perun solia + + + Papua-Uuden-Guinean kina + Papua-Uuden-Guinean kina + Papua-Uuden-Guinean kinaa + + + Filippiinien peso + Filippiinien peso + Filippiinien pesoa + PHP + + + Pakistanin rupia + Pakistanin rupia + Pakistanin rupiaa + PKR + + + Puolan zloty + Puolan zloty + Puolan zlotya + PLN + + + Puolan zloty (1950–1995) + Puolan zloty (1950–1995) + Puolan zlotya (1950–1995) + + + Portugalin escudo + Portugalin escudo + Portugalin escudoa + PTE + + + Paraguayn guarani + Paraguayn guarani + Paraguayn guarania + PYG + + + Qatarin rial + Qatarin rial + Qatarin rialia + QAR + + + Rhodesian dollari + Rhodesian dollari + Rhodesian dollaria + RHD + + + Romanian vanha leu + Romanian vanha leu + Romanian vanhaa leuta + + + Romanian uusi leu + Romanian uusi leu + Romanian uutta leuta + + + Serbian dinaari + Serbian dinaari + Serbian dinaaria + RSD + + + Venäjän rupla + Venäjän rupla + Venäjän ruplaa + + + Venäjän rupla (1991–1998) + Venäjän rupla (1991–1998) + Venäjän ruplaa (1991–1998) + + + Ruandan frangi + Ruandan frangi + Ruandan frangia + RWF + + + Saudi-Arabian rial + Saudi-Arabian rial + Saudi-Arabian rialia + SAR + + + Salomonsaarten dollari + Salomonsaarten dollari + Salomonsaarten dollaria + SBD + + + Seychellien rupia + Seychellien rupia + Seychellien rupiaa + SCR + + + Sudanin dinaari + Sudanin dinaari + Sudanin dinaaria + SDD + + + Sudanin punta + Sudanin punta + Sudanin puntaa + + + Sudanin punta (1957–1999) + Sudanin punta (1957–1999) + Sudanin puntaa (1957–1999) + + + Ruotsin kruunu + Ruotsin kruunu + Ruotsin kruunua + Rkr + + + Singaporen dollari + Singaporen dollari + Singaporen dollaria + SGD + + + Saint Helenan punta + Saint Helenan punta + Saint Helenan puntaa + SHP + + + Slovenian tolar + Slovenian tolar + Slovenian tolaria + + + Slovakian koruna + Slovakian koruna + Slovakian korunaa + SKK + + + Sierra Leonen leone + Sierra Leonen leone + Sierra Leonen leonea + SLL + + + Somalian šillinki + Somalian šillinki + Somalian šillinkiä + SOS + + + Surinamin dollari + Surinamin dollari + Surinamin dollaria + SRD + + + Surinamin guldeni + Surinamin guldeni + Surinamin guldenia + SRG + + + São Tomén ja Príncipen dobra + São Tomén ja Príncipen dobra + São Tomén ja Príncipen dobraa + STD + + + Neuvostoliiton rupla + Neuvostoliiton rupla + Neuvostoliiton ruplaa + + + El Salvadorin colon + El Salvadorin colon + El Salvadorin colonia + SVC + + + Syyrian punta + Syyrian punta + Syyrian puntaa + SYP + + + Swazimaan lilangeni + Swazimaan lilangeni + Swazimaan lilangenia + + + Thaimaan baht + Thaimaan baht + Thaimaan bahtia + THB + + + Tadžikistanin rupla + Tadžikistanin rupla + Tadžikistanin ruplaa + + + Tadžikistanin somoni + Tadžikistanin somoni + Tadžikistanin somonia + + + Turkmenistanin manat + Turkmenistanin manat + Turkmenistanin manatia + + + Turkmenistanin uusi manat + Turkmenistanin uusi manat + Turkmenistanin uutta manatia + + + Tunisian dinaari + Tunisian dinaari + Tunisian dinaaria + TND + + + Tongan pa’anga + Tongan pa’anga + Tongan pa’angaa + TOP + + + Timorin escudo + Timorin escudo + Timorin escudoa + + + Turkin vanha liira + Turkin vanha liira + Turkin vanhaa liiraa + + + Turkin liira + Turkin liira + Turkin liiraa + TRY + + + Trinidadin ja Tobagon dollari + Trinidadin ja Tobagon dollari + Trinidadin ja Tobagon dollaria + TTD + + + Taiwanin uusi dollari + Taiwanin uusi dollari + Taiwanin uutta dollaria + TWD + + + Tansanian šillinki + Tansanian šillinki + Tansanian šillinkiä + TZS + + + Ukrainan hryvnia + Ukrainan hryvnia + Ukrainan hryvniaa + UAH + + + Ukrainan karbovanetz + Ukrainan karbovanetz + Ukrainan karbovanetziä + + + Ugandan šillinki (1966–1987) + Ugandan šillinki (1966–1987) + Ugandan šillinkiä (1966–1987) + + + Ugandan šillinki + Ugandan šillinki + Ugandan šillinkiä + UGX + + + Yhdysvaltain dollari + Yhdysvaltain dollari + Yhdysvaltain dollaria + $ + + + Yhdysvaltain dollari (seuraava päivä) + Yhdysvaltain dollari (seuraava päivä) + Yhdysvaltain dollaria (seuraava päivä) + + + Yhdysvaltain dollari (sama päivä) + Yhdysvaltain dollari (sama päivä) + Yhdysvaltain dollaria (sama päivä) + + + Uruguayn peso en unidades indexadas + Uruguayn peso en unidades indexadas + Uruguayn pesoa en unidades indexadas + + + Uruguayn peso (1975–1993) + Uruguayn peso (1975–1993) + Uruguayn pesoa (1975–1993) + + + Uruguayn peso + Uruguayn peso + Uruguayn pesoa + UYU + + + Uzbekistanin som + Uzbekistanin som + Uzbekistanin somia + + + Venezuelan bolivar + Venezuelan bolivar + Venezuelan bolivaria + VEB + + + Venezuelan bolivar fuerte + Venezuelan bolivar fuerte + Venezuelan bolivar fuertea + VEF + + + Vietnamin dong + Vietnamin dong + Vietnamin dongia + VND + + + Vanuatun vatu + Vanuatun vatu + Vanuatun vatua + VUV + + + Samoan tala + Samoan tala + Samoan talaa + WST + + + CFA-frangi BEAC + CFA-frangi BEAC + CFA-frangia BEAC + XAF + + + hopea + hopeayksikkö + hopeayksikköä + + + kulta + kultayksikkö + kultayksikköä + + + EURCO + EURCO + EURCO'a + + + Euroopan rahayksikkö (EMU) + Euroopan rahayksikkö (EMU) + Euroopan rahayksikköä (EMU) + + + EUA (XBC) + EUA (XBC) + EUA'ta (XBC) + + + EUA (XBD) + EUA (XBD) + EUA'ta (XBD) + + + Itä-Karibian dollari + Itä-Karibian dollari + Itä-Karibian dollaria + + + erityisnosto-oikeus (SDR) + erityisnosto-oikeus (SDR) + erityisnosto-oikeutta (SDR) + + + Euroopan valuuttayksikkö (ECU) + Euroopan valuuttayksikkö (ECU) + Euroopan valuuttayksikköä (ECU) + + + Ranskan kultafrangi + Ranskan kultafrangi + Ranskan kultafrangia + + + Ranskan UIC-frangi + Ranskan UIC-frangi + Ranskan UIC-frangia + + + CFA-frangi BCEAO + CFA-frangi BCEAO + CFA-frangia BCEAO + + + palladium + palladiumyksikkö + palladiumyksikköä + + + CFP-frangi + CFP-frangi + CFP-frangia + + + platina + platinayksikkö + platinayksikköä + + + RINET-rahastot + RINET-rahastoyksikkö + RINET-rahastoyksikköä + + + testaustarkoitukseen varattu valuuttakoodi + testaustarkoitukseen varattu valuuttakoodi + testaustarkoitukseen varattua valuuttakoodia + + + tuntematon tai virheellinen rahayksikkö + tuntematon tai virheellinen rahayksikkö + tuntematonta tai virheellistä rahayksikköä + + + Jemenin dinaari + Jemenin dinaari + Jemenin dinaaria + + + Jemenin rial + Jemenin rial + Jemenin rialia + YER + + + Jugoslavian kova dinaari + Jugoslavian kova dinaari + Jugoslavian kovaa dinaaria + + + Jugoslavian uusi dinaari + Jugoslavian uusi dinaari + Jugoslavian uutta dinaaria + + + Jugoslavian vaihdettava dinaari + Jugoslavian vaihdettava dinaari + Jugoslavian vaihdettavaa dinaaria + + + Etelä-Afrikan rahoitusrandi + Etelä-Afrikan rahoitusrandi + Etelä-Afrikan rahoitusrandia + + + Etelä-Afrikan randi + Etelä-Afrikan randi + Etelä-Afrikan randia + ZAR + + + Sambian kwacha + Sambian kwacha + Sambian kwachaa + ZMK + + + Zairen uusi zaire + Zairen uusi zaire + Zairen uutta zairea + ZRN + + + Zairen zaire + Zairen zaire + Zairen zairea + + + Zimbabwen dollari + Zimbabwen dollari + Zimbabwen dollaria + ZWD + + + Zimbabwen dollari (2009) + Zimbabwen dollari (2009) + Zimbabwen dollaria (2009) + + + Zimbabwen dollari (2008) + Zimbabwen dollari (2008) + Zimbabwen dollaria (2008) + + + + + + {0} päivä + {0} päivää + + + {0} tunti + {0} tuntia + + + {0} minuutti + {0} minuuttia + + + {0} kuukausi + {0} kuukautta + + + {0} sekunti + {0} sekuntia + + + {0} viikko + {0} viikkoa + + + {0} vuosi + {0} vuotta + + + + + kyllä:kylla:k + ei:e + + + + diff --git a/lib/zend/Zend/Locale/Data/fi_FI.xml b/lib/zend/Zend/Locale/Data/fi_FI.xml new file mode 100644 index 0000000000..82b83dfc31 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fi_FI.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/fil.xml b/lib/zend/Zend/Locale/Data/fil.xml new file mode 100644 index 0000000000..4c82c60607 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fil.xml @@ -0,0 +1,1010 @@ + + + + + + + + + + + Afrikaans + Amharic + Arabic + Assamese + Azerbaijani + Belarusian + Bulgarian + Bihari + Bengali; Bangla + Breton + Bosnian + Catalan + Czech + Welsh + Danish + Aleman + Griyego + Ingles + Ingles (UK) + Ingles (US) + Esperanto + Espanyol + Estonian + Basque + Persian + Finnish + Filipino + Faroeso + Pranses + Prisian + Irish + Scots Gaelic + Galician + Guarani + Gujarati + Hebreo + Hindu + Croatian + Hungarian + Armenian + Interlingua + Indonesian + Interlingue + Icelandic + Italyano + Japanese + Javanese + Georgian + Khmer + Kannada + Korean + Kurdish + Kirghiz + Latin + Lingala + Lao + Lithuanian + Latvian + Macedonian + Malayalam + Mongolian + Marathi + Malay + Maltese + Nepali + Olandes + Norwegian Nynorsk + Norwegian + Occitan + Oriya + Punjabi + Polish + Pashto + Portuges + Portuges (Brasil) + Rhaeto-Romance + Romanian + Ruso + Sanskrit + Sindhi + Serbo-Croatian + Sinhalese + Eslobak + Eslobenyan + Somali + Albanian + Serbiran + Sesoto + Taga Sundan + Suwiso + Swahili + Tamil + Telugu + Thai + Tigrinya + Turkmen + Tagalog + Klingon + Turko + Twi + Uighur + Ukranian + und + Urdu + Uzbeko + Vietnamese + Wolof + Xhosa + Yiddish + zh + Intsik (Pinadali) + Intsik (Tradisyunal) + Zulu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mundo + Africa + North America + South America + Oceania + Kanlurang Africa + Gitnang Amerika + Silangang Africa + Hilagang Africa + Gitnang Africa + Katimugang Africa + Americas + Hilagang Amerika + Carribbean + Silangang Asya + Katimugang Asya + Timog-Silangang Asya + Katimugang Europa + Australia at New Zealand + Melanesia + Rehiyong Micronesia + Polynesia + Timog-Gitnang Asya + Asya + Gitnang Asya + Kanlurang Asya + Europa + Silangang Europa + Hilagang Europa + Kanlurang Europa + Latin America at ang Caribbean + Andorra + United Arab Emirates + Afghanistan + Antigua at Barbuda + Anguilla + Albania + Armenia + Netherlands Antilles + Angola + Antartica + Argentina + American Samoa + Austria + Australia + Aruba + Aland Islands + Azerbaijan + Bosnia and Herzegovina + Barbados + Bangladesh + Belgium + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Bermuda + Brunei + Bolivia + Brazil + Bahamas + Bhutan + Bouvet Island + Botswana + Belarus + Belize + Canada + Cocos Islands + Congo - Kinshasa + Central African Republic + Congo + Switzerland + Côte d'Ivoire + Cook Islands + Chile + Cameroon + Tsina + Colombia + Costa Rica + Serbia at Montenegro + Cuba + Cape Verde + Christmas Island + Cyprus + Czech Republic + Alemaya + Djibouti + Denmark + Dominica + Dominican Republic + Algeria + Ecuador + Estonia + Ehipto + Western Sahara + Eritrea + Espanya + Ethiopia + Finland + Fiji + Falkland Islands + Micronesia + Faroe Islands + Pranses + Gabon + United Kingdom + Georgia + French Guiana + Guernsey + Ghana + Greenland + Gambia + Guinea + Equatorial Guinea + Griyego + South Georgia and the South Sandwich Islands + Guinea-Bissau + Hong Kong SAR China + Heard Island and McDonald Islands + Honduras + Croatia + Haiti + Hungary + Indonesia + Ireland + Israel + Isle of Man + India + British Indian Ocean Territory + Iraq + Iran + Iceland + Italya + Jersey + Jordan + Japan + Kenya + Kyrgyzstan + Cambodia + Kiribati + Comoros + Saint Kitts and Nevis + Hilagang Korea + Timog Korea + Cayman Islands + Kazakhstan + Laos + Lebanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lithuania + Latvia + Libya + Morocco + Moldova + Montenegro + Madagascar + Marshall Islands + Macedonia + Mali + Myanmar + Mongolia + Macao + Northern Mariana Islands + Mauritania + Malawi + Mehiko + Malaysia + Mozambique + Namibia + New Caledonia + Niger + Norfolk Island + Nigeria + Nicaragua + Netherlands + Norway + Nepal + New Zealand + Oman + Peru + French Polynesia + Papua New Guinea + Pilipinas + Pakistan + Poland + Saint Pierre at Miquelon + Palestine + Portugal + Paraguay + Malayong bahagi ng Oceania + European Union + Romania + Serbia + Russia + Rwanda + Saudi Arabya + Solomon Islands + Seychelles + Sudan + Sweden + Saint Helena + Slovenia + Svalbard and Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Suriname + Sao Tome and Principe + El Salvador + Syria + Swaziland + Turks and Caicos Islands + Chad + French Southern Territories + Togo + Thailand + Tajikistan + Tokelau + East Timor + Turkmenistan + Tunisia + Tonga + Turkey + Trinidad and Tobago + Tuvalu + Taiwan + Tanzania + Ukraine + Uganda + United States minor outlying islands + United States + Uruguay + Uzbekistan + Vatican City + Saint Vincent and the Grenadines + Venezuela + British Virgin Islands + U.S. Virgin Islands + Vietnam + Vanuatu + Wallis and Futuna + Samoa + Yemen + Timog Afrika + Zambia + Zimbabwe + Hindi kilala o Hindi wastong Rehiyon + + + US + Metric + + + {0} + {0} + {0} + + + + [a-n ñ {ng} o-z] + [á à â é è ê í ì î ó ò ô ú ù û] + [a-z] + + + “ + ” + ‘ + ’ + + + + + + + + Ene + Peb + Mar + Abr + May + Hun + Hul + Ago + Set + Okt + Nob + Dis + + + Enero + Pebrero + Marso + Abril + Mayo + Hunyo + Hulyo + Agosto + Setyembre + Oktubre + Nobyembre + Disyembre + + + + + E + P + M + A + M + H + H + A + S + O + N + D + + + Enero + Pebrero + Marso + Abril + Mayo + Hunyo + Hulyo + Agosto + Setyembre + Oktubre + Nobyembre + Disyembre + + + + + + + Lin + Lun + Mar + Mye + Huw + Bye + Sab + + + Linggo + Lunes + Martes + Miyerkules + Huwebes + Biyernes + Sabado + + + + + Miy + Biy + + + L + L + M + M + H + B + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, MMMM dd y + + + + + MMMM d, y + + + + + MMM d, y + + + + + M/d/yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + E, M-d + LLL + E MMM d + E MMMM d + MMMM d + MMM d + M-d + mm:ss + y + yyyy-M + EEE, yyyy-M-d + y MMM + EEE, y MMM d + y MMMM + y QQQ + yy-MM + MMM yy + + + + + Era + + + Taon + + + Buwan + + + Linggo + + + Araw + Yesterday + Today + Tomorrow + + + Araw ng Linggo + + + Dayperiod + + + Oras + + + Minuto + + + Segundo + + + Zone + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Unknown + + + Porto - Novo + + + Pasko. + + + Tbilisi. + + + Conarky + + + St. Kitts + + + St. Lucia + + + Maseru. + + + Dushanbe. + + + Port nang Espanya + + + St. Vincent + + + St. Thomas + + + Harare. + + + + + + . + , + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + {0} {1} + {0} {1} + + + + United Arab Emirates Dirham + + + Argentine Peso + + + Australian Dollar + + + Bulgarian Lev + + + Bolivian Boliviano + + + Brazilian Real + + + Canadian Dollar + + + Swiss Francs + + + Chilean Peso + + + Yuan Renminbi + + + Colombian Peso + + + Czech Koruna + + + Deutsche Marks + + + Denmark Kroner + + + Estonian Kroon + + + Egyptian Pound + + + Euros + + + French Franc + + + British Pounds Sterling + + + Hong Kong Dollars + + + Croatian Kuna + + + Hungarian Forint + + + Indonesian Rupiah + + + Israeli Shekel + + + Indian Rupee + + + Japanese Yen + + + South Korean Won + + + Lithuanian Litas + + + Moroccan Dirham + + + Mexico Peso + + + Malaysian Ringgit + + + Norwegian Kroner + + + New Zealand Dollars + + + Peruvian Nuevo Sol + + + Philippine Peso + + + Pakistan Rupee + + + Polish NewZloty + + + Romanian Leu + + + Serbian Dinar + + + Russian Ruble + + + Saudi Riyal + + + Sweden Kronor + + + Singapore Dollars + + + Slovenian Tolar + + + Slovak Koruna + + + Thai Baht + + + Turkish Lira + + + New Taiwan Dollar + + + US Dollar + + + Venezuela Bolivar + + + XXX + + + South African Rand + + + + + + {0} araw + {0} araw + + + {0} oras + {0} oras + + + {0} minuto + {0} minuto + + + {0} buwan + {0} buwan + + + {0} segundo + {0} segundo + + + {0} linggo + {0} linggo + + + {0} taon + {0} taon + + + + + yes:y + no:n + + + + diff --git a/lib/zend/Zend/Locale/Data/fil_PH.xml b/lib/zend/Zend/Locale/Data/fil_PH.xml new file mode 100644 index 0000000000..f9d50a4a35 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fil_PH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/fo.xml b/lib/zend/Zend/Locale/Data/fo.xml new file mode 100644 index 0000000000..ffd024ad5a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fo.xml @@ -0,0 +1,795 @@ + + + + + + + + + is da sv en + + + afríska + amhariskt + arabiskt + assamesiskt + azerbaijaniskt + belarussiskt + bulgarskum + bihariskt + bengaliskt + bretonskt + bosniskt + katalanskt + kekkiskt + valisiskt + danskt + týskt + grikskt + enskt + esperanto + spanskt + estlendskt + baskiskt + persiskt + finskt + tagalog + føroyskt + franskt + frisiskt + írskt + skotskt gæliskt + galliskt + guarani + gujariti + hebraiskt + hindi + kroatiskum + ungarskt + armenskum + interlingua + indonesiskum + interlingue + íslendskt + italskt + japanskt + javanesiskt + georgiskt + kambodjanskt + kannada + koreanskt + kurdiskt + kyrgyz + latín + lingala + laothian + litavskt + latviskt + makedonskt + malayalam + mongoliskt + marathiskt + malay + maltesiskt + norskt bokmál + nepalskt + hollendskt + nýnorskt + norskt + occitan + oriya + punjabi + polskt + pashto + portugisiskt + romanskt + russiskt + sanskrit + sindhi + serbokroatiskt + sinhalesiskt + slovakiskum + slovenskum + somaliskt + albanskt + serbiskum + sesotho + sundanesiskt + svenskt + swahili + tamilskt + telugu + thailendskt + tigrinya + turkmenskt + klingonskt + turkiskt + twi + uighur + ukrainskt + urdu + uzbekiskt + vietnamesiskt + xhosa + jiddiskt + kinesískt + sulu + + + heimur + Africa + Norðuramerika + Suðuramerika + Kyrrahavsoyggjarnar + Vesturafrika + Sentralamerika + Eysturafrika + Norðurafrika + Miðafrika + Suður Afrika + Amerika + Amerika nor∂ur Meksiko + Karibia + Eysturasia + Suðurasia + Suðureysturasia + Suðurevropa + Avstralia og Nýsæland + Melanesia + Mikronesiske regionen + Polynesia + Suðursentralasia + Asia + Sentralasia + Vesturasia + Evropa + Eysturevropa + Norðurevropa + Vesturevropa + Latínamerika og Karibia + Andorra + Sameindu Emirríkini + Afganistan + Antigua og Barbuda + Anguilla + Albania + Armenia + Niðurlendsku Antilloyggjar + Angola + Antarktis + Argentina + Amerikanska Sámoa + Eysturríki + Avstralia + Aruba + Áland + Aserbajdsjan + Bosnia-Hersegovina + Barbados + Bangladesj + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei + Bolivia + Brasilia + Bahamas + Butan + Bouvetoy + Botsvana + Hvítarussland + Belis + Kanada + Kokosoyggjar + Kongo-Kinshasa + Miðafrikalýðveldið + Kongo + Sveis + Fílabeinsstrondin + Cooksoyggjar + Kili + Kamerun + Kina + Kolombia + Kosta Rika + Kuba + Grønhøvdaoyggjarnar + Jólaoyggjin + Kýpros + Kekkia + Týskland + Djibouti + Danmørk + Dominika + Domingo lýðveldið + Algeria + Ekvador + Estland + Egyptaland + Vestursahara + Eritrea + Spania + Etiopia + Finnland + Fiji + Falklandsoyggjar + Mikronesia + Føroyar + Frakland + Gabon + Stóra Bretland + Grenada + Georgia + Fransk Gujana + Guernsey + Ghana + Gibraltar + Grønland + Gambia + Guinea + Guadeloupe + Ekvator Guinea + Grikkaland + Suðurgeorgia + Guatemala + Guam + Guinea Bissau + Gujana + Hongkong + Heard- og McDonald-oyggjar + Honduras + Kroatia + Haiti + Ungarn + Indonesia + Írland + Ísrael + Mann + India + Bretsku Indiahavsoyggjar + Irak + Iran + Ísland + Italia + Jersey + Jameika + Jordan + Japan + Kenja + Kirgisia + Kambodja + Kiribati + Komorooyggjarnar + Saint Kitts og Nevis + Norður-Korea + Suður-Korea + Kuvait + Caymanoyggjar + Kasakstan + Laos + Libanon + Saint Lusia + Liktenstein + Sri Lanka + Liberia + Lesoto + Litava + Luksemborg + Lettland + Libya + Marokko + Monako + Moldova + Montenegro + Saint Martin + Madagaskar + Marshalloyggjarnar + Makedónia + Mali + Burma + Mongolia + Makao + Norðurmarianoyggjar + Martinique + Móritania + Montserrat + Malta + Móritius + Maldivuoyggjarnar + Malavi + Meksiko + Maleisia + Mosambik + Namibia + Ný-Kaledonia + Niger + Norfolkoy + Nigeria + Nikaragua + Niðurlond + Noreg + Nepal + Nauru + Niue + Ný Sæland + Oman + Panama + Perú + Franska Polynesia + Papua Nýguinea + Filipsoyggjar + Pakistan + Pólland + Saint-Pierre og Miquelon + Pitcairn + Puerto Rico + Palestinskt territorium + Portugal + Palau + Paraguei + Katar + EU + Réunion + Rumenia + Serbia + Russland + Ruanda + Saudi-Arábia + Sálomonoyggjarnar + Seyskelloyggjarnar + Sudan + Svøríki + Singapor + Saint Helena + Slovenia + Svalbard og Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Surinam + Sao Tome og Prinsipi + El Salvador + Syria + Svasiland + Turks- og Caicosoyggjar + Kjad + Togo + Teiland + Tadsjikistan + Tokelau + Eystur Timor + Turkmenistan + Tunesia + Tonga + Turkaland + Trinidad og Tobago + Tuvalu + Teivan + Tansania + Ukreina + Uganda + Sambandsríki Amerika + Uruguei + Usbekistan + Vatikan + Saint Vinsent og Grenadinoyggjar + Venesuela + Stóra Bretlands Jómfrúoyggjar + Sambandsríki Amerikas Jómfrúoyggjar + Vietnam + Vanuatu + Wallis og Futuna + Sámoa + Jemen + Mayotte + Suðurafrika + Sambia + Simbabvi + + + US-einingar + SI-einingar + + + + [a á b d ð e-i í j-o ó p r-u ú v x y ý æ ø] + [c q w z] + + + ” + ” + ’ + ’ + + + {0}–{1} + + + + + + jan + feb + mar + apr + mai + jun + jul + aug + sep + okt + nov + des + + + januar + februar + mars + apríl + mai + juni + juli + august + september + oktober + november + desember + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + sun + mán + týs + mik + hós + frí + ley + + + sunnudagur + mánadagur + týsdagur + mikudagur + hósdagur + fríggjadagur + leygardagur + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + AM + PM + + + fyrir Krist + eftir Krist + + + f.Kr. + e.Kr. + + + f.Kr. + e.Kr. + + + + + + EEEE dd MMMM y + + + + + d. MMM y + + + + + dd-MM-yyyy + + + + + dd-MM-yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + HH:mm:ss + d. MMM + dd-MM + Q yy + MM-yyyy + MMM y + + + {0} - {1} + + M-M + + + E dd-MM - E dd-MM + E dd-MM - E dd-MM + + + MMM-MMM + + + E d. MMM - E d. MMM + E d. - E d. MMM + + + d. MMM - d. MMM + d.-d. MMM + + + dd-MM - dd-MM + dd-MM - dd-MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM-yy - MM-yy + MM-yy - MM-yy + + + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + + + MMM-MMM y + MMM y - MMM y + + + E dd MMM - E dd MMM y + E dd - E dd MMM y + E dd MMM y - E dd MMM y + + + d. MMM - d. MMM y + d.-d. MMM y + d. MMM y - d. MMM y + + + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + + + + + + tímabil + + + ár + + + mánuður + + + vika + + + dagur + í fyrrafyrradag + í fyrradag + í gær + í dag + á morgum + í overmorgen + í overovermorgen + + + vikudagur + + + f.h./e.h. + + + klukkustund + + + mínúta + + + sekund + + + tímabelti + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + {0} ({1}) + + + + + , + . + ; + % + 0 + # + + + − + ×10^ + ‰ + ∞ + ¤¤¤ + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + {0} {1} + {0} {1} + + + + kr + + + + + + {0} dag + {0} dage + + + {0} tíma + {0} tímar + + + {0} minut + {0} minuttir + + + {0} mánaði + {0} mánaðir + + + {0} sekund + {0} sekund + + + {0} vika + {0} vikur + + + {0} ár + {0} ár + + + + + já:j + nei:n + + + + diff --git a/lib/zend/Zend/Locale/Data/fo_FO.xml b/lib/zend/Zend/Locale/Data/fo_FO.xml new file mode 100644 index 0000000000..7c87b8d2c4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fo_FO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/fr.xml b/lib/zend/Zend/Locale/Data/fr.xml new file mode 100644 index 0000000000..3f8edee4c4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fr.xml @@ -0,0 +1,5461 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abkhaze + aceh + acoli + adangme + adyghéen + avestique + afrikaans + langue afro-asiatique + afrihili + aïnou + akan + akkadien + aléoute + langue algonquienne + altaï du Sud + amharique + aragonais + ancien anglais + angika + langue apache + arabe + araméen + araukan + arapaho + langue artificielle + arawak + assamais + asturien + langue athapascane + langue australienne + avar + awadhi + aymara + azéri + bachkir + banda + langue bamilékée + baloutchi + balinais + bassa + langue balte + biélorusse + bedja + bemba + berbère + bulgare + bihari + bhojpuri + bichelamar + bikol + bini + siksika + bambara + bengali + bantou + tibétain + breton + braj + bosniaque + batak + bouriate + bugi + blin + catalan + caddo + langue amérindienne centrale + caribe + langue caucasienne + atsam + tchétchène + cebuano + langue celtique + chamorro + chibcha + tchaghataï + chuuk + mari + jargon chinook + choctaw + chipewyan + cherokee + cheyenne + langue chame + corse + copte + créole ou pidgin anglais + créole ou pidgin français + créole ou pidgin portugais + cree + turc de Crimée + créole ou pidgin + tchèque + kachoube + slavon d’église + langue couchitique + tchouvache + gallois + danois + dakota + dargwa + dayak + allemand + allemand autrichien + allemand suisse + delaware + slavey + dogrib + dinka + dogri + langue dravidienne + bas-sorabe + douala + moyen néerlandais + maldivien + dioula + dzongkha + éwé + efik + égyptien ancien + ekajuk + grec + élamite + anglais + anglais australien + anglais canadien + anglais britannique + anglais américain + moyen anglais + espéranto + espagnol + espagnol latino-américain + espagnol ibérique + estonien + basque + éwondo + persan + fang + fanti + peul + finnois + filipino + langue finno-ougrienne + fidjien + féroïen + fon + français + français canadien + français suisse + moyen français + ancien français + frison du Nord + frison oriental + frioulan + frison + irlandais + ga + gayo + gbaya + gaélique écossais + langue germanique + guèze + gilbertais + galicien + moyen haut-allemand + guarani + ancien haut allemand + gondi + gorontalo + gotique + grebo + grec ancien + alémanique + goudjarâtî + manx + gwichʼin + haoussa + haida + hawaïen + hébreu + hindi + hiligaynon + himachali + hittite + hmong + hiri motu + croate + haut-sorabe + haïtien + hongrois + hupa + arménien + héréro + interlingua + iban + indonésien + interlingue + igbo + yi de Sichuan + ijo + inupiaq + ilokano + langue indo-aryenne + langue indo-européenne + ingouche + ido + langue iranienne + langue iroquoienne + islandais + italien + inuktitut + japonais + lojban + judéo-persan + judéo-arabe + javanais + géorgien + karakalpak + kabyle + kachin + jju + kamba + karen + kawi + kabardin + tyap + koro + kongo + khasi + langue khoïsan + khotanais + kikuyu + kuanyama + kazakh + groenlandais + khmer + kiMboundou + kannada + coréen + konkani + kusaien + kpellé + kanouri + karatchaï balkar + carélien + krou + kurukh + kâshmîrî + kurde + koumyk + kutenai + komi + cornique + kirghize + latin + ladino + lahnda + lamba + luxembourgeois + lezghien + ganda + limbourgeois + lingala + lao + mongo + lozi + lituanien + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + letton + madurais + magahi + maithili + makassar + mandingue + malayo-polynésien + masai + moksa + mandar + mendé + malgache + moyen irlandais + marshall + maori + micmac + minangkabau + langue diverse + macédonien + langue mon-khmère + malayalam + mongol + mandchou + manipuri + langue manobo + moldave + mohawk + moré + marathe + malais + maltais + multilingue + langue mounda + creek + mirandais + marwarî + birman + langue maya + erzya + nauruan + nahuatl + langue amérindienne du Nord + napolitain + norvégien bokmål + ndébélé du Nord + bas-allemand + népalais + newari + ndonga + nias + langue nigéro-congolaise + niué + néerlandais + néerlandais belge + norvégien nynorsk + norvégien + nogaï + vieux norrois + n’ko + ndébélé du Sud + sotho du Nord + langue nubienne + navaho + newarî classique + nyanja + nyamwezi + nyankolé + nyoro + nzema + occitan + ojibwa + oromo + oriya + ossète + osage + turc ottoman + langue otomangue + pendjabi + langue papoue + pangasinan + pahlavi + pampangan + papiamento + palau + persan ancien + langue philippine + phénicien + pali + polonais + pohnpei + langues prâkrit + provençal ancien + pachto + portugais + portugais brésilien + portugais ibérique + langue quechua + rajasthani + rapanui + rarotongien + rhéto-roman + roundi + roumain + langue romane + tzigane + racine + russe + valaque + rwanda + sanskrit + sandawe + iakoute + langue amérindienne du Sud + langue salishenne + araméen samaritain + sasak + santal + sarde + sicilien + écossais + sindhî + sami du Nord + selkoupe + langue sémitique + sangho + ancien irlandais + langue des signes + serbo-croate + shan + singhalais + sidamo + langue sioux + langue sino-tibétaine + slovaque + slovène + langue slave + samoan + sami du Sud + langue samie + sami de Lule + sami d’Inari + sami skolt + shona + soninké + somali + sogdien + songhai + albanais + serbe + sranan tongo + sérère + swati + langue nilo-saharienne + sesotho + soundanais + sukuma + soussou + sumérien + suédois + swahili + syriaque classique + syriaque + tamoul + langue taï + télougou + temne + tereno + tetum + tadjik + thaï + tigrigna + tigré + tiv + turkmène + tokelau + tagalog + klingon + tlingit + tamacheq + tswana + tongan + tonga nyasa + tok pisin + turc + tsonga + tsimshian + tatar + tumbuka + langue tupi + langue altaïque + tuvalu + twi + tahitien + touva + oudmourte + ouïgour + ougaritique + ukrainien + umbundu + indéterminé + ourdou + ouzbek + vaï + venda + vietnamien + volapuk + vote + wallon + langues wakashennes + walamo + waray + washo + langue sorabe + wolof + kalmouk + xhosa + yao + yapois + yiddish + yoruba + langues yupik + zhuang + zapotèque + symboles Bliss + zenaga + chinois + chinois simplifié + chinois traditionnel + zandé + zoulou + zuni + sans contenu linguistique + zazaki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Monde + Afrique + Amérique du Nord + Amérique du Sud + Océanie + Afrique occidentale + Amérique centrale + Afrique orientale + Afrique septentrionale + Afrique centrale + Afrique australe + Amériques + Amérique septentrionale + Caraïbes + Asie orientale + Asie du Sud + Asie du Sud-Est + Europe méridionale + Australie et Nouvelle-Zélande + Mélanésie + région micronésienne + Polynésie + Asie centrale et du Sud + Asie + Asie centrale + Asie occidentale + Europe + Europe orientale + Europe septentrionale + Europe occidentale + Communauté des États indépendants + Amérique latine et Caraïbes + Îles Anglo-normandes + Andorre + Émirats arabes unis + Afghanistan + Antigua-et-Barbuda + Anguilla + Albanie + Arménie + Antilles néerlandaises + Angola + Antarctique + Argentine + Samoa américaines + Autriche + Australie + Aruba + Îles Åland + Azerbaïdjan + Bosnie-Herzégovine + Barbade + Bangladesh + Belgique + Burkina Faso + Bulgarie + Bahreïn + Burundi + Bénin + Saint-Barthélémy + Bermudes + Brunéi Darussalam + Bolivie + Brésil + Bahamas + Bhoutan + Île Bouvet + Botswana + Bélarus + Belize + Canada + Îles Cocos - Keeling + République démocratique du Congo + République centrafricaine + Congo + Suisse + Côte d’Ivoire + Îles Cook + Chili + Cameroun + Chine + Colombie + Costa Rica + Serbie-et-Monténégro + Cuba + Cap-Vert + Île Christmas + Chypre + République tchèque + Allemagne + Djibouti + Danemark + Dominique + République dominicaine + Algérie + Équateur + Estonie + Égypte + Sahara occidental + Érythrée + Espagne + Éthiopie + Finlande + Fidji + Îles Malouines + États fédérés de Micronésie + Îles Féroé + France + Gabon + Royaume-Uni + Grenade + Géorgie + Guyane française + Guernesey + Ghana + Gibraltar + Groenland + Gambie + Guinée + Guadeloupe + Guinée équatoriale + Grèce + Géorgie du Sud et les îles Sandwich du Sud + Guatemala + Guam + Guinée-Bissau + Guyana + R.A.S. chinoise de Hong Kong + Îles Heard et MacDonald + Honduras + Croatie + Haïti + Hongrie + Indonésie + Irlande + Israël + Île de Man + Inde + Territoire britannique de l'océan Indien + Irak + Iran + Islande + Italie + Jersey + Jamaïque + Jordanie + Japon + Kenya + Kirghizistan + Cambodge + Kiribati + Comores + Saint-Kitts-et-Nevis + Corée du Nord + Corée du Sud + Koweït + Îles Caïmans + Kazakhstan + Laos + Liban + Sainte-Lucie + Liechtenstein + Sri Lanka + Libéria + Lesotho + Lituanie + Luxembourg + Lettonie + Libye + Maroc + Monaco + Moldavie + Monténégro + Saint-Martin + Madagascar + Îles Marshall + Macédoine + Mali + Myanmar + Mongolie + R.A.S. chinoise de Macao + Îles Mariannes du Nord + Martinique + Mauritanie + Montserrat + Malte + Maurice + Maldives + Malawi + Mexique + Malaisie + Mozambique + Namibie + Nouvelle-Calédonie + Niger + Île Norfolk + Nigéria + Nicaragua + Pays-Bas + Norvège + Népal + Nauru + Niue + Nouvelle-Zélande + Oman + Panama + Pérou + Polynésie française + Papouasie-Nouvelle-Guinée + Philippines + Pakistan + Pologne + Saint-Pierre-et-Miquelon + Pitcairn + Porto Rico + Territoire palestinien + Portugal + Palaos + Paraguay + Qatar + régions éloignées de l’Océanie + Union européenne + Réunion + Roumanie + Serbie + Russie + Rwanda + Arabie saoudite + Îles Salomon + Seychelles + Soudan + Suède + Singapour + Sainte-Hélène + Slovénie + Svalbard et Île Jan Mayen + Slovaquie + Sierra Leone + Saint-Marin + Sénégal + Somalie + Suriname + Sao Tomé-et-Principe + El Salvador + Syrie + Swaziland + Îles Turks et Caïques + Tchad + Terres australes françaises + Togo + Thaïlande + Tadjikistan + Tokelau + Timor oriental + Turkménistan + Tunisie + Tonga + Turquie + Trinité-et-Tobago + Tuvalu + Taïwan + Tanzanie + Ukraine + Ouganda + Îles Mineures Éloignées des États-Unis + États-Unis + Uruguay + Ouzbékistan + État de la Cité du Vatican + Saint-Vincent-et-les Grenadines + Venezuela + Îles Vierges britanniques + Îles Vierges des États-Unis + Viêt Nam + Vanuatu + Wallis-et-Futuna + Samoa + Yémen + Mayotte + Afrique du Sud + Zambie + Zimbabwe + région indéterminée + + + orthographe allemande traditionnelle + orthographe normalisée de Resia + orthographe allemande de 1996 + françoys de 1606 + françois académique de 1694 + arménien oriental + arménien occidental + alphabet latin altaïque unifié + dialecte de San Giorgio / Bila + dialecte boontling + alphabet phonétique international + alphabet phonétique ouralique + dialecte lipovaz de Resia + monotonique + dialecte de Natisone + dialecte de Gniva / Njiva + dialecte d’Oseacco / Osojane + polytonique + informatique + orthographe révisée + dialecte de Resia + dialecte saho + anglais standard écossais + dialecte scouse + dialecte de Stolvizza / Solbica + orthographe taraskievica + valencien + + + Calendrier + Ordonnancement + Devise + + + Ordre chinois traditionnel - Big5 + Calendrier bouddhiste + Calendrier chinois + Ordre direct + Ordre chinois simplifié - GB2312 + Calendrier grégorien + Calendrier hébraïque + Calendrier indien + Calendrier musulman + Calendrier civil musulman + Calendrier japonais + Ordre de l’annuaire + Ordre pinyin + Calendrier républicain chinois + Ordre des traits + Ordre traditionnel + + + américain + métrique + + + langue : {0} + écriture : {0} + région : {0} + + + + [a à â æ b c ç d e é è ê ë f-i î ï j-o ô œ p-u ù û ü v-y ÿ z] + [á å ä ã ā ē í ì ī ñ ó ò ö ø ú ǔ] + [a-z ұ Ұ] + + + « + » + “ + ” + + + {0} – {1} + + + matin + soir + + + ère bouddhiste + + + ère b. + + + ÈB + + + + + + EEEE d MMMM y G + + + + + d MMMM y G + + + + + d MMM, y G + + + + + d/M/yyyy + + + + + + m:ss + + + + + + + + 1yuè + 2yuè + 3yuè + 4yuè + 5yuè + 6yuè + 7yuè + 8yuè + 9yuè + 10yuè + 11yuè + 12yuè + + + zhēngyuè + èryuè + sānyuè + sìyuè + wǔyuè + liùyuè + qīyuè + bāyuè + jiǔyuè + shíyuè + shíyīyuè + shí’èryuè + + + + matin + soir + + + + EEEE d MMMMl y'x'G + + + + + d MMMMl y'x'G + + + + + d MMMl y'x'G + + + + + d/Ml/y'x'G + + + + + + Ml + EEE d/Ml + MMMl + E d MMMl + EEE d MMMMl + d MMMMl + d MMMl + dd MMMl + d/MMl + dd/MMl + d/Ml + m:ss + y'x'G + Ml/y'x'G + EEE d/Ml/y'x'G + MMMl y'x'G + EEE d MMMl y'x'G + MMMM y'x'G + 'T'Q y'x'G + QQQ y'x'G + MMl/y'x'G + MMMl yy + EEE d MMMl yy + d MMMl yy + MMMMl y'x'G + + + + + + + + tout + bâb. + hât. + kya. + toub. + amsh. + barma. + barmo. + bash. + ba’o. + abî. + mis. + al-n. + + + tout + bâbâ + hâtour + kyakh + toubah + amshîr + barmahât + barmoudah + bashans + ba’ounah + abîb + misra + al-nasi + + + + + T + B + H + K + T + A + B + B + B + B + A + M + N + + + + matin + soir + + + avant Dioclétien + après Dioclétien + + + av. D. + ap. D. + + + + + + + + mäs. + teq. + hed. + tah. + ter + yäk. + mäg. + miy. + gue. + sän. + ham. + näh. + pag. + + + mäskäräm + teqemt + hedar + tahesas + ter + yäkatit + mägabit + miyazya + guenbot + säné + hamlé + nähasé + pagumén + + + + + M + T + H + T + T + Y + M + M + G + S + H + N + P + + + + matin + soir + + + avant l’Incarnation + après l’Incarnation + + + av. Inc. + ap. Inc. + + + + + + + + janv. + févr. + mars + avr. + mai + juin + juil. + août + sept. + oct. + nov. + déc. + + + janvier + février + mars + avril + mai + juin + juillet + août + septembre + octobre + novembre + décembre + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + dim. + lun. + mar. + mer. + jeu. + ven. + sam. + + + dimanche + lundi + mardi + mercredi + jeudi + vendredi + samedi + + + + + D + L + M + M + J + V + S + + + + + + + T1 + T2 + T3 + T4 + + + T1 + T2 + T3 + T4 + + + 1er trimestre + 2e trimestre + 3e trimestre + 4e trimestre + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + avant Jésus-Christ + après Jésus-Christ + + + av. J.-C. + ap. J.-C. + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + dd/MM/yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d EEE + HH:mm + HH:mm:ss + H:mm + L + EEE d/M + LLL + E d MMM + EEE d MMMM + d MMMM + d MMM + dd MMM + d/MM + dd/MM + d/M + d + mm:ss + mm:ss + y + M/yyyy + EEE d/M/yyyy + MMM y + EEE d MMM y + MMMM y + 'T'Q y + QQQ y + MM/yy + MMM yy + EEE d MMM yy + d MMM yy + 'T'Q yy + QQQQ yy + MMMM y + + + {0} – {1} + + M–M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM–MMM + + + 'du' E d MMM 'au' E d MMM + 'du' E d 'au' E d MMM + + + LLLL–LLLL + + + 'du' d MMM 'au' d MMM + d–d MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH – HH + HH – HH + + + HH:mm – HH:mm + HH:mm-HH:mm + HH:mm – HH:mm + + + HH:mm – HH:mm v + HH:mm – HH:mm v + HH:mm – HH:mm v + + + HH – HH v + HH – HH v + + + y-y + + + MM/yy – MM/yy + M/yyyy – M/yyyy + + + E dd/MM/yy – E dd/MM/yy + E dd/MM/yy – E dd/MM/yy + E d/M/yyyy – E d/M/yyyy + + + MMM–MMM y + MMM y – MMM y + + + E d MMM – E d MMM y + E d – E d MMM y + E d MMM y – E d MMM y + + + MMMM–MMMM y + MMMM y – MMMM y + + + d MMM – d MMM y + d–d MMM y + d MMM y – d MMM y + + + d/M/yy – d/M/yy + d/M/yy – d/M/yy + d/M/yyyy – d/M/yyyy + + + + + + ère + + + année + + + mois + + + semaine + + + jour + avant-avant-hier + avant-hier + hier + aujourd’hui + demain + après-demain + après-après-demain + + + jour de la semaine + + + cadran + + + heure + + + minute + + + seconde + + + fuseau horaire + + + + + + + + tis. + hes. + kis. + téb. + sché. + ad.I + adar + nis. + iyar + siv. + tam. + ab + ell. + + + Tisseri + Hesvan + kislev + Tébeth + Schébat + Adar + Adar II + Nissan + iyar + sivan + Tamouz + Ab + Elloul + + + + + T + H + K + T + S + A + A + N + I + S + T + A + E + + + + matin + soir + + + Anno Mundi + + + A.M. + + + + + + + + chai. + vai. + jyai. + āsha. + shrā. + bhā. + āshw. + kār. + mār. + pau. + māgh + phāl. + + + chaitra + vaishākh + jyaishtha + āshādha + shrāvana + bhādrapad + āshwin + kārtik + mārgashīrsha + paush + māgh + phālgun + + + + + C + V + J + Ā + S + B + Ā + K + M + P + M + P + + + + matin + soir + + + + + + Mouharram + Rabiʻ-oul-Aououal + Rabiʻ-out-Tani + Djoumada-l-Oula + Djoumada-t-Tania + Radjab + Chaʻban + Chaououal + Dou-l-Qaʻda + Dou-l-Hidjja + + + + + + + +HH:mm;-HH:mm + UTC{0} + UTC + {0} + {1} ({0}) + + zone inconnue + + + Andorre + + + Dubaï + + + Kaboul + + + Saint John’s + + + The Valley + + + Tirana + + + Erevan + + + Curaçao + + + Pôle Sud + + + Showa + + + Dumont d’Urville + + + Mac Murdo + + + Ushuaïa + + + Tucumán + + + Córdoba + + + Vienne + + + Adélaïde + + + Oranjestad + + + Bakou + + + Barbade (La) + + + Dhâkâ + + + Bruxelles + + + Bahreïn + + + Bermudes + + + Bandar Seri Begawan + + + Eirunepé + + + Manaos + + + Cuiabá + + + Belém + + + Araguaína + + + São Paulo + + + Maceió + + + Thimphou + + + Belmopan + + + Régina + + + Montréal + + + Saint-Jean de Terre-Neuve + + + West Island + + + Île de Pâques + + + Kachgar + + + Ürümqi + + + San José + + + La Havane + + + Cap Vert + + + Flying Fish Cove + + + Nicosie + + + Copenhague + + + Dominique + + + Saint Domingue + + + Alger + + + Galápagos + + + Tallin + + + Le Caire + + + Laâyoune + + + Asmara + + + Îles Canaries + + + Addis-Abeba + + + Fidji + + + Port Stanley + + + Féroé + + + Londres + + + Grenade + + + Tbilissi + + + Saint-Pierre-Port + + + Thulé + + + Godthåb + + + Basse-Terre + + + Athènes + + + Géorgie du Sud + + + Hagåtña + + + Guyane + + + Hong-Kong + + + Macassar + + + Jérusalem + + + Douglas + + + Kolkata + + + Diego Garcia + + + Bagdad + + + Téhéran + + + Reykjavík + + + Saint-Hélier + + + Jamaïque + + + Bichkek + + + Comores (Archipel) + + + Saint-Kitts + + + Séoul + + + Koweït + + + Caïmans + + + Aktaou + + + Ouralsk + + + Aktioubinsk + + + Kzyl Orda + + + Alma Ata + + + Beyrouth + + + Sainte-Lucie + + + Oulan-Bator + + + Tchoïbalsan + + + Macao + + + Fort-de-France + + + Brades + + + Malte + + + Maurice (Île) + + + Malé + + + Mazatlán + + + Mexico + + + Mérida + + + Cancún + + + Nouméa + + + Kingston + + + Katmandou + + + Yaren + + + Alofi + + + Panamá (Panamá) + + + Marquises + + + Manille + + + Karâchi + + + Varsovie + + + Saint-Pierre + + + Pitcairn (Île) + + + Porto Rico + + + Açores + + + Madère + + + Lisbonne + + + Melekeok + + + Asunción + + + Doha + + + Réunion (Île de la) + + + Bucarest + + + Moscou + + + Ekaterinbourg + + + Novossibirsk + + + Krasnoïarsk + + + Irkoutsk + + + Iakoutsk + + + Sakhaline + + + Kamtchatka + + + Riyad + + + Honiara + + + Mahé + + + Singapour + + + Sainte-Hélène + + + Saint-Marin + + + Mogadiscio + + + São Tomé + + + Salvador + + + Damas + + + Cockburn Town + + + Port-aux-Français + + + Lomé + + + Douchanbé + + + Achgabat + + + Nukuʻalofa + + + Port-d’Espagne + + + Oujgorod + + + Zaporojie + + + Alaska + + + New Salem, Dakota du Nord + + + Central North Dakota + + + Détroit + + + Samarcande + + + Tachkent + + + Cité du Vatican + + + Saint-Vincent + + + Road Town + + + Saint-Thomas + + + Hô-Chi-Minh-Ville + + + Efaté + + + Matāʻutu + + + Mamoudzou + + + + heure de l’Acre + heure de l’Acre + heure avancée de l’Acre + + + HACR + HNACR + HAACR + + + + + heure d’Afghanistan + heure d’Afghanistan + heure avancée d’Afghanistan + + + HAF + HNAF + HAAF + + + + + heure d’Afrique centrale + heure normale d’Afrique centrale + heure avancée d’Afrique centrale + + + HAFC + HNAFC + HAAFC + + + + + heure d’Afrique de l’Est + heure normale d’Afrique de l’Est + heure avancée d’Afrique de l’Est + + + HAFE + HNAFE + HAAFE + + + + + heure d’Afrique de l’Ouest sahélien + heure normale d’Afrique de l’Ouest sahélien + heure avancée d’Afrique de l’Ouest sahélien + + + HAFOS + HNAFOS + HAAFOS + + + + + heure d’Afrique méridionale + heure normale d’Afrique méridionale + heure avancée d’Afrique méridionale + + + HAFM + HNAFM + HAAFM + + + + + heure d’Afrique de l’Ouest + heure normale d’Afrique de l’Ouest + heure avancée d’Afrique de l’Ouest + + + HAFO + HNAFO + HAAFO + + + + + heure d’Aqtöbe + heure normale d’Aqtöbe + heure avancée d’Aqtöbe + + + HAQB + HNAQB + HAAQB + + + + + heure de l’Alaska + heure normale de l’Alaska + heure avancée de l’Alaska + + + HAK + HNAK + HAAK + + + + + heure d’Alaska - Hawaii + heure normale d’Alaska - Hawaii + heure avancée d’Alaska - Hawaii + + + HAH + HNAH + HAAH + + + + + heure d’Alma Ata + heure normale d’Alma Ata + heure avancée d’Alma Ata + + + HALM + HNALM + HAALM + + + + + heure de l’Amazonie + heure de l’Amazonie + heure avancée de l’Amazonie + + + HAMA + HNAMA + HAAMA + + + + + heure du Centre + heure normale du Centre + heure avancée du Centre + + + HC + HNC + HAC + + + + + heure de l’Est + heure normale de l’Est + heure avancée de l’Est + + + HE + HNE + HAE + + + + + Heure des Rocheuses + heure normale des Rocheuses + heure avancée des Rocheuses + + + HR + HNR + HAR + + + + + heure du Pacifique + heure normale du Pacifique + heure avancée du Pacifique + + + HP + HNP + HAP + + + + + heure d’Anadyr + heure d’Anadyr + heure avancée d’Anadyr + + + HANA + HNANA + HAANA + + + + + heure d’Aktaou + heure d’Aktaou + heure avancée d’Aktaou + + + HAQT + HNAQT + HAAQT + + + + + heure d’Aqtöbe + heure d’Aqtöbe + heure avancé d’Aqtöbe + + + HAQB + HNAQB + HAAQB + + + + + heure de l’Arabie + heure normale de l’Arabie + heure avancée de l’Arabie + + + HA + HNA + HAA + + + + + heure de l’Est argentin + heure d’Argentine + heure avancée de l’Est argentin + + + HE (AR) + HNE (AR) + HAE (AR) + + + + + heure de l’Ouest argentin + heure de l’Ouest argentin + heure avancée de l’Ouest argentin + + + HO (AR) + HNO (AR) + HAO (AR) + + + + + heure d’Arménie + heure d’Arménie + heure avancée d’Arménie + + + HAM + HNAM + HAAM + + + + + heure d’Achgabat + heure d’Achgabat + heure avancée d’Achgabat + + + HACH + HNACH + HAACH + + + + + heure de l’Atlantique + heure normale de l’Atlantique + heure avancée de l’Atlantique + + + HA + HNA + HAA + + + + + heure du Centre australien + heure normale du Centre australien + heure avancée du Centre australien + + + HC (AU) + HNC (AU) + HAC (AU) + + + + + heure Centre Ouest australien + heure normale Centre Ouest australien + heure avancée du Centre Ouest australien + + + HCO (AU) + HNCO (AU) + HACO (AU) + + + + + heure de l’Est australien + heure normale de l’Est australien + heure avancée de l’Est australien + + + HE (AU) + HNE (AU) + HAE (AU) + + + + + heure de l’Ouest australien + heure normale de l’Ouest australien + heure avancée de l’Ouest australien + + + HO (AU) + HNO (AU) + HAO (AU) + + + + + heure d’Azerbaïdjan + heure d’Azerbaïdjan + heure avancée d’Azerbaïdjan + + + HAZ + HNAZ + HAAZ + + + + + heure des Açores + heure des Açores + heure avancée des Açores + + + HAC (PT) + HNAC (PT) + HAAC (PT) + + + + + heure de Bakou + heure de Bakou + heure avancée de Bakou + + + HBAK + HNBAK + HABAK + + + + + heure du Bangladesh + heure du Bangladesh + heure avancée du Bangladesh + + + HBD + HNBD + HABD + + + + + heure de Bering + heure normale de Bering + heure avancée de Bering + + + HBER + HNBER + HABER + + + + + heure du Bhoutan + heure du Bhoutan + heure avancée du Bhoutan + + + HBT + HNBT + HABT + + + + + heure de Bolivie + heure de Bolivie + heure avancée de Bolivie + + + HBO + HNBO + HABO + + + + + heure de Bornéo + heure de Bornéo + heure avancée de Bornéo + + + HBOR + HNBOR + HABOR + + + + + heure de Brasilia + heure de Brasilia + heure avancée de Brasilia + + + HBR + HNBR + HABR + + + + + heure du Royaume-Uni + heure normale du Royaume-Uni + heure avancée du Royaume-Uni + + + HGB + HNGB + HAGB + + + + + heure du Brunéi + heure du Brunéi + heure avancée du Brunéi + + + HBN + HNBN + HABN + + + + + heure du Cap-Vert + heure du Cap-Vert + heure avancée du Cap-Vert + + + HCV + HNCV + HACV + + + + + heure des Chamorro + heure normale des Chamorro + heure avancée des Chamorro + + + HCh + HNCh + HACh + + + + + heure du Changbai + heure du Changbai + heure avancée du Changbai + + + HCHA (CN) + HNCHA (CN) + HACHA (CN) + + + + + heure des îles Chatham + heure des îles Chatham + heure avancée des îles Chatham + + + HCHA (NZ) + HNCHA (NZ) + HACHA (NZ) + + + + + heure du Chili + heure du Chili + heure avancée du Chili + + + HCL + HNCL + HACL + + + + + heure de Chine + heure normale de Chine + heure avancée de Chine + + + HC (CN) + HNC (Chine) + HAC (Chine) + + + + + heure de l’île Christmas + heure de l’île Christmas + heure avancée de l’île Christmas + + + HCX + HNCX + HACX + + + + + heure des îles Cocos - Keeling + heure des îles Cocos + heure avancée des îles Cocos - Keeling + + + HCC + HNCC + HACC + + + + + heure de Colombie + heure de Colombie + heure avancée de Colombie + + + HCO + HNCO + HACO + + + + + heure des îles Cook + heure des îles Cook + heure avancée des îles Cook + + + HCK + HNCK + HACK + + + + + heure de Cuba + heure normale de Cuba + heure avancée de Cuba + + + HCU + HNCU + HACU + + + + + heure de Dhâkâ + heure de Dhâkâ + heure avancée de Dhâkâ + + + HDAC + HNDAC + HADAC + + + + + heure de Davis + heure de Davis + heure avancée de Davis + + + HDAV + HNDAV + HADAV + + + + + heure de République dominicaine + heure normale de République dominicaine + heure avancée de République dominicaine + + + HDO + HNDO + HADO + + + + + heure de Dumont-d’Urville + heure de Dumont-d’Urville + heure avancée de Dumont-d’Urville + + + HDDU + HNDDU + HADDU + + + + + heure de Duchanbé + heure de Duchanbé + heure avancée de Duchanbé + + + HDUC + HNDUC + HADUC + + + + + heure de Guyane néerlandaise + heure de Guyane néerlandaise + heure avancée de Guyane néerlandaise + + + HGNE + HAGNE + HAGNE + + + + + heure du Timor oriental + heure du Timor oriental + heure avancée du Timor oriental + + + HTL + HNTL + HATL + + + + + heure de l’île de Pâques + heure de l’île de Pâques + heure avancée de l’île de Pâques + + + HPAQ + HNPAQ + HAPAQ + + + + + heure d’Équateur + heure d’Équateur + heure avancée d’Équateur + + + HEQ + HNEQ + HAEQ + + + + + Heure de l’Europe centrale + Heure normale de l’Europe centrale + heure avancée d’Europe centrale + + + HEC + HNEC + HAEC + + true + + + + heure d’Europe de l’Est + Heure normale de l’Europe de l’Est + heure avancée d’Europe de l’Est + + + HEE + HEE + HAEE + + true + + + + heure d’Europe de l’Ouest + heure d’Europe de l’Ouest + heure avancée d’Europe de l’Ouest + + + HEO + HNEO + HAEO + + + + + heure des îles Malouines + heure des îles Malouines + heure avancée des îles Malouines + + + HFK + HNFK + HAFK + + + + + heure des îles Fidji + heure des îles Fidji + heure avancée des îles Fidji + + + HFJ + HNFJ + HAFJ + + + + + heure de Guyane française + heure de Guyane française + heure avancée de Guyane française + + + HGF + HNGF + HAGF + + + + + heure des Terres australes françaises + heure des Terres australes françaises + heure avancée des Terres australes françaises + + + HTF + HNTF + HATF + + + + + heure de Frounzé + heure de Frounzé + heure avancée de Frounzé + + + HFRU + FNFRU + HAFRU + + + + + heure moyenne de Greenwich + + + GMT + + + + + heure des îles Galápagos + heure des îles Galápagos + heure avancée des îles Galápagos + + + HGAL + HNGAL + HAGAL + + + + + heure des îles Gambier + heure des îles Gambier + heure avancée des îles Gambier + + + HGAM + HNGAM + HAGAM + + + + + heure de Géorgie + heure de Géorgie + heure avancée de Géorgie + + + HGE + HNGE + HAGE + + + + + heure des îles Gilbert + heure des îles Gilbert + heure avancée des îles Gilbert + + + HGIL + HNGIL + HAGIL + + + + + heure de Goose Bay + heure normale de Goose Bay + heure avancée de Goose Bay + + + HGOB + HNGOB + HAGOB + + + + + heure du Centre du Groenland + heure du Centre du Groenland + heure avancée du Centre du Groenland + + + HC (GL) + HNC (GL) + HAC (GL) + + + + + heure de l’Est du Groenland + heure de l’Est du Groenland + heure avancée de l’Est du Groenland + + + HE (GL) + HNE (GL) + HAE (GL) + + + + + heure de l’Ouest du Groenland + heure de l’Ouest du Groenland + heure avancée de l’Ouest du Groenland + + + HO (GL) + HNO (GL) + HAO (GL) + + + + + heure de Guam + heure de Guam + heure avancée de Guam + + + HGU + HNGU + HAGU + + + + + heure du Golfe + heure normale du Golfe + heure avancée du Golfe + + + HG + HNG + HAG + + + + + heure du Guyana + heure du Guyana + heure avancée du Guyana + + + HGY + HNGY + HAGY + + + + + heure d’Hawaii - Aléoutiennes + heure normale d’Hawaii - Aléoutiennes + heure avancée d’Hawaii - Aléoutiennes + + + HH + HNH + HAH + + + + + heure de Hong Kong + heure de Hong Kong + heure avancée de Hong Kong + + + HHK + HNHK + HAHK + + + + + heure de Hovd + heure de Hovd + heure avancée de Hovd + + + HHOV + HNHOV + HAHOV + + + + + heure de l’Inde + heure normale de l’Inde + heure avancée de l’Inde + + + HI (IN) + HNI (IN) + HAI (IN) + + + + + heure du Territoire britannique de l’océan Indien + heure du Territoire britannique de l’océan Indien + heure avancée du Territoire britannique de l’océan Indien + + + HIO + HNIO + HAIO + + + + + heure d’Indochine + heure d’Indochine + heure avancée d’Indochine + + + HIDC + HNIDC + HAIDC + + + + + heure du Centre indonésien + heure normale du Centre indonésien + heure avancée du Centre indonésien + + + HC (ID) + HNC (ID) + HAC (ID) + + + + + heure de l’Est indonésien + heure normale de l’Est indonésien + heure avancée de l’Est indonésien + + + HE (ID) + HNE (ID) + HAE (ID) + + + + + heure de l’Ouest indonésien + heure normale de l’Ouest indonésien + heure avancée de l’Ouest indonésien + + + HO (ID) + HNO (ID) + HAO (ID) + + + + + heure d’Iran + heure normale d’Iran + heure avancée d’Iran + + + HIR + HNIR + HAIR + + + + + heure d’Irlande + heure normale d’Irlande + heure avancée d’Irlande + + + HIE + HNIE + HAIE + + + + + heure d’Irkoutsk + heure d’Irkoutsk + heure avancée d’Irkoutsk + + + HIRK + HNIRK + HAIRK + + + + + heure d’Israël + heure normale d’Israël + heure avancée d’Israël + + + HI (IL) + HNI + HAI + + + + + heure du Japon + heure normale du Japon + heure avancée du Japon + + + HJ + HNJ + HAJ + + + + + heure de Petropavlovsk-Kamchatski + heure de Petropavlovsk-Kamchatski + heure avancée de Petropavlovsk-Kamchatski + + + HPET + HNPET + HAPET + + + + + heure de Karâchi + heure de Karâchi + heure avancée de Karâchi + + + HKAR + HNKAR + HAKAR + + + + + heure de Kachgar + heure de Kachgar + heure avancée de Kachgar + + + HKAC + HNKAC + HAKAC + + + + + heure de l’Est kazakh + heure normale de l’Est kazakh + heure avancée de l’Est kazakh + + + HE (KZ) + HNE (KZ) + HAE (KZ) + + + + + heure de l’Ouest kazakh + heure normale de l’Ouest kazakh + heure avancée de l’Ouest kazakh + + + HO (KZ) + HNO (KZ) + HAO (KZ) + + + + + heure de Kyzylorda + heure de Kyzylorda + heure avancée de Kyzylorda + + + HKYZ + HNKYZ + HAKYZ + + + + + heure de Corée + heure normale de Corée + heure avancée de Corée + + + HKR + HNKR + HAKR + + + + + heure de Kosrae + heure de Kosrae + heure avancée de Kosrae + + + HKOS + HNKOS + HAKOS + + + + + heure de Krasnoïarsk + heure de Krasnoïarsk + heure avancée de Krasnoïarsk + + + HKRA + HNKRA + HAKRA + + + + + heure de Kouïbychev + heure de Kouïbychev + heure avancée de Kouïbychev + + + HKUY + HNKUY + HAKUY + + + + + heure de Kwajalein + heure de Kwajalein + heure avancée de Kwajalein + + + HKWA + HNKWA + HAKWA + + + + + heure des îles de la Ligne + heure normale des îles de la Ligne + heure avancée des îles de la Ligne + + + HLIGN + HNLIGN + HALIGN + + + + + heure des Maldives + heure normale des Maldives + heure avancée des Maldives + + + HMV + HNMV + HAMV + + + + + heure des îles Marquises + heure normale des îles Marquises + heure avancée des îles Marquises + + + HMA (PF) + HNMA (PF) + HAMA (PF) + + + + + heure des îles Marshall + heure normale des îles Marshall + heure avancée des îles Marshall + + + HMH + HNMH + HAMH + + + + + heure de Maurice + heure normale de Maurice + heure avancée de Maurice + + + HMU + HNMU + HAMU + + + + + heure de Moscou + heure normale de Moscou + heure avancée de Moscou + + + HMOS + HNMO + HAMO + + + + + heure de Nauru + heure normale de Nauru + heure avancée de Nauru + + + HNR + HNNR + HANR + + + + + heure de Nouvelle-Calédonie + heure normale de Nouvelle-Calédonie + heure avancée de Nouvelle-Calédonie + + + HNC + HNNC + HANC + + + + + heure de Nouvelle-Zélande + heure normale de Nouvelle-Zélande + heure avancée de Nouvelle-Zélande + + + HNZ + HNNZ + HANZ + + + + + heure de Terre-Neuve + heure normale de Terre-Neuve + heure avancée de Terre-Neuve + + + HT + HNT + HAT + + + + + heure de Nioué + heure normale de Nioué + heure avancée de Nioué + + + HNU + HNNU + HANU + + + + + heure de Norfolk + heure normale de Norfolk + heure avancée de Norfolk + + + HNF + HNNF + HANF + + + + + heure des îles Mariannes du Nord + heure normale des îles Mariannes du Nord + heure avancée des îles Mariannes du Nord + + + HMP + HNMP + HAMP + + + + + heure de Palaos + heure normale de Palaos + heure avancée de Palaos + + + HPW + HNPW + HAPW + + + + + heure de Papouasie-Nouvelle-Guinée + heure normale de Papouasie-Nouvelle-Guinée + heure avancée de Papouasie-Nouvelle-Guinée + + + HPG + HNPG + HAPG + + + + + heure des îles Phoenix + heure normale des îles Phoenix + heure avancée des îles Phoenix + + + HPHO + HNPHO + HAPHO + + + + + heure de Pitcairn + heure normale de Pitcairn + heure avancée de Pitcairn + + + HPN + HNPN + HAPN + + + + + heure de Ponape + heure normale de Ponape + heure avancée de Ponape + + + HPON + HNPON + HAPON + + + + + heure de la Réunion + heure normale de la Réunion + heure avancée de la Réunion + + + HRE + HNRE + HARE + + + + + heure de Samara + heure de Samara + heure avancée de Samara + + + HSAM + HNSA + HASAM + + + + + heure de Samoa + heure normale de Samoa + heure avancée de Samoa + + + HS + HNS + HAS + + + + + heure des Seychelles + heure normale des Seychelles + heure avancée des Seychelles + + + HSC + HNSC + HASC + + + + + heure des îles Salomon + heure normale des îles Salomon + heure avancée des îles Salomon + + + HSB + HNSB + HASB + + + + + heure de Géorgie du Sud + + + HNG + + + + + heure de Tahiti + heure normale de Tahiti + heure avancée de Tahiti + + + HTAH + HNTAH + HATAH + + + + + heure de Tokelau + heure normale de Tokelau + heure avancée de Tokelau + + + HTK + HNTK + HATK + + + + + heure de Tonga + heure normale de Tonga + heure avancée de Tonga + + + HTO + HNTO + HATO + + + + + heure de Truk + heure normale de Truk + heure avancée de Truk + + + HTRU + HNTRU + HATRU + + + + + heure de Turquie + heure de Turquie + heure avancée de Turquie + + + HTR + HNTR + HATR + + + + + heure des Tuvalu + heure normale des Tuvalu + heure avancée des Tuvalu + + + HTV + HNTV + HATV + + + + + heure de Vanuatu + heure normale de Vanuatu + heure avancée de Vanuatu + + + HVU + HNVU + HAVU + + + + + heure de Volgograd + heure de Volgograd + heure avancée de Volgograd + + + HVOL + HNVO + HAVOL + + + + + heure de l’île Wake + heure normale de l’île Wake + heure avancée de l’île Wake + + + HWAK + HNWAK + HAWAK + + + + + heure de Wallis-et-Futuna + heure normale de Wallis-et-Futuna + heure avancée de Wallis-et-Futuna + + + HWF + HNWF + HAWF + + + + + heure du Yukon + heure normale du Yukon + heure avancée du Yukon + + + HY + HNY + HAY + + + + + + + , +   + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + peseta andorrane + peseta andorrane + pesetas andorranes + ₧A + + + dirham des Émirats arabes unis + dirham des Émirats arabes unis + dirhams des Émirats arabes unis + + + afghani (1927–2002) + afghani (1927–2002) + afghanis (1927–2002) + + + afghani + afghani + afghanis + + + lek albanais (1947–1961) + lek albanais (1947–1961) + leks albanais (1947–1961) + + + lek albanais + lek albanais + leks albanais + + + dram arménien + dram arménien + drams arméniens + + + florin antillais + florin antillais + florins antillais + f.NA + + + kwanza angolais + kwanza angolais + kwanzas angolais + + + kwanza angolais (1977-1990) + kwanza angolais (1977–1990) + kwanzas angolais (1977–1990) + + + nouveau kwanza angolais (1990-2000) + nouveau kwanza angolais (1990–2000) + nouveaux kwanzas angolais (1990–2000) + + + kwanza angolais réajusté (1995-1999) + kwanza angolais réajusté (1995–1999) + kwanzas angolais réajustés (1995–1999) + + + austral argentin + austral argentin + australs argentins + + + peso argentin (1983-1985) + peso argentin (1983–1985) + pesos argentins (1983–1985) + + + peso argentin + peso argentin + pesos argentins + $AR + + + schilling autrichien + schilling autrichien + schillings autrichiens + öS + + + dollar australien + dollar australien + dollars australiens + $AU + + + florin arubais + florin arubais + florins arubais + f.AW + + + manat azéri (1993-2006) + manat azéri (1993–2006) + manats azéris (1993–2006) + + + manat azéri + manat azéri + manats azéris + + + dinar bosniaque + dinar bosniaque + dinars bosniaques + + + mark convertible bosniaque + mark convertible bosniaque + marks convertibles bosniaques + + + dollar barbadien + dollar barbadien + dollars barbadiens + + + taka bangladeshi + taka bangladeshi + takas bangladeshis + + + franc belge (convertible) + franc belge (convertible) + francs belges (convertibles) + + + franc belge + franc belge + francs belges + FB + + + franc belge (financier) + franc belge (financier) + francs belges (financiers) + + + lev bulgare (1962–1999) + lev bulgare (1962–1999) + levs bulgares (1962–1999) + + + nouveau lev bulgare + nouveau lev bulgare + nouveaux levs bulgares + + + dinar bahreïni + dinar bahreïni + dinars bahreïnis + DB + + + franc burundais + franc burundais + francs burundais + + + dollar bermudien + dollar bermudien + dollars bermudiens + $BM + + + dollar brunéien + dollar brunéien + dollars brunéiens + $BN + + + boliviano + boliviano + bolivianos + + + peso bolivien + peso bolivien + pesos boliviens + + + mvdol bolivien + mvdol bolivien + mvdols boliviens + + + nouveau cruzeiro brésilien (1967–1986) + nouveau cruzeiro brésilien (1967–1986) + nouveaux cruzeiros brésiliens (1967–1986) + + + cruzado brésilien (1986–1989) + cruzado brésilien (1986–1989) + cruzados brésiliens (1986–1989) + + + cruzeiro brésilien (1990–1993) + cruzeiro brésilien (1990–1993) + cruzeiros brésiliens (1990–1993) + + + réal brésilien + réal brésilien + réals brésiliens + + + nouveau cruzado + nouveau cruzado brésilien (1989–1990) + nouveaux cruzados brésiliens (1989–1990) + + + cruzeiro + cruzeiro réal brésilien (1993–1994) + cruzeiros réals brésiliens (1993–1994) + + + dollar bahaméen + dollar bahaméen + dollars bahaméens + $BS + + + ngultrum bouthanais + ngultrum bouthanais + ngultrums bouthanais + + + kyat birman + kyat birman + kyats birmans + + + pula botswanais + pula botswanais + pulas botswanais + + + nouveau rouble biélorusse (1994-1999) + nouveau rouble biélorusse (1994–1999) + nouveaux roubles biélorusses (1994–1999) + + + rouble biélorusse + rouble biélorusse + roubles biélorusses + + + dollar bélizéen + dollar bélizéen + dollars bélizéens + $BZ + + + dollar canadien + dollar canadien + dollars canadiens + $CA + + + franc congolais + franc congolais + francs congolais + FrCD + + + euro WIR + euro WIR + euros WIR + + + franc suisse + franc suisse + francs suisses + CHF + + + franc WIR + franc WIR + francs WIR + + + unité d’investissement chilienne + unité d’investissement chilienne + unités d’investissement chiliennes + + + peso chilien + peso chilien + pesos chiliens + $CL + + + yuan renminbi chinois + yuan renminbi chinois + yuans renminbi chinois + Ұ + + + peso colombien + peso colombien + peso colombien + $CO + + + Unité de valeur réelle colombienne + unité de valeur réelle colombienne + unités de valeur réelle colombiennes + + + colón costaricain + colón costaricain + colóns costaricains + + + dinar serbo-monténégrin + dinar serbo-monténégrin + dinars serbo-monténégrins + + + couronne forte tchécoslovaque + couronne forte tchécoslovaque + couronnes fortes tchécoslovaques + + + peso cubain + peso cubain + pesos cubains + $CU + + + escudo capverdien + escudo capverdien + escudos capverdiens + $CV + + + livre chypriote + livre chypriote + livres chypriotes + £CY + + + couronne tchèque + couronne tchèque + couronnes tchèques + + + mark est-allemand + mark est-allemand + marks est-allemands + + + mark allemand + mark allemand + marks allemands + + + franc djiboutien + franc djiboutien + francs djiboutiens + + + couronne danoise + couronne danoise + couronnes danoises + krD + + + peso dominicain + peso dominicain + pesos dominicains + + + dinar algérien + dinar algérien + dinars algériens + + + sucre équatorien + sucre équatorien + sucres équatoriens + + + unité de valeur constante équatoriale (UVC) + unité de valeur constante équatorienne (UVC) + unités de valeur constante équatoriennes (UVC) + + + couronne estonienne + couronne estonienne + couronnes estoniennes + krE + + + livre égyptienne + livre égyptienne + livres égyptiennes + £EG + + + nafka érythréen + nafka érythréen + nafkas érythréens + + + peseta espagnole (compte A) + peseta espagnole (compte A) + pesetas espagnoles (compte A) + + + peseta espagnole (compte convertible) + peseta espagnole (compte convertible) + pesetas espagnoles (compte convertible) + + + peseta espagnole + peseta espagnole + pesetas espagnoles + ₧ + + + birr éthiopien + birr éthiopien + birrs éthiopiens + + + euro + euro + euros + + + mark finlandais + mark finlandais + marks finlandais + + + dollar fidjien + dollar fidjien + dollars fidjien + $FJ + + + livre des Falkland + livre des Falkland + livres des Falkland + £FK + + + franc français + franc français + francs français + F + + + livre sterling + livre sterling + livres sterling + £UK + + + Georgian Kupon Larit + coupon de lari géorgien + coupons de lari géorgiens + KlGe + + + lari géorgien + lari géorgien + laris géorgiens + + + cédi + cédi ghanéen (1967–2007) + cédis ghanéens (1967–2007) + + + cédi ghanéen + cédi ghanéen + cédis ghanéens + + + livre de Gibraltar + livre de Gibraltar + livres de Gibraltar + £GI + + + dalasi gambien + dalasi gambien + dalasis gambiens + + + franc guinéen + franc guinéen + francs guinéens + + + syli guinéen + syli guinéen + sylis guinéens + + + ekwélé équatoguinéen + ekwélé équatoguinéen + ekwélés équatoguinéens + + + drachme grecque + drachme grecque + drachmes grecques + + + quetzal guatémaltèque + quetzal guatémaltèque + quetzals guatémaltèques + + + escudo de Guinée portugaise + escudo de Guinée portugaise + escudos de Guinée portugaise + EscGW + + + peso bissau-guinéen + peso bissau-guinéen + pesos bissau-guinéens + + + dollar du Guyana + dollar guyanien + dollars guyaniens + $GY + + + dollar de Hong Kong + dollar de Hong Kong + dollars de Hong Kong + $HK + + + lempira hondurien + lempira hondurien + lempiras honduriens + + + dinar croate + dinar croate + dinars croates + + + kuna croate + kuna croate + kunas croates + + + gourde haïtienne + gourde haïtienne + gourdes haïtiennes + + + forint hongrois + forint hongrois + forints hongrois + + + roupie indonésienne + roupie indonésienne + roupies indonésiennes + + + livre irlandaise + livre irlandaise + livres irlandaises + £IE + + + livre israélienne + livre israélienne + livres israéliennes + £IL + + + nouveau shekel israélien + nouveau shekel israélien + nouveaux shekels israélien + + + roupie indienne + roupie indienne + roupies indiennes + + + dinar irakien + dinar irakien + dinars irakiens + + + rial iranien + rial iranien + rials iraniens + + + couronne islandaise + couronne islandaise + couronnes islandaises + krI + + + lire italienne + lire italienne + lires italiennes + ₤IT + + + dollar jamaïcain + dollar jamaïcain + dollars jamaïcains + $JM + + + dinar jordanien + dinar jordanien + dinars jordaniens + DJ + + + yen japonais + yen japonais + yens japonais + ¥JP + + + shilling kényan + shilling kényan + shillings kényans + + + som kirghize + som kirghize + soms kirghizes + + + riel cambodgien + riel cambodgien + riels cambodgiens + + + franc comorien + franc comorien + francs comoriens + FC + + + won nord-coréen + won nord-coréen + wons nord-coréens + ₩KP + + + won sud-coréen + won sud-coréen + wons sud-coréens + + + dinar koweïtien + dinar koweïtien + dinar koweïtiens + DK + + + dollar des îles Caïmanes + dollar des îles Caïmanes + dollars des îles Caïmanes + $KY + + + tenge kazakh + tenge kazakh + tenges kazakhs + + + kip loatien + kip loatien + kips loatiens + + + livre libanaise + livre libanaise + livres libanaises + £LB + + + roupie srilankaise + roupie srilankaise + roupies srilankaises + RsSL + + + dollar libérien + dollar libérien + dollars libériens + $LR + + + loti lesothan + loti lesothan + maloti lesothans + + + litas lituanien + litas lituanien + litas lituaniens + + + talonas lituanien + talonas lituanien + talonas lituaniens + + + franc convertible luxembourgeois + franc convertible luxembourgeois + francs convertibles luxembourgeois + + + franc luxembourgeois + franc luxembourgeois + francs luxembourgeois + FL + + + franc financier luxembourgeois + franc financier luxembourgeois + francs financiers luxembourgeois + + + lats letton + lats letton + lats lettons + + + rouble letton + rouble letton + roubles lettons + + + dinar lybien + dinar lybien + dinars lybien + DL + + + dirham marocain + dirham marocain + dirhams marocains + + + franc marocain + franc marocain + francs marocains + + + leu moldave + leu moldave + leus moldaves + + + ariary malgache + ariary malgache + ariarys malgaches + + + franc malgache + franc malgache + francs malgaches + + + denar macédonien + denar macédonien + denars macédoniens + + + franc malien + franc malien + francs maliens + + + kyat myanmarais + kyat myanmarais + kyats myanmarais + + + tugrik mongol + tugrik mongol + tugriks mongols + + + pataca macanaise + pataca macanaise + patacas macanaises + + + ouguiya mauritanien + ouguiya mauritanien + ouguiyas mauritaniens + + + lire maltaise + lire maltaise + lires maltaises + + + livre maltaise + livre maltaise + livres maltaises + £MT + + + roupie mauricienne + roupie mauricienne + roupies mauriciennes + RsMU + + + rufiyaa maldivienne + rufiyaa maldivienne + rufiyaas maldiviennes + + + kwacha malawite + kwacha malawite + kwachas malawites + + + peso mexicain + peso mexicain + pesos mexicains + + + peso d’argent mexicain (1861–1992) + peso d’argent mexicain (1861–1992) + pesos d’argent mexicains (1861–1992) + + + unité de conversion mexicaine (UDI) + unité de conversion mexicaine (UDI) + unités de conversion mexicaines (UDI) + + + ringgit malais + ringgit malais + ringgits malais + + + escudo mozambicain + escudo mozambicain + escudos mozambicains + + + métical + metical mozambicain (1980–2006) + meticais mozambicains (1980–2006) + + + metical mozambicain + metical mozambicain + meticais mozambicains + + + dollar namibien + dollar namibien + dollars namibiens + $NA + + + naira nigérian + naira nigérian + nairas nigérians + + + cordoba + córdoba nicaraguayen (1912–1988) + córdobas nicaraguayens (1912–1988) + + + córdoba oro nicaraguayen + córdoba oro nicaraguayen + córdobas oro nicaraguayens + + + florin néerlandais + florin néerlandais + florins néerlandais + + + couronne norvégienne + couronne norvégienne + couronnes norvégiennes + krN + + + roupie népalaise + roupie népalaise + roupies népalaises + RsNP + + + dollar néo-zélandais + dollar néo-zélandais + dollars néo-zélandais + $NZ + + + rial omani + rial omani + rials omanis + + + balboa panaméen + balboa panaméen + balboas panaméens + + + inti péruvien + inti péruvien + intis péruviens + + + nouveau sol péruvien + nouveau sol péruvien + nouveaux sols péruviens + + + sol péruvien + sol péruvien (1863–1985) + sols péruviens (1863–1985) + + + kina papouan-néo-guinéen + kina papouan-néo-guinéen + kinas papouan-néo-guinéens + + + peso philippin + peso philippin + pesos philippins + + + roupie pakistanaise + roupie pakistanaise + roupies pakistanaises + RsPK + + + zloty polonais + zloty polonais + zlotys polonais + + + zloty (1950-1995) + zloty polonais (1950–1995) + zlotys polonais (1950–1995) + + + escudo portugais + escudo portugais + escudos portugais + + + guaraní paraguayen + guaraní paraguayen + guaranís paraguayens + + + rial qatari + rial qatari + rials qataris + RQ + + + dollar rhodésien + dollar rhodésien + dollars rhodésiens + $RH + + + ancien leu roumain + leu roumain (1952–2005) + lei roumains (1952–2005) + + + leu roumain + leu roumain + lei roumains + + + dinar serbe + dinar serbe + dinars serbes + + + rouble russe + rouble russe + roubles russes + + + rouble russe (1991–1998) + rouble russe (1991–1998) + roubles russes (1991–1998) + + + franc rwandais + franc rwandais + francs rwandais + FR + + + rial saoudien + rial saoudien + rials saoudiens + RS + + + dollar des îles Salomon + dollar des îles Salomon + dollars des îles Salomon + $SB + + + roupie des Seychelles + roupie des Seychelles + roupies des Seychelles + + + dinar soudanais + dinar soudanais (1992–2007) + dinars soudanais (1992–2007) + + + livre soudanaise + livre soudanaise + livres soudanaises + + + livre soudanaise (1956–2007) + livre soudanaise (1956–2007) + livres soudanaises (1956–2007) + + + couronne suédoise + couronne suédoise + couronnes suédoises + krS + + + dollar de Singapour + dollar de Singapour + dollars de Singapour + $SG + + + livre de Sainte-Hélène + livre de Sainte-Hélène + livres de Sainte-Hélène + £SH + + + tolar slovène + tolar slovène + tolars slovènes + + + couronne slovaque + couronne slovaque + couronnes slovaques + + + leone sierra-léonais + leone sierra-léonais + leones sierra-léonais + + + shilling somalien + shilling somalien + shillings somaliens + + + dollar surinamais + dollar surinamais + dollars surinamais + $SR + + + florin surinamais + florin surinamais + florins surinamais + + + dobra santoméen + dobra santoméen + dobras santoméens + + + rouble soviétique + rouble soviétique + roubles soviétiques + + + colón salvadorien + colón salvadorien + colóns salvadoriens + ₡SV + + + livre syrienne + livre syrienne + livres syriennes + £SY + + + lilangeni swazi + lilangeni swazi + emalangeni swazis + + + baht thaïlandais + baht thaïlandais + baths thaïlandais + + + rouble tadjik + rouble tadjik + roubles tadjiks + + + somoni tadjik + somoni tadjik + somonis tadjiks + + + manat turkmène + manat turkmène + manats turkmènes + + + dinar tunisien + dinar tunisien + dinars tunisiens + + + pa’anga tongan + pa’anga tongan + pa’angas tongans + + + escudo timorais + escudo timorais + escudos timorais + + + livre turque + livre turque (1844–2005) + livres turques + + + nouvelle livre turque + nouvelle livre turque + nouvelles livres turques + + + dollar trinidadien + dollar trinidadien + dollars trinidadiens + $TT + + + nouveau dollar taïwanais + nouveau dollar taïwanais + nouveaux dollars taïwanais + + + shilling tanzanien + shilling tanzanien + shillings tanzaniens + + + hryvnia ukrainienne + hryvnia ukrainienne + hryvnias ukrainiennes + + + karbovanetz + karbovanets ukrainien (1992–1996) + karbovanets ukrainiens (1992–1996) + + + shilling ougandais (1966-1987) + shilling ougandais (1966–1987) + shillings ougandais (1966–1987) + + + shilling ougandais + shilling ougandais + shillings ougandais + + + dollar des États-Unis + dollar des États-Unis + dollars des États-Unis + $US + + + dollar des Etats-Unis (jour suivant) + dollar des États-Unis (jour suivant) + dollars des États-Unis (jour suivant) + + + dollar des Etats-Unis (jour même) + dollar des États-Unis (jour même) + dollars des États-Unis (jour même) + + + peso uruguayen (unités indexées) + peso uruguayen (unités indexées) + pesos uruguayen (unités indexées) + + + peso uruguayen (1975–1993) + peso uruguayen (1975–1993) + pesos uruguayens (1975–1993) + + + peso uruguayen + peso uruguayen + pesos uruguayens + $UY + + + sum ouzbek + sum ouzbek + sums ouzbeks + + + bolivar + bolívar vénézuélien (1879–2008) + bolívars vénézuéliens (1879–2008) + + + bolivar fuerte vénézuélien + bolivar fuerte vénézuélien + bolivar fuertes vénézuélien + + + dông vietnamien + dông vietnamien + dôngs vietnamiens + + + vatu vanuatuan + vatu vanuatuan + vatus vanuatuans + + + tala samoan + tala samoan + talas samoans + + + franc CFA (BEAC) + franc CFA (BEAC) + francs CFA (BEAC) + + + argent + once troy d’argent + onces troy d’argent + + + or + once troy d’or + onces troy d’or + + + unité européenne composée + unité composée européenne (EURCO) + unités composées européennes (EURCO) + + + unité monétaire européenne + unité monétaire européenne (UME-6) + unités monétaires européennes (UME-6) + + + unité de compte européenne (XBC) + unité de compte 9 européenne (UEC-9) + unités de compte 9 européennes (UEC-9) + + + unité de compte européenne (XBD) + unité de compte 17 européenne (UEC-17) + unités de compte 17 européennes (UEC-17) + + + dollar des Caraïbes orientales + dollar des Caraïbes orientales + dollars des Caraïbes orientales + + + droit de tirage spécial + droit de tirage spécial + droits de tirage spéciaux + + + unité de compte européenne (ECU) + unité de compte européenne (ECU) + unités de compte européennes (ECU) + + + franc or + franc or + francs or + + + franc UIC + franc UIC + francs UIC + + + franc CFA (BCEAO) + franc CFA (BCEAO) + francs CFA (BCEAO) + + + palladium + once troy de palladium + onces troy de palladium + + + franc CFP + franc CFP + francs CFP + FCFP + + + platine + once troy de platine + onces troy de platine + + + type de fonds RINET + unité de fonds RINET + unités de fonds RINET + + + (devise de test) + (devise de test) + (devises de test) + + + devise inconnue ou non valide + devise inconnue ou non valide + devise inconnue ou non valide + + + dinar du Yémen + dinar nord-yéménite + dinars nord-yéménites + + + rial yéménite + rial yéménite + rials yéménites + RY + + + nouveau dinar yougoslave + dinar fort yougoslave (1966–1989) + dinars forts yougoslaves (1966–1989) + + + dinar yougoslave Noviy + nouveau dinar yougoslave (1994–2003) + nouveaux dinars yougoslaves (1994–2003) + + + dinar yougoslave convertible + dinar convertible yougoslave (1990–1992) + dinars convertibles yougoslaves (1990–1992) + + + rand sud-africain (financier) + rand sud-africain (financier) + rands sud-africains (financiers) + + + rand sud-africain + rand sud-africain + rands sud-africains + + + kwacha zambien + kwacha zambien + kwachas zambiens + + + nouveau zaïre zaïrien + nouveau zaïre zaïrien + nouveaux zaïres zaïriens + + + zaïre zaïrois + zaïre zaïrois + zaïres zaïrois + + + dollar zimbabwéen + dollar zimbabwéen + dollars zimbabwéens + $Z + + + + + + {0} jour + {0} jours + + + {0} heure + {0} heures + + + {0} minute + {0} minutes + + + {0} mois + {0} mois + + + {0} seconde + {0} secondes + + + {0} semaine + {0} semaines + + + {0} année + {0} années + + + + + oui:o + non:n + + + + diff --git a/lib/zend/Zend/Locale/Data/fr_BE.xml b/lib/zend/Zend/Locale/Data/fr_BE.xml new file mode 100644 index 0000000000..b77d5e873b --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fr_BE.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + d/MM/yy + + + + + + + H 'h' mm 'min' ss 's' zzzz + + + + + + du {0} au {1} + + M-M + + + E d/MM - E d/MM + E d/MM - E d/MM + + + MMM-MMM + + + E d MMM 'au' E d MMM + E d 'au' E d MMM + + + d MMM 'au' d MMM + d-d MMM + + + d/MM - d/MM + d/MM - d/MM + + + HH-HH + + + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + MMM-MMM y + MMM y 'a`' MMM y + + + E d MMM 'au' E d MMM y + E d 'au' E d MMM y + E d MMM y 'au' E d MMM y + + + d MMM 'au' d MMM y + d-d MMM y + d MMM y 'au' d MMM y + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + . + + + diff --git a/lib/zend/Zend/Locale/Data/fr_CA.xml b/lib/zend/Zend/Locale/Data/fr_CA.xml new file mode 100644 index 0000000000..86c6ccd9b5 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fr_CA.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + yyyy-MM-dd + + + + + yy-MM-dd + + + + + + + HH 'h' mm 'min' ss 's' zzzz + + + + + + EEE M-d + MM-d + MM-dd + M-d + yyyy-MM + EEE yyyy-MM-dd + yy-MM + + + + E MM-dd – E MM-dd + E MM-dd – E MM-dd + + + LLLL-LLLL + + + MM-dd – MM-dd + MM-dd – MM-dd + + + d–d + + + HH–HH + + + HH:mm–HH:mm + HH:mm–HH:mm + + + HH:mm–HH:mm v + HH:mm–HH:mm v + + + HH–HH v + + + y–y + + + yy-MM – yy-MM + yy-MM – yy-MM + + + 'du' E yy-MM-dd 'au' E yy-MM-dd + 'du' E yy-MM-dd 'au' E yy-MM-dd + 'du' E yy-MM-dd 'au' E yy-MM-dd + + + 'de' MMM y 'à' MMM y + + + 'du' E d MMM 'au' E d MMM y + 'du' E d 'au' E d MMM y + 'du' E d MMM y 'au' E d MMM y + + + MMMM – MMMM y + + + 'du' d MMM 'au' d MMM y + 'du' d MMM y 'au' d MMM y + + + yy-MM-dd – yy-MM-dd + yy-MM-dd – yy-MM-dd + yy-MM-dd – yy-MM-dd + + + + + + + + true + + + true + + + true + + + true + + + true + + + true + + + false + + + false + + + true + + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + $ + + + + + diff --git a/lib/zend/Zend/Locale/Data/fr_CH.xml b/lib/zend/Zend/Locale/Data/fr_CH.xml new file mode 100644 index 0000000000..b63df91de6 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fr_CH.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + ‹ + › + + + + + + + + EEEE, d MMMM y + + + + + dd.MM.yy + + + + + + + HH.mm:ss 'h' zzzz + + + + + + dd.MM + MM.yy + + + du {0} au {1} + + M-M + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + MMM-MMM + + + E, d MMM 'au' E, d MMM + E, d 'au' E, d MMM + + + d MMM 'au' d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + HH-HH + + + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM y + MMM y 'a`' MMM y + + + E, d MMM 'au' E, d MMM y + E, d 'au' E, d MMM y + E, d MMM y 'au' E, d MMM y + + + d MMM 'au' d MMM y + d-d MMM y + d MMM y 'au' d MMM y + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + + + + . + ' + + + + + ¤ #,##0.00;¤-#,##0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/fr_FR.xml b/lib/zend/Zend/Locale/Data/fr_FR.xml new file mode 100644 index 0000000000..524346d49a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fr_FR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/fr_LU.xml b/lib/zend/Zend/Locale/Data/fr_LU.xml new file mode 100644 index 0000000000..7e140fe80d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fr_LU.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + . + + + + FRF + + + F + + + + diff --git a/lib/zend/Zend/Locale/Data/fr_MC.xml b/lib/zend/Zend/Locale/Data/fr_MC.xml new file mode 100644 index 0000000000..0eb1d5d3aa --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fr_MC.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/fr_SN.xml b/lib/zend/Zend/Locale/Data/fr_SN.xml new file mode 100644 index 0000000000..ee85f2a033 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fr_SN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/fur.xml b/lib/zend/Zend/Locale/Data/fur.xml new file mode 100644 index 0000000000..690512fe23 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fur.xml @@ -0,0 +1,1225 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + avestan + afrikaans + amaric + aragonês + vieri inglês + lenghe Apache + arap + aramaic + assamês + asturian + lenghis australianis + avar + aymarà + azerbaijani + bielorùs + bulgar + bengalês + tibetan + breton + bosniac + catalan + cecen + lenghe celtiche + chamorro + cors + coptic + cree + cec + sclâf de glesie + galês + danês + todesc + sclâf + vieri egjizian + grêc + inglês + esperanto + spagnûl + eston + basc + persian + fulah + finlandês + fizian + faroês + francês + vieri francês + furlan + frisian + gaelic irlandês + gaelic scozês + lenghe gjermaniche + galizian + gotic + vieri grêc + manx + ebraic + hindi + cravuat + haitian + ongjarês + armen + indonesian + inupiaq + lenghe indo-europeane + ido + islandês + talian + inuktitut + gjaponês + gjeorgjian + kazac + kalaallisut + khmer + kannada + corean + curd + cornualiês + latin + ladin + lussemburghês + limburghês + lingala + lituan + leton + austronesian + maori + lenghis variis + macedon + malayalam + mongul + moldâf + marathi + malês + maltês + lenghis multiplis + mirandês + lenghis Maya + napoletan + norvegjês bokmål + bas todesc + nepalês + olandês + norvegjês nynorsk + norvegjês + vieri norvegjês + navajo + ocitan + osetic + turc otoman + punjabi + papiamento + vieri persian + polac + vieri provenzâl + pashto + portughês + portughês brasilian + quechua + rumanç + romen + lenghe romanze + rus + sanscrit + sardegnûl + sicilian + scozês + sindhi + sami setentrionâl + vieri irlandês + sinalês + slovac + sloven + lenghe sclave + samoan + somal + albanês + serp + sumeric + svedês + swahili + tamil + telegu + tetum + tagic + thai + tagalog + turc + tartar + tahitian + ucrain + indeterminade + urdu + uzbec + vietnamite + valon + yiddish + cinês + cinês semplificât + cinês tradizionâl + zulu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mont + Afriche + Americhe dal Nord + Americhe meridionâl + Oceanie + Afriche ocidentâl + Americhe centrâl + Afriche orientâl + Afriche setentrionâl + Afriche di mieç + Afriche meridionâl + Americhis + Americhe setentrionâl + caraibic + Asie orientâl + Asie meridionâl + Asie sud orientâl + Europe meridionâl + Australie e Gnove Zelande + Melanesie + Regjon de Micronesie + Polinesie + Asie + Asie centrâl + Asie ocidentâl + Europe + Europe orientâl + Europe setentrionâl + Europe ocidentâl + Commonwealth dai stâts indipendents + Americhe latine e caraibiche + Andorra + Emirâts araps unîts + Afghanistan + Antigua e Barbuda + Anguilla + Albanie + Armenie + Antilis olandesis + Angola + Antartic + Argjentine + Samoa merecanis + Austrie + Australie + Aruba + Isulis Aland + Azerbaigian + Bosnie e Ercegovine + Barbados + Bangladesh + Belgjiche + Burkina Faso + Bulgarie + Bahrain + Burundi + Benin + Sant Barthélemy + Bermuda + Brunei + Bolivie + Brasîl + Bahamas + Bhutan + Isule Bouvet + Botswana + Bielorussie + Belize + Canade + Isulis Cocos + Republiche Democratiche dal Congo + Republiche centri africane + Congo + Svuizare + Cueste di Avoli + Isulis Cook + Cile + Camerun + Cine + Colombie + Costa Rica + Serbia e Montenegro + Cuba + Cjâf vert + Isule Christmas + Cipri + Republiche ceche + Gjermanie + Gibuti + Danimarcje + Dominiche + Republiche dominicane + Alzerie + Ecuador + Estonie + Egjit + Sahara ocidentâl + Eritree + Spagne + Etiopie + Finlandie + Fizi + Isulis Falkland + Micronesie + Isulis Faroe + France + Gabon + Ream unît + Grenada + Gjeorgjie + Guiana francês + Ghana + Gjibraltar + Groenlande + Gambia + Guinee + Guadalupe + Guinee ecuatoriâl + Grecie + Georgia dal Sud e Isulis Sandwich dal Sud + Guatemala + Guam + Guinea-Bissau + Guyana + Regjon aministrative speciâl de Cine di Hong Kong + Isule Heard e Isulis McDonald + Honduras + Cravuazie + Haiti + Ongjarie + Indonesie + Irlande + Israêl + Isule di Man + India + Teritori britanic dal Ocean Indian + Iraq + Iran + Islande + Italie + Gjamaiche + Jordanie + Gjapon + Kenya + Kirghizstan + Camboze + Kiribati + Comoris + San Kitts e Nevis + Coree dal nord + Coree dal sud + Kuwait + Isulis Cayman + Kazachistan + Laos + Liban + Sante Lusie + Liechtenstein + Sri Lanka + Liberie + Lesotho + Lituanie + Lussemburc + Letonie + Libie + Maroc + Monaco + Moldavie + Sant Martin + Madagascar + Isulis Marshall + Macedonie + Mali + Birmanie + Mongolie + Regjon aministrative speciâl de Cine di Macao + Isulis Mariana dal Nord + Martiniche + Mauritanie + Montserrat + Malta + Maurizi + Maldivis + Malawi + Messic + Malaysia + Mozambic + Namibie + Gnove Caledonie + Niger + Isole Norfolk + Nigerie + Nicaragua + Paîs bas + Norvegje + Nepal + Nauru + Niue + Gnove Zelande + Oman + Panamà + Perù + Polinesie francês + Papue Gnove Guinee + Filipinis + Pakistan + Polonie + San Pierre e Miquelon + Pitcairn + Porto Rico + Teritori palestinês + Portugal + Palau + Paraguay + Qatar + Oceanie periferiche + Union europeane + Reunion + Romanie + Serbie + Russie + Ruande + Arabie Saudide + Isulis Salomon + Seychelles + Svezie + Singapore + Sante Eline + Slovenie + Svalbard e Jan Mayen + Slovachie + Sierra Leone + San Marin + Senegal + Somalie + Suriname + Sao Tomè e Principe + El Salvador + Sirie + Swaziland + Isulis Turks e Caicos + Çad + Teritoris meridionâi francês + Togo + Tailandie + Tazikistan + Tokelau + Timor orientâl + Turkmenistan + Tunisie + Tonga + Turchie + Trinidad e Tobago + Tuvalu + Taiwan + Tanzanie + Ucraine + Uganda + Isulis periferichis minôrs dai Stâts Unîts + Stâts Unîts + Uruguay + Uzbechistan + Vatican + San Vincent e lis Grenadinis + Venezuela + Isulis vergjinis britanichis + Isulis vergjinis americanis + Vietnam + Vanuatu + Wallis e Futuna + Samoa + Yemen + Mayotte + Sud Afriche + Zambia + Zimbabwe + Regjon no cognossude o no valide + + + Ortografie todescje tradizionâl + Ortografie resiane standard + Ortografie todescje dal 1996 + armen orientâl + armen ocidentâl + dialet di San Zorç di Resie + dialet di Lipovaz dal resian + Dialet des valadis dal Nadison + dialet di Gnive + dialet di Oseac + Politoniche + Ortografie revisade + Resian + dialet di Stolvize + valenzian + + + calendari + ordenament + monede + + + ordin cinês tradizionâl - Big5 + calendari budist + calendari cinês + ordin diret + ordin cinês semplificât - GB2312 + calendari gregorian + calendari ebreu + calendari nazionâl indian + calendari islamic + calendari islamic civîl + calendari gjaponês + ordin elenc telefonic + ordin pinyin + calendari de Republiche di Cine + ordin segns + ordin tradizionâl + + + anglosasson + metric + + + Lenghe: {0} + Scriture: {0} + Regjon: {0} + + + + [a à â b c ç d e è ê f-i ì î j-o ò ô p-u ù û v-z] + [å č é ë ğ ï ñ ó š ü] + [a-z] + + + ‘ + ’ + “ + ” + + + + + + + + Zen + Fev + Mar + Avr + Mai + Jug + Lui + Avo + Set + Otu + Nov + Dic + + + Zenâr + Fevrâr + Març + Avrîl + Mai + Jugn + Lui + Avost + Setembar + Otubar + Novembar + Dicembar + + + + + Z + F + M + A + M + J + L + A + S + O + N + D + + + + + + + dom + lun + mar + mie + joi + vin + sab + + + domenie + lunis + martars + miercus + joibe + vinars + sabide + + + + + D + L + M + M + J + V + S + + + + + + + T1 + T2 + T3 + T4 + + + Prin trimestri + Secont trimestri + Tierç trimestri + Cuart trimestri + + + + + 1 + 2 + 3 + 4 + + + + a. + p. + + + pdC + ddC + + + pdC + ddC + + + + + + EEEE d 'di' MMMM 'dal' y + + + + + d 'di' MMMM 'dal' y + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + d EEE + H:mm + L + E d/M + LLL + E d MMM + E d MMMM + d 'di' MMMM + d MMM + d/MM + d/M + d + mm:ss + y + M/yyyy + EEE, d/M/yyyy + MMM y + EEE d MMM y + LLLL 'dal' y + Q yyyy + QQQ y + MM/yy + Q yy + MMMM y + + + {0} – {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + LLL-LLL + + + E d 'di' MMM - E d 'di' MMM + E d - E d 'di' MMM + + + LLLL-LLLL + + + d 'di' MMM - d 'di' MMM + d-d 'di' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yyyy - E dd/MM/yyyy + + + MM - MM/yyyy + MM/yyyy - MM/yyyy + + + E dd/MM/yyyy - E dd/MM/yyyy + E dd/MM/yyyy - E dd/MM/yyyy + E dd/MM/yyyy - E dd/MM/yyyy + + + MM - MM/yyyy + MM/yyyy - MM/yyyy + + + dd/MM/yyyy - d/MM + d - d/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + ere + + + an + + + mês + + + setemane + + + dì + trê dîs fa + îr l'altri + îr + vuê + doman + passantdoman + tra trê dîs + + + dì de setemane + + + toc dal dì + + + ore + + + minût + + + secont + + + zone + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + No cognossude + + + San Pauli dal Brasîl + + + Canariis + + + Azoris + + + Lisbone + + + Mosche + + + Gnove York + + + + Ore de Europe centrâl + Ore estive de Europe centrâl + + + CET + CEST + + + + + Ore de Europe orientâl + Ore estive de Europe orientâl + + + EET + EEST + + + + + Ore de Europe ocidentâl + Ore estive de Europe ocidentâl + + + + + Ore di Mosche + + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + {0} {1} + {0} {1} + + + + Dram armen + + + Peso argjentin + + + Selin austriac + + + Dolar australian + + + Franc de Belgjiche + + + Franc burundês + + + Dolar dal Brunei + + + Real brasilian + + + Rubli bielorùs + + + Dolar canadês + + + Franc svuizar + + + Yuan Renminbi cinês + + + Vieri dinar serp + + + Peso cuban + + + Corone de Republiche Ceche + + + Marc todesc + + + Corone danês + + + Dinar algerin + + + Euro + + + Franc francês + + + Sterline britaniche + + + Dinar cravuat + + + Kuna cravuate + + + Rupie indiane + + + Rial iranian + + + Lire taliane + + + Yen gjaponês + + + Won de Coree dal Sud + + + Lats leton + + + Peso messican + + + Dolar namibian + + + Córdoba oro nicaraguan + + + Corone norvegjêse + + + Dollar neozelandês + + + Rupie pachistane + + + Zloty polac + + + Dinar serp + + + Rubli rus + + + Corone svedese + + + Talar sloven + + + Corone slovache + + + Viere Lire turche + + + Lire turche + + + Dolar american + + + Dolar american (prossime zornade) + + + Dolar american (stesse zornade) + + + Arint + + + Aur + + + Unitât composite europeane + + + Unitât monetarie europeane + + + Unitât di acont europeane (XBC) + + + Unitât di acont europeane (XBD) + + + Dirits speciâi di incas + + + Unitât Monetarie Europeane + + + Franc aur francês + + + Franc UIC francês + + + Paladi + + + Platin + + + fonts RINET + + + codiç di verifiche de monede + + + Monede no valide o no cognossude + + + Rand sudafrican + + + + + + {0} zornade + {0} zornadis + + + {0} ore + {0} oris + + + {0} minût + {0} minûts + + + {0} mês + {0} mês + + + {0} secont + {0} seconts + + + {0} setemane + {0} setemanis + + + {0} an + {0} agns + + + + + sì:si:s + no:n + + + + diff --git a/lib/zend/Zend/Locale/Data/fur_IT.xml b/lib/zend/Zend/Locale/Data/fur_IT.xml new file mode 100644 index 0000000000..52b43f7743 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/fur_IT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ga.xml b/lib/zend/Zend/Locale/Data/ga.xml new file mode 100644 index 0000000000..6d23a722e3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ga.xml @@ -0,0 +1,1504 @@ + + + + + + + + + en_IE + + + aa + Abcáisis + Aivéistis + Afracáinis + Amarais + Araibis + Asaimis + Asarbaiseáinis + Baiscíris + Bealarúisis + Bulgáiris + Bihairis + Beangáilis + Tibéadais + Briotáinis + Boisnis + Catalóinis + Sisinis + Corsaicis + Craíais + Seicis + Slavais na hEaglaise + Suvaisis + Breatnais + Danmhairgis + Gearmáinis + Gréigis + Béarla + Esperanto + Spáinnis + Eastóinis + Bascais + Peirsis + Fionlainnis + fil + Fidsis + Faróis + Fraincis + Freaslainnis Iartharach + Gaeilge + Gaeilge na hAlban + Gailísis + Guaráinis + Gúisearáitis + Mannainis + Haváíais + Eabhrais + Hiondúis + Cróitis + Ungáiris + Airméinis + Interlingua + Indinéisis + Interlingue + Inupiaq + Ido + Íoslainnis + Iodáilis + Ionúitis + Seapáinis + Iávais + Seoirsis + Casachais + Cambóidis + Cannadais + Cóiréis + Caismíris + Coirdis + Cornais + Cirgeasais + Laidin + Leitseabuirgis + ln + Laosais + Liotuáinis + Laitvis + Malagásais + Maorais + Macadóinis + Mailéalaimis + Mongóilis + Moldáivis + Maraitis + Malaeis + Maltais + Burmais + Nárúis + Ioruais Bokmål + Neipealais + Ollainnis + Ioruais Nynorsk + Ioruais + Navachóis + Ocatáinis + Oraisis + Óiséitis + Puinseáibis + Polainnis + Paistis + Portaingéilis + Portaingéilis Bhrasaíleach + Portaingéilis Ibéireach + Ceatsuais + Rómáinis + Rúisis + Sanscrait + Sairdínis + Sindis + Sáimis Thuaidh + Seirbea-Chróitis + Siolóinis + Slóvaicis + Slóivéinis + Samóis + Somáilis + Albáinis + Seirbis + Sótais Dheisceartach + Sundais + Sualainnis + Svahaílis + Tamailis + Teileagúis + Téalainnis + Tigrinis + Tuircméinis + Tagálaigis + Klingon + Tuircis + Tatarais + Tvís + Taihítis + ug + Úcráinis + Teanga Anaithnid nó Neamhbhailí + Urdais + Úisbéicis + Vítneamais + Vallúnais + Cósais + Giúdais + Sínis + Sínis Shimplithe + Sínis Thraidisiúnta + Súlúis + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An Domhan + An Afraic + An Aigéine + Meiriceá Láir + An Afraic Láir + Na Meiriceánna + An Astráil agus an Nua-Shéalainn + An Mheilinéis + An Réigiún Micrinéiseach + An Pholainéis + An Áise + An Áise Láir + An Eoraip + Comhlathas na Stát Neamhspleácha + Meiriceá Laidineach agus an Mhuir Chairib + Andóra + Aontas na nÉimíríochtaí Arabacha + An Afganastáin + Aintíge agus Barbúda + Anguilla + An Albáin + An Airméin + Antillí na hÍsiltíre + Angóla + An Antartaice + An Airgintín + Samó Meiriceánach + An Ostair + An Astráil + Arúba + Oileáin Alaind + An Asarbaiseáin + An Bhoisnia agus Heirseagóvéin + Barbadós + An Bhanglaidéis + An Bheilg + Buircíne Fasó + An Bhulgáir + Bairéin + An Bhurúin + Beinin + Beirmiúda + Brúiné + An Bholaiv + An Bhrasaíl + Na Bahámaí + An Bhútáin + Oileán Bouvet + An Bhotsuáin + An Bhealarúis + An Bheilís + Ceanada + Oileáin na gCócónna + Poblacht Dhaonlathach an Chongó + Poblacht na hAfraice Láir + An Congó + An Eilvéis + An Cósta Eabhair + Oileáin Cook + An tSile + Camarún + An tSín + An Cholóim + Cósta Ríce + An tSeirbia agus Montainéagró + Cúba + An Rinn Ghlas + Oileán na Nollag + An Chipir + Poblacht na Seice + An Ghearmáin + Djibouti + An Danmhairg + Doiminice + An Phoblacht Dhoiminiceach + An Ailgéir + Eacuadór + An Eastóin + An Éigipt + An Sahára Thiar + An Eiritré + An Spáinn + An Aetóip + An Fhionlainn + Fidsí + Oileáin Fháclainne + An Mhicrinéis + Oileáin Fharó + An Fhrainc + An Ghabúin + An Ríocht Aontaithe + Grenada + An tSeoirsia + An Ghuáin Fhrancach + Geansaí + Gána + Giobráltar + An Ghraonlainn + An Ghaimbia + An Ghuine + Guadalúip + An Ghuine Mheánchriosach + An Ghréig + An tSeoirsia Theas agus Oileáin Sandwich Theas + Guatamala + Guam + An Ghuine-Bhissau + An Ghuáin + R.R.S. na Síne Hong Cong + Oileán Heard agus Oileáin McDonald + Hondúras + An Chróit + Háití + An Ungáir + An Indinéis + Éire + Iosrael + Oileán Mhanann + An India + Críocha Briotanacha an Aigéin Indiagh + An Iaráic + An Iaráin + An Íoslainn + An Iodáil + Geirsí + Iamáice + An Iordáin + An tSeapáin + An Chéinia + An Chirgeastáin + An Chambóid + Ciribeas + Oileáin Chomóra + Saint Kitts agus Nevis + An Chóiré Thuaidh + An Chóiré Theas + Cuáit + Oileáin na gCadhman + An Chasacstáin + Laos + An Liobáin + San Lúisia + Lichtinstéin + Srí Lanca + An Libéir + Leosóta + An Liotuáin + Lucsamburg + An Laitvia + An Libia + Maracó + Monacó + An Mholdóiv + Montainéagró + Madagascar + Oileáin Marshall + An Mhacadóin + Mailí + Maenmar + An Mhongóil + R.R.S. na Síne Macáó + Oileáin Mariana Thuaidh + Martainíc + An Mharatáin + Montsarat + Málta + Oileán Mhuirís + Na Maildiví + An Mhaláiv + Meicsiceo + An Mhalaeisia + Mósaimbíc + An Namaib + An Nua-Chaladóin + An Nígir + Oileán Norfolk + An Nigéir + Nicearagua + An Ísiltír + An Iorua + Neipeal + Nárú + Nívé + An Nua-Shéalainn + Óman + Panama + Peiriú + An Pholainéis Fhrancach + Nua-Ghuine Phapua + Na hOileáin Fhilipíneacha + An Phacastáin + An Pholainn + Saint Pierre agus Miquelon + Pitcairn + Portó Ríce + Na Críocha Pailistíneacha + An Phortaingéil + Palau + Paragua + Catar + An Aigéine Imeallach + An tAontas Eorpach + Réunion + An Rómáin + An tSeirbia + Cónaidhm na Rúise + Ruanda + An Araib Shádach + Oileáin Sholaimh + Na Séiséil + An tSúdáin + An tSualainn + Singeapór + San Héilin + An tSlóvéin + Svalbard agus Jan Mayen + An tSlóvaic + Siarra Leon + San Mairíne + An tSeineagáil + An tSomáil + Suranam + Sao Tome agus Principe + An tSalvadóir + An tSiria + An tSuasalainn + Oileáin Turks agus Caicos + Sead + Críocha Deisceartacha na Fraince + Tóga + An Téalainn + An Táidsíceastáin + Tócalá + Tíomór Thoir + An Tuircméanastáin + An Túinéis + Tonga + An Tuirc + Oileáin na Tríonóide agus Tobága + Túválú + An Téaváin + An Tansáin + An Úcráin + Úganda + Mion-Oileáin Imeallacha S.A.M. + Stáit Aontaithe Mheiriceá + Urugua + Úisbéiceastáin + An Vatacáin + Saint Vincent agus na Grenadines + Veiniséala + Oileáin Bhriotanacha na Maighdean + Oileáin na Maighdean S.A.M. + Vít Neam + Vanuatú + Oileáin Vailís agus Futúna + Samó + Éimin + Mayotte + An Afraic Theas + An tSaimbia + An tSiombáib + Réigiún Anaithnid nó Neamhbhailí + + + Féilire + Comhordú + Airgeadra + + + Ord sórtála Síneach traidisiúnta - Big5 + Féilire Búdaíoch + Féilire Síneach + Ord sórtála díreach + Ord sórtála Síneach simplithe - GB 2312 + Féilire Greagórach + Féilire Eabhrach + Féilire Ioslamach + Féilire Ioslamach Sibhialta + Féilire Seapánach + Ord sórtála an eolaire teileafóin + Ord sórtála pinyin + Ord sórtála stríce + Ord sórtála traidisiúnta + + + Meiriceánach + Méadrach + + + + [a á b-e é f-i í j-o ó p-u ú v-z] + [ḃ ċ ḋ ḟ ġ ṁ ṗ ṡ ṫ] + + + + + + + + EEEE d MMMM y G + + + + + + + + + Ean + Feabh + Márta + Aib + Beal + Meith + Iúil + Lún + MFómh + DFómh + Samh + Noll + + + Eanáir + Feabhra + Márta + Aibreán + Bealtaine + Meitheamh + Iúil + Lúnasa + Meán Fómhair + Deireadh Fómhair + Samhain + Nollaig + + + + + E + F + M + A + B + M + I + L + M + D + S + N + + + + + + + Domh + Luan + Máirt + Céad + Déar + Aoine + Sath + + + Dé Domhnaigh + Dé Luain + Dé Máirt + Dé Céadaoin + Déardaoin + Dé hAoine + Dé Sathairn + + + + + D + L + M + C + D + A + S + + + + + + + R1 + R2 + R3 + R4 + + + 1ú ráithe + 2ú ráithe + 3ú ráithe + 4ú ráithe + + + + a.m. + p.m. + + + Roimh Chríost + Anno Domini + + + RC + AD + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + dd/MM/yyyy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + HH:mm:ss + d MMMM + dd/MM + d/M + mm:ss + MM/yy + MMM yy + Q yy + MM/yyyy + MMMM y + + + + + Ré + + + Bliain + + + Mí + + + Seachtain + + + Lá + Arú inné + Inné + Inniu + Amárach + Arú amárach + + + Lá na seachtaine + + + a.m./p.m. + + + Uair + + + Nóiméad + + + Soicind + + + Crios + + + + + + +HH:mm;-HH:mm + MAG{0} + {0} + + Anaithnid + + + + Am Samhraidh na Breataine + + + ASB + + Londain + + + + Am Samhraidh na hÉireann + + + ASÉ + + Baile Átha Cliath + + + + Meán-Am Greenwich + + + MAG + + + + + + + . + , + + + + + ¤#,##0.00 + + + + + + Peseta Andóra + + + Dirham Aontas na nÉimíríochtaí Arabacha + + + Afgainí (1927-2002) + + + Afgainí + + + Lek Albánach + + + Dram Airméanach + + + Guilder na nAntillí Ísiltíreach + AÍ f. + + + Kwanza Angólach + + + Kwanza Angólach (1977-1990) + + + Kwanza Nua Angólach (1990-2000) + + + Kwanza Reajustado Angólach (1995-1999) + + + Austral Airgintíneach + + + Peso na Airgintíne (1983-1985) + + + Peso na Airgintíne + + + Scilling Ostarach + + + Dollar Astrálach + + + Guilder Aruba + + + Manat Asarbaiseánach + + + Dínear Bhoisnia-Heirseagaivéin + + + Marc Inathraithe Bhoisnia-Heirseagaivéin + + + Dollar Bharbadóis + + + Taka Bhanglaidéiseach + + + Franc Beilgeach (inathraithe) + + + Franc Beilgeach + + + Franc Beilgeach (airgeadúil) + + + Lev Bulgárach Crua + + + Lev Nua Bulgárach + + + Dínear na Bairéine + + + Franc na Burúine + + + Dollar Bheirmiúda + + + Dollar Bhrúiné + + + Boliviano + + + Peso na Bolaive + + + Mvdol Bolavach + + + Cruzeiro Novo Brasaíleach (1967-1986) + + + Cruzado Brasaíleach + + + Cruzeiro Brasaíleach (1990-1993) + + + Real Brasaíleach + + + Cruzado Novo Brasaíleach + + + Cruzeiro Brasaíleach + + + Dollar na mBahámaí + + + Ngultrum Bútánach + + + Kyat Burmach + + + Pula Botsuánach + + + Rúbal Nua Béalarúiseach (1994-1999) + + + Rúbal Béalarúiseach + + + Dollar na Beilíse + + + Dollar Ceanada + + + Franc Congolais an Chongó + + + Franc na hEilvéise + + + Unidades de Fomento na Sile + + + Peso na Sile + + + Yuan Renminbi Síneach + + + Peso na Colóime + + + Colon Chósta Ríce + + + Koruna Crua na Seicslóvaice + + + Peso Cúba + + + Escudo na Rinne Verde + + + Punt na Cipire + + + Koruna Phoblacht na Seice + + + Ostmark na hOirGhearmáine + + + Deutsche Mark + + + Franc Djibouti + + + Krone Danmhargach + + + Peso Doimineacach + + + Dínear na hAilgéire + + + Sucre Eacuadóir + + + Unidad de Valor Constante (UVC) Eacuadóir + + + Kroon na hEastóine + + + Punt na hÉigipte + + + Peseta Spáinneach + + + Birr na hAetóipe + + + Euro + + + Markka Fionnlannach + + + Dollar Fhidsí + + + Punt Oileáin Fháclainne + + + Franc Francach + + + Punt Steirling + GB£ + + + Kupon Larit na Grúise + + + Lari na Grúise + + + Cedi Ghána + + + Punt Ghiobráltair + + + Dalasi Gaimbia + + + Franc Guine + + + Syli Guine + + + Ekwele Guineana na Guine Meánchriosaí + + + Drachma Gréagach + + + Quetzal Guatamala + + + Escudo na Guine Portaingéalaí + + + Peso Guine-Bhissau + + + Dollar na Guáine + + + Dollar Hong Cong + + + Lempira Hondúrais + + + Dínear na Cróite + + + Kuna Crótach + + + Gourde Háití + + + Forint Ungárach + + + Rupiah Indinéiseach + + + Punt Éireannach + £ + + + Punt Iosraelach + + + Sheqel Nua Iosraelach + + + Rúipí India + + + Dínear Irácach + + + Rial Iaránach + + + Krona Íoslannach + + + Lira Iodálach + + + Dollar Iamácach + + + Dínear Iordánach + + + Yen Seapánach + + + Scilling Céiniach + + + Som na Cirgeastáine + + + Riel na Cambóide + + + Franc Chomóra + + + Won na Cóiré Thuaidh + + + Won na Cóiré Theas + + + Dínear Cuátach + + + Dollar Oileáin Cayman + + + Tenge Casacstánach + + + Kip Laosach + + + Punt na Liobáine + + + Rúipí Srí Lanca + + + Dollar na Libéire + + + Loti Leosóta + + + Lita Liotuánach + + + Talonas Liotuánach + + + Franc Lucsamburg + + + Lats Laitviach + + + Rúbal Laitviach + + + Dínear Libia + + + Dirham Mharacó + + + Franc Mharacó + + + Leu Moldóvach + + + Ariary Madagascar + + + Franc Madagascar + + + Denar na Macadóine + + + Franc Mhailí + + + Kyat Mhaenmar + + + Tugrik Mongólach + + + Pataca Macao + + + Ouguiya na Maratáine + + + Lira Maltach + + + Punt Maltach + + + Rúipí Oileán Mhuirís + + + Maldive Islands Rufiyaa + + + Kwacha na Maláive + + + Peso Meicsiceo + + + Peso Airgid Meicsiceo (1861-1992) + + + Unidad de Inversion (UDI) Meicsiceo + + + Ringgit Malaeisia + + + Escudo Mósaimbíce + + + Metical Mósaimbíce + + + Dollar na Namaibe + + + Naira Nígéarach + + + Cordoba Nicearagua + + + Cordoba Oro Nicearagua + + + Guilder Ísiltíreach + + + Krone Ioruach + + + Rúipí Neipeáil + + + Dollar na Nua-Shéalainne + + + Rial Omain + + + Balboa Panamach + + + Inti Pheiriú + + + Sol Nuevo Pheiriú + + + Sol Pheiriú + + + Kina Nua-Ghuine Phapua + + + Peso Filipíneach + + + Rúipí na Pacastáine + + + Zloty Polannach + + + Zloty Polannach (1950-1995) + + + Escudo Portaingélach + + + Guarani Pharagua + + + Rial Catarach + + + Leu Rómánach + + + Rúbal Rúiseach + + + Rúbal Rúiseach (1991-1998) + + + Franc Ruanda + + + Riyal Sádach + + + Dollar Oileáin Solomon + + + Rúipí na Séiséil + + + Dínear na Súdáine + + + Punt na Súdáine + + + Krona Sualannach + + + Dollar Singeapóir + + + Punt San Héilin + + + Tolar Slóvénach + + + Koruna na Slóvaice + + + Leone Shiarra Leon + + + Scilling na Sómáile + + + Guilder Shuranaim + + + Dobra Sao Tome agus Principe + + + Rúbal Sóvéadach + + + Colon na Salvadóire + + + Punt Siria + + + Lilangeni na Suasalainne + + + Baht na Téalainne + + + Rúbal na Táidsíceastáine + + + Somoni na Táidsíceastáine + + + Manat na An Tuircméanastáine + + + Dínear na Túinéise + + + Paʻanga Tonga + + + Escudo Tíomóir + + + Lira Turcach + + + Dollar Oileáin na Tríonóide agus Tobága + + + Dollar Nua na Téaváine + + + Scilling na Tansáine + + + Hryvnia Úcránach + + + Karbovanetz Úcránach + + + Scilling Uganda (1966-1987) + + + Scilling Uganda + + + Dollar S.A.M. + + + Dollar S.A.M. (an chéad lá eile) + + + Dollar S.A.M. (an la céanna) + + + Peso Uragua (1975-1993) + + + Peso Uruguayo Uragua + + + Sum na hÚisbéiceastáine + + + Bolivar Veiniséala + + + Dong Vítneamach + + + Vatu Vanuatú + + + Tala Samó Thiar + + + CFA Franc BEAC + + + Ór + + + Aonad Ilchodach Eorpach + + + Aonad Airgeadaíochta Eorpach + + + Aonad Cuntais Eorpach (XBC) + + + Aonad Cuntais Eorpach (XBD) + + + Dollar Oirthear na Cairibe + + + Cearta Speisialta Tarraingthe + + + Aonad Airgeadra Eorpach + + + Franc Ór Francach + + + UIC-Franc Francach + + + CFA Franc BCEAO + + + CFP Franc + + + Airgeadra Anaithnid nó Neamhbhailí + + + Dínear Éimin + + + Rial Éimin + + + Dínear Crua Iúgslavach + + + Noviy Dinar Iúgslavach + + + Dínear Inathraithe Iúgslavach + + + Rand na hAfraice Theas (airgeadúil) + + + Rand na hAfraice Theas + + + Kwacha Saimbiach + + + Zaire Nua Sáíreach + + + Zaire Sáíreach + + + Dollar Siombábach + + + + + + tá:t + níl:n + + + + diff --git a/lib/zend/Zend/Locale/Data/ga_IE.xml b/lib/zend/Zend/Locale/Data/ga_IE.xml new file mode 100644 index 0000000000..6bcdbba68f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ga_IE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/gaa.xml b/lib/zend/Zend/Locale/Data/gaa.xml new file mode 100644 index 0000000000..80fb78310a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gaa.xml @@ -0,0 +1,194 @@ + + + + + + + + + + [a-z] + + + ' + ' + " + " + + + + + + + + Aha + Ofl + Och + Abe + Agb + Otu + Maa + Man + Gbo + Ant + Ale + Afu + + + Aharabata + Oflo + Ochokrikri + Abeibee + Agbeinaa + Otukwadan + Maawe + Manyawale + Gbo + Anton + Alemle + Afuabee + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Ho + Dzu + Dzf + Sho + Soo + Soh + Ho + + + Hogbaa + Dzu + Dzufo + Sho + Soo + Sohaa + Ho + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + LB + SN + + + Dani Jesu + KJ + + + DJ + KJ + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Sidi + + + + diff --git a/lib/zend/Zend/Locale/Data/gaa_GH.xml b/lib/zend/Zend/Locale/Data/gaa_GH.xml new file mode 100644 index 0000000000..a7466c2b0f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gaa_GH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/gez.xml b/lib/zend/Zend/Locale/Data/gez.xml new file mode 100644 index 0000000000..09ed4ca6c9 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gez.xml @@ -0,0 +1,504 @@ + + + + + + + + + + + አፋርኛ + አብሐዚኛ + አፍሪቃንስኛ + አምሐረኛ + ዐርቢኛ + አሳሜዛዊ + አያማርኛ + አዜርባይጃንኛ + ባስኪርኛ + ቤላራሻኛ + ቡልጋሪኛ + ቢሃሪ + ቢስላምኛ + በንጋሊኛ + ትበትንኛ + ብሬቶንኛ + ብሊን + ካታላንኛ + ኮርሲካኛ + ቼክኛ + ወልሽ + ዴኒሽ + ጀርመን + ድዞንግኻኛ + ግሪክኛ + እንግሊዝኛ + ኤስፐራንቶ + ስፓኒሽ + ኤስቶኒአን + ባስክኛ + ፐርሲያኛ + ፊኒሽ + ፊጂኛ + ፋሮኛ + ፈረንሳይኛ + ፍሪስኛ + አይሪሽ + እስኮትስ፡ጌልክኛ + ግዕዝኛ + ጋለጋኛ + ጓራኒኛ + ጉጃርቲኛ + ሃውሳኛ + ዕብራስጥ + ሐንድኛ + ክሮሽያንኛ + ሀንጋሪኛ + አርመናዊ + ኢንቴርሊንጓ + እንዶኒሲኛ + እንተርሊንግወ + እኑፒያቅኛ + አይስላንድኛ + ጣሊያንኛ + እኑክቲቱትኛ + ጃፓንኛ + ጃቫንኛ + ጊዮርጊያን + ካዛክኛ + ካላሊሱትኛ + ክመርኛ + ካናዳኛ + ኮሪያኛ + ካሽሚርኛ + ኩርድሽኛ + ኪርጊዝኛ + ላቲንኛ + ሊንጋላኛ + ላውስኛ + ሊቱአኒያን + ላትቪያን + ማላጋስኛ + ማዮሪኛ + ማከዶኒኛ + ማላያላምኛ + ሞንጎላዊኛ + ሞልዳቫዊና + ማራዚኛ + ማላይኛ + ማልቲስኛ + ቡርማኛ + ናኡሩ + ኔፓሊኛ + ደች + ኖርዌጂያን + ኦኪታንኛ + ኦሮምኛ + ኦሪያኛ + ፓንጃቢኛ + ፖሊሽ + ፑሽቶኛ + ፖርቱጋሊኛ + ኵቿኛ + ሮማንስ + ሩንዲኛ + ሮማኒያን + ራሽኛ + ኪንያርዋንድኛ + ሳንስክሪትኛ + ሲንድሂኛ + ሳንጎኛ + ስንሃልኛ + ሲዳምኛ + ስሎቫክኛ + ስሎቪኛ + ሳሞአኛ + ሾናኛ + ሱማልኛ + ልቤኒኛ + ሰርቢኛ + ስዋቲኛ + ሶዞኛ + ሱዳንኛ + ስዊድንኛ + ስዋሂሊኛ + ታሚልኛ + ተሉጉኛ + ታጂኪኛ + ታይኛ + ትግርኛ + ትግረ + ቱርክመንኛ + ታጋሎገኛ + ጽዋናዊኛ + ቶንጋ + ቱርክኛ + ጾንጋኛ + ታታርኛ + ትዊኛ + ኡዊግሁርኛ + ዩክረኒኛ + ኡርዱኛ + ኡዝበክኛ + ቪትናምኛ + ቮላፑክኛ + ዎሎፍኛ + ዞሳኛ + ይዲሻዊኛ + ዮሩባዊኛ + ዡዋንግኛ + ቻይንኛ + ዙሉኛ + + + + + + አንዶራ + የተባበሩት፡አረብ፡ኤምሬትስ + አልባኒያ + አርሜኒያ + ኔዘርላንድስ፡አንቲልስ + አርጀንቲና + ኦስትሪያ + አውስትሬሊያ + አዘርባጃን + ቦስኒያ፡እና፡ሄርዞጎቪኒያ + ባርቤዶስ + ቤልጄም + ቡልጌሪያ + ባህሬን + ቤርሙዳ + ቦሊቪያ + ብራዚል + ቡህታን + ቤላሩስ + ቤሊዘ + የመካከለኛው፡አፍሪካ፡ሪፐብሊክ + ስዊዘርላንድ + ቺሊ + ካሜሩን + ቻይና + ኮሎምቢያ + ሰርቢያ + ኬፕ፡ቬርዴ + ሳይፕረስ + ቼክ፡ሪፑብሊክ + ጀርመን + ዴንማርክ + ዶሚኒካ + ዶሚኒክ፡ሪፑብሊክ + አልጄሪያ + ኢኳዶር + ኤስቶኒያ + ግብጽ + ምዕራባዊ፡ሳህራ + ኤርትራ + ስፔን + ኢትዮጵያ + ፊንላንድ + ፊጂ + ሚክሮኔዢያ + ፈረንሳይ + እንግሊዝ + ጆርጂያ + የፈረንሳይ፡ጉዊአና + ጋምቢያ + ጊኒ + ኢኳቶሪያል፡ጊኒ + ግሪክ + ቢሳዎ + ጉያና + ሆንግ፡ኮንግ + ክሮኤሽያ + ሀይቲ + ሀንጋሪ + ኢንዶኔዢያ + አየርላንድ + እስራኤል + ህንድ + ኢራቅ + አይስላንድ + ጣሊያን + ጃማይካ + ጆርዳን + ጃፓን + ካምቦዲያ + ኮሞሮስ + ደቡብ፡ኮሪያ + ሰሜን፡ኮሪያ + ክዌት + ሊባኖስ + ሊቱዌኒያ + ላትቪያ + ሊቢያ + ሞሮኮ + ሞልዶቫ + ማከዶኒያ + ሞንጎሊያ + ማካዎ + ሞሪቴኒያ + ማልታ + ማሩሸስ + ሜክሲኮ + ማሌዢያ + ናሚቢያ + ኒው፡ካሌዶኒያ + ናይጄሪያ + ኔዘርላንድ + ኖርዌ + ኔፓል + ኒው፡ዚላንድ + ፔሩ + የፈረንሳይ፡ፖሊኔዢያ + ፓፑዋ፡ኒው፡ጊኒ + ፖላንድ + ፖርታ፡ሪኮ + ሮሜኒያ + ራሺያ + ሳውድአረቢያ + ሱዳን + ስዊድን + ሲንጋፖር + ስሎቬኒያ + ስሎቫኪያ + ሴኔጋል + ሱማሌ + ሲሪያ + ቻድ + የፈረንሳይ፡ደቡባዊ፡ግዛቶች + ታይላንድ + ታጃኪስታን + ምስራቅ፡ቲሞር + ቱኒዚያ + ቱርክ + ትሪኒዳድ፡እና፡ቶባጎ + ታንዛኒያ + ዩጋንዳ + አሜሪካ + ዩዝበኪስታን + ቬንዙዌላ + የእንግሊዝ፡ድንግል፡ደሴቶች + የአሜሪካ፡ቨርጂን፡ደሴቶች + የመን + ደቡብ፡አፍሪካ + ዛምቢያ + + + + [\u135F ᎐-᎙ ሀ-ሆ ለ-ሎ ሐ-ሖ መ-ሞ ሠ-ሦ ረ-ሮ ሰ-ሶ ቀ-ቆ ቈ ቊ-ቍ በ-ቦ ተ-ቶ ኀ-ኆ ኈ ኊ-ኍ ነ-ኖ አ-ኦ ከ-ኮ ኰ ኲ-ኵ ወ-ዎ ዐ-ዖ ዘ-ዞ የ-ዮ ደ-ዶ ገ-ጎ ጐ ጒ-ጕ ጠ-ጦ ጰ-ጶ ጸ-ጾ ፀ-ፆ ፈ-ፎ ፐ-ፖ] + [ሇ ሏ ⶀ ሗ ሟ ᎀ-ᎃ ⶁ ሧ ሯ ⶂ ሷ ⶃ ሸ-ሿ ⶄ ቇ ቐ-ቖ ቘ ቚ-ቝ ቧ ᎄ-ᎇ ⶅ ቮ ቯ ቷ ⶆ ቿ ⶇ ኇ ኗ ⶈ ኟ ⶉ ኧ ⶊ ኯ ኸ-ኾ ዀ ዂ-ዅ ዏ ዟ ⶋ ዠ-ዧ ዷ ⶌ ዸ-ዿ ⶍ ጀ-ጇ ⶎ ጏ ጘ-ጟ ⶓ-ⶖ ጧ ⶏ ጨ-ጯ ⶐ ጷ ⶑ ጿ ፇ ፏ ᎈ-ᎋ ፗ ᎌ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ጠሐረ + ከተተ + መገበ + አኀዘ + ግንባ + ሠንየ + ሐመለ + ነሐሰ + ከረመ + ጠቀመ + ኀደረ + ኀሠሠ + + + ጠሐረ + ከተተ + መገበ + አኀዘ + ግንባት + ሠንየ + ሐመለ + ነሐሰ + ከረመ + ጠቀመ + ኀደረ + ኀሠሠ + + + + + ጠ + ከ + መ + አ + ግ + ሠ + ሐ + ነ + ከ + ጠ + ኀ + ኀ + + + + + + + እኁድ + ሰኑይ + ሠሉስ + ራብዕ + ሐሙስ + ዓርበ + ቀዳሚ + + + እኁድ + ሰኑይ + ሠሉስ + ራብዕ + ሐሙስ + ዓርበ + ቀዳሚት + + + + + እ + ሰ + ሠ + ራ + ሐ + ዓ + ቀ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ጽባሕ + ምሴት + + + ዓ/ዓ + ዓ/ም + + + + + + EEEE፥ dd MMMM መዓልት y G + + + + + dd MMMM y + + + + + dd-MMM-y + + + + + dd/MM/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + ወ + + + + + ¤#,##0.00 + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + + + የኢትዮጵያ ብር + + + አውሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + + + + + diff --git a/lib/zend/Zend/Locale/Data/gez_ER.xml b/lib/zend/Zend/Locale/Data/gez_ER.xml new file mode 100644 index 0000000000..1ec07bf80c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gez_ER.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/gez_ET.xml b/lib/zend/Zend/Locale/Data/gez_ET.xml new file mode 100644 index 0000000000..65eb69eac1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gez_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/gl.xml b/lib/zend/Zend/Locale/Data/gl.xml new file mode 100644 index 0000000000..b363e72b04 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gl.xml @@ -0,0 +1,1361 @@ + + + + + + + + + + + {0} ({1}) + , + + + Afrikaans + Lingua afro-asiática + Lingua algonquina + Amárico + Aragonés + Lingua apache + Árabe + Arameo + Lingua artificial + Assamés + Asturiano + Lingua australiana + Azerbaiano + Lingua báltica + Bielorruso + Búlgaro + Bihariano + Bengalí + Bretón + Bosnio + Catalán + Lingua india centroamericana + Lingua caucásica + Lingua céltica + Checo + Eslavo eclesiástico + Galés + Dinamarqués + Alemán + Alemán de Austria + Alemán suízo + Exipcio antigo + Grego + Inglés + Inglés australiano + Inglés canadiano + Inglés británico + Inglés americano + Esperanto + Español + Español latinoamericano + Castelán + Estoniano + Éuscaro + Persa + Finés + Filipino + Lingua finno-úgrica + Faroés + Francés + Francés canadiano + Francés suízo + Frisón + Irlandés + Gaélico escocés + Lingua xermánica + galego + Guaraní + Grego antigo + Guxaratiano + Hebreo + Hindi + Croata + Húngaro + Armenio + Interlingua + Indonesio + Lingua índica + Lingua indoeuropea + Islandés + Italiano + Xaponés + Xavanés + Xeorxiano + Cambodiano + Kannada + Coreano + Kurdo + Kyrgiz + Latín + Lingala + Laotiano + Lituano + Letón + Lingua miscelánea + Macedonio + Malaialam + Mongol + Marathi + Malaio + Maltés + Varias linguas + Lingua india norteamericana + Noruegués Bokmal + Nepalí + Holandés + Flamenco + Noruegués nynorsk + Noruegués + Lingua nubia + Occitano + Orissa + Punjabi + Lingua filipina + Polaco + Pashto + Portugués + Portugués brasileiro + Portugués ibérico + Romanés + Lingua románica + Ruso + Sánscrito + Lingua india sudamericana + Sindhi + Lingua semita + Lingua de signos + Serbocroata + Sinhalés + Eslovaco + Esloveno + Lingua eslávica + Somalí + Albanés + Serbio + Lingua do Nilo-Sáhara + Sesotho + Sondanés + Sueco + Suaxili + Tamil + Telugu + Tailandés + Tigriña + Tagalo + Clingon + Turco + Lingua altaica + Twi + Uighur + Ucraíno + Lingua descoñecida ou non válida + Urdú + Uzbeco + Vietnamita + Xhosa + Yiddish + Chinés + Chinés simplificado + Chinés tradicional + Zulú + Sen contido lingüístico + + + + + + + + + + + + + + Mundo + África + Norteamérica + Sudamérica + Oceanía + África Occidental + América Central + África Oriental + África Septentrional + África Central + África Meridional + América + América do Norte + Caribe + Asia Oriental + Sul de Asia + Sureste Asiático + Europa Meridional + Australia e Nova Celandia + Melanesia + Rexión da Micronesia + Polinesia + Asia do Sul-Centro + Asia + Asia Central + Asia Occidental + Europa + Europa do Leste + Europa Septentrional + Europa Occidental + Comunidade de Estados Independentes + América Latina e o Caribe + Andorra + Emiratos Árabes Unidos + Afganistán + Antiga e Barbuda + Anguila + Albania + Armenia + Antillas Holandesas + Angola + Antártida + Arxentina + Samoa Americana + Austria + Australia + Aruba + Illas Aland + Acerbaixán + Bosnia e Hercegovina + Barbados + Bangladesh + Bélxica + Burkina Faso + Bulgaria + Bahrein + Burundi + Benin + San Bartolomé + Bermudas + Brunei + Bolivia + Brasil + Bahamas + Bután + Illa Bouvet + Botsuana + Bielorrusia + Belice + Canadá + Illas Cocos + República Democrática do Congo + República Africana Central + Congo + Suíza + Costa de Marfil + Illas Cook + Chile + Camerún + China + Colombia + Costa Rica + Serbia e Montenegro + Cuba + Cabo Verde + Illa Christmas + Chipre + República Checa + Alemaña + Xibuti + Dinamarca + Dominica + República Dominicana + Arxelia + Ecuador + Estonia + Exipto + Sahara Occidental + Eritrea + España + Etiopía + Finlandia + Fixi + Illas Malvinas + Micronesia + Illas Feroe + Francia + Gabón + Reino Unido + Granada + Xeorxia + Güiana Francesa + Guernsey + Gana + Xibraltar + Grenlandia + Gambia + Guinea + Guadalupe + Guinea Ecuatorial + Grecia + Xeorxia do Sur e Illas Sandwich + Guatemala + Guam + Guinea-Bissau + Güiana + Hong Kong RAE de China + Illa Heard e Illas McDonald + Honduras + Croacia + Haití + Hungría + Indonesia + Irlanda + Israel + Illa de Man + India + Territorio Británico do Océano Índico + Iraq + Irán + Islandia + Italia + Jersey + Xamaica + Xordania + Xapón + Quenia + Quirguicistán + Cambodia + Kiribati + Comores + San Cristovo e Nevis + Corea do Norte + Corea do Sur + Kuwait + Illas Caimán + Kazakhstan + Laos + Líbano + Santa Lucía + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Luxemburgo + Letonia + Libia + Marrocos + Mónaco + Moldova + Montenegro + San Martiño + Madagascar + Illas Marshall + Macedonia + Mali + Myanmar + Mongolia + Macau RAE de China + Illas Marianas do norte + Martinica + Mauritania + Montserrat + Malta + Mauricio + Maldivas + Malaui + México + Malaisia + Mozambique + Namibia + Nova Caledonia + Níxer + Illa Norfolk + Nixeria + Nicaragua + Países Baixos + Noruega + Nepal + Nauru + Niue + Nova Celandia + Omán + Panamá + Perú + Polinesia Francesa + Papúa Nova Guinea + Filipinas + Paquistán + Polonia + San Pedro e Miguelón + Pitcairn + Porto Rico + Palestina + Portugal + Palau + Paraguai + Qatar + Oceanía Distante + Unión Europea + Reunión + Romanía + Serbia + Rusia + Ruanda + Arabia Saudita + Illas Salomón + Seixeles + Sudán + Suecia + Singapur + Santa Helena + Eslovenia + Svalbard e Jan Mayen + Eslovaquia + Serra Leoa + San Marino + Senegal + Somalia + Surinam + Santo Tomé e Príncipe + El Salvador + Siria + Suacilandia + Illas Turks e Caicos + Xad + Territorios Franceses do Sul + Togo + Tailandia + Taxiquistán + Tokelau + Timor Leste + Turkmenistán + Tunisia + Tonga + Turquía + Trindade e Tobago + Tuvalu + Taiwán + Tanzania + Ucraína + Uganda + Illas Menores Distantes dos EUA. + Estados Unidos de América + Uruguai + Uzbekistán + Cidade do Vaticano + San Vicente e Granadinas + Venezuela + Illas Virxes Británicas + Illas Virxes Estadounidenses + Vietnam + Vanuatu + Wallis e Futuna + Samoa + Iemen + Mayotte + Sudáfrica + Zambia + Cimbabue + rexión descoñecida ou non válida + + + calendario + orde alfabética + moeda + + + orde chinesa tradicional - Big5 + calendario budista + calendario chinés + orde alfabética directa + orde chinesa simplificada - GB2312 + calendario gregoriano + calendario hebreo + calendario islámico + calendario islámico civil + calendario xaponés + orde da guía telefónica + orde pinyin + orde polo número de trazos + orde tradicional + + + americano + métrico decimal + + + Idioma: {0} + Alfabeto: {0} + Rexión: {0} + + + + [a á b-e é f-i í j-n ñ o ó p-u ú ü v-z] + [ª à â ä ã ç è ê-ì î ï º ò ô ö õ ù û] + [a-z] + + + “ + ” + ‘ + ’ + + + + + + + + Xan + Feb + Mar + Abr + Mai + Xuñ + Xul + Ago + Set + Out + Nov + Dec + + + Xaneiro + Febreiro + Marzo + Abril + Maio + Xuño + Xullo + Agosto + Setembro + Outubro + Novembro + Decembro + + + + + X + F + M + A + M + X + X + A + S + O + N + D + + + + + + + Dom + Lun + Mar + Mér + Xov + Ven + Sáb + + + Domingo + Luns + Martes + Mércores + Xoves + Venres + Sábado + + + + + D + L + M + M + X + V + S + + + + + + + T1 + T2 + T3 + T4 + + + 1o trimestre + 2o trimestre + 3o trimestre + 4o trimestre + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + antes de Cristo + despois de Cristo + + + a.C. + d.C. + + + + + + EEEE dd MMMM y + + + + + dd MMMM y + + + + + d MMM, y + + + + + dd/MM/yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + L + E, d-M + LLL + E d MMM + E d MMMM + d MMMM + dd MMMM + d MMM + dd/MM + d-M + d + mm:ss + y + M-yyyy + EEE, d-M-yyyy + MMM y + EEE, d MMM y + MMMM y + Q yyyy + QQQ y + MM/yy + Q yy + MMMM y + + + + + Era + + + Ano + + + Mes + + + Semana + + + Día + trasantonte + antonte + onte + hoxe + mañá + pasadomañá + + + Día da semana + + + Hora + + + Minuto + + + Segundo + + + Fuso horario + + + + + + +HH:mm;-HH:mm + GMT{0} + Hora de {0} + {1} ({0}) + + Descoñecido + + + Anguila + + + Polo Sul + + + Dumont-d'Urville + + + Río Gallegos + + + Tucumán + + + Córdoba + + + Bos Aires + + + Bermudas + + + Belém + + + São Paulo + + + Maceió + + + Belice + + + St Johns + + + Illa de Pascua + + + Cabo Verde + + + Xubuti + + + Illas Galápagos + + + Illas Canarias + + + Fidxi + + + París + + + Granada + + + Xibraltar + + + Guadalupe + + + Güiana + + + Iacarta + + + Xamaica + + + Luxemburgo + + + Mónaco + + + Ulan Bator + + + Martinica + + + Mauricio + + + Maldivas + + + Mazatlán + + + Monterrei + + + Cidade de México + + + Mérida + + + Cancún + + + Panamá + + + Porto Rico + + + Reunión + + + Kaliningrado + + + Moscova + + + Volgogrado + + + Ecaterinburgo + + + Singapur + + + O Salvador + + + Honolulú + + + New Salem + + + Central + + + Vincennes + + + Petersburg + + + Tell City + + + Knox + + + Winamac + + + Marengo + + + Vevay + + + Monticello + + + Samarcanda + + + + horario europeo central + horario de verán europeo central + + + + + horario europeo oriental + horario de verán europeo oriental + + + + + horario europeo occidental + horario de verán europeo occidental + + + + + horario medio de Greenwich + + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + peseta andorrana + peseta andorrana + pesetas andorranas + + + Peso arxentino (1983-1985) + peso arxentino (ARP) + pesos arxentinos (ARP) + + + Peso arxentino + peso arxentino + pesos arxentinos + + + Franco belga (convertible) + franco belga (convertible) + francos belgas (convertibles) + + + Franco belga + franco belga + francos belgas + + + Franco belga (financeiro) + franco belga (financeiro) + francos belgas (financeiros) + + + Boliviano + boliviano + bolivianos + + + Peso boliviano + peso boliviano + pesos bolivianos + + + MVDOL boliviano + + + Cruzeiro novo brasileiro (1967-1986) + cruzeiro novo brasileiro + cruzeiros novos brasileiros + + + Cruzado brasileiro + cruzado brasileiro + cruzados brasileiros + + + Cruzeiro brasileiro (1990-1993) + cruzeiro brasileiro (BRE) + cruzeiros brasileiros (BRE) + + + Real brasileiro + real brasileiro + reais brasileiros + + + Cruzado novo brasileiro + cruzado novo brasileiro + cruzados novos brasileiros + + + Cruzeiro brasileiro + cruzeiro brasileiro + cruzeiros brasileiros + + + Dólar canadiano + + + Franco suizo + + + Unidades de fomento chilenas + unidade de fomento chilena + unidades de fomento chilenas + + + Peso chileno + peso chileno + pesos chilenos + + + Iuan renminbi chinés + iuán chinés + iuáns chineses + + + Peso colombiano + peso colombiano + pesos colombianos + + + Colón costarricense + colón costarricense + colóns costarricenses + + + Peso cubano + peso cubano + pesos cubanos + + + Marco alemán + marco alemán + marcos alemáns + + + Coroa dinamarquesa + + + Peso dominicano + peso dominicano + pesos dominicanos + + + Sucre ecuatoriano + sucre ecuatoriano + sucres ecuatorianos + + + Unidade de valor constante ecuatoriana + + + Peseta española (conta A) + + + Peseta española (conta convertible) + + + #,##0 ¤;-#,##0 ¤ + Peseta española + peseta + pesetas + ₧ + , + . + + + Euro + euro + euros + + + Franco francés + franco francés + francos franceses + + + Libra esterlina + libra esterlina + libras esterlinas + + + Libra de Xibraltar + libra xibraltareña + libras xibraltareñas + + + Franco guineano + + + Syli guineano + + + Ekwele guineana + + + Dracma grego + + + Quetzal guatemalteco + + + Lempira hondureño + + + Florín húngaro + + + Libra irlandesa + libra irlandesa + libras irlandesas + + + Rupia india + + + Coroa islandesa + + + Lira italiana + + + Ien xaponés + + + Franco convertible luxemburgués + + + Franco luxemburgués + + + Franco financeiro luxemburgués + + + Dirham marroquí + + + Franco marroquí + + + Peso mexicano + peso mexicano + pesos mexicanos + + + Peso de prata mexicano (1861-1992) + + + Unidade de inversión mexicana + + + Córdoba nicaragüense + + + Córdoba de ouro nicaragüense + + + Florín holandés + + + Coroa norueguesa + + + Balboa panameño + + + Inti peruano + + + Sol novo peruano + + + Sol peruano + + + Peso filipino + + + Escudo portugués + escudo portugués + escudos portugueses + + + Guaraní paraguaio + guaraní do paraguai + guaranís do paraguai + + + Rublo ruso + rublo ruso + rublos rusos + + + Rublo ruso (1991-1998) + + + Coroa sueca + + + Rublo soviético + rublo soviético + rublos soviéticos + + + Colón salvadoreño + colón salvadoreño + colóns salvadoreños + + + Dólar estadounidense + dólar estadounidense + dólares estadounidenses + + + Peso en unidades indexadas uruguaio + + + Peso uruguaio (1975-1993) + + + Peso uruguaio + peso uruguaio + pesos uruguaios + + + Bolívar venezolano + bolívar venezolano + bolívares venezolanos + + + Bolívar forte venezolano + bolívar forte venezolano + bolívares fortes venezolanos + + + Prata + + + Ouro + + + Paladio + + + Platino + + + Unidade monetaria descoñecida ou non válida + unidade monetaria descoñecida ou non válida + unidades monetarias descoñecidas ou non válidas + + + Rand sudafricano + + + + + + {0} día + {0} días + + + {0} hora + {0} horas + + + {0} minuto + {0} minutos + + + {0} mes + {0} meses + + + {0} segundo + {0} segundos + + + {0} semana + {0} semanas + + + {0} ano + {0} anos + + + + + si:s + non:n + + + diff --git a/lib/zend/Zend/Locale/Data/gl_ES.xml b/lib/zend/Zend/Locale/Data/gl_ES.xml new file mode 100644 index 0000000000..b7e7bb461f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gl_ES.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/gsw.xml b/lib/zend/Zend/Locale/Data/gsw.xml new file mode 100644 index 0000000000..12a123df18 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gsw.xml @@ -0,0 +1,2920 @@ + + + + + + + + + de_CH + + + {0} ({1}) + , + + + Afar + Abchasisch + Aceh + Acholi + Adangme + Adygai + Avestisch + Afrikaans + Afro-Asiatischi Schpraach + Afrihili + Ainu + Akan + Akkadisch + Aleutisch + Algonkin-Schpraach + Süüd-Altaisch + Amharisch + Aragonesisch + Altänglisch + Angika + Apache-Schpraach + Arabisch + Aramääisch + Araukanisch + Arapaho + Künschtlichi Schpraach + Arawak + Assamesisch + Aschturianisch + Athapaskischi Schpraach + Auschtralischi Schpraach + Awarisch + Awadhi + Aymara + Aserbaidschanisch + Baschkirisch + Banda + Bamileke + Belutschisch + Balinesisch + Basaa + Baltischi Schpraach + Wiissrussisch + Bedauye + Bemba + Bärberisch + Bulgaarisch + Bihaarisch + Bhodschpuri + Bislama + Bikolisch + Bini + Blackfoot-Schpraach + Bambara + Bengalisch + Bantu + Tibeetisch + Brötoonisch + Braj-Bhakha + Bosnisch + Batak + Burjatisch + Bugineesisch + Blin + Katalaanisch + Caddo + Zentralamerikanischi Indianerschpraach + Kariibisch + Kaukaasisch + Atsam + Tschetscheenisch + Cebuano + Keltischi Schpraach + Chamorro + Tschibtscha + Tschagataisch + Trukesisch + Tscheremissisch + Chinook + Choctaw + Chipewyan + Cherokee + Cheyenne + Chamischi Schpraach + Korsisch + Koptisch + Änglisch-basierts Kreol oder Pidgin + Französisch-basierts Kreol oder Pidgin + Portugiesisch-basierts Kreol oder Pidgin + Cree + Krimtatarisch + Kreol oder Pidgin + Tschechisch + Kaschubisch + Chileslawisch + Kuschitischi Schpraach + Tschuwaschisch + Walisisch + Tänisch + Takota + Targiinisch + Tajakisch + Tüütsch + Öschtriichischs Tüütsch + Schwiizer Hochtüütsch + Delaware-Schpraach + Slavey + Togrib + Tinka + Togri + Trawidischi Schpraach + Nidersorbisch + Tuala + Mittelniderländisch + Malediivisch + Tiula + Dschongkha + Ewe + Efikisch + Altägyptisch + Ekajuk + Griechisch + Elamisch + Änglisch + Auschtralischs Änglisch + Kanadischs Änglisch + Britischs Änglisch + Amerikanischs Änglisch + Mittelänglisch + Eschperanto + Schpanisch + Latiinamerikanischs Schpanisch + Ibeerischs Schpanisch + Eestnisch + Baskisch + Ewondo + Persisch + Pangwe-Schpraach + Fanti-Schpraach + Ful + Finnisch + Filipino + Finno-ugrischi Schpraach + Fidschianisch + Färöisch + Fon + Französisch + Kanadischs Französisch + Schwiizer Französisch + Mittelfranzösisch + Altfranzösisch + Nordfriesisch + Oschtfriesisch + Friulisch + Friesisch + Iirisch + Ga + Gayo + Gbaya + Schottisch-Gäälisch + Germanischi Schpraach + Geez + Gilbertesisch + Galizisch + Mittelhochtüütsch + Guarani + Althochtüütsch + Gondi + Mongondou + Gotisch + Grebo + Altgriechisch + Schwiizertüütsch + Gujarati + Manx-Gäälisch + Kutchinisch + Haussa + Haida + Hawaiianisch + Hebräisch + Hindi + Hiligaynonisch + Himatschalisch + Hethitisch + Miao + Hiri-Motu + Kroazisch + Obersorbisch + Haitisch + Ungarisch + Hupa + Armenisch + Herero + Interlingua + Ibanisch + Indonesisch + Interlingue + Igbo + Sezuanischs Yi + Ijo + Inupiak + Ilokano + Indoarischi Schpraach + Indogermanischi Schpraach + Inguschisch + Ido + Iranischi Schpraach + Irokesischi Schpraach + Iisländisch + Italiänisch + Inukitut + Japanisch + Lojbanisch + Jüüdisch-Persisch + Jüüdisch-Arabisch + Javanisch + Georgisch + Karakalpakisch + Kabylisch + Kachin-Schpraach + Jju + Kamba + Karenisch + Kawi + Kabardinisch + Tyap + Koro + Kongolesisch + Khasisch + Khoisanisch + Sakisch + Kikuyu-Schpraach + Kwanyama + Kasachisch + Gröönländisch + Kambodschanisch + Kimbundu-Schpraach + Kannada + Koreaanisch + Konkani + Kosraeanisch + Kpelle-Schpraach + Kanuri-Schpraach + Karatschaiisch-Balkarisch + Karelisch + Kru-Schpraach + Oraon-Schpraach + Kaschmirisch + Kurdisch + Kumükisch + Kutenai-Schpraach + Komi-Schpraach + Kornisch + Kirgiisisch + Latiin + Ladino + Lahndanisch + Lambanisch + Luxemburgisch + Lesgisch + Ganda-Schpraach + Limburgisch + Lingala + Laozisch + Mongo + Rotse-Schpraach + Litauisch + Luba + Luba-Lulua + Luiseno-Schpraach + Lunda-Schpraach + Luo-Schpraach + Lushai-Schpraach + Lettisch + Maduresisch + Khotta + Maithili + Makassarisch + Manding-Schpraach + Auschtroneesischi Schpraach + Massai-Schpraach + Mokschamordwinisch + Mandaresisch + Mende-Schpraach + Madagassisch + Mittelirisch + Marschallesisch + Maori + Micmac-Schpraach + Minangkabau-Schpraach + Anderi Schpraach + Mazedonisch + Mon-Khmer-Schpraach + Malayalam + Mongolisch + Mandschurisch + Meithei-Schpraach + Manobo-Schpraach + Moldawisch + Mohawk-Schpraach + Mossi-Schpraach + Marathi + Malaiisch + Maltesisch + Mehrschpraachig + Munda-Schpraach + Muskogee-Schpraach + Mirandesisch + Marwarisch + Birmanisch + Maya-Schpraach + Erzya + Nauruisch + Nahuatl + Nordamerikanischi Indianersprach + Neapolitanisch + Norwegisch Bokmål + Nord-Ndebele-Schpraach + Nidertüütsch + Nepalesisch + Newarisch + Ndonga + Nias-Schpraach + Nigerkordofanischi Schpraach + Niue-Schpraach + Niderländisch + Fläämisch + Norwegisch Nynorsk + Norwegisch + Nogaisch + Altnordisch + N’Ko + Süüd-Ndebele-Schpraach + Nord-Sotho-Schpraach + Nubischi Schpraach + Navajo-Schpraach + Alt-Newari + Chewa-Schpraach + Nyamwezi-Schpraach + Nyankole + Nyoro + Nzima + Okzitanisch + Ojibwa-Schpraach + Oromo + Orija + Ossezisch + Osage-Schpraach + Osmanisch + Otomangue-Schpraach + Pandschabisch + Papua-Schpraach + Pangasinanisch + Mittelpersisch + Pampanggan-Schpraach + Papiamento + Palau + Altpersisch + Philippine-Austronesischi Schpraach + Phönikisch + Pali + Polnisch + Ponapeanisch + Prakrit + Altprovenzalisch + Paschtu + Portugiisisch + Brasilianischs Portugiisisch + Iberischs Portugiisisch + Quechua + Rajasthani + Oschterinsel-Schpraach + Rarotonganisch + Rätoromanisch + Rundi-Schpraach + Rumänisch + Romanischi Schpraach + Zigüünerschpraach + Root + Russisch + Aromunisch + Ruandisch + Sanschkrit + Sandawe-Schpraach + Jakutisch + Süüdamerikanischi Indianerschpraach + Salish-Schpraach + Samaritanisch + Sasak + Santali + Sardisch + Sizilianisch + Schottisch + Sindhi + Nord-Samisch + Selkupisch + Semitischi Schpraach + Sango + Altirisch + Gebäärdeschpraach + Serbo-Kroatisch + Schan-Schpraach + Singhalesisch + Sidamo + Sioux-Schpraach + Sinotibetischi Schpraach + Slowakisch + Slowenisch + Slawischi Schpraach + Samoanisch + Süüd-Samisch + Samisch + Lule-Samisch + Inari-Samisch + Skolt-Samisch + Schhona + Soninke-Schpraach + Somali + Sogdisch + Songhai-Schpraach + Albanisch + Serbisch + Srananisch + Serer-Schpraach + Swazi + Nilosaharanischi Schpraach + Süüd-Sotho-Schpraach + Sundanesisch + Sukuma-Schpraach + Susu + Sumerisch + Schwedisch + Suaheli + Altsyrisch + Syrisch + Tamilisch + Thaischpraache + Telugu + Temne + Tereno-Schpraach + Tetum-Schpraach + Tadschikisch + Thailändisch + Tigrinja + Tigre + Tiv-Schpraach + Turkmenisch + Tokelauanisch + Tagalog + Klingonisch + Tlingit-Schpraach + Tamaseq + Tswana-Schpraach + Tongaisch + Tsonga-Schpraach + Neumelanesisch + Türkisch + Tsonga + Tsimshian-Schpraach + Tatarisch + Tumbuka-Schpraach + Tupi-Schpraache + Altaischi Schpraachä + Elliceanisch + Twi + Tahitisch + Tuwinisch + Udmurtisch + Uigurisch + Ugaritisch + Ukrainisch + Mbundu-Schpraach + Unbeschtimmti Schpraach + Urdu + Usbekisch + Vai-Schpraach + Venda-Schpraach + Vietnamesisch + Volapük + Wotisch + Wallonisch + Wakashanisch + Walamo-Schpraach + Waray + Washo-Schpraach + Sorbisch + Wolof + Kalmückisch + Xhosa + Yao-Schpraach + Yapesisch + Jiddisch + Yoruba + Yupik-Schpraach + Zhuang + Zapotekisch + Bliss-Symbool + Zenaga + Chineesisch + Veräifachts Chineesisch + Tradizionells Chineesisch + Zande-Schpraach + Zulu + Zuni-Schpraach + Kän schpraachliche Inhalt + Zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wält + Afrika + Nordameerika + Süüdameerika + Ozeaanie + Weschtafrika + Mittelameerika + Oschtafrika + Nordafrika + Zentraalafrika + Süüdlichs Afrika + Nord-, Mittel- und Süüdameerika + Nördlichs Ameerika + Karibik + Oschtaasie + Süüdaasie + Süüdoschtaasie + Süüdeuropa + Auschtraalie und Nöiseeland + Melaneesie + Mikroneesischs Inselgebiet + Polineesie + Süüd-Zentraalaasie + Aasie + Zentraalaasie + Weschtaasie + Euroopa + Oschteuroopa + Nordeuroopa + Weschteuroopa + Gmäinschaft vo Unabhängige Schtaate + Latiinameerika und Karibik + Kanaalinsle + Andorra + Veräinigti Arabischi Emiräät + Afganischtan + Antigua und Barbuda + Anguilla + Albaanie + Armeenie + Niderländischi Antille + Angoola + Antarktis + Argentiinie + Amerikaanisch-Samoa + Ööschtriich + Auschtraalie + Aruba + Aaland-Insle + Aserbäidschan + Bosnie und Herzegowina + Barbados + Bangladesch + Belgie + Burkina Faaso + Bulgaarie + Bachräin + Burundi + Benin + St. Barthelemi + Bermuuda + Brunäi Tarussalam + Boliivie + Brasilie + Bahaamas + Bhutan + Bouvet-Insle + Botswana + Wiissrussland + Belize + Kanada + Kokos-Insle + Temokraatischi Republik Kongo + Zentraalafrikaanischi Republik + Kongo + Schwiiz + Elfebäiküschte + Cook-Insle + Tschile + Kamerun + Chiina + Kolumbie + Coschta Rica + Särbie und Monteneegro + Kuba + Kap Verde + Wienachts-Insle + Tsüpere + Tschechischi Republik + Tüütschland + Tschibuuti + Tänemark + Tominica + Tominikaanischi Republik + Algeerie + Ecuador + Eestland + Ägüpte + Weschtsahara + Äritreea + Schpanie + Äzioopie + Finnland + Fitschi + Falkland-Insle + Mikroneesie + Färöer + Frankriich + Gabun + Veräinigts Chönigriich + Grenada + Geoorgie + Französisch-Guäjaana + Gäärnsi + Gaana + Gibraltar + Gröönland + Gambia + Gineea + Guadälup + Äquatoriaalgineea + Griecheland + Süüdgeorgie und d’süüdlichi Sändwitsch-Insle + Guatemaala + Guam + Gineea-Bissau + Guäjaana + Sonderverwaltigszone Hongkong + Höörd- und MäcDonald-Insle + Honduras + Kroaazie + Haiti + Ungarn + Indoneesie + Irland + Israel + Insle vo Män + Indie + Britischs Territoorium im Indische Oozean + Iraak + Iraan + Iisland + Itaalie + Dschörsi + Dschamäika + Jordaanie + Japan + Keenia + Kirgiisischtan + Kambodscha + Kiribaati + Komoore + St. Kitts und Niuwis + Demokraatischi Volksrepublik Koreea + Republik Koreea + Kuwäit + Käimän-Insle + Kasachschtan + Laaos + Libanon + Sankta Lutschiia + Liächteschtäi + Schri Lanka + Libeeria + Lesooto + Littaue + Luxemburg + Lettland + Lüübie + Marokko + Monaco + Republik Moldau + Monteneegro + St. Martin + Madagaschkar + Marshallinsle + Mazedoonie + Maali + Müanmar + Mongolei + Sonderverwaltigszone Macao + Nördlichi Mariaane + Martinigg + Mauretaanie + Moosörrat + Malta + Mauriizius + Malediiwe + Malaawi + Mexiko + Malaisia + Mosambik + Namiibia + Nöikaledoonie + Niger + Norfolk-Insle + Nigeeria + Nicaraagua + Niderland + Norweege + Neepal + Nauru + Niue + Nöiseeland + Omaan + Panama + Peru + Französisch-Polineesie + Papua-Neuguinea + Philippiine + Pakischtan + Poole + St. Pierr und Miggelo + Pitggäärn + Puerto Riggo + Paläschtinänsischi Gebiet + Portugal + Palau + Paraguai + Ggatar + Üssers Ozeaanie + Europääischi Unioon + Reünioon + Rumäänie + Särbie + Russischi Föderazioon + Ruanda + Saudi-Araabie + Salomoone + Seischälle + Sudan + Schweede + Singapuur + St. Helena + Sloweenie + Svalbard und Jaan Määie + Slowakäi + Sierra Leoone + San Mariino + Senegal + Somaalia + Surinam + Sao Tome und Prinssipe + El Salvador + Süürie + Swasiland + Törks- und Gaiggos-Insle + Tschad + Französischi Süüd- und Antarktisgebiet + Toogo + Thailand + Tadschikischtan + Tokelau + Oschttimor + Turkmeenischtan + Tuneesie + Tonga + Türggei + Trinidad und Tobaago + Tuvalu + Taiwan + Tansaniia + Ukraiine + Uganda + Amerikanisch-Ozeaanie + Veräinigti Schtaate + Uruguay + Uschbeekischtan + Vatikanstadt + Sankt Wässä und d’Grönadiine + Venezueela + Britischi Jungfere-Insle + Amerikaanischi Jungfere-Insle + Wietnam + Wanuatu + Wallis und Futuuna + Samooa + Jeeme + Majott + Süüdafrika + Sambia + Simbabwe + Unbekannti oder ungültigi Regioon + + + Alti tüütschi Rächtschriibig + Schtandardisierti Resianischi Rächtschriibig + Nööi tüütschi Rächtschriibig + Schpaats Mittelfranzösisch + Oschtarmeenisch + Weschtarmeenisch + Äinheitlichs Türggischs Alfabeet + Bela-Tialäkt + Boontling + Foneetisch (IPA) + Foneetisch (UPA) + Lipowaz-Mundart + Monotonisch + Natisone-Mundart + Njiva-Mundart + Osojane-Mundart + Politonisch + Posix + Nööi Rächtschriibig + Resianisch + Saho + Schottischs Schtandardänglisch + Scouse-Mundart + Solbica-Mundart + Taraskievica-Rächtschriibig + + + Kaländer + Sortiirig + Wäährig + + + Tradizionells Chineesisch - Big5 + Buddhischtisch Kaländer + Chineesisch Kaländer + Diräkti Sortiir-Regle + Veräifachts Chineesisch - GB2312 + Gregoriaanisch Kaländer + Hebrääisch Kaländer + Indisch Nationaalkaländer + Islaamisch Kaländer + Bürgerlich islaamisch Kaländer + Japaanisch Kaländer + Telifonbuech-Sortiirregle + Pinyin-Sortiirregle + Kaländer vor Republik Chiina + Strichfolg + Tradizionelli Sortiir-Regle + + + angloamerikaanisch + metrisch + + + Schpraach: {0} + Schrift: {0} + Regioon: {0} + + + + titlecase-words + titlecase-words + titlecase-words + titlecase-words + titlecase-words + titlecase-words + + + [a ä b-o ö p-u ü v-z] + [á à ă â å ä ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ß ú ù ŭ û ü ū ÿ] + [a-z] + + + « + » + ‹ + › + + + + + vorm. + nam. + + + + EEEE d. MMMM y G + + + + + d. MMMM y G + + + + + d. MMM y G + + + + + d.M.yyyy + + + + + + vorm. + nam. + + + vorm. + nam. + + + + + + Jan + Feb + Mär + Apr + Mai + Jun + Jul + Aug + Sep + Okt + Nov + Dez + + + Januar + Februar + März + April + Mai + Juni + Juli + Auguscht + Septämber + Oktoober + Novämber + Dezämber + + + + + Mär + Jul + Aug + Sep + Okt + Nov + Dez + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + Su. + Mä. + Zi. + Mi. + Du. + Fr. + Sa. + + + Sunntig + Määntig + Ziischtig + Mittwuch + Dunschtig + Friitig + Samschtig + + + + + S + M + D + M + D + F + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1. Quartal + 2. Quartal + 3. Quartal + 4. Quartal + + + + + 1 + 2 + 3 + 4 + + + + vorm. + nam. + + + v. Chr. + n. Chr. + + + v. Chr. + n. Chr. + + + + + + EEEE, d. MMMM y + + + + + d. MMMM y + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + E d. + H + HH:mm + HH:mm:ss + H:mm + L + E, d.M. + LLL + E d. MMM + E d. MMMM + d. MMMM + dd. MMMM + d. MMM + d.MM. + dd.MM. + d.M. + d + mm:ss + mm:ss + y + yyyy-M + EEE, yyyy-M-d + MMM y + EEE, d. MMM y + MMMM y + Q yyyy + QQQ y + MM.yy + MMM yy + dd.MM.yy + Q yy + QQQQ yy + y + MMMM y + + + {0} – {1} + + M.-M. + + + E, dd.MM. - E, dd.MM. + E, dd.MM. - E, dd.MM. + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. - E, d. MMM + + + LLLL-LLLL + + + d. MMM - d. MMM + d.-d. MMM + + + dd.MM. - dd.MM. + dd.MM. - dd.MM. + + + d.-d. + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM y + MMM y - MMM y + + + E, d. MMM - E, d. MMM y + E, d. - E, d. MMM y + E, d. MMM y - E, d. MMM y + + + MM – MM.yyyy + MM.yyyy – MM.yyyy + + + d. MMM - d. MMM y + d.-d. MMM y + d. MMM y - d. MMM y + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + Epoche + + + Jaar + + + Monet + + + Wuche + + + Tag + vor drü Tääg + vorgeschter + geschter + hüt + moorn + übermoorn + i drü Tääg + + + Wuchetag + + + Tageshälfti + + + Schtund + + + Minuute + + + Sekunde + + + Zone + + + + + vorm. + nam. + + + vorm. + nam. + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Unbekannt + + + Tirana + + + Erivan + + + Curaçao + + + Süüdpol + + + Woschtok + + + Dumont D'Urville + + + Wien + + + Brüssel + + + Wagadugu + + + Bermudas + + + Züri + + + Oschterinsle + + + Havanna + + + Kap Verde + + + Wienachts-Insle + + + Nikosia + + + Dschibuti + + + Kopehage + + + Algier + + + Kairo + + + El Aaiún + + + Kanare + + + Addis Abeba + + + Fidschi + + + Färöer + + + Tiflis + + + Akkra + + + Ittoqqortoormiit + + + Athen + + + Süüd-Georgie + + + Hongkong + + + Bagdad + + + Teheran + + + Rom + + + Jamaika + + + Tokio + + + Bischkek + + + Komore + + + St. Kitts + + + Pjöngjang + + + Kaimaninsle + + + Aktobe + + + St. Lucia + + + Wilna + + + Luxemburg + + + Kischinau + + + Ulan-Baator + + + Macao + + + Maledive + + + Mexiko-Schtadt + + + Niger + + + Muschkat + + + Warschau + + + Azore + + + Lissabon + + + Asunción + + + Katar + + + Réunion + + + Bukarescht + + + Moskau + + + Jekaterinburg + + + Nowosibirsk + + + Krasnojarsk + + + Jakutsk + + + Wladiwostok + + + Sachalin + + + Kamtschatka + + + Riad + + + Khartum + + + Singapur + + + St. Helena + + + Mogadischu + + + São Tomé + + + Salvador + + + Damaskus + + + Duschanbe + + + Port-of-Spain + + + Taipeh + + + Daressalam + + + Uschgorod + + + Kiew + + + Saporischja + + + Knox + + + Taschkent + + + St. Vincent + + + St. Thomas + + + + Acre-Ziit + Acre-Summerziit + + + + + Afghanischtan-Ziit + + + + + Zentralafrikanischi Ziit + + + + + Oschtafrikanischi Ziit + + + + + Süüdafrikanischi Ziit + Süüdafrikanischi Schtandardziit + + + + + Weschtafrikanischi Ziit + Weschtafrikanischi Summerziit + + + + + Aktyubinsk-Ziit + Aktyubinsk-Summerziit + + + + + Alaska-Ziit + Alaska-Schtandardziit + + true + + + + Alaska-Hawaii-Ziit + Alaska-Hawaii-Schtandardziit + + + + + Almaty-Ziit + Almaty-Summerziit + + + + + Amazonas-Summerziit + + + + + Mitteleuropäischi Ziit + Mitteleuropäischi Summerziit + + + MEZ + MESZ + + true + + + + Oschteuropäischi Ziit + Oschteuropäischi Summerziit + + + OEZ + OESZ + + + + + Weschteuropäischi Ziit + Weschteuropäischi Summerziit + + + WEZ + WESZ + + + + + Moskauer Ziit + Moskauer Summerziit + + + + + + + . + ’ + ; + % + 0 + # + + + − + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + Andorranischi Peseete + Andorranischi Peseete + + + UAE Dirham + UAE Dirhäm + + + Afghani (1927-2002) + Afghani (1927-2002) + + + Afghani + Afghani + + + Lek + Lek + + + Dram + Dräm + + + Niderländischi-Antille-Gulde + + + Kwanza + + + Angolanische Kwanza (1977-1990) + Angolanischi Kwanza (1977-1990) + + + Nöie Kwanza + Nöii Kwanza + + + Kwanza Reajustado + + + Argentinische Auschtral + Argentinischi Auschtral + + + Argentinische Peso (1983-1985) + Argentinischi Peso (1983-1985) + + + Argentinische Peso + Argentinischi Peso + + + Öschtriichische Schilling + Öschtriichischi Schilling + öS + + + Auschtralische Dollar + Auschtralischi Dollar + + + Aruba Florin + Aruba Florin + + + Aserbeidschanische Manat (1993-2006) + Aserbaidschanischi Manat (1993-2006) + + + Aserbeidschanische Manat + Aserbeidschanischi Manat + + + Bosnie-und-Herzegowina-Dinar + Bosnie-und-Herzegowina-Dinär + + + Konvertierbari Mark vo Bosnie und Herzegowina + + + Barbados-Dollar + Barbados-Dollar + + + Taka + Taka + + + Belgische Franc (konvertibel) + Belgischi Franc (konvertibel) + + + Belgische Franc + Belgischi Franc + + + Belgische Finanz-Franc + Belgischi Finanz-Franc + + + Lew (1962-1999) + Lewa (1962-1999) + + + Bulgarische Lew + Bulgarischi Lew + + + Bahrain-Dinar + Bahrain-Dinar + + + Burundi-Franc + Burundi-Franc + + + Bermuda-Dollar + Bermuda-Dollar + + + Brunei-Dollar + Brunei-Dollar + + + Boliviano + Boliviano + + + Bolivianische Peso + Bolivianischi Peso + + + Bolivianische Mvdol + Bolivianischi Mvdol + + + Brasilianische Cruzeiro Novo (1967-1986) + Brasilianischi Cruzeiro Novo (1967-1986) + + + Brasilianische Cruzado + Brasilianischi Cruzado + + + Brasilianische Cruzeiro (1990-1993) + Brasilianischi Cruzeiro (BRE) + + + Brasilianische Real + Brasilianischi Real + + + Brasilianische Cruzado Novo + Brasilianischi Cruzado Novo + + + Brasilianische Cruzeiro + Brasilianischi Cruzeiro + + + Bahama-Dollar + Bahama-Dollar + + + Bhutanische Ngultrum + Bhutanischi Ngultrum + + + Birmanische Kyat + Birmanischi Kyat + + + Botswanische Pula + Botswanischi Pula + + + Belarus-Rubel (alt) + Belarus-Rubel (alt) + + + Belarus Rubel (nöi) + Belarus-Rubel (nöi) + + + Belize-Dollar + + + Kanadische Dollar + Kanadischi Dollar + + + Franc congolais + Francs congolais + + + WIR-Euro + + + Schwiizer Franke + Schwiizer Franke + + + WIR-Franke + WIR-Franke + + + Tschileenische Unidad de Fomento + Tschileenischi Unidades de Fomento + + + Tschileenische Peso + Tschileenischi Pesos + + + Renminbi Yuan + + + Kolumbianische Peso + Kolumbianischi Pesos + + + Unidad de Valor Real + Unidad de Valor Real + + + Costa Rica Colon + Costa Rica Colon + + + Alte Serbische Dinar + Alti Serbischi Dinar + + + Tschechoslowakischi Chroone + Tschechoslowakischi Chroone + + + Kubanische Peso + Kubanischi Pesos + + + Kap Verde Escudo + Kap Verde Escudo + + + Zypere-Pfund + + + Tschechischi Chroone + Tschechischi Chroone + + + DDR-Mark + DDR-Mark + + + Tüütschi Mark + Tüütschi Mark + + + Dschibuti-Franc + Dschibuti-Franc + + + Tänischi Chroone + Tänischi Chroone + + + Tominikanische Peso + Tominikanischi Pesos + + + Algeerischi Dinar + Algeerischi Dinar + + + Ecuadorianische Sucre + Ecuadorianischi Sucre + + + Verrächnigsäiheit für EC + Verrächnigsäiheit für EC + + + Eestnischi Chroone + Eestnischi Chroone + + + Ägüptischs Pfund + Ägüptischi Pfund + + + Eritreische Nakfa + Eritreischi Nakfa + + + Schpanischi Peseeta (A-Kontene) + Schpanischi Peseete (A-Kontene) + + + Schpanischi Peseeta (konvertibel) + Schpanischi Peseete (konvertibel) + + + Schpanischi Peseeta + Schpanischi Peseete + + + Äthiopische Birr + Äthiopischi Birr + + + Euro + Euro + + + Finnischi Mark + Finnischi Mark + + + Fidschi Dollar + Fidschi Dollar + + + Falkland-Pfund + Falkland-Pfund + + + Französische Franc + Französischi Franc + + + Pfund Schtörling + Pfund Schtörling + + + Georgische Kupon Larit + Georgischi Kupon Larit + + + Georgische Lari + Georgischi Lari + + + Ghanaische Cedi (GHC) + Ghanaischi Cedi (GHC) + + + Ghanaische Cedi (GHS) + Ghanaischi Cedi (GHS) + + + Gibraltar-Pfund + Gibraltar-Pfund + + + Gambische Dalasi + Gambischi Dalasi + + + Guinea-Franc + Guinea-Franc + + + Guineische Syli + Guineischi Syli + + + Äquatorialguinea-Ekwele + Äquatorialguinea-Ekwele + + + Griechische Trachme + Griechischi Trachme + + + Quetzal + Quetzal + + + Portugiisische Guinea Escudo + Portugiisischi Guinea Escudo + + + Guinea-Bissau-Peso + Guinea-Bissau-Pesos + + + Guyana-Dollar + Guyana0Dollar + + + Hongkong-Dollar + Hongkong-Dollar + + + Lempira + Lempira + + + Kroazische Dinar + Kroazischi Dinar + + + Kuna + Kuna + + + Gourde + Gourde + + + Forint + Forint + + + Rupie + Rupie + + + Iirischs Pfund + Iirischi Pfund + + + Israelischs Pfund + Israelischi Pfund + + + Schekel + Schekel + + + Indischi Rupie + Indischi Rupie + + + Irak-Dinar + Irak-Dinar + + + Rial + Rial + + + Iisländischi Chroone + Iisländischi Chroone + + + Italiänischi Lira + Italienischi Lire + ₤ + + + Jamaika-Dollar + Jamaika-Dollar + + + Jordaanische Dinar + Jordaanischi Dinar + + + Yen + Yen + ¥ + + + Kenia-Schilling + Kenia-Schilling + + + Som + Som + + + Riel + Riel + + + Komore-Franc + Komore-Franc + + + Nordkoreanische Won + Nordkoreanischi Won + + + Süüdkoreanische Won + Süüdkoreanischi Won + + + Kuwait-Dinar + Kuwait-Dinar + + + Kaiman-Dollar + Kaiman-Dollar + + + Tenge + Tenge + + + Kip + Kip + + + Libaneesischs Pfund + Libaneesischi Pfund + + + Sri-Lanka-Rupie + Sri-Lanka-Rupie + + + Liberiaanische Dollar + Liberiaanischi Dollar + + + Loti + Loti + + + Litauische Litas + Litauischi Litas + + + Litauische Talonas + Litauischi Talonas + + + Luxemburgische Franc (konvertibel) + Luxemburgischi Franc (konvertibel) + + + Luxemburgische Franc + Luxemburgischi Franc + + + Luxemburgischer Finanz-Franc + Luxemburgischi Finanz-Franc + + + Lettische Lats + Lettischi Lats + + + Lettische Rubel + Lettischi Rubel + + + Lüübische Dinar + Lüübischi Dinar + + + Marokkanische Dirham + Marokkanischi Dirham + + + Marokkanischer Franc + Marokkanische Franc + + + Moldau-Löi + Moldau-Löi + + + Madagaschkar-Ariary + Madagaschkar-Ariary + + + Madagaschkar-Franc + Madagaschkar-Franc + + + Denar + Denar + + + Malische Franc + Malischi Franc + + + Kyat + Kyat + + + Tugrik + Tugrik + + + Pataca + Pataca + + + Ouguiya + Ouguiya + + + Malteesischi Lira + Malteesischi Lira + + + Malteesischs Pfund + Malteesischi Pfund + + + Maurizius-Rupie + Maurizius-Rupie + + + Rufiyaa + Rufiyaa + + + Malawi-Kwacha + Malawi-Kwacha + + + Mexikanische Peso + Mexikanischi Pesos + + + Mexikanische Silber-Peso (1861-1992) + Mexikanischi Silber-Pesos (MXP) + + + Mexikanische Unidad de Inversion (UDI) + Mexikanischi Unidad de Inversion (UDI) + + + Malaysische Ringgit + Malaysischi Ringgit + + + Mosambikanische Escudo + Mozambikanischi Escudo + + + Alte Metical + Alti Metical + + + Metical + Metical + + + Namibia-Dollar + Namibia-Dollar + + + Naira + Naira + + + Cordoba + Cordoba + + + Gold-Cordoba + Gold-Cordoba + + + Holländische Gulde + Holländischi Gulde + + + Norweegischi Chroone + Norweegischi Chroone + + + Nepaleesischi Rupie + Nepalesischi Rupie + + + Neuseeland-Dollar + Neuseeland-Dollar + + + Rial Omani + Rial Omani + + + Balboa + Balboa + + + Peruanische Inti + Peruanischi Inti + + + Nöie Sol + Nöii Sol + + + Sol + Sol + + + Kina + Kina + + + Philippiinische Peso + Philippiinischi Peso + + + Pakischtanischi Rupie + Pakischtanischi Rupie + + + Zloty + Zloty + + + Zloty (1950-1995) + Zloty (1950-1995) + + + Portugiisische Escudo + Portugiisischi Escudo + + + Guarani + Guarani + + + Katar-Riyal + Katar-Riyal + + + Rhodesische Dollar + Rhodesischi Dollar + + + Löi + Löi + + + Rumäänische Löi + Rumäänischi Löi + + + Serbische Dinar + Serbischi Dinar + + + Russische Rubel (nöi) + Russischi Rubel (nöi) + + + Russische Rubel (alt) + Russischi Rubel (alt) + + + Ruanda-Franc + Ruanda-Franc + + + Saudi-Riyal + Saudi-Riyal + + + Salomone-Dollar + Salomone-Dollar + + + Seyschelle-Rupie + Seyschelle-Rupien + + + Sudaneesische Dinar + Sudaneesischi Dinar + + + Sudaneesischs Pfund + Sudaneesischi Pfund + + + Sudaneesischs Pfund (alt) + Sudaneesischi Pfund (alt) + + + Schweedischi Chroone + Schwedischi Chroone + + + Singapur-Dollar + Singapur-Dollar + + + St.-Helena-Pfund + St.-Helena-Pfund + + + Tolar + Tolar + + + Slowakischi Chroone + Slowakischi Chroone + + + Leone + Leone + + + Somalia-Schilling + Somalia-Schilling + + + Surinamische Dollar + Surinamischi Dollar + + + Surinamische Gulde + Surinamischi Gulde + + + Dobra + Dobra + + + Sowjetische Rubel + Sowjetischi Rubel + + + El-Salvador-Colon + El-Salvador-Colon + + + Süürischs Pfund + Süürischi Pfund + + + Lilangeni + Lilangeni + + + Baht + Baht + + + Tadschikischtan-Rubel + Tadschikischtan-Rubel + + + Tadschikischtan-Somoni + Tadschikischtan-Somoni + + + Turkmeenischtan-Manat + Turkmeenischtan-Manat + + + Tuneesische Dinar + Tuneesischi Dinar + + + Paʻanga + Paʻanga + + + Timor-Escudo + Timor-Escudo + + + Türkischi Liire + Türkischi Liira + Türkischi Liire + + + Nöii Türkischi Liire + Nöii Türkischi Liira + Nöii Türkischi Liire + + + Trinidad-und-Tobago-Dollar + Trinidad-und-Tobago-Dollar + + + Nöii Taiwan-Dollar + Nöie Taiwan-Dollar + Nöii Taiwan-Dollar + + + Tansania-Schilling + Tansania-Schilling + + + Hryvnia + Hryvnia + + + Ukraiinische Karbovanetz + Ukraiinischi Karbovanetz + + + Uganda-Schilling (1966-1987) + Uganda-Schilling (1966-1987) + + + Uganda-Schilling + Uganda-Schilling + + + US-Dollar + US-Dollar + $ + + + US Dollar (Nöchschte Taag) + US-Dollar (Nöchschte Taag) + + + US Dollar (Gliiche Taag) + US-Dollar (Gliiche Taag) + + + Uruguayische Nöie Peso (1975-1993) + Uruguayischi Nöii Pesos (1975-1993) + + + Uruguayische Peso + Uruguayischi Pesos + + + Usbeekischtan-Sum + Usbeekischtan-Sum + + + Bolivar + Bolivar + + + Bolívar Fuerte + + + Dong + + + Vatu + Vatu + + + Tala + Tala + + + CFA-Franc (Äquatoriaal) + CFA-Franc (Äquatoriaal) + + + Silber + Silber + + + Gold + Gold + + + Europääischi Rächnigseinheit + Europääischi Rächnigseinheite + + + Europääischi Währigseinheit (XBB) + Europääischi Währigseinheite (XBB) + + + Europääischi Rächnigseinheit (XBC) + Europääischi Rächnigseinheite (XBC) + + + Europääischi Rächnigseinheit (XBD) + Europääischi Rächnigseinheite (XBD) + + + Oschtkaribische Dollar + Oschtkaribischi Dollar + + + Sunderziäigsrächt + Sunderziäigsrächt + + + Europääischi Währigseinheit (XEU) + Europääischi Währigseinheite (XEU) + + + Französische Gold-Franc + Französischi Gold-Franc + + + Französische UIC-Franc + Französischi UIC-Franc + + + CFA-Franc (Wescht) + CFA-Franc (Wescht) + + + Palladium + Palladium + + + CFP-Franc + CFP-Franc + + + Platin + Platin + + + RINET-Funds + RINET-Funds + + + Teschtwährig + Teschtwährig + + + Unbekannti Währig + Unbekannti Währig + Unbekannti Währig + + + Jeme-Dinar + Jeme-Dinar + + + Jeme-Rial + Jeme-Rial + + + Jugoslawische Dinar (1966-1990) + Jugoslawischi Dinar (1966-1990) + + + Nöii Dinar + Nöie Dinar + Nöii Dinar + + + Jugoslawische Dinar (konvertibel) + Jugoslawischi Dinar (konvertibel) + + + Rand + Rand + + + Kwacha + Kwacha + + + Nöie Zaire + Nöii Zaire + + + Zaire + Zaire + + + Simbabwe-Dollar + Simbabwe-Dollar + + + + + + {0} Taag + {0} Tääg + + + {0} Schtund + {0} Schtunde + + + {0} Minuute + {0} Minuute + + + {0} Monet + {0} Mönet + + + {0} Sekunde + {0} Sekunde + + + {0} Wuche + {0} Wuche + + + {0} Jahr + {0} Jahr + + + + + ja:j + näi:n + + + + diff --git a/lib/zend/Zend/Locale/Data/gsw_CH.xml b/lib/zend/Zend/Locale/Data/gsw_CH.xml new file mode 100644 index 0000000000..3897bc2222 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gsw_CH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/gu.xml b/lib/zend/Zend/Locale/Data/gu.xml new file mode 100644 index 0000000000..c901ff54ae --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gu.xml @@ -0,0 +1,1160 @@ + + + + + + + + + + + અફાર + અબખાજિયન + અચીની + અકોલી + અદાંગ્મી + અદિઘે + અવેસ્તન + આફ્રિકન્સ + અફ્રો-એશિયાટીક ભાષાઓ + અફ્રિહિલી + એનૂ + અકન + અક્કાદીયાન + અલેઉત + એલ્ગોક્વિયન ભાષા + દક્ષિણ અલ્તાઇ + એમ્હારિક + અર્ગોનીઝ + જુની અંગ્રેજી + અંગીકા + અપાચે ભાષા + અરબી + અર્માઇક + એરોકૈનિયન + અરાપાહો + કૃત્રિમ ભાષા + અરાવક + આસામી + અસ્તુરિયન + અથાપાસ્કાન ભાષા + ઓસ્ટ્રેલિયન ભાષા + અવેરિક + અવધી + આયમારા + અઝરબૈજાની + બષ્ખિર + બાંદા + બમિલેકે ભાષા + બલૂચી + બાલિનીસ + બસા + બાલ્ટિક ભાષા + બેલારુશિયન + બેજા + બેમ્બા + બર્બર + બલ્ગેરિયન + બિહારી + ભોજપુરી + બિસ્લામા + બિકોલ + બિની + સિક્સિકા + બામ્બારા + બંગાળી + બન્ટુ + તિબેટી + બ્રેટોન + બ્રજ + બોસ્નિયન + બતાક + બુરિયાત + બગિનીસ + બ્લિન + કતલાન + કડ્ડો + મધ્ય અમેરિકન ઇંડિયન ભાષા + કરિબ + કાકેશિયન ભાષા + અત્સમ + ચેચન + સિબુઆનો + સેલ્ટિક ભાષા + કેમોરો + ચિબ્ચા + છગાતાઇ + ચૂકીસે + મારી + ચિનૂક જાર્ગન + ચોક્તૌ + શિપેવ્યાન + શેરોકી + શેયેન્ન + ચાર્મિક ભાષા + કોર્સિકન + કોપ્ટિક + અંગ્રેજી આધારિત ક્રેઓલ અથવા પિજિન + ફ્રેંચ આધારિત ક્રેઓલ અથવા પિજિન + પાર્ટુગીઝ આધારિત ક્રેઓલ અથવા પિજિન + ક્રી + ક્રિમીન તુર્કી + ક્રેઓલ અથવા પિજિન + ચેક + કાશુબિયન + ચર્ચ સ્લાવિક + કુશિતિક ભાષા + ચૂવાશ + વેલ્શ + ડેનિશ + દાકોતા + દાર્ગવા + દાયક + જર્મન + ઓસ્ટ્રિઅન જર્મન + સ્વિસ હાય જર્મન + દેલેવેર + સ્લેવ + ડોગ્રિબ + દિન્કા + ડોગ્રી + દ્રવિડિઅન ભાષા + નિમ્ન સોર્બિયન + દુઆલા + મધ્ય ડચ + દિવેહી + ડ્યુલા + ઝોંગખા + ઇવે + એફિક + પ્રાચીન ઇજીપ્શિયન + એકાજુક + ગ્રીક + એલામાઇટ + અંગ્રેજી + ઓસ્ટ્રેલિયન અંગ્રેજી + કેનેડિયન ફ્રેંચ + બ્રિટિશ અંગ્રેજી + યુ એસ અંગ્રેજી + મિડિલ અંગ્રેજી + એસ્પેરાન્ટો + સ્પેનિશ + લેટિન અમેરિકન સ્પેનિશ + ઇબેરિયન સ્પેનિશ + એસ્ટોનિયન + બાસ્ક + ઇવોન્ડો + પર્શિયન + ફેંગ + ફન્ટી + ફુલાહ + ફિનિશ + ફિલિપિનો + ફિન્નો-ઉગ્રીયન ભાષા + ફિજીયન + ફોરિસ્ત + ફોન + ફ્રેન્ચ + સ્વિસ ફ્રેંચ + મિડિલ ફ્રેંચ + જૂની ફ્રેંચ + નોર્ધર્ન ફ્રિશિયન + પૂર્વ ફ્રિશિયન + ફ્રિયુલિયાન + પશ્ચિમી ફ્રિશિયન + આઇરિશ + ગા + ગાયો + બાયા + સ્કોટ્સ ગેલિક + જર્મેનિક ભાષા + ગીઝ + જિલ્બરટીઝ + ગેલિશિયન + મધ્ય હાઇ જર્મન + ગુઆરાની + જૂની હાઇ જર્મન + ગોંડી + ગોરોન્તાલો + ગોથિક + ગ્રેબો + પ્રાચીન ગ્રીક + સ્વિસ જર્મન + ગુજરાતી + માંક્સ + ગ્વિચ'ઇન + હૌસા + હૈડા + હાવાઇયન + હીબ્રુ + હિન્દી + હિલિગેનોન + હિમાચલી + હિટ્ટિતે + મોંગ + હિરી મોટૂ + ક્રોએશિયન + અપ્પર સોર્બિયન + હૈતીયન + હંગેરિયન + હૂપા + આર્મેનિયન + હેરેરો + ઇંટરલિંગુઆ + ઇબાન + ઇન્ડોનેશિયન + ઇંટરલિંગ + સિચુઆન યી + ઇજો + ઇનુપિયાક + ઇલોકો + ભારતીય ભાષા + ઇંડો-યુરોપીયન ભાષા + ઇંગુશ + ઇડૌ + ઇરાની ભાષા + ઇરોક્વોઇયન ભાષા + આઇસલેન્ડિક + ઇટાલિયન + ઇનુકિટૂટ + જાપાનીઝ + લોજ્બાન + જુદેઓ-પર્શિયન + જુદેઓ-અરબી + જાવાનીસ + જ્યોર્જિઅન + કારા-કલ્પક + કબાઇલ + કાચિન + જ્જુ + કમ્બા + કારેન + કાવી + કબાર્ડિયન + ત્યાપ + કોરો + કોંગો + ખાસી + ખોસિયન ભાષા + ખોતાનીસ + કિકુયૂ + ક્વાન્યામા + કઝાક + કલાલ્લિસુત + ખ્મેર + કિમ્બન્દુ + કન્નડા + કોરિયન + કોંકણી + કોસરિયન + ક્પેલ્લે + કનુરી + કરાચય-બલ્કાર + કરેલિયન + ક્રૂ + કુરૂખ + કશ્મીરી + કુર્દિશ + કુમીક + કુતેનાઇ + કોમી + કોર્નિશ + કિરગીઝ + લેટિન + લાદીનો + લાહન્ડા + લામ્બા + લક્ઝેમબર્ગિશ + લેઝધીયન + ગાંડા + લિંબૂર્ગિશ + લિંગાલા + લાઓથિયન + મોગો + લોઝી + લિથુનિયન + લ્યૂબા કટાંગા + લૂબા-લુલુઆ + લુઇસેનો + લુન્ડા + લ્યુઓ + લુશાઇ + લાતવિયન + માદુરીસ + મગહી + મૈથિલી + મકાસર + મન્ડિન્ગો + ઓસ્ટ્રોનેશિયન + મસાઇ + મોક્ષ + મંડાર + મેન્ડે + મલાગસી + મિડિલ આઇરિશ + માર્શલીઝ + માઓરી + મિકમેક + મિનાંગ્કાબાઉ + વિવિધ ભાષા + મેસેડોનિયન + મોન-ખ્મેર ભાષા + મલયાલમ + મોંગોલિયન + માન્ચુ + મનિપૂરી + મનોબો ભાષા + મોલડાવિયન + મોહૌક + મોસ્સી + મરાઠી + મલય + માલ્ટિઝ + બહુવિધ ભાષા + મુન્ડા ભાષા + ક્રિક + મિરાંડી + મારવાડી + બર્મીઝ + માયા ભાષા + એર્ઝયા + નાઉરૂ + નહઆત્લ + ઉતરી અમેરીકન ઇંડિયન ભાષા + નેપોલિટાન + નોર્વેજીયન બોકમાલ + ઉતર દેબેલ + લો જર્મન + નેપાળી + નેવારી + ડોન્ગા + નિયાસ + નાઇગર-કોર્ડોફેનિયન ભાષા + નિયુઆન + ડચ + ફ્લેમિશ + નૉર્વેજીયન નાયનૉર્સ્ક + નૉર્વેજીયન + નોગાઇ + જૂની નોર્સ + એન'કો + દક્ષિણ દેબેલ + ઉતરી સોથો + ન્યુબિયાન ભાષા + નાવાજો + પરંપરાગત નેવારી + ન્યાન્જા + ન્યામવેઝી + ન્યાનકોલ + ન્યોરો + ન્ઝિમા + ઑકીટન + ઓઝિંબ્વા + ઓરોમો + ઉડિયા + ઓસ્સેટિક + ઓસેજ + ઓટોમાન તુર્કિશ + ઓટોમિયન ભાષા + પંજાબી + પાપુન ભાષા + પંગાસીનાન + પહલવી + પમ્પાન્ગા + પાપિયામેન્ટો + પલાઉઆન + જૂની પર્શિયન + ફિલિપીની ભાષા + ફોનિશિયન + પાલી + પોલીશ + પોહપિએન + પ્રક્રૃત ભાષા + જુની પ્રોવેન્સલ + પશ્તો + પોર્ટુગીઝ + બ્રાઝિલીયન પોર્ટુગીઝ + ઇબેરિયન પોર્ટુગીઝ + ક્વેચુઆ + રાજસ્થાની + રાપાનુઇ + રારોટોંગન + રહેટો રોમાન્સ + રૂન્દી + રોમાનિયન + રોમાંસ ભાષા + રોમાની + મૂલ + રશિયન + અરોમેનિયન + કિન્યારવાન્ડા + સંસ્કૃત + સોંડવે + યાકૂત + દક્ષિણ અમેરીકન ઇંડિયન ભાષા + સલીશન ભાષા + સામરિટાન અરેમિક + સાસાક + સંતાલી + સાર્દિનિયન + સિસિલિયાન + સ્કોટ્સ + સિંધી + નૉર્થન સામી + સેલ્કપ + સેમિટિક ભાષા + સાંગો + જૂની આયરિશ + સાંકેતિક ભાષા + સર્બો-ક્રોએશિયન + શેન + સિંહલી + સિદામો + સિઉઆન ભાષા + ચીની-ટિબેટી ભાષા + સ્લોવૅક + સ્લોવેનિયન + સ્લોવિક ભાષા + સામોન + દક્ષિણ સામી + સામી ભાષા + લ્યુલ સામી + ઇનારી સામી + સ્કોલ્ટ સામી + શોના + સોનિન્કે + સોમાલી + સોગ્ડિએન + સોન્ઘાઇ + અલ્બેનિયન + સર્બિયન + સ્રાનન ટોન્ગો + સેરેર + સ્વાતી + નીલો-સહારન ભાષા + સદર્ન સોથો + સંડેનીઝ + સુકુમા + સુસુ + સુમેરિયન + સ્વીડિશ + સ્વાહિલી + પરંપરાગત સિરિએક + સિરિએક + તમિલ + તાઇ ભાષા + તેલુગુ + ટિમ્ને + તેરેનો + તેતુમ + તાજીક + થાઈ + ટાઇગ્રિનિયા + ટાઇગ્રે + તિવ + તુર્કમેન + તોકેલાઉ + ટાગાલોગ + ક્લિંગન + લિંગિત + તામાશેખ + ત્સ્વાના + ટોંગા + ન્યાસા ટોન્ગા + ટોક પિસિન + ટર્કીશ + સોંગા + સિમ્શિયન + તતાર + તમ્બૂકા + ટ્યૂપી ભાષા + અલ્ટેઇક ભાષા + તુવાલુ + ટ્વાઇ + તાહિતિયન + ટુવીનિયન + ઉદમુર્ત + ઇગુર + યુગેરિટિક + યુક્રેનિયન + ઉમ્બુન્ડૂ + અજ્ઞાત અથવા અમાન્ય ભાષા + ઉર્દુ + ઉઝ્બેક + વાઇ + વેન્દા + વિયેતનામીસ + વોલાપુક + વોટિક + વાલૂન + વાકાશન ભાષા + વલામો + વારે + વાશો + સોર્બિયન ભાષા + વોલોફ + કાલ્મિક + ખોસા + યાઓ + યાપીસ + યીદ્દીશ + યોરૂબા + યૂપિક ભાષા + ઝુઆગ + ઝેપોટેક + બ્લિસિમ્બોલ્સ + ઝેનાગા + ચાઇનીઝ + સરળીકૃત ચિની + પારંપરિક ચિની + ઝન્ડે + ઝુલુ + ઝૂની + કોઇ ભાષાશાસ્ત્રીય સામગ્રી નથી + ઝાઝા + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + વિશ્વ + આફ્રિકા + ઉતર અમેરિકા + દક્ષિણ અમેરિકા + ઓશિઆનિયા + પશ્ચિમ આફ્રિકા + મધ્ય અમેરિકા + પૂર્વ અમેરિકા + ઉતરીય આફ્રિકા + મધ્ય આફ્રિકા + દક્ષિણી આફ્રિકા + અમેરિકાસ + ઉતરીય અમેરિકા + કેરિબિયન + પૂર્વીય એશિયા + દક્ષિણી એશિયા + દક્ષિણ- પૂર્વ એશિયા + દક્ષિણી યૂરોપ + ઑસ્ટ્રેલિયા અને ન્યુઝીલેન્ડ + મેલાનેશિયા + માઇક્રોનેશિયન રીજન + પોલિનેશિયા + દક્ષિણ-મધ્ય એશિયા + એશિયા + મધ્ય એશિયા + પશ્ચિમ એશિયા + યૂરોપ + પૂર્વીય યૂરોપ + ઉતરીય યૂરોપ + પશ્ચિમ યૂરોપ + સ્વતંત્ર રાષ્ટ્રનુ કોમનવેલ્થ + ચેકોસ્લવાકિયા + લેટિન અમેરિકા અને કેરીબિયન + ચેનલ આઇલન્ડ્સ + ઍંડોરા + યુનાઇટેડ અરબ એમિરેટ્સ + અફઘાનિસ્તાન + એન્ટીગુઆ અને બરબુડા + ઍંગ્વિલા + અલ્બેનિયા + આર્મેનિયા + નેધરલેંડ્સ એંટિલેસ + અંગોલા + એન્ટાર્કટિકા + આર્જેન્ટીના + અમેરીકન સમોઆ + ઑસ્ટ્રિયા + ઑસ્ટ્રેલિયા + અરુબા + એલેંડ આઇલેન્ડ્સ + અઝરબૈજાન + બોસ્નિયા અને હર્ઝેગોવિના + બારબાડોસ + બાંગ્લાદેશ + બેલ્જીયમ + બુર્કિના ફાસો + બલ્ગેરિયા + બેહરીન + બુરુંડી + બેનિન + સેંટ બાર્થલેમી + બર્મુડા + બ્રુનેઇ + બોલિવિયા + બ્રાઝિલ + બહામાસ + ભૂટાન + બૌવેત આઇલેન્ડ + બોત્સ્વાના + બેલારુસ + બેલીઝ + કેનેડા + કોકોઝ આઇલેન્ડ + કોંગો - કિંશાસા + સેંટ્રલ આફ્રિકન રીપબ્લિક + કોંગો - બ્રાઝાવિલે + સ્વિટ્ઝર્લૅન્ડ + આઇવરી કોસ્ટ + કુક આઇલેન્ડ્સ + ચિલી + કૅમરૂન + ચીન + કોલમ્બિયા + કોસ્ટા રિકા + સર્બિયા અને મોન્ટેનેગ્રો + ક્યુબા + કૅપ વર્ડે + ક્રિસમસ આઇલેંડ + સાયપ્રસ + ચેક રીપબ્લિક + જર્મની + જીબૌટી + ડેનમાર્ક + ડોમિનિકા + ડોમિનિકન રીપબ્લિક + અલ્જીરિયા + એક્વાડોર + એસ્ટોનિયા + ઇજિપ્ત + પશ્ચિમી સહારા + એરિટ્રિયા + સ્પેન + ઇથિઓપિયા + ફીનલેંડ + ફીજી + ફૉકલૅંડ આઇલૅંડ્સ + માઇક્રોનેશિયા + ફૅરો આઇલેન્ડ્સ + ફ્રાંસ + ગેબન + યુનાઇટેડ કિંગડમ + ગ્રેનેડા + જ્યોર્જીયા + ફ્રેંચ ગયાના + ગ્વેર્નસે + ઘાના + જીબ્રાલ્ટર + ગ્રીનલેન્ડ + ગેમ્બિયા + ગિની + ગ્વાડેલોપ + ઇક્વેટોરિયલ ગિની + ગ્રીસ + દક્ષિણ જ્યોર્જીયા અને દક્ષિણ સેન્ડવિચ આઇલેન્ડ + ગ્વાટેમાલા + ગ્વામ + ગિની-બિસાઉ + ગયાના + હોંગકોંગ SAR ચીન + હર્ડ આઇલૅંડ એંડ મેકડોનાલ્ડ આઇલૅંડ્સ + હોન્ડુરસ + ક્રોએશિયા + હૈતિ + હંગેરી + ઇન્ડોનેશિયા + આયર્લેંડ + ઇઝરાઇલ + ઇસ્લે ઓફ મૅન + ભારત + બ્રિટિશ ઇન્ડિયન ઓશન ટેરિટરી + ઇરાક + ઈરાન + આઇસલેન્ડ + ઇટાલી + જર્સી + જમૈકા + જોર્ડન + જાપાન + કેન્યા + કિર્ગિઝ્સ્તાન + કંબોડિયા + કિરિબાટી + કોમોરસ + સેંટ કિટ્સ એંડ નેવિસ + ઉત્તર કોરિયા + દક્ષિણ કોરિયા + કુવૈત + કેયમેન આઇલૅંડ્સ + કઝાકિસ્તાન + લાઓસ + લેબનોન + સેંટ લુસિયા + લૈચટેંસ્ટેઇન + શ્રીલંકા + લાઇબેરિયા + લેસોથો + લિથુનિયા + લક્ઝમબર્ગ + લેતવિયા + લિબિયા + મોરોક્કો + મોનાકો + મોલડોવા + મૉન્ટેંનેગ્રો + સેંટ માર્ટિન + મેડાગાસ્કર + માર્શલ આઇલેન્ડ્સ + મેસેડોનિયા + માલી + મ્યાંમાર + મંગોલિયા + મકાઓ SAR ચીન + ઉતરીય મારિયાના આઇલેન્ડ્સ + માર્ટીનીક + મૌરિટાનિયા + મોંટસેરાત + માલ્ટા + મોરિશિયસ + માલદિવ્સ + માલાવી + મેક્સિકો + મલેશિયા + મોઝામ્બિક + નામિબિયા + ન્યુ સેલેડોનિયા + નાઇજર + નોરફૉક આઇલેન્ડ + નાઇજીરીયા + નિકારાગુઆ + નેધરલેન્ડ + નૉર્વે + નેપાળ + નૌરુ + નીયુ + ન્યુઝીલેન્ડ + ઑમાન + પનામા + પેરુ + ફ્રેંચ પોલિનેશિયા + પપુઆ ન્યુ ગિની + ફિલિપિન્સ + પાકિસ્તાન + પોલેંડ + સેંટ પીએરે એન્ડ મિકીલોન + પીટકૈર્ન + પ્યુઅર્ટો રિકો + પેલેસ્ટિનિયન ટેરિટરી + પોર્ટુગલ + પલાઉ + પેરાગ્વે + કતાર + આઉટલાયિંગ ઓશનિયા + યુરોપિયન સંઘ + રીયુનિયન + રોમાનિયા + સર્બિયા + રશિયા + રવાંડા + સાઉદી અરેબિયા + સોલોમન આઇલેન્ડ + શેશેલ્સ + સુદાન + સ્વીડન + સિંગાપુર + સેંટ હેલેના + સ્લોવેનિયા + સ્વાલબર્ડ એંડ જેન મેયન + સ્લોવેકિયા + સીએરા લેઓન + સૅન મેરિનો + સેનેગલ + સોમાલિયા + સુરીનામ + સાઓ ટૉમ અને પ્રિંસિપે + એલ સેલ્વાડોર + સીરિયા + સ્વાઝિલેન્ડ + ટર્ક્સ એન્ડ કૈકોસ આઇલેન્ડ્સ + ચાડ + ફ્રેંચ સદર્ન ટેરિટરીઝ + ટોગો + થાઇલેંડ + તાજીકિસ્તાન + ટોકેલાઉ + પૂર્વ તિમોર + તુર્ક્મનિસ્તાન + ટ્યુનિશિયા + ટોંગા + તુર્કસ્તાન + ત્રિનિડાડ અને ટોબેગો + તુવાલુ + તાઇવાન + તાંઝાનિયા + ટર્કી + યુગાંડા + સંયુક્ત રાજ્ય માઇનર આઉટલાઇંગ આયલેન્ડ + સંયુકત રાજ્ય/ અમેરિકા + ઉરુગ્વે + ઉઝ્બેકિસ્તાન + વેટિકન + સેંટ વિંસેંટ એંડ ધ ગ્રેનેડિન્સ + વેનેઝુએલા + બ્રિટિશ વર્જિન આઇલેન્ડ + યુ.એસ વર્જિન આઇલેન્ડ + વિયેતનામ + વાનુઆતુ + વૉલિસ એંડ ફ્યુચુના + સમોઆ + યેમેન + મેયોટ + દક્ષિણ આફ્રિકા + ઝામ્બિયા + ઝિમ્બાબ્વે + અજ્ઞાત અથવા અમાન્ય પ્રદેશ + + + કેલેન્ડર + ક્રમ + ચલણ + + + + [૦-૯ ૐ અ-ઋ ૠ ઍ એ-ઑ ઓ-ન પ-ર લ ળ વ-હ ઼ ઁ-ઃ ઽ ્ ા-ૅ ે-ૉ ો ૌ] + [\u200C \u200D] + + + ' + ' + " + " + + + + + + + + જાન્યુ + ફેબ્રુ + માર્ચ + એપ્રિલ + મે + જૂન + જુલાઈ + ઑગસ્ટ + સપ્ટે + ઑક્ટો + નવે + ડિસે + + + જાન્યુઆરી + ફેબ્રુઆરી + માર્ચ + એપ્રિલ + મે + જૂન + જુલાઈ + ઑગસ્ટ + સપ્ટેમ્બર + ઑક્ટ્બર + નવેમ્બર + ડિસેમ્બર + + + + + જા + ફે + મા + એ + મે + જૂ + જુ + ઑ + સ + ઑ + ન + ડિ + + + + + + + રવિ + સોમ + મંગળ + બુધ + ગુરુ + શુક્ર + શનિ + + + રવિવાર + સોમવાર + મંગળવાર + બુધવાર + ગુરુવાર + શુક્રવાર + શનિવાર + + + + + ર + સો + મં + બુ + ગુ + શુ + શ + + + + + + + ત્રિમાસિક ૧ + ત્રિમાસિક ૨ + ત્રિમાસિક ૩ + ત્રિમાસિક ૪ + + + પહલી ત્રિમાસિક + બીજી ત્રિમાસિક + ત્રીજી ત્રિમાસિક + ચૌથી ત્રિમાસિક + + + + am + pm + + + ઈસવીસન પૂર્વે + ઇસવીસન + + + BCE + CE + + + ઇ સ પુ + ઇસ + + + + + + EEEE, d MMMM, y + + + + + d MMMM, y + + + + + d MMM, y + + + + + d-MM-yy + + + + + + + hh:mm:ss a zzzz + + + + + hh:mm:ss a z + + + + + hh:mm:ss a + + + + + hh:mm a + + + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + રુ + + + + + + હા + ના + + + diff --git a/lib/zend/Zend/Locale/Data/gu_IN.xml b/lib/zend/Zend/Locale/Data/gu_IN.xml new file mode 100644 index 0000000000..1171d8bd59 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gu_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/gv.xml b/lib/zend/Zend/Locale/Data/gv.xml new file mode 100644 index 0000000000..d1e66d915d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gv.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + Gaelg + + + Rywvaneth Unys + + + + [a-c ç d-z] + + + + + + + + J-guer + T-arree + Mayrnt + Avrril + Boaldyn + M-souree + J-souree + Luanistyn + M-fouyir + J-fouyir + M.Houney + M.Nollick + + + Jerrey-geuree + Toshiaght-arree + Mayrnt + Averil + Boaldyn + Mean-souree + Jerrey-souree + Luanistyn + Mean-fouyir + Jerrey-fouyir + Mee Houney + Mee ny Nollick + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Jed + Jel + Jem + Jerc + Jerd + Jeh + Jes + + + Jedoonee + Jelhein + Jemayrt + Jercean + Jerdein + Jeheiney + Jesarn + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + a.m. + p.m. + + + RC + AD + + + + + + EEEE dd MMMM y + + + + + dd MMMM y + + + + + MMM dd, y + + + + + dd/MM/yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + dd MMMM + dd/MM + mm:ss + MM/yy + Q yy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/gv_GB.xml b/lib/zend/Zend/Locale/Data/gv_GB.xml new file mode 100644 index 0000000000..48b2e1cd0f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/gv_GB.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ha.xml b/lib/zend/Zend/Locale/Data/ha.xml new file mode 100644 index 0000000000..8d6d253f92 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ha.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + Afirkanci + Amharic + Harshen Larabci + Asamisanci + Azerbaijanci + Belarushiyanci + Bulgeriyan + Bihari + Dan Bengal + Buretananci + Bosniyanci + Kataloniyanci + Yaren Jamhuriyar Cek + Kabilar Welsh + Danish + Jamusanchi + Girkanci + Turanci + D'an/'Yar Kabilar Andalus + Mutanen Espanya + Istoniyanci + Dan/'Yar Kabilar Bas + Persian + Yaren mutanen Finland + Dan Filifin + Faroese + Faranshi + K'abilan Firsi + Dan Ailan + K'abilan Scots Gaelic + Bagalike + Guwaraniyanci + Gujarati + Haoussa + Yahudanci + Bahinde + Kuroshiyan + Hongeriyanci + Armeniyanci + Yare Tsakanin Kasashe + Indonesiyan + Intagulanci + Yaren mutanen Iceland + Italiyanci + Jafananci + Javanisanci + Jojiyanci + Kambodiyanci + Dan/'Yar Kabilar Kannada + Yaren mutanen Koriya + Kurdanci + Kirgizanci + Dan Kabilar Latin + Lingala + Laothian + Lituweniyanci + Latbiyanci + Dan Masedoniya + Kabilar Maleyalam + Mongolian + K'abilan Marathi + Dan Kabilar Male + Harshen Maltis + D'an/'Yar Kabilar Nepal + Yaren mutanen Holland + Yaren Kasar Norway + Yaren mutanen Norway + Ositanci + Oriyanci + Dan/'Yar Garin Punjab + Yaren mutanen Poland + Pashtanci + Yaren mutanen Portugal + Fotigis (Burazil) + Yaren Kasar Portugal + Romaniyanci + Rashanci + sanskrit + Sindiyanci + Kuroweshiyancin-Sabiya + Sinhalanci + Basulake + Basulabe + Somaali + D'an/'Yar Kabilar Albaniya + Sabiyan + Sesotanci + Sundanese + Yaren mutanen Sweden + Harshen Suwahili + D'an/'Yar Kabilar Tamil + D'an/'Yar Kabilar Telug + Tayanci + Tigriyanci + Tukmenistanci + Klingon + Baturke + Tiwiniyanci + Ugiranci + Dan Ukirain + Urdu + Uzbek + K'abilan Biyetnam + Bazosa + Bazule + + + Gaana + Nijer + Nijeriya + + + + [a b ɓ c d ɗ e-k ƙ l-o r s {sh} t {ts} u w y z ʼ {ʼy}] + [á à â é è ê í ì î ó ò ô p q {r\u0303} ú ù û v x ƴ] + [a-z] + + + + + + + + Jan + Fab + Mar + Afr + May + Yun + Yul + Aug + Sat + Okt + Nuw + Dis + + + Janairu + Fabrairu + Maris + Afrilu + Mayu + Yuni + Yuli + Augusta + Satumba + Oktoba + Nuwamba + Disamba + + + + + J + F + M + A + M + Y + Y + A + S + O + N + D + + + + + + + Lah + Lit + Tal + Lar + Alh + Jum + Asa + + + Lahadi + Litini + Talata + Laraba + Alhamis + Jumma'a + Asabar + + + + + L + L + T + L + A + J + A + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Gabanin Miladi + Miladi + + + GM + M + + + + + + EEEE, d MMMM, y + + + + + d MMMM, y + + + + + d MMM, y + + + + + d/M/yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + H:mm + L + E, d-M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + M-d + d + mm:ss + y + EEE, d/M/yyyy + EEE, d MMM y + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + . + , + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + + + + Sidi + + + Neira + + + Sefa + + + + + + i + a'a:a + + + + diff --git a/lib/zend/Zend/Locale/Data/ha_Arab.xml b/lib/zend/Zend/Locale/Data/ha_Arab.xml new file mode 100644 index 0000000000..dd012b0a84 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ha_Arab.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + העולם + אפריקה + צפון אמריקה + דרום אמריקה + אוקיאניה + מערב אפריקה + מרכז אמריקה + מזרח אפריקה + צפון אפריקה + מרכז אפריקה + דרום יבשת אפריקה + אמריקה + אמריקה הצפונית + קריביים + מזרח אסיה + דרום אסיה + דרום־מזרח אסיה + דרום אירופה + אוסטרליה וניו־זילנד + מלנסיה + אזור מיקרונזיה + פולינזיה + דרום־מרכז אסיה + אסיה + מרכז אסיה + מערב אסיה + אירופה + מזרח אירופה + צפון אירופה + מערב אירופה + חבר המדינות העצמאיות + אמריקה הלטינית והקריביים + איי התעלה + אנדורה + איחוד האמירויות הערביות + אפגניסטן + אנטיגואה וברבודה + אנגילה + אלבניה + ארמניה + אנטילים הולנדיים + אנגולה + אנטארקטיקה + ארגנטינה + סמואה האמריקנית + אוסטריה + אוסטרליה + ארובה + איי אלנד + אזרביג'ן + בוסניה והרצגובינה + ברבדוס + בנגלדש + בלגיה + בורקינה פאסו + בולגריה + בחריין + בורונדי + בנין + סנט ברתולומיאו + ברמודה + ברוניי + בוליביה + ברזיל + איי בהאמה + בהוטן + איי בובה + בוטסוואנה + בלארוס + בליז + קנדה + איי קוקוס + קונגו - קינשאסה + הרפובליקה של מרכז אפריקה + קונגו - ברזאויל + שווייץ + חוף השנהב + איי קוק + צ׳ילה + קמרון + סין + קולומביה + קוסטה ריקה + סרביה ומונטנגרו + קובה + כף ורדה + איי כריסטמס + קפריסין + צ׳כיה + גרמניה + ג׳יבוטי + דנמרק + דומיניקה + הרפובליקה הדומיניקנית + אלג׳יריה + אקוודור + אסטוניה + מצרים + סהרה המערבית + אריתראה + ספרד + אתיופיה + פינלנד + פיג׳י + איי פוקלנד + מיקרונזיה + איי פארו + צרפת + גאבון + בריטניה + גרנדה + גאורגיה + גיאנה הצרפתית + גרנסי + גאנה + גיברלטר + גרינלנד + גמביה + גיניאה + גוואדלופ + גיניאה המשוונית + יוון + ג׳ורג׳יה הדרומית ואיי סנדוויץ׳ הדרומיים + גואטמלה + גואם + גיניאה-ביסאו + גיאנה + הונג קונג (מחוז מנהלי מיוחד של סין) + איי הרד ואיי מקדונלנד + הונדורס + קרואטיה + האיטי + הונגריה + אינדונזיה + אירלנד + ישראל + האי מאן + הודו + טריטוריה בריטית באוקיאנוס ההודי + עיראק + איראן + איסלנד + איטליה + ג'רסי + ג׳מייקה + ירדן + יפן + קניה + קירגיזסטן + קמבודיה + קיריבאטי + קומורוס + סנט קיטס ונוויס + צפון קוריאה + דרום קוריאה + כווית + איי קיימן + קזחסטן + לאוס + לבנון + סנט לוסיה + ליכטנשטיין + סרי לנקה + ליבריה + לסוטו + ליטא + לוקסמבורג + לטביה + לוב + מרוקו + מונקו + מולדובה + מונטנגרו + סנט מרטין + מדגסקר + איי מרשל + מקדוניה + מאלי + מייאנמאר + מונגוליה + מקאו (מחוז מנהלי מיוחד של סין) + איי מריאנה הצפוניים + מרטיניק + מאוריטניה + מונסראט + מלטה + מאוריציוס + מלדיבים + מלאווי + מקסיקו + מלזיה + מוזמביק + נמיביה + קלדוניה החדשה + ניז׳ר + איי נורפוק + ניגריה + ניקרגואה + הולנד + נורווגיה + נפאל + נאורו + ניווה + ניו זילנד + עומאן + פנמה + פרו + פולינזיה הצרפתית + פפואה גיניאה החדשה + פיליפינים + פקיסטן + פולין + סנט פייר ומיקלון + פיטקרן + פורטו ריקו + הרשות הפלסטינית + פורטוגל + פאלאו + פרגוואי + קטאר + האיחוד האירופי + ראוניון + רומניה + סרביה + רוסיה + רואנדה + ערב הסעודית + איי שלמה + איי סיישל + סודן + שוודיה + סינגפור + סנט הלנה + סלובניה + סוולבארד וז׳אן מאיין + סלובקיה + סיירה לאונה + סן מרינו + סנגל + סומליה + סורינם + סאו טומה ופרינסיפה + אל סלבדור + סוריה + סווזילנד + איי טורקס וקאיקוס + צ׳אד + טריטוריות דרומיות של צרפת + טוגו + תאילנד + טג׳יקיסטן + טוקלאו + מזרח טימור + טורקמניסטן + תוניסיה + טונגה + טורקיה + טרינידד וטובגו + טובלו + טייוואן + טנזניה + אוקראינה + אוגנדה + איים קטנים שלחוף ארצות הברית + ארצות הברית + אורוגוואי + אוזבקיסטן + הוותיקן + סנט וינסנט והגרנדינים + ונצואלה + איי הבתולה הבריטיים + איי הבתולה האמריקניים + וייטנאם + ונואטו + איי ווליס ופוטונה + סמואה + תימן + מאיוט + דרום אפריקה + זמביה + זימבאבווה + אזור לא ידוע או לא תקין + + + כתיב גרמני מסורתי + מזרח ארמנית + מערב ארמנית + מונוטונית + מחשב + + + לוח שנה + מיון + מטבע + + + מיון סינית מסורתית + לוח שנה בודהיסטי + לוח שנה סיני + מיון ישיר + מיון סינית מודרנית + לוח שנה גרגוריאני + לוח שנה עברי + לוח שנה מוסלמי + לוח שנה מוסלמי-אזרחי + לוח שנה יפני + מיון ספר טלפונים + מיון פיניין + מיון מסורתי + + + ארה"ב + מטרי + + + {0} + {0} + {0} + + + + + + + [א-י כ ך ל מ ם נ ן ס ע פ ף צ ץ ק-ת] + [\u05BD \u05C4\u200E \u200F \u05B0-\u05B9 \u05BB \u05C2 \u05C1 \u05BC \u05BF ־ ׳ ״ a-z] + [a-z] + + + “ + ” + " + " + + + + + + + + ינו + פבר + מרס + אפר + מאי + יונ + יול + אוג + ספט + אוק + נוב + דצמ + + + ינואר + פברואר + מרס + אפריל + מאי + יוני + יולי + אוגוסט + ספטמבר + אוקטובר + נובמבר + דצמבר + + + + + + + יום א' + יום ב' + יום ג' + יום ד' + יום ה' + יום ו' + שבת + + + יום ראשון + יום שני + יום שלישי + יום רביעי + יום חמישי + יום שישי + יום שבת + + + + + א + ב + ג + ד + ה + ו + ש + + + + + + + רבעון 1 + רבעון 2 + רבעון 3 + רבעון 4 + + + רבעון 1 + רבעון 2 + רבעון 3 + רבעון 4 + + + + + 1 + 2 + 3 + 4 + + + + לפנה"צ + אחה"צ + + + לפני הספירה + לספירה + + + לפנה״ס + לסה״נ + + + + + + EEEE, d בMMMM y + + + + + d בMMMM y + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + E d + H + HH:mm + HH:mm:ss + H:mm + L + E, M-d + LLL + E d MMM + E MMMM d + d בMMMM + MMM d + dd/MM + d/M + d + mm:ss + mm:ss + y + M.yyyy + EEE, d.M.yyyy + y MMM + EEE, y MMM d + MMMM y + yyyy Q + y QQQ + MM/yy + MMM yy + Q yy + y + MM/yyyy + MMMM y + + + {0} – {1} + + M-M + + + EEEE dd/MM - EEEE dd/MM + EEEE dd/MM - EEEE dd/MM + + + MMM-MMM + + + EEEE d MMM - EEEE d MMM + EEEE d MMM - EEEE d MMM + + + LLLL-LLLL + + + d MMM - d MMM + d-d MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + HH–HH + + + HH:mm-HH:mm + HH:mm–HH:mm + HH:mm–HH:mm + + + HH:mm-HH:mm v + HH:mm–HH:mm v + HH:mm–HH:mm v + + + HH-HH v + HH–HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + EEEE dd/MM/yy - EEEE dd/MM/yy + EEEE dd/MM/yy - EEEE dd/MM/yy + EEEE dd/MM/yy - EEEE dd/MM/yy + + + MMM-MMM y + MMM y - MMM y + + + EEEE d MMM - EEEE d MMM y + EEEE d MMM - EEEE d MMM y + EEEE d MMM y - EEEE d MMM y + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + תקופה + + + שנה + + + חודש + + + שבוע + + + יום + לפני שלושה ימים + שלשום + אתמול + היום + מחר + מחרתיים + בעוד שלושה ימים + + + יום בשבוע + + + Dayperiod + + + שעה + + + דקה + + + שנייה + + + אזור + + + + + + + + תשרי + חשון + כסלו + טבת + שבט + אדר א' + אדר + ניסן + אייר + סיון + תמוז + אב + אלול + + + + + תשרי + חשון + כסלו + טבת + שבט + אדר א' + אדר + ניסן + אייר + סיון + תמוז + אב + אלול + + + + לפנה"צ + אחה"צ + + + לבה"ע + + + + + + EEEE, d בMMMM y + + + + + d בMMMM y + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + E, d בMMMM + + + + + + + + מוחרם + ספר + רביע אל-אוואל + רביע אל-תני + ג׳ומדה אל-אוואל + ג׳ומדה אל-תני + רג׳אב + שעבאן + ראמדן + שוואל + זו אל-QI'DAH + זו אל-חיג׳ה + + + + + + שנת היג׳רה + + + + + + + טאיקה + נינג'ו + שוטוקו + + + + + + +HH:mm;-HH:mm + GMT{0} + שעון {0} + {1} ({0}) + + לא ידוע + + + אנדורה + + + דובאי + + + קאבול + + + אנטיגואה + + + אנגווילה + + + טירנה + + + ירבאן + + + קורסאו + + + לואנדה + + + רות'רה + + + אמריקה/פאלמר + + + הקוטב הדרומי + + + שויה + + + מאוסון + + + דייויס + + + ווסטוק + + + קאסיי + + + דומון ד'אורווי + + + מקמרדו + + + אמריקה/מנדוזה + + + אמריקה/ארגנטינה/סאן-חואן + + + אמריקה/קורדובה + + + בואנוס איירס + + + פאגו פאגו + + + וינה + + + אוסטרליה/פרת' + + + אוסטרליה/דרווין + + + אדלייד + + + אוסטרליה/ברוקן-היל + + + אוסטרליה/מלבורן + + + אוסטרליה/הוברט + + + אוסטרליה/סידני + + + אוסטרליה/בריסבן + + + ארובה + + + באקו + + + ברבדוס + + + דאקה + + + בריסל + + + ואגאדוגו + + + סופיה + + + בהרין + + + בוג'ומבורה + + + פורטו-נובו + + + ברמודה + + + ברוניי + + + לה פאז + + + ריאו ברנצ'ו + + + פורטו וולהו + + + בואה ויסטה + + + מנאוס + + + קויאבה + + + קמפו גרנדה + + + בלם + + + אראגואינה + + + אמריקה/סאן-פאולו + + + אמריקה/בהיאה + + + פורטאלזה + + + מאסיו + + + רסיפה + + + נורונהה + + + נסאו + + + טימפו + + + גאבורונה + + + מינסק + + + בליז + + + אמריקה/ונקובר + + + אמריקה/דוסון-קריק + + + אמריקה/אדמנטון + + + אמריקה/וויניפוג + + + אמריקה/טורנטו + + + אמריקה/מונטריאול + + + אמריקה/הליפקס + + + קוקוס + + + קינשסה + + + לובומבאשי + + + בנגואי + + + בראזאווייל + + + ציריך + + + אבידג'ן + + + רארוטונגה + + + איי הפסחא + + + אמריקה/סנטיאגו + + + דואלה + + + אסיה/שנחאי + + + בוגוטה + + + קוסטה ריקה + + + הוואנה + + + קייפ ורדה + + + איי חג המולד + + + ניקוסיה + + + ברלין + + + ג'יבאוטי + + + קופנהגן + + + דומיניקה + + + סנטו דומינגו + + + אלג'יר + + + פסיפי/גלאפגוס + + + גוויקיל + + + טאלין + + + קהיר + + + אל עיון + + + אסמרה + + + אטלנטי/קנרי + + + סאוטה + + + אירופה/מדריד + + + אדיס אבבה + + + הלסינקי + + + פיג'י + + + סטנלי + + + טרוק + + + פונפה + + + קוסרה + + + פארו + + + פריס + + + ליברווייל + + + אירופה/לונדון + + + גרנדה + + + טביליסי + + + קאיין + + + אקרה + + + גיברלטר + + + טולה + + + גודת'אב + + + סקורסביסונד + + + דנמרקסהוון + + + באנג'ול + + + קונאקרי + + + גוואד“לופ + + + מאלאבו + + + אתונה + + + איי ג'ורג'יה הדרומית + + + גוואטמלה + + + גואם + + + ביסאו + + + גוינה + + + הונג קונג + + + פורט או פרינס + + + בודפשט + + + אסיה/ג'קרטה + + + מאקאסאר + + + ג'איאפורה + + + דבלין + + + ירושלים + + + איי צ'גוס + + + בגדד + + + טהרן + + + רייקיאוויק + + + רומא + + + ג'מייקה + + + רבת עמון + + + טוקיו + + + ניירובי + + + בישקק + + + פנום פן + + + אנדרבורי + + + קיריטימאטי + + + טאראווה + + + קומורו + + + סנט קיטס + + + צפון קוריאה + + + דרום קוריאה + + + כווית + + + קיימן + + + אקטאו + + + אסיה/אורל + + + אקטובה + + + אלמאטי + + + וינטיאן + + + ביירות + + + סנט לוצ'יה + + + ואדוז + + + קולומבו + + + מונרוביה + + + מאסרו + + + וילניאוס + + + לוקסמבורג + + + ריגה + + + טריפולי + + + קזבלנקה + + + מונקו + + + קישינב + + + אנטננרבינו + + + מאג'ורו + + + באמאקו + + + ראנגון + + + חובד + + + אולאאנבטאר + + + צ'ואיבלסאן + + + מקאו + + + סאיפאן + + + מרטיניק + + + נוקשוט + + + מונטסראט + + + מאלטה + + + מאוריטיוס + + + מולדוביה + + + בלנטיר + + + אמריקה/מזטלן + + + אמריקה/מונטריי + + + אמריקה/מקסיקו סיטי + + + אמריקה/קנקון + + + קואלה לומפור + + + מאפוטו + + + ווינדהוק + + + נומאה + + + ניאמיי + + + איי נורפוק + + + לאגוס + + + מנאגואה + + + אמסטרדם + + + אוסלו + + + קטמנדו + + + נאורו + + + ניווה + + + פסיפי/אוקלנד + + + מוסקט + + + פנמה + + + לימה + + + פסיפי/טהיטי + + + איי מרקיז + + + איי גמביר + + + פורט מורנסבי + + + מנילה + + + קאראצ'י + + + ורשה + + + מיקלון + + + פיטקרן + + + פוארטו ריקו + + + עזה + + + האיים האזורים + + + אירופה/ליסבון + + + פלאו + + + אסונסיון + + + קתר + + + ריונין + + + בוקרשט + + + אירופה/מוסקבה + + + אירופה/סמרה + + + איה/אומסק + + + אסיה/נובוסיבירסק + + + קיגאלי + + + ריאד + + + גואדלקנל + + + מאהה + + + חרטום + + + שטוקהולם + + + סינגפור + + + סנט הלנה + + + פריטאון + + + דאקאר + + + מוגדישו + + + פרמאריבו + + + סאו טומה + + + סלבדור + + + דמשק + + + מבאבאנה + + + גרנד טורק + + + נג'מנה + + + קרגואלן + + + לומה + + + בנקוק + + + דושנבה + + + פאקאופו + + + דילי + + + אשחבאד + + + תוניסיה + + + טונגטאפו + + + איסטנבול + + + נמל ספרד + + + פונאפוטי + + + טייפה + + + דאר א-סאלם + + + אירופה/קייב + + + קמפלה + + + מידוויי + + + ג'ונסטון + + + וואק + + + פסיפי/הונולולו + + + זמן אלסקה + + + אמריקה/לוס-אנג'לס + + + אמריקה/פיניקס + + + אמריקה/שיפרוק + + + אמריקה/דנוור + + + אמריקה/צפון דקוטה/מרכז + + + אמריקה/שיקגו + + + אינדיאנפוליס + + + אמריקה/לואיסוויל + + + אמריקה/דטרויט + + + אמריקה/ניו-יורק + + + מונטווידאו + + + אסיה/סמרקנד + + + אסיה/טשקנט + + + סנט וינסנט + + + קאראקאס + + + טורטולה + + + סנט תומאס + + + סייגון + + + אפטה + + + ואליס + + + אפיה + + + עדן + + + מאיוט + + + יוהנסבורג + + + לוסאקה + + + הררה + + + + IST (הודו) + + + + + שעון ישראל + + + IST + + + + + + + . + , + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + פזטה אנדורית + + + דירהם של איחוד הנסיכויות הערביות + + + אפגני אפגני + + + לק אלבני + + + דראם ארמני + + + גילדן של האנטילים ההולנדיים + + + קואנזה אנגולי + + + קואנזה חדש אנגולי (1990-2000) + + + קואנזה רג׳וסטדו אנגולי (1995-1999) + + + פזו ארגנטינאי (1983-1985) + + + פזו ארגנטינאי + + + שילינג אוסטרי + + + דולר אוסטרלי + + + פלורין של ארובה + + + מנאט אזרביג׳אני (1993-2006) + + + מאנאט אזרביג׳ני + + + דינר של בוסניה־הרצגובינה + + + מארק בר המרה של בוסניה־הרצגובינה + + + דולר ברבדיאני + + + טאקה בנגלדשי + + + פרנק בלגי (בר המרה) + + + פרנק בלגי + + + לב בולגרי ישן + + + לב בולגרי + + + דינר בחרייני + + + פרנק בורונדי + + + דולר ברמודה + + + דולר ברוניי + + + בוליביאנו + + + פזו בוליבי + + + קרוזיארו חדש ברזילאי (1967-1986) + + + קרוזדו ברזילאי + + + ריאל ברזילאי + + + דולר בהאמי + + + נגולטרום בהוטני + + + פולה בוצוואני + + + דולר בליזי + + + דולר קנדי + + + פרנק קונגולזי + + + פרנק שוויצרי + + + פזו צ'ילאני + + + יואן רנמינבי סיני + + + פזו קולומביאני + + + קולון קוסטה־ריקני + + + דינר סרבי ישן + + + קורונה צ׳כית + + + פזו קובני + + + לירה קפריסאית + + + קורונה צ'כית + + + מרק מזרח גרמני + + + מרק גרמני + + + פרנק ג׳יבוטי + + + כתר דני + + + פזו דומיניקני + + + דינר אלג׳ירי + + + סוקר אקואדורי + + + קרון אסטוני + + + לירה מיצרית + + + נאקפה אריתראי + + + פזטה [ESA] + + + פזטה [ESB] + + + פסטה ספרדי + + + ביר אתיופי + + + אירו + + + מרק פיני + + + דולר פיג'י + + + לירה של איי פוקלנד + + + פרנק צרפתי + + + לירה שטרלינג + + + לרי גאורגי + + + פאונד גיברלטר + + + דלאסי גמבי + + + פרנק גינאי + + + דרכמה + + + קצל גואטמלי + + + פזו גינאי + + + דולר גיאני + + + דולר הונג קונגי + + + למפירה הונדורי + + + קונה קרואטי + + + גארד האיטי + + + פורינט הונגרי + + + רופיה אינדונזית + + + לירה אירית + + + לירה ישראלית + ל״י + + + ש"ח + שקלים חדשים + + + רופי הודית + + + דינר עירקי + + + ריאל איראני + + + קרונה איסלנדית + + + לירה איטלקית + + + דולר ג'מאיקני + + + דינר ירדני + + + ין יפני + + + שילינג קנייאתי + + + סום קירגיזי + + + ריל קמבודי + + + פרנק קומורואי + + + וון צפון קוראני + + + וון דרום קוראני + + + דינר כוויתי + + + דולר קיימאני + + + טנגה קזחסטני + + + קיפ לאי + + + לירה לבנונית + + + רופי סרי לנקי + + + דולר ליברי + + + לוטי לסותי + + + ליטא ליטאי + + + פרנק לוקסמבורגי + + + לט לטבי + + + דינר לובי + + + דירהם מרוקאי + + + פרנק מרוקאי + + + ליאו מולדובני + + + פרנק מדגסקארי + + + קיאט מיאנמרי + + + טוגרוג + + + פטקה + + + לירה מלטית + + + רופי מאוריציני + + + רופיה מלדיבית + + + קואצ׳ה מלאוי + + + פזו מקסיקני + + + פזו מקסיקני (1861 - 1992) + + + רינגיט מלזי + + + מטיקל + + + דולר נמיבי + + + נאירה ניגרי + + + קורדובה ניקראגי + + + גילדן הולנדי + + + כתר נורבגי + + + רופי נפאלי + + + דולר ניו זילנדי + + + בלבואה פנמי + + + סול פרואני חדש + + + קינה של פפואה גינאה החדשה + + + פזו פיליפיני + + + רופי פקיסטני + + + זלוטי פולני + + + זלוטי (1950 - 1995) + + + אסקודו פורטוגלי + + + גוורני פראגוואי + + + ריאל קטארי + + + לאו רומני ישן + + + לאו רומני חדש + + + דינר סרבי + + + רובל + + + רובל רוסי (1991 - 1998) + + + פרנק רואנדי + + + ריאל סעודי + + + דולר איי שלמה + + + רופי סיישלי + + + דינר סודני + + + לירה סודנית + + + כתר שוודי + + + דולר סינגפורי + + + פאונד סנט הלני + + + טולאר סלובני + + + קורונה סלובקי + + + ליאון סיירה לאוני + + + שילינג סומאלי + + + דולר סורינאמי + + + גילדר סורינאמי + + + דוברה של סן טומה ופרינסיפה + + + רובל סובייטי + + + לירה סורית + + + לילנגני סווזי + + + בהט תאילנדי + + + סומוני טג'קיסטני + + + מנאט טורקמאני + + + דינר טוניסאי + + + פאאמגה טונגי + + + אסקודו טימוראי + + + לירה טורקית + + + לירה טורקית חדשה + + + דולר טרינידדי + + + דולר טאייוני חדש + + + שילינג טנזני + + + גריבנה אוקראיני + + + שילינג אוגנדי (1966 - 1987) + + + שילינג אוגנדי + + + דולר אמריקאי + + + דולר אמריקאי (היום הבא) + + + דולר אמריקאי (היום הזה) + + + פזו אורוגוואי + + + סום אוזבקי + + + בוליבר ונצואלי + + + דונג וייטנאמי + + + ואטו של ונואטו + + + טאלה סמואי + + + פרנק CFA + + + כסף + + + זהב + + + דולר מזרח קריבי + + + זכויות משיכה מיוחדות + + + פרנק זהב + + + פלדיום + + + פלטינה + + + סימון למטרות בדיקה + + + סימון "ללא מטבע" + + + דינר תימני + + + ריאל תימני + + + דינר יגוסלבי חדש + + + דינר יגוסלבי + + + ראנד דרום אפריקאי (כספי) + + + ראנד דרום אפריקאי + + + קוואצ'ה זמבית + + + זאיר חדש + + + דולר זימבבואי + + + + + + {0} יום + {0} ימים + + + {0} שעה + {0} שעות + + + {0} דקה + {0} דקות + + + {0} חודש + {0} חודשים + + + {0} שניה + {0} שניות + + + {0} שבוע + {0} שבועות + + + {0} שנה + {0} שנים + + + + + כן:כ + לא:ל + + + + diff --git a/lib/zend/Zend/Locale/Data/he_IL.xml b/lib/zend/Zend/Locale/Data/he_IL.xml new file mode 100644 index 0000000000..14d33a535e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/he_IL.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/hi.xml b/lib/zend/Zend/Locale/Data/hi.xml new file mode 100644 index 0000000000..da86469943 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/hi.xml @@ -0,0 +1,3344 @@ + + + + + + + + + + + {0} ({1}) + , + + + अफ़ार + अब्खाज़ियन् + अचाइनीस + अकोली + अदान्गमे + अदिघे + अवेस्तन + अफ्रीकी + अफ्रो-एशियाई भाषाएँ + अफ्रिहिली + ऐनू + अकन + अक्केदिअन + अलेउत + एल्गोनक्युइअन भाषा + दक्षिणी अल्ताई + अम्हारिक् + अर्गोनी + पुरानी अंग्रेज़ी + अंगिका + अपाचे भाषा + अरबी + ऐरेमेक + एरोकैनियन + अराफाओ + कृत्रिम भाषा + अरावक + असामी + अस्तुरियन + अथापास्कान भाषा + आस्ट्रेलियाई भाषा + अवेरिक + अवधी + आयमारा + अज़रबैंजानी + बशख़िर + बांदा + बमिलेके भाषा + बलूची + बालिनीस + बसा + बाल्टिक भाषा + बैलोरूशियन् + बेजा + बेम्बा + बरबर + बल्गेरियाई + बिहारी + भोजपुरी + बिस्लामा + बिकोल + बिनी + सिक्सिका + बाम्बारा + बँगाली + बन्तु + तिब्बती + ब्रेटन + ब्रज + बोस्नियाई + बताक + बुरियात + बगिनीस + ब्लिन + कातालान + कैड्डो + मध्य अमेरिकी इंडियन भाषा + कैरिब + कॉकेशियन भाषा + अत्सम + चेचन + सिबुआनो + केल्टिक भाषा + कमोरो + चिब्चा + छगाताई + चूकीस + मारी + चिनूक जारगॉन + चोक्तौ + शिपेव्यान + शेरूकी + शेयेन्न + शैमिक भाषा + कोर्सीकन + कॉप्टिक + अंग्रेजी आधारित क्रेओल या पिजिन + फ्रेंच आधारित क्रेओल या पिजिन + पुर्तगाली आधारित क्रेओल या पिजिन + क्री + क्रीमीन तुर्की + क्रेओल या पिजिन + चेक + काशुबियन + चर्च साल्विक + कुशितिक भाषा + चूवाश + वेल्श + डैनीश + दाकोता + दार्गवा + दायक + ज़र्मन + जर्मन (ऑस्ट्रिया) + डिलैवेयर + स्लेव + डोग्रिब + दिन्का + डोग्री + द्रविण भाषा + निचला सॉर्बियन + दुआला + मध्य पुर्तगाली + दिवेही + ड्युला + ज़ोन्गखा + ईवे + एफिक + प्राचीन मिस्री + एकाजुक + ग्रीक + एलामाइट + अंग्रेजी + अंग्रेज़ी (ऑस्ट्रेलिया) + अंग्रेज़ी(कनाडाई) + अंग्रेजी(ब्रिटिश) + अंग्रेज़ी अमेरीकी + मिडिल अंग्रजी + एस्पेरान्तो + स्पेनिश + लेटिन अमेरिकी स्पेनिश + ईवेरियाई स्पेनिश + ऐस्तोनियन् + बास्क् + इवोन्डो + पर्शियन् + फैन्ग + फन्टी + फुलाह + फिनिश + फिलिपिनो + फिन्नो-उग्रीयन भाषा + फ़ीजी + फिरोज़ी + फॉन + फ्रेंच + फ़्रेंच(कनाडाई) + मिडिल फ्रेंच + पुरानी फ्रांसीसी + उत्तरी फ्रीसीयन + पूर्वी फ्रीसीयन + फ्रीयुलीयान + पश्चिमी फ़्रिसियाई + आयरिश + गा + गायो + ग्बाया + स्काट्स् गायेलिक् + जर्मनिक भाषा + गीज़ + गिल्बरतीस + गैलिशियन् + मध्यकालीन हाइ जर्मन + गुआरानी + पुरातन हाइ जर्मन + गाँडी + गोरोन्तालो + गॉथिक + ग्रेबो + प्राचीन यूनानी + स्विस जर्मन + गुज़राती + मैंक्स + ग्विच'इन + होउसा + हैडा + हावाइयन + हीब्रू + हिन्दी + हिलिगेनन + हिमाचली + हिताइत + ह्मॉंग + हिरी मोटू + क्रोएशन् + ऊपरी सॉर्बियन + हैतीयन + हंगेरी + हूपा + अरमेनियन् + हरैरो + ईन्टरलिंगुआ + इबान + इन्डोनेशियाई + ईन्टरलिंगुइ + ईग्बो + सिचुआन यी + इजो + इनुपियाक् + इलोको + भारतीय भाषा + इंडो-युरोपीय भाषा + इंगुश + इडौ + ईरानी भाषा + इरोक्युओइयन भाषा + आईस्लैंडिक् + इतालवी + इनूकीटूत् + जापानी + लोज्बान + जुदेओ-पर्शियन + जुदेओ-अरेबिक + जावानीस + जॉर्जीयन् + कारा-कल्पक + कबाइल + काचिन + ज्जु + कम्बा + कारेन + कावी + कबार्डियन + त्याप + कोरो + कोंगो + खासी + खोइसन भाषा + खोतानीस + किकुयू + क्वान्यामा + कज़ाख + ग्रीनलैंडिक + कैम्बोडियन् + किम्बन्दु + कन्नड़ + कोरीयन् + कोंकणी + कोसरैन + क्पेल्लै + कनुरी + कराचय-बल्कार + करेलियन + क्रु + कुरूख + कश्मीरी + कुरदीश + कुमीक + कुतेनाई + कोमी + कोर्निश + किरघिज़ + लैटीन + लादीनो + लाह्न्डा + लाम्बा + लक्ष्ज़ेमबर्गिश + लेज़्घीयन + गांडा + लिंबर्गिश + लिंगाला + लाओथीयन् + मोंगो + लोज़ी + लिथुनियन् + ल्यूबा-कटांगा + ल्यूबा-लुलुआ + लुइसेनो + लुन्डा + ल्युओ + लुशाई + लातवी + मादुरीस + मगाही + मैथिली + मकासर + मन्डिन्गो + ऑस्ट्रोनेशियन + मसाई + मोक्ष + मंधार + मेन्डे + मालागासी + मिडिल आइरिश + मार्शलीज़ + मेओरी + मिकमैक + मिनांग्काबाउ + विविध भाषा + मैसेडोनियन् + मॉन-ख्मेर भाषा + मलयालम + मंगोलीयाई + मन्चु + मणिपूरी + मनोबो भाषा + मोलडावियन् + मोहौक + मोस्सी + मराठी + मलय + मालटिस् + विविध भाषाएँ + मुन्डा भाषा + क्रीक + मिरांडी + मारवाड़ी + बर्लिस + माया भाषा + एर्ज़या + नाउरू + नहुआत्ल + उत्तरी अमेरीकी इंडियन भाषा + नीपोलिटन + नॉर्वेजियन बोकमाल + उत्तरी देबेल + निचला जर्मन + नेपाली + नेवाड़ी + डोन्गा + नियास + नाइगर-कोर्डोफैनियन भाषा + नियुआन + डच् + नॉर्वेजियन नाइनोर्स्क + नार्वेजियन + नोगाई + पुराना नॉर्स + एन्को + दक्षिण देबेल + उत्तरी सोथो + न्युबियान भाषा + नावाजो + पारम्परिक नेवारी + न्यानजा + न्यामवेज़ी + न्यानकोल + न्योरो + न्ज़ीमा + ओसीटान + ओजिब्वा + ओरोमो + उड़िया + ओस्सेटिक + ओसेज + ओटोमान तुर्किश + ओटोमियन भाषा + पंजाबी + पापुआन भाषा + पंगासीनान + पाह्लावी + पाम्पान्गा + पापियामेन्टो + पलोउआन + पुरानी फारसी + फिलिपीन भाषा + फोएनिशियन + पाली + पॉलिश + पोह्नपिएन + प्राकृत + पुरानी प्रोवेन्सल + पॉशतो + पुर्तगाली + पुर्तगाली (ब्राज़ील) + ईवेरियाई पुर्तगाली + क्वेशुआ + राजस्थानी + रापानुई + रारोतोंगन + रहेय्टो-रोमान्स + रुन्दी + रोमानियाई + रोमांस भाषा + रोमानी + रूट + रूसी + अरोमानियन + किन्यारवाण्डा + संस्कृत + सन्डावे + याकूत + दक्षिण अमेरीकी इंडियन भाषा + सलीशन भाषा + सामैरिटन अरैमिक + सासाक + संताली + सार्दिनियन + सिसिलियन + स्कॉट्स + सिन्धी + नॉर्दन सामी + सेल्कप + सेमिटिक भाषा + सांगो + पुरानी आइरिश + सांकेतिक भाषा + सेर्बो-क्रोएशन् + शैन + शिंघालीस् + सिदामो + सिउआन भाषा + चीनी-तिब्ब्ती भाषा + स्लोवाक् + स्लोवेनियन् + स्लोवियाई भाषा + सामोन + दक्षिण सामी + सामी भाषा + ल्युल सामी + इनारी सामी + स्कोल्ट सामी + सोणा + सोनिन्के + सोमाली + सोग्डिएन + सोन्घाई + अल्बेनियन् + सर्बियन् + स्रानान टॉन्गो + सेरेर + स्वाती + नील सहारी भाषा + सेसोथो + सुंडानी + सुकुमा + सुसु + सुमेरियन + स्विडिश + स्वाहिली + क्लासिकल सिरिएक + सिरिएक + तमिल + ताई भाषा + तेलेगु + टिम्ने + तेरेनो + तेतुम + ताजिक् + थाई + तिग्रीन्या + टाइग्रे + तिव + तुक्रमेन + तोकेलाऊ + तागालोग + क्लिंगन + त्लिंगित + तामाशेक + सेत्स्वाना + टोंगा + न्यासा टोन्गा + टोक पिसिन + तुर्की + सोंगा + त्सिमीशियन + टाटर + तम्बूका + ट्यूपी भाषा + अल्तैक भाषा + तुवालु + ट्वी + ताहितियन + तुवीनियन + उदमुर्त + उईघुर + युगैरिटिक + यूक्रेनी + उम्बुन्डु + अज्ञात या अवैध भाषा + उर्दू + उज़्बेक + वाई + वेन्दा + वियेतनामी + वोलापुक + वॉटिक + वाल्लून + वाकाशन भाषा + वलामो + वारै + वाशो + सॉर्बियन भाषा + वोलोफ + काल्मिक + षोसा + याओ + यापीस + येहुदी + योरूबा + यूपिक भाषा + ज़ुआंग + ज़ेपोटेक + ब्लिसिम्बॉल्स + ज़ेनान्गा + चीनी + चीनी (सरलीकृत) + चीनी (पारम्परिक) + ज़न्डे + ज़ुलू + ज़ूनी + कोई लिंग्विस्ट सामग्री नहीं + ज़ाज़ा + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + दुनिया + अफ्रीका + उत्तर अमेरिका + दक्षिण अमेरिका + ओशिआनिया + पश्चिमी अफ्रीका + मध्य अमरीका + पूर्वी अफ्रीका + उत्तरी अफ्रीका + मध्य अफ्रीका + दक्षिणी अफ्रीका + अमेरीकास + उत्तरी अमेरिका + कैरिबियन + पूर्वी एशिया + दक्षिणी एशिया + दक्षिण-पूर्व एशिया + दक्षिणी यूरोप + ऑस्ट्रेलिया एवं न्यूजीलैंड + मेलानेशिया + माइक्रोनेशियन रीजन + पोलीनेशिया + दक्षिण-मध्य एशिया + एशिया + मध्य एशिया + पश्चिमी ऐशिया + यूरोप + पूर्वी यूरोप + उत्तरी यूरोप + पश्चिमी यूरोप् + कॉमनवेल्थ ऑफ इंडिपेंडेंट स्टेट्स + चेकोस्लवाकिया + लेटिन अमेरिका और कैरिबियन + चैनल द्वीपसमूह + अन्डोरा + संयुक्त अरब अमीरात + अफ़गानिस्तान + एंटिगुआ और बरबुडा + एंगुइला + अल्बानिया + आर्मेनिया + नीदरलैंड्स एंटिलीज़ + अंगोला + अंटार्कटिका + अर्जेन्टीना + अमेरिकी समोआ + ऑस्ट्रिया + ऑस्ट्रेलिया + अरूबा + एलैंड द्वीपसमूह + अज़रबैजान + बोस्निया और हर्ज़िगोविना + बारबाडोस + बांग्लादेश + बेल्जियम + बुर्किना फ़ासो + बुल्गारिया + बाहरेन + बुरुंडी + बेनिन + सेंट बार्थेलेमी + बरमूडा + ब्रुनेई + बोलीविया + ब्राजील + बहामा + भूटान + बौवेत द्वीप + बोत्स्वाना + बेलारूस + बेलिज + कनाडा + कोकोस द्वीप + कोंगो जनतांत्रिक गणतंत्र + सेंट्रल अफ्रीकन रिपब्लिक + कांगो + स्विस + आईवरी कोस्ट + कुक द्वीपसमूह + चिली + कैमरून + चीन + कोलम्बिया + कोस्टारीका + सर्बिया व मॉण्टेनेग्रो + क्यूबा + कैप वर्डे + क्रिसमस द्वीप + साइप्रस + चेक गणराज्य + जर्मनी + जिबूती + डेनमार्क + डोमिनिक + डोमिनिकन गणराज्य + अल्जीरिया + इक्वाडोर + एस्टोनिया + मिस्र + पश्चिमी सहारा + इरिट्रिया + स्पेन + इथियोपिया + फिनलैंड + फिजी + फ़ॉकलैंड द्वीप + माइक्रोनेशिया + फरोए द्वीप + फ्रांस + गैबॉन + ब्रितन + ग्रेनेडा + जॉर्जिया + फ़्रांसीसी गिआना + ग्वेर्नसे + घाना + जिब्राल्टर + ग्रीनलैण्ड + गाम्बिया + गिनी + ग्वाडेलोप + इक्वेटोरियल गिनी + ग्रीस + दक्षिण जोर्जिया और दक्षिण सैंडविच द्वीपसमूह + गोतेदाला + गुआम + गीनी-बिसाउ + गुयाना + हांगकांग विशेष प्रशासनिक क्षेत्र चीन + हर्ड द्वीप और मैकडोनॉल्ड द्वीप + हाण्डूरस + क्रोशिया + हाइती + हंगरी + इंडोनेशिया + आयरलैंड + इसराइल + आइल ऑफ मैन + भारत + ब्रिटिश हिंद महासागरीय क्षेत्र + इराक + ईरान + आइसलैंड + इटली + जर्सी + जमाइका + जोर्डन + जापान + केन्या + किर्गिज़तान + कम्बोडिया + किरिबाती + कोमोरोस + सेंट किट्स और नेविस + उत्तर कोरिया + दक्षिण कोरिया + कुवैत + केमैन द्वीपसमूह + कजाखस्तान + लाओस + लेबनान + सेंट लूसिया + लिकटेंस्टीन + श्रीलंका + लाइबेरिया + लेसोथो + लिथुआनिया + लक्समबर्ग + लात्विया + लीबिया + मोरक्को + मोनाको + मोल्डाविया + मोंटेनेग्रो + सेंट मार्टिन + मैडागास्कर + मार्शल द्वीप + मैसेडोनिया + माली + म्यानमार + मंगोलिया + मकाओ चीन + नॉर्दन मारियाना द्वीपसमूह + मार्टीनिक + मॉरिटानिया + मॉन्ट्सेराट + माल्टा + मॉरिशस + मालदीव + मलावी + मेक्सिको + मलेशिया + मोजाम्बिक + नामीबिया + न्यू कैलेडोनिया + नाइजर + नॉरफ़ॉक द्वीप + नाइजीरिया + निकारागुआ + नीदरलैण्ड + नॉर्वे + नेपाल + नाउरु + नीयू + न्यूज़ीलैंड + ओमान + पनामा + पेरू + फ़्रांसीसी पॉलिनेशिया + पापुआ न्यू गिनी + फिलीपिंस + पाकिस्तान + पोलैंड + सेंट पिएरे और मिक्वेलन + पिटकैर्न + पर्टो रीको + फ़िलिस्तीन + पुर्तगाल + पलाऊ + पारागुए + कतर + आउटलाइंग ओशिनिया + यूरोपीय संघ + रियूनियन + रोमानिया + सर्बिया + रूस + रूआण्डा + सऊदी अरब + सोलोमन द्वीप + सेशेल्स + सूडान + स्वीडन + सिंगापुर + सेंट हेलेना + स्लोवेनिया + स्वालबर्ड और जान मायेन + स्लोवाकिया + सियरालेओन + सैन मेरीनो + सेनेगल + सोमालिया + सुरिनाम + साउ-तोम-प्रिंसिप + अल साल्वाडोर + सीरिया + सुआजीलैंड + तुर्क् और् कैकोज़ द्वीप + चाड + फ़्रांसीसी दक्षिणी क्षेत्र + टोगो + थाइलैंड + ताजिकिस्तान + तोकेलाउ + पूर्वी तिमोर + तुर्कमेनिस्तान + तुनिशिया + टोंगा + तुर्की + त्रिनिडाड और टोबैगो + तुवालु + ताइवान + तंजा़निया + यूक्रेन + युगांडा + युनाइटेड स्टेट्स माइनर आउटलाइंग द्वीपसमूह + संयुक्त राज्य अमेरिका + युरूगुए + उजबेकिस्तान + वैटिकन + सेंट विनसेंट एंड ग्रेनाडाइन्स + वेनेजुएला + ब्रिटिश वर्जिन द्वीपसमूह + अमेरिकी वर्जिन टापू + वियतनाम + वानुअतु + वालिस और फ़्यूचूना + समोआ + यमन + मैयट + दक्षिण अफ्रीका + जाम्बिया + जिम्बाब्वे + अज्ञात या अवैध क्षेत्र + + + पारम्पारिक जर्मन वर्तनी + जर्मेनी की 1996 वर्तनी + पूर्वी अर्मेनियाई + एकस्वरीय + जीवा बोली + बहुस्वरीय + कम्प्यूटर + संशोधित वर्तनी + + + पंचाग + मिलान + मुद्रा + + + पारम्पारिक चीनी वर्गीकरण + बौद्ध पंचांग + चीनी पंचांग + प्रत्यक्ष वर्गीकरण + सरलीकृत चीनी वर्गीकरण + ग्रेगरी पंचांग + हिब्रू पंचांग + भारतीय पंचांग + इस्लामी पंचांग + इस्लामी नागरिक पंचांग + जापानी पंचांग + दूरभाष निर्देशिका वर्गीकरण + पिनयीन वर्गीकरण + चीनी गणतंत्र पंचांग + स्ट्रोक वर्गीकरण + पारम्पारिक वर्गीकरण + + + यूएस + मेट्रिक + + + + [ॐ ०-९ अ-ऍ ए-ऑ ओ-न प-र ल ळ व-ह ़ ँ-ः ऽ ् ा-ॅ े-ॉ ो ौ] + [\u200C \u200D] + [a-c č d-l ł m-o º p-z] + + + ' + ' + " + " + + + + + + + + मस्केरेम + टेकेम्ट + हेदर + तहसास + टर + येकाटिट + मेगाबिट + मियाज़िया + गनबोट + सेन + हम्ले + नेहासे + पागूमन + + + + + + + + + जनवरी + फरवरी + मार्च + अप्रैल + मई + जून + जुलाई + अगस्त + सितम्बर + अक्तूबर + नवम्बर + दिसम्बर + + + ज + + + जनवरी + फरवरी + मार्च + अप्रैल + मई + जून + जुलाई + अगस्त + सितम्बर + अक्तूबर + नवम्बर + दिसम्बर + + + + + ज + फ़ + मा + अ + म + जू + जु + अ + सि + अ + न + दि + + + + + + + रवि + सोम + मंगल + बुध + गुरु + शुक्र + शनि + + + रविवार + सोमवार + मंगलवार + बुधवार + गुरुवार + शुक्रवार + शनिवार + + + + + र + सो + मं + बु + गु + शु + श + + + + + + + द्वितीय चौथाई + + + प्रथम चौथाई + द्वितीय चौथाई + तृतीय चौथाई + चतुर्थ चौथाई + + + + + 1 + 2 + + + प्रथम चौथाई + + + + AM + PM + + + ईसापूर्व + सन + + + + + + EEEE, d MMMM y + + + + + d MMMM y + + + + + dd-MM-yyyy + + + + + d-M-yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + EEEE,dd MMMM GGGGy + HH:mm + HH:mm:ss + H:mm + E, d/M + E, d MMM + E, d MMMM + d MMMM + d MMM + dd MMM + dd-MM + d/M + d + hh:mm a + hh:mm:ss a + mm:ss + y + M-y + MMM y + EEE, d MMM y + y Q + EEE, d MMM yy + d MMM, yy + dd-MM-yy + Q yy + MM-yyyy + MMMM y + + + + + काल + + + साल + + + महीना + + + सप्ताह + + + दिन + Yesterday + Today + Tomorrow + + + सप्ताह का दिन + + + घंटा + + + मिनट + + + सेकेंड + + + क्षेत्र + + + + + + + + चैत्र + वैशाख + ज्येष्ठ + असध + श्रावण + भाद्र + अश्विन + कार्तिक + अग्रायण + पौष + माघ + फाल्गुन + + + चैत्र + वैशाख + ज्येष्ठ + असध + श्रावण + भाद्रपद + अश्विन + कार्तिक + अग्रायण + पौष + माघ + फाल्गुन + + + + + + + + + मुहर्रम + सफर + राबी प्रथम + राबी द्वितीय + जुम्डा प्रथम + जुम्डा द्वितीय + रजब + शावन + रमजान + शव्व्ल + + + मुहर्रम + सफर + राबी प्रथम + राबी द्वितीय + जुम्डा प्रथम + जुम्डा द्वितीय + रजब + शावन + रमजान + शव्व्ल + + + + + मुहर्रम + सफर + राबी प्रथम + राबी द्वितीय + जुम्डा प्रथम + जुम्डा द्वितीय + रजब + शावन + रमजान + शव्व्ल + + + + + + + + ताएका + हाकूची + हाकूहो + शूचो + ताहिओ + केउन + वाडू + रैकी + योरो + टेम्प्यो + टेम्प्यो-काम्पो + टेम्प्यो-शोहो + टेम्प्यो-होजी + टेम्प्यो-जिंगो + टेम्प्यो-किउन + होकी + टेनो + इंर्याकू + डाईडू + क़ोनिन + टेंचो + शोवा + काज्यो + निंजू + शाईकू + टेनन + जोगन् + गेंकेई + निन्ना + केम्प्यो + शूताई + ईंगी + ईंचो + शोहेई + टेंग्यो + टेंर्याकू + टेंटूकू + ओवा + कोहो + अन्ना + टेंरोकू + टेन-एन + जोगन् + टेंगेन + ईकान + कन्ना + ई-एन + एइसो + चोटूकु + चोहो + कंको + च्योवा + कन्निन + ज़ियान + मंजू + चोगन + चोर्याकू + चोक्यु + कांटूको + ईशो + टेंगी + कोहैइ + जिर्याकू + ईंक्यू + सोहो + शोर्याकू + ईहो + ओटूको + कांजि + कोहो + ईचो + शोटूको + कोवा + चोजी + काशो + टेन्निन + टेन-ई + ईक्यू + जेन-ई + होआन + तेंजी + दाईजी + टेंशो + चोशो + होएन + ईजी + टेन्यो + क्यूआन + निंपैई + क्योजो + होगेन + हैजी + ईर्याकू + ओहो + चोकान + ईमान + निन-आन + काओ + शोअन + अंजन + जिशो + योवा + जूऐई + जेंर्याकू + बूंजी + केंक्यू + शोजी + केन्निन + जेंक्यू + केन-ई + शोगेन + केंर्याकू + केंपो + शोक्यू + जू + जेन्निन + कोरोकू + अंटैइ + कांकी + जोएई + टेम्पूकू + बुंर्याकू + काटेई + र्याकूनिन + ईन-ओ + निंजी + होजी + केंचो + कोगेन + शोका + शोगेन + बुन-ओ + कोचो + बुन-ई + केंजी + कोअन + शो + ईनिन + शोअन + केंजेन + काजेन + टोकूजी + ईंकेई + ओचो + शोवा + बुंपो + जेनो + जेंक्यो + शोचू + कारेकी + जेंटोकू + गेंको + केम्मू + ईंजेन + कोकोकू + शोहेई + केंटोकू + बूंचो + टेंजो + कोर्याकू + कोवा + जेंचू + मेटोकू + काकेई + कू + ओई + शोचो + ईक्यो + काकीत्सू + बुन-अन + होटोकू + क्योटोकू + कोशो + चोरोकू + कांशो + बुंशो + ओनिन + बुन्मेई + चोक्यो + ईंटोकू + मेईओ + बुंकी + ईशो + ताईएई + क्योरोकू + टेन्मन + कोजी + ईरोकू + जेंकी + टेंशो + बुंरोकू + केईचो + जेनवा + कान-एई + शोहो + केईआन + शो + मेईर्याकू + मानजी + कनबुन + ईंपो + टेंवा + जोक्यो + जेंरोकू + शोटूको + क्योहो + जेंबुन + कांपो + इंक्यो + कान-एन + होर्याकू + मेईवा + अन-एई + टेनमेई + कांसेई + क्योवा + बुंका + बुंसेई + टेंपो + कोका + काईए + अंसेई + मान-ईन + बुंक्यौ + जेंजी + केईओ + मेजी + ताईशो + शोवा + हेईसेई + + + ताएका + हाकूची + हाकूहो + शूचो + ताहिओ + केउन + वाडू + रैकी + योरो + जिंकी + टेम्प्यो + टेम्प्यो-काम्पो + टेम्प्यो-शोहो + टेम्प्यो-होजी + टेम्प्यो-जिंगो + टेम्प्यो-किउन + होकी + टेनो + इंर्याकू + डाईडू + क़ोनिन + टेंचो + शोवा + काज्यो + निंजू + शाईकू + टेनन + जोगन् + गेंकेई + निन्ना + केम्प्यो + शूताई + ईंगी + ईंचो + शोहेई + टेंग्यो + टेंर्याकू + टेंटूकू + ओवा + कोहो + अन्ना + टेंरोकू + टेन-एन + जोगन् + टेंगेन + ईकान + कन्ना + ई-एन + एइसो + शोर्याकू + चोटूकु + चोहो + कंको + च्योवा + कन्निन + ज़ियान + मंजू + चोगन + चोर्याकू + चोक्यु + कांटूको + ईशो + टेंगी + कोहैइ + जिर्याकू + ईंक्यू + सोहो + शोर्याकू + ईहो + ओटूको + कांजि + कोहो + ईचो + शोटूको + कोवा + चोजी + काशो + टेन्निन + टेन-ई + ईक्यू + जेन-ई + होआन + तेंजी + दाईजी + टेंशो + चोशो + होएन + ईजी + कोजी + टेन्यो + क्यूआन + निंपैई + क्योजो + होगेन + हैजी + ईर्याकू + ओहो + चोकान + ईमान + निन-आन + काओ + शोअन + अंजन + जिशो + योवा + जूऐई + जेंर्याकू + बूंजी + केंक्यू + शोजी + केन्निन + जेंक्यू + केन-ई + शोगेन + केंर्याकू + केंपो + शोक्यू + जू + जेन्निन + कोरोकू + अंटैइ + कांकी + जोएई + टेम्पूकू + बुंर्याकू + काटेई + र्याकूनिन + ईन-ओ + निंजी + कांजेन + होजी + केंचो + कोगेन + शोका + शोगेन + बुन-ओ + कोचो + बुन-ई + केंजी + कोअन + शो + ईनिन + शोअन + केंजेन + काजेन + टोकूजी + ईंकेई + ओचो + शोवा + बुंपो + जेनो + जेंक्यो + शोचू + कारेकी + जेंटोकू + गेंको + केम्मू + ईंजेन + कोकोकू + शोहेई + केंटोकू + बूंचो + टेंजो + कोर्याकू + कोवा + जेंचू + मेटोकू + काकेई + कू + मेटोकू + ओई + शोचो + ईक्यो + काकीत्सू + बुन-अन + होटोकू + क्योटोकू + कोशो + चोरोकू + कांशो + बुंशो + ओनिन + बुन्मेई + चोक्यो + ईंटोकू + मेईओ + बुंकी + ईशो + ताईएई + क्योरोकू + टेन्मन + कोजी + ईरोकू + जेंकी + टेंशो + बुंरोकू + केईचो + जेनवा + कान-एई + शोहो + केईआन + शो + मेईर्याकू + मानजी + कनबुन + ईंपो + टेंवा + जोक्यो + जेंरोकू + होएई + शोटूको + क्योहो + जेंबुन + कांपो + इंक्यो + कान-एन + होर्याकू + मेईवा + अन-एई + टेनमेई + कांसेई + क्योवा + बुंका + बुंसेई + टेंपो + कोका + काईए + अंसेई + मान-ईन + बुंक्यौ + जेंजी + केईओ + मेजी + ताईशो + शोवा + हेईसेई + + + म + ट + स + ह + + + + + + + + फर्वादिन + ओर्दिवेहेस्ट + खोरर्दाद + टिर + मोरदाद + शाहरीवर् + मेहर + अवन + अज़र + डे + बहमन + ईस्फन्द् + + + फर्वादिन + ओर्दिवेहेस्ट + खोरर्दाद + टिर + मोरदाद + शाहरीवर् + मेहर + अवन + अज़र + डे + बहमन + ईस्फन्द् + + + + + फर्वादिन + ओर्दिवेहेस्ट + खोरर्दाद + टिर + मोरदाद + शाहरीवर् + मेहर + अवन + अज़र + डे + बहमन + ईस्फन्द् + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + अज्ञात + + + अंडोरा + + + दुबई + + + काबूल + + + एंटिगुआ + + + एंग्विला + + + टिरेन + + + येरेवन + + + क्यूराकाओ + + + लूएंडा + + + रोथेरा + + + पॉमर + + + दक्षिणी ध्रुव + + + स्योवा + + + मॉसन + + + डेविस + + + वोस्तोक + + + क़ेसी + + + डुमोंट ड'अर्विल + + + मैकमुर्डो + + + रियो गालेगोस + + + मेंडोजा + + + सान जुआन + + + उशूयिया + + + ला रिओजा + + + सान लुईस + + + कटामार्का + + + जुजोए + + + टोकूमन + + + कोर्डोवा + + + ब्यूनस आयरस + + + पागो पागो + + + वियना + + + पर्थ + + + यूक्ला + + + डार्विन् + + + एडिलेड + + + ब्रोकन हिल + + + क्यूरी + + + मेलबोर्न + + + होबर्ट् + + + लिंडेमान + + + सिडनी + + + ब्रिसबेन + + + लोर्ड होवे + + + अरूबा + + + बाकू + + + बारबाडोस + + + ढाका + + + ब्रसल्स + + + ओआगदूगू + + + सोफ़िया + + + बहरीन + + + बुजुम्बुरा + + + पोर्टो-नोवो + + + बरमूडा + + + ब्रूनेइ + + + ला पाज़ + + + ईरुनेपे + + + रियो ब्रान्को + + + पोर्टो वेल्हो + + + बोआ विस्ता + + + मनौस + + + कूईआबा + + + केम्पो ग्रान्दे + + + बेलेम + + + ऐरेग्वेना + + + साओ पॉलो + + + बहिया + + + फ़ोर्टालेज़ा + + + मेसीओ + + + रेचीफ़े + + + नोरोन्हा + + + नस्साउ + + + थिम्फू + + + गैबोरोन + + + मिंस्क + + + बेलिज़े + + + डौसन + + + व्हाईटहोर्स + + + इनूविक + + + वांकूवर + + + डौसन क्रिक + + + येलोनाईफ + + + एडमंटन + + + स्विफ्ट करंट + + + केम्ब्रिज खाड़ी + + + रेजिना + + + विनीपेग + + + रिसोल्यूट + + + रेनी नदी + + + रेंकिन इंलेट + + + कोरल बन्दरगाह + + + थंडर खाडी + + + निपिगन + + + टोरंटो + + + मोंट्रियल + + + इक्याल्यूईत + + + पंग्निर्टंग् + + + मोंक्ट्न + + + हेलिफेक्स + + + गूस खा़ड़ी + + + ग्लेस खा़ड़ी + + + ब्लांक-सेबलोन + + + सेंट जोंस + + + कोकोस + + + किन्शासा + + + लुबुमबाशी + + + बैंगुइ + + + ब्राज़ाविल + + + ज़्यूरिक + + + अबिद्जान + + + रारोटोंगा + + + ईस्टर + + + सेंटिएगो + + + दोआला + + + काश्गर + + + उरम्ची + + + चोंग्पिंग + + + हर्बिन + + + बोगोटा + + + कोस्टा रिका + + + हवाना + + + केप वर्डे + + + क्रिसमस + + + निकोसिया + + + बर्लिन + + + डिजिबौटी + + + कोपनहेगन + + + डॉमिनिका + + + संटो डोमिंगो + + + अल्जीरिया + + + गेलापगोस + + + ग्वायाक्विल + + + टैलिन + + + कायरो + + + एल आइउन + + + असमेरा + + + कैनेरी + + + क्यूटा + + + मैड्रिड + + + ऐडिस अबाबा + + + हेल्सिंकी + + + फ़िजी + + + स्टैन्ली + + + ट्रुक + + + पोनापे + + + कोसराए + + + फ़ैरो + + + पेरिस + + + लिबरविल + + + लंदन + + + ग्रेनाडा + + + बिलिसी + + + कयेन + + + ऐक्रा + + + जिब्राल्टर + + + थ्यूले + + + गॉडथैब + + + स्कोर्सबाइसंड + + + डेनमार्क्षवन + + + बनजुल + + + कोनाक्री + + + गौडलोप + + + मालाबो + + + एथेंस + + + साउथ जॉर्जिया + + + ग्वाटेमाला + + + ग्वाम + + + बिस्साउ + + + गुयाना + + + हाँगकाँग + + + पोर्ट-आउ-प्रिंस + + + बुडापेस्ट + + + जकार्ता + + + पोंतिआंक + + + मकस्सर + + + जयापुरा + + + डबलिन + + + येरुसलम + + + चागोस + + + बगदाद + + + तेहरान + + + रेक्याविक + + + रोम + + + जमैका + + + अम्मान + + + टोक्यो + + + नैरोबी + + + बिश्केक + + + नोम पेन्ह + + + एंडरबेरी + + + किरीतिमाति + + + टरावा + + + कोमोरो + + + सेंट किट्ट्स + + + प्योंगयांग + + + सोल + + + कुवैत + + + केमन + + + अक्ताउ + + + ओरल + + + अक्टोब + + + केज़ेलोर्डा + + + अल्माटी + + + वियंतियेन + + + बेरुत + + + सेंट लुसीया + + + वादुज़ + + + कोलंबो + + + मोन्रोविया + + + मसेरू + + + विल्निअस + + + लक्ज़मबर्ग + + + रिगा + + + त्रिपोली + + + कैसाब्लैंका + + + मोनाको + + + चिसीनौ + + + ऐंटनानरीवो + + + क्वजलेन + + + मजूरो + + + बमाको + + + रंगून + + + होव्ड + + + उलानबाटर + + + चोइबालसन + + + मकाऊ + + + सइपान + + + मारटीनीक + + + नौवाक्चॉट + + + मोन्त्सेरत + + + माल्टा + + + मॉरिशस + + + मालदीव + + + ब्लैंटायर + + + टिज्यूआना + + + हर्मोसिल्लो + + + म्जाटलान + + + चिहुआहुआ + + + मोंटेरे + + + मेक्सिको सिटी + + + मेरिडा + + + कैन्कन + + + क्वाला लम्पुर + + + कूचिंग + + + माइपुटो + + + विन्डोएक + + + नूमिया + + + न्यामे + + + नोर्फ़ोक + + + लागोस + + + मनागुआ + + + ऐम्स्टरडम + + + ओस्लो + + + काठमांडू + + + नौरू + + + नियु + + + चाथम + + + औकलैंड + + + मस्कट + + + पनामा + + + लीमा + + + टहीटि + + + मार्केसस + + + गैम्बियर + + + पोर्ट मोरेस्बाइ + + + मनीला + + + कराची + + + वॉरसा + + + मिक्वेलोन + + + पिट्कैर्न + + + प्योर्तो रिको + + + गाज़ा + + + अज़ोरस + + + मडेएरा + + + लिस्बन + + + पलाऊ + + + ऐसन्क्षन + + + क़तर + + + रियूनियन + + + बुक्कारेस्ट + + + कालिनिंग्राड + + + मॉस्को + + + वोल्गोग्रेड + + + समारा + + + येकांतिरिंबर्ग + + + ओम्स्क + + + नॉवोसिविर्स्क् + + + क्रास्नोयार्स्क + + + ईर्कुत्स्क + + + याकूत्स्क + + + ब्लाडिवोस्टोक + + + सखालिन + + + मगादन + + + कमचटका + + + अनाडाइर + + + किगालि + + + रियाध + + + ग्वाडलकनाल + + + माहे + + + खार्तूम + + + स्टॉकहोम + + + सिंगापुर + + + सेंट हेलेना + + + फ़्रीटाउन + + + डकार + + + मोगाडिशू + + + परामरीबो + + + साओ टोम + + + सैल्वेडोर + + + दमास्कस + + + म्बाबेन + + + ग्रैँड तुर्क + + + जमेना + + + कर्ग्वेलेन + + + लोम + + + बैंगकॉक + + + दुशांबे + + + फ़काओफ़ो + + + डिली + + + अश्गाबात + + + ट्यूनिस + + + टोंगाटापू + + + इस्तानबुल + + + पोर्ट ऑफ़ स्पेन + + + फ़ुनाफ़ूटी + + + ताइपेइ + + + दार एस सलाम + + + उझ्गोरोड् + + + कीव + + + सिम्फेरोपोल + + + झापोरोझे + + + कम्पाला + + + मिडवे + + + जॉनस्टन + + + वेक + + + अडक + + + नोम + + + हॉनॉलुलु + + + अलास्का + + + यकूतत + + + जुनेऔ + + + लोस एंजिलेस + + + बोईस + + + फोनिक्स + + + शिपरेक + + + डेनवर + + + न्यू सालेम + + + मध्य, उत्तरी दाकोता + + + शिकागो + + + मेनोमिनी + + + विंसिनेस + + + पिटर्स्वर्ग + + + टेल सिटी + + + नौक्स, इंडियाना + + + विनामेक + + + मारेंगो + + + इन्डियानापोलिस + + + लोईसविले + + + विवे + + + मोंटीसेलो + + + डेट्रोईट + + + न्यूयार्क + + + मोन्टेवीडियो + + + समरकंड + + + ताशकंद + + + सेंट विंसेंट + + + काराकस + + + टॉरटोला + + + सेंट टॉमस + + + साइगॉन + + + एफ़ेट + + + वालिस + + + एपिया + + + ऐडेन + + + मायोत्ते + + + जोहानसबर्ग + + + लुसाका + + + हरारे + + + + भारतीय समय + + true + + + + + deva + + . + , + ; + % + ० + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##,##0.### + + + + + + + #E0 + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + {0} {1} + {0} {1} + + + + संयुक्त अरब अमीरात दिर्हाम + + + अफगानी (1927-2002) + + + अफगानी + + + अरमेनियाई दरम + + + अर्जेण्टीनी पीसो + + + ऑस्ट्रेलियाई डॉलर + + + बुल्गारियाई लेव् + + + बोलिवियाई बोलिवियानो + + + रीयाल + + + कनेडियन डॉलर + + + स्विस फ़्रैंक + + + चिली पीसो + + + युवान + + + कोलम्बियाई पीसो + + + सर्बिय का ढीनार + + + साईप्रस पाऊंड + + + चेक कोरुना + + + डच मार्क + + + डेनमार्क क्रोन + + + अल्जीरीयाई दिनार + + + एस्टोनियाई क्रून् + + + मिस्री पाउण्ड + + + युरो + + + फ़िजी का डालर + + + फ़्रांसीसी फ़्रैंक + + + ब्रितन का पौन्ड स्टर्लिग + + + हाँगकाँग डॉलर + + + क्रोएशियन दिनार + + + क्रोएशियाई कुना + + + हंगरी फोरेंट् + + + इण्डोनेशियाई रुपिया + + + इस्राइली शेकेल + + + भारतीय रूपया + रु. + + + इराकी दिनार + + + इतली का लीरा + + + जापानी येन + + + उत्तर कोरियाई वोन + + + दक्षिण कोरियाई वोन + + + कुवैती दिनार + + + लेबनानी पाउंड + + + श्रीलंकाई रुपया + + + लाईबेरीयाई डालर + + + लिथुआनियाई लितास + + + मोराक्को दिरहम + + + मोरक्को फ्रैंक + + + मेक्सिको पेसो + + + मलेशियाई रिंगित + + + नामीबियाई डालर + + + नॉर्वे क्रोन + + + नेपाली रुपया + + + न्यूज़ीलैंड डॉलर + + + ओमानी रियाल + + + पेरुवाई न्यूवो सोल + + + फ़िलिपीनी पीसो + + + पाकिस्तानी रुपया + + + पोलिश ज़्लॉटी + + + रोडेशियाई डालर + + + रोमानियाई ल्यू + + + सर्बियन दिनार + + + रूसी रूबल + + + रवांडाई फ्रैंक + + + सउदी रियाल + + + पुरानी सूडानी दिनार + + + सूडानी पाउंड + + + पुराना सूडानी पाउंड + + + स्वीडन क्रोना + + + सिंगापुर डॉलर + + + स्लोवेनियाई तोलार + + + स्लोवाक कोरुना + + + सोमाली शिलिंग + + + सूरीनामी डालर + + + सूरीनामी गिल्डर + + + सोवियत रूबल + + + सीरियाई पाउंड + + + थाई बाहत + + + तजाखी रूबल + + + तजाखी सोमोनी + + + पुरानी तुर्की लीरा + + + नई तुर्की लीरा + + + नया ताईवानी डॉलर + + + अमरीकी डालर + + + अमेरीकी डालर (कल) + + + अमेरीकी डालर (आज) + + + वेनेज़ुएलाई बोलिवार + + + वियतनामी डोंग + + + अज्ञात या अवैध मुद्रा + + + दक्षिण अफ़्रीकी रॅण्ड + + + + + + {0} दिन + {0} दिन + + + {0} घंटा + {0} घंटे + + + {0} मिनट + {0} मिनट + + + {0} महीना + {0} महीने + + + {0} सेकंड + {0} सेकंड + + + {0} सप्ताह + {0} सप्ताह + + + {0} साल + {0} साल + + + + + हाँ + नहीं + + + + diff --git a/lib/zend/Zend/Locale/Data/hi_IN.xml b/lib/zend/Zend/Locale/Data/hi_IN.xml new file mode 100644 index 0000000000..1b823430f3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/hi_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/hr.xml b/lib/zend/Zend/Locale/Data/hr.xml new file mode 100644 index 0000000000..ea168dad53 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/hr.xml @@ -0,0 +1,3705 @@ + + + + + + + + + + + {0} ({1}) + , + + + afarski + abhaski + achinese + acoli + adangme + adigejski + avestan + afrikaans + ostali afričko-azijski + afrihili + ainu + akanski + akkadian + aleutski + algonquian + južni altai + amharik + aragonski + staroengleski + angika + apaški + arapski + aramejski + araukanski + arapaho + umjetni jezik + arawak + asamski + asturijski + athapascan + australski + avarski + awadhi + aymara + azerbajdžanski + baškirski + banda + bamileke + baluchi + balinezijski + basa + baltički + bjeloruski + beja + bemba + berberski + bugarski + bihari + bhojpuri + bislama + bikol + bini + siksika + bambara + bengalski + bantu + tibetanski + bretonski + braj + bosanski + batak + buriat + buginski + blin + katalonski + caddo + jezik srednjoameričkih Indijanaca + karipski + kavkaski + atsam + čečenski + cebuano + keltski + chamorro + chibcha + chagatai + chuukese + mari + chinook žargon + choctaw + chipewyan + čeroki + čejenski + chamic + korzički + koptski + engleski - na osnovi kreolskog ili pidgin + francuski - na osnovi kreolskog ili pidgin + kreolski ili pidgin na osnovi portugalskog + cree + krimski turski + kreolski ili pidgin + češki + kašupski + crkvenoslavenski + kušitski + chuvash + velški + danski + dakota jezik + dargwa + dayak + njemački + austrijski njemački + gornjonjemački (švicarski) + delavarski + slave + dogrib + dinka + dogri + dravidski + lužičkosrpski + duala + nizozemski, srednji + divehi + dyula + dzongkha + ewe + efik + staroegipatski + ekajuk + grčki + elamitski + engleski + engleski (australski) + kanadski engleski + engleski (britanski) + engleski (američki) + engleski, srednji + esperanto + španjolski + španjolski (latinoamerički) + iberski španjolski + estonijski + baskijski + ewondo + perzijski + fang + fanti + fulah + finski + filipino + ugro-finski jezik + fidžijski + faroanski + fon + francuski + kanadski francuski + švicarski francuski + francuski, srednji + starofrancuski + sjevernofrizijski + istočnofrizijski + friulski + frizijski + irski + ga + gayo + gbaya + škotski-galski + germanski + staroetiopski + gilbertski + galicijski + njemački, srednji visoki + guarani + staronjemački, visoki + gondi + gorontalo + gothic + grebo + starogrčki + švicarski njemački + gujarati + manx + gwich'in + hausa + haidi + havajski + hebrejski + hindu + hiligaynon + himachali + hetitski + hmong + hiri motu + hrvatski + gornjolužički + kreolski + mađarski + hupa + armenski + herero + interlingua + iban + indonezijski + interligua + igbo + sichuan yi + ijo + inupiaq + iloko + indijski + indoeuropski + ingušetski + ido + iranski + irokeški + islandski + talijanski + inuktitut + japanski + lojban + judejsko-perzijski + judejsko-arapski + javanski + gruzijski + kara-kalpak + kabyle + kachin + kaje + kamba + karen + kawi + kabardian + tyap + koro + kongo + khasi + kojsanski + khotanese + kikuyu + kuanyama + kazaški + kalaallisut + kmerski + kimbundu + kannada + korejski + konkani + naurski + kpelle + kanuri + karachay-balkar + karelijski + kru + kuruški + kašmirski + kurdski + kumyk + kutenai + komi + kornski + kirgiški + latinski + ladino + lahnda + lamba + luksemburški + lezgiški + ganda + limburgish + lingala + laoski + mongo + lozi + litvanski + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + latvijski + madurski + magahi + maithili + makasar + mandingo + austronezijski + masajski + moksha + mandar + mende + malgaški + irski, srednji + maršalski + maorski + micmac + minangkabau + ostali jezici + makedonski + mkh + malayalam + mongolski + mandžurski + manipurski + manobo + moldavski + mohawk + mossi + marathi + malajski + malteški + više jezika + munda + creek + mirandski + marwari + burmanski + majanski + mordvinski + nauru + nahuatl + jezik sjevernoameričkih Indijanaca + napolitanski + književni norveški + sjeverni ndebele + donjonjemački + nepalski + newari + ndonga + nias + nigersko-kordofanski + niujski + nizozemski + flamanski + novonorveški + norveški + nogajski + staronorveški + n'ko + južni ndebele + sjeverni sotho + nubijski + navajo + klasični newari + nyanja + nyamwezi + nyankole + nyoro + nzima + okcitanski + ojibwa + oromo + orijski + osetski + osage + turski - otomanski + otomijski + punjabi + papuanski + pangasinan + pahlavi + pampanga + papiamento + palauanski + staroperzijski + filipinski + fenički + pali + poljski + pohnpeian + prakrit + staroprovansalski + paštu + portugalski + brazilski portugalski + portugalski (iberijski) + quechua + rajasthani + rapa nui + rarotonški + retoromanski + rundi + rumunjski + romanski + romski + korijenski + ruski + aromunski + kinyarwanda + sanskrtski + sandawe + jakutski + jezik južnoameričkih Indijanaca + salishan + samarijanski aramejski + sasak + santali + sardski + sicilijski + škotski + sindhi + južni sami + selkupski + semitic + sango + staroirski + znakovni jezik + srpsko-hrvatski + shan + singaleški + sidamo + siouan + sino-tibetski + slovački + slovenski + slavenski + samoanski + sjeverni sami + sami + lule sami + inari sami + skolt sami + shona + soninke + somalski + sogdien + songhai + albanski + srpski + sranan tongo + serer + svati + nilo-saharski + sesotski + sundanski + sukuma + susu + sumerski + švedski + svahili + klasični sirski + sirijski + tamilski + tajski + telugu + temne + tereno + tetum + tajik + tajlandski + tigrinya + tigriški + tiv + turkmenski + tokelaunski + tagalog + klingonski + tlingit + tamashek + cvana + tonga + nyasa tonga + tok pisin + turski + tsonga + tsimshian + tatarski + tumbuka + tupi + altajski + tuvaluanski + twi + tahićanski + tuvinian + udmurtski + uighur + ugaritski + ukrajinski + umbundu + nepoznati ili nevažeći jezik + urdu + uzbečki + vai + venda + vijetnamski + volapük + votic + valonski + wakashan + walamo + waray + washo + lužički + wolof + kalmyk + xhosa + yao + japski + jidiš + joruba + yupik + zhuang + zapotec + blissymbols + zenaga + kineski + kineski (pojednostavljeni) + kineski (tradicionalni) + zande + zulu + zuni + bez jezičnog sadržaja + zazaki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Svijet + Afrika + Sjevernoamerički kontinent + Južna Amerika + Oceanija + Zapadna Afrika + Centralna Amerika + Istočna Afrika + Sjeverna Afrika + Središnja Afrika + Južna Afrika + Amerike + Sjeverna Amerika + Karibi + Istočna Azija + Južna Azija + Jugoistočna Azija + Južna Europa + Australija i Novi Zeland + Melanezija + Mikronezki oblast + Polinezija + Južno-centralna Azija + Azija + Srednja Azija + Zapadna Azija + Europa + Istočna Europa + Sjeverna Europa + Zapadna Europa + Zajednica nezavisnih država + Latinska Amerika i Karibi + Kanalski otoci + Andora + Ujedinjeni Arapski Emirati + Afganistan + Antigua i Barbuda + Anguila + Albanija + Armenija + Nizozemski Antili + Angola + Antarktik + Argentina + Američka Samoa + Austrija + Australija + Aruba + Alandski otoci + Azerbajdžan + Bosna i Hercegovina + Barbados + Bangladeš + Belgija + Burkina Faso + Bugarska + Bahrein + Burundi + Benin + Sveti Bartolomej + Bermuda + Brunej + Bolivija + Brazil + Bahami + Butan + Otok Bouvet + Bocvana + Bjelorusija + Belize + Kanada + Kokosovi Otoci + Demokratska Republika Kongo + Srednjoafrička Republika + Kongo + Švicarska + Obala Bjelokosti + Kukovi Otoci + Čile + Kamerun + Kina + Kolumbija + Kostarika + Srbija i Crna Gora + Kuba + Zeleni Rt + Božićni Otok + Cipar + Češka Republika + Njemačka + Džibuti + Danska + Dominika + Dominikanska Republika + Alžir + Ekvador + Estonija + Egipat + Zapadna Sahara + Eritreja + Španjolska + Etiopija + Finska + Fidži + Falklandski Otoci + Mikronezija + Farski Otoci + Francuska + Gabon + Velika Britanija + Grenada + Gruzija + Francuska Gvajana + Guernsey + Gana + Gibraltar + Grenland + Gambija + Gvineja + Guadeloupe + Ekvatorska Gvineja + Grčka + Južna Gruzija i Južni Sendvič Otoci + Gvatemala + Guam + Gvineja Bisau + Gvajana + Hong Kong S.A.R. Kine + Otok Heard i Otoci McDonald + Honduras + Hrvatska + Haiti + Mađarska + Indonezija + Irska + Izrael + Otok Man + Indija + Britanski Teritorij Indijskog Oceana + Irak + Iran + Island + Italija + Jersey + Jamajka + Jordan + Japan + Kenija + Kirgistan + Kambodža + Kiribati + Komori + Sveti Kristofor i Nevis + Koreja, Sjeverna + Južna Koreja + Kuvajt + Kajmanski Otoci + Kazakstan + Laos + Libanon + Sveta Lucija + Lihtenštajn + Šri Lanka + Liberija + Lesoto + Litva + Luksemburg + Latvija + Libijska Arapska Džamahirija + Maroko + Monako + Moldavija + Crna Gora + Sveti Martin + Madagaskar + Maršalovi Otoci + Bivša Jugoslavenska Republika Makedonija + Mali + Mijanma + Mongolija + Makao S.A.R. Kine + Sjeverni Marijanski Otoci + Martinik + Mauritanija + Montserat + Malta + Mauricijus + Maldivi + Malavi + Meksiko + Malezija + Mozambik + Namibija + Nova Kaledonija + Niger + Otok Norfolk + Nigerija + Nikaragva + Nizozemska + Norveška + Nepal + Nauru + Niue + Novi Zeland + Oman + Panama + Peru + Francuska Polinezija + Papua Nova Gvineja + Filipini + Pakistan + Poljska + Sveti Petar i Miguel + Pitcairn + Portoriko + Palestinsko Područje + Portugal + Palau + Paragvaj + Katar + Ostala oceanija + Europska Unija + Reunion + Rumunjska + Srbija + Rusija + Ruanda + Saudijska Arabija + Solomonski Otoci + Sejšeli + Sudan + Švedska + Singapur + Sveta Helena + Slovenija + Svalbard i Jan Mayen + Slovačka + Sijera Leone + San Marino + Senegal + Somalija + Surinam + Sveti Toma i Prinsipe + El Salvador + Sirija + Svazi + Turkski i Kaikos Otoci + Čad + Francuski Južni Teritoriji + Togo + Tajland + Tadžikistan + Tokelau + Istočni Timor + Turkmenistan + Tunis + Tonga + Turska + Trinidad i Tobago + Tuvalu + Tajvan + Tanzanija + Ukrajina + Uganda + Ujedinjene Države Manjih Pacifičkih Otoka + Sjedinjene Države + Urugvaj + Uzbekistan + Grad Vatikan + Sveti Vincent i Grenadini + Venezuela + Britanski Djevičanski Otoci + Američki Djevičanski Otoci + Vijetnam + Vanuatu + Wallis i Futuna + Samoa + Jemen + Majote + Južnoafrička Republika + Zambija + Zimbabve + nepoznata ili nevažeća oblast + + + tradicionalan njemački pravopis + standardizirani resian pravopis + njemačka ortografija iz 1996. + kasni srednjofrancuski do 1606. + rani moderni francuski + istočno-armenijski + zapadno-armenijski + unificirana turska abeceda + san giorgio/bila dijalekt + boontling + IPA fonetika + UPA fonetika + lipovački dijalekt resian jezika + monotono + natisone dijalekt + Gniva/Njiva dijalekt + oseacco/osojane dijalekt + politono + računalo + izmijenjen pravopis + resian + saho + škotski standardni engleski + scouse + stolvizza/solbica dijalekt + taraskievica pravopis + valencijski + + + kalendar + poredavanje + valuta + + + tradicionalno kinesko poredavanje - Big5 + budistički kalendar + kineski kalendar + izravno poredavanje + pojednostavljeno kinesko poredavanje - GB2312 + gregorijanski kalendar + hebrejski kalendar + indijski nacionalni kalendar + islamski kalendar + islamski civilni kalendar + japanski kalendar + poredavanje po abecedi + Pinyin poredavanje + kalendar Republike Kine + Stroke order poredavanje + tradicionalno predavanje + + + američki sustav + metrički + + + + titlecase-firstword + titlecase-firstword + titlecase-firstword + titlecase-firstword + lowercase-words + titlecase-firstword + titlecase-firstword + titlecase-firstword + lowercase-words + titlecase-words + titlecase-firstword + titlecase-firstword + + + [a-c č ć d đ {dž} e-l {lj} m n {nj} o p r s š t-v z ž] + [q w-y] + [a-z] + + + ‘ + ’ + “ + ” + + + + + + + + EEEE, d. MMMM y. G + + + + + d. MMMM y. BE + + + + + d.MMM.y. G + + + + + d.M.yyyy. + + + + + + + + + EEE, d.Ml.y. G + + + + + d.Ml.y. G + + + + + d.Ml.y. G + + + + + d.Ml.y. G + + + + + + + + + 01. + 02. + 03. + 04. + 05. + 06. + 07. + 08. + 09. + 10. + 11. + 12. + + + siječnja + veljače + ožujka + travnja + svibnja + lipnja + srpnja + kolovoza + rujna + listopada + studenoga + prosinca + + + + + 1. + 2. + 3. + 4. + 5. + 6. + 7. + 8. + 9. + 10. + 11. + 12. + + + siječanj + veljača + ožujak + travanj + svibanj + lipanj + srpanj + kolovoz + rujan + listopad + studeni + prosinac + + + + + + + ned + pon + uto + sri + čet + pet + sub + + + nedjelja + ponedjeljak + utorak + srijeda + četvrtak + petak + subota + + + + + n + p + u + s + č + p + s + + + + + + + 1kv + 2kv + 3kv + 4kv + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + + + Prije Krista + Poslije Krista + + + pr.n.e. + AD + + + + + + EEEE, d. MMMM y. + + + + + d. MMMM y. + + + + + d.M.yyyy. + + + + + dd.MM.yyyy. + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + EEE, d. + HH:mm + HH:mm:ss + H:mm + L. + E, d.M. + LLL. + E, d.MMM. + E, d. MMMM + d. MMMM + dd. MMMM + d.MMM. + dd.MM. + d.M. + d. + hh:mm a + hh:mm:ss a + mm:ss + y. + M.yyyy. + EEE, d.M.y. + MMM.y. + EEE, d.MMM.y. + MMMM y. + Q. yyyy. + QQQ y. + EEE, d.MMM.yy. + Q yy. + QQQQ yy. + MM.yyyy. + MMMM y. + + + {0} - {1} + + MM. - MM. + + + E, dd.MM. - E, dd.MM. + E, dd.MM. - E, dd.MM. + + + LLL.-LLL. + + + E, dd.MMM. - E, dd.MMM. + E, dd. - E, dd. MMM. + + + LLLL-LLLL + + + dd.MMM. - dd.MMM. + dd. - dd.MMM. + + + dd.MM. - dd.MM. + dd.MM. - dd.MM. + + + dd. - dd. + + + HH - HH'h' + HH - HH'h' + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH - HH 'h' v + HH - HH 'h' v + + + y. - y. + + + MM.yyyy. - MM.yyyy. + MM.yyyy. - MM.yyyy. + + + E, dd.MM.yyyy. - E, dd.MM.yyyy. + E, dd.MM.yyyy. - E, dd.MM.yyyy. + E, dd.MM.yyyy. - E, dd.MM.yyyy. + + + LLL.-LLL.y. + LLL.y. - LLL.y. + + + E, dd.MMM. - E, dd.MMM.y. + E, dd. - E, dd.MMM.y. + E, dd.MMM.y. - E, dd.MMM.y. + + + MM. - MM.yyyy. + MM.yyyy. - MM.yyyy. + + + dd.MMM. - dd.MMM.y. + dd. - dd.MMM.y. + dd.MMM.y. - dd.MMM.y. + + + dd.MM.yyyy. - dd.MM.yyyy. + dd.MM.yyyy. - dd.MM.yyyy. + dd.MM.yyyy. - dd.MM.yyyy. + + + + + + era + + + godina + + + mjesec + + + tjedan + + + dan + prije tri dana + prekjučer + jučer + danas + sutra + prekosutra + za tri dana + + + dan u tjednu + + + dio dana + + + sat + + + minuta + + + sekunda + + + zona + + + + + + + + EEEE, d. MMMM y. G + + + + + d. MMMM y. G + + + + + d.MMM.y. G + + + + + d.M.yy. G + + + + + + E, d. + E, d.MMM. + d. MMMM + d.M. + yy. GGG + MM.yy. GGGGG + MMM.yy. GGGGG + Q. yy. GGGGG + + + + + + + prije R.O.C. + R.O.C. + + + + + + EEEE, d. MMMM y. G + + + + + d. MMMM y. G + + + + + d.MMM.y. G + + + + + d.M.y.G + + + + + + y. G + M.y. G + EEE, d.M.y. G + MMM.y. G + EEE, d.MMM.y. G + Q. y. G + QQQ y. G + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + Nepoznat ili nevažeći grad + + + Andora + + + Južni pol + + + Dumont D'Urville + + + Beć + + + Sofija + + + Bahrein + + + Kinšasa + + + Lubumbaši + + + Uskrsni Otok + + + Šangaj + + + Kostarika + + + Zelenortska Republika + + + Božić + + + Nikozija + + + Džibuti + + + Dominika + + + Alžir + + + Kanarska Otočja + + + Fidži + + + Pariz + + + Atena + + + Južna Georgia + + + Gvatemala + + + Gvajana + + + Budimpešta + + + Rim + + + Jamajka + + + Tokio + + + St. Kitts + + + Kuvajt + + + Sveta Lucija + + + Luksemburg + + + Monako + + + Mauricijus + + + Maldivi + + + Varšava + + + Portoriko + + + Azorski otoci + + + Lisabon + + + Katar + + + Réunion + + + Bukurešt + + + Kalinjingrad + + + Moskva + + + Krasnojarsk + + + Kamčatka + + + Anadir + + + Singapur + + + Sveta Helena + + + Salvador + + + Uzgorod + + + Kijev + + + Zaporožje + + + Alaska vremenska zona + + + New Salem, Sjeverna Dakota + + + Središnja, Sjeverna Dakota + + + Taškent + + + Sveti Vincent + + + Sveti Thomas + + + + Acre ljetno vrijeme + + + + + Središnja Afrika + + + + + Istočna Afrika + + + + + Južna Afrika + + + + + Zapadna Afrika + Zapadna Afrika, ljetno vrijeme + + + + + središnje vrijeme + središnje standardno vrijeme + središnje dnevno vrijeme + + + CT + CST + CDT + + + + + istočno vrijeme + istočno standardno vrijeme + istočno dnevno vrijeme + + + ET + EST + EDT + + + + + planinsko vrijeme + planinsko standardno vrijeme + planinsko dnevno vrijeme + + + MT + MST + MDT + + + + + pacifičko vrijeme + pacifičko standardno vrijeme + pacifičko dnevno vrijeme + + + PT + PST + PDT + + + + + atlantsko vrijeme + atlantsko standardno vrijeme + atlantsko dnevno vrijeme + + + AT + AST + ADT + + + + + + + , + . + + + + + #,##0.00 ¤ + + + + + + andorska pezeta + andorskih pezeta + andorskih pezeta + + + UAE dirham + UAE dirhama + UAE dirhama + UAE dirhama + + + afganistanski afgani (1927.-2002.) + afganistanska afgana (AFA) + afganistanskih afgana (AFA) + afganistanski afgan (AFA) + afganistanskih afgana (AFA) + + + afganistanski afgani + afganistanska afgana + afganistanskih afgana + afganistanski afgan + afganistanskih afgana + + + albanski lek + albanska leka + albanskih leka + albanski lek + albanskih leka + + + armenski dram + armenska drama + armenskih drama + armenski dram + armenskih drama + + + nizozemskoantilski gulden + nizozemskoantilska guldena + nizozemskoantilskih guldena + nizozemskoantilski gulden + nizozemskoantilskih guldena + + + angolska kvanza + angolske kvanze + angolskih kvanzi + angolska kvanza + angolskih kvanzi + + + angolska kvanza (1977-1990) + angolske kvanze (AOK) + angolskih kvanzi (AOK) + angolska kvanza (AOK) + angolskih kvanzi (AOK) + + + angolska nova kvanza (1990-2000) + angolske nove kvanze (AON) + angolskih novih kvanzi (AON) + angolska nova kvanza (AON) + angolskih novih kvanzi (AON) + + + angolska kvanza (1995.-1999.) + angolske kvanze reajustado + angolskih kvanzi reajustado + angolska kvanza reajustado + angolskih kvanzi reajustado (AOR) + + + argentinski austral + argentinska australa + argentinskih australa + argentinski austral + argentinskih australa + + + argentinski pezo (1983-1985) + argentinska peza (ARP) + argentinskih peza (ARP) + argentinski pezo (ARP) + argentinskih peza (ARP) + + + argentinski pezo + argentinska pezosa + argentinskih pezosa + argentinski pezos + argentinskih pezosa + + + austrijski šiling + austrijska šilinga + austrijskih šilinga + austrijski šiling + austrijskih šilinga + + + australski dolar + australska dolara + australskih dolara + australski dolar + australskih dolara + + + arupski gulden + arupska guldena + arupskih guldena + arupski gulden + arupskih guldena + + + azerbajdžanski manat (1993-2006) + azerbajdžanska manata (AZM) + azerbajdžanskih manata (AZM) + azerbajdžanski manat (AZM) + azerbajdžanskih manata (AZM) + + + azerbajdžanski manat + azerbajdžanska manata + azerbajdžanskih manata + azerbajdžanski manat + azerbajdžanskih manata + + + bosansko-hercegovački dinar + bosansko-hercegovačka dinara + bosansko-hercegovačkih dinara + bosansko-hercegovačkih dinara + + + konvertibilna marka + konvertibilne marke + konvertibilnih maraka + konvertibilna marka + konvertibilnih maraka + + + barbadoski dolar + barbadoska dolara + barbadoskih dolara + barbadoski dolar + barbadoskih dolara + + + taka + bangladeške take + bangladeških taka + bangladeška taka + bangladeških taka + + + belgijski franak (konvertibilan) + belgijska franka (konvertibilna) + belgijskih franaka (konvertibilnih) + belgijski franak (konvertibilan) + belgijskih franaka (konvertibilnih) + + + belgijski franak + belgijska franka + belgijskih franaka + belgijski franak + belgijskih franaka + + + belgijski franak (financijski) + belgijska franka (financijska) + belgijskih franaka (financijskih) + belgijski franak (financijski) + belgijskih franaka (financijskih) + + + bugarski čvrsti lev + bugarska čvrsta leva + bugarskih čvrstih leva + bugarski čvrsti lev + bugarskih čvrstih leva + + + bugarski novi lev + bugarska leva + bugarskih leva + bugarski lev + bugarskih leva + + + bahreinski dinar + bahreinska dinara + bahreinskih dinara + bahreinski dinar + bahreinskih dinara + + + burundski franak + burundska franka + burundskih franaka + burundski franak + burundskih franaka + + + bermudski dolar + bermudska dolara + bermudskih dolara + bermudski dolar + bermudskih dolara + + + brunejski dolar + brunejska dolara + brunejskih dolara + brunejski dolar + brunejskih dolara + + + bolivijano + bolivijska bolivijana + bolivijskih bolivijana + bolivijski bolivijano + bolivijskih bolivijana + + + bolivijski pezo + bolivijska peza + bolivijskih peza + bolivijski pezo + bolivijskih peza + + + bolivijski mvdol + bolivijska mvdola + bolivijskih mvdola + bolivijski mvdol + bolivijskih mvdola + + + brazilski novi cruzeiro (1967.-1986.) + brazilska nova cruzeira (BRB) + brazilskih novih cruzeira (BRB) + brazilski novi cruzeir (BRB) + brazilskih novih cruzeira (BRB) + + + brazilski cruzado + brazilska cruzada + brazilskih cruzada + brazilski cruzad + brazilskih cruzada + + + brazilski cruzeiro (1990.-1993.) + brazilska cruzeira (BRE) + brazilskih cruzeira (BRE) + brazilski cruzeir (BRE) + brazilskih cruzeira (BRE) + + + brazilski real + brazilska reala + brazilskih reala + brazilski real + brazilskih reala + + + brazilski novi cruzado + brazilska nova cruzada + brazilskih novih cruzada + brazilski novi cruzad + brazilskih novih cruzada + + + brazilski cruzeiro + brazilska cruzeira + brazilskih cruzeira + brazilski cruzeiro + brazilskih cruzeira + + + bahamski dolar + bahamska dolara + bahamskih dolara + bahamskih dolara + + + butanski ngultrum + butanska ngultruma + butanskih ngultruma + butanski ngultrum + butanskih ngultruma + + + kyat + kyata + kyata + kyat + kyata + + + pula + bocvanske pule + bocvanskih pula + bocvanska pula + bocvanskih pula + + + bjeloruska nova rublja (1994-1999) + bjeloruske nove rublje (BYB) + bjeloruskih novih rublji (BYB) + bjeloruska nova rublja (BYB) + bjeloruskih novih rublji (BYB) + + + bjeloruska rublja + bjeloruske rublje + bjeloruskih rublji + bjeloruska rublja + bjeloruskih rublji + + + belizeanski dolar + belizeanska dolara + belizeanskih dolara + belizeanski dolar + belizeanskih dolara + + + kanadski dolar + kanadska dolara + kanadskih dolara + kanadski dolar + kanadskih dolara + + + kongoanski franak + kongoanska franka + kongoanskih franaka + kongoanski franak + kongoanskih franaka + + + WIR euro + WIR eura + WIR eura + WIR euro + WIR eura + + + švicarski franak + švicarska franka + švicarskih franaka + švicarski franak + švicarskih franaka + + + WIR franak + WIR franka + WIR franaka + WIR franak + WIR franaka + + + Chilean Unidades de Fomento + čileanska unidades de fomentos + čileanskih unidades de fomentos + čileanski unidades de fomentos + čileanskih unidades de fomentos + + + čileanski pezo + čileanska peza + čileanskih peza + čileanski pezo + čileanskih peza + + + renminbi-juan + kineska yuana + kineskih yuana + kineski yuan + kineskih yuana + + + kolumbijski pezo + kolumbijska peza + kolumbijskih peza + kolumbijski pezo + kolumbijskih peza + + + Unidad de Valor Real + unidad de valor reala + unidad de valor reala + unidad de valor real + unidad de valor reala + + + kostarikanski kolon + kostarikanska kolona + kostarikanskih kolona + kostarikanski kolon + kostarikanskih kolona + + + stari srpski dinar + stara srpska dinara + starih srpskih dinara + starih srpskih dinara + + + Czechoslovak Hard Koruna + čehoslovačke krune + čehoslovačkih kruna + čehoslovačka kruna + čehoslovačkih kruna + + + kubanski pezo + kubanska peza + kubanskih peza + kubanski pezo + kubanskih peza + + + zelenortski eskudo + zelenortska eskuda + zelenortskih eskuda + zelenortski eskudo + zelenortskih eskuda + + + ciparska funta + ciparske funte + ciparskih funti + ciparska funta + ciparskih funti + + + češka kruna + češke krune + čeških kruna + češka kruna + čeških kruna + + + East German Ostmark + istočnonjemačke marke + istočnonjemačkih marki + istočnonjemačka marka + istočnonjemačkih marki + + + njemačka marka + njemačke marke + njemačkih marki + njemačka marka + njemačkih marki + + + džibutski franak + džibutska franka + džibutskih franaka + džibutski franak + džibutskih franaka + + + danska kruna + danske krune + danskih kruna + danska kruna + danskih kruna + + + dominikanski pezo + dominikanska peza + dominikanskih peza + dominikanski pezo + dominikanskih peza + + + alžirski dinar + alžirska dinara + alžirskih dinara + alžirski dinar + alžirskih dinara + + + Ecuador Sucre + ekvatorske sucre + ekvatorskih sucri + evatorska sucra + ekvatorskih sucri + + + Ecuador Unidad de Valor Constante (UVC) + ekvatorska unidad de valor constante (UVC) + ekvatorskih unidad de valor constante (UVC) + ekvatorski unidad de valor constante (UVC) + ekvatorskih unidad de valor constante (UVC) + + + estonska kruna + estonske krune + estonskih kruna + estonska kruna + estonskih kruna + + + egipatska funta + egipatske funte + egipatskih funti + egipatska funta + egipatskih funti + + + nakfa + eritrejske nakfe + eritrejskih nakfi + eritrejska nakfa + eritrejskih nakfi + + + španjolska pezeta (A račun) + španjolske pezete (A račun) + španjolskih pezeta (A račun) + španjolska pezeta (A račun) + španjolskih pezeta (A račun) + + + španjolska pezeta (konvertibilni račun) + španjolske pezete (konvertibilan račun) + španjolskih pezeta (konvertibilan račun) + španjolska pezeta (konvertibilan račun) + španjolskih pezeta (konvertibilan račun) + + + španjolska pezeta + španjolske pezete + španjolskih pezeta + španjolska pezeta + španjolskih pezeta + + + etiopski bir + etiopska bira + etiopskih bira + etiopski bir + etiopskih bira + + + euro + eura + eura + euro + eura + + + finska marka + finske marke + finskih marki + finska marka + finskih marki + + + fidžijski dolar + fidžijska dolara + fidžijskih dolara + fidžijski dolar + fidžijskih dolara + + + falklandska funta + falklandske funte + falklandskih funti + falklandska funta + falklandskih funti + + + francuski franak + francuska franka + francuskih franaka + francuski franak + francuskih franaka + + + britanska funta + britanske funte + britanskih funti + britanska funta + britanskih funti + + + Georgian Kupon Larit + gruzijska kupon larita + gruzijskih kupon larita + gruzijski kupon larit + gruzijskih kupon larita + + + lari + gruzijska lara + gruzijskih lara + gruzijski lar + gruzijskih lara + + + ganski cedi (1979.-2007.) + ganska ceda (GHC) + ganskih ceda (GHC) + ganski cedi (GHC) + ganskih ceda (GHC) + + + ganski cedi + ganska ceda + ganskih ceda + ganski cedi + ganskih ceda + + + gibraltarska funta + gibraltarske funte + gibraltarskih funti + gibraltarska funta + gibraltarskih funti + + + dalasi + gambijska dalasa + gambijskih dalasa + gambijski dalas + gambijskih dalasa + + + gvinejski franak + gvinejska franka + gvinejskih franaka + gvinejski franak + gvinejskih franaka + + + gvinejski syli + gvinejska sylija + gvinejskih sylija + gvinejski syli + gvinejskih sylija + + + Equatorial Guinea Ekwele Guineana + gvinejska ekwele + gvinejskih ekwele + gvinejska ekwele + gvinejskih ekwele + + + grčka drahma + grčke drahme + grčkih drahmi + grčka drahma + grčkih drahmi + + + kvecal + gvatemalska kvecala + gvatemalskih kvecala + gvatemalski kvecal + gvatemalskih kvecala + + + portugalski gvineja eskudo + gvinejska eskuda + gvinejskih eskuda + gvinejski eskudo + gvinejskih eskuda + + + gvinejskobisauski pezo + gvinejskobisauska peza + gvinejskobisauskih peza + gvinejskobisauski pezo + gvinejskobisauskih peza + + + gvajanski dolar + gvajanska dolara + gvajanskih dolara + gvajanski dolar + gvajanskih dolara + + + hongkonški dolar + honkonška dolara + honkonških dolara + honkonški dolar + honkonških dolara + + + honduraška lempira + honduraške lempire + honduraških lempira + honduraška lempira + honduraških lempira + + + hrvatski dinar + hrvatska dinara + hrvatskih dinara + hrvatski dinar + hrvatskih dinara + + + kuna + kune + kuna + kuna + kuna + + + haićanski gourd + haićanska gourda + haićanskih gourda + haićanski gourd + haićanskih gourda + + + mađarska forinta + mađarske forinte + mađarskih forinti + mađarska forinta + mađarskih forinti + + + indonezijska rupija + indonezijske rupije + indonezijskih rupija + indonezijska rupija + indonezijskih rupija + + + irska funta + irske funte + irskih funti + irska funta + irskih funti + + + izraelska funta + izraelske funte + izraelskih funti + izraelska funta + izraelskih funti + + + stari izraelski šekel + stara izraelska šekela + starih izraelskih šekela + stari izraelski šekel + starih izraelskih šekela + + + novi izraelski šekel + nova izraelska šekela + novih izraelskih šekela + novi izraelski šekel + novih izraelskih šekela + + + indijska rupija + indijske rupije + indijskih rupija + indijska rupija + indijskih rupija + + + irački dinar + iračka dinara + iračkih dinara + irački dinar + iračkih dinara + + + iranski rijal + iranska rijala + iranskih rijala + iranski rijal + iranskih rijala + + + stara islandska kruna + stare islandske krune + starih islandskih kruna + stara islandska kruna + starih islandskih kruna + + + islandska kruna + islandske krune + islandskih kruna + islandska kruna + islandskih kruna + + + Talijanska lira + talijanske lire + talijanskih lira + talijanska lira + talijanskih lira + + + jamajčanski dolar + jamajčanska dolara + jamajčanskih dolara + jamajčanski dolar + jamajčanskih dolara + + + jordanski dinar + jordanska dinara + jordanskih dinara + jordanski dinar + jordanskih dinara + + + japanski jen + japanska jena + japanskih jena + japanski jen + japanskih jena + ¥ + + + kenijski šiling + kenijska šilinga + kenijskih šilinga + kenijski šiling + kenijskih šilinga + + + kirgiski som + kirgijska soma + kirgijskih soma + kirgijski som + kirgijskih soma + + + rijal + kambođanska rijala + kambođanskih rijala + kambođanski rijal + kambođanskih rijala + + + komorski franak + komorska franka + komorskih franaka + komorski franak + komorskih franaka + + + sjevernokorejski won + sjevernokorejska wona + sjevernokorejskih wona + sjevernokorejski won + sjevernokorejskih wona + + + južnokorejski won + južnokorejska wona + južnokorejskih wona + južnokorejskih wona + + + kuvajtski dinar + kuvajtska dinara + kuvajtskih dinara + kuvajtski dinar + kuvajtskih dinara + + + kajmanski dolar + kajmanska dolara + kajmanskih dolara + kajmanski dolar + kajmanskih dolara + + + kazahstanski tenge + kazahstanska tengea + kazahstanskih tengea + kazahstanski tenge + kazahstanskih tengea + + + kip + laoska kipa + laoskih kipa + laoski kip + laoskih kipa + + + libanonska funta + libanonske funte + libanonskih funti + libanonska funta + libanonskih funti + + + šrilanska rupija + šrilankanske rupije + šrilankanskih rupija + šrilankanska rupija + šrilankanskih rupija + + + liberijski dolar + liberijska dolara + liberijskih dolara + liberijski dolar + liberijskih dolara + + + loti + lesoto lotija + lesoto lotija + lesoto loti + lesoto lotija + + + litavski litas + litavska litasa + litavskih litasa + litavski litas + litavskih litasa + + + litavski talonas + litavska talonasa + litavskih talonasa + litavski talonas + litavskih talonasa + + + luksemburški konvertibilni franak + luksemburška konvertibilna franka + luksemburških konvertibilnih franaka + luksemburški konvertibilni franak + luksemburških konvertibilnih franaka + + + luksemburški franak + luksemburška franka + luksemburških franaka + luksemburški franak + luksemburških franaka + + + Luksemburški financijski franak + luksemburška financijska franka + luksemburških financijskih franaka + luksemburški financijski franak + luksemburških financijskih franaka + + + letonski lats + letonska latsa + letonskih latsa + letonski lats + letonskih latsa + + + Latvian Ruble + letonske rublje + letonskih rublji + letonska rublja + letonskih rublji + + + libijski dinar + libijska dinara + libijskih dinara + libijski dinar + libijskih dinara + + + marokanski dirham + marokanska dirhama + marokanskih dirhama + marokanski dirham + marokanskih dirhama + + + marokanski franak + marokanska franka + marokanskih franaka + marokanski franak + marokanskih franaka + + + moldavski lej + moldavska leja + moldavskih leja + moldavski lej + moldavskih leja + + + madagaskarski ariary + madagaskarska ariarija + madagaskarskih ariarija + madagaskarski ariary + madagaskarskih ariarija + + + madagaskarski franak + madagaskarska franka + madagaskarskih franaka + madagaskarski franak + madagaskarskih franaka + + + makedonski denar + makedonska dinara + makedonskih dinara + makedonski dinar + makedonskih dinara + + + CFA franak + malijska franka + malijskih franaka + malijski franak + malijskih franaka + + + Myanmar Kyat + mjanmarska kjata + mjanmarskih kjata + mjanmarski kjat + mjanmarskih kjata + + + mongolski tugrik + mongolska tugrika + mongolskih tugrika + mongolski tugrik + mongolskih tugrika + + + Macao Pataca + pataka + pataka + patak + pataka + + + mauritanijska ouguja + mauritanijske ouguje + mauritanijskih ouguja + mauritanijska ouguja + mauritanijskih ouguja + + + malteška lira + malteške lire + malteških lira + malteška lira + malteških lira + + + malteška funta + malteške funte + malteških funti + malteška funta + malteških funti + + + mauricijska rupija + mauricijske rupije + mauricijskih rupija + mauricijska rupija + mauricijskih rupija + + + maldivijska rufija + maldivijske rufije + maldivijskih rufija + maldivijska rufija + maldivijskih rufija + + + Malawi Kwacha + malavijske kvače + malavijskih kvača + malavijska kvača + malavijskih kvača + + + meksički pezo + meksička peza + meksičkih peza + meksički pezo + meksičkih peza + + + meksički srebrni pezo (1861-1992) + meksička srebrna peza (MXP) + meksičkih srebrnih peza (MXP) + meksički srebrni pezo (MXP) + meksičkih srebrnih peza (MXP) + + + Mexican Unidad de Inversion (UDI) + Mexican unidads de inversion (UDI) + Mexican unidads de inversion (UDI) + Mexican unidads de inversion (UDI) + Mexican unidads de inversion (UDI) + + + malezijski ringit + malezijska ringita + malezijskih ringita + malezijski ringit + malezijskih ringita + + + mozambijski eskudo + mozambijska eskuda + mozambijskih eskuda + mozambijski eskudo + mozambijskih eskuda + + + stari mozambijski metikal + stara mozambijska metikala + starih mozambijskih metikala + stari mozambijski metikal + starih mozambijskih metikala + + + mozambijski metikal + mozambijska metikala + mozambijskih metikala + mozambijski metikal + mozambijskih metikala + + + namibijski dolar + namibijska dolara + namibijskih dolara + namibijski dolar + namibijskih dolara + + + nigerijska naira + nigerijska naira + nigerijskih naira + nigerijski nair + nigerijskih naira + + + nikaragvanska kordoba + nikaragvanske kordobe + nikaragvanskih kordoba + nikaragvanska kordoba + nikaragvanskih kordoba + + + nikaragvanska zlatna kordoba + nikaragvanske zlatne kordobe + nikaragvanskih zlatnih kordoba + nikaragvanska zlatna kordoba + nikaragvanskih zlatnih kordoba + + + nizozemski gulden + nizozemska guldena + nizozemskih guldena + nizozemski gulden + nizozemskih guldena + + + norveška kruna + norveške krune + norveških kruna + norveška kruna + norveških kruna + + + nepalska rupija + nepalske rupije + nepalskih rupija + nepalska rupija + nepalskih rupija + + + novozelandski dolar + novozelandska dolara + novozelandskih dolara + novozelandski dolar + novozelandskih dolara + + + omanski rijal + omanska rijala + omanskih rijala + omanski rijal + omanskih rijala + + + balboa + panamske balboe + panamskih balboa + panamska balboa + panamskih balboa + + + peruanski inti + peruanske inti + peruanskih inti + peruanski inti + peruanskih inti + + + novi sol + peruanska nova sola + peruanskih novih sola + peruanski novi sol + peruanskih novih sola + + + sol + peruanska sola + peruanskih sola + peruanski sol + peruanskih sola + + + kina Papue Nove Gvineje + kine Papue Nove Gvineje + kina Papue Nove Gvineje + kina Papue Nove Gvineje + kina Papue Nove Gvineje + + + filipinski pezo + filipinska peza + filipinskih peza + filipinski pezo + filipinskih peza + + + pakistanska rupija + pakistanske rupije + pakistanskih rupija + pakistanska rupija + pakistanskih rupija + + + poljska zlota + poljske zlote + poljskih zlota + poljska zlota + poljskih zlota + + + Poljska zlota (1950-1995) + poljske zlote (PLZ) + poljskih zlota (PLZ) + poljska zlota (PLZ) + poljskih zlota (PLZ) + + + portugalski eskudo + portugalska eskuda + portugalskih eskuda + portugalski eskudo + portugalskih eskuda + + + gvarani + paragvajska gvaranija + paragvajskih gvaranija + paragvajski gvarani + paragvajskih gvaranija + + + katarski rial + katarska rijala + katarskih rijala + katarski rijal + katarskih rijala + + + rodezijski dolar + rodezijska dolara + rodezijskih dolara + rodezijski dolar + rodezijskih dolara + + + starorumunjski lek + stara rumunjska leja + starih rumunjskih leja + stari rumunjski lej + starih rumunjskih leja + + + rumunjski lev + nova rumunjska leja + novih rumunjskih leja + novi rumunjski lej + novih rumunjskih leja + + + srpski dinar + srpska dinara + srpskih dinara + srpski dinar + srpskih dinara + + + ruska rublja + ruske rublje + ruskih rublji + ruska rublja + ruskih rublji + + + ruska rublja (1991.-1998.) + ruske rublje (RUR) + ruskih rublji (RUR) + ruska rublja (RUR) + ruskih rublji (RUR) + + + ruandski franak + ruandska franka + ruandskih franaka + ruandski franak + ruandskih franaka + + + saudijski rial + saudijska rijala + saudijskih rijala + saudijski rijal + saudijskih rijala + + + solmonskootočni dolar + solomonskootočna dolara + solomonskootočnih dolara + solomonskootočni dolar + solomonskootočnih dolara + + + sejšelska rupija + sejšelske rupije + sejšelskih rupija + sejšelska rupija + sejšelskih rupija + + + sudanski dinar + sudanska dinara + sudanskih dinara + sudanski dinar + sudanskih dinara + + + sudanska funta + sudanske funte + sudanskih funti + sudanska funta + sudanskih funti + + + stara sudanska funta + stare sudanske funte + starih sudanskih funti + stara sudanska funta + starih sudanskih funti + + + švedska kruna + švedske krune + švedskih kruna + švedska kruna + švedskih kruna + + + singapurski dolar + singapurska dolara + singapurskih dolara + singapurski dolar + singapurskih dolara + + + svetohelenska funta + svetohelenske funte + svetohelenskih funti + svetohelenska funta + svetohelenskih funti + + + slovenski tolar + slovenska tolara + slovenskih tolara + slovenski tolar + slovenskih tolara + + + slovačka kruna + slovačke krune + slovačkih kruna + slovačka kruna + slovačkih kruna + + + sijeraleonski leone + sijeraleonske leone + sijeraleonskih leona + sijeraleonski leon + sijeraleonskih leona + + + somalijski šiling + somalijska šilinga + somalijskih šilinga + somalijski šiling + somalijskih šilinga + + + surinamski dolar + surinamska dolara + surinamskih dolara + surinamski dolar + surinamskih dolara + + + surinamski gulden + surinamska guldena + surinamskih guldena + surinamski gulden + surinamskih guldena + + + dobra Svetog Tome i Principa + dobra Svetog Tome i Principa + dobra Svetog Tome i Principa + dobra Svetog Tome i Principa + dobra Svetog Tome i Principa + + + sovjetska rublja + sovjetske rublje + sovjetskih rublji + sovjetska rublja + sovjetskih rublji + + + salvadorski kolon + salvadorska kolona + salvadorskih kolona + salvadorski kolon + salvadorskih kolona + + + sirijska funta + sirijske funte + sirijskih funti + sirijska funta + sirijskih funti + + + svazi lilangeni + svazi lilangena + svazi lilangena + svazi lilangeni + svazi lilangena + + + tajlandski bat + tajlandska bahta + tajlandskih bahta + tajlandski baht + tajlandskih bahta + + + tajikistanska rublja + tadžikistanske rublje + tadžikistanskih rublji + tadžikistanska rublja + tadžikistanskih rublji + + + tadžikistanski somoni + tadžikistanska somona + tadžikistanskih somona + tadžikistanski somoni + tadžikistanskih somona + + + turkmenistanski manat + turkmenistanska manata + turkmenistanskih manata + turkmenistanski manat + turkmenistanskih manata + + + tuniski dinar + tuniska dinara + tuniskih dinara + tuniski dinar + tuniskih dinara + + + tongaška pa'anga + tongaške pa'ange + tongaških pa'angi + tongaška pa'anga + tongaških pa'angi + + + timorski eskudo + timorska eskuda + timorskih eskuda + timorski eskudo + timorskih eskuda + + + stara turska lira + stare turske lire + starih turskih lira + stara turska lira + starih turskih lira + + + turska lira + turske lire + turskih lira + turska lira + turskih lira + + + trininadtobaški dolar + trinidadtobaška dolara + trinidadtobaških dolara + trinidadtobaški dolar + trinidadtobaških dolara + + + Novotajvanski dolar + novotajvanska dolara + novotajvanskih dolara + novotajvanski dolar + novotajvanskih dolara + + + tanzanijski šiling + tanzanijska šilinga + tanzanijskih šilinga + tanzanijski šiling + tanzanijskih šilinga + + + ukrajinska hrivnja + ukrajinske hrivnje + ukrajinskih hrivnji + ukrajinska hrivnja + ukrajinskih hrivnji + + + ukrajinski karbovanet + ukrajinska karbovantsiva + ukrajinskih karbovantsiva + ukrajinski karbovantsiv + ukrajinskih karbovantsiva + + + ugandski šiling (1966.-1987.) + ugandska šilinga (UGS) + ugandskih šilinga (UGS) + ugandski šiling (UGS) + ugandskih šilinga (UGS) + + + ugandski šiling + ugandska šilinga + ugandskih šilinga + ugandski šiling + ugandskih šilinga + + + američki dolar + američka dolara + američkih dolara + američki dolar + američkih dolara + $ + + + američki dolar (sljedeći dan) + američka dolara (sljedeći dan) + američkih dolara (sljedeći dan) + američki dolar (sljedeći dan) + američkih dolara (sljedeći dan) + + + američki dolar (isti dan) + američka dolara (isti dan) + američkih dolara (isti dan) + američki dolar (isti dan) + američkih dolara (isti dan) + + + urugvajski pezo en unidades indexadas + urugvajska pesosa en unidades indexadas + urugvajskih pesosa en unidades indexadas + urugvajski pesos en unidades indexadas + urugvajskih pesosa en unidades indexadas + + + urugvajski pezo (1975.-1993.) + urugvajska peza (UYP) + urugvajskih peza (UYP) + urugvajski pezo (UYP) + urugvajskih peza (UYP) + + + urugvajski pezo + urugvajska pezosa + urugvajskih pezosa + urugvajski pezo + urugvajskih pezosa + + + uzbekistanski som + uzbekistanska soma + uzbekistanskih soma + uzbekistanski som + uzbekistanskih soma + + + venezuelanski bolivar + venezuelanska bolivara + vezuelanskih bolivara + venezuelanski bolivar + venezuelanskih bolivara + + + venezuelanski bolivar fuerte + venezuelanska bolivara fuertes + venezuelanskih bolivara fuertes + venezuelanski bolivar fuertes + venezuelanskih bolivara fuertes + + + vijetnamski dong + vijetnamska donga + vijetnamskih donga + vijetnamski dong + vijetnamskih donga + + + vanuatuški vatu + vanuatska vatua + vanuatskih vatua + vanuatski vatu + vanuatskih vatua + + + samoanska tala + samoanske tale + samoanskih tala + samoanska tala + samoanskih tala + + + CFA franak BEAC + CFA franka BEAC + CFA franaka BEAC + CFA franak BEAC + CFA franaka BEAC + + + srebro + srebra + srebra + srebro + srebra + + + zlato + zlata + zlata + zlato + zlata + + + Europska složena jedinica + europske složene jedinice + europskih složenih jedinica + europska složena jedinica + europskih složenih jedinica + + + Europska monetarna jedinica + europske monetarne jedinice + europskih monetarnih jedinica + europska monetarna jedinica + europskih monetarnih jedinica + + + europska obračunska jedinica (XBC) + europske obračunske jedinice (XBC) + europskih obračunskih jedinica (XBC) + europska obračunska jedinica (XBC) + europskih obračunskih jedinica (XBC) + + + europska obračunska jedinica (XBD) + europske obračunske jedinice (XBD) + europskih obračunskih jedinica (XBD) + europska obračunska jedinica (XBD) + europskih obračunskih jedinica (XBD) + + + istočnokaripski dolar + istočnokaripska dolara + istočnokaripskih dolara + istočnokaripski dolar + istočnokaripskih dolara + + + posebna crtaća prava + poseebna crtaća prava + posebnih crtaćih prava + posebno crtaće pravo + posebnih crtaćih prava + + + europska monetarna jedinica (ECU) + europske monetarne jedinice (ECU) + europskih monetarnih jedinica (ECU) + europska monetarna jedinica (ECU) + europskih monetarnih jedinica (ECU) + + + francuski zlatni franak + francuska zlatna franka + francuskih zlatnih franaka + francuski zlatni franak + francuskih zlatnih franaka + + + francuski UIC-franak + francuska UIC-franka + francuskih UIC-franaka + francuski UIC-franak + francuskih UIC-franaka + + + CFA franak BCEAO + CFA franka BCEAO + CFA franaka BCEAO + CFA franak BCEAO + CFA franaka BCEAO + + + paladij + paladija + paladija + paladij + paladija + + + CFP franak + CFP franaka + CFP franaka + + + platina + platine + platina + platina + platina + + + RINET fondovi + RINET fonda + RINET fondova + RINET fond + RINET fondova + + + ispitni kod valute + ispitna koda valute + ispitnih kodova valute + ispitni kod vlaute + ispitnih kodova valute + + + nepoznata ili nevažeća valuta + nepoznate ili nevažeće valute + nepoznatih ili nevažećih valuta + nepoznata ili nevažeća valuta + nevažećih ili nepoznatih valuta + + + jemenski dinar + jemenska dinara + jemenskih dinara + jemenski dinar + jemenskih dinara + + + jemenski rial + jemenska rijala + jemenskih rijala + jemenski rijal + jemenskih rijala + + + jugoslavenski čvrsti dinar + jugoslavenska čvrsta dinara + jugoslavenskih čvstih dinara + jugoslavenski čvrsti dinar + jugoslavenskih čvrstih dinara + + + jugoslavenski novi dinar + jugoslavenska nova dinara + jugoslavenskih novih dinara + jugoslavenski novi dinar + jugoslavenskih novih dinara + + + jugoslavenski konvertibilni dinar + jugoslavenska konvertibilna dinara + jugoslavenskih konvertibilnih dinara + jugoslavenski konvertibilni dinar + jugoslavenskih konvertibilnih dinara + + + južnoafrički rand (financijski) + južnoafrička randa (financijska) + južnoafičkih randa (financijskih) + južnoafrički rand (financijski) + južnoafričkih randa (financijskih) + + + južnoafrički rand + južnoafrička randa + južnoafričkih randa + južnoafrički rand + južnoafričkih randa + + + zambijska kvača + zambijske kvače + zambijskih kvača + zambijska kvača + zambijskih kvača + + + zairski novi zair + zairska nova zaira + zairskih novih zaira + zairski novi zair + zairskih novih zaira + + + zairski zair + zairska zaira + zairskih zaira + zairski zair + zairskih zaira + + + zimbabveanski dolar + zimbabveanska dolara + zimbabveanskih dolara + zimbabveanski dolar + zimbabveanskih dolara + + + + + + {0} dana + {0} dana + {0} dan + {0} dan + + + {0} sata + {0} sati + {0} sat + {0} sat + + + {0} minute + {0} minuta + {0} minuta + {0} minuta + + + {0} mjeseca + {0} mjeseci + {0} mjesec + {0} mjesec + + + {0} sekunde + {0} sekundi + {0} sekunda + {0} sekunda + + + {0} tjedna + {0} tjedana + {0} tjedan + {0} tjedan + + + {0} godine + {0} godina + {0} godina + {0} godina + + + + + da:d + ne:n + + + + diff --git a/lib/zend/Zend/Locale/Data/hr_HR.xml b/lib/zend/Zend/Locale/Data/hr_HR.xml new file mode 100644 index 0000000000..0a78545f12 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/hr_HR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/hu.xml b/lib/zend/Zend/Locale/Data/hu.xml new file mode 100644 index 0000000000..829c15b442 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/hu.xml @@ -0,0 +1,3746 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abház + achinéz + akoli + adangme + adyghe + avesztán + afrikaans + afroázsiai nyelv + afrihili + ainu + akan + akkád + aleut + algonkin nyelv + dél-altaji + amhara + aragonéz + óangol + angika + apacs nyelvek + arab + arámi + araucani + arapaho + mesterséges nyelv + aravak + asszámi + asztúr + atapaszkan nyelvek + ausztrál nyelvek + avar + awádi + ajmara + azerbajdzsáni + baskír + banda + bamileke nyelvek + balucsi + balinéz + basza + balti nyelv + belorusz + bedzsa + bemba + berber + bolgár + bihari + bodzspuri + bislama + bikol + bini + siksika + bambara + bengáli + bantu + tibeti + breton + braj + bosnyák + batak + burját + buginéz + blin + katalán + caddo + egyéb közép-amerikai indián + karib + egyéb kaukázusi + atszam + csecsen + cebui + egyéb kelta + csamoró + csibcsa + csagatáj + csukéz + mari + csinuk zsargon + csoktó + csipevé + cseroki + csejen + csam nyelv + korzikai + kopt + egyéb angol alapú kreol és pidgin + egyéb francia alapú kreol és pidgin + portugál alapú kreol vagy pidgin + krí + krími tatár + kreol és pidzsin + cseh + kasub + egyházi szláv + kusita nyelv + csuvas + walesi + dán + dakota + dargva + dajak + német + osztrák német + svájci felnémet + delavár + szlevi + dogrib + dinka + dogri + egyéb dravida + alsó szorb + duala + közép holland + divehi + diula + butáni + eve + efik + óegyiptomi + ekadzsuk + görög + elamit + angol + ausztrál angol + kanadai angol + brit angol + amerikai angol + közép angol + eszperantó + spanyol + latin-amerikai spanyol + ibériai spanyol + észt + baszk + evondo + perzsa + fang + fanti + fulani + finn + filippínó + finnugor nyelv + fidzsi + feröeri + fon + francia + kanadai francia + svájci francia + közép francia + ófrancia + északi fríz + keleti fríz + friuli + fríz + ír + ga + gajo + gbaja + skót gael + germán nyelv + geez + ikiribati + galíciai + közép felső német + guarani + ófelső német + gondi + gorontalo + gót + grebó + ógörög + svájci német + gudzsarati + Man-szigeti + gvicsin + hausza + haida + hawaii + héber + hindi + hiligajnon + himaháli + hittite + hmong + hiri motu + horvát + felső szorb + haiti + magyar + hupa + örmény + herero + interlingva + iban + indonéz + interlingue + igbó + szecsuán ji + idzsó + inupiak + ilokó + egyéb indiai + indoeurópai nyelv + ingus + idó + iráni + irokéz nyelvek + izlandi + olasz + inuktitut + japán + lojban + zsidó-perzsa + zsidó-arab + jávai + grúz + kara-kalpak + kabije + kacsin + jju + kamba + karen + kawi + kabardi + tyap + koro + kongo + kaszi + egyéb koiszan + kotanéz + kikuju + kuanyama + kazah + grönlandi + kambodzsai + kimbundu + kannada + koreai + konkani + kosrei + kpelle + kanuri + karacsáj-balkár + karelai + kru + kuruh + kásmíri + kurd + kumük + kutenai + komi + korni + kirgiz + latin + ladino + lahnda + lamba + luxemburgi + lezg + ganda + limburgi + lingala + laoszi + mongó + lozi + litván + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + lett + madurai + magahi + maithili + makaszar + mandingó + ausztronéz + masai + moksán + mandar + mende + málgas + közép ír + marshalli + maori + mikmak + minangkabau + egyéb nyelvek + macedón + egyéb mon-khmer + malajálam + mongol + mandzsu + manipuri + manobó nyelvek + moldvai + mohawk + moszi + marathi + maláj + máltai + többszörös nyelvek + munda nyelvek + krík + mirandéz + marvari + burmai + maja nyelvek + erzjány + naurui + nahuati + észak-amerikai indián nyelv + nápolyi + norvég bokmal + északi ndebele + alsónémet + nepáli + nevari + ndonga + nias + niger-kordofan nyelv + niui + holland + flamand + norvég nynorsk + norvég + nogaj + óskandináv + n'kó + déli ndebele + északi szotó + núbiai nyelv + navahó + klasszikus newari + nyanja + nyamvézi + nyankole + nyoró + nzima + okszitán + ojibva + oromói + orija + oszét + osage + ottomán török + otomi nyelv + pandzsábi + pápuai nyelv + pangaszinan + pahlavi + pampangan + papiamentó + palaui + óperzsa + Fülöp-szigeteki nyelv + főniciai + pali + lengyel + pohnpei + prakrit nyelvek + óprovánszi + pastu + portugál + brazíliai portugál + ibériai portugál + kecsua + radzsasztáni + rapanui + rarotongai + réto-román + kirundi + román + román nyelv + roma + ősi + orosz + aromán + kiruanda + szanszkrit + szandave + jakut + dél-amerikai indián nyelv + szelis nyelv + szamaritánus arámi + sasak + szantáli + szardíniai + szicíliai + skót + szindhi + északi számi + szölkup + egyéb szemita + szangó + óír + jelnyelv + szerbhorvát + san + szingaléz + szidamó + sziú nyelvek + sinotibeti nyelv + szlovák + szlovén + szláv nyelv + szamoai + déli számi + lapp nyelv + lule számi + inar sami + koltta lapp + sona + szoninke + szomáliai + sogdien + szongai + albán + szerb + szranai tongó + szerer + sziszuati + nílusi-szaharai nyelv + szeszotó + szundanéz + szukuma + szuszu + sumér + svéd + szuahéli + klasszikus szír + szíriai + tamil + thai nyelv + telugu + temne + terenó + tetum + tadzsik + thai + tigrinja + tigré + tiv + türkmén + tokelaui + tagalog + klingon + tlingit + tamasek + szecsuáni + tonga + nyasa tonga + tok pisin + török + conga + csimsiáni + tatár + tumbuka + tupi nyelv + altáji nyelv + tuvalu + twi + tahiti + tuvai + udmurt + ujgur + ugariti + ukrán + umbundu + ismeretlen vagy érvénytelen nyelv + urdu + üzbég + vai + venda + vietnámi + volapük + votják + vallon + vakas nyelv + valamo + varaó + vasó + szorb nyelvek + volof + kalmük + hosza + jaó + japi + jiddis + joruba + jupik nyelv + zsuang + zapoték + Bliss jelképrendszer + zenaga + kínai + egyszerűsített kínai + hagyományos kínai + zande + zulu + zuni + nincs nyelvészeti tartalom + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Világ + Afrika + Észak-Amerika + Dél-Amerika + Óceánia + Nyugat-Afrika + Közép-Amerika + Kelet-Afrika + Észak-Afrika + Közép-Afrika + Afrika déli része + Amerika + Amerika északi része + Karib-térség + Kelet-Ázsia + Dél-Ázsia + Délkelet-Ázsia + Dél-Európa + Ausztrália és Új-Zéland + Melanézia + Mikronéziai régió + Polinézia + Délközép-Ázsia + Ázsia + Közép-Ázsia + Nyugat-Ázsia + Európa + Kelet-Európa + Észak-Európa + Nyugat-Európa + Független Államok Közössége + Latin-Amerika és a Karib-térség + Csatorna-szigetek + Andorra + Egyesült Arab Emirátus + Afganisztán + Antigua és Barbuda + Anguilla + Albánia + Örményország + Holland Antillák + Angola + Antarktisz + Argentína + Amerikai Szamoa + Ausztria + Ausztrália + Aruba + Aland-szigetek + Azerbajdzsán + Bosznia-Hercegovina + Barbados + Banglades + Belgium + Burkina Faso + Bulgária + Bahrein + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei + Bolívia + Brazília + Bahamák + Bhután + Bouvet-sziget + Botswana + Fehéroroszország + Belize + Kanada + Kókusz-szigetek + Kongó - Kinshasa + Közép-afrikai Köztársaság + Kongó + Svájc + Elefántcsontpart + Cook-szigetek + Chile + Kamerun + Kína + Kolumbia + Costa Rica + Szerbia és Montenegró + Kuba + Zöld-foki Köztársaság + Karácsony-szigetek + Ciprus + Csehország + Németország + Dzsibuti + Dánia + Dominika + Dominikai Köztársaság + Algéria + Ecuador + Észtország + Egyiptom + Nyugat-Szahara + Eritrea + Spanyolország + Etiópia + Finnország + Fidzsi + Falkland-szigetek + Mikronézia + Feröer-szigetek + Franciaország + Gabon + Egyesült Királyság + Grenada + Grúzia + Francia Guyana + Guernsey + Ghána + Gibraltár + Grönland + Gambia + Guinea + Guadeloupe + Egyenlítői-Guinea + Görögország + Dél Grúzia és a Déli Szendvics-szigetek + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong S.A.R, Kína + Heard és McDonald Szigetek + Honduras + Horvátország + Haiti + Magyarország + Indonézia + Írország + Izrael + Man-sziget + India + Brit Indiai Oceán + Irak + Irán + Izland + Olaszország + Jersey + Jamaica + Jordánia + Japán + Kenya + Kirgizisztán + Kambodzsa + Kiribati + Comore-szigetek + Saint Kitts és Nevis + Észak-Korea + Dél-Korea + Kuvait + Kajmán-szigetek + Kazahsztán + Laosz + Libanon + Santa Lucia + Liechtenstein + Srí Lanka + Libéria + Lesotho + Litvánia + Luxemburg + Lettország + Líbia + Marokkó + Monaco + Moldova + Montenegró + Saint Martin + Madagaszkár + Marshall-szigetek + Macedónia + Mali + Mianmar + Mongólia + Makaó SAR Kína + Északi Mariana-szigetek + Martinique + Mauritánia + Montserrat + Málta + Mauritius + Maldív-szigetek + Malawi + Mexikó + Malajzia + Mozambik + Namíbia + Új-Kaledónia + Niger + Norfolk-sziget + Nigéria + Nicaragua + Hollandia + Norvégia + Nepál + Nauru + Niue + Új-Zéland + Omán + Panama + Peru + Francia Polinézia + Pápua Új-Guinea + Fülöp-szigetek + Pakisztán + Lengyelország + Saint Pierre és Miquelon + Pitcairn-sziget + Puerto Rico + Palesztin Terület + Portugália + Palau + Paraguay + Katar + Külső-Óceánia + Európai Unió + Reunion + Románia + Szerbia + Oroszország + Ruanda + Szaúd-Arábia + Salamon-szigetek + Seychelle-szigetek + Szudán + Svédország + Szingapúr + Szent Helena + Szlovénia + Svalbard és Jan Mayen + Szlovákia + Sierra Leone + San Marino + Szenegál + Szomália + Suriname + Sao Tomé és Príncipe + Salvador + Szíria + Szváziföld + Turks- és Caicos-szigetek + Csád + Francia Déli Területek + Togo + Thaiföld + Tadzsikisztán + Tokelau + Kelet-Timor + Türkmenisztán + Tunézia + Tonga + Törökország + Trinidad és Tobago + Tuvalu + Tajvan + Tanzánia + Ukrajna + Uganda + Amerikai Csendes-óceáni Szigetek + Egyesült Államok + Uruguay + Üzbegisztán + Vatikán + Saint Vincent és Grenadines + Venezuela + Brit Virgin-szigetek + Amerikai Virgin-szigetek + Vietnam + Vanuatu + Wallis és Futuna + Szamoa + Jemen + Mayotte + Dél-Afrika + Zambia + Zimbabwe + Ismeretlen vagy érvénytelen körzet + + + Hagyományos német helyesírás + Szabványosított reziján helyesírás + 1996-os német helyesírás + Késői közép francia 1606-ig + Keleti örmény + Nyugati örmény + Egyesített türkic latin ábécé + San Giorgo/Bila tájszólás + Boontling + IPA fonetika + UPA fonetika + Reziján lipovaz tájszólás + Monoton + Natisone dialektus + Gniva/Njiva tájszólás + Oseacco/Osojane tájszólás + Politonikus + Számítógép + Átdolgozott helyesírás + Reziján + Saho + Skót szabványos angol + Scouse + Stolvizza/Solbica tájszólás + Taraskijevica helyesírás + Valencia + + + Naptár + Rendezés + Pénznem + + + Hagyományos kínai sorrend - Big5 + buddhista naptár + kínai naptár + Közvetlen sorrend + Egyszerűsített kínai sorrend - GB2312 + Gergely-naptár + héber naptár + Indiai nemzeti naptár + iszlám naptár + iszlám civil naptár + japán naptár + Telefonkönyv sorrend + Pinyin sorrend + Kínai köztársasági naptár + Vonássorrend + Hagyományos + + + amerikai + metrikus + + + Nyelv: {0} + Írásrendszer: {0} + Régió: {0} + + + + titlecase-firstword + lowercase-words + titlecase-firstword + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + + + [a á b c {cs} {ccs} d {dz} {ddz} {dzs} {ddzs} e é f g {gy} {ggy} h i í j-l {ly} {lly} m n {ny} {nny} o ó ö ő p r s {sz} {ssz} t {ty} {tty} u ú ü ű v z {zs} {zzs}] + [q w-y] + [a-z] + + + „ + ” + „ + ” + + + + + + + BK + + + + + + + + jan. + febr. + márc. + ápr. + máj. + jún. + júl. + aug. + szept. + okt. + nov. + dec. + + + január + február + március + április + május + június + július + augusztus + szeptember + október + november + december + + + + + J + F + M + Á + M + J + J + A + S + O + N + D + + + + + + + V + H + K + Sze + Cs + P + Szo + + + vasárnap + hétfő + kedd + szerda + csütörtök + péntek + szombat + + + + + V + H + K + S + C + P + S + + + + + + + N1 + N2 + N3 + N4 + + + I. negyedév + II. negyedév + III. negyedév + IV. negyedév + + + + + 1 + 2 + 3 + 4 + + + + de. + du. + + + időszámításunk előtt + időszámításunk szerint + + + i. e. + i. sz. + + + + + + y. MMMM d., EEEE + + + + + y. MMMM d. + + + + + yyyy.MM.dd. + + + + + yyyy.MM.dd. + + + + + + + H:mm:ss zzzz + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + HH:mm + L + M. d., E + LLL + MMMM d. + MMM d. + MM.dd. + M. d. + d + mm:ss + yy/Q + yyyy.MM + y. MMMM + + + {0} - {1} + + M-M. + + + MM.dd., E - MM.dd., E + MM.dd., E - MM.dd., E + + + MMM-MMM + + + MMM d., E - MMM d., E + MMM d., E - d., E + + + MMM d. - MMM d. + MMM d-d. + + + MM.dd. - MM.dd. + MM.dd-dd. + + + d-d. + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + yyyy.MM-MM. + yyyy.MM. - yyyy.MM. + + + yyyy.MM.dd., E - MM.dd., E + yyyy.MM.dd., E - dd., E + yyyy.MM.dd., E - yyyy.MM.dd., E + + + y. MMM-MMM + y. MMM - y. MMM + + + y. MMM d., E - MMM d., E + y. MMM d., E - d., E + y. MMM d., E - y. MMM d., E + + + y. MMM d. - MMM d. + y. MMM d-d. + y. MMM d. - y. MMM d. + + + yyyy.MM.dd. - MM.dd. + yyyy.MM.dd-dd. + yyyy.MM.dd. - yyyy.MM.dd. + + + + + + éra + + + év + + + hónap + + + hét + + + nap + három nappal ezelőtt + tegnapelőtt + tegnap + ma + holnap + holnapután + három nap múlva + + + hét napja + + + napszak + + + óra + + + perc + + + másodperc + + + zóna + + + + + + + + Tisri + Hesván + Kiszlév + Tévész + Svát + Ádár risón + Ádár séni + Niszán + Ijár + Sziván + Áv + + + + + + TÉ + + + + + + + + Moharrem + Rébi el avvel + Rébi el accher + Dsemádi el avvel + Dsemádi el accher + Redseb + Sabán + Ramadán + Sevvál + Dsül kade + Dsül hedse + + + + + + MF + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + ismeretlen + + + Jereván + + + Déli-sark + + + Vosztok + + + Río Gallegos + + + Tucumán + + + Córdoba + + + Bécs + + + Barbadosz + + + Brüsszel + + + Szófia + + + Bahrein + + + Eirunepé + + + Río Branco + + + Cuiabá + + + Belém + + + Araguaína + + + Maceió + + + Minszk + + + Beliz + + + Montréal + + + Zürich + + + Húsvét-szigetek + + + Kasgár + + + Ürümqi + + + Csungking + + + Sanghaj + + + Havanna + + + Zöld-Foki Szigetek + + + Dzsibuti + + + Koppenhága + + + Dominika + + + Galapagos-szigetek + + + Kairó + + + Kanári-szigetek + + + Fidzsi + + + Truk-szigetek + + + Ponape-szigetek + + + Kosrae-szigetek + + + Párizs + + + Gibraltár + + + Godthåb + + + Scoresby Sound + + + Danmarks Havn + + + Athén + + + Dél-Georgia + + + Dzsakarta + + + Makasar + + + Bagdad + + + Teherán + + + Róma + + + Jamaika + + + Tokio + + + Kiritimati-sziget + + + St. Kitts + + + Észak-Korea + + + Dél-Korea + + + Kuvait + + + Aktau + + + Aktöbe + + + Kizilorda + + + Alma-Ata + + + Laosz + + + Bejrút + + + St. Lucia + + + Vilniusz + + + Luxemburg + + + Montenegró + + + Kwajalein-zátony + + + Majuro-zátony + + + Ulánbátor + + + Csojbalszan + + + Makaó + + + Málta + + + Maldív-szigetek + + + Mazatlán + + + Mexikóváros + + + Mérida + + + Cancún + + + Chatham-szigetek + + + Marquesas-szigetek + + + Gambier-szigetek + + + Varsó + + + Pitcairn-szigetek + + + Azori-szigetek + + + madeirai idő + + + Lisszabon + + + Katar + + + Bukarest + + + Szerbia + + + Kalinyingrád + + + Moszkva + + + Volgográd + + + Szamara + + + Jekatyerinburg + + + Omszk + + + Novoszibirszk + + + Krasznojarszk + + + Irkutszk + + + Jakutszk + + + Vlagyivosztok + + + Szahalin + + + Magadán + + + Kamcsatka + + + Anadir + + + Szingapúr + + + Salvador + + + Damaszkusz + + + Tunisz + + + Isztanbul + + + Tajvan + + + Ungvár + + + Kijev + + + Szimferopol + + + Zaporozsje + + + Midway-szigetek + + + Wake-sziget + + + Középső, Észak-Dakota + + + Szamarkand + + + Taskent + + + St. Vincent + + + St. Thomas + + + + Acre idő + Acre nyári idő + + + + + Afganisztáni idő + + + + + Mozambiki idő + Közép-afrikai idő + + + + + Kenyai idő + Kelet-afrikai idő + + + + + Nyugat-szaharai idő + + + + + Dél-afrikai idő + Dél-afrikai szabvány idő + + + + + Nigériai idő + Nyugat-afrikai idő + Nyugat-afrikai nyári idő + + + + + Aktyubinszki idő + Aktyubinszki nyári idő + + + + + Alaszkai idő + Alaszkai zónaidő + Alaszkai nyári idő + + + + + Alaszkai-hawaii idő + Alaszkai-hawaii zónaidő + Alaszkai-hawaii nyári idő + + + + + Amazóniai idő + Amazóniai nyári idő + + + + + Középső államokbeli idő + Középső államokbeli zónaidő + Középső államokbeli nyári idő + + + + + Keleti államokbeli idő + Keleti államokbeli zónaidő + Keleti államokbeli nyári idő + + + + + Hegyvidéki idő + Hegyvidéki zónaidő + Hegyvidéki nyári idő + + + + + Csendes-óceáni idő + Csendes-óceáni zónaidő + Csendes-óceáni nyári idő + + + + + Anadíri idő + Anadíri nyári idő + + + + + Aqtaui idő + Aqtaui nyári idő + + + + + Aqtobei idő + Aqtobei nyári idő + + + + + Arab idő + Arab zónaidő + Arab nyári idő + + + AT (Arab) + AST (arab) + ADT (Arab) + + + + + Argentína idő + argentínai nyári idő + + + + + Nyugat-Argentína idő + + + + + Örmény idő + Örmény nyári idő + + + AMT (Örményország) + AMST (Örményország) + + + + + Ashabadi idő + Ashabadi nyári idő + + + + + Atlanti-óceáni idő + Atlanti-óceáni zónaidő + Atlanti-óceáni nyári idő + + + + + Közép-ausztráliai idő + Ausztrál középső zónaidő + Ausztrál középső nyári idő + + + + + Ausztrál középső nyugati idő + Ausztrál középső nyugati zónaidő + Ausztrál középső nyugati nyári idő + + + + + Kelet-ausztrál idő + Ausztrál keleti zónaidő + Ausztrál keleti nyári idő + + + + + Nyugat-ausztrál idő + Ausztrál nyugati zónaidő + Ausztrál nyugati nyári idő + + + + + Azori idő + Azori nyári idő + + + + + Bakui idő + Bakui nyári idő + + + + + Bangladesi idő + + + + + Bering idő + Beringi zónaidő + Beringi nyári idő + + + BST (Beringi) + BDT (Beringi) + + + + + Butáni idő + + + + + Bolíviai idő + + + + + Borneói idő + Borneói nyári idő + + + + + Brazíliai idő + Brazíliai nyári idő + + + + + Brunei Darussalam-i idő + + + + + Cape verdei idő + Cape verdei nyári idő + + + + + Chamorroi zónaidő + + + + + Changbai idő + + + + + Chathami zónaidő + Chathami nyári idő + + + + + chilei idő + chilei nyári idő + + + + + Kínai zónaidő + Kínai nyári idő + + + CST (Kína) + CDT (Kína) + + + + + Csojbalszani idő + Csojbalszani nyári idő + + + + + Karácsony-szigeti idő + + + + + Kókusz-szigeteki idő + + + + + Kolumbiai idő + Kolumbiai nyári idő + + + + + Cook-szigeteki idő + Cook-szigeteki fél nyári idő + + + + + Kubai idő + Kubai zónaidő + Kubai nyári idő + + + CST (Kuba) + CDT (Kuba) + + + + + Daccai idő + + + + + Davisi idő + + + + + Dumont-d'Urville-i idő + + + + + Dusanbei idő + Dusanbei nyári idő + + + + + Holland-guianai idő + + + + + Kelet-timori idő + + + + + Húsvét-szigeteki idő + Húsvét-szigeteki nyári idő + + + + + Ecuadori idő + + + + + közép-európai idő + közép-európai nyári idő + + true + + + + kelet-európai idő + kelet-európai nyári idő + + true + + + + Nyugat-európai idő + Nyugat-európai nyári idő + + true + + + + Falkland-szigeteki idő + Falkland-szigeteki nyári idő + + + + + Fidzsi idő + Fidzsi nyári idő + + + + + Francia-guianai idő + + + + + Francia déli és antarktikus idő + + + + + Frunzei idő + Frunzei nyári idő + + + + + Greenwichi középidő + + true + + + + Galapagosi idő + + + + + Gambieri idő + + + + + Grúz idő + Grúz nyári idő + + + + + Gilbert-szigeteki idő + + + + + Közép-grönlandi idő + Közép-grönlandi nyári idő + + + + + Kelet-grönlandi idő + Kelet-grönlandi nyári idő + + + + + Nyugat-grönlandi idő + Nyugat-grönlandi nyári idő + + + + + Guami zónaidő + + + GST (Guam) + + + + + Öbölbeli zónaidő + + + + + Guyanai idő + + + + + Hawaii-aleuti zónaidő + + + + + Hongkongi idő + Hongkongi nyári idő + + + + + Hovdi idő + Hovdi nyári idő + + + + + Indiai zónaidő + + + + + Indiai-óceáni idő + + + + + Közép-indonéziai idő + + + + + Kelet-indonéziai idő + + + + + Nyugat-indonéziai idő + + + + + Iráni zónaidő + Iráni nyári idő + + + + + Irkutszki idő + Irkutszki nyári idő + + + + + Izraeli zónaidő + Izraeli nyári idő + + + IST (Izrael) + + + + + Japán zónaidő + Japán nyári idő + + + + + Petropavlovszk-kamcsatkai idő + Petropavlovszk-kamcsatkai nyári idő + + + + + Karacsi idő + + + + + Kasgár idő + + + + + Kelet-kazahsztáni zónaidő + + + + + Nyugat-kazahsztáni zónaidő + + + + + Kizilordai idő + Kizilordai nyári idő + + + + + Koreai idő + Koreai zónaidő + Koreai nyári idő + + + + + Kosraei idő + + + + + Krasznojarszki idő + Krasznojarszki nyári idő + + + + + Kujbisevi idő + Kujbisevi nyári idő + + + + + Kwajaleini idő + + + + + Kirgiz idő + + + + + Lankai idő + + + + + Libériai idő + + + Libériai idő + + + + + Line-szigeteki idő + + + + + Long-Shu idő + + + + + Lord howei idő + Lord howei zónaidő + Lord howei nyári idő + + + + + Macaui idő + Macaui nyári idő + + + + + Magadáni idő + Magadáni nyári idő + + + + + Malayai idő + + + + + Malajziai idő + + + + + Maldív-szigeteki idő + + + + + Marquesasi idő + + + + + Marshall-szigeteki idő + + + + + Mauritiusi idő + + + + + Mawsoni idő + + + + + Ulánbátori idő + Ulánbátori nyári idő + + + + + Moszkvai idő + Moszkvai zónaidő + Moszkvai nyári idő + + + + + Myanmari idő + + + + + Naurui idő + + + + + Nepáli idő + + + + + Új-kaledóniai idő + Új-kaledóniai nyári idő + + + + + Új-zélandi idő + Új-zélandi zónaidő + Új-zélandi nyári idő + + + + + Új-fundlandi idő + Új-fundlandi zónaidő + Új-fundlandi nyári idő + + + + + Niuei idő + + + + + Norfolk-szigeteki idő + + + + + Fernando de Noronha-i idő + Fernando de Noronha-i nyári idő + + + + + Észak-mariana-szigeteki idő + + + + + Novoszibirzski idő + Novoszibirszki nyári idő + + + + + Omszki idő + Omszki nyári idő + + + + + Pakisztáni idő + Pakisztáni nyári idő + + + + + Palaui idő + + + + + Pápua új-guineai idő + + + + + Paraguayi idő + Paraguayi nyári idő + + + + + Perui idő + Perui nyári idő + + + + + Fülöp-szigeteki idő + Fülöp-szigeteki nyári idő + + + + + Phoenix-szigeteki idő + + + + + Pierre és Miquelon-i idő + Pierre és Miquelon-i zónaidő + Pierre és Miquelon-i nyári idő + + + + + Pitcairni idő + + + + + Ponapei idő + + + + + Qyzylordai idő + Qyzylordai nyári idő + + + + + Réunioni idő + + + + + Rotherai idő + + + + + Sakhalin idő + Sakhalin nyári idő + + + + + Szamarai idő + Szamarai nyári idő + + + + + Szamarkandi idő + Szamarkandi nyári idő + + + SAMT (Szamarkand) + SAMST (Szamarkand) + + + + + Szamoai zónaidő + + + + + Seychelle-szigeteki idő + + + + + Sevcsenkói idő + Sevcsenkói nyári idő + + + + + Szingapúri zónaidő + + + + + Salamon-szigeteki idő + + + + + Dél-grúziai idő + + + GST (Dél-grúziai) + + + + + Szurinámi idő + + + + + Szverdlovszki idő + Szverdlovszki nyári idő + + + + + Syowai idő + + + + + Tahiti idő + + + + + Tadzsikisztáni idő + + + + + Taskenti idő + Taskenti nyári idő + + + + + Tbiliszi idő + Tbiliszi nyári idő + + + + + Tokelaui idő + + + + + Tongai idő + Tongai nyári idő + + + + + Truki idő + + + + + Török idő + Törökországi idő + Törökországi nyári idő + + + + + Türkmenisztáni idő + Türkmenisztáni nyári idő + + + + + Tuvalui idő + + + + + Uráli idő + Uráli nyári idő + + + + + Uruguayi idő + Uruguayi nyári idő + + + + + Urumqi idő + + + + + Üzbegisztáni idő + Üzbegisztáni nyári idő + + + + + Vanuatui idő + Vanuatui nyári idő + + + + + Venezuelai idő + + + + + Vlagyivosztoki idő + Vlagyivosztoki nyári idő + + + + + Volgográdi idő + Volgográdi nyári idő + + + + + Vosztoki idő + + + + + Wake-szigeti idő + + + + + Wallis és futunai idő + + + + + Jakutszki idő + Jakutszki nyári idő + + + + + Jekatyerinburgi idő + Jekatyerinburgi nyári idő + + + + + Jereváni idő + Jereváni nyári idő + + + + + yukoni idő + yukoni zónaidő + Yukoni nyári idő + + + + + + + , +   + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0.00 ¤ + + + {0} {1} + + + + Andorrai peseta + Andorrai peseta + + + EAE dirham + UAE dirham + + + Afghani (1927-2002) + Afghani (AFA) + + + Afghani + Afghani + + + Albán lek + Albán lek + + + Dram + Örmény dram + + + Holland-antilla forint + Holland Antillai guilder + + + Angolai kwanza + Angolai kwanza + + + Angolai kwanza (1977-1990) + Angolai kwanza (AOK) + + + Angolai új kwanza (1990-2000) + Angolai új kwanza (AON) + + + Angolai kwanza reajustado (1995-1999) + Angolai kwanza reajustado (AOR) + + + Argentín austral + Argentin austral + + + Argentín peso (1983-1985) + Argentin peso (ARP) + + + Peso + Argentin peso + + + Osztrák schilling + Osztrák schilling + + + Ausztrál dollár + Ausztrál dollár + + + Arubai forint + Arubai forint + + + Azerbajdzsáni manat (1993-2006) + Azerbajdzsáni manat (AZM) + + + Azerbajdzsáni manat + Azerbajdzsáni manat + + + Bosznia-hercegovinai dínár + Bosznia-hercegovinai dínár + + + Bozsnia-hercegovinai konvertibilis márka + Bosznia-hercegovinai konvertibilis márka + + + Barbadosi dollár + Barbadosi dollár + + + Bangladesi taka + Bangladesi taka + + + Belga frank (konvertibilis) + Belga frank (konvertibilis) + + + Belga frank + Belga frank + + + Belga frank (pénzügyi) + Belga frank (pénzügyi) + + + Bolgár kemény leva + Bolgár kemény leva + + + Bolgár új leva + Bolgár új leva + + + Bahreini dinár + Bahreini dinár + + + Burundi frank + Burundi frank + + + Bermudai dollár + Bermudai dollár + + + Brunei dollár + Brunei dollár + + + Boliviano + Bolíviai boliviano + + + Bolíviai peso + Bolíviai peso + + + Bolíviai mvdol + Bolíviai mvdol + + + Brazi cruzeiro novo (1967-1986) + Brazil cruzeiro novo (BRB) + + + Brazi cruzado + Brazil cruzado + + + Brazil cruzeiro (1990-1993) + Brazil cruzeiro (BRE) + + + Brazil real + Brazil real + + + Brazil cruzado novo + Brazil cruzado novo + + + Brazil cruzeiro + + + Bahamai dollár + + + Bhutáni ngultrum + + + Burmai kyat + + + Botswanai pula + + + Fehérorosz új rubel (1994-1999) + + + Fehérorosz rubel + + + Belizei dollár + + + Kanadai dollár + + + Kongói frank + + + WIR euro + + + Svájci frank + + + WIR frank + + + Chilei unidades de fomento + + + Chilei peso + + + Kínai jüan renminbi + + + Kolumbiai peso + + + Unidad de Valor Real + + + Costa Ricai colon + + + szerb dinár + + + Csehszlovák kemény korona + + + Kubai peso + + + Cape Verdei escudo + + + Ciprusi font + + + Cseh korona + + + Kelet-Német márka + + + Német márka + + + Dzsibuti frank + + + Dán korona + + + Dominikai peso + + + Algériai dínár + + + Ecuadori sucre + + + Ecuadori Unidad de Valor Constante (UVC) + + + Észt korona + + + Egyiptomi font + + + Eritreai nakfa + + + spanyol peseta (A-kontó) + + + spanyol peseta (konvertibilis kontó) + + + Spanyol peseta + + + Etiópiai birr + + + Euro + + + Finn markka + + + Fidzsi dollár + + + Falkland-szigeteki font + + + Francia frank + + + Brit font sterling + + + Grúz kupon larit + + + Grúz lari + + + Ghánai cedi (1979-2007) + + + Ghánai cedi + Ghánai cedi + + + Gibraltári font + + + Gambiai dalasi + + + Guineai frank + + + Guineai syli + + + Egyenlítői-guineai ekwele guineana + Egyenlítői-guineai ekwele + + + Görög drachma + + + Guatemalai quetzal + + + Portugál guinea escudo + + + Guinea-Bissaui peso + + + Guyanai dollár + + + Hongkongi dollár + + + Hodurasi lempira + + + Horvát dínár + + + Horvát kuna + + + Haiti gourde + + + Magyar forint + + + Indonéz rúpia + + + Ír font + + + Izraeli font + + + Izraeli új sékel + + + indiai rúpia + Indiai rúpia + + + Iraki dínár + + + Iráni rial + + + Izlandi korona + + + Olasz líra + + + Jamaikai dollár + + + Jordániai dínár + + + Japán jen + ¥ + + + Kenyai shilling + + + Kirgizisztáni szom + + + Kambodzsai riel + + + Comorei frank + + + Észak-koreai won + + + Dél-koreai won + + + Kuvaiti dínár + + + Kajmán-szigeteki dollár + + + Kazahsztáni tenge + + + Laoszi kip + + + Libanoni font + + + Sri Lankai rúpia + + + Libériai dollár + + + Lesothoi loti + + + Litvániai litas + + + Litvániai talonas + + + luxemburgi konvertibilis frank + + + Luxemburgi frank + + + luxemburgi pénzügyi frank + + + Lett lats + + + Lett rubel + + + Líbiai dínár + + + Marokkói dirham + + + Marokkói frank + + + Moldován lei + + + Madagaszkári ariary + + + Madagaszkári frank + + + Macedon dínár + + + Mali frank + + + Mianmari kyat + + + Mongóliai tugrik + + + makaói pataca + + + Mauritániai ouguiya + + + Máltai líra + + + Máltai font + + + Mauritiusi rúpia + + + Maldív-szigeteki rufiyaa + + + Malawi kwacha + + + Mexikói peso + + + Mexikói ezüst peso (1861-1992) + + + Mexikói Unidad de Inversion (UDI) + + + Malajziai ringgit + + + Mozambik escudo + + + Mozambik metical + + + Mozambiki metikális + + + Namíbiai dollár + + + Nigériai naira + + + Nikaraguai cordoba + + + Nikaraguai cordoba oro + + + Holland forint + + + Norvég korona + + + Nepáli rúpia + + + Új-zélandi dollár + + + Ománi rial + + + Panamai balboa + + + Perui inti + + + Perui sol nuevo + + + Perui sol + + + Pápua új-guineai kina + + + Fülöp-szigeteki peso + + + Pakisztáni rúpia + + + Lengyel zloty + + + Lengyel zloty (1950-1995) + + + Portugál escudo + + + Paraguayi guarani + + + Katari rial + + + rhodéziai dollár + Rhodéziai dollár + + + Régi román lej + Régi román lej + + + új román lej + Román lej + + + Szerb Dínár + + + Orosz rubel + + + Orosz rubel (1991-1998) + Orosz rubel (RUR) + + + Ruandai frank + + + Szaúdi riyal + + + Salamon-szigeteki dollár + + + Seychelle-szigeteki rúpia + + + Szudáni dínár + Régi szudáni dínár + + + Szudáni font + Szudáni font + + + Régi szudáni font + Régi szudáni font + + + Svéd korona + + + Szingapúri dollár + + + Saint Helena font + + + Szlovén tolar + + + Szlovák korona + + + Sierra Leonei leone + + + Szomáli shilling + + + Surinamei dollár + Surinamei dollár + + + Suriname-i gulden + + + Sao tome-i és principe-i dobra + + + Szovjet rubel + + + Salvadori colón + + + Szíriai font + + + Szváziföldi lilangeni + + + Thai baht + + + Tádzsikisztáni rubel + + + Tádzsikisztáni somoni + + + Türkmenisztáni manat + + + Tunéziai dínár + + + tongai paanga + Tongai paanga + + + Timori escudo + + + Régi török líra + Régi török líra + + + új török líra + Török líra + + + Trinidad és tobagoi dollár + + + Tajvani új dollár + Tajvani dollár + + + Tanzániai shilling + + + Ukrán hrivnya + + + Ukrán karbovanec + + + Ugandai shilling (1966-1987) + Ugandai shilling (UGS) + + + Ugandai shilling + + + USA dollár + $ + + + USA dollár (következő napi) + + + USA dollár (aznapi) + + + Uruguayi peso en unidades indexadas + Uruguayi peso en unidades indexadas + + + Uruguay-i peso (1975-1993) + Uruguayi peso (UYP) + + + Uruguay-i peso uruguayo + Uruguayi peso + + + Üzbegisztáni szum + + + Venezuelai bolívar + + + Venezuelai bolivar fuerte + Venezuelai bolivar fuerte + + + Vietnámi dong + + + Vanuatui vatu + + + Nyugat-szamoai tala + + + CFA frank BEAC + + + Ezüst + + + Arany + + + European Composite Unit + Európai kompozit egység + + + European Monetary Unit + Európai monetáris egység + + + European Unit of Account (XBC) + Európai kontó egység (XBC) + + + European Unit of Account (XBD) + Európai kontó egység (XBD) + + + Kelet-karibi dollár + + + Special Drawing Rights + + + európai pénznemegység + Európai pénznemegység + + + Francia arany frank + + + Francia UIC-frank + + + CFA frank BCEAO + + + palládium + Palládium + + + CFP frank + + + platina + Platina + + + RINET tőke + + + Tesztelési pénznemkód + + + Ismeretlen vagy érvénytelen pénznem + Ismeretlen/érvénytelen pénznem + + + Jemeni dínár + + + Jemeni rial + + + Jugoszláv kemény dínár + + + Jugoszláv új dínár + + + Jugoszláv konvertibilis dínár + + + Dél-afrikai rand (pénzügyi) + + + Dél-afrikai rand + + + Zambiai kwacha + + + Zairei új zaire + + + Zairei zaire + + + Zimbabwei dollár + + + + + + {0} nap + + + {0} óra + + + {0} perc + + + {0} hónap + + + {0} másodperc + + + {0} hét + + + {0} év + + + + + igen:i + nem:n + + + + diff --git a/lib/zend/Zend/Locale/Data/hu_HU.xml b/lib/zend/Zend/Locale/Data/hu_HU.xml new file mode 100644 index 0000000000..25bf9ece0b --- /dev/null +++ b/lib/zend/Zend/Locale/Data/hu_HU.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/hy.xml b/lib/zend/Zend/Locale/Data/hy.xml new file mode 100644 index 0000000000..22a5b60c14 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/hy.xml @@ -0,0 +1,593 @@ + + + + + + + + + + + Աֆրիկանս + Հաբեշերեն + Արաբերեն + Ասամերեն + Ադրբեջաներեն + Բելարուսերեն + Բուլղարերեն + Բիհարերեն + Բենգալերեն + Բրետոներեն + Բոսներեն + Կատալոներեն + Չեխերեն + Վալերեն + Դանիերեն + Գերմաներեն + Հունարեն + Անգլերեն + Էսպերանտո + Իսպաներեն + Էստոներեն + Բասկերեն + Պարսկերեն + Ֆիններեն + Տագալերեն + Ֆարվերեն + Ֆրանսերեն + Ֆրիսերեն + Իռլանդերեն + Գաելյան Շոտլանդերեն + Գալիսերեն + Գուարաներեն + Գուջարատերեն + Եբրայերեն + Հնդկերեն + Խորվաթերեն + Հունգարերեն + Հայերէն + Ինտերլինգուա + Ինդոնեզերեն + Ինտերլինգ + Իսլանդերեն + Իտալերեն + Ճապոներեն + Ճավայերեն + Վրացերեն + Կամբոջերեն + Կաննադա + Կորեերեն + Քրդերեն + Ղրղզերեն + Լատիներեն + Լինգալա + Լաոսերեն + Լիտվերեն + Լատվերեն + Մակեդոներեն + Կերալերեն + Մոնղոլերեն + Մարաթի + Մալայերեն + Մալթերեն + Նեպալերեն + Հոլանդերեն + Նորվեգերեն (Նյունորսկ) + Նորվեգերեն + Ակվիտաներեն + Օրիսերեն + Փենջաբերեն + Լեհերեն + Փաշտուներեն + Պորտուգալերեն + Ռումիներեն + Ռուսերեն + Սանսկրիտերեն + Սինդհի + Սերբա-Խորվաթերեն + Սինհալերեն + Սլովակերեն + Սլովեներեն + Սոմալերեն + Ալբաներեն + Սերբերեն + Սեսոտո + Սունդաներեն + Շվեդերեն + Սուահիլի + Թամիլերեն + Տելուգու + Թայերեն + Էրիտրերեն + Թուրքմեներեն + Կլինգոն + Թուրքերեն + Տուի + Ույղուրերեն + Ուկրաիներեն + Ուրդու + Ուզբեկերեն + Վիետնամերեն + Խոշերեն + Իդիշ + Չինարեն + Զուլուսերեն + + + Աշխարհ + Աֆրիկա + Հարավային Ամերիկա + Արևմտյան Աֆրիկա + Արևելյան Աֆրիկա + Հյուսիսային Աֆրիկա + Հարավային Աֆրիկա [018] + Անդորա + Միացյալ Արաբական Էմիրաթներ + Աֆղանստան + Անտիգուա-Բարբուդա + Ալբանիա + Հայաստանի Հանրապետութիւն + Անգոլա + Արգենտինա + Ավստրիա + Ավստրալիա + Ադրբեջան + Բոսնիա-Հերցեգովինա + Բարբադոս + Բանգլադեշ + Բելգիա + Բուրկինա Ֆասո + Բուլղարիա + Բահրեյն + Բուրունդի + Բենին + Բրունեյ + Բոլիվիա + Բրազիլիա + Բահամներ + Բուտան + Բոտսվանա + Բելոռուս + Բելիզ + Կանադա + Կենտրոնական Աֆրիկյան Հանրապետություն + Կոնգո + Շվեյցարիա + Փղոսկրի Ափ + Չիլի + Կամերուն + Չինաստան + Կոլումբիա + Կոստա-Ռիկա + Սերբիա և Մոնտենեգրո + Կուբա + Կաբո-Վերդե + Կիպրոս + Չեխիայի Հանրապետություն + Գերմանիա + Ջիբուտի + Դանիա + Դոմինիկա + Դոմինիկյան Հանրապետություն + Ալժիր + Էկվադոր + Էստոնիա + Եգիպտոս + Արեվմտյան Սահարա + Էրիտրեա + Իսպանիա + Եթովպիա + Ֆինլանդիա + Ֆիջի + Միկրոնեզիա + Ֆրանսիա + Գաբոն + Մեծ Բրիտանիա + Գրենադա + Վրաստան + Գանա + Գամբիա + Գվինեա + Հասարակածային Գվինեա + Հունաստան + Գվատեմալա + Գվինեա-Բիսաու + Գայանա + Հոնդուրաս + Հորվաթիա + Հաիթի + Հունգարիա + Ինդոնեզիա + Իռլանդիա + Իսրայել + Հնդկաստան + Իրաք + Իրան + Իսլանդիա + Իտալիա + Ջամայկա + Հորդանան + Ճապոնիա + Քենիա + Կիրգիզստան + Կամբոջա + Կիրիբատի + Կոմորոս + Սենտ Կիտս-Նեվիս + Հյուսիսային Կորեա + Հարավային Կորեա + Քուվեյթ + Ղազախստան + Լաոս + Լիբանան + Սանտա Լուչիա + Լիխտենշտեյն + Շրի Լանկա + Լիբերիա + Լեսոտո + Լիտվա + Լյուքսեմբուրգ + Լատվիա + Լիբիա + Մարոկո + Մոնակո + Մոլդովա + Մադագասկար + Մարշալյան կղզիներ + Մակեդոնիա + Մալի + Մյանմա + Մոնղոլիա + Մավրիտանիա + Մալթա + Մավրիտոս + Մալդիվներ + Մալավի + Մեքսիկա + Մալայզիա + Մոզամբիկ + Նամիբիա + Նիգեր + Նիգերիա + Նիկարագուա + Նիդերլանդեր + Նորվեգիա + Նեպալ + Նաուրու + Նոր Զելանդիա + Օման + Պանամա + Պերու + Պապուա Նոր Գվինեա + Ֆիլիպիններ + Պակիստան + Լեհաստան + Պորտուգալիա + Պալաու + Պարագվայ + Կատար + Ռումինիա + Ռուսաստան + Ռուանդա + Սաուդիան Արաբիա + Սոլոմոնյան կղզիներ + Սեյշելներ + Սուդան + Շվեդիա + Սինգապուր + Սլովենիա + Սլովակիա + Սյերա-Լեոնե + Սան Մարինո + Սենեգալ + Սոմալի + Սուրինամ + Սան-Թոմե-Փրինսիպի + Սալվադոր + Սիրիա + Սվազիլենդ + Չադ + Տոգո + Թաիլանդ + Տաճիկստան + Թուրքմենստան + Թունիս + Տոնգա + Թուրքիա + Տրինիդադ-Տոբագո + Տուվալու + Թայվան + Տանզանիա + Ուկրաինա + Ուգանդա + Ամէրիկայի Միացյալ Նահանգնէր + Ուրուգվայ + Ուզբեկստան + Վատիկան + Սենտ Վիսենտ-Գրենադիններ + Վենեսուելա + Վիետնամ + Վանուատու + Սամոա + Եմեն + Հարավային Աֆրիկա + Զամբիա + Զիմբաբվե + + + + [֊ ՝ ՜ ՞ ՚ ՛ ՟ ա-ե և զ-ֆ] + + + + + + + + Յնր + Փտր + Մրտ + Ապր + Մյս + Յնս + Յլս + Օգս + Սեպ + Հոկ + Նոյ + Դեկ + + + Յունուար + Փետրուար + Մարտ + Ապրիլ + Մայիս + Յունիս + Յուլիս + Օգոստոս + Սեպտեմբեր + Հոկտեմբեր + Նոյեմբեր + Դեկտեմբեր + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Կիր + Երկ + Երք + Չոր + Հնգ + Ուր + Շաբ + + + Կիրակի + Երկուշաբթի + Երեքշաբթի + Չորեքշաբթի + Հինգշաբթի + Ուրբաթ + Շաբաթ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + Առ․ + Եր․ + + + Ք․Ա․ + Ք․Ե․ + + + + + + EEEE, MMMM d, y + + + + + MMMM dd, y + + + + + MMM d, y + + + + + MM/dd/yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + MMMM dd + MM/dd + Q yy + + + {0} - {1} + + M-M + + + E, MM/dd - E, MM/dd + E, MM/dd - E, MM/dd + + + MMM-MMM + + + E, MMM dd - E, MMM dd + E, MMM dd - E, MMM dd + + + MMM dd - MMM dd + MMM dd-dd + + + MM/dd - MM/dd + MM/dd - MM/dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E, MM/dd/yy - E, MM/dd/yy + E, MM/dd/yy - E, MM/dd/yy + E, MM/dd/yy - E, MM/dd/yy + + + MMM-MMM y + MMM y - MMM y + + + E, MMM d - E, MMM d, y + E, MMM d - E, MMM d, y + E, MMM d, y - E, MMM d, y + + + MMM dd - MMM dd, y + MMM dd-dd, y + MMM dd, y - MMM dd, y + + + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + MM/dd/yy - MM/dd/yy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , + . + + + + + #0.### + + + + + + + #0% + + + + + + + #0.00 ¤ + + + + + + դր. + + + + diff --git a/lib/zend/Zend/Locale/Data/hy_AM.xml b/lib/zend/Zend/Locale/Data/hy_AM.xml new file mode 100644 index 0000000000..ac7bc38ca2 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/hy_AM.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/hy_AM_REVISED.xml b/lib/zend/Zend/Locale/Data/hy_AM_REVISED.xml new file mode 100644 index 0000000000..9869d0b79c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/hy_AM_REVISED.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + Հնվ + Փտվ + Հնս + Հլս + + + Հունվար + Փետրվար + Հունիս + Հուլիս + + + + Կե․ + + + Մ․Թ․Ա․ + Մ․Թ․ + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ia.xml b/lib/zend/Zend/Locale/Data/ia.xml new file mode 100644 index 0000000000..b53569d7d3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ia.xml @@ -0,0 +1,553 @@ + + + + + + + + + + + afrikaans + amharico + arabe + Assamese + azerbaidzhani + bielorusso + bulgaro + bihari + bengali + breton + bosniaco + catalano + checo + gallese + danese + germano + greco + anglese + anglese (RU) + anglese (SUA) + esperanto + espaniol + estoniano + basco + persiano + finnese + tagalog + faroese + francese + frisiano + irlandese + scoto gaelic + gallego + guarani + gujarati + hebreo + hindi + croato + hungaro + armeniano + interlingua + indonesiano + Interlingue + islandese + italiano + japonese + javanese + georgiano + Cambodiano + kannada + coreano + kurdo + kirghizo + latino + lingala + laotiano + lithuano + letton + macedone + malayalam + mongolico + marathi + malay + maltese + nepalese + nederlandese + norvegiano (nynorsk) + norvegiano + occitano + oriya + punjabi + polonese + pashto + portugese + romaniano + russo + sanscrito + sindhi + serbocroate + sinhalese + slovaco + sloveno + somali + albanese + serbo + sesotho + sundanese + svedese + swahili + tamil + telugu + thai + tigrinya + turkmeno + Klingon + turco + twi + Uyghur + ukrainiano + urdu + uzbeco + vietnamese + xhosa + yiddish + zulu + + + Emiratos Arabe Unite + Afghanistan + Antigua e Barbuda + Albania + Armenia + Antillas nederlandese + Angola + Antarctica + Argentina + Samoa american + Austria + Australia + Azerbaidzhan + Bosnia e Herzegovina + Bangladesh + Belgica + Burkina Faso + Bulgaria + Burundi + Benin + Bolivia + Brasil + Bahamas + Bhutan + Insula de Bouvet + Botswana + Bielorussia + Canada + Republica African Central + Congo + Suissa + Insulas Cook + Chile + Camerun + China + Colombia + Cuba + Insula de Natal + Cypro + Republica Tchec + Germania + Danmark + Republica Dominican + Algeria + Ecuador + Estonia + Egypto + Sahara occidental + Eritrea + Espania + Ethiopia + Finlandia + Micronesia + Insulas Feroe + Francia + Gabon + Regno Unite + Georgia + Guyana francese + Ghana + Groenlandia + Gambia + Guinea + Guinea equatorial + Grecia + Guinea-Bissau + Honduras + Croatia + Haiti + Hungaria + Indonesia + Irlanda + Israel + India + Territorio oceanic britanno-indian + Irak + Iran + Islanda + Italia + Jordania + Japon + Kenya + Kirghizistan + Cambodgia + Kiribati + Comoros + Sancte Christophoro e Nevis + Corea del Nord + Corea del Sud + Insulas de Caiman + Kazakhstan + Libano + Sancte Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Lettonia + Libya + Marocco + Moldavia + Madagascar + Insulas Marshall + Macedonia + Mali + Birmania/Myanmar + Mongolia + Insulas Marianna del Nord + Mauritania + Malawi + Mexico + Malaysia + Mozambique + Namibia + Nove Caledonia + Niger + Insula Norfolk + Nigeria + Nicaragua + Nederlandia + Norvegia + Nepal + Nove Zelanda + Oman + Peru + Polynesia francese + Papua Nove Guinea + Philippinas + Pakistan + Polonia + Portugal + Paraguay + Romania + Ruanda + Arabia Saudita + Insulas Solomon + Seychelles + Sudan + Svedia + Slovenia + Slovachia + Sierra Leone + San Marino + Senegal + Somalia + Suriname + Syria + Swazilandia + Insulas Turcos e Caicos + Tchad + Territorios meridional francese + Togo + Thailandia + Tadzhikistan + Tokelau + Timor del Est + Turkmenistan + Tunisia + tonga + Turchia + Trinidad e Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + Statos Unite + Uruguay + Uzbekistan + Sancte Vincente e le Grenadinas + Venezuela + Vanuatu + Samoa + Yemen + Africa del Sud + Zambia + Zimbabwe + + + + [a-c {ch} d-p {ph} q-z] + + + ‘ + ’ + “ + ” + + + + + + + + jan + feb + mar + apr + mai + jun + jul + aug + sep + oct + nov + dec + + + januario + februario + martio + april + maio + junio + julio + augusto + septembre + octobre + novembre + decembre + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + dom + lun + mar + mer + jov + ven + sab + + + dominica + lunedi + martedi + mercuridi + jovedi + venerdi + sabbato + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + T1 + T2 + T3 + T4 + + + 1-me trimestre + 2-nde trimestre + 3-tie trimestre + 4-te trimestre + + + + a.m. + p.m. + + + ante Christo + post Christo + + + a.Chr. + p.Chr. + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Capo Verde + + + Djibuti + + + Granada + + + Hongkong + + + Luxemburg + + + Martinica + + + Mauritio + + + Maldivas + + + Insula Pitcairn + + + Porto Rico + + + Mayotta + + + + + + , + . + + + + Dollares australian + + + Dollares canadian + + + Francos suisse + + + Marcos german + + + Coronas danese + + + Euros + + + francos francese + + + Libras sterling britannic + + + Yen japonese + + + Coronas norvegian + + + Coronas svedese + + + Dollares statounitese + + + + diff --git a/lib/zend/Zend/Locale/Data/id.xml b/lib/zend/Zend/Locale/Data/id.xml new file mode 100644 index 0000000000..79d4cea586 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/id.xml @@ -0,0 +1,1334 @@ + + + + + + + + + + + Afar + Abkhaz + Aceh + Acoli + Adangme + Adyghe + Avestan + Afrikaans + Afro-Asiatik (Lainnya) + Afrihili + Ainu + Akan + Akkadien + Aleut + Bahasa Algonquia + Altai Selatan + Amharik + Aragon + Inggris Kuno (kl.450-1100) + Angika + Bahasa-bahasa Apache + Arab + Aram + Araucan + Arapaho + Buatan (Lainnya) + Arawak + Assam + Astur + Bahasa-bahasa Athapaska + Bahasa-bahasa Australia + Avarik + Awadhi + Aymara + Azerbaijan + Bashkir + Banda + Bahasa-bahasa Bamileke + Baluchi + Balin + Basa + Baltik (Lainnya) + Belarusia + Beja + Bemba + Berber + Bulgaria + Bihari + Bhojpuri + Bislama + Bikol + Bini + Siksika + Bambara + Bengal + Bantu + Tibet + Breton + Braj + Bosnia + Batak + Buriat + Bugis + Blin + Catalan + Caddo + India Amerika Tengah (Lainnnya) + Karib + Kaukasia (Lainnya) + Atsam + Chechen + Cebuano + Celtic (Lainnya) + Chamorro + Chibcha + Chagatai + Chuuke + Mari + Jargon Chinook + Choctaw + Chipewyan + Cherokee + Cheyenne + Bahasa Chamic + Korsika + Koptik + Kreol dan Pidgins Lain Berbasis Inggris + Kreol dan Pidgins Lain berbasis Prancis + Kreol dan Pidgins Lain berbasis Portugis + Cree + Turki Krimea + Kreol dan Pidgins Lain + Ceko + Kashubian + Church Slavic + Cushitic Lain + Chuvash + Welsh + Denmark + Dakota + Dargwa + Dayak + Jerman + Jerman Austria + Jerman Tinggi Swiss + Delaware + Slave + Dogrib + Dinka + Dogri + Dravidia Lain + Sorbia Rendahan + Duala + Belanda Menengah + Divehi + Dyula + Dzongkha + Ewe + Efik + Mesir Kuno + Ekajuk + Yunani + Elamite + Inggris + Inggris Australia + Inggris Kanada + Inggris (British) + Inggris A.S. + Inggris, Abad Pertengahan (1100-1500) + Esperanto + Spanyol + Spanyol Amerika Latin + Spanyol (Iberia) + Estonian + Basque + Ewondo + Persia + Fang + Fanti + Fulah + Finlandia + Filipina + Finno - Ugria Lain + Fiji + Faro + Fon + Perancis + Prancis Kanada + Prancis Swiss + Perancis, Abad Pertengahan (kl.1400-1600) + Perancis Kuno (842-kl.1400) + Frisia Utara + Frisia Timur + Friuli + Frisi + Irlandia + Ga + Gayo + Gbaya + Gaelik Skotlandia + Jermanik (Lainnya) + Geez + Gilbert + Gallegan + Jerman, Abad Pertengahan (kl.1050-1500) + Guarani + Jerman Kuno (kl.750-1050) + Gondi + Gorontalo + Gothik + Grebo + Yunani Kuno (sd 1453) + Jerman Swiss + Gujarati + Manx + Gwich'in + Hausa + Haida + Hawaii + Ibrani + Hindi + Hiligaynon + Himachali + Hittite + Hmong + Hiri Motu + Kroasia + Sorbia Atas + Haiti + Hungaria + Hupa + Armenia + Herero + Interlingua + Iban + Bahasa Indonesia + Interlingue + Igbo + Sichuan Yi + Ijo + Inupiaq + Iloko + Indic Lain + Indo-Eropa Lain + Ingush + Ido + Iran Lain + Bahasa Iroquoia + Icelandic + Italian + Inuktitut + Japanese + Lojban + Judeo-Persia + Judeo-Arab + Jawa + Georgian + Kara-Kalpak + Kabyle + Kachin + Jju + Kamba + Karen + Kawi + Kabardian + Tyap + Koro + Kongo + Khasi + Khoisa Lain + Khotan + Kikuyu + Kuanyama + Kazakh + Kalaallisut + Khmer + Kimbundu + Kannada + Korea + Konkani + Kosrae + Kpelle + Kanuri + Karachay-Balkar + Karelian + Kru + Kurukh + Kashmir + Kurdi + Kumyk + Kutenai + Komi + Cornish + Kirghiz + Latin + Ladino + Lahnda + Lamba + Luxembourg + Lezghia + Ganda + Limburg + Lingala + Lao + Mongo + Lozi + Lithuania + Luba-Katanga + Luba-Lulua + Luiseno + Lunda + Luo + Lushai + Latvian + Madura + Magahi + Maithili + Makassar + Mandingo + Austronesia + Masai + Moksha + Mandar + Mende + Malagasi + Irlandia Abad Pertengahan (900-1200) + Marshall + Maori + Micmac + Minangkabau + Bahasa Lain-lain + Macedonian + Mon-Khmer (Lainnya) + Malayalam + Mongolian + Manchu + Manipuri + Bahasa Manobo + Moldavian + Mohawk + Mossi + Marathi + Malay + Maltese + Beberapa Bahasa + Bahasa Munda + Creek + Mirand + Marwari + Burma + Bahasa Mayan + Erzya + Nauru + Nahuati + Indian Amerika Utara Lain + Neapolitan + Norwegian Bokmål + Ndebele Utara + Jerman Rendah + Nepal + Newari + Ndonga + Nias + Niger - Kordofania Lain + Niuea + Belanda + Flemish + Norwegian Nynorsk + Norwegian + Nogai + Norse Lama + N'Ko + Ndebele Selatan + Sotho Utara + Bahasa Nubia + Navajo + Newari Klasik + Nyanja; Chichewa; Chewa + Nyamwezi + Nyankole + Nyoro + Nzima + Bahasa Occit + Ojibwa + Oromo + Oriya + Ossetic + Osage + Turki Ottoman + Bahasa Otomia + Punjabi + Papuan (Lainnya) + Pangasina + Pahlavi + Pampanga + Papiamento + Palaua + Persia Kuno (kl.600-400 SM.) + Filipina (Lainnya) + Phoenicia + Pali + Polish + Pohnpeia + Bahasa Prakrit + Provençal Lama + Pashto (Pushto) + Portugis + Portugis Brasil + Portugis (Iberia) + Quechua + Rajasthani + Rapanui + Rarotongan + Rhaeto-Romance + Rundi + Romanian + Romance Lain + Romany + Root + Russian + Aromanian + Kinyarwanda + Sanskrit + Sandawe + Yakut + Indian Amerika Selatan Lain + Bahasa Salisha + Aramaic Samaritan + Sasak + Santali + Sardinian + Sisilia + Skotlandia + Sindhi + Northern Sami + Selkup + Semitic Lain + Sango + Irlandia Lama + Bahasa Isyarat + Serbo-Croatian + Shan + Sinhalese + Sidamo + Bahasa Siouan + Sino-Tibet Lain + Slovak + Slovenian + Slavic Lain + Samoan + Sami Selatan + Bahasa Sami Lain + Lule Sami + Inari Sami + Skolt Sami + Shona + Soninke + Somali + Sogdien + Songhai + Albanian + Serbian + Sranan Tongo + Serer + Swati + Nilo-Sahara Lain + Sotho Selatan + Sundan + Sukuma + Susu + Sumeria + Swedia + Swahili + Syria + Tamil + Tai Lain + Telugu + Timne + Tereno + Tetum + Tajik + Thai + Tigrinya + Tigre + Tiv + Turkmen + Tokelau + Tagalog + Klingon + Tingit + Tamashek + Tswana + Tonga + Nyasa Tonga + Tok Pisin + Turkish + Tsonga + Tsimshian + Tatar + Tumbuka + Bahasa Tupi + Altaic Lain + Tuvalu + Twi + Tahitian + Tuvinia + Udmurt + Uighur + Ugaritik + Ukrainian + Umbundu + Bahasa Tidak Dikenal atau Tidak Valid + Urdu + Uzbek + Vai + Venda + Vietnamese + Volapük + Votik + Walloon + Bahasa Wakasha + Walamo + Waray + Washo + Bahasa Serbia + Wolof + Kalmyk + Xhosa + Yao + Yap + Yiddish + Yoruba + Bahasa Yupik + Zhuang + Zapotek + Zenaga + Cina + Cina Sederhana + Cina Tradisional + Zande + Zulu + Zuni + Tidak ada konten linguistik + Zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Andora + Uni Emirat Arab + Afghanistan + Antigua dan Barbuda + Anguilla + Albania + Armenia + Antilles Belanda + Angola + Antarktika + Argentina + Samoa Amerika + Austria + Australia + Aruba + �Land Islands + Azerbaijan + Bosnia dan Herzegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Bermuda + Brunei + Bolivia + Brazil + Bahamas + Bhutan + Kepulauan Bouvet + Botswana + Belarusia + Belize + Kanada + Kepulauan Cocos + Republik Demokratik Kongo + Republik Afrika Tengah + Kongo + Swiss + Pantai Gading + Kepulauan Cook + Chili + Kamerun + Cina + Kolombia + Kosta Rika + Serbia dan Montenegro + Kuba + Tanjung Verde + Pulau Christmas + Siprus + Republik Ceko + Jerman + Jibouti + Denmark + Dominika + Republik Dominika + Algeria + Ekuador + Estonia + Mesir + Sahara Barat + Eritrea + Spanyol + Ethiopia + Finlandia + Fiji + Kepulauan Falkland + Mikronesia + Kepulauan Faroe + Perancis + Gabon + Inggris Raya + Grenada + Georgia + Guyana Perancis + Guernsey + Ghana + Gibraltar + Greenland + Gambia + Guinea + Guadeloupe + Guinea Khatulistiwa + Yunani + Georgia Selatan dan Kepulauan Sandwich Selatan + Guatemala + Guam + Guinea-Bissau + Guyana + Hong Kong S.A.R., Cina + Pulau Heard dan Kepulauan McDonald + Honduras + Kroasia + Haiti + Hungaria + Indonesia + Irlandia + Israel + Isle of Man + India + British Indian Ocean Territory + Iraq + Iran + Islandia + Itali + Jersey + Jamaika + Yordania + Jepang + Kenya + Kyrgyzstan + Kamboja + Kiribati + Komoros + Saint Kitts dan Nevis + Korea Utara + Korea Selatan + Kuwait + Kepulauan Kayman + Kazakhstan + Laos + Lebanon + Santa Lusia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lithuania + Luxembourg + Latvia + Libya + Maroko + Monaco + Moldova + Montenegro + Madagaskar + Kepulauan Marshall + Macedonia + Mali + Myanmar + Mongolia + Makao S.A.R. Cina + Kepualuan Mariana Utara + Martinique + Mauritania + Montserrat + Malta + Mauritius + Maldives + Malawi + Mexico + Malaysia + Mozambique + Namibia + Kaledonia Baru + Niger + Kepulauan Norfolk + Nigeria + Nicaragua + Netherlands + Norwegia + Nepal + Nauru + Niue + Selandia Baru + Oman + Panama + Peru + Polynesia Perancis + Papua Nugini + Filipina + Pakistan + Polandia + Saint Pierre dan Miquelon + Pitcairn + Puerto Riko + Otoritas Palestina + Portugis + Palau + Paraguay + Qatar + Réunion + Romania + Serbia + Rusia + Rwanda + Arab Saudi + Kepulauan Solomon + Seychelles + Sudan + Sweden + Singapura + Saint Helena + Slovenia + Svalbard dan Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Suriname + Sao Tome dan Principe + El Salvador + Syria + Swaziland + Kepulauan Turks dan Caicos + Chad + Wilayah Prancis Selatan + Togo + Thailand + Tajikistan + Tokelau + Timor Timur + Turkmenistan + Tunisia + Tonga + Turkey + Trinidad dan Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + Kepulauan minor sekitar Amerika Serikat + Amerika Serikat + Uruguay + Uzbekistan + Vatikan + Saint Vincent dan Grenadines + Venezuela + Kepulauan British Virgin + Kepulauan U.S. Virgin + Vietnam + Vanuatu + Wallis dan Futuna + Samoa + Yaman + Mayotte + Afrika Selatan + Zambia + Zimbabwe + + + + [a-n {ng} {ny} o p r-w y] + + + ‘ + ’ + “ + ” + + + + + + + + Jan + Feb + Mar + Apr + Mei + Jun + Jul + Agu + Sep + Okt + Nov + Des + + + Januari + Februari + Maret + April + Mei + Juni + Juli + Agustus + September + Oktober + November + Desember + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Min + Sen + Sel + Rab + Kam + Jum + Sab + + + Minggu + Senin + Selasa + Rabu + Kamis + Jumat + Sabtu + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + K1 + K2 + K3 + K4 + + + kuartal pertama + kuartal kedua + kuartal ketiga + kuartal keempat + + + + AM + PM + + + BCE + CE + + + + + + EEEE, dd MMMM yyyy + + + + + d MMMM yyyy + + + + + d MMM yyyy + + + + + dd/MM/yy + + + + + + + H:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + dd MMMM + dd/MM + mm:ss + MM/yy + Q yy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Andora + + + Anguila + + + Kutub Selatan + + + Dumont D'Urville + + + Easter Island + + + Kosta Rika + + + Dominika + + + Canary Islands + + + Guadalupe + + + Hongkong + + + Jamaika + + + St. Kitts + + + St. Lucia + + + Monako + + + Makau + + + Singapura + + + Salvador + + + Alaska Time + + + St. Vincent + + + St. Thomas + + + + + + , + . + + + + + ¤#,##0.00 + + + + + + Dirham Uni Emirat Arab + + + Peso Argentina + + + Dolar Australia + + + Lev Bulgaria + + + Dollar Brunei + + + Boliviano Bolivia + + + Real Brazil + + + Dolar Kanada + + + Franc Swiss + + + Peso Chili + + + Yuan Renminbi + + + Peso Kolombia + + + Koruna Czech + + + Mark Jerman + + + Kroner Denmark + + + Kroon Estonia + + + Pound Mesir + + + Euro + + + Dollar Fiji + + + Frank Prancis + + + Pondsterling Inggris + + + Dolar Hong Kong + + + Kuna Kroasia + + + Forint Hungaria + + + Rupiah Indonesia + + + Shekel Israel + + + Rupee India + + + Yen Jepang + + + Shilling Kenya + + + Won Korea Selatan + + + Litas Lithuania + + + Dirham Maroko + + + Lira Malta + + + Peso Meksiko + + + Ringgit Malaysia + + + Kroner Norwegia + + + Dolar New Zealand + + + Nuevo Sol Peruvian + + + Peso Filipina + + + Rupee Pakistan + + + NewZloty Polandia + + + Leu Rumania Baru + + + Dinar Serbia + + + Rubel Rusia + + + Real Saudi + + + Kronor Swedia + + + Dolar Singapura + + + Tolar Slovenia + + + Koruna Slovakia + + + Baht Thailand + + + Lira Turki + + + Lira Turki Baru + + + Dolar Taiwan Baru + + + Hryvnia Ukrania + + + Dolar Amerika + + + Bolivar Venezuela + + + Dong Vietnam + + + Rand Afrika Selatan + + + + + + {0} hari + + + {0} jam + + + {0} menit + + + {0} bulan + + + {0} detik + + + {0} minggu + + + {0} tahun + + + + + ya:y + tidak:t + + + diff --git a/lib/zend/Zend/Locale/Data/id_ID.xml b/lib/zend/Zend/Locale/Data/id_ID.xml new file mode 100644 index 0000000000..8ee4e8b859 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/id_ID.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ig.xml b/lib/zend/Zend/Locale/Data/ig.xml new file mode 100644 index 0000000000..81e57ec7fe --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ig.xml @@ -0,0 +1,191 @@ + + + + + + + + + + [a b {ch} d-g {gb} {gh} {gw} h i ị j k {kp} {kw} l-n ṅ {nw} {ny} o ọ p r s {sh} t u ụ v w y z] + + + + + + + + Jen + Feb + Maa + Epr + Mee + Juu + Jul + Ọgọ + Sep + Ọkt + Nov + Dis + + + Jenụwarị + Febrụwarị + Maachị + Eprel + Mee + Juun + Julaị + Ọgọọst + Septemba + Ọktoba + Novemba + Disemba + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Ụka + Mọn + Tiu + Wen + Tọọ + Fraị + Sat + + + Mbọsị Ụka + Mọnde + Tiuzdee + Wenezdee + Tọọzdee + Fraịdee + Satọdee + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + A.M. + P.M. + + + Tupu Kristi + Afọ Kristi + + + T.K. + A.K. + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + H:mm + L + d + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Naịra + + + + diff --git a/lib/zend/Zend/Locale/Data/ig_NG.xml b/lib/zend/Zend/Locale/Data/ig_NG.xml new file mode 100644 index 0000000000..5ad548c00c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ig_NG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ii.xml b/lib/zend/Zend/Locale/Data/ii.xml new file mode 100644 index 0000000000..157f66c1bb --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ii.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + ꄓꇩꉙ + ꑱꇩꉙ + ꑭꀠꑸꉙ + ꃔꇩꉙ + ꆈꌠꉙ + ꑴꄊꆺꉙ + ꏝꀪꉙ + ꁍꄨꑸꉙ + ꀠꑟꁍꄨꑸꉙ + ꊉꇩꉙ + ꅉꀋꌠꅇꂷ + ꍏꇩꉙ + ꈝꐯꍏꇩꉙ + ꀎꋏꍏꇩꉙ + + + + + + + + + + + + + ꀠꑭ + ꍏꇩ + ꄓꇩ + ꃔꇩ + ꑱꇩ + ꑴꄗ + ꑴꄊꆺ + ꏝꀪ + ꊉꇆꌦ + ꂰꇩ + ꃅꄷꅉꀋꐚꌠ + + + ꄉꉻꃅꑍ + ꑳꌦꇂꑍꉖ + + + ꂰꇩ + ꂰꌬꌠ + + + ꅇꉙ: {0} + ꇇꁱ: {0} + ꃅꄷ: {0} + + + + [ꀀ-ꒌ] + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + ꋍꆪ + ꑍꆪ + ꌕꆪ + ꇖꆪ + ꉬꆪ + ꃘꆪ + ꏃꆪ + ꉆꆪ + ꈬꆪ + ꊰꆪ + ꊰꊪꆪ + ꊰꑋꆪ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ꆏꑍ + ꆏꋍ + ꆏꑍ + ꆏꌕ + ꆏꇖ + ꆏꉬ + ꆏꃘ + + + ꑭꆏꑍ + ꆏꊂꋍ + ꆏꊂꑍ + ꆏꊂꌕ + ꆏꊂꇖ + ꆏꊂꉬ + ꆏꊂꃘ + + + + + ꆏ + ꋍ + ꑍ + ꌕ + ꇖ + ꉬ + ꃘ + + + + + + + ꃅꑌ + ꃅꎸ + ꃅꍵ + ꃅꋆ + + + ꃅꑌ + ꃅꎸ + ꃅꍵ + ꃅꋆ + + + + + 1 + 2 + 3 + 4 + + + + ꎸꄑ + ꁯꋒ + + + ꃅꋊꂿ + ꃅꋊꊂ + + + + + + y MMMM d + + + + + + ꃅꋊ + + + ꈎ + + + ꆪ + + + ꑭꆏ + + + ꑍ + ꎴꂿꋍꑍ + ꀋꅔꉈ + ꀃꑍ + ꃆꏂꑍ + ꌕꀿꑍ + + + ꆏꑍ + + + ꎸꄑ/ꁯꋒ + + + ꄮꈉ + + + ꃏ + + + ꇙ + + + ꃅꄷꄮꈉ + + + + + + + ꅉꀋꐚꌠ + + + + + + . + , + + + + ꅉꀋꐚꌠꌋꆀꎆꃀꀋꈁꀐꌠ + + + + + + ꉬ + ꀋꉬ + + + diff --git a/lib/zend/Zend/Locale/Data/ii_CN.xml b/lib/zend/Zend/Locale/Data/ii_CN.xml new file mode 100644 index 0000000000..cb480f9dd8 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ii_CN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/in.xml b/lib/zend/Zend/Locale/Data/in.xml new file mode 100644 index 0000000000..f4a4bd09de --- /dev/null +++ b/lib/zend/Zend/Locale/Data/in.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/is.xml b/lib/zend/Zend/Locale/Data/is.xml new file mode 100644 index 0000000000..8390ec3cbe --- /dev/null +++ b/lib/zend/Zend/Locale/Data/is.xml @@ -0,0 +1,2180 @@ + + + + + + + + + nn sv nb da en + + + {0} ({1}) + , + + + afár + abkasíska + akkíska + akólí + adangme + adýge + avestíska + afríkanska + afróasísk mál (önnur) + afríhílí + aínu (Japan) + akan + akkadíska + aleúska + algonkvínsk mál + suðuraltaíska + amharíska + aragonska + fornenska (um 450-1100) + angíka + apatsjamál + arabíska + arameíska + arákaníska + arapahó + alþjóðamál (önnur) + aravakska + assamska + astúríska + atapaskísk mál + áströlsk mál + avaríska + avadí + aímara + aserska + baskír + banda + bamílekemál + balúkí + balíska + basa + baltnesk mál (önnur) + hvítrússneska + beja + bemba + berbamál + búlgarska + bíharí + bojpúrí + bíslama + bíkol + bíní + siksika + bambara + bengalska + bantúmál + tíbeska + bretónska + braí + bosníska + batak + búríat + búgíska + blín + katalónska + kaddó + Indíánamál Mið-Ameríku (önnur) + karíbamál + kákasusmál (önnur) + atsam + tsjetsjenska + kebúanó + keltnesk (önnur) + kamorró + síbsja + sjagataí + sjúkíska + marí + sínúk + sjoktá + sípevíska + sjerókí + sjeyen + kamísk mál + korsíska + koptíska + kreól- og pidginmál á enskum grunni + kreól- og pidginmál á frönskum grunni + kreól- og pidginmál á portúgölskum grunni + krí + krímtyrkneska + kreól- og pidginmál (önnur) + tékkneska + kasúbíska + kirkjuslavneska + kúsitísk mál (önnur) + sjúvas + velska + danska + dakóta + dargva + dajak + þýska + austurrísk þýska + svissnesk háþýska + delaver + slavneska + dogríb + dinka + dogrí + dravidísk mál (önnur) + lágsorbneska + dúala + miðhollenska (um 1050-1350) + dívehí + djúla + dsongka + eve + efík + fornegypska + ekajúk + nýgríska (1453-) + elamít + enska + áströlsk enska + kanadísk enska + bresk enska + bandarísk enska + miðenska (1100-1500) + esperantó + spænska + latnesk-amerísk spænska + íberísk spænska + eistneska + baskneska + evondó + persneska + fang + fantí + fúla + finnska + filipínska + finnskúgrísk mál (önnur) + fídjeyska + færeyska + fón + franska + kanadísk franska + svissnesk franska + miðfranska (um 1400-1600) + fornfranska (842 - um 1400) + norðurfrísneska + austurfrísneska + fríúlska + frísneska + írska + ga + gajó + gbaja + skosk gelíska + germönsk mál (önnur) + gís + gilberska + gallegska + miðháþýska (um 1050-1500 + gvaraní + fornháþýska (um 750-1050) + gondí + gorontaló + gotneska + gerbó + forngríska (til 1453) + svissnesk þýska + gújaratí + manx + gvísín + hása + haída + havaíska + hebreska + hindí + híligaínon + hímasjalí + hettitíska + hmong + hírímótú + króatíska + hásorbneska + haítíska + ungverska + húpa + armenska + hereró + interlingva + íban + indónesíska + interlingve + ígbó + sísúanjí + íjó + ínúpíak + ílokó + indversk mál (önnur) + indóevrópsk mál (önnur) + ingús + ídó + íranska + írókesk mál + íslenska + ítalska + inúktitút + japanska + lojban + gyðingapersneska + gyðingaarabíska + javanska + georgíska + karakalpak + kabíle + kasín + jju + kamba + karen + kaví + kabardíska + tyap + koro + kongó + kasí + koímál (önnur) + kotaska + kíkújú + kúanjama + kasakska + grænlenska + kmer + kimbúndú + kannada + kóreska + konkaní + kosraska + kpelle + kanúrí + karasaíbalkar + karélska + krú + kúrúk + kasmírska + kúrdneska + kúmík + kútenaí + komíska + korníska + kirgiska + latína + ladínska + landa + lamba + lúxemborgíska + lesgíska + ganda + limbúrgíska + lingala + laó + mongó + losí + litháíska + lúbakatanga + lúbalúlúa + lúisenó + lúnda + lúó + lúsaí + lettneska + madúrska + magahí + maítílí + makasar + mandingó + ástrónesíska + masaí + moksa + mandar + mende + malagasíska + miðírska (900-1200) + marshallska + maórí + mikmak + mínangkabá + ýmis mál + makedónska + monkmermál (önnur) + malajalam + mongólska + mansjú + manípúrí + manóbómál + moldóvska + móhíska + mossí + maratí + malaíska + maltneska + margvísleg mál + múndamál + krík + mirandesíska + marvarí + burmneska + majamál + ersja + nárúska + nahúatl + Indíánamál Norður-Ameríku (önnur) + napólíska + norskt bókmál + norðurndebele + Lágþýska; Lágsaxneska + nepalska + nevarí + ndonga + nías + nígerkordófanmál (önnur) + níveska + hollenska + flæmska + nýnorska + norska + nógaí + norræna + N’Ko + suðurndebele + norðursótó + núbísk mál + navahó + klassísk nevaríska + Njanja; Sísjeva; Sjeva + njamvesí + njankóle + njóró + nsíma + Okkitíska (eftir 1500); Próvensalska + ojibva + órómó + óría + ossetíska + ósage + tyrkneska, ottóman (1500-1928) + ótommál + púnjabí + papúsk mál (önnur) + pangasínmál + palaví + pampanga + papíamentó + paláska + fornpersneska + filippseysk mál (önnur) + fönikíska + palí + pólska + ponpeiska + prakrítmál + fornpróvensalska (til 1500) + pastú + portúgalska + brasílísk portúgalska + íberísk portúgalska + kvesjúa + rajastaní + rapanúí + rarótongska + retórómanska + rúndí + rúmenska + rómönsk mál (önnur) + romaní + rót + rússneska + arúmenska + kínjarvanda + sanskrít + sandave + jakút + Indíánamál Suður-Ameríku (önnur) + salísmál + samversk arameíska + sasak + santalí + sardínska + sikileyska + skoska + sindí + norðursamíska + selkúp + semísk mál (önnur) + sangó + fornírska (til 900) + táknmál + serbókróatíska + sjan + singalesíska + sídamó + síúmál + sínótíbesk mál + slóvakíska + slóvenska + slavnesk mál (önnur) + samóska + suðursamíska + samísk mál (önnur) + lúlesamíska + enaresamíska + skoltesamíska + shóna + sóninke + sómalska + sogdíen + songhaí + albanska + serbneska + sranan tongo + serer + svatí + nílósaharamál (önnur) + suðursótó + súndanska + súkúma + súsú + súmerska + sænska + svahílí + klassísk sýrlenska + sýrlenska + tamílska + taímál (önnur) + telúgú + tímne + terenó + tetúm + tadsjikska + taílenska + tígrinja + tígre + tív + túrkmenska + tókeláska + tagalog + klingónska + tlingit + tamasjek + tsúana + Tongverska (Tongaeyjar) + Tongverska (Nyasa) + tokpisin + tyrkneska + tsonga + tsimsíska + tatarska + túmbúka + túpímál + altaísk mál (önnur) + túvalúska + tví + tahítíska + túvínska + údmúrt + úígúr + úgarítíska + úkraínska + úmbúndú + óþekkt eða ógilt tungumál + úrdú + úsbekska + vaí + venda + víetnamska + volapyk + votíska + vallónska + vakasmál + valamó + varaí + vasjó + sorbnesk mál + volof + kalmúkska + sósa + jaó + japíska + jiddíska + jórúba + júpísk mál + súang + sapótek + blisstákn + senaga + kínverska + kínverska (einfölduð) + kínverska (hefðbundin) + sande + súlú + súní + ekkert tungutengt efni + zázáíska + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + heimur + Afríka + Norður-Ameríka + Suður-Ameríka + Eyjaálfa + Vestur-Afríka + Mið-Ameríka + Austur-Afríka + Norður-Afríka + Mið-Afríka + Suðurhluti Afríku + Ameríka + Ameríka norðan Mexikó + Karíbahaf + Austur-Asía + suðurhluti Asíu + Suðaustur-Asía + Suður-Evrópa + Ástralía og Nýja-Sjáland + Melanesía + Míkrónesía + Pólýnesía + Syðri-Mið-Asía + Asía + Mið-Asía + vestur-Asía + Evrópa + Austur-Evrópa + Norður-Evrópa + vestur-Evrópa + Samveldi sjálfstæðra ríkja + Latín-Ameríka og Karíbahaf + Ermasundseyjar + Andorra + Sameinuðu arabísku furstadæmin + Afganistan + Antígva og Barbúda + Angvilla + Albanía + Armenía + Hollensku Antillur + Angóla + Suðurskautslandið + Argentína + Bandaríska Samóa + Austurríki + Ástralía + Arúba + Álandseyjar + Aserbaídsjan + Bosnía og Hersegóvína + Barbados + Bangladess + Belgía + Búrkína Fasó + Búlgaría + Barein + Búrúndí + Benín + Saint Barthélemy + Bermúdaeyjar + Brúnei + Bólivía + Brasilía + Bahamaeyjar + Bútan + Bouveteyja + Botsvana + Hvíta-Rússland + Belís + Kanada + Kókoseyjar + Austur-Kongó + Mið-Afríkulýðveldið + Vestur-Kongó + Sviss + Fílabeinsströndin + Cookseyjar + Chíle + Kamerún + Kína + Kólumbía + Kostaríka + Serbía og Svartfjallaland + Kúba + Grænhöfðaeyjar + Jólaey + Kýpur + Tékkland + Þýskaland + Djíbútí + Danmörk + Dóminíka + Dóminíska lýðveldið + Alsír + Ekvador + Eistland + Egyptaland + Vestur-Sahara + Erítrea + Spánn + Eþíópía + Finnland + Fídjieyjar + Falklandseyjar + Mikrónesía + Færeyjar + Frakkland + Gabon + Bretland + Grenada + Georgía + Franska Gvæjana + Guernsey + Gana + Gíbraltar + Grænland + Gambía + Gínea + Gvadelúpeyjar + Miðbaugs-Gínea + Grikkland + Suður-Georgía og Suður-Sandvíkureyjar + Gvatemala + Gvam + Gínea-Bissá + Gvæjana + Hong Kong + Heard og McDonaldseyjar + Hondúras + Króatía + Haítí + Ungverjaland + Indónesía + Írland + Ísrael + Mön + Indland + Bresku Indlandshafseyjar + Írak + Íran + Ísland + Ítalía + Jersey + Jamaíka + Jórdanía + Japan + Kenía + Kirgisistan + Kambódía + Kíribatí + Kómoreyjar + Sankti Kristófer og Nevis + Norður-Kórea + Suður-Kórea + Kúveit + Caymaneyjar + Kasakstan + Laos + Líbanon + Sankti Lúsía + Liechtenstein + Srí Lanka + Líbería + Lesótó + Litháen + Lúxemborg + Lettland + Líbía + Marokkó + Mónakó + Moldóva + Svartfjallaland + Saint Martin + Madagaskar + Marshalleyjar + Makedónía + Malí + Mjanmar + Mongólía + Makaó + Norður-Maríanaeyjar + Martiník + Máritanía + Montserrat + Malta + Máritíus + Maldíveyjar + Malaví + Mexíkó + Malasía + Mósambík + Namibía + Nýja-Kaledónía + Níger + Norfolkeyja + Nígería + Níkaragva + Niðurlönd + Noregur + Nepal + Nárú + Niue + Nýja-Sjáland + Óman + Panama + Perú + Franska Pólýnesía + Papúa Nýja-Gínea + Filippseyjar + Pakistan + Pólland + Sankti Pierre og Miquelon + Pitcairn + Púertó Ríkó + Palestína + Portúgal + Palá + Paragvæ + Katar + Ytri Eyjaálfa + Evrópusambandið + Réunion + Rúmenía + Serbía + Rússland + Rúanda + Sádi-Arabía + Salómonseyjar + Seychelleseyjar + Súdan + Svíþjóð + Singapúr + Sankti Helena + Slóvenía + Svalbarði og Jan Mayen + Slóvakía + Síerra Leóne + San Marínó + Senegal + Sómalía + Súrínam + Saó Tóme og Prinsípe + El Salvador + Sýrland + Svasíland + Turks- og Caicoseyjar + Tsjad + Frönsku suðlægu landsvæðin + Tógó + Taíland + Tadsjikistan + Tókelá + Austur-Tímor + Túrkmenistan + Túnis + Tonga + Tyrkland + Trínidad og Tóbagó + Túvalú + Taívan + Tansanía + Úkraína + Úganda + Smáeyjar Bandaríkjanna + Bandaríkin + Úrúgvæ + Úsbekistan + Páfagarður + Sankti Vinsent og Grenadíneyjar + Venesúela + Jómfrúaeyjar (bresku) + Jómfrúaeyjar (bandarísku) + Víetnam + Vanúatú + Wallis- og Fútúnaeyjar + Samóa + Jemen + Mayotte + Suður-Afríka + Sambía + Simbabve + Óþekkt eða ógilt svæði + + + Dagatal + Röðun + Gjaldmiðill + + + hefðbundin kínversk röðun - Big5 + Búddískt dagatal + Kínverskt dagatal + Bein röðun + einfölduð kínversk röðun - GB2312 + Gregorískt dagatal + Hebreskt dagatal + indverskt dagatal + Íslamskt dagatal + Íslamskt borgaradagatal + Japanskt dagatal + Símaskráarröðun + Pinyin-röðun + kínverskt dagatal + Strikaröðun + Hefðbundin + + + bandarískt + metrakerfi + + + tungumál: {0} + leturgerð: {0} + svæði: {0} + + + + lowercase-words + + + [a á b d ð e é f-i í j-o ó p r-u ú v y ý þ æ ö] + [c q w z] + [a-z] + + + „ + “ + ‚ + ‘ + + + {0}–{1} + + + + + + jan + feb + mar + apr + maí + jún + júl + ágú + sep + okt + nóv + des + + + janúar + febrúar + mars + apríl + maí + júní + júlí + ágúst + september + október + nóvember + desember + + + + + j + f + m + a + m + j + j + á + s + o + n + d + + + + + + + sun + mán + þri + mið + fim + fös + lau + + + sunnudagur + mánudagur + þriðjudagur + miðvikudagur + fimmtudagur + föstudagur + laugardagur + + + + + s + m + þ + m + f + f + l + + + + + + + F1 + F2 + F3 + F4 + + + 1st fjórðungur + 2nd fjórðungur + 3rd fjórðungur + 4th fjórðungur + + + + + 1F + 2F + 3F + 4F + + + 1 + 2 + 3 + 4 + + + 1. fjórðungur + 2. fjórðungur + 3. fjórðungur + 4. fjórðungur + + + + f.h. + e.h. + + + fyrir Krist + eftir Krist + + + f.k. + e.k. + + + + + + EEEE, d. MMMM y + + + + + d. MMMM y + + + + + d.M.yyyy + + + + + d.M.yyyy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + HH:mm:ss + H:mm + L. + E d.M. + LLL + E d. MMM + E d. MMMM + d. MMMM + d. MMM + d.M + d + mm:ss + y + M. yyyy + EEE d.M.yyyy + MMM y + EEE d. MMM y + MMMM y + Q. yyyy + QQQ y + Q yy + M.yyyy + MMMM y + + + {0} - {1} + + M-M + + + E, d.M - E, d.M + E, d.M - E, d.M + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. - E, d. MMM + + + d. MMM - d. MMM + d.-d. MMM + + + d.M - d.M + d.M - d.M + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + M.yyyy - M.yyyy + M.yyyy - M.yyyy + + + E, d.M.yyyy - E, d.M.yyyy + E, d.M.yyyy - E, d.M.yyyy + E, d.M.yyyy - E, d.M.yyyy + + + MMM-MMM y + MMM y - MMM y + + + E, d. MMM - E, d. MMM y + E, d. - E, d. MMM y + E, d. MMM y - E, d. MMM y + + + d. MMM - d. MMM y + d.-d. MMM y + d. MMM y - d. MMM y + + + d.M.yyyy - d.M.yyyy + d.M.yyyy - d.M.yyyy + d.M.yyyy - d.M.yyyy + + + + + + tímabil + + + ár + + + mánuður + + + vika + + + dagur + fyrir þremur dögum + fyrir tveimur dögum + í gær + í dag + á morgun + eftir tvo daga + eftir þrjá daga + + + vikudagur + + + f.h./e.h. + + + klukkustund + + + mínúta + + + sekúnda + + + svæði + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + {0} ({1}) + + óþekkt + + + Kabúl + + + Angúilla + + + Suðurpóllinn + + + Dumont D'Urville + + + Vínarborg + + + Arúba + + + Barbadoseyjar + + + Brussel + + + Sofía + + + Barein + + + Bermúdaeyjar + + + Brúnei + + + Rio Branco + + + Belís + + + Regína + + + Zürich + + + Páskaeyja + + + Kostaríka + + + Grænhöfðaeyjar + + + Berlín + + + Djíbútí + + + Kaupmannahöfn + + + Dóminíka + + + Alsír + + + Kaíró + + + Kanaríeyjar + + + Madríd + + + Fidjieyjar + + + Færeyjar + + + París + + + Gíbraltar + + + Nuuk + + + Gvadelúp + + + Aþena + + + Suður-Georgía + + + Gvatemala + + + Gúam + + + Bissá + + + Gvæjana + + + Búdapest + + + Djakarta + + + Bagdad + + + Teheran + + + Reykjavík + + + Róm + + + Jamaíka + + + Tókýó + + + St. Kitts + + + Pjongjang + + + Seúl + + + Kúveit + + + Beirút + + + St. Lucia + + + Monróvía + + + Vilníus + + + Lúxemborg + + + Mónakó + + + Úlan Bator + + + Makaó + + + Martínik + + + Máritíus + + + Maldíveyjar + + + Mexíkóborg + + + Kankún + + + Osló + + + Nárú + + + Níúe + + + Marquesas-eyjar + + + Varsjá + + + Púertó Ríkó + + + Azoreyjar + + + Lissabon + + + Palaú + + + Kvatar + + + Búkarest + + + Moskva + + + Stokkhólmur + + + Singapúr + + + St. Helena + + + Salvador + + + Damaskus + + + Túnis + + + Istanbúl + + + Honolulu + + + Anchorage + + + Denver + + + Indianapolis + + + St. Vincent + + + St. Thomas + + + Jóhannesarborg + + + + Mið-Evróputími + sumartími Mið-Evrópu + + + MET + STME + + + + + Austur-Evróputími + sumartími Austur-Evrópu + + + AET + STAE + + + + + + + , + . + ; + % + 0 + # + + + − + ×10^ + ‰ + ∞ + EiTa + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + Andorrskur peseti + + + Arabískt dírham + + + Lek + + + Dramm + + + Hollenskt Antillugyllini + + + Argentine Austral + + + Argentískur pesi (1983-1985) + + + Argentískur pesi + + + Austurrískur skildingur + + + Ástralskur dalur + + + Barbadoskur dalur + + + Belgískur franki + + + Lef + + + Lef, nýtt + + + Bermúdeyskur dalur + + + Brúneiskur dalur + + + bólivískt bólívíanó + + + Bólivískur pesi + + + Bolivian Mvdol + + + Brasilískt ríal + + + Bahameyskur dalur + + + Búrmverskt kjat + + + Belískur dalur + + + Kanadískur dalur + + + Svissneskur franki + + + Chilean Unidades de Fomento + + + Chileskur pesi + + + Júan + + + Kólumbískur pesi + + + Tékknesk króna, eldri + + + Kúbverskur pesi + + + Grænhöfðeyskur skúti + + + Kýpverskt pund + + + Tékknesk króna + + + Austurþýskt mark + + + Þýskt mark + + + Djibouti Franc + + + Dönsk króna + + + Dóminískur pesi + + + Ecuador Sucre + + + Eistnesk króna + + + Egypskt pund + + + Spænskur peseti + + + Euro + + + Finnskt mark + + + Fídjeyskur dalur + + + Falklenskt pund + + + Franskur franki + + + Sterlingspund + + + Gíbraltarspund + + + Gíneufranki + + + Drakma + + + Guatemala Quetzal + + + Portúgalskur, gíneskur skúti + + + Gvæjanskur dalur + + + Hong Kong-dalur + + + Hoduras Lempira + + + Kúna + + + Fórinta + + + Indónesísk rúpía + + + Írskt pund + + + Ísraelskt pund + + + Sikill + + + Indversk rúpía + + + Írakskur denari + + + Íranskt ríal + + + Íslensk króna + íslensk króna + íslensku krónur + kr + + + Ítölsk líra + + + Jamaískur dalur + + + Jen + + + kenískur skildingur + + + Kómoreyskur franki + + + Norðurkóreskt vonn + + + Suðurkóreskt vonn + + + Kúveiskur denari + + + Caymaneyskur dalur + + + Kazakhstan Tenge + + + Líbanskt pund + + + Srílönsk rúpía + + + Líberískur dalur + + + Lesotho Loti + + + Lít + + + Lithuanian Talonas + + + Lúxemborgarfranki + + + Lat + + + Lettnesk rúbla + + + Líbískur denari + + + Marokkóskt dírham + + + Marokkóskur franki + + + Madagascar Ariary + + + Madagaskur franki + + + Makedónskur denari + + + Malískur franki + + + Mjanmarskt kjat + + + Túríkur + + + Macao Pataca + + + Mauritania Ouguiya + + + Meltnesk líra + + + Maltneskt pund + + + Mexíkóskur pesi + + + Mexíkóskur silfurpesi (1861-1992) + + + Mexíkóskur pesi, UDI + + + Malaysian Ringgit + + + Mósambískur skúti + + + Namibískur dalur + + + Nigerian Naira + + + Hollenskt gyllini + + + Norsk króna + + + Nýsjálenskur dalur + + + Ómanskt ríal + + + Balbói + + + perúskar sol nuevo + + + filippeyskir pesóar + + + Pakistönsk rúpía + + + pólskt zlotý + + + Slot + + + Portúgalskur skúti + + + Rúmenskt lei + + + rúmensk leu + + + serbneskur dínar + + + rússnesk rúbla + + + Rússnesk rúbla (1991-1998) + + + Rwandan Franc + + + Sádiarabískt ríal + + + Salómonseyskur dalur + + + Seychelles rúpía + + + Súdanskur denari + + + Súdanskt pund + + + Sænsk króna + + + Singapúrskur dalur + + + Helenskt pund + + + Slóvenskur dalur + + + Slóvakísk króna + + + Suriname Guilder + + + Sao Tome and Principe Dobra + + + Soviet Rouble + + + El Salvador Colon + + + Sýrlenskt pund + + + Bat + + + Tadsjiksk rúbla + + + Tajikistan Somoni + + + Túrkmenskt manat + + + Tímorskur skúti + + + Tyrknesk líra + + + Ný tyrknesk líra + + + Trínidad og Tóbagó-dalur + + + Taívanskur dalur + + + Tanzanian Shilling + + + Hrinja + + + Ukrainian Karbovanetz + + + Bandaríkjadalur + + + Bandaríkjadalur (næsta dag) + + + Bandaríkjadalur (sama dag) + + + Venezuelan Bolivar + + + víetnamskt dong + + + Vanuatu Vatu + + + Miðafrískur franki, BEAC + + + unse silfur + + + unse gull + + + Austur-Karíbahafsdalur + + + Sérstök dráttarréttindi + + + Franskur gullfranki + + + Franskur franki, UIC + + + Miðafrískur franki, BCEAO + + + unse palladín + + + Pólinesískur franki + + + unse platína + + + Óþekktur eða ógildur gjaldeyrir + óþekktur eða ógildur gjaldeyrir + óþekktur eða ógildur gjaldeyrir + + + Jemenskur denari + + + Jemenskt ríal + + + Júgóslavneskur denari + + + Rand (viðskipta) + + + suðurafríkskt rand + + + Zambian Kwacha + + + Simbabveskur dalur + + + + + + {0} dagur + {0} dagar + + + {0} klukkustund + {0} klukkustundir + + + {0} mínúta + {0} mínútur + + + {0} mánuður + {0} mánuðir + + + {0} sekúnda + {0} sekúndur + + + {0} vika + {0} vikur + + + {0} ár + {0} ár + + + + + já:j + nei:n + + + + diff --git a/lib/zend/Zend/Locale/Data/is_IS.xml b/lib/zend/Zend/Locale/Data/is_IS.xml new file mode 100644 index 0000000000..914e16b3da --- /dev/null +++ b/lib/zend/Zend/Locale/Data/is_IS.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/it.xml b/lib/zend/Zend/Locale/Data/it.xml new file mode 100644 index 0000000000..a69734715d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/it.xml @@ -0,0 +1,3008 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abkhazian + accinese + acioli + adangme + adyghe + avestan + afrikaans + lingua afroasiatica + afrihili + ainu + akan + accado + aleuto + lingue algonchine + altai meridionale + amarico + aragonese + inglese antico + angika + lingue apache + arabo + aramaico + araucano + arapaho + lingua artificiale + aruaco + assamese + asturiano + lingue athabaska + lingue australiane + avaro + awadhi + aymara + azerbaigiano + baschiro + banda + lingue bamileke + beluci + balinese + basa + lingua baltica + bielorusso + begia + wemba + berbero + bulgaro + bihari + bhojpuri + bislama + bicol + bini + siksika + bambara + bengalese + bantu + tibetano + bretone + braj + bosniaco + batak + buriat + bugi + blin + catalano + caddo + lingua indiana dell'America Centrale + caribico + lingua caucasica + atsam + ceceno + cebuano + celtica altra lingua + chamorro + chibcha + ciagataico + chuukese + mari + gergo chinook + choctaw + chipewyan + cherokee + cheyenne + lingue chamic + corso + copto + creolo o pidgin basati sull'inglese + creolo o pidgin basati sul francese + creolo o pidgin basati sul portoghese + cree + turco crimeo + creolo o pidgin + ceco + kashubian + slavo della Chiesa + lingua cuscitica + chuvash + gallese + danese + dakota + dargwa + dayak + tedesco + tedesco austriaco + alto tedesco svizzero + delaware + slave + dogrib + dinca + dogri + lingua dravidica + basso sorabo + duala + olandese medio + divehi + diula + dzongkha + ewe + efik + egiziano antico + ekajuka + greco + elamitico + inglese + inglese australiano + inglese canadese + inglese britannico + inglese americano + inglese medio + esperanto + spagnolo + spagnolo latinoamericano + spagnolo della Spagna + estone + basco + ewondo + persiano + fang + fanti + fulah + finlandese + filippino + lingua ungrofinnica + figiano + faroese + francese + francese canadese + francese svizzero + francese medio + francese antico + frisone settentrionale + friulano + frisone + irlandese + ga + gayo + gbaya + gaelico scozzese + lingua germanica + geez + gilbertese + galiziano + tedesco medio alto + guarana + tedesco antico alto + gondi + gorontalo + gotico + gerbo + greco antico + tedesco svizzero + gujarati + manx + gwichʼin + haussa + haida + hawaiano + ebraico + hindi + hiligayna + himachali + hittite + hmong + hiri motu + croato + alto sorabo + haitiano + ungherese + hupa + armeno + herero + interlingua + iban + indonesiano + interlingue + igbo + sichuan yi + inupiak + ilocano + lingua indiana + lingua indoeuropea + ingush + ido + iraniana + lingue irochesi + islandese + italiano + inuktitut + giapponese + lojban + giudeo persiano + giudeo arabo + giavanese + georgiano + kara-kalpak + kabyle + kachin + kai + kamba + karen + kawi + kabardia + tyap + kfo + kongo + khasi + lingua khoisan + khotanese + kikuyu + kuanyama + kazako + kalaallisut + khmer + kimbundu + kannada + coreano + konkani + kosraean + kpelle + kanuri + karachay-Balkar + careliano + kru + kurukh + kashmiri + curdo + kumyk + kutenai + komi + cornico + kirghiso + latino + ladino + lahnda + lamba + lussemburghese + lezghian + ganda + limburgese + lingala + lao + lolo bantu + lozi + lituano + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + lettone + madurese + magahi + maithili + makasar + mandingo + austronesiano + masai + moksha + mandar + mende + malgascio + irlandese medio + marshallese + maori + micmac + menangkabau + lingue diverse + macedone + lingua mon-khmer + malayalam + mongolo + manchu + manipuri + manobo + moldavo + mohawk + mossi + marathi + malese + maltese + multilingua + lingua munda + creek + mirandese + marwari + birmano + lingue maya + erzya + nauru + nahuatl + lingua indiana del Nord America + napoletano + norvegese bokmal + ndebele del nord + basso tedesco + nepalese + newari + ndonga + nias + lingua niger-cordofan + niue + olandese + fiammingo belga + norvegese nynorsk + norvegese + nogai + norse antico + n'ko + ndebele del sud + sotho del nord + nubiano + navajo + newari classico + nyanja + nyamwezi + nyankole + nyoro + nzima + occitano + ojibwa + oromo + oriya + ossetico + osage + turco ottomano + lingue otomi + punjabi + lingua papuana + pangasinan + pahlavi + pampanga + papiamento + palau + persiano antico + lingua filippina + fenicio + pali + polacco + ponape + pracrito + provenzale antico + pashto + portoghese + portoghese brasiliano + portoghese del Portogallo + quechua + rajasthani + rapanui + rarotonga + lingua rhaeto-romance + rundi + rumeno + lingua romanza + romani + root + russo + arumeno + kinyarwanda + sanscrito + sandawe + yakut + lingua indiana del Sud America + lingue salish + aramaico samaritano + sasak + santali + sardo + siciliano + scozzese + sindhi + sami del nord + selkup + lingua semitica + sango + irlandese antico + lingue sign + serbo-croato + shan + singalese + sidamo + lingue sioux + lingua sino-tibetana + slovacco + sloveno + lingua slava + samoano + sami del sud + lingua sami + sami lule + sami inari + sami skolt + shona + soninke + somalo + sogdiano + songhai + albanese + serbo + sranan tongo + serer + swati + lingua nilo-sahariana + sotho del sud + sundanese + sukuma + susu + sumero + svedese + swahili + siriaco + tamil + lingua tailandese + telugu + temne + tereno + tetum + tagicco + thai + tigrinya + tigre + tiv + turcomanno + tokelau + tagalog + klingon + tlingit + tamashek + tswana + tonga + nyasa del Tonga + tok pisin + turco + tsonga + tsimshian + tatarico + tumbuka + lingue tupi + lingua altaica + tuvalu + ci + taitiano + tuvinian + udmurt + uigurico + ugaritico + ucraino + mbundu + lingua imprecisata + urdu + usbeco + vai + venda + vietnamita + volapük + voto + vallone + lingue wakash + walamo + waray + washo + sorabo + volof + kalmyk + xosa + yao (bantu) + yapese + yiddish + yoruba + lingue yupik + zhuang + zapotec + zenaga + cinese + cinese semplificato + cinese tradizionale + zande + zulu + zuni + Nessun contenuto linguistico + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mondo + Africa + Nord America + America del Sud + Oceania + Africa occidentale + America centrale + Africa orientale + Africa del Nord + Africa centrale + Africa del Sud + Americhe + America del Nord + Caraibi + Asia orientale + Asia del Sud + Asia sudorientale + Europa del Sud + Australia e Nuova Zelanda + Melanesia + Regione Micronesiana + Polinesia + Asia centro-meridionale + Asia + Asia centrale + Asia occidentale + Europa + Europa orientale + Europa del Nord + Europa occidentale + Comunità di Stati Indipendenti + America Latina e Caraibi + Andorra + Emirati Arabi Uniti + Afghanistan + Antigua e Barbuda + Anguilla + Albania + Armenia + Antille Olandesi + Angola + Antartide + Argentina + Samoa Americane + Austria + Australia + Aruba + Isole Aland + Azerbaigian + Bosnia Erzegovina + Barbados + Bangladesh + Belgio + Burkina Faso + Bulgaria + Bahrein + Burundi + Benin + San Bartolomeo + Bermuda + Brunei + Bolivia + Brasile + Bahamas + Bhutan + Isola Bouvet + Botswana + Bielorussia + Belize + Canada + Isole Cocos + Repubblica Democratica del Congo + Repubblica Centrafricana + Congo + Svizzera + Costa d’Avorio + Isole Cook + Cile + Camerun + Cina + Colombia + Costa Rica + Serbia e Montenegro + Cuba + Capo Verde + Isola di Christmas + Cipro + Repubblica Ceca + Germania + Gibuti + Danimarca + Dominica + Repubblica Dominicana + Algeria + Ecuador + Estonia + Egitto + Sahara Occidentale + Eritrea + Spagna + Etiopia + Finlandia + Figi + Isole Falkland + Micronesia + Isole Faroe + Francia + Gabon + Regno Unito + Grenada + Georgia + Guiana Francese + Guernsey + Ghana + Gibilterra + Groenlandia + Gambia + Guinea + Guadalupa + Guinea Equatoriale + Grecia + Georgia del Sud e Isole Sandwich del Sud + Guatemala + Guam + Guinea-Bissau + Guyana + Regione Amministrativa Speciale di Hong Kong della Repubblica Popolare Cinese + Isole Heard ed Isole McDonald + Honduras + Croazia + Haiti + Ungheria + Indonesia + Irlanda + Israele + Isola di Man + India + Territorio Britannico dell’Oceano Indiano + Iraq + Iran + Islanda + Italia + Jersey + Giamaica + Giordania + Giappone + Kenya + Kirghizistan + Cambogia + Kiribati + Comore + Saint Kitts e Nevis + Corea del Nord + Corea del Sud + Kuwait + Isole Cayman + Kazakistan + Laos + Libano + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Lussemburgo + Lettonia + Libia + Marocco + Monaco + Moldavia + Montenegro + Madagascar + Isole Marshall + Repubblica di Macedonia + Mali + Myanmar + Mongolia + Regione Amministrativa Speciale di Macao della Repubblica Popolare Cinese + Isole Marianne Settentrionali + Martinica + Mauritania + Montserrat + Malta + Mauritius + Maldive + Malawi + Messico + Malesia + Mozambico + Namibia + Nuova Caledonia + Niger + Isola Norfolk + Nigeria + Nicaragua + Paesi Bassi + Norvegia + Nepal + Nauru + Niue + Nuova Zelanda + Oman + Panama + Perù + Polinesia Francese + Papua Nuova Guinea + Filippine + Pakistan + Polonia + Saint Pierre e Miquelon + Pitcairn + Portorico + Palestina + Portogallo + Palau + Paraguay + Qatar + Oceania lontana + Unione Europea + Réunion + Romania + Serbia + Federazione Russa + Ruanda + Arabia Saudita + Isole Solomon + Seychelles + Sudan + Svezia + Singapore + Sant’Elena + Slovenia + Svalbard e Jan Mayen + Slovacchia + Sierra Leone + San Marino + Senegal + Somalia + Suriname + Sao Tomé e Príncipe + El Salvador + Siria + Swaziland + Isole Turks e Caicos + Ciad + Territori australi francesi + Togo + Tailandia + Tagikistan + Tokelau + Timor Est + Turkmenistan + Tunisia + Tonga + Turchia + Trinidad e Tobago + Tuvalu + Taiwan + Tanzania + Ucraina + Uganda + Isole Minori lontane dagli Stati Uniti + Stati Uniti + Uruguay + Uzbekistan + Vaticano + Saint Vincent e Grenadines + Venezuela + Isole Vergini Britanniche + Isole Vergini Americane + Vietnam + Vanuatu + Wallis e Futuna + Samoa + Yemen + Mayotte + Sudafrica + Zambia + Zimbabwe + regione non valida o sconosciuta + + + ortografia tradizionale tedesca + ortografia tedesca del 1996 + armeno orientale + armeno occidentale + boontling + alfabeto fonetico internazionale IPA + alfabeto fonetico uralico UPA + monotonico + dialetto del Natisone + politonico + computer + ortografia revisionata + resiano + saho + + + calendario + collazione + valuta + + + cinese tradizionale + calendario buddista + calendario cinese + ordine diretto + cinese semplificato + calendario gregoriano + calendario ebraico + calendario nazionale indiano + calendario islamico + calendario civile islamico + calendario giapponese + ordine elenco telefonico + ordine pinyin + ordine segni + ordine tradizionale + + + USA + metrico + + + + lowercase-words + lowercase-words + lowercase-words + + + [a à b-e é è f-i ì j-o ó ò p-u ù v-z] + [í ï ú] + [a-z] + + + ‘ + ’ + “ + ” + + + + + + + + gen + feb + mar + apr + mag + giu + lug + ago + set + ott + nov + dic + + + gennaio + febbraio + marzo + aprile + maggio + giugno + Luglio + agosto + settembre + ottobre + novembre + dicembre + + + + + G + F + M + A + M + G + L + A + S + O + N + D + + + Gennaio + Febbraio + Marzo + Aprile + Maggio + Giugno + Luglio + + + + + + + dom + lun + mar + mer + gio + ven + sab + + + domenica + lunedì + martedì + mercoledì + giovedì + venerdì + sabato + + + + + D + L + M + M + G + V + S + + + Domenica + Lunedì + Martedì + Mercoledì + Giovedì + Venerdì + Sabato + + + + + + + T1 + T2 + T3 + T4 + + + 1o trimestre + 2o trimestre + 3o trimestre + 4o trimestre + + + + + 1 + 2 + 3 + 4 + + + + m. + p. + + + a.C. + d.C + + + aC + dC + + + + + + EEEE d MMMM y + + + + + dd MMMM y + + + + + dd/MMM/y + + + + + dd/MM/yy + + + + + + + HH.mm.ss zzzz + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + HH.mm + HH.mm.ss + HH:mm + L + EEE d/M + LLL + EEE d MMM + EEE d MMMM + d MMMM + dd MMMM + d MMM + dd/MM + d/M + d + hh.mm a + hh.mm.ss a + mm:ss + y + M/yyyy + EEE, d-M-yyyy + MMM y + EEE d MMM y + MMMM y + Q-yyyy + QQQ y + MM/yy + Q yy + QQQQ yy + MMMM y + + + {0} - {1} + + M-M + + + E dd/MM - E dd/MM + E dd/MM - E dd/MM + + + MMM-MMM + + + E dd MMM - E dd MMM + E dd - E dd MMM + + + LLLL-LLLL + + + dd MMM - dd MMM + dd-dd MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + E dd/MM/yy - E dd/MM/yy + + + MMM-MMM y + MMM y - MMM y + + + E d MMM - E d MMM y + E d - E d MMM y + E d MMM y - E d MMM y + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + dd MMM - dd MMM y + dd-dd MMM y + dd MMM y - dd MMM y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + era + + + anno + + + mese + + + settimana + + + giorno + tre giorni fa + l'altro ieri + ieri + oggi + domani + dopodomani + tra tre giorni + + + giorno della settimana + + + periodo del giorno + + + ora + + + minuto + + + secondo + + + zona + + + + + + +HH.mm;-HH.mm + GMT{0} + {0} + + Sconosciuto + + + Tirana + + + Polo Sud + + + Dumont D'Urville + + + Cordova + + + Bruxelles + + + Bahrein + + + San Paolo + + + St. Johns + + + Zurigo + + + Pasqua + + + Capo Verde + + + Natale + + + Berlino + + + Gibuti + + + Copenaghen + + + Algeri + + + Canarie + + + Addis Abeba + + + Figi + + + Isole Faeroe + + + Parigi + + + Londra + + + Gibilterra + + + Guadalupa + + + Atene + + + Georgia meridionale + + + Guiana + + + Giacarta + + + Dublino + + + Gerusalemme + + + Teheran + + + Roma + + + Giamaica + + + Comore + + + St. Kitts + + + Seul + + + Santa Lucia + + + Lussemburgo + + + Macao + + + Martinica + + + Maldive + + + Città del Messico + + + Varsavia + + + Pitcairn, isole + + + Portorico + + + Azzorre + + + Lisbona + + + Riunione, isola di + + + Bucarest + + + Mosca + + + Stoccolma + + + Sant'Elena + + + Mogadiscio + + + Sao Tomè + + + Salvador + + + Damasco + + + Tunisi + + + Fuso orario Alaska + + + Center, Dakota del nord + + + Samarcanda + + + St. Vincent + + + St. Thomas + + + + Acre Time + Acre Summer Time + + + + + Central Africa Time + + + + + East Africa Time + + + + + South Africa Standard Time + + + + + West Africa Time + West Africa Summer Time + + + + + Aktyubinsk Time + Aktyubinsk Summer Time + + + + + Alaska Time + Ora Standard Alaska + Ora Legale Alaska + + + + + Alaska-Hawaii Standard Time + Alaska-Hawaii Daylight Time + + + + + Amazon Time + Amazon Summer Time + + + + + Central Time + Central Standard Time + Central Daylight Time + + + + + Eastern Time + Eastern Standard Time + Eastern Daylight Time + + + + + Mountain Time + Mountain Standard Time + Mountain Daylight Time + + + + + Pacific Time + Pacific Standard Time + Pacific Daylight Time + + + + + Aqtau Time + Aqtau Summer Time + + + + + Aqtobe Time + Aqtobe Summer Time + + + + + Arabian Time + Arabian Standard Time + Arabian Daylight Time + + + ST arabo + ADT arabo + + + + + Argentina Time + Argentina Summer Time + + + + + Western Argentina Time + + + + + Armenia Time + Armenia Summer Time + + + AMT Armenia + AMST Armenia + + + + + Ashkhabad Time + Ashkhabad Summer Time + + + + + Atlantic Time + Atlantic Standard Time + Atlantic Daylight Time + + + + + Central Australia Time + Australian Central Standard Time + Australian Central Daylight Time + + + + + Eastern Australia Time + Australian Eastern Standard Time + Australian Eastern Daylight Tim + + + + + Western Australia Time + Australian Western Standard Time + Australian Western Daylight Time + + + + + Azores Time + Azores Summer Time + + + + + Baku Time + Baku Summer Time + + + + + Bangladesh Time + + + + + Bering Time + Bering Standard Time + Bering Daylight Time + + + BST Bering + BDT Bering + + + + + Bhutan Time + + + + + Borneo Time + Borneo Summer Time + + + + + Brasilia Time + Brasilia Summer Time + + + + + Chamorro Standard Time + + + + + Changbai Time + + + + + Chile Time + Chile Summer Time + + + + + Ora Standard Cina + Ora Legale Cina + + + CST (Cina) + CDT (Cina) + + + + + Choibalsan Time + Choibalsan Summer Time + + + + + Dacca Time + + + + + Dushanbe Time + Dushanbe Summer Time + + + + + Dutch Guiana Time + + + + + East Timor Time + + + + + Ecuador Time + + + + + Ora Standard Europa Centrale + Ora Legale Europa Centrale + + + + + Ora Standard Europa Orientale + Ora Legale Europa Orientale + + + + + Western European Time + Western European Summer Time + + + + + Frunze Time + Frunze Summer Time + + + + + Greenwich Mean Time + + true + + + + Galapagos Time + + + + + Georgia Time + Georgia Summer Time + + + + + Central Greenland Time + Central Greenland Summer Time + + + + + East Greenland Time + East Greenland Summer Time + + + + + West Greenland Time + West Greenland Summer Time + + + + + Guam Standard Time + + + GST Guam + + + + + Gulf Standard Time + + + + + Hawaii Time + Ora Standard Hawaii + Ora Legale Hawaii + + + + + Hawaii-Aleutian Time + Hawaii-Aleutian Standard Time + Hawaii-Aleutian Daylight Time + + + + + India Standard Time + + + + + Central Indonesia Time + + + + + Eastern Indonesia Time + + + + + Western Indonesia Time + + + + + Ora Standard Israele + Ora Legale Israele + + + + + Ora Standard Giappone + Ora Legale Giappone + + + + + Karachi Time + + + + + Kashgar Time + + + + + East Kazakhstan Standard Time + + + + + West Kazakhstan Standard Time + + + + + Kizilorda Time + Kizilorda Summer Time + + + + + Korean Time + Korean Standard Time + Korean Daylight Time + + + + + Kuybyshev Time + Kuybyshev Summer Time + + + + + Kwajalein Time + + + + + Kyrgystan Time + + + + + Lanka Time + + + + + Long-Shu Time + + + + + Lord Howe Time + Lord Howe Standard Time + Lord Howe Daylight Time + + + + + Macau Time + Macau Summer Time + + + + + Malaya Time + + + + + Malaysia Time + + + + + Marshall Islands Time + + + + + Ulan Bator Time + Ulan Bator Summer Time + + + + + New Zealand Time + New Zealand Standard Time + New Zealand Daylight Time + + + + + Newfoundland Time + Newfoundland Standard Time + Newfoundland Daylight Time + + + + + North Mariana Islands Time + + + + + Pakistan Time + Pakistan Summer Time + + + + + Pierre and Miquelon Time + Pierre and Miquelon Standard Time + Pierre and Miquelon Daylight Time + + + + + Qyzylorda Time + Qyzylorda Summer Time + + + + + Samara Time + Samara Summer Time + + + + + Samarkand Time + Samarkand Summer Time + + + SAMT Samarkand + SAMST Samarkand + + + + + Samoa Standard Time + + + + + Shevchenko Time + Shevchenko Summer Time + + + + + Suriname Time + + + + + Sverdlovsk Time + Sverdlovsk Summer Time + + + + + Tajikistan Time + + + + + Tashkent Time + Tashkent Summer Time + + + + + Tbilisi Time + Tbilisi Summer Time + + + + + Turkey Time + Turkey Summer Time + + + + + Turkmenistan Time + Turkmenistan Summer Time + + + + + Ural'sk Time + Ural'sk Summer Time + + + + + Urumqi Time + + + + + Uzbekistan Time + Uzbekistan Summer Time + + + + + Yekaterinburg Time + Yekaterinburg Summer Time + + + + + Yerevan Time + Yerevan Summer Time + + + + + Yukon Time + Yukon Standard Time + Yukon Daylight Time + + + + + + + , + . + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + + + + Peseta Andorrana + + + Dirham degli Emirati Arabi Uniti + + + Afgani (1927-2002) + + + Afgani + + + Lek Albanese + + + Dram Armeno + + + Fiorino delle Antille Olandesi + + + Kwanza Angolano + + + Kwanza Angolano (1977-1990) + + + Nuovo Kwanza Angolano (1990-2000) + + + Kwanza Reajustado Angolano (1995-1999) + + + Austral Argentino + + + Peso Argentino (vecchio Cod.) + + + Peso Argentino + + + Scellino Austriaco + + + Dollaro Australiano + + + Fiorino di Aruba + + + Manat Azero + + + manat azero + + + Dinar Bosnia-Herzegovina + + + Marco Conv. Bosnia-Erzegovina + + + Dollaro di Barbados + + + Taka Bangladese + + + Franco Belga (convertibile) + + + Franco Belga + + + Franco Belga (finanziario) + + + Lev Bulgaro + + + Nuovo Lev Bulgaro + + + Dinaro del Bahraini + + + Franco del Burundi + + + Dollaro delle Bermuda + + + Dollaro del Brunei + + + Boliviano + + + Peso Boliviano + + + Mvdol Boliviano + + + Cruzeiro Novo Brasiliano (1967-1986) + + + Cruzado Brasiliano + + + Cruzeiro Brasiliano (1990-1993) + + + Real Brasiliano + + + Cruzado Novo Brasiliano + + + Cruzeiro Brasiliano + + + Dollaro delle Bahamas + + + Ngultrum Butanese + + + Kyat Birmano + + + Pula del Botswana + + + Nuovo Rublo Bielorussia (1994-1999) + + + Rublo Bielorussia + + + Dollaro Belize + + + Dollaro Canadese + + + Franco Congolese + + + Franco Svizzero + + + Unidades de Fomento Chilene + + + Peso Cileno + + + Renmimbi Cinese + + + Peso Colombiano + + + Colón Costaricano + + + antico dinaro serbo + + + Corona forte cecoslovacca + + + Peso Cubano + + + Escudo del Capo Verde + + + Sterlina Cipriota + + + Corona Ceca + + + Ostmark della Germania Orientale + + + Marco Tedesco + + + Franco Gibutiano + + + Corona Danese + + + Peso Dominicano + + + Dinaro Algerino + + + Sucre dell’Ecuador + + + Unidad de Valor Constante (UVC) dell’Ecuador + + + Corona dell’Estonia + + + Sterlina Egiziana + + + Nakfa Eritreo + + + peseta spagnola account + + + peseta spagnola account convertibile + + + Peseta Spagnola + + + Birr Etiopico + + + Euro + + + Markka Finlandese + + + Dollaro delle Figi + + + Sterlina delle Falkland + + + Franco Francese + + + Sterlina Inglese + + + Kupon Larit Georgiano + + + Lari Georgiano + + + Cedi del Ghana + + + Cedi ghanese + + + Sterlina di Gibilterra + + + Dalasi del Gambia + + + Franco della Guinea + + + Syli della Guinea + + + Ekwele della Guinea Equatoriale + + + Dracma Greca + + + Quetzal Guatemalteco + + + Escudo della Guinea portoghese + + + Peso della Guinea-Bissau + + + Dollaro della Guyana + + + Dollaro di Hong Kong + + + Lempira Hoduregno + + + Dinaro Croato + + + Kuna Croata + + + Gourde Haitiano + + + Fiorino Ungherese + + + Rupia Indonesiana + + + Sterlina irlandese + + + Sterlina Israeliana + + + Nuovo sheqel israeliano + + + Rupia Indiana + + + Dinaro Iracheno + + + Rial Iraniano + + + Corona Islandese + + + ¤ #,##0;-¤ #,##0 + Lira Italiana + ₤ + , + . + + + Dollaro Giamaicano + + + Dinaro Giordano + + + Yen Giapponese + + + Scellino Keniota + + + Som Kirghiso + + + Riel Cambogiano + + + Franco Comoriano + + + Won Nordcoreano + + + Won Sudcoreano + + + Dinaro Kuwaitiano + + + Dollaro delle Isole Cayman + + + Tenge Kazaco + + + Kip Laotiano + + + Sterlina Libanese + + + Rupia di Sri Lanka + + + Dollaro Liberiano + + + Loti del Lesotho + + + Lita Lituana + + + Talonas Lituani + + + franco convertibile del Lussemburgo + + + Franco del Lussemburgo + + + franco finanziario del Lussemburgo + + + Lat Lettone + + + Rublo Lettone + + + Dinaro Libico + + + Dirham Marocchino + + + Franco Marocchino + + + Leu Moldavo + + + Ariary Malgascio + + + Franco Malgascio + + + Dinaro Macedone + + + Franco di Mali + + + Kyat di Myanmar + + + Tugrik Mongolo + + + Pataca di Macao + + + Ouguiya della Mauritania + + + Lira Maltese + + + Sterlina Maltese + + + Rupia Mauriziana + + + Rufiyaa delle Maldive + + + Kwacha Malawiano + + + Peso Messicano + + + Peso messicano d’argento (1861-1992) + + + Unidad de Inversion (UDI) Messicana + + + Ringgit della Malesia + + + Escudo del Mozambico + + + Metical del Mozambico + + + metical del Mozambico + + + Dollaro Namibiano + + + Naira Nigeriana + + + Cordoba Nicaraguense + + + Córdoba oro nicaraguense + + + Fiorino Olandese + + + Corona Norvegese + + + Rupia Nepalese + + + Dollaro Neozelandese + + + Rial Omanita + + + Balboa di Panama + + + Inti Peruviano + + + Sol Nuevo Peruviano + + + Sol Peruviano + + + Kina della Papua Nuova Guinea + + + Peso delle Filippine + + + Rupia del Pakistan + + + Zloty Polacco + + + Zloty Polacco (1950-1995) + + + Escudo Portoghese + + + Guarani del Paraguay + + + Rial del Qatar + + + dollaro della Rhodesia + + + Leu della Romania + + + leu rumeno + + + Dinaro serbo + + + Rublo Russo + + + Rublo della CSI + + + Franco Ruandese + + + Ryal Saudita + + + Dollaro delle Isole Solomon + + + Rupia delle Seychelles + + + Dinaro Sudanese + + + Sterlina sudanese + + + Sterlina Sudanese + + + Corona Svedese + + + Dollaro di Singapore + + + Sterlina di Sant’Elena + + + Tallero Sloveno + + + Corona Slovacca + + + Leone della Sierra Leone + + + Scellino Somalo + + + Dollaro surinamese + + + Fiorino del Suriname + + + Dobra di Sao Tomé e Principe + + + Rublo Sovietico + + + Colón Salvadoregno + + + Sterlina Siriana + + + Lilangeni dello Swaziland + + + Baht Tailandese + + + Rublo del Tajikistan + + + Somoni del Tajikistan + + + Manat Turkmeno + + + Dinaro Tunisino + + + Paʻanga di Tonga + + + Escudo di Timor + + + Lira Turca + lira turca + lire turche + + + nuova Lira turca + nuova Lira turca + nuove Lire turche + + + Dollaro di Trinidad e Tobago + + + Nuovo dollaro taiwanese + + + Scellino della Tanzania + + + Hrivna Ucraina + + + Karbovanetz Ucraino + + + Scellino Ugandese (1966-1987) + + + Scellino Ugandese + + + Dollaro Statunitense + + + Dollaro Statunitense (Next day) + + + Dollaro Statunitense (Same day) + + + Peso uruguaiano in unità indicizzate + + + Peso Uruguaiano (1975-1993) + + + Peso Uruguayo uruguaiano + + + Sum dell’Uzbekistan + + + Bolivar Venezuelano + + + Bolívar venezuelano forte + + + Dong Vietnamita + + + Vatu di Vanuatu + + + Tala della Samoa Occidentale + + + Franco CFA BEAC + + + Argento + + + Oro + + + Unità composita europea + + + Unità monetaria europea + + + Unità di acconto europea (XBC) + + + Unità di acconto europea (XBD) + + + Dollaro dei Caraibi Orientali + + + Diritti Speciali di Incasso + + + Unità Monetaria Europea + + + Franco Oro Francese + + + Franco UIC Francese + + + Franco CFA BCEAO + + + Palladio + + + Franco CFP + + + platino + + + fondi RINET + + + codice di verifica della valuta + + + Nessuna valuta + valuta sconosciuta/non valida + + + Dinaro dello Yemen + + + Rial dello Yemen + + + Dinaro Forte Yugoslavo + + + Dinaro Noviy Yugoslavo + + + Dinaro Convertibile Yugoslavo + + + Rand Sudafricano (finanziario) + + + Rand Sudafricano + + + Kwacha dello Zambia + + + Nuovo Zaire dello Zaire + + + Zaire dello Zaire + + + Dollaro dello Zimbabwe + + + + + + {0} giorno + {0} giorni + + + {0} ora + {0} ore + + + {0} minuto + {0} minuti + + + {0} mese + {0} mesi + + + {0} secondo + {0} secondi + + + {0} settimana + {0} settimane + + + {0} anno + {0} anni + + + + + sì:si:s + no:n + + + + diff --git a/lib/zend/Zend/Locale/Data/it_CH.xml b/lib/zend/Zend/Locale/Data/it_CH.xml new file mode 100644 index 0000000000..33cf6f2ba4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/it_CH.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + « + » + ‹ + › + + + + + + + + EEEE, d MMMM y + + + + + d MMMM y + + + + + d-MMM-y + + + + + dd.MM.yy + + + + + + + HH.mm:ss 'h' zzzz + + + + + + HH:mm + HH:mm:ss + dd.MM + hh:mm a + hh:mm:ss a + MM.yy + + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + E, d MMM - E, d MMM y + E, d - E, d MMM y + E, d MMM y - E, d MMM y + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + + + + . + ' + + + + + ¤ #,##0.00;¤-#,##0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/it_IT.xml b/lib/zend/Zend/Locale/Data/it_IT.xml new file mode 100644 index 0000000000..1c7b36c763 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/it_IT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/iu.xml b/lib/zend/Zend/Locale/Data/iu.xml new file mode 100644 index 0000000000..2f24ac1f7d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/iu.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + ᐃᓄᒃᑎᑐᑦ ᑎᑎᕋᐅᓯᖅ + + + + [ᐃ-ᐆ ᐊ ᐋ ᐱ-ᐴ ᐸ ᐹ ᑉ ᑎ-ᑑ ᑕ ᑖ ᑦ ᑭ-ᑰ ᑲ ᑳ ᒃ ᒋ-ᒎ ᒐ ᒑ ᒡ ᒥ-ᒨ ᒪ ᒫ ᒻ ᓂ-ᓅ ᓇ ᓈ ᓐ ᓕ-ᓘ ᓚ ᓛ ᓪ ᓯ-ᓲ ᓴ ᓵ ᔅ ᔨ-ᔫ ᔭ ᔮ ᔾ ᕆ-ᕉ ᕋ ᕌ ᕐ ᕕ-ᕚ ᕝ ᕿ-ᖃ ᖅ ᖏ ᖑ-ᖕ ᙱ-ᙶ ᖖ ᖠ-ᖦ] + + + + + + + + ᔭᓐᓄᐊᓕ + ᕕᕝᕗᐊᓕ + ᒫᑦᓯ + ᐊᐃᑉᐳᓗ + ᒪᐃ + ᔫᓂ + ᔪᓚᐃ + ᐊᐅᒡᒍᓯ + ᓰᑦᑏᕝᕙ + ᐆᑦᑑᕝᕙ + ᓅᕙᐃᕝᕙ + ᑏᓰᕝᕙ + + + ᔭᓐᓄᐊᓕ + ᕕᕝᕗᐊᓕ + ᒫᑦᓯ + ᐊᐃᑉᐳᓗ + ᒪᐃ + ᔫᓂ + ᔪᓚᐃ + ᐊᐅᒡᒍᓯ + ᓰᑦᑏᕝᕙ + ᐆᑦᑑᕝᕙ + ᓅᕙᐃᕝᕙ + ᑏᓰᕝᕙ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ᓈᑦᓰᖑᔭ + ᓇᒡᒐᔾᔭᐅ + ᓇᒡᒐᔾᔭᐅᓕᖅᑭ + ᐱᖓᑦᓯᖅ + ᓯᑕᒻᒥᖅ + ᑕᓪᓕᕐᒥᖅ + ᓈᑦᓰᖑᔭᓕᖅᕿ + + + ᓈᑦᓰᖑᔭ + ᓇᒡᒐᔾᔭᐅ + ᓇᒡᒐᔾᔭᐅᓕᖅᑭ + ᐱᖓᑦᓯᖅ + ᓯᑕᒻᒥᖅ + ᑕᓪᓕᕐᒥᖅ + ᓈᑦᓰᖑᔭᓕᖅᕿ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + diff --git a/lib/zend/Zend/Locale/Data/iw.xml b/lib/zend/Zend/Locale/Data/iw.xml new file mode 100644 index 0000000000..5986ecb357 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/iw.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ja.xml b/lib/zend/Zend/Locale/Data/ja.xml new file mode 100644 index 0000000000..9abd4b94af --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ja.xml @@ -0,0 +1,3799 @@ + + + + + + + + + + + {0}({1}) + , + + + アファル語 + アブハズ語 + アチェー語 + アチョリ語 + アダングメ語 + アディゲ語 + アヴェスタ語 + アフリカーンス語 + セム・ハム諸語 + アフリヒリ語 + アイヌ語 + アカン語 + アッカド語 + アレウト語 + アルゴンキアン語族 + 南アルタイ語 + アムハラ語 + アラゴン語 + 古代英語 + アンギカ語 + アパッチ語族 + アラビア語 + アラム語 + アラウカン語 + アラパホー語 + 人工諸語 + アラワク語 + アッサム語 + アストゥリアス語 + アサパスカン語族 + オーストラリア語族 + アヴァル語 + アワディー語 + アイマラ語 + アゼルバイジャン語 + バシキール語 + バンダ語 + バミレケ語族 + バルーチー語 + バリ語 + バサ語 + バルト諸語 + ベラルーシ語 + ベジャ語 + ベンバ語 + ベルベル諸語 + ブルガリア語 + ビハール語 + ボージプリー語 + ビスラマ語 + ビコル語 + ビニ語 + シクシカ語 + バンバラ語 + ベンガル語 + バントゥ諸語 + チベット語 + ブルトン語 + ブラジ語 + ボスニア語 + バタク語 + ブリヤート語 + ブギ語 + ビリン語 + カタロニア語 + カドー語 + 中米インディアン諸語 + カリブ語 + コーカサス諸語 + チャワイ語 + チェチェン語 + セブアノ語 + ケルト諸語 + チャモロ語 + チブチャ語 + チャガタイ語 + チューク語 + マリ語 + ビーチ・ラ・マー 等 + チョクトー語 + チペワイアン語 + チェロキー語 + シャイアン語 + チャム語族 + コルシカ語 + コプト語 + 英語が基盤の混成語・混合語 + フランス語が基盤の混成語・混合語 + ポルトガル語が基盤の混成語・混合語 + クリー語 + クリミア・タタール語 + その他の混成語・混合語 + チェコ語 + カシューブ語 + 教会スラブ語 + クシュ諸語 + チュヴァシュ語 + ウェールズ語 + デンマーク語 + ダコタ語 + ダルガン語 + ダヤク語 + ドイツ語 + ドイツ語(オーストリア) + 正統ドイツ語(スイス) + デラウェア語 + スレイビー語 + ドグリブ語 + ディンカ語 + ドグリ語 + ドラヴィダ諸語 + 低ソルビア語 + ドゥアラ語 + 中世オランダ語 + ディベヒ語 + デゥウラ語 + ゾンカ語 + エウェ語 + エフィック語 + 古代エジプト語 + エカジュク語 + ギリシャ語 + エラム語 + 英語 + カナダ英語 + イギリス英語 + アメリカ英語 + 中世英語 + エスペラント語 + スペイン語 + スペイン語(ラテンアメリカ) + スペイン語(イベリア半島) + エストニア語 + バスク語 + エウォンド語 + ペルシア語 + ファング語 + ファンティー語 + フラニ語 + フィンランド語 + フィリピノ語 + フィン・ウゴル諸語 + フィジー語 + フェロー語 + フォン語 + フランス語 + フランス語(カナダ) + フランス語(スイス) + 中期フランス語 + 古フランス語 + 東フリジア語 + フリウリ語 + フリジア語 + アイルランド語 + ガ語 + ガヨ語 + バヤ語 + スコットランド・ゲール語 + ゲルマン諸語 + ゲエズ語 + キリバス語 + ガリシア語 + 中高ドイツ語 + グアラニー語 + 古高ドイツ語 + ゴーンディー語 + ゴロンタロ語 + ゴート語 + グレボ語 + 古代ギリシャ語 + スイスドイツ語(スイス) + グジャラート語 + マン島語 + グウィッチン語 + ハウサ語 + ハイダ語 + ハワイ語 + ヘブライ語 + ヒンディー語 + ヒリガイノン語 + ヒマチャル語 + ヒッタイト語 + フモン語 + ヒリモトゥ語 + クロアチア語 + 上ソルビア語 + ハイチ語 + ハンガリー語 + アタパスカ語 + アルメニア語 + ヘレロ語 + インターリングア語 + イバン語 + インドネシア語 + インターリング語 + イボ語 + 四川イ語 + イジョー語 + イヌピアック語 + イロカノ語 + インド諸語 + 印欧諸語 + イングシ語 + イド語 + イラン語 + イロコイ語族 + アイスランド語 + イタリア語 + イヌクウティトット語 + 日本語 + ロジバン語 + ユダヤ・ペルシア語 + ユダヤ・アラビア語 + ジャワ語 + グルジア語 + カラ・カルパク語 + カビル語 + カチン語 + カジェ語 + カンバ語 + カレン語 + カウィ語 + カバルド語 + カタブ語 + コロ語 + コンゴ語 + カシ語 + コイサン諸語 + コータン語 + キクユ語 + クアニャマ語 + カザフ語 + グリーンランド語 + クメール語 + キンブンドゥ語 + カンナダ語 + 韓国語 + コンカニ語 + コシャエ語 + クペレ語 + カヌリ語 + カラチャイ語 + カレリア語 + クルー語 + クルク語 + カシミール語 + クルド語 + クムク語 + クテナイ語 + コミ語 + コーンウォール語 + キルギス語 + ラテン語 + ラジノ語 + ラフンダー語 + ランバ語 + ルクセンブルク語 + レズギ語 + ガンダ語 + リンブルフ語 + リンガラ語 + ラオ語 + モンゴ語 + ロズィ語 + リトアニア語 + ルバ・カタンガ語 + ルバ・ルルア語 + ルイセーニョ語 + ルンダ語 + ルオ語 + ルシャイ語 + ラトビア語 + マドゥラ語 + マガヒー語 + マイティリー語 + マカッサル語 + マンディンゴ語 + オーストロネシア諸語 + マサイ語 + モクシャ語 + マンダル語 + メンデ語 + マダガスカル語 + 中期アイルランド語 + マーシャル語 + マオリ語 + ミクマク語 + ミナンカバウ語 + その他の言語 + マケドニア語 + モン・クメール諸語 + マラヤーラム語 + モンゴル語 + 満州語 + マニプル語 + マノボ語族 + モルダビア語 + モーホーク語 + モシ語 + マラーティー語 + マレー語 + マルタ語 + 複数言語 + ムンダ語族 + クリーク語 + ミランダ語 + マールワーリー語 + ビルマ語 + マヤ語族 + エルジャ語 + ナウル語 + ナワトル語 + 北米インディアン諸語 + ナポリ語 + ノルウェー語 (ブークモール) + 北ンデベレ語 + 低地ドイツ語、低地サクソン語 + ネパール語 + ネワール語 + ンドンガ語 + ニアス語 + ニジェール・コルドファン諸語 + ニウーエイ語 + オランダ語 + フレミッシュ語 + ノルウェー語 (ニーノシュク) + ノルウェー語 + ノガイ語 + 古ノルド語 + ンコ語 + 南ンデベレ語 + 北部ソト語 + ヌビア語族 + ナバホ語 + 古典ネワール語 + ニャンジャ語、チチェワ語、チェワ語 + ニャムウェジ語 + ニャンコレ語 + ニョロ語 + ンゼマ語 + オック語 + オブジワ語 + オロモ語 + オリヤー語 + オセト語 + オセージ語 + オスマントルコ語 + オトミ語族 + パンジャブ語 + パプア諸語 + パンガシナン語 + パフラヴィ語 + パンパンガ語 + パピアメント語 + パラオ語 + 古代ペルシア語 + フィリピン諸語 + フェニキア語 + パーリ語 + ポーランド語 + ポンペイ語 + プラークリット語族 + 古期プロバンス語 + パシュトゥー語 + ポルトガル語 + ポルトガル語 (ブラジル) + ポルトガル語(イベリア半島) + ケチュア語 + ラージャスターン語 + ラパヌイ語 + ラロトガ語 + レト・ロマン語 + ルンディ語 + ルーマニア語 + ロマンス諸語 + ロマーニー語 + ルート + ロシア語 + アルーマニア語 + ルワンダ語 + サンスクリット語 + サンダウェ語 + ヤクート語 + 南米インディアン諸語 + セイリッシュ語族 + サマリア・アラム語 + ササク語 + サンターリー語 + サルデーニャ語 + シチリア語 + スコットランド語 + シンド語 + 北サーミ語 + セリクプ語 + セム諸語 + サンゴ語 + 古期アイルランド語 + 手まね言語 + セルボ=クロアチア語 + シャン語 + シンハラ語 + シダモ語 + スー語族 + シナ・チベット諸語 + スロバキア語 + スロベニア語 + スラブ諸語 + サモア語 + 南サーミ語 + サーミ諸語 + ルレ・サーミ語 + イナリ・サーミ語 + スコルト・サーミ語 + ショナ語 + ソニンケ語 + ソマリ語 + ソグド語 + ソンガイ語 + アルバニア語 + セルビア語 + スリナム語 + セレル語 + シスワティ語 + ナイル・サハラ諸語 + 南部ソト語 + スンダ語 + スクマ語 + スス語 + シュメール語 + スウェーデン語 + スワヒリ語 + シリア語 + タミール語 + タイ諸語 + テルグ語 + テムネ語 + テレーノ語 + テトゥン語 + タジク語 + タイ語 + ティグリニア語 + ティグレ語 + ティブ語 + トルクメン語 + トケラウ語 + タガログ語 + クリンゴン語 + トリンギット語 + タマシェク語 + ツワナ語 + トンガ語 + トンガ語 (ニアサ) + トク・ピシン語 + トルコ語 + ツォンガ語 + チムシュ語 + タタール語 + トゥンブカ語 + トゥピ語族 + アルタイ諸語 + ツバル語 + トウィ語 + タヒチ語 + トゥヴァ語 + ウドムルト語 + ウイグル語 + ウガリト語 + ウクライナ語 + ウンブンドゥ語 + 非確定 + ウルドゥー語 + ウズベク語 + ヴァイ語 + ベンダ語 + ベトナム語 + ボラピュク語 + ボート語 + ワロン語 + ワカシ語族 + ワッラモ語 + ワライ語 + ワショ語 + ソルビア語族 + ウォロフ語 + カルムイク語 + コサ語 + ヤオ語 + ヤップ語 + イディッシュ語 + ヨルバ語 + ユピック語族 + チワン語 + ザポテック語 + ゼナガ語 + 中国語 + 簡体中国語 + 繁体中国語 + ザンデ語 + ズールー語 + ズニ語 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 世界 + アフリカ + 北米 + 南アメリカ + オセアニア + 西アフリカ + 中央アメリカ + 東アフリカ + 北アフリカ + 中部アフリカ + 南部アフリカ + アメリカ大陸 + 北アメリカ + カリブ海 + 東アジア + 南アジア + 東南アジア + 南ヨーロッパ + オーストラリア・ニュージーランド + メラネシア + ミクロネシア地域 + ポリネシア + 南中央アジア + アジア + 中央アジア + 西アジア + ヨーロッパ + 東ヨーロッパ + 北ヨーロッパ + 西ヨーロッパ + 独立国家共同体 + ラテンアメリカ・カリブ地域 + チャネル諸島 + アンドラ + アラブ首長国連邦 + アフガニスタン + アンティグア・バーブーダ + アンギラ + アルバニア + アルメニア + オランダ領アンティル諸島 + アンゴラ + 南極大陸 + アルゼンチン + 米領サモア + オーストリア + オーストラリア + アルバ島 + オーランド諸島 + アゼルバイジャン + ボスニア・ヘルツェゴビナ + バルバドス + バングラデシュ + ベルギー + ブルキナファソ + ブルガリア + バーレーン + ブルンジ + ベニン + サン・バルテルミー + バミューダ + ブルネイ + ボリビア + ブラジル + バハマ + ブータン + ブーベ島 + ボツワナ + ベラルーシ + ベリーズ + カナダ + ココス (キーリング) 諸島 + コンゴ民主共和国 (キンシャサ) + 中央アフリカ共和国 + コンゴ共和国 (ブラザビル) + スイス + コートジボワール + クック諸島 + チリ + カメルーン + 中国 + コロンビア + コスタリカ + セルビア・モンテネグロ + キューバ + カーボベルデ + クリスマス島 + キプロス + チェコ共和国 + ドイツ + ジブチ + デンマーク + ドミニカ国 + ドミニカ共和国 + アルジェリア + エクアドル + エストニア + エジプト + 西サハラ + エリトリア + スペイン + エチオピア + フィンランド + フィジー + フォークランド諸島 + ミクロネシア + フェロー諸島 + フランス + ガボン + イギリス + グレナダ + グルジア + 仏領ギアナ + ガーンジー + ガーナ + ジブラルタル + グリーンランド + ガンビア + ギニア + グアドループ + 赤道ギニア + ギリシャ + 南ジョージア島・南サンドイッチ諸島 + グアテマラ + グアム + ギニアビサウ + ガイアナ + 中華人民共和国香港特別行政区 + ハード島・マクドナルド諸島 + ホンジュラス + クロアチア + ハイチ + ハンガリー + インドネシア + アイルランド + イスラエル + マン島 + インド + 英領インド洋植民地 + イラク + イラン + アイスランド + イタリア + ジャージー + ジャマイカ + ヨルダン + 日本 + ケニア + キルギスタン + カンボジア + キリバス + コモロ + セントクリストファー・ネイビス + 朝鮮民主主義人民共和国 + 大韓民国 + クウェート + ケイマン諸島 + カザフスタン + ラオス + レバノン + セントルシア + リヒテンシュタイン + スリランカ + リベリア + レソト + リトアニア + ルクセンブルグ + ラトビア + リビア + モロッコ + モナコ + モルドバ + モンテネグロ + セント・マーチン + マダガスカル + マーシャル諸島共和国 + マケドニア + マリ + ミャンマー + モンゴル + 中華人民共和国マカオ特別行政区 + 北マリアナ諸島 + マルティニーク島 + モーリタニア + モントセラト島 + マルタ + モーリシャス + モルジブ + マラウィ + メキシコ + マレーシア + モザンビーク + ナミビア + ニューカレドニア + ニジェール + ノーフォーク島 + ナイジェリア + ニカラグア + オランダ + ノルウェー + ネパール + ナウル + ニウエ島 + ニュージーランド + オマーン + パナマ + ペルー + 仏領ポリネシア + パプアニューギニア + フィリピン + パキスタン + ポーランド + サンピエール島・ミクロン島 + ピトケアン島 + プエルトリコ + パレスチナ領土 + ポルトガル + パラオ + パラグアイ + カタール + その他のオセアニア + 欧州連合 + レユニオン島 + ルーマニア + セルビア + ロシア + ルワンダ + サウジアラビア + ソロモン諸島 + セーシェル + スーダン + スウェーデン + シンガポール + セントヘレナ + スロベニア + スバールバル諸島・ヤンマイエン島 + スロバキア + シエラレオネ + サンマリノ + セネガル + ソマリア + スリナム + サントメ・プリンシペ + エルサルバドル + シリア + スワジランド + タークス諸島・カイコス諸島 + チャド + フランス領極南諸島 + トーゴ + タイ + タジキスタン + トケラウ諸島 + 東ティモール + トルクメニスタン + チュニジア + トンガ + トルコ + トリニダード・トバゴ + ツバル + 台湾 + タンザニア + ウクライナ + ウガンダ + 米領太平洋諸島 + アメリカ合衆国 + ウルグアイ + ウズベキスタン + バチカン市国 + セントビンセント・グレナディーン諸島 + ベネズエラ + イギリス領ヴァージン諸島 + アメリカ領ヴァージン諸島 + ベトナム + バヌアツ + ウォリス・フツナ + サモア + イエメン + マヨット島 + 南アフリカ + ザンビア + ジンバブエ + 不明な地域 + + + 伝統的ドイツ語正書法(1901) + ドイツ語正書法(1996) + 後期中世フランス語(〜1606) + 初期現代フランス語 + 東アルメニア文語 + 西アルメニア文語 + ブーントリング + 国際音声記号 + ウラル音声記号 + モノトニック + ナティゾーネ方言 + ポリトニック + コンピュータ + 改訂版 + レシア方言 + サホ語 + リバプール方言 + バレンシア方言 + + + 暦法 + 照合 + 通貨 + + + 繁体字中国語 (Big5) + タイ仏教暦 + 中国暦 + 直接著錄 + 簡体字中国語 (GB2312) + 西暦 (グレゴリオ暦) + ユダヤ暦 + イスラム暦 + 太陽イスラム暦 + 和暦 + 電話帳方式 + ピンイン順 + 画数順 + 旧式 + + + ヤード・ポンド法 + メートル法 + + + 言語: {0} + 文字: {0} + 地域: {0} + + + + [ゞ ゝヽ ヾ ぁァ あア ぃィ いイ ぅゥ うウ ヴ ぇェ えエ ぉォ おオ ヵ かカ がガ きキ ぎギ くク ぐグ ヶ けケ げゲ こコ ごゴ さサ ざザ しシ じジ すス ずズ せセ ぜゼ そソ ぞゾ たタ だダ ちチ ぢヂ っッ つツ づヅ てテ でデ とト どド なナ にニ ぬヌ ねネ のノ はハ ばバ ぱパ ひヒ びビ ぴピ ふフ ぶブ ぷプ へヘ べベ ぺペ ほホ ぼボ ぽポ まマ みミ むム めメ もモ ゃャ やヤ ゅュ ゆユ ょョ よヨ らラ りリ るル れレ ろロ ゎヮ わワ ゐヰ ゑヱ をヲ んン 一 丁 七 万-下 不 与 且 世 丘 丙 両 並 中 丸 丹 主 久 乏 乗 乙 九 乱 乳 乾 亀 了 予 争 事 二 互 五 井 亜 亡 交 亨 享-亭 人 仁 今 介 仏 仕 他 付 仙 代-以 仮 仰 仲 件 任 企 伏-休 会 伝 伯 伴 伸 伺 似 但 位-佐 体 何 余 作 佳 併 使 例 侍 供 依 価 侮 侯 侵 便 係 促 俊 俗 保 信 修 俳 俵 俸 倉 個 倍 倒 候 借 倣 値 倫 倹 偉 偏 停 健 側-偶 偽 傍 傑 傘 備 催 債 傷 傾 働 像 僕 僚 僧 儀 億 儒 償 優 元-兆 先 光 克 免 児 党 入 全 八-六 共 兵 具 典 兼 内 円 冊 再 冒 冗 写 冠 冬 冷 准 凍 凝 凡 処 凶 凸-出 刀 刃 分-刈 刊 刑 列 初 判 別 利 到 制-券 刺 刻 則 削 前 剖 剛 剣 剤 副 剰 割 創 劇 力 功 加 劣 助 努 励 労 効 劾 勅 勇 勉 動 勘 務 勝 募 勢 勤 勧 勲 勺 匁 包 化 北 匠 匹-医 匿 十 千 升 午 半 卑-協 南 単 博 占 印 危 即-卵 卸 厄 厘 厚 原 厳 去 参 又 及-収 叔 取 受 叙 口-句 叫 召 可 台 史 右 号 司 各 合 吉 同-向 君 吟 否 含 吸 吹 呈-告 周 味 呼 命 和 咲 哀 品 員 哲 唆 唇 唐 唯 唱 商 問 啓 善 喚 喜 喝 喪 喫 営 嗣 嘆 嘉 嘱 器 噴 嚇 囚 四 回 因 団 困 囲 図 固 国 圏 園 土 圧 在 地 坂 均 坊 坑 坪 垂 型 垣 埋 城 域 執 培 基 堀 堂 堅 堕 堤 堪 報 場 塀 塁 塊 塑 塔 塗 塚 塩 塾 境 墓 増 墜 墨 墳 墾 壁 壇 壊 壌 士 壮 声-売 変 夏 夕 外 多 夜 夢 大 天-夫 央 失 奇 奉 奏 契 奔 奥 奨 奪 奮 女 奴 好 如-妄 妊 妙 妥 妨 妹 妻 姉 始 姓 委 姫 姻 姿 威 娘 娠 娯 婆 婚 婦 婿 媒 嫁 嫌 嫡 嬢 子 孔 字 存 孝 季 孤 学 孫 宅 宇-安 完 宗-定 宜 宝 実 客-室 宮 宰 害-家 容 宿 寂 寄 密 富 寒 寛 寝 察 寡 寧 審 寮 寸 寺 対 寿 封 専 射 将 尉-尋 導 小 少 尚 就 尺 尼-局 居 屈 届 屋 展 属 層 履 屯 山 岐 岩 岬 岳 岸 峠 峡 峰 島 崇 崎 崩 川 州 巡 巣 工-巨 差 己 巻 市 布 帆 希 帝 帥 師 席 帯 帰 帳 常 帽 幅 幕 幣 干-年 幸 幹 幻-幾 庁 広 床 序 底 店 府 度 座 庫 庭 庶-庸 廃 廉 廊 延 廷 建 弁 弊 式 弐 弓-引 弘 弟 弦 弧 弱 張 強 弾 当 形 彩 彫 彰 影 役 彼 往 征 径 待 律 後 徐 徒 従 得 御 復 循 微 徳 徴 徹 心 必 忌 忍 志-忙 応 忠 快 念 怒 怖 思 怠 急 性 怪 恋 恐 恒 恥 恨 恩 恭 息 恵 悔 悟 悠 患 悦 悩 悪 悲 悼 情 惑 惜 惨 惰 想 愁 愉 意 愚 愛 感 慈 態 慌 慎 慕 慢 慣 慨 慮 慰 慶 憂 憎 憤 憩 憲 憶 憾 懇 懐 懲 懸 成-戒 戦 戯 戸 戻 房 所 扇 扉 手 才 打 払 扱 扶 批 承 技 抄 把 抑 投 抗 折 抜 択 披 抱 抵 抹 押 抽 担 拍 拐 拒 拓 拘 拙 招 拝 拠 拡 括 拷 拾 持 指 挑 挙 挟 振 挿 捕 捜 捨 据 掃 授 掌 排 掘 掛 採 探 接 控 推 措 掲 描 提 揚 換 握 揮 援 揺 損 搬 搭 携 搾 摂 摘 摩 撃 撤 撮 撲 擁 操 擦 擬 支 改 攻 放 政 故 敏 救 敗 教 敢 散 敬 数 整 敵 敷 文 斉 斎 斗 料 斜 斤 斥 断 新 方 施 旅 旋 族 旗 既 日 旧-早 旬 昆 昇 昌 明 易 昔 星 映 春 昨 昭 是 昼 時 晩 普 景 晴 晶 暁 暇 暑 暖 暗 暦 暫 暮 暴 曇 曜 曲 更 書 曹 替 最 月 有 服 朕 朗 望 朝 期 木 未-札 朱 朴 机 朽 杉 材 村 束 条 来 杯 東 松 板 析 林 枚 果 枝 枠 枢 枯 架 柄 某 染 柔 柱 柳 査 栄 栓 校 株 核 根 格 栽 桃 案 桑 桜 桟 梅 械 棄 棋 棒 棚 棟 森 棺 植 検 業 極 楼 楽 概 構 様 槽 標 模 権 横 樹 橋 機 欄 欠 次 欧 欲 欺 款 歌 歓 止 正 武 歩 歯 歳 歴 死 殉-残 殖 殴 段 殺 殻 殿 母 毎 毒 比 毛 氏 民 気 水 氷 永 汁 求 汗 汚 江 池 決 汽 沈 沖 没 沢 河 沸 油 治 沼 沿 況 泉 泊 泌 法 泡-泣 泥 注 泰 泳 洋 洗 洞 津 洪 活 派 流 浄 浅 浜 浦 浪 浮 浴 海 浸 消 涙 涯 液 涼 淑 淡 深 混 添 清 渇-渉 渋 渓 減 渡 渦 温 測 港 湖 湯 湾-満 源 準 溝 溶 滅 滋 滑 滝 滞 滴 漁 漂 漆 漏 演 漠 漢 漫 漬 漸 潔 潜 潟 潤 潮 澄 激 濁 濃 濫 濯 瀬 火 灯 灰 災 炉 炊 炎 炭 点 為 烈 無 焦 然 焼 煙 照 煩 煮 熟 熱 燃 燥 爆 爵 父 片 版 牛 牧 物 牲 特 犠 犬 犯 状 狂 狩 独 狭 猛 猟 猫 献 猶 猿 獄 獣 獲 玄 率 玉 王 珍 珠 班 現 球 理 琴 環 璽 瓶 甘 甚 生 産 用 田-申 男 町 画 界 畑 畔 留 畜 畝 略 番 異 畳 疎 疑 疫 疲 疾 病 症 痘 痛 痢 痴 療 癒 癖 発 登 白 百 的 皆 皇 皮 皿 盆 益 盗 盛 盟 監 盤 目 盲 直 相 盾 省 看 県 真 眠 眺 眼 着 睡 督 瞬 矛 矢 知 短 矯 石 砂 研 砕 砲 破 硝 硫 硬 碁 碑 確 磁 磨 礁 礎 示 礼 社 祈 祉 祖 祚 祝 神 祥 票 祭 禁 禄 禅 禍-福 秀 私 秋 科 秒 秘 租 秩 称 移 程 税 稚 種 稲 稼 稿 穀 穂 積 穏 穫 穴 究 空 突 窃 窒 窓 窮 窯 立 竜 章 童 端 競 竹 笑 笛 符 第 筆 等 筋 筒 答 策 箇 算 管 箱 節 範 築 篤 簡 簿 籍 米 粉 粋 粒 粗 粘 粛 粧 精 糖 糧 糸 系 糾 紀 約 紅 紋 納 純 紙-紛 素-索 紫 累 細 紳 紹 紺 終 組 経 結 絞 絡 給 統 絵 絶 絹 継 続 維 綱 網 綿 緊 総 緑 緒 線 締 編 緩 緯 練 縁 縄 縛 縦 縫 縮 績 繁 繊 織 繕 繭 繰 缶 罪 置 罰 署 罷 羅 羊 美 群 義 羽 翁 翌 習 翻 翼 老 考 者 耐 耕 耗 耳 聖 聞 聴 職 肉 肌 肖 肝 肢 肥 肩 肪 肯 育 肺 胃 胆 背 胎 胞 胴 胸 能 脂 脅 脈 脚 脱 脳 脹 腐 腕 腰 腸 腹 膚 膜 膨 臓 臣 臨 自 臭 至 致 興 舌 舎 舗 舞 舟 航 般 舶 船 艇 艦 良 色 芋 芝 花 芳 芸 芽 苗 若 苦 英 茂 茎 茶 草 荒 荘 荷 菊 菌 菓 菜 華 落 葉 著 葬 蒸 蓄 蔵 薄 薦 薪-薬 藩 藻 虐 虚 虜 虞 虫 蚊 蚕 蛇 蛍 蛮 融 血 衆 行 術 街 衛 衝 衡 衣 表 衰 衷 袋 被 裁 裂 装 裏 裕 補 裸 製 複 褐 褒 襟 襲 西 要 覆 覇 見 規 視 覚 覧 親 観 角 解 触 言 訂 計 討 訓 託 記 訟 訪 設 許 訳 訴 診 証 詐 詔 評 詞 詠 試 詩 詰-詳 誇 誉 誌 認 誓 誕 誘 語 誠 誤 説 読 課 調 談 請 論 諭 諮 諸 諾 謀 謁 謄 謙 講 謝 謡 謹 識 譜 警 議 譲 護 谷 豆 豊 豚 象 豪 貝 貞 負-貢 貧-販 貫 責 貯 貴 買 貸 費 貿 賀 賃 賄 資 賊 賓 賛 賜 賞 賠 賢 賦 質 購 贈 赤 赦 走 赴 起 超 越 趣 足 距 跡 路 跳 践 踊 踏 躍 身 車 軌 軍 軒 軟 転 軸 軽 較 載 輝 輩 輪 輸 轄 辛 辞 辱 農 辺 込 迅 迎 近 返 迫 迭 述 迷 追 退 送 逃 逆 透 逐 逓 途 通 逝 速 造 連 逮 週 進 逸 遂 遅 遇 遊 運 遍 過 道-違 遠 遣 適 遭 遮 遵 遷 選 遺 避 還 邦 邪 邸 郊 郎 郡 部 郭 郵 郷 都 酌 配 酒 酔 酢 酪 酬 酵 酷 酸 醜 醸 釈 里-量 金 針 釣 鈍 鈴 鉄 鉛 鉢 鉱 銀 銃 銅 銑 銘 銭 鋭 鋳 鋼 錘 錠 錬 錯 録 鍛 鎖 鎮 鏡 鐘 鑑 長 門 閉 開 閑 間 関 閣 閥 閲 闘 防 阻 附 降 限 陛 院-陥 陪 陰 陳 陵 陶 陸 険 陽 隅 隆 隊 階 随 隔 際 障 隠 隣 隷 隻 雄-雇 雉 雌 雑 離 難 雨 雪 雰 雲 零 雷 電 需 震 霊 霜 霧 露 青 静 非 面 革 靴 韓 音 韻 響 頂 項 順 預-頒 領 頭 頻 頼 題 額 顔 顕 願 類 顧 風 飛 食 飢 飯 飲 飼-飾 養 餓 館 首 香 馬 駄-駆 駐 騎 騒 験 騰 驚 骨 髄 高 髪 鬼 魂 魅 魔 魚 鮮 鯨 鳥 鳴 鶏 麗 麦 麻 黄 黒 黙 鼓 鼻 齢] + [兌 拼 楔 錄 鳯] + [a-c č d-l ł m-o º p-z] + + + 「 + 」 + 『 + 』 + + + + + + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 日 + 月 + 火 + 水 + 木 + 金 + 土 + + + 日曜日 + 月曜日 + 火曜日 + 水曜日 + 木曜日 + 金曜日 + 土曜日 + + + + + 日 + 月 + 火 + 水 + 木 + 金 + 土 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 第1四半期 + 第2四半期 + 第3四半期 + 第4四半期 + + + + + 1 + 2 + 3 + 4 + + + + 午前 + 午後 + + + 紀元前 + 西暦 + + + 紀元前 + 西暦 + + + + + + y年M月d日EEEE + + + + + y年M月d日 + + + + + yyyy/MM/dd + + + + + yy/MM/dd + + + + + + + H時mm分ss秒 zzzz + + + + + HH:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1}{0} + + + + + {1}{0} + + + + + {1} {0} + + + + + {1} {0} + + + + d日(EEE) + GGGGy年M月d日 + H時 + H:mm + L + M/d(E) + LLL + M月d日(E) + M月d日(E) + M月d日 + M月d日 + MM/dd + M/d + d日 + ah:mm + ah:mm:ss + mm:ss + y + y/M + y/M/d(EEE) + y年M月 + y年M月d日(EEE) + y年M月 + y年M月d日 + y/M/d + y/Q + yQQQ + y年M月 + yy/Q + y年 + yyyy/MM + + + {0}~{1} + + M月~M月 + + + MM/dd(E)~MM/dd(E) + MM/dd(E)~MM/dd(E) + + + M月~M月 + + + M月d日(E)~M月d日(E) + M月d日(E)~d日(E) + + + LLLL~LLLL + + + M月d日~M月d日 + M月d日~d日 + + + MM/dd~MM/dd + MM/dd~MM/dd + + + d日~d日 + + + H時~H時 + H時~H時 + + + H時mm分~H時mm分 + H時mm分~H時mm分 + H時mm分~H時mm分 + + + H時mm分~H時mm分(v) + H時mm分~H時mm分v + H時mm分~H時mm分v + + + H時~H時(v) + H時~H時v + + + y年~y年 + + + yy/MM~yy/MM + yy/MM~yy/MM + + + yy/MM/dd(E)~yy/MM/dd(E) + yy/MM/dd(E)~yy/MM/dd(E) + yy/MM/dd(E)~yy/MM/dd(E) + + + y年M月~M月 + y年M月~y年M月 + + + y年M月d日(E)~M月d日(E) + y年M月d日(E)~d日(E) + y年M月d日(E)~y年M月d日(E) + + + y年M月~M月 + y年M月~y年M月 + + + y年M月d日~M月d日 + y年M月d日~d日 + y年M月d日~y年M月d日 + + + yy/MM/dd~yy/MM/dd + yy/MM/dd~yy/MM/dd + yy/MM/dd~yy/MM/dd + + + + + + 時代 + + + 年 + + + 月 + + + 週 + + + 日 + 一昨日 + 昨日 + 今日 + 明日 + 明後日 + + + 曜日 + + + 午前/午後 + + + 時 + + + 分 + + + 秒 + + + タイムゾーン + + + + + 午前 + 午後 + + + 大化 + 白雉 + 白鳯 + 朱鳥 + 大宝 + 慶雲 + 和銅 + 霊亀 + 養老 + 神亀 + 天平 + 天平感宝 + 天平勝宝 + 天平宝字 + 天平神護 + 神護景雲 + 宝亀 + 天応 + 延暦 + 大同 + 弘仁 + 天長 + 承和 + 嘉祥 + 仁寿 + 斉衡 + 天安 + 貞観 + 元慶 + 仁和 + 寛平 + 昌泰 + 延喜 + 延長 + 承平 + 天慶 + 天暦 + 天徳 + 応和 + 康保 + 安和 + 天禄 + 天延 + 貞元 + 天元 + 永観 + 寛和 + 永延 + 永祚 + 正暦 + 長徳 + 長保 + 寛弘 + 長和 + 寛仁 + 治安 + 万寿 + 長元 + 長暦 + 長久 + 寛徳 + 永承 + 天喜 + 康平 + 治暦 + 延久 + 承保 + 承暦 + 永保 + 応徳 + 寛治 + 嘉保 + 永長 + 承徳 + 康和 + 長治 + 嘉承 + 天仁 + 天永 + 永久 + 元永 + 保安 + 天治 + 大治 + 天承 + 長承 + 保延 + 永治 + 康治 + 天養 + 久安 + 仁平 + 久寿 + 保元 + 平治 + 永暦 + 応保 + 長寛 + 永万 + 仁安 + 嘉応 + 承安 + 安元 + 治承 + 養和 + 寿永 + 元暦 + 文治 + 建久 + 正治 + 建仁 + 元久 + 建永 + 承元 + 建暦 + 建保 + 承久 + 貞応 + 元仁 + 嘉禄 + 安貞 + 寛喜 + 貞永 + 天福 + 文暦 + 嘉禎 + 暦仁 + 延応 + 仁治 + 寛元 + 宝治 + 建長 + 康元 + 正嘉 + 正元 + 文応 + 弘長 + 文永 + 建治 + 弘安 + 正応 + 永仁 + 正安 + 乾元 + 嘉元 + 徳治 + 延慶 + 応長 + 正和 + 文保 + 元応 + 元亨 + 正中 + 嘉暦 + 元徳 + 元弘 + 建武 + 延元 + 興国 + 正平 + 建徳 + 文中 + 天授 + 康暦 + 弘和 + 元中 + 至徳 + 嘉慶 + 康応 + 明徳 + 応永 + 正長 + 永享 + 嘉吉 + 文安 + 宝徳 + 享徳 + 康正 + 長禄 + 寛正 + 文正 + 応仁 + 文明 + 長享 + 延徳 + 明応 + 文亀 + 永正 + 大永 + 享禄 + 天文 + 弘治 + 永禄 + 元亀 + 天正 + 文禄 + 慶長 + 元和 + 寛永 + 正保 + 慶安 + 承応 + 明暦 + 万治 + 寛文 + 延宝 + 天和 + 貞享 + 元禄 + 宝永 + 正徳 + 享保 + 元文 + 寛保 + 延享 + 寛延 + 宝暦 + 明和 + 安永 + 天明 + 寛政 + 享和 + 文化 + 文政 + 天保 + 弘化 + 嘉永 + 安政 + 万延 + 文久 + 元治 + 慶応 + 明治 + 大正 + 昭和 + 平成 + + + + + + Gy年M月d日EEEE + + + + + Gy年M月d日 + + + + + Gyy/MM/dd + + + + + Gyy/MM/dd + + + + + + d日(EEE) + M月d日(EEE) + M月d日 + M/d + ah:mm + ah:mm:ss + Gy年 + Gyy/MM + Gy年M月 + Gy年M月d日 + Gyy/M/d + Gyy/Q + + + + + + + 民国前 + 民国 + + + + + + Gy年M月d日EEEE + + + + + Gy年M月d日EEEE + + + + + Gyy/MM/dd(EE) + + + + + Gyy/MM/dd(E) + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0}時間 + + 不明 + + + アンドラ公国 + + + ドバイ + + + カブール + + + アンチグア + + + アンギラ + + + チラナ + + + エレバン + + + キュラソー + + + ルアンダ + + + ロデラ + + + パーマー + + + 南極点 + + + 昭和基地 + + + モーソン + + + デービス + + + ボストーク + + + ケーシー + + + デュモン デュルビル + + + マクムード + + + リオガイェゴス + + + メンドーサ + + + サンファン + + + ウスアイア + + + ラリオハ + + + サンルイス + + + カタマルカ + + + フフイ + + + トゥクマン + + + コルドバ + + + ブエノスアイレス + + + パゴパゴ + + + ウィーン + + + パース + + + ユークラ + + + ダーウィン + + + アデレード + + + ブロークンヒル + + + カリー + + + メルボルン + + + ホバート + + + リンデマン + + + シドニー + + + ブリスベン + + + ロードハウ + + + アルバ + + + バクー + + + バルバドス + + + ダッカ + + + ブリュッセル + + + ワガドゥグー + + + ソフィア + + + バーレーン国 + + + ブジュンブラ + + + ポルトノボ + + + バミューダ + + + ブルネイ + + + ラパス + + + エイルネペ + + + リオブランコ + + + ポルトベーリョ + + + ボアビスタ + + + マナウス + + + クイアバ + + + カンポグランデ + + + ベレン + + + アラグァイナ + + + サンパウロ + + + バイーア + + + フォルタレザ + + + マセイオ + + + レシフェ + + + ノロニャ + + + ナッサウ + + + ティンプー + + + ガボローネ + + + ミンスク + + + ベリーズ + + + ドーソン + + + ホワイトホース + + + イヌヴィク + + + バンクーバー + + + ドーソンクリーク + + + イエローナイフ + + + エドモントン + + + スウィフトカレント + + + ケンブリッジベイ + + + レジャイナ + + + ウィニペグ + + + レソリュート + + + レイニーリバー + + + ランキン湾 + + + コーラルハーバー + + + サンダーベイ + + + ニピゴン + + + トロント + + + モントリオール + + + イカルイット + + + パンナータング + + + モンクトン + + + ハリファクス + + + グースベイ + + + グレースベイ + + + ブラン・サブロン + + + セントジョンズ + + + ココス + + + キンシャサ + + + ルブンバシ + + + バンギ + + + ブラザビル + + + チューリッヒ + + + アビジャン + + + ラロトンガ + + + イースター島 + + + アメリカ/サンチアゴ + + + ドゥアラ + + + カシガル + + + ウルムチ + + + 重慶 + + + 上海 + + + ハルビン + + + ボゴタ + + + コスタリカ共和国 + + + ハバナ + + + カボベルデ共和国 + + + クリスマス + + + ニコシア + + + ベルリン + + + ジブチ共和国 + + + コペンハーゲン + + + ドミニカ国 + + + サントドミンゴ + + + アルジェ + + + ガラパゴス + + + アメリカ/グアヤキル + + + タリン + + + カイロ + + + アイウン + + + アスマラ + + + カナリア諸島 + + + セウタ + + + ヨーロッパ/マドリード + + + アジスアベバ + + + ヘルシンキ + + + フィジー共和国 + + + スタンリー + + + トラック + + + ポナペ + + + コシャエ + + + フェロー + + + パリ + + + リーブルビル + + + ヨーロッパ/ロンドン + + + グレナダ + + + トビリシ + + + カイエンヌ + + + アクラ + + + ジブラルタル + + + チューレ + + + アメリカ/ゴッドホープ + + + スコレスビスン + + + デンマークシャウン + + + バンジュル + + + コナクリ + + + グアダループ + + + マラボ + + + アテネ + + + 南ジョージア島 + + + グァテマラ共和国 + + + グアム + + + ビサウ + + + ガイアナ + + + 香港 + + + ポルトープランス + + + ブダペスト + + + ジャカルタ + + + ポンティアナク + + + マカッサル + + + ジャヤプラ + + + ダブリン + + + エルサレム + + + チャゴス + + + バグダッド + + + テヘラン + + + レイキャビーク + + + ローマ + + + ジャマイカ + + + アンマン + + + 東京 + + + ナイロビ + + + ビシュケク + + + プノンペン + + + エンダベリー + + + キリティマティ + + + タラワ + + + コモロ + + + セントキッツネイビス + + + 平壌 + + + ソウル + + + クウェート国 + + + ケイマン + + + アクタウ + + + オラル + + + アクトベ + + + キジルオルダ + + + アルマトイ + + + ビエンチャン + + + ベイルート + + + セントルシア + + + ファドゥーツ + + + コロンボ + + + モンロビア + + + マセル + + + ヴィルニアス + + + ルクセンブルグ大公国 + + + リガ + + + トリポリ + + + カサブランカ + + + モナコ公国 + + + キシナウ + + + アンタナナリボ + + + クワジェリン + + + マジュロ + + + アフリカ/バマコ + + + ラングーン + + + ホブド + + + ウランバートル + + + チョイバルサン + + + マカオ + + + サイパン + + + マルチニーク + + + ヌアクショット + + + モントセラト島 + + + マルタ共和国 + + + モーリシャス共和国 + + + モルディブ共和国 + + + ブランタイア + + + ティフアナ + + + エルモシヨ + + + マサトラン + + + チワワ + + + モンテレイ + + + メキシコシティー + + + メリダ + + + カンクン + + + アジア/クアラルンプール + + + クチン + + + マプト + + + ビントフック + + + ヌメア + + + ニアメー + + + ノーフォーク + + + ラゴス + + + マナグア + + + アムステルダム + + + オスロ + + + カトマンズ + + + ナウル共和国 + + + ニウエ + + + チャタム + + + 太平洋/オークランド + + + マスカット + + + パナマ共和国 + + + リマ + + + 太平洋/タヒチ + + + マルケサス + + + ガンビア + + + ポートモレスビー + + + マニラ + + + カラチ + + + ワルシャワ + + + ミクロン + + + ピトケアン島 + + + プエルトリコ + + + ガザ + + + アゾレス諸島 + + + マデイラ + + + ヨーロッパ/リスボン + + + パラオ共和国 + + + アスンシオン + + + カタール + + + レユニオン + + + ブカレスト + + + カリーニングラード + + + モスクワ + + + ボルゴグラード + + + サマラ + + + エカテリンブルグ + + + オムスク + + + ノボシビルスク + + + クラスノヤルスク + + + イルクーツク + + + ヤクーツク + + + ウラジオストク + + + サハリン + + + マガダン + + + カムチャッカ + + + アナジル + + + キガリ + + + リヤド + + + ガダルカナル + + + マエ + + + ハルツーム + + + ストックホルム + + + シンガポール + + + セントヘレナ + + + 北極/ロングイヤービーエン + + + フリータウン + + + ダカール + + + モガディシュ + + + パラマリボ + + + サントメ + + + サルバドル + + + ダマスカス + + + ムババネ + + + グランドターク + + + ンジャメナ + + + ケルゲレーヌ + + + ロメ + + + バンコク + + + ドゥシャンベ + + + ファカオフォ + + + ディリ + + + アシガバード + + + チュニジア + + + トンガタプ + + + イスタンブール + + + ポートオブスペイン + + + フナフティ + + + 台北 + + + ダルエスサラーム + + + ウジゴロド + + + キエフ + + + シンフェローポリ + + + ザポロージェ + + + カンパラ + + + ミッドウェー + + + ジョンストン + + + ウェーク + + + アダック + + + ノーメ + + + ホノルル + + + アンカレッジ + + + ヤクタット + + + ジュノー + + + ロサンゼルス + + + ボイシ + + + フェニックス + + + シップロック + + + デンバー + + + ノースダコタ州ニューセーラム + + + ノースダコタ州センター + + + シカゴ + + + メノミニー + + + インディアナ州ビンセンス + + + インディアナ州ピーターズバーグ + + + インディアナ州テルシティ + + + インディアナ州ノックス + + + インディアナ州ウィナマック + + + インディアナ州マレンゴ + + + インディアナポリス + + + ルイスビル + + + インディアナ州ビベー + + + ケンタッキー州モンティチェロ + + + デトロイト + + + ニューヨーク + + + モンテビデオ + + + サマルカンド + + + アジア/タシケント + + + セントヴィンセント + + + カラカス + + + トルトーラ + + + セントトマス + + + サイゴン + + + エファテ + + + ワリー + + + アピーア + + + アデン + + + マイヨット島 + + + ヨハネスブルグ + + + ルサカ + + + ハラーレ + + + + 中央アフリカ時間 + 中央アフリカ時間 + + + + + 東アフリカ時間 + 東アフリカ時間 + + + + + 南アフリカ時間 + 南アフリカ標準時 + + + + + 西アフリカ時間 + 西アフリカ時間 + 西アフリカ夏時間 + + + + + アラスカ時間 + アラスカ標準時 + アラスカ夏時間 + + + + + アマゾン時間 + アマゾン夏時間 + + + + + アメリカ中部時間 + アメリカ中部標準時 + アメリカ中部夏時間 + + + + + アメリカ東部時間 + アメリカ東部標準時 + アメリカ東部夏時間 + + + + + アメリカ山地時間 + アメリカ山地標準時 + アメリカ山地夏時間 + + + + + アメリカ太平洋時間 + アメリカ太平洋標準時 + アメリカ太平洋夏時間 + + + + + アルゼンチン時間 + アルゼンチン夏時間 + + + + + 大西洋時間 + 大西洋標準時 + 大西洋夏時間 + + + + + ブラジリア時間 + ブラジリア夏時間 + + + + + 中国標準時 + 中国夏時間 + + + + + 中欧標準時 + 中欧夏時間 + + + + + 東欧標準時 + 東欧夏時間 + + + + + グリニッジ標準時 + + + + + イスラエル標準時 + イスラエル夏時間 + + + + + 日本標準時 + 日本夏時間 + + true + + + + ニューファンドランド島標準時 + ニューファンドランド島夏時間 + + + + + + + . + , + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + アンドラ ペセタ + + + UAE ディルハム + + + アフガニー (1927-2002) + + + アフガニー + + + アルバニア レク + + + アルメニア ドラム + + + オランダ領アンティル ギルダー + + + クワンザ + + + クワンザ (1977-1990) + + + アンゴラ 新クワンザ (1990-2000) + + + アンゴラ 旧クワンザ (1995-1999) + + + アルゼンチン アゥストラール + + + アルゼンチン ペソ (1983-1985) + + + アルゼンチン ペソ + + + オーストリア シリング + + + オーストラリア ドル + + + アルバ ギルダー + + + アゼルバイジャン マナト (1993-2006) + + + アゼルバイジャン マナト + + + ボスニア ディナール + + + ボスニア マルク (BAM) + + + バルバドス ドル + + + バングラデシュ タカ + + + ベルギー フラン (BEC) + + + ベルギー フラン + + + ベルギー フラン (BEL) + + + ブルガリア レフ + + + ブルガリア 新レフ + + + バーレーン ディナール + + + ブルンジ フラン + + + バミューダ ドル + + + ブルネイ ドル + + + ボリビアーノ + + + ボリビア ペソ + + + ボリビア Mvdol + + + ブラジル 新クルゼイロ (1967-1986) + + + ブラジル クルゼイロ + + + ブラジル クルゼイロ (1990-1993) + + + ブラジル レアル + + + ブラジル 新クルゼイロ + + + ブラジル クルゼイロ レアル + + + バハマ ドル + + + ブータン ニュルタム + + + ビルマ チャット + + + ボツワナ プラ + + + ベラルーシ ルーブル (1994-1999) + + + ベラルーシ ルーブル + + + ベリーズ ドル + + + カナダ ドル + + + コンゴ フラン + + + WIR ユーロ + + + スイス フラン + + + WIR フラン + + + チリ ウニダ デ フォメント + + + チリ ペソ + + + 中国人民元 + 元 + + + コロンビア ペソ + + + レアル (UVR) + + + コスタリカ コロン + + + セルビアン ディナール + + + チェコスロバキア コルナ + + + キューバ ペソ + + + カーボベルデ エスクード + + + キプロス ポンド + + + チェコ コルナ + + + 東ドイツ マルク + + + ドイツ マルク + + + ジブチ フラン + + + デンマーク クローネ + + + ドミニカ ペソ + + + アルジェリア ディナール + + + エクアドル スクレ + + + エクアドル UVC + + + エストニア クルーン + + + エジプト ポンド + + + エリトリア ナクファ + + + スペインペセタ + + + スペイン 兌換ペセタ + + + スペイン ペセタ + + + エチオピア ブル + + + ユーロ + + + フィンランド マルカ + + + フィジー諸島 ドル + + + フォークランド(マルビナス)諸島 ポンド + + + フランス フラン + + + 英国ポンド + + + グルジア クーポン ラリ + + + グルジア ラリ + + + ガーナ セディ (1979-2007) + + + ガーナ セディ + + + ジブラルタル ポンド + + + ガンビア ダラシ + + + ギニア フラン + + + ギニア シリー + + + 赤道ギニア ギニー + + + ギリシャ ドラクマ + + + グアテマラ ケツァル + + + ポルトガル領ギニア エスクード + + + ギニアビサウ ペソ + + + ガイアナ ドル + + + 香港ドル + + + ホンジュラス レンピラ + + + クロアチア ディナール + + + クロアチア クーナ + + + ハイチ グールド + + + ハンガリー フォリント + + + インドネシア ルピア + + + アイリッシュ ポンド + + + イスラエル ポンド + + + イスラエル新シェケル + + + インド ルピー + + + イラク ディナール + + + イラン リアル + + + アイスランド クローナ + + + イタリア リラ + + + ジャマイカ ドル + + + ヨルダン ディナール + + + 日本円 + ¥ + + + ケニア シリング + + + キルギスタン ソム + + + カンボジア リエル + + + コモロ フラン + + + 北朝鮮 ウォン + + + 韓国 ウォン + ₩ + + + クウェート ディナール + + + ケイマン諸島 ドル + + + カザフスタン テンゲ + + + ラオス キープ + + + レバノン ポンド + + + スリランカ ルピー + + + リベリア ドル + + + レソト ロティ + + + リトアニア リタス + + + リトアニア タロナ + + + ルクセンブルク 兌換フラン + + + ルクセンブルグ フラン + + + ルクセンブルク 金融フラン + + + ラトビア ラッツ + + + ラトビア ルーブル + + + リビア ディナール + + + モロッコ ディルハム + + + モロッコ フラン + + + モルドバ レイ + + + マダガスカル アリアリ + + + マダガスカル フラン + + + マケドニア デナル + + + マリ フラン + + + ミャンマー チャット + + + モンゴル トグログ + + + マカオ パタカ + + + モーリタニア ウギア + + + マルタ リラ + + + マルタ ポンド + + + モーリシャス ルピー + + + モルディブ諸島 ルフィア + + + マラウィ クワチャ + + + メキシコ ペソ + + + メキシコ ペソ (1861-1992) + + + メキシコ UDI + + + マレーシア リンギット + + + モザンピーク エスクード + + + モザンピーク メティカル + + + モザンビーク メティカル + + + ナミビア ドル + + + ナイジェリア ナイラ + + + ニカラグア コルドバ + + + ニカラグア コルドバ オロ + + + オランダ ギルダー + + + ノルウェー クローネ + + + ネパール ルピー + + + ニュージーランド ドル + + + オマーン リアル + + + パナマ バルボア + + + ペルー インティ + + + ペルー 新ソル + + + ペルー ソル + + + パプアニューギニア キナ + + + フィリピン ペソ + + + パキスタン ルピー + + + ポーランド ズウォティ + + + ポーランド ズウォティ (1950-1995) + + + ポルトガル エスクード + + + パラグアイ グアラニ + + + カタール リアル + + + ローデシア ドル + + + ルーマニア 旧レイ + + + ルーマニア レイ + + + ディナール (セルビア) + + + ロシア ルーブル + + + ロシア ルーブル (1991-1998) + + + ルワンダ フラン + + + サウジ リヤル + + + ソロモン諸島 ドル + + + セイシェル ルピー + + + スーダン ディナール + + + スーダン ポンド + + + 旧スーダン ポンド + + + スウェーデン クローナ + + + シンガポール ドル + + + セントヘレナ島 ポンド + + + スロベニア トラール + + + スロバキア コルナ + + + シエラレオネ レオン + + + ソマリア シリング + + + スリナム ドル + + + スリナム ギルダー + + + サントメ・プリンシペ ドブラ + + + ソ連 ルーブル + + + エルサルバドル コロン + + + シリア ポンド + + + スワジランド リランゲニ + + + タイ バーツ + + + タジキスタン ルーブル + + + タジキスタン ソモニ + + + トルクメニスタン マナト + + + チュニジア ディナール + + + トンガ パ・アンガ + + + ティモール エスクード + + + トルコ リラ + + + 新トルコリラ + + + トリニダードトバゴ ドル + + + 新台湾ドル + + + タンザニア シリング + + + ウクライナ グリブナ + + + ウクライナ カルボバネツ + + + ウガンダ シリング (1966-1987) + + + ウガンダ シリング + + + 米ドル + $ + + + 米ドル (翌日) + + + 米ドル (当日) + + + ウルグアイ ペソ (1975-1993) + + + ウルグアイ ペソ + + + ウズベキスタン スム + + + ベネズエラ ボリバル + + + ベネズエラ ボリバルフエルテ + + + ベトナム ドン + + + バヌアツ バツ + + + 西サモア タラ + + + CFA フラン BEAC + + + 銀 + + + 金 + + + ヨーロッパ混合単位 (EURCO) + + + ヨーロッパ通貨単位 (EMU-6) + + + ヨーロッパ勘定単位 (EUA-9) + + + ヨーロッパ勘定単位 (EUA-17) + + + 東カリブ ドル + + + 特別引き出し権 + + + ヨーロッパ通貨単位 + + + フランス金フラン + + + フランス UIC フラン + + + CFA フラン BCEAO + + + パラジウム + + + CFP フラン + + + プラチナ + + + RINET基金 + + + テスト用通貨コード + + + 不明または無効な通貨 + + + イエメン ディナール + + + イエメン リアル + + + ユーゴスラビア ディナール + + + ユーゴスラビア スーパー ディナール + + + ユーゴスラビア 新ディナール (YUN) + + + 南アフリカ ランド (ZAL) + + + 南アフリカ ランド + + + ザンビア クワチャ + + + ザイール 新ザイール + + + ザイール ザイール + + + ジンバブエ ドル + + + + + + {0} 日 + + + {0} 時間 + + + {0} 分 + + + {0} か月 + + + {0} 秒 + + + {0} 週 + + + {0} 年 + + + + + はい:ハイ + いいえ:イイエ + + + + diff --git a/lib/zend/Zend/Locale/Data/ja_JP.xml b/lib/zend/Zend/Locale/Data/ja_JP.xml new file mode 100644 index 0000000000..4a6f5d2b5f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ja_JP.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ka.xml b/lib/zend/Zend/Locale/Data/ka.xml new file mode 100644 index 0000000000..89af5365e3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ka.xml @@ -0,0 +1,2157 @@ + + + + + + + + + + + {0} ({1}) + , + + + აფხაზური + ადიღეური + ავესტა + აფრიკული + აინუ + ალეუტური + ძველი ინგლისური + არაბული + არამეული + ხელოვნური სხვა + ასამური + ავსტრიული + აზერბაიჯანული + ბელორუსული + ბულგარული + ბიჰარი + ტიბეტური + ბრეტონული + ბოსნიური + ბურიატული + კატალანური + კავკასიური სხვა + ჩეჩნური + კელტური სხვა + ჩეხური + საეკლესიო სლავური + უელსური + დანიური + გერმანული + ავსტრიული გერმანული + შვეიცარიული მაღალი გერმანული + ეგვიპტური + ბერძნული + ინგლისური + ავსტრალიური ინგლისური + კანადური ინგლისური + ბრიტანული ინგლისური + ამერიკული ინგლისური + ესპერანტო + ესპანური + ლათინურ ამერიკული ესპანური + იბერიული ესპანური + ესტონური + ბასკური + სპარსული + ფინური + ფილიპინური + ფრანგული + კანადური ფრანგული + შვეიცარიული ფრანგული + ძველი ფრანგული + ირლანდიური + შოტლანდიურ-გალური + გალური + გუარანი + ძველი გერმანული + ძველი ბერძნული + შვეიცარიული გერმანული + გუჯარათი + ებრაული + ჰინდი + ხორვატიული + უნგრული + სომხური + ინტერლინგუალური + ინდონეზიური + ინტერლინგი + ინდო-ევროპული სხვა + ისლანდიური + იტალიური + იაპონური + იავანური + ქართული + კონგო + ყაზახური + კამბოჯიური + კორეული + ქურთული + ყირგიზული + ლათინური + ლუქსემბურგული + ლინგალა + ლაოსური + ლიტვური + ლატვიური + მაკედონიური + მონღოლური + მოლდოვური + მალაიზიური + მაიას ენები + ნეაპოლიტანური + ნეპალური + ჰოლანდიური + ფლომანდიური + ნორვეგიული ნინორსკი + ნორვეგიული + ნავახო + ოციტანური + ორიული + ოსური + ძველი სპარსული + პოლონური + პრაკრიტის ენები + პუშტუ + პორტუგალიური + ბრაზილიური პორტუგალიური + იბერიულ-პორტუგალიური + რუმინული + რუსული + სანსკრიტი + სარდინიული + სიცილიური + სინდური + ძველი ირლანდიური + სერბულ-ხორვატული + სინჰალური + სლოვაკური + სლოვენური + სლავური სხვა + სომალიური + ალბანური + სერბული + სამხრეთ სოთოს ენა + შუმერული + შვედური + სუაჰილი + ტაჯიკური + ტაილანდური + თურქმენული + კლინგონი + ტსვანა + თურქული + თუი + უდმურტიული + უიგურული + უკრაინული + უცნობი ან არასწორი ენა + ურდუ + უზბეკური + ვიეტნამური + ქსოზა + იდიში + ჩინური + გამარტივებული ჩინური + ტრადიციული ჩინური + ზულუ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + მსოფლიო + აფრიკა + ჩრდილოეთ ამერიკა + სამხრეთი ამერიკა + ოკეანეთი + დასავლეთი აფრიკა + ცენტრალური ამერიკა + აღმოსავლეთი აფრიკა + ჩრდილოეთი აფრიკა + შუა აფრიკა + სამხრეთი აფრიკა + ამერიკები + ჩრდილოეთი ამერიკა + კარიბი + აღმოსავლეთი აზია + სამხრეთი აზია + სამხრეთ-აღმოსავლეთი აზია + სამხრეთი ევროპა + ავსტრალია და ახალი ზელანდია + მელანეზია + მირონეზია + პოლინეზია + სამხრეთ-ცენტრალური აზია + აზია + ცენტრალური აზია + დასავლეთი აზია + ევროპა + აღმოსავლეთი ევროპა + ჩრდილოეთი ევროპა + დასავლეთი ევროპა + დამოუკიდებელ სახელმწიფოთა თანამეგობრობა + ლათინური ამერიკა და კარიბი + ანდორა + არაბეთის გაერთიანებული ემირატები + ავღანეთი + ანტიგუა და ბარბუდა + ანგვილა + ალბანეთი + სომხეთი + ნიდერლანდების ანტილები + ანგოლა + ანტარქტიკა + არგენტინა + ამერიკული სამოა + ავსტრია + ავსტრალია + არუბა + ალანდის კუნძულები + აზერბაიჯანი + ბოსნია და ჰერცეგოვინა + ბარბადოსი + ბანგლადეში + ბელგია + ბურკინა-ფასო + ბულგარეთი + ბაჰრეინი + ბურუნდი + ბენინი + ბერმუდა + ბრუნეი + ბოლივია + ბრაზილია + ბაჰამის კუნძულები + ბუტანი + ბუვეს კუნძული + ბოტსვანა + ბელორუსია + ბელიზი + კანადა + კონგო - კინშასა + ცენტრალური აფრიკის რესპუბლიკა + კონგო + შვეიცარია + სპილოს ძვლის სანაპირო + კუკის კუნძულები + ჩილე + კამერუნი + ჩინეთი + კოლუმბია + კოსტა-რიკა + სერბია და მონტენეგრო + კუბა + კაბო-ვერდე + შობის კუნძული + კვიპროსი + ჩეხეთის რესპუბლიკა + გერმანია + ჯიბუტი + დანია + დომინიკა + დომინიკანის რესპუბლიკა + ალჟირი + ეკვადორი + ესტონეთი + ეგვიპტე + დასავლეთი საჰარა + ერიტრეა + ესპანეთი + ეთიოპია + ფინეთი + ფიჯი + ფალკლენდის კუნძულები + მიკრონეზია + ფაროს კუნძულები + საფრანგეთი + გაბონი + დიდი ბრიტანეთი + გრენადა + საქართველო + განა + გიბრალტარი + გრენლანდია + გამბია + გვინეა + გვადელუპე + ეკვატორული გვინეა + საბერძნეთი + სამხრეთი ჯორჯია და სამხრეთ სენდვიჩის კუნძულები + გვატემალა + გუამი + გვინეა-ბისაუ + გაიანა + ჰონგ კონგი + ჰერდის კუნძული და მაკდონალდის კუნძულები + ჰონდურასი + ჰორვატია + ჰაიტი + უნგრეთი + ინდონეზია + ირლანდია + ისრაელი + მანის კუნძული + ინდოეთი + ბრიტანული ტერიტორია ინდოეთის ოკეანეში + ერაყი + ირანი + ისლანდია + იტალია + ჯერსი + იამაიკა + იორდანია + იაპონია + კენია + ყირგიზეთი + კამბოჯა + კირიბატი + კომორის კუნძულები + სენტ-კიტსი და ნევისი + ჩრდილოეთი კორეა + სამხრეთი კორეა + კუვეიტი + კაიმანის კუნძულები + ყაზახეთი + ლაოსი + ლიბანი + სენტ-ლუსია + ლიხტენშტაინი + შრი-ლანკა + ლიბერია + ლესოთო + ლიტვა + ლუქსემბურგი + ლატვია + ლიბია + მაროკო + მონაკო + მოლდოვა + მონტენეგრო + მადაგასკარი + მარშალის კუნძულები + მაკედონია + მალი + მიანმარი + მონღოლეთი + მაკაო + მარტინიკი + მავრიტანია + მონსერატი + მალტა + მავრიკია + მალდივის კუნძულები + მალავი + მექსიკა + მალაიზია + მოზამბიკი + ნამიბია + ახალი კალედონია + ნიგერი + ნორფოლკის კუნძული + ნიგერია + ნიკარაგუა + ნიდერლანდები + ნორვეგია + ნეპალი + ნაურუ + ახალი ზელანდია + ომანი + პანამა + პერუ + ფრანგული პოლინეზია + პაპუა-ახალი გვინეა + ფილიპინები + პაკისტანი + პოლონეთი + სენტ-პიერი და მიქელონი + პუერტო რიკო + პალესტინის ტერიტორია + პორტუგალია + პალაუ + პარაგვაი + კატარი + დაშორებული ოკეანია + ევროკავშირი + რეიუნიონი + რუმინეთი + სერბია + რუსეთი + რუანდა + საუდის არაბეთი + სოლომონის კუნძულები + სეიშელის კუნძულები + სუდანი + შვეცია + სინგაპური + წმინდა ელენეს კუნძული + სლოვენია + სლოვაკეთი + სიერა-ლეონე + სან-მარინო + სენეგალი + სომალი + სურინამი + საო-ტომე და პრინსიპი + სალვადორი + სირია + სვაზილენდი + ჩადი + ფრანგული სამხრეთის ტერიტორიები + ტოგო + ტაილანდი + ტაჯიკეთი + აღმოსავლეთი ტიმორი + თურქმენეთი + ტუნისი + ტონგა + თურქეთი + ტრინიდადი და ტობაგო + ტუვალუ + ტაივანი + ტანზანია + უკრაინა + უგანდა + შეერთებული შტატების მცირე დაშორებული კუნძულები + ამერიკის შეერთებული შტატები + ურუგვაი + უზბეკეთი + ვატიკანი + სენტ-ვინსენტი და გრენადინები + ვენესუელა + ვიეტნამი + ვანუატუ + ვალისი და ფუტუნა + სამოა + იემენი + სამხრეთ აფრიკა + ზამბია + ზიმბაბვე + უცნობი ან არასწორი რეგიონი + + + კალენდარი + მიმდევრობა + ვალუტა + + + ტრადიციული ჩინური + ბუდისტური კალენდარი + ჩინური კალენდარი + პირდაპირი მიმდევრობა + გამარტივებული ჩინური + გრიგორიანული კალენდარი + ებრაული კალენდარი + ინდური ეროვნული კალენდარი + ისლამური კალენდარი + ისლამური სამოქალაქო კალენდარი + იაპონური კალენდარი + ჩინეთის რესპუბლიკის კალენდარი + ტრადიციული + + + US + Metric + + + + [ა ⴀ ბ ⴁ გ ⴂ დ ⴃ ე ⴄ ვ ⴅ ზ ⴆ ჱ ⴡ თ ⴇ ი ⴈ კ ⴉ ლ ⴊ მ ⴋ ნ ⴌ ჲ ⴢ ო ⴍ პ ⴎ ჟ ⴏ რ ⴐ ს ⴑ ტ ⴒ ჳ ⴣ უ ⴓ ფ ⴔ ქ ⴕ ღ ⴖ ყ ⴗ შ ⴘ ჩ ⴙ ც ⴚ ძ ⴛ წ ⴜ ჭ ⴝ ხ ⴞ ჴ ⴤ ჯ ⴟ ჰ ⴠ ჵ ⴥ ჶ-ჺ] + + + “ + ” + ‘ + ’ + + + + + + + + იან + თებ + მარ + აპრ + მაი + ივნ + ივლ + აგვ + სექ + ოქტ + ნოე + დეკ + + + იანვარი + თებერვალი + მარტი + აპრილი + მაისი + ივნისი + ივლისი + აგვისტო + სექტემბერი + ოქტომბერი + ნოემბერი + დეკემბერი + + + + + ი + თ + მ + ა + მ + ი + ი + ა + ს + ო + ნ + დ + + + + + + + კვი + ორშ + სამ + ოთხ + ხუთ + პარ + შაბ + + + კვირა + ორშაბათი + სამშაბათი + ოთხშაბათი + ხუთშაბათი + პარასკევი + შაბათი + + + + + კ + ო + ს + ო + ხ + პ + შ + + + + + + + I კვ. + II კვ. + III კვ. + IV კვ. + + + 1-ლი კვარტალი + მე-2 კვარტალი + მე-3 კვარტალი + მე-4 კვარტალი + + + + + I კვარტალი + II კვარტალი + III კვარტალი + IV კვარტალი + + + + დილის + საღამოს + + + ჩვენს წელთაღრიცხვამდე + ჩვენი წელთაღრიცხვით + + + ჩვენს წელთაღრიცხვამდე + ჩვენი წელთაღრიცხვით + + + ჩვენს წელთაღრიცხვამდე + ჩვენი წელთაღრიცხვით + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + HH:mm:ss + dd MMM + dd/MM + hh:mm a + hh:mm:ss a + MM/yy + EEE, d MMM, yy + d MMM, yy + dd/MM/yy + Q yy + QQQQ yy + + + + + ხანა + + + წელი + + + თვე + + + კვირა + + + დღე + სამი დღის წინ + გუშინწინ + გუშინ + დღეს + ხვალ + ზეგ + სამი დღის შემდეგ + + + კვირის დღე + + + დღის პერიოდი + + + საათი + + + წუთი + + + წამი + + + ზონა + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + უცნობი + + + ბარბუდა + + + ანგილა + + + ნიდერლანდის + + + ანგოლა + + + როთერა + + + პალმერი + + + სამხრეთი პოლუსი + + + სიოუა + + + მოუსონი + + + დევისი + + + ვოსტოკი + + + კეისი + + + დიუმონ დ'ურვილი + + + მაკმურდო + + + რიო გალეგოსი + + + მენდოზა + + + სან ხუანი + + + უშუაია + + + ლა რიოხა + + + სან ლუისი + + + კატამარკა + + + ჯუჯუი + + + ტუკუმანი + + + კორდობა + + + ბუენოს აირესი + + + პერთი + + + ეუკლა + + + დარვინი + + + ადელაიდა + + + ბროუკენ ჰილი + + + ქური + + + მელბურნი + + + ჰობარტი + + + ლინდმანი + + + სიდნეი + + + ბრისბეინი + + + ლორდ ჰოუი + + + არუბა + + + ბარბადოსი + + + ბურკინა ფასო + + + ბურუნდი + + + ბენინი + + + ბოლივია + + + ეირუნეპე + + + რიო ბრანკო + + + პორტო ველჰო + + + ბოა ვისტა + + + მანაუსი + + + კუიაბა + + + კამპო გრანდე + + + ბელემი + + + არაგუაინა + + + საო პაულო + + + ბაია + + + ფორტალეზა + + + მასეიო + + + რეციფე + + + ნორონია + + + ბაჰამის კუნძულები + + + ბოტსვანა + + + ბელიზი + + + დოუსონი + + + უაითჰორსი + + + ინუვიკი + + + ვანკუვერი + + + დოუსონ ქრიკი + + + იელოუნაიფი + + + ედმონტონი + + + სვიფტ კარენტი + + + კემბრიჯ ბეი + + + რეჯინა + + + უინიპეგი + + + რეზოლუტე + + + რეინი რივერი + + + რენკინ ინლეტი + + + ქორალ ჰარბორი + + + თანდერ ბეი + + + ნიპიგონი + + + ტორონტო + + + მონრეალი + + + იქალუიტი + + + პანგნირტუნგი + + + მონქტონი + + + ჰალიფაქსი + + + გუზ ბეი + + + გლეის ბეი + + + ბლან-საბლონი + + + სენტ ჯონსი + + + კინშასა + + + ლუბუმბაში + + + ცენტრალური აფრიკის რესპუბლიკა + + + კონგო - ბრაზავილი + + + სპილოს ძვლის სანაპირო + + + ისთერი + + + კამერუნი + + + კაშგარი + + + ურუმქი + + + ჩონგქინგი + + + ჰარბინი + + + კოლუმბია + + + კოსტა რიკა + + + კუბა + + + ჯიბუტი + + + დომინიკა + + + ალჟირი + + + გალაპაგოსი + + + ეგვიპტე + + + დასავლეთი საჰარა + + + ერითრეა + + + კანარი + + + სეუტა + + + ეთიოპია + + + ტრუკი + + + პონაპე + + + კოსრაე + + + გაბონი + + + გრენადა + + + გუიანა + + + განა + + + თულე + + + სკორსბისუნდი + + + დენმარკშავნი + + + გამბია + + + გინეა + + + გუადელუპე + + + ეკვატორული გვინეა + + + გუატემალა + + + გინეა-ბისაუ + + + გუიანა + + + ჯაკარტა + + + პონტიანაკი + + + მაკასარი + + + ჯაიაპურა + + + იამაიკა + + + კენია + + + ენდერბური + + + კირიტიმატი + + + ტარაუა + + + კაიმანის + + + აქტაუ + + + ორალი + + + აქტობე + + + ყიზილორდა + + + ალმატი + + + ლიბერია + + + ლესოთო + + + ლიბია + + + მაროკო + + + კვაჯალეინი + + + მახურო + + + მალი + + + ჰოვდი + + + ულანბატარი + + + ჩოიბალსანი + + + მარტინიკი + + + მავრიტანია + + + მონსერატი + + + მალავი + + + ტიხუანა + + + ჰერმოსიო + + + მაზატლანი + + + ჩიჰუაჰუა + + + მონტერეი + + + მექსიკო სითი + + + მერიდა + + + კანკუნი + + + კუჩინგი + + + მოზამბიკი + + + ნამიბია + + + ნიგერი + + + ნიგერია + + + ნიკარაგუა + + + ჩათამი + + + პერუ + + + მარკეზასი + + + გამბიერი + + + სენტ პიერი და მიკელონი + + + აზორეს + + + მადეირა + + + პარაგვაი + + + კალინინგრადი + + + მოსკოვი + + + ვოლგოგრადი + + + სამარა + + + ეკატერინბურგი + + + ომსკი + + + ნოვოსიბირსკი + + + კრასნოიარსკი + + + ირკუტსკი + + + იაკუტსკი + + + ვლადივოსტოკი + + + სახალინი + + + მაგადანი + + + კამჩატკა + + + ანადირი + + + რუანდა + + + სუდანი + + + სიერა ლეონე + + + სენეგალი + + + სომალია + + + საო ტომე და პრინსიპე + + + ელ სალვადორი + + + სვაზილენდი + + + ტერკის და კაიკოს + + + ჩადი + + + ტოგო + + + ტუნისი + + + ტანზანია + + + უჟგოროდი + + + კიევი + + + სიმფეროპოლი + + + ზაპოროჟიე + + + უგანდა + + + მიდუეი + + + ჯონსტონი + + + უეიკი + + + ადაკი + + + ნომი + + + ჰონოლულუ + + + ენქორაჯი + + + იაკუტატი + + + ჯუნო + + + ლოს ანჯელესი + + + ბუასი + + + ფენიქსი + + + შიპროკი + + + დენვერი + + + ნიუ სალემი, ჩრდილოეთი დაკოტა + + + ცენტრი, ჩრდილოეთი დაკოტა + + + ჩიკაგო + + + მენომინი + + + ვინსენი, ინდიანა + + + პიტერსბურგი + + + თელ სითი, ინდიანა + + + ნოქსი, ინდიანა + + + უინემაკი, ინდიანა + + + მარენგო + + + ინდიანაპოლისი + + + ლუისვილი + + + ვივეი, ინდიანა + + + მონტიჩელო + + + დეტროიტი + + + ნიუ იორკი + + + ურუგვაი + + + სამარყანდი + + + ვენესუელა + + + სამხრეთი აფრიკა + + + ზამბია + + + ზიმბაბვე + + + + + + , + . + ; + % + 0 + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + {0} {1} + + + + ანდორული პესეტა + + + გაერთიანებული არაბული საემიროების დირჰემი + + + ავღანი (1927-2002) + + + ავღანი + + + ალბანური ლეკი + + + სომხური დრამი + + + ნიდრელანდების ანტილიის გულდენი + + + ანგოლური კვანზა + + + ანგოლური კვანზა (1977-1990) + + + ანგოლური ახალი კვანზა (1990-2000) + + + ანგოლური მიტოლებული კვანზა (1995-1999) + + + არგენტინული აუსტრალი + + + არგენტინული პესო (1983-1985) + + + არგენტინული პესო + + + ავსტრიული შილინგი + + + ავსტრალიური დოლარი + + + არუბანული გულდენი + + + აზერბაიჯანული მანათი (1993-2006) + + + აზერბაიჯანული მანათი + + + ბოსნია-ჰერცოგოვინას დინარი + + + ბოსნია-ჰერცოგოვინას კონვერტირებადი მარკა + + + ბარბადოსული დოლარი + + + ბანგლადეშური ტაკა + + + ბელგიური ფრანკი (კოვერტირებადი) + + + ბელგიური ფრანკი + + + ბელგიური ფრანკი (ფინანსური) + + + ბულგარული მყარი ლევი + + + ბულგარული ახალი ლევი + + + ბაჰრეინული დინარი + + + ბურუნდიული ფრანკი + + + ბერმუდული დინარი + + + ბრუნეული დოლარი + + + ბოლივიანო + + + ბოლივიური პესო + + + ბრაზილიური კრუზეირო ნოვო (1967-1986) + + + ბრაზილიური კრუზადო + + + ბრაზილიური კრუზეირო (1990-1993) + + + ბრაზილიური რეალი + + + ბრაზილიური კრუზადო ნოვო + + + ბრაზილიური კრუზეირო + + + ბაჰამური დოლარი + + + ბოტსვანიური პულა + + + ახალი ბელარუსიული რუბლი (1994-1999) + + + ბელარუსიული რუბლი + + + კანადური დოლარი + + + შვეიცარიული ფრანკი + + + ჩინური უანი + + + კოსტა რიკული კოლონი + + + ძველი სერბიული დინარი + + + ჩეხოსლოვაკიის მყარი კრონა + + + კუბური პესო + + + კაბო ვერდეს ესკუდო + + + კვიპროსის გირვანქა + + + ჩეხური კრონა + + + აღმოსავლეთ გერმანული მარკა + + + გერმანული მარკა + + + ჯიბუტის ფრანკი + + + დანიური კრონა + + + დომინიკური პესო + + + ალჟირიული დინარი + + + ესტონური კრუნა + + + ეგვიპტური გირვანქა + + + ესპანური პესეტა + + + ევრო + + + ფინური მარკა + + + ფიჯი დოლარი + + + ფრანგული ფრანკი + + + ინგლისური გირვანქა სტერლინგი + + + ქართული კუპონი ლარით + + + ქართული ლარი + + + ბერძნული დრაჰმა + + + პორტუგალიური გინეა ესკუდო + + + ჰონგ კონგის დოლარი + + + ჰონდურასის ლემპირა + + + ხორვატიული დინარი + + + ხორვატიული კუნა + + + უნგრული ფორინტი + + + ინდონეზიური რუპია + + + ირლანდიური გირვანქა + + + ინდური რუპია + + + ისლანდიური კრონა + + + იტალიური ლირა + + + იამაიკური დოლარი + + + იორდანიული დოლარი + + + იაპონური იენი + + + კენიური შილინგი + + + ყირღიზული სომი + + + ჩრდილოეთ კორეული ვონი + + + სამხრეთ კორეული ვონი + + + კუვეიტური დინარი + + + კაიმანის კუნძულების დოლარი + + + ყაზახური ტენგე + + + შრი ლანკის რუპია + + + ლიბერიული დოლარი + + + ლიტვური ლიტა + + + ლიტვური ტალონი + + + ლუქსემბურგის კონვერტირებადი ფრანკი + + + ლუქსემბურგის ფრანკი + + + ლუქსემბურგის ფინანსური ფრანკი + + + ლატვიური ლატი + + + ლატვიური რუბლი + + + ლიბიური დინარი + + + მაროკოს დირჰამი + + + მაროკოს ფრანკი + + + მოლდოვური ლეუ + + + მადაგასკარის არიარი + + + მადაგასკარის ფრანკი + + + მაკედონიური დენარი + + + მალის ფრანკი + + + მიანმარის კიატი + + + მონღოლური ტუგრიკი + + + მალტის ლირა + + + მალტის გირვანქა + + + მავრიტანული რუპია + + + მალდივური რუფია + + + მალავის კვანჩა + + + მექსიკური პესო + + + მექსიკური ვერცხლის პესო (1861-1992) + + + მალაიზიური რინგიტი + + + მოზამბიკური ესკუდო + + + ძველი მოზამბიკური მეტიკალი + + + მოზამბიკური მეტიკალი + + + ნამიბიური დოლარი + + + ნიგერიული ნაირა + + + ნიკარაგუას კორდობა + + + ნიკარაგუას ოქროს კორდობა + + + ჰოლანდიური გულდენი + + + ნორვეგიული კრონა + + + ნეპალური რუპია + + + ახალი ზელანდიის დოლარი + + + ომანის რეალი + + + პერუს ინტი + + + პერუს ახალი სოლი + + + პერუს სოლი + + + ფილიპინური პესო + + + პაკისტანური რუპია + + + პოლონური ზლოტი + + + პოლონური ზლოტი (1950-1995) + + + პორტუგალიური ესკუდო + + + კატარის რიალი + + + როდეზიული დოლარი + + + ძველი რუმინული ლეუ + + + რუმინული ლეუ + + + რუსული რუბლი + + + რუსული რუბლი (1991-1998) + + + რუანდული ფრანკი + + + სეიშელის რუპია + + + სუდანის დინარი + + + სუდანის გირვანქა + + + შვედური კრონა + + + სინგაპურის დოლარი + + + სიერა ლეონეს ლეონე + + + სურინამის დოლარი + + + სურინამის გულდენი + + + საბჭოთა რუბლი + + + სირიული გირვანქა + + + ტაჯიკური რუბლი + + + ტაჯიკური სომონი + + + თურქმენული მანათი + + + ტუნისიური დინარი + + + თურქული ლირა + + + ახალი თურქული ლირა + + + ტრინიდად და ტობაგოს დოლარი + + + ტაივანური ახალი დოლარი + + + ტანზანიური შილინგი + + + უკრაინული გრივნა + + + უკრაინული კარბოვანეცი + + + უგანდური შილინგი (1966-1987) + + + უგანდური შილინგი + + + აშშ დოლარი + + + აშშ დოლარი (შემდეგი დღე) + + + აშშ დოლარი (იგივე დღე) + + + ურუგვაის პესო (1975-1993) + + + ურუგვაის პესო ურუგვაიო + + + უზბეკური სუმი + + + ვენესუელის ბოლივარი + + + ვიეტნამური დონგი + + + ვანატუს ვატუ + + + დასავლეთ სამოას ტალა + + + ვერცხლი + + + ევროპული კომპპოზიტური ერთეული + + + ევროპული ფულადი ერთეული + + + აღმოსავლეთ კარიბიული დოლარი + + + ევროპული სავალუტო ერთეული + + + ფრანგული ოქროს ფრანკი + + + უცნობი ან არასწორი ვალუტა + + + იემენის დინარი + + + იემენის რეალი + + + იუგოსლავიური მყარი დინარი + + + იუგოსლავიური ახალი დინარი + + + იუგოსლავიური კონვერტირებადი დინარი + + + ზამბიური კვანჩა + + + ზაირის ახალი ზაირი + + + ზაირის ზაირი + + + ზიმბაბვეს დოლარი + + + + + + {0} დღე + + + {0} საათი + + + {0} წუთი + + + {0} თვე + + + {0} წამი + + + {0} კვირა + + + {0} წელი + + + + + დიახ + არა + + + diff --git a/lib/zend/Zend/Locale/Data/ka_GE.xml b/lib/zend/Zend/Locale/Data/ka_GE.xml new file mode 100644 index 0000000000..043d0ce6ad --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ka_GE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/kaj.xml b/lib/zend/Zend/Locale/Data/kaj.xml new file mode 100644 index 0000000000..6a7a0cb3bd --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kaj.xml @@ -0,0 +1,189 @@ + + + + + + + + + + [a-z] + + + + + + + + A̱yr + A̱hw + A̱ta + A̱na + A̱pf + A̱ki + A̱ty + A̱ni + A̱ku + Swa + Sby + Sbh + + + Hywan A̱yrnig + Hywan A̱hwa + Hywan A̱tat + Hywan A̱naai + Hywan A̱pfwon + Hywan A̱kitat + Hywan A̱tyirin + Hywan A̱ninai + Hywan A̱kumviriyin + Hywan Swak + Hywan Swak B'a̱yrnig + Hywan Swak B'a̱hwa + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Lad + Lin + Tal + Lar + Lam + Jum + Asa + + + Ladi + Lintani + Talata + Larba + Lamit + Juma + Asabar + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + A.M. + P.M. + + + Gabanin Miladi + Miladi + + + G.M. + M. + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + A̱naira + + + + + diff --git a/lib/zend/Zend/Locale/Data/kaj_NG.xml b/lib/zend/Zend/Locale/Data/kaj_NG.xml new file mode 100644 index 0000000000..6c046c3d32 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kaj_NG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/kam.xml b/lib/zend/Zend/Locale/Data/kam.xml new file mode 100644 index 0000000000..86dfe422f3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kam.xml @@ -0,0 +1,188 @@ + + + + + + + + + + [a-e g-o r-w y z] + + + + + + + + Mwei wa mbee + Mwei wa keli + Mwei wa katatu + Mwei wa kanne + Mwei wa katano + Mwei wa thanthatu + Mwei wa muonza + Mwei wa nyanya + Mwei wa kenda + Mwei wa ikumi + Mwei wa ikumi na imwe + Mwei wa ikumi na ili + + + Mwei wa mbee + Mwei wa keli + Mwei wa katatu + Mwei wa kanne + Mwei wa katano + Mwei wa thanthatu + Mwei wa muonza + Mwei wa nyanya + Mwei wa kenda + Mwei wa ikumi + Mwei wa ikumi na imwe + Mwei wa ikumi na ili + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Jpl + Jtt + Jnn + Jtn + Alh + Ijm + Jms + + + Jumapili + Jumatatu + Jumanne + Jumatano + Alamisi + Ijumaa + Jumamosi + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + mbee wa yesu + IY + + + MY + IY + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Silingi ya Kenya + + + + diff --git a/lib/zend/Zend/Locale/Data/kam_KE.xml b/lib/zend/Zend/Locale/Data/kam_KE.xml new file mode 100644 index 0000000000..a9a8c684db --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kam_KE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/kcg.xml b/lib/zend/Zend/Locale/Data/kcg.xml new file mode 100644 index 0000000000..7e41203628 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kcg.xml @@ -0,0 +1,189 @@ + + + + + + + + + + [a {a\u0331} b {ch} {chy} d-g {gb} {gh} {ghw} {ghy} i {i\u0331} j {jhy} k {kh} {kp} l-n {ng} {ny} o p r s {sh} {shy} t {ts} u-w y z] + + + + + + + + Juw + Swi + Tsa + Nya + Tsw + Ata + Ana + Ari + Aku + Swa + Man + Mas + + + Zwat Juwung + Zwat Swiyang + Zwat Tsat + Zwat Nyai + Zwat Tswon + Zwat Ataah + Zwat Anatat + Zwat Arinai + Zwat Akubunyung + Zwat Swag + Zwat Mangjuwang + Zwat Swag-Ma-Suyang + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Lad + Tan + Tal + Lar + Lam + Jum + Asa + + + Ladi + Tanii + Talata + Larba + Lamit + Juma + Asabat + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + Gabanin Miladi + Miladi + + + GM + M + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Nera + + + + + diff --git a/lib/zend/Zend/Locale/Data/kcg_NG.xml b/lib/zend/Zend/Locale/Data/kcg_NG.xml new file mode 100644 index 0000000000..bd81d81b87 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kcg_NG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/kfo.xml b/lib/zend/Zend/Locale/Data/kfo.xml new file mode 100644 index 0000000000..1a91c1b6ae --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kfo.xml @@ -0,0 +1,189 @@ + + + + + + + + + + [a ā b-e ē f g {gb} h-k {kh} l-p {pk} r-u w y z] + + + + + + + + Wey + Fan + Tat + Nan + Tuy + Tso + Taf + War + Kun + Ban + Kom + Sau + + + Fai Weyene + Fai Fani + Fai Tataka + Fai Nangra + Fai Tuyo + Fai Tsoyi + Fai Tafaka + Fai Warachi + Fai Kunobok + Fai Bansok + Fai Kom + Fai Sauk + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Lah + Kub + Gba + Tan + Yei + Koy + Sat + + + Lahadi + Je-Kubacha + Je-Gbai + Tansati + Je-Yei + Je-Koye + Sati + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + Kafi Mar Wenom + Bayan Chi Wenom + + + KMW + BCW + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Neira + + + + + diff --git a/lib/zend/Zend/Locale/Data/kfo_CI.xml b/lib/zend/Zend/Locale/Data/kfo_CI.xml new file mode 100644 index 0000000000..b4f78021c0 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kfo_CI.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/kk.xml b/lib/zend/Zend/Locale/Data/kk.xml new file mode 100644 index 0000000000..d62438a5b0 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kk.xml @@ -0,0 +1,388 @@ + + + + + + + + + + + бур + амхар + арабша + ассам + беларус + болгар + бихари + бенгал + брит + босния + каталан + чех + валлий + дат + неміс + грек + ағылшын + эсперанто + испан + эстон + баск + парсы + фин + пилипино + фарер + француз + фрис + ирландша + Солтүстік Шотландия + галицияша + гуарани + гуджарати + иврит + хинди + хорват + мадьяр + армян + интерлингва + индонезия + интерлингве + исланд + италиян + жапон + ява + грузин + Қазақ + камбоджия + каннада + кәріс + күрд + қырғыз + латын + лингала + лаос + литва + латыш + македон + малайялам + монғол + маратхи + малай + мальта + непал + голланд + норвег + окситан + ория + панджаб + поляк + пашто + португал + румын + орыс + санскрит + синдхи + сербхорват + сингал + словак + словен + сомали + албан + серб + сесото + судан + швед + суахили + тамил + телугу + тай + тигринья + түркмен + клингон + түрікше + тви + ұйғыр + украин + урду + өзбек + вьетнам + хоса + идиш + зулус + + + Қазақстан + Тонга + + + + [а ә б-е ё ж-й і к қ л-н ң о-у ұ ү ф-я] + [һ] + + + + + + + + қаң. + ақп. + нау. + сәу. + мам. + мау. + шіл. + там. + қыр. + қаз. + қар. + желт. + + + қаңтар + ақпан + наурыз + сәуір + мамыр + маусым + шілде + тамыз + қыркүйек + қазан + қараша + желтоқсан + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + жс. + дс. + сс. + ср. + бс. + жм. + сһ. + + + жексені + дуйсенбі + сейсенбі + сәренбі + бейсенбі + жұма + сенбі + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, d MMMM y 'ж'. + + + + + d MMMM y 'ж'. + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + dd.MM + Q yy + MM.yyyy + MMMM y 'ж'. + + + {0} - {1} + + M-M + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM y 'ж'. + MMM y 'ж'. - MMM y 'ж'. + + + E, d MMM - E, d MMM y 'ж'. + E, d - E, d MMM y 'ж'. + E, d MMM y 'ж'. - E, d MMM y 'ж'. + + + d MMM - d MMM y 'ж'. + d-d MMM y 'ж'. + d MMM y 'ж'. - d MMM y 'ж'. + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.00 ¤ + + + + + + тңг. + + + + + + иә:и + жоқ:ж + + + diff --git a/lib/zend/Zend/Locale/Data/kk_Cyrl.xml b/lib/zend/Zend/Locale/Data/kk_Cyrl.xml new file mode 100644 index 0000000000..2cf22d9df5 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kk_Cyrl.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ವಿಶ್ವ + ಆಫ್ರಿಕಾ + ಉತ್ತರ ಅಮೇರಿಕಾ + ದಕ್ಷಿಣ ಅಮೇರಿಕಾ + ಓಶಿಯಾನಾ + ಪಶ್ಚಿಮ ಆಫ್ರಿಕಾ + ಮಧ್ಯ ಅಮೇರಿಕಾ + ಪೂರ್ವ ಆಫ್ರಿಕಾ + ಉತ್ತರ ಆಫ್ರಿಕಾ + ಮಧ್ಯ ಆಫ್ರಿಕಾ + ಆಫ್ರಿಕಾದ ದಕ್ಷಿಣ ಭಾಗ + ಅಮೆರಿಕಾಸ್ + ಅಮೇರಿಕಾದ ಉತ್ತರ ಭಾಗ + ಕೆರೇಬಿಯನ್ + ಏಷ್ಯಾದ ಪೂರ್ವ ಭಾಗ + ಏಷ್ಯಾದ ದಕ್ಷಿಣ ಭಾಗ + ಆಗ್ನೇಯ ಏಷ್ಯಾ + ದಕ್ಷಿಣ ಯೂರೋಪ್ + ಆಸ್ಟ್ರೇಲಿಯಾ ಹಾಗೂ ನ್ಯೂಝಿಲ್ಯಾಂಡ್ + ಮೇಲಿನೇಶಿಯಾ + ಮೈಕ್ರೋನೇಶಿಯನ್ ಪ್ರದೇಶ + ಪೋಲಿನೇಶಿಯಾ + ದಕ್ಷಿಣ-ಮಧ್ಯ ಏಷ್ಯಾ + ಏಷ್ಯಾ + ಮಧ್ಯ ಏಷ್ಯಾ + ಪಶ್ಚಿಮ ಏಷ್ಯಾ + ಯೂರೋಪ್ + ಪೂರ್ವ ಯೂರೋಪ್ + ಉತ್ತರ ಯೂರೋಪ್ + ಪಶ್ಚಿಮ ಯೂರೋಪ್ + ಸ್ವಂತಂತ್ರ್ಯ ರಾಷ್ಟ್ರಗಳ ಕಾಮನ್‌ವೆಲ್ತ್ + ಜೆಕೊಸ್ಲೋವಾಕಿಯಾ + ಲ್ಯಾಟಿನ್ ಅಮೇರಿಕಾ ಮತ್ತು ಕೆರಿಬಿಯನ್ + ಛಾನೆಲ್ ದ್ವೀಪಗಳು + ಅಂಡೋರಾ + ಸಂಯುಕ್ತ ಅರಬ್ ಎಮಿರೇಟಸ್ + ಅಫಘಾನಿಸ್ಥಾನ್ + ಆಂಟಿಗುವಾ ಮತ್ತು ಬರ್ಬುಡಾ + ಆಂಗುಯಿಲ್ಲಾ + ಅಲ್ಬೇನಿಯಾ + ಅರ್ಮೇನಿಯಾ + ನೆದರ್‌ಲ್ಯಾಂಡ್ + ಅಂಗೋಲಾ + ಅಂಟಾರ್ಟಿಕಾ + ಅರ್ಜೆಂಟೈನಾ + ಅಮೇರಿಕನ್ ಸಮೋವಾ + ಆಸ್ಟ್ರಿಯಾ + ಆಸ್ಟ್ರೇಲಿಯ + ಅರುಬಾ + ಆಲ್ಯಾಂಡ್ ದ್ವೀಪಗಳು + ಅಜರ್ಬೈಜಾನ್ + ಬೋಸ್ನಿಯಾ ಮತ್ತು ಹರ್ಜೆಗೋವಿನಾ + ಬಾರ್ಬಡೋಸ್ + ಬಾಂಗ್ಲಾದೇಶ್ + ಬೆಲ್ಜಿಯಮ್ + ಬುರ್ಕಿನಾ ಫಾಸೋ + ಬಲ್ಗೇರಿಯನ್ + ಬಹರೈನ್ + ಬುರುಂಡಿ + ಬೆನಿನ್ + ಸೇಂಟ್ ಬಾರ್ಥೆಲೆಮಿ + ಬರ್ಮುಡಾ + ಬ್ರೂನಿ + ಬಲ್ಗೇರಿಯಾ + ಬ್ರೆಜಿಲ್ + ಬಹಾಮಾಸ್ + ಭೂತಾನ್ + ಬೋವೆಟ್ ದ್ವೀಪ + ಬೋಟ್ಸ್‌ವಾನಾ + ಬೊಲಿವಿಯಾ + ಬೆಲಿಜ್ + ಕೆನಡಾ + ಕೊಕೊಸ್ ದ್ವೀಪಗಳು + ಕಾಂಗೋ - ಕಿನ್ಶಾಸಾ + ಮಧ್ಯ ಆಫ್ರಿಕಾ ಗಣರಾಜ್ಯ + ಕಾಂಗೋ - ಬ್ರಾಜಾವಿಲ್ಲೇ + ಸ್ವಿಡ್ಜರ್‌ಲ್ಯಾಂಡ್ + ಐವರಿ ಕೋಸ್ಟ್ + ಕುಕ್ ದ್ವೀಪಗಳು + ಚಿಲಿ + ಕ್ಯಾಮರೋನ್ + ಚೀನ + ಕೊಲಂಬಿಯಾ + ಕೊಸ್ಟಾ ರಿಕಾ + ಸೆರ್ಬಿಯಾ ಮತ್ತು ಮೊಂಟೊನೆಗ್ರೋ + ಕ್ಯೂಬಾ + ಕೇಪ್ ವರ್ಡೆ + ಕ್ರಿಸ್‌ಮಸ್ ದ್ವೀಪ + ಸೈಪ್ರಸ್ + ಚೆಕ್ ರಿಪಬ್ಲಿಕ್ + ಜರ್ಮನಿ + ಜಿಬೋಟಿ + ಡೆನ್ಮಾರ್ಕ್ + ಡೊಮಿನಿಕಾ + ಡೊಮೆನಿಕ್ ರಿಪಬ್ಲಿಕ್ + ಅಲ್ಗೇರಿಯಾ + ಈಕ್ವೆಡಾರ್ + ಎಸ್ತೊನಿಯ + ಈಜಿಪ್ಟ್ + ಪಶ್ಚಿಮ ಸಹಾರಾ + ಏರಿಟ್ರಿಯಾ + ಸ್ಪೈನ್ + ಇಥಿಯೋಪಿಯಾ + ಫಿನ್‍‍ಲ್ಯಾಂಡ್ + ಫಿಜಿ + ಫ್ಹಾಕ್‌ಲ್ಯಾಂಡ್ ದ್ವೀಪಗಳು + ಮೈಕ್ರೋನೇಶಿಯಾ + ಫರೋ ದ್ವೀಪಗಳು + ಫ್ರಾನ್ಸ್ + ಗೆಬೊನ್ + ಬ್ರಿಟನ್/ಇಂಗ್ಲೆಂಡ್ + ಗ್ರೆನೆಡಾ + ಜಾರ್ಜಿಯಾ + ಫ್ರೆಂಚ್ ಗಯಾನಾ + ಗುರ್ನಜೀ + ಘಾನಾ + ಗಿಬ್ರಾಲ್ಟರ್ + ಗ್ರೀನ್‌ಲ್ಯಾಂಡ್ + ಗ್ಯಾಂಬಿಯಾ + ಗಿನಿ + ಗುಡೆಲೋಪ್ + ಈಕ್ವೆಟೋರಿಯಲ್ ಗಿನಿ + ಗ್ರೀಸ್ + ದಕ್ಷಿಣ ಜಾರ್ಜಿಯಾ ಮತ್ತು ದಕ್ಷಿಣ ಸ್ಯಾಂಡ್‌ವಿಚ್ ದ್ವೀಪಗಳು + ಗ್ವಾಟೆಮಾಲಾ + ಗುಯಾಮ್ + ಗಿನಿ-ಬಿಸ್ಸಾವ್ + ಗಯಾನಾ + ಹಾಂಗ್ ಕಾಂಗ್ SAR ಚೀನಾ + ಹರ್ಡ್ ದ್ವೀಪ ಮತ್ತು ಮಾಕ್‌ಡೊನಾಲ್ಡ್ ದ್ವೀಪಗಳು + ಹೊಂಡುರಾಸ್ + ಕ್ರೋಯೇಶಿಯಾ + ಹೈಟಿ + ಹಂಗೇರಿ + ಇಂಡೋನೇಶಿಯಾ + ಐರ್ಲೆಂಡ್ + ಇಸ್ರೇಲ್ + ಐಲ್ ಆಫ್ ಮ್ಯಾನ್ + ಭಾರತ + ಬ್ರಿಟೀಶ್ ಇಂಡಿಯನ್ ಮಹಾಸಾಗರ ಪ್ರದೇಶ + ಇರಾಕ್ + ಇರಾನ್ + ಐಸ್‌ಲ್ಯಾಂಡ್ + ಇಟಲಿ + ಜೆರ್ಸಿ + ಜಮೈಕಾ + ಜೋರ್ಡಾನ್ + ಜಪಾನ್ + ಕೀನ್ಯಾ + ಕಿರ್ಗಿಸ್ಥಾನ್ + ಕಾಂಬೋಡಿಯಾ + ಕಿರಿಬಾತಿ + ಕೊಮೊರೊಸ್ + ಸೇಂಟ್ ಕಿಟ್ಸ್ ಮತ್ತು ನೆವಿಸ್ + ಉತ್ತರ ಕೋರಿಯಾ + ದಕ್ಷಿಣ ಕೋರಿಯಾ + ಕುವೈತ್ + ಕೇಮನ್ ದ್ವೀಪಗಳು + ಕಝಾಕಿಸ್ಥಾನ್ + ಲಾವೋಸ್ + ಲೆಬನಾನ್ + ಸೇಂಟ್ ಲೂಸಿಯಾ + ಲಿಚೆನ್‌ಸ್ಟೈನ್ + ಶ್ರೀಲಂಕಾ + ಲಿಬೇರಿಯಾ + ಲೆಥೋಸೊ + ಲಿಥುವೇನಿಯಾ + ಲಕ್ಸಂಬರ್ಗ್ + ಲಾಟ್ವಿಯಾ + ಲಿಬಿಯಾ + ಮೊರಾಕ್ಕೊ + ಮೊನಾಕೊ + ಮೊಲ್ಡೋವಾ + ಮೊಂಟೆನೆಗ್ರೋ + ಸೇಂಟ್ ಮಾರ್ಟಿನ್ + ಮಡಗಾಸ್ಕರ್ + ಮಾರ್ಶಲ್ ದ್ವೀಪಗಳು + ಮ್ಯಾಸಿಡೋನಿಯಾ + ಮಾಲಿ + ಮಯನ್ಮಾರ್ + ಮೊಂಗೋಲಿಯಾ + ಮಕಾವ್ SAR ಚೀನಾ + ಉತ್ತರ ಮರಿಯಾನಾ ದ್ವೀಪಗಳು + ಮಾರ್ಟಿನಿಕ್ + ಮಾರಿಟಾನಿಯಾ + ಮೋಂಟ್‌ಸೆರೆಟ್ + ಮಾಲ್ಟಾ + ಮಾರಿಶಿಯಸ್ + ಮಾಲ್ಡಿವ್ಸ್ + ಮಲಾವಿ + ಮೆಕ್ಸಿಕೊ + ಮಲೇಶಿಯಾ + ಮೊಜಾಂಬಿಕ್ + ನಮೀಬಿಯಾ + ನ್ಯೂ ಕ್ಯಾಲಿಡೋನಿಯಾ + ನೈಜರ್ + ನಾರ್‌ಫೋಕ್ ದ್ವೀಪ + ನೈಜೀರಿಯಾ + ನಿಕಾರಾಗುವಾ + ನೆದರ್‌ಲ್ಯಾಂಡ್ಸ್ + ನಾರ್ವೇ + ನೇಪಾಳ + ನೌರು + ನಿಯು + ನ್ಯೂಜಿಲೆಂಡ್ + ಓಮನ್ + ಪನಾಮಾ + ಪೆರು + ಫ್ರೆಂಚ್ ಪೋಲಿನೇಶಿಯಾ + ಪಪುವಾ ನ್ಯೂಗೀನಿಯಾ + ಫಿಲಿಫೈನ್ಸ್ + ಪಾಕಿಸ್ತಾನ + ಪೋಲ್ಯಾಂಡ್ + ಸೇಂಟ್ ಪಿಯರೆ ಮತ್ತು ಮಿಕೆಲನ್ + ಪಿಟ್‌ಕೈರ್ನ್ + ಪ್ಯೂರ್ಟೋ ರಿಕೊ + ಪ್ಯಾಲಿಸ್ಟೇನಿಯನ್ ಪ್ರದೇಶ + ಪೋರ್ಚುಗಲ್ + ಪಲಾವು + ಪರಾಗ್ವೇ + ಕತಾರ್ + ಔಟ್‌ಲೈಯಿಂಗ್ ಓಶಿಯಾನಿಯಾ + ಯುರೋಪಿಯನ್ ಯೂನಿಯನ್ + ರೀಯೂನಿಯನ್ + ರೊಮ್ಯಾನಿಯಾ + ಸೆರ್ಬಿಯಾ + ರಶಿಯಾ + ರುವಾಂಡಾ + ಸೌದಿ ಅರೇಬಿಯಾ + ಸೊಲೊಮನ್ ದ್ವೀಪಗಳು + ಸೀಶೆಲ್ಲೆಸ್ + ಸೂಡಾನ್ + ಸ್ವೀಡನ್ + ಸಿಂಗಪುರ + ಸೇಂಟ್ ಹೆಲೆನಾ + ಸ್ಲೋವೇನಿಯಾ + ಸ್ವಾಲ್ಬಾರ್ಡ್ ಮತ್ತು ಜಾನ್ ಮಾಯೆನ್ + ಸ್ಲೋವಾಕಿಯಾ + ಸಿಯೆರ್ರಾ ಲಿಯೋನ್ + ಸ್ಯಾನ್ ಮೆರಿನೋ + ಸೆನೆಗಲ್ + ಸೊಮಾಲಿಯಾ + ಸುರಿನಾಮ + ಸಾವೋ ಟೋಮ್ ಮತ್ತು ಪ್ರಿನ್ಸಿಪೆ + ಎಲ್ ಸಾಲ್ವೇಡಾರ್ + ಸಿರಿಯಾ + ಸ್ವಾಜಿಲ್ಯಾಂಡ್ + ಟರ್ಕ್ಸ್ ಮತ್ತು ಕೈಕೋಸ್ ದ್ವೀಪಗಳು + ಚಾಡ್ + ಫ್ರೆಂಚ್ ದಕ್ಷಿಣ ಪ್ರದೇಶಗಳು + ಟೋಗೋ + ಥೈಲ್ಯಾಂಡ್ + ತಜಾಕಿಸ್ಥಾನ್ + ಟೊಕೆಲಾವ್ + ಪೂರ್ವ ತಿಮೋರ್ + ತುರ್ಕಮೆನಿಸ್ಥಾನ್ + ಟುನಿಶಿಯಾ + ಟೊಂಗ + ಟರ್ಕಿ + ಟ್ರಿನಿಡಾಡ್ ಮತ್ತು ಟೊಬ್ಯಾಗೊ + ಟುವಾಲು + ಥೈವಾನ್ + ಟಾಂಜಾನಿಯಾ + ಉಕ್ರೈನ್ + ಉಗಾಂಡಾ + ಸಂಯುಕ್ತ ಸಂಸ್ಥಾನ ಮೈನರ್ ಔಟ್‌ಲೈಯಿಂಗ್ ದ್ವೀಪಗಳು + ಅಮೇರಿಕಾ ಸಂಯುಕ್ತ ಸಂಸ್ಥಾನ + ಉರುಗ್ವೇ + ಉಜ್ಬೇಕಿಸ್ಥಾನ್ + ವ್ಯಾಟಿಕನ್ + ಸೇಂಟ್ ವಿನ್ಸೆಂಟ್ ಮತ್ತು ಗ್ರೆನೆಡೈನ್ಸ್ + ವೆನೆಜುವೆಲಾ + ಬ್ರಿಟಿಷ್ ವರ್ಜಿನ್ ದ್ವೀಪಗಳು + ಯು.ಎಸ್. ವರ್ಜಿನ್ ದ್ವೀಪಗಳು + ವಿಯೇಟ್ನಾಮ್ + ವನೌಟು + ವಾಲಿಸ್ ಮತ್ತು ಫುಟುನಾ + ಸಮೋವಾ + ಯೆಮನ್ + ಮಯೊಟ್ಟೆ + ದಕ್ಷಿಣ ಆಫ್ರಿಕಾ + ಝಾಂಬಿಯಾ + ಜಿಂಬಾಬ್ವೆ + ಅಪರಿಚಿತ ಅಥವಾ ಅಮಾನ್ಯ ಪ್ರದೇಶ + + + + [಼ ಂ ಃ ೦-೯ ಅ-ಋ ೠ ಌ ೡ ಎ-ಐ ಒ-ನ ಪ-ಲ ವ-ಹ ಳ ೞ ಽ-ೄ ೆ-ೈ ೊ-್ ೕ ೖ] + + + ' + ' + " + " + + + + + + + + ಜನವರೀ + ಫೆಬ್ರವರೀ + ಮಾರ್ಚ್ + ಎಪ್ರಿಲ್ + ಮೆ + ಜೂನ್ + ಜುಲೈ + ಆಗಸ್ಟ್ + ಸಪ್ಟೆಂಬರ್ + ಅಕ್ಟೋಬರ್ + ನವೆಂಬರ್ + ಡಿಸೆಂಬರ್ + + + ಜನವರೀ + ಫೆಬ್ರವರೀ + ಮಾರ್ಚ್ + ಎಪ್ರಿಲ್ + ಮೆ + ಜೂನ್ + ಜುಲೈ + ಆಗಸ್ಟ್ + ಸಪ್ಟೆಂಬರ್ + ಅಕ್ಟೋಬರ್ + ನವೆಂಬರ್ + ಡಿಸೆಂಬರ್ + + + + + ಜ + ಫೆ + ಮಾ + ಎ + ಮೇ + ಜೂ + ಜು + ಆ + ಸೆ + ಅ + ನ + ಡಿ + + + + + + + ರ. + ಸೋ. + ಮಂ. + ಬು. + ಗು. + ಶು. + ಶನಿ. + + + ರವಿವಾರ + ಸೋಮವಾರ + ಮಂಗಳವಾರ + ಬುಧವಾರ + ಗುರುವಾರ + ಶುಕ್ರವಾರ + ಶನಿವಾರ + + + + + ರ + ಸೋ + ಮಂ + ಬು + ಗು + ಶು + ಶ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + ಒಂದು 1 + ಎರಡು 2 + ಮೂರು 3 + ನಾಲೃಕ 4 + + + + am + pm + + + ಈಸಪೂವ೯. + ಕ್ರಿಸ್ತ ಶಕ + + + BCE + CE + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + d-M-yy + + + + + + + hh:mm:ss a zzzz + + + + + hh:mm:ss a z + + + + + hh:mm:ss a + + + + + hh:mm a + + + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + knda + + ೦ + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + रु + + + + + + ಹೌದು + ಇಲ್ಲ:ಅಲ್ಲ + + + diff --git a/lib/zend/Zend/Locale/Data/kn_IN.xml b/lib/zend/Zend/Locale/Data/kn_IN.xml new file mode 100644 index 0000000000..b0dbd7676a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kn_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ko.xml b/lib/zend/Zend/Locale/Data/ko.xml new file mode 100644 index 0000000000..f16b45a108 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ko.xml @@ -0,0 +1,3853 @@ + + + + + + + + + + + {0}({1}) + , + + + 아파르어 + 압카즈어 + 아체어 + 아콜리어 + 아당메어 + 아닥헤어 + 아베스타어 + 남아공 공용어 + 아시아-아프리카어 (기타) + 아프리히리어 + 아이누어 + 아칸어 + 아카드어 + 알류트어 + 알공킨어족 + 남부 알타이어 + 암하라어 + 아라곤어 + 고대 영어 + 앙가어 + 아파치어 + 아랍어 + 아람어 + 아라우칸어 + 아라파호어 + 기계어 (기타) + 아라와크어 + 아샘어 + 아스투리아어 + 아타파스카어군 + 오스트레일리아어족 + 아바릭어 + 아와히어 + 아이마라어 + 아제르바이잔어 + 바슈키르어 + 반다어 + 바밀레케어족 + 발루치어 + 발리어 + 바사어 + 발트어 (기타) + 벨로루시어 + 베자어 + 벰바어 + 베르베르어 + 불가리아어 + 비하르어 + 호즈푸리어 + 비슬라마어 + 비콜어 + 비니어 + 식시카어 + 밤바라어 + 벵골어 + 반투어 + 티베트어 + 브르타뉴어 + 브라지어 + 보스니아어 + 바타크어 + 부리아타 + 부기어 + 브린어 + 카탈로니아어 + 카도어 + 중앙 아메리카 인디안어 (기타) + 카리브어 + 카프카스어 (기타) + 아삼어 + 체첸어 + 세부아노어 + 켈트어 (기타) + 차모로어 + 치브차어 + 차가타이어 + 추크어 + 마리어 + 치누크어와 영어 프랑스어의 혼성어 + 촉토어 + 치페우얀 + 체로키어 + 샤이엔어 + 참어군 + 코르시카어 + 콥트어 + 크리올어 및 피진어 (영어를 기반으로 한 기타) + 크리올어 및 피진어 (프랑스어를 기반으로 한 기타) + 크리올어 및 피진어 (포르투갈어를 기반으로 한 기타) + 크리어 + 크리민 터키어; 크리민 타타르어 + 크리올어 및 피진어 (기타) + 체코어 + 카슈비아어 + 교회 슬라브어 + 쿠시어족 + 추바시어 + 웨일스어 + 덴마크어 + 다코타어 + 다르그와어 + 다야크어 + 독일어 + 독일어 (오스트리아) + 고지 독일어 (스위스) + 델라웨어어 + 슬라브어 + 도그리브어 + 딩카어 + 도그리어 + 드라비다어 (기타) + 저지 소르비아어 + 드와라어 + 중세 네덜란드어 + 디베히어 + 드율라어 + 종카어 + 에웨어 + 이픽어 + 이집트어 (고대) + 이카죽어 + 그리스어 + 엘람어 + 영어 + 영어 (호주) + 영어 (캐나다) + 영어 (영국식) + 영어 (미국식) + 영어, 중세 (1100-1500) + 에스페란토어 + 스페인어 + 중남미 스페인어 + 스페인어 (이베리아) + 에스토니아어 + 바스크어 + 이원도어 + 페르시아어 + 팡그어 + 판티어 + 풀라어 + 핀란드어 + 필리핀어 + 피노우그리아어 (기타) + 피지어 + 페로어 + 폰어 + 프랑스어 + 프랑스어 (캐나다) + 프랑스어 (스위스) + 중세 프랑스어 + 고대 프랑스어 + 북부 프리슬란드어 + 동부 프리슬란드어 + 프리우리안어 + 프리지아어 + 아일랜드어 + 가어 + 가요어 + 그바야어 + 스코틀랜드 게일어 + 독일어 (기타) + 게이즈어 + 키리바시어 + 갈리시아어 + 중세 고지 독일어 + 과라니어 + 고대 고지 독일어 + 곤디어 + 고론탈로어 + 고트어 + 게르보어 + 그리스어, 고대 (1453년 까지) + 독일어 (스위스) + 구자라트어 + 맹크스어 + 그위친어 + 하우사어 + 하이다어 + 하와이어 + 히브리어 + 힌디어 + 헤리가뇬어 + 히마차리어 + 하타이트어 + 히몸어 + 히리 모투어 + 크로아티아어 + 고지 소르비아어 + 아이티어 + 헝가리어 + 후파어 + 아르메니아어 + 헤레로어 + 인테르링구아 (국제보조어협회) + 이반어 + 인도네시아어 + 인테르링구에 + 이그보어 + 쓰촨 이어 + 이조어 + 이누피아크어 + 이로코어 + 인도어 (기타) + 인도유럽어 (기타) + 인귀시어 + 이도어 + 이란어 [ira] + 이러쿼이어 + 아이슬란드어 + 이탈리아어 + 이눅티투트어 + 일본어 + 로반어 + 유대-페르시아어 + 유대-아라비아어 + 자바어 + 그루지야어 + 카라칼파크어 + 커바일어 + 카친어 + 캄바어 + 카렌어 + 카위어 + 카바르디어 + 코로어 + 콩고어 + 카시어 + 코이산어 (기타) + 호탄어 + 키쿠유어 + 쿠안야마어 + 카자흐어 + 그린란드어 + 캄보디아어 + 킴분두어 + 카나다어 + 한국어 + 코카니어 + 코스라이엔어 + 크펠레어 + 칸누리어 + 카라챠이-발카르어 + 카렐리야어 + 크루어 + 쿠르크어 + 카슈미르어 + 쿠르드어 + 쿠믹어 + 쿠테네어 + 코미어 + 콘월어 + 키르기스어 + 라틴어 + 라디노어 + 라한다어 + 람바어 + 룩셈부르크어 + 레즈기안어 + 간다어 + 림버거어 + 링갈라어 + 라오어 + 몽구어 + 로지어 + 리투아니아어 + 루바-카탄가어 + 루바-룰루아어 + 루이세노어 + 룬다어 + 루오어 + 루샤이어 + 라트비아어 + 마두라어 + 마가히 + 마이틸리 + 마카사어 + 만딩고어 + 남도어 + 마사이어 + 모크샤어 + 만다르어 + 멘데어 + 마다가스카르어 + 아일랜드어, 중세 (900-1200) + 마셜제도어 + 마오리어 + 미크맥어 + 미낭카바우 + 기타 언어 + 마케도니아어 + 몬크메르어 (기타) + 말라얄람어 + 몽고어 + 만주어 + 마니푸리어 + 마노보어 + 몰도바어 + 모호크어 + 모시어 + 마라티어 + 말레이어 + 몰타어 + 다중 언어 + 문다어 + 크리크어 + 미란데어 + 마르와리어 + 버마어 + 마야어 + 엘즈야어 + 나우루어 + 나우아틀어 + 북아메리카 인디언어 (기타) + 나폴리어 + 보크말 노르웨이어 + 은데벨레어(북부) + 저지 독일어 + 네팔어 + 네와르어 + 느동가어 + 니아스어 + 니제르 - 코르도파니아어 (기타) + 니웨언어 + 네덜란드어 + 플라망어 + 노르웨이어(니노르스크) + 노르웨이어 + 노가이어 + 노르웨이, 고대 + 응코어 + 은데벨레어(남부) + 소토어 (북부) + 누비안어 + 나바호어 + 네와르어 (고전) + 니안자어; 치츄어; 츄어 + 니암웨지어 + 니안콜어 + 뉴로어 + 느지마어 + 오크어 + 오지브웨이어 + 오로모어 (아판) + 오리야어 + 오세트어 + 오세이지어 + 터키어, 오스만 (1500-1928) + 오토미안어 + 펀잡어 + 파푸아어 (기타) + 판가시난어 + 팔레비어 + 팜팡가어 + 파피아먼토어 + 파라우안어 + 고대 페르시아어 + 필리핀어 (기타) + 페니키아어 + 팔리어 + 폴란드어 + 폼페이어 + 프라크리트어 + 고대 프로방스어 + 파시토어 (푸시토) + 포르투갈어 + 포르투갈어 (브라질) + 포르투갈어 (이베리아) + 케추아어 + 라자스탄어 + 라파뉴이 + 라로통가어 + 레토로만어 + 룬디어 + 루마니아어 + 로망스어 (기타) + 집시어 + 어근 + 러시아어 + 아로마니아어 + 르완다어 + 산스크리트어 + 산다웨어 + 야큐트어 + 남아메리카 인디언어 (기타) + 샐리시어어 + 사마리아 아랍어 + 사사크어 + 산탈리어 + 사르디니아어 + 시칠리아어 + 스코틀랜드어 + 신디어 + 북부 사미어 + 셀쿠프어 + 셈어 (기타) + 산고어 + 아일랜드, 고대 (900년 까지) + 수화 + 세르비아-크로아티아어 + 샨어 + 스리랑카어 + 시다모어 + 수족어 + 중국 티베트 어족 + 슬로바키아어 + 슬로베니아어 + 슬라브어 (기타) + 사모아어 + 남부 사미어 + 사미어 (기타) + 룰레 사미어 + 이나리 사미어 + 스콜트 사미어 + 쇼나어 + 소닌케어 + 소말리아어 + 소그디엔어 + 송가이족어 + 알바니아어 + 세르비아어 + 스라난 통가어 + 세레르어 + 시스와티어 + 니로-사하람어 (기타) + 소토어 (남부) + 순다어 + 수쿠마족어 + 수수어 + 수메르어 + 스웨덴어 + 스와힐리어 + 시리아어 (고전) + 시리아어 + 타밀어 + 태국어 (기타) + 텔루구어 + 팀니어 + 테레노어 + 테툼어 + 타지키스탄어 + 태국어 + 티그리냐어 + 티그레어 + 티비어 + 투르크멘어 + 토켈라우제도어 + 타갈로그어 + 클링온어 + 틀링깃족어 + 타마섹어 + 세츠와나어 + 통가어 + 통가어 (니아살랜드) + 토크 피신어 + 터키어 + 총가어 + 트심시안어 + 타타르어 + 툼부카어 + 투피어 + 알타이제어 (기타) + 투발루어 + 트위어 + 타히티어 + 투비니안어 + 우드말트어 + 위구르어 + 유가리틱어 + 우크라이나어 + 윤번두어 + 결정되지않음 + 우르두어 + 우즈베크어 + 바이어 + 벤다어 + 베트남어 + 볼라퓌크어 + 보틱어 + 왈론어 + 와카샨어 + 와라모어 + 와라이어 + 와쇼어 + 소르브어 + 올로프어 + 칼미크어 + 코사어 + 야오족어 + 얍페세어 + 이디시어 + 요루바어 + 야픽어 + 주앙어 + 사포테크어 + 블리스 심볼 + 제나가어 + 중국어 + 중국어(간체) + 중국어 (번체) + 아잔데족어 + 줄루어 + 주니어 + 자자어 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 세계 + 아프리카 + 북아메리카 + 남아메리카[남미] + 오세아니아, 대양주 + 서아프리카 + 중앙 아메리카 + 동부 아프리카 + 북부 아프리카 + 중부 아프리카 + 남부 아프리카 + 아메리카 대륙 + 북부 아메리카 + 카리브 해 제도 + 동아시아 + 남아시아 + 동남 아시아 + 남유럽 + 오스트레일리아와 뉴질랜드 + 멜라네시아 + 미크로네시아 지역 + 폴리네시아 + 중남 아시아 + 아시아 + 중앙 아시아 + 서아시아 + 유럽 + 동유럽 + 북유럽 + 서유럽 + 독립 국가 연합 + 라틴 아메리카 및 카리브 해 제도 + 안도라 + 아랍에미리트 연합 + 아프가니스탄 + 앤티가 바부다 + 안길라 + 알바니아 + 아르메니아 + 네덜란드령 안틸레스 + 앙골라 + 남극 대륙 + 아르헨티나 + 아메리칸 사모아 + 오스트리아 + 오스트레일리아 + 아루바 + 올란드 제도 + 아제르바이잔 + 보스니아 헤르체고비나 + 바베이도스 + 방글라데시 + 벨기에 + 부르키나파소 + 불가리아 + 바레인 + 부룬디 + 베냉 + 생 바르텔르미 + 버뮤다 + 브루나이 + 볼리비아 + 브라질 + 바하마 + 부탄 + 부베 + 보츠와나 + 벨라루스 + 벨리즈 + 캐나다 + 코코스제도 + 콩고 민주공화국 + 중앙 아프리카 공화국 + 콩고 + 스위스 + 코트디부아르 + 쿡제도 + 칠레 + 카메룬 + 중국 + 콜롬비아 + 코스타리카 + 세르비아 및 몬테네그로 + 쿠바 + 까뽀베르데 + 크리스마스섬 + 사이프러스 + 체코 + 독일 + 지부티 + 덴마크 + 도미니카 + 도미니카 공화국 + 알제리 + 에콰도르 + 에스토니아 + 이집트 + 서사하라 + 에리트리아 + 스페인 + 이디오피아 + 핀란드 + 피지 + 포클랜드 군도 + 미크로네시아 + 페로제도 + 프랑스 + 가봉 + 영국 + 그레나다 + 그루지야 + 프랑스령 기아나 + 건지 + 가나 + 지브롤터 + 그린란드 + 감비아 + 기니 + 과달로프 + 적도 기니 + 그리스 + 사우스조지아-사우스샌드위치제도 + 과테말라 + 괌 + 기네비쏘 + 가이아나 + 홍콩, 중국 특별행정구 + 허드섬-맥도널드제도 + 온두라스 + 크로아티아 + 아이티 + 헝가리 + 인도네시아 + 아일랜드 + 이스라엘 + 맨 섬 + 인도 + 영국령인도양식민지 + 이라크 + 이란 + 아이슬란드 + 이탈리아 + 저지 + 자메이카 + 요르단 + 일본 + 케냐 + 키르기스스탄 + 캄보디아 + 키리바시 + 코모로스 + 세인트크리스토퍼 네비스 + 조선 민주주의 인민 공화국 + 대한민국 + 쿠웨이트 + 케이맨제도 + 카자흐스탄 + 라오스 + 레바논 + 세인트루시아 + 리히텐슈타인 + 스리랑카 + 라이베리아 + 레소토 + 리투아니아 + 룩셈부르크 + 라트비아 + 리비아 + 모로코 + 모나코 + 몰도바 + 몬테네그로 + 생 마르탱 + 마다가스카르 + 마샬 군도 + 마케도니아 + 말리 + 미얀마 + 몽골 + 마카오, 중국 특별행정구 + 북마리아나제도 + 말티니크 + 모리타니 + 몬트세라트 + 몰타 + 모리셔스 + 몰디브 + 말라위 + 멕시코 + 말레이시아 + 모잠비크 + 나미비아 + 뉴 칼레도니아 + 니제르 + 노퍽섬 + 나이지리아 + 니카라과 + 네덜란드 + 노르웨이 + 네팔 + 나우루 + 니우에 + 뉴질랜드 + 오만 + 파나마 + 페루 + 프랑스령 폴리네시아 + 파푸아뉴기니 + 필리핀 + 파키스탄 + 폴란드 + 세인트피에르-미케롱 + 핏케언섬 + 푸에르토리코 + 팔레스타인 지구 + 포르투갈 + 팔라우 + 파라과이 + 카타르 + 오세아니아 외곽 + 유럽 연합 + 리유니온 + 루마니아 + 세르비아 + 러시아 + 르완다 + 사우디아라비아 + 솔로몬 제도 + 쉐이쉘 + 수단 + 스웨덴 + 싱가포르 + 세인트헬레나 + 슬로베니아 + 스발바르제도-얀마웬섬 + 슬로바키아 + 시에라리온 + 산마리노 + 세네갈 + 소말리아 + 수리남 + 상투메 프린시페 + 엘살바도르 + 시리아 + 스와질랜드 + 터크스케이커스제도 + 차드 + 프랑스 남부 지방 + 토고 + 태국 + 타지키스탄 + 토켈라우 + 동티모르 + 투르크메니스탄 + 튀니지 + 통가 + 터키 + 트리니다드 토바고 + 투발루 + 대만 + 탄자니아 + 우크라이나 + 우간다 + 미국령 해외 제도 + 미국 + 우루과이 + 우즈베키스탄 + 바티칸 + 세인트빈센트그레나딘 + 베네수엘라 + 영국령 버진 아일랜드 + 미국령 버진 아일랜드 + 베트남 + 바누아투 + 왈리스-푸투나 제도 + 사모아 + 예멘 + 마요티 + 남아프리카 + 잠비아 + 짐바브웨 + 알수없거나 유효하지 않은 지역 + + + 표준 레지아어 철자법 + 독일어 철자법 (1996년) + 후기 중세 프랑스어 + 동아르메니아어 + 통합 투르크어 라틴 알파벳 + 산조르지오/빌라 방언 + 분틀링어 + 나티소네 방언 + 니바 방언 + 개정 + 레지아어 + 스코틀랜드 표준 영어 + 발렌시아어 + + + 달력 + 정렬 + 통화 + + + 중국어 번체 정렬 순서 - Big5 + 불교력 + 중국력 + 순서 + 중국어 간체 정렬 순서 - GB2312 + 태양력 + 히브리력 + 인도력 + 이슬람력 + 이슬람 상용력 + 일본력 + 전화번호부순 + 병음순 + 대만력 + 자획순 + 전통 역법 + + + US + 미터법 + + + 언어: {0} + 스크립트: {0} + 지역: {0} + + + + [가 각 간 갇-갊 감-갗 같-객 갠 갤 갬 갭 갯-갱 갸 갹 갼 걀 걋 걍 걔 걘 걜 거 걱 건 걷 걸 걺 검 겁 것-겆 겉-게 겐 겔 겜 겝 겟-겡 겨-겪 견 겯 결 겸 겹 겻-경 곁 계 곈 곌 곕 곗 고 곡 곤 곧 골 곪 곬 곯-곱 곳 공 곶 과 곽 관 괄 괆 괌 괍 괏 광 괘 괜 괠 괩 괬 괭 괴 괵 괸 괼 굄 굅 굇 굉 교 굔 굘 굡 굣 구 국 군 굳-굶 굻-굽 굿 궁 궂 궈 궉 권 궐 궜 궝 궤 궷 귀 귁 귄 귈 귐 귑 귓 규 균 귤 그 극 근 귿-긁 금 급 긋 긍 긔 기 긱 긴 긷 길 긺 김 깁 깃 깅 깆 깊 까-깎 깐 깔 깖 깜 깝 깟-깡 깥 깨 깩 깬 깰 깸 깹 깻-깽 꺄 꺅 꺌 꺼-꺾 껀 껄 껌 껍 껏-껑 께 껙 껜 껨 껫 껭 껴 껸 껼 꼇 꼈 꼍 꼐 꼬 꼭 꼰 꼲 꼴 꼼 꼽 꼿 꽁-꽃 꽈 꽉 꽐 꽜 꽝 꽤 꽥 꽹 꾀 꾄 꾈 꾐 꾑 꾕 꾜 꾸 꾹 꾼 꿀 꿇-꿉 꿋 꿍 꿎 꿔 꿜 꿨 꿩 꿰 꿱 꿴 꿸 뀀 뀁 뀄 뀌 뀐 뀔 뀜 뀝 뀨 끄 끅 끈 끊 끌 끎 끓-끕 끗 끙 끝 끼 끽 낀 낄 낌 낍 낏 낑 나-낚 난 낟-낢 남 납 낫-낯 낱 낳-낵 낸 낼 냄 냅 냇-냉 냐 냑 냔 냘 냠 냥 너 넉 넋 넌 널 넒 넓 넘 넙 넛-넝 넣-넥 넨 넬 넴 넵 넷-넹 녀 녁 년 녈 념 녑 녔 녕 녘 녜 녠 노 녹 논 놀 놂 놈 놉 놋 농 높-놔 놘 놜 놨 뇌 뇐 뇔 뇜 뇝 뇟 뇨 뇩 뇬 뇰 뇹 뇻 뇽 누 눅 눈 눋 눌 눔 눕 눗 눙 눠 눴 눼 뉘 뉜 뉠 뉨 뉩 뉴 뉵 뉼 늄 늅 늉 느 늑 는 늘-늚 늠 늡 늣 능 늦 늪 늬 늰 늴 니 닉 닌 닐 닒 님 닙 닛 닝 닢 다-닦 단 닫-닯 닳-답 닷-닻 닿-댁 댄 댈 댐 댑 댓-댕 댜 더-덖 던 덛 덜 덞 덟 덤 덥 덧 덩 덫 덮 데 덱 덴 델 뎀 뎁 뎃-뎅 뎌 뎐 뎔 뎠 뎡 뎨 뎬 도 독 돈 돋 돌 돎 돐 돔 돕 돗 동 돛 돝 돠 돤 돨 돼 됐 되 된 될 됨 됩 됫 됴 두 둑 둔 둘 둠 둡 둣 둥 둬 뒀 뒈 뒝 뒤 뒨 뒬 뒵 뒷 뒹 듀 듄 듈 듐 듕 드 득 든 듣 들 듦 듬 듭 듯 등 듸 디 딕 딘 딛 딜 딤 딥 딧-딪 따 딱 딴 딸 땀 땁 땃-땅 땋-땍 땐 땔 땜 땝 땟-땡 떠 떡 떤 떨 떪 떫 떰 떱 떳-떵 떻-떽 뗀 뗄 뗌 뗍 뗏-뗑 뗘 뗬 또 똑 똔 똘 똥 똬 똴 뙈 뙤 뙨 뚜 뚝 뚠 뚤 뚫 뚬 뚱 뛔 뛰 뛴 뛸 뜀 뜁 뜅 뜨 뜩 뜬 뜯 뜰 뜸 뜹 뜻 띄 띈 띌 띔 띕 띠 띤 띨 띰 띱 띳 띵 라 락 란 랄 람 랍 랏-랒 랖-랙 랜 랠 램 랩 랫-랭 랴 략 랸 럇 량 러 럭 런 럴 럼 럽 럿-렁 렇-렉 렌 렐 렘 렙 렛 렝 려 력 련 렬 렴 렵 렷-령 례 롄 롑 롓 로 록 론 롤 롬 롭 롯 롱 롸 롼 뢍 뢨 뢰 뢴 뢸 룀 룁 룃 룅 료 룐 룔 룝 룟 룡 루 룩 룬 룰 룸 룹 룻 룽 뤄 뤘 뤠 뤼 뤽 륀 륄 륌 륏 륑 류 륙 륜 률 륨 륩 륫 륭 르 륵 른 를 름 릅 릇 릉 릊 릍 릎 리 릭 린 릴 림 립 릿 링 마 막 만 많-맒 맘 맙 맛 망 맞 맡 맣-맥 맨 맬 맴 맵 맷-맺 먀 먁 먈 먕 머 먹 먼 멀 멂 멈 멉 멋 멍 멎 멓-멕 멘 멜 멤 멥 멧-멩 며 멱 면 멸 몃-명 몇 몌 모 목 몫 몬 몰 몲 몸 몹 못 몽 뫄 뫈 뫘 뫙 뫼 묀 묄 묍 묏 묑 묘 묜 묠 묩 묫 무-묶 문 묻-묾 뭄 뭅 뭇 뭉 뭍 뭏 뭐 뭔 뭘 뭡 뭣 뭬 뮈 뮌 뮐 뮤 뮨 뮬 뮴 뮷 므 믄 믈 믐 믓 미 믹 민 믿 밀 밂 밈 밉 밋-밍 및 밑 바-반 받-밟 밤 밥 밧 방 밭 배 백 밴 밸 뱀 뱁 뱃-뱅 뱉 뱌 뱍 뱐 뱝 버 벅 번 벋 벌 벎 범 법 벗 벙 벚 베 벡 벤 벧 벨 벰 벱 벳-벵 벼 벽 변 별 볍 볏-병 볕 볘 볜 보-볶 본 볼 봄 봅 봇 봉 봐 봔 봤 봬 뵀 뵈 뵉 뵌 뵐 뵘 뵙 뵤 뵨 부 북 분 붇-붊 붐 붑 붓 붕 붙 붚 붜 붤 붰 붸 뷔 뷕 뷘 뷜 뷩 뷰 뷴 뷸 븀 븃 븅 브 븍 븐 블 븜 븝 븟 비 빅 빈 빌 빎 빔 빕 빗 빙-빛 빠 빡 빤 빨 빪 빰 빱 빳-빵 빻-빽 뺀 뺄 뺌 뺍 뺏-뺑 뺘 뺙 뺨 뻐 뻑 뻔 뻗 뻘 뻠 뻣-뻥 뻬 뼁 뼈 뼉 뼘 뼙 뼛-뼝 뽀 뽁 뽄 뽈 뽐 뽑 뽕 뾔 뾰 뿅 뿌 뿍 뿐 뿔 뿜 뿟 뿡 쀼 쁑 쁘 쁜 쁠 쁨 쁩 삐 삑 삔 삘 삠 삡 삣 삥 사 삭 삯 산 삳-삶 삼 삽 삿-상 샅 새 색 샌 샐 샘 샙 샛-생 샤 샥 샨 샬 샴 샵 샷 샹 섀 섄 섈 섐 섕 서-선 섣 설 섦 섧 섬 섭 섯-성 섶 세 섹 센 셀 셈 셉 셋-셍 셔 셕 션 셜 셤 셥 셧-셩 셰 셴 셸 솅 소-솎 손 솔 솖 솜 솝 솟 송 솥 솨 솩 솬 솰 솽 쇄 쇈 쇌 쇔 쇗 쇘 쇠 쇤 쇨 쇰 쇱 쇳 쇼 쇽 숀 숄 숌 숍 숏 숑 수 숙 순 숟 술 숨 숩 숫 숭 숯 숱 숲 숴 쉈 쉐 쉑 쉔 쉘 쉠 쉥 쉬 쉭 쉰 쉴 쉼 쉽 쉿 슁 슈 슉 슐 슘 슛 슝 스 슥 슨 슬 슭 슴 습 슷 승 시 식 신 싣 실 싫-십 싯 싱 싶 싸 싹 싻 싼 쌀 쌈 쌉 쌌 쌍 쌓-쌕 쌘 쌜 쌤 쌥 쌨 쌩 썅 써 썩 썬 썰 썲 썸 썹 썼 썽 쎄 쎈 쎌 쏀 쏘 쏙 쏜 쏟 쏠 쏢 쏨 쏩 쏭 쏴 쏵 쏸 쐈 쐐 쐤 쐬 쐰 쐴 쐼 쐽 쑈 쑤 쑥 쑨 쑬 쑴 쑵 쑹 쒀 쒔 쒜 쒸 쒼 쓩 쓰 쓱 쓴 쓸 쓺 쓿-씁 씌 씐 씔 씜 씨 씩 씬 씰 씸 씹 씻 씽 아 악 안-않 알-앎 앓-압 앗-앙 앝 앞 애 액 앤 앨 앰 앱 앳-앵 야 약 얀 얄 얇 얌 얍 얏 양 얕 얗 얘 얜 얠 얩 어 억 언 얹 얻-얾 엄-엊 엌 엎 에 엑 엔 엘 엠 엡 엣 엥 여-엮 연 열 엶 엷 염-영 옅-예 옌 옐 옘 옙 옛 옜 오 옥 온 올-옮 옰 옳-옵 옷 옹 옻 와 왁 완 왈 왐 왑 왓-왕 왜 왝 왠 왬 왯 왱 외 왹 왼 욀 욈 욉 욋 욍 요 욕 욘 욜 욤 욥 욧 용 우 욱 운 울-욺 움 웁 웃 웅 워 웍 원 월 웜 웝 웠 웡 웨 웩 웬 웰 웸 웹 웽 위 윅 윈 윌 윔 윕 윗 윙 유 육 윤 율 윰 윱 윳 융 윷 으 윽 은 을 읊 음 읍 읏 응-의 읜 읠 읨 읫 이 익 인 일-읾 잃-입 잇-잊 잎 자 작 잔 잖-잘 잚 잠 잡 잣-잦 재 잭 잰 잴 잼 잽 잿-쟁 쟈 쟉 쟌 쟎 쟐 쟘 쟝 쟤 쟨 쟬 저 적 전 절 젊 점 접 젓 정 젖 제 젝 젠 젤 젬 젭 젯 젱 져 젼 졀 졈 졉 졌 졍 졔 조 족 존 졸 졺 좀 좁 좃 종-좇 좋-좍 좔 좝 좟 좡 좨 좼 좽 죄 죈 죌 죔 죕 죗 죙 죠 죡 죤 죵 주 죽 준 줄-줆 줌 줍 줏 중 줘 줬 줴 쥐 쥑 쥔 쥘 쥠 쥡 쥣 쥬 쥰 쥴 쥼 즈 즉 즌 즐 즘 즙 즛 증 지 직 진 짇 질 짊 짐 집 짓 징 짖 짙 짚 짜 짝 짠 짢 짤 짧 짬 짭 짯-짱 째 짹 짼 쨀 쨈 쨉 쨋-쨍 쨔 쨘 쨩 쩌 쩍 쩐 쩔 쩜 쩝 쩟-쩡 쩨 쩽 쪄 쪘 쪼 쪽 쫀 쫄 쫌 쫍 쫏 쫑 쫓 쫘 쫙 쫠 쫬 쫴 쬈 쬐 쬔 쬘 쬠 쬡 쭁 쭈 쭉 쭌 쭐 쭘 쭙 쭝 쭤 쭸 쭹 쮜 쮸 쯔 쯤 쯧 쯩 찌 찍 찐 찔 찜 찝 찡 찢 찧-착 찬 찮 찰 참 찹 찻-찾 채 책 챈 챌 챔 챕 챗-챙 챠 챤 챦 챨 챰 챵 처 척 천 철 첨 첩 첫-청 체 첵 첸 첼 쳄 쳅 쳇 쳉 쳐 쳔 쳤 쳬 쳰 촁 초 촉 촌 촐 촘 촙 촛 총 촤 촨 촬 촹 최 쵠 쵤 쵬 쵭 쵯 쵱 쵸 춈 추 축 춘 출 춤 춥 춧 충 춰 췄 췌 췐 취 췬 췰 췸 췹 췻 췽 츄 츈 츌 츔 츙 츠 측 츤 츨 츰 츱 츳 층 치 칙 친 칟-칡 침 칩 칫 칭 카 칵 칸 칼 캄 캅 캇 캉 캐 캑 캔 캘 캠 캡 캣-캥 캬 캭 컁 커 컥 컨 컫 컬 컴 컵 컷-컹 케 켁 켄 켈 켐 켑 켓 켕 켜 켠 켤 켬 켭 켯-켱 켸 코 콕 콘 콜 콤 콥 콧 콩 콰 콱 콴 콸 쾀 쾅 쾌 쾡 쾨 쾰 쿄 쿠 쿡 쿤 쿨 쿰 쿱 쿳 쿵 쿼 퀀 퀄 퀑 퀘 퀭 퀴 퀵 퀸 퀼 큄 큅 큇 큉 큐 큔 큘 큠 크 큭 큰 클 큼 큽 킁 키 킥 킨 킬 킴 킵 킷 킹 타 탁 탄 탈 탉 탐 탑 탓-탕 태 택 탠 탤 탬 탭 탯-탱 탸 턍 터 턱 턴 털 턺 텀 텁 텃-텅 테 텍 텐 텔 템 텝 텟 텡 텨 텬 텼 톄 톈 토 톡 톤 톨 톰 톱 톳 통 톺 톼 퇀 퇘 퇴 퇸 툇 툉 툐 투 툭 툰 툴 툼 툽 툿 퉁 퉈 퉜 퉤 튀 튁 튄 튈 튐 튑 튕 튜 튠 튤 튬 튱 트 특 튼 튿 틀 틂 틈 틉 틋 틔 틘 틜 틤 틥 티 틱 틴 틸 팀 팁 팃 팅 파-팎 판 팔 팖 팜 팝 팟-팡 팥 패 팩 팬 팰 팸 팹 팻-팽 퍄 퍅 퍼 퍽 펀 펄 펌 펍 펏-펑 페 펙 펜 펠 펨 펩 펫 펭 펴 편 펼 폄 폅 폈 평 폐 폘 폡 폣 포 폭 폰 폴 폼 폽 폿 퐁 퐈 퐝 푀 푄 표 푠 푤 푭 푯 푸 푹 푼 푿 풀 풂 품 풉 풋 풍 풔 풩 퓌 퓐 퓔 퓜 퓟 퓨 퓬 퓰 퓸 퓻 퓽 프 픈 플 픔 픕 픗 피 픽 핀 필 핌 핍 핏 핑 하 학 한 할 핥 함 합 핫 항 해 핵 핸 핼 햄 햅 햇-행 햐 향 허 헉 헌 헐 헒 험 헙 헛 헝 헤 헥 헨 헬 헴 헵 헷 헹 혀 혁 현 혈 혐 협 혓-형 혜 혠 혤 혭 호 혹 혼 홀 홅 홈 홉 홋 홍 홑 화 확 환 활 홧 황 홰 홱 홴 횃 횅 회 획 횐 횔 횝 횟 횡 효 횬 횰 횹 횻 후 훅 훈 훌 훑 훔 훗 훙 훠 훤 훨 훰 훵 훼 훽 휀 휄 휑 휘 휙 휜 휠 휨 휩 휫 휭 휴 휵 휸 휼 흄 흇 흉 흐 흑 흔 흖-흙 흠 흡 흣 흥 흩 희 흰 흴 흼 흽 힁 히 힉 힌 힐 힘 힙 힛 힝] + [丘 串 乃 久 乖 九 乞 乫 乾 亂 亘 交 京 仇 今 介 件 价 企 伋 伎 伽 佳 佶 侃 來 侊 供 係 俓 俱 個 倞 倦 倨 假 偈 健 傀 傑 傾 僅 僑 價 儆 儉 儺 光 克 兢 內 公 共 其 具 兼 冀 冠 凱 刊 刮 券 刻 剋 剛 劇 劍 劒 功 加 劤 劫 勁 勍 勘 勤 勸 勻 勾 匡 匣 區 南 卦 却 卵 卷 卿 厥 去 及 口 句 叩 叫 可 各 吉 君 告 呱 呵 咎 咬 哥 哭 啓 喀 喇 喝 喫 喬 嗜 嘉 嘔 器 囊 困 固 圈 國 圭 圻 均 坎 坑 坤 坰 坵 垢 基 埼 堀 堅 堈 堪 堺 塊 塏 境 墾 壙 壞 夔 奇 奈 奎 契 奸 妓 妗 姑 姜 姦 娘 娜 嫁 嬌 孔 季 孤 宏 官 客 宮 家 寄 寇 寡 寬 尻 局 居 屆 屈 岐 岡 岬 崎 崑 崗 嵌 嵐 嶇 嶠 工 巧 巨 己 巾 干 幹 幾 庚 庫 康 廊 廐 廓 廣 建 弓 强 彊 徑 忌 急 怪 怯 恐 恝 恪 恭 悸 愆 感 愧 愷 愾 慊 慣 慤 慨 慶 慷 憩 憬 憾 懃 懇 懦 懶 懼 戈 戒 戟 戡 扱 技 抉 拉 拏 拐 拒 拘 括 拮 拱 拳 拷 拿 捏 据 捲 捺 掘 掛 控 揀 揆 揭 擊 擎 擒 據 擧 攪 攷 改 攻 故 敎 救 敢 敬 敲 斛 斤 旗 旣 昆 昑 景 晷 暇 暖 暠 暻 曠 曲 更 曷 朗 朞 期 机 杆 杞 杰 枏 果 枯 架 枸 柑 柩 柬 柯 校 根 格 桀 桂 桔 桿 梏 梗 械 梱 棄 棋 棍 棘 棨 棺 楗 楠 極 槁 構 槐 槨 槪 槻 槿 樂 橄 橋 橘 機 檄 檎 檢 櫃 欄 權 欺 款 歌 歐 歸 殼 毆 毬 氣 求 江 汨 汲 決 汽 沂 沽 洛 洸 浪 涇 淃 淇 減 渠 渴 湳 溝 溪 滑 滾 漑 潔 潰 澗 激 濫 灌 灸 炅 炚 炬 烙 烱 煖 爛 牽 犬 狂 狗 狡 狼 獗 玖 玘 珂 珏 珖 珙 珞 珪 球 琦 琨 琪 琯 琴 瑾 璂 璟 璣 璥 瓊 瓘 瓜 甄 甘 甲 男 畇 界 畸 畺 畿 疆 疥 疳 痂 痙 痼 癎 癩 癸 皆 皎 皐 盖 監 看 眷 睾 瞰 瞼 瞿 矜 矩 矯 硅 硬 碁 碣 磎 磬 磯 磵 祁 祇 祈 祛 祺 禁 禽 科 稈 稼 稽 稿 穀 究 穹 空 窘 窟 窮 窺 竅 竟 竭 競 竿 筋 筐 筠 箇 箕 箝 管 簡 粳 糠 系 糾 紀 納 紘 級 紺 絅 結 絞 給 絳 絹 絿 經 綱 綺 緊 繫 繭 繼 缺 罐 罫 羅 羈 羌 羔 群 羹 翹 考 耆 耉 耕 耭 耿 肌 肝 股 肩 肯 肱 胛 胱 脚 脛 腔 腱 膈 膏 膠 臘 臼 舅 舊 舡 艮 艱 芎 芥 芩 芹 苛 苟 苦 苽 茄 莖 菅 菊 菌 菓 菫 菰 落 葛 葵 蓋 蕎 蕨 薑 藁 藍 藿 蘭 蘿 虔 蚣 蛟 蝎 螺 蠟 蠱 街 衢 衲 衾 衿 袈 袞 袴 裙 裸 褐 襁 襟 襤 見 規 覡 覲 覺 觀 角 計 記 訣 訶 詭 誇 誡 誥 課 諫 諾 謙 講 謳 謹 譏 警 譴 谷 谿 豈 貢 貫 貴 賈 購 赳 起 跏 距 跨 踞 蹇 蹶 躬 軀 車 軌 軍 軻 較 輕 轎 轟 辜 近 迦 迲 适 逑 逕 逵 過 遣 遽 邏 那 邯 邱 郊 郎 郡 郭 酪 醵 金 鈐 鈞 鉀 鉅 鉗 鉤 銶 鋸 鋼 錡 錤 錦 錮 鍋 鍵 鎌 鎧 鏡 鑑 鑒 鑛 開 間 閘 閣 閨 闕 關 降 階 隔 隙 雇 難 鞏 鞠 鞨 鞫 頃 頸 顆 顧 飢 餃 館 饉 饋 饑 駒 駕 駱 騎 騏 騫 驅 驕 驚 驥 骨 高 鬼 魁 鮫 鯤 鯨 鱇 鳩 鵑 鵠 鷄 鷗 鸞 麒 麴 黔 鼓 龕 龜] + [a-z] + + + ‘ + ’ + “ + ” + + + + + 오전 + 오후 + + + 불기 + + + + + + G y년 MMMM d일 EEEE + + + + + G y년 MMMM d일 + + + + + + + + + 오전 + 오후 + + + 오전 + 오후 + + + + + + 1월 + 2월 + 3월 + 4월 + 5월 + 6월 + 7월 + 8월 + 9월 + 10월 + 11월 + 12월 + + + + + 1월 + 2월 + 3월 + 4월 + 5월 + 6월 + 7월 + 8월 + 9월 + 10월 + 11월 + 12월 + + + + + + + 일 + 월 + 화 + 수 + 목 + 금 + 토 + + + 일요일 + 월요일 + 화요일 + 수요일 + 목요일 + 금요일 + 토요일 + + + + + 일 + 월 + 화 + 수 + 목 + 금 + 토 + + + + + + + 1분기 + 2분기 + 3분기 + 4분기 + + + 제 1/4분기 + 제 2/4분기 + 제 3/4분기 + 제 4/4분기 + + + + + 1 + 2 + 3 + 4 + + + + 오전 + 오후 + + + 서력기원전 + 서력기원 + + + 기원전 + 서기 + + + + + + y년 M월 d일 EEEE + + + + + y년 M월 d일 + + + + + yyyy. M. d. + + + + + yy. M. d. + + + + + + + a hh시 mm분 ss초 zzzz + + + + + a hh시 mm분 ss초 z + + + + + a h:mm:ss + + + + + a h:mm + + + + + + + {1}{0} + + + + + {1}{0} + + + + + {1} {0} + + + + + {1} {0} + + + + d일 EEE + d일 (E) + HH:mm + HH:mm:ss + H:mm + H시 m분 s초 + L + M. d. (E) + LLL + MMM d일 (E) + MMMM d일 (E) + MMMM d일 + MMM d일 + MM. dd + M. d. + d + mm:ss + mm:ss + y + yyyy. M. + yyyy. M. d. EEE + y년 MMM + y년 MMM d일 EEE + y년 MMMM + y년 Q분기 + y년 QQQ + YY. M. + yy년 MMM + yy년 Q분기 + yyyy. MM + + + {0} – {1} + + M월 ~ M월 + + + M. d E ~ M. d E + M. d E ~ M. d E + + + MMM ~ MMM + + + M월 d일 E ~ M월 d일 E + M월 d일 E ~ d일 E + + + LLLL-LLLL + + + M월 d일 ~ M월 d일 + M월 d일 ~ d일 + + + M. d ~ M. d + M. d ~ M. d + + + d일 ~ d일 + + + a h ~ a h + a h~h + + + a h:mm ~ a h:mm + a h:mm~h:mm + a h:mm~h:mm + + + a h:mm ~ a h:mm v + a h:mm~h:mm v + a h:mm~h:mm v + + + a h ~ a h v + a h~h v + + + y년 ~ y년 + + + yyyy. M ~ yyyy. M + yyyy. M ~ yyyy. M + + + yy. M. d. E ~ yy. M. d. E + yy. M. d. E ~ yy. M. d. E + yy. M. d. E ~ yy. M. d. E + + + y년 M월~M월 + y년 M월 ~ y년 M월 + + + y년 M월 d일 E ~ M월 d일 E + y년 M월 d일 E ~ d일 E + y년 M월 d일 E ~ y년 M월 d일 E + + + y년 MM월 ~ MM월 + y년 MM월 ~ y년 MM월 + + + y년 M월 d일 ~ M월 d일 + y년 M월 d일~d일 + y년 M월 d일 ~ y년 M월 d일 + + + yy. M. d. ~ yy. M. d. + yy. M. d. ~ yy. M. d. + yy. M. d. ~ yy. M. d. + + + + + + 연호 + + + 년 + + + 월 + + + 주 + + + 일 + 그끄제 + 그저께 + 어제 + 오늘 + 내일 + 모레 + 3일후 + + + 요일 + + + 오전/오후 + + + 시 + + + 분 + + + 초 + + + 시간대 + + + + + 오전 + 오후 + + + 오전 + 오후 + + + 오전 + 오후 + + + 오전 + 오후 + + + 중화민국전 + 중화민국 + + + + + + G y년 M월 d일 + + + + + G y년 M월 d일 + + + + + G y. M. d + + + + + G y. M. d + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} 시간 + {1} ({0}) + + 알 수 없는 장소 + + + 안도라 + + + 두바이 + + + 카불 + + + 안티과 + + + 앙귈라 + + + 티라나 + + + 예레반 + + + 쿠라사오 + + + 루안다 + + + 로데라 + + + 파머 + + + 남극 + + + 쇼와 + + + 모슨 + + + 데이비스 + + + 보스토크 + + + 케이시 + + + 뒤몽 뒤르빌 + + + 맥머도 + + + 리오 가예고스 + + + 멘도사 + + + 산후안 + + + 우수아이아 + + + 라 리오하 + + + 산루이스 + + + 카타마르카 + + + 살타 + + + 후후이 + + + 뚜꾸만 + + + 코르도바 + + + 부에노스 아이레스 + + + 파고파고 + + + 비엔나 + + + 퍼스 + + + 유클라 + + + 다윈 + + + 애들레이드 + + + 브로컨힐 + + + 퀴리 + + + 멜버른 + + + 호바트 + + + 린데만 + + + 시드니 + + + 브리스베인 + + + 로드 하우 + + + 아루바 + + + 바쿠 + + + 바베이도스 + + + 다카 + + + 브뤼셀 + + + 와가두구 + + + 소피아 + + + 바레인 + + + 부줌부라 + + + 포르토노보 + + + 버뮤다 + + + 브루나이 + + + 라파스 + + + 아이루네페 + + + 리오 브랑코 + + + 포르토 벨로 + + + 보아 비스타 + + + 마나우스 + + + 쿠이아바 + + + 산타렘 + + + 캄포 그란데 + + + 벨렘 + + + 아라과이나 + + + 상파울로 + + + 바히아 + + + 포르탈레자 + + + 마세이오 + + + 레시페 + + + 노롱야 + + + 나소 + + + 팀부 + + + 가보로네 + + + 민스크 + + + 벨리즈 + + + 도슨 + + + 화이트호스 + + + 이누빅 + + + 벤쿠버 + + + 도슨크릭 + + + 옐로나이프 + + + 에드먼턴 + + + 스위프트커런트 + + + 케임브리지 베이 + + + 리자이나 + + + 위니펙 + + + 리졸루트 + + + 레이니강 + + + 랭킹 인렛 + + + 코랄하버 + + + 선더베이 + + + 니피곤 + + + 토론토 + + + 몬트리올 + + + 이칼루이트 + + + 팡니르퉁 + + + 몽턴 + + + 핼리팩스 + + + 구즈베이 + + + 글라스베이 + + + 블랑 사블롱 + + + 세인트존 + + + 코코스 + + + 킨샤사 + + + 루붐바시 + + + 방기 + + + 브라자빌 + + + 취리히 + + + 아비장 + + + 라로통가 + + + 이스터 섬 + + + 산티아고 + + + 두알라 + + + 카슈가르 + + + 우루무치 + + + 충칭 + + + 상하이 + + + 하얼빈 + + + 보고타 + + + 코스타리카 + + + 하바나 + + + 카보 베르데 + + + 크리스마스 + + + 니코시아 + + + 베를린 + + + 지부티 + + + 코펜하겐 + + + 도미니카 + + + 산토도밍고 + + + 알제 + + + 갈라파고스 + + + 과야킬 + + + 탈린 + + + 카이로 + + + 엘아이운 + + + 아스메라 + + + 카나리아 제도 + + + 세우타 + + + 마드리드 + + + 아디스아바바 + + + 헬싱키 + + + 피지 + + + 스탠리 + + + 트루크 + + + 포나페 + + + 코스레 + + + 페로 + + + 파리 + + + 리브르빌 + + + 런던 + + + 그라나다 + + + 트빌리시 + + + 샤이엔 + + + 아크라 + + + 지브랄타 + + + 툴레 + + + 고드호프 + + + 스코레스바이선드 + + + 덴마크샤븐 + + + 반줄 + + + 코나크리 + + + 과델로프 + + + 말라보 + + + 아테네 + + + 남부 조지아 + + + 과테말라 + + + 괌 + + + 비사우 + + + 가이아나 + + + 홍콩 + + + 포르토프랭스 + + + 부다페스트 + + + 자카르타 + + + 폰티아나크 + + + 마카사르 + + + 자야푸라 + + + 더블린 + + + 예루살렘 + + + 차고스 + + + 바그다드 + + + 테헤란 + + + 레이캬비크 + + + 로마 + + + 자메이카 + + + 암만 + + + 도쿄 + + + 나이로비 + + + 비슈케크 + + + 프놈펜 + + + 엔더베리 + + + 키리티마티 + + + 타라와 + + + 코모로 + + + 세인트 키츠 + + + 평양 + + + 서울 + + + 쿠웨이트 + + + 카이만 + + + 아크타우 + + + 오랄 + + + 악토브 + + + 키질로르다 + + + 알마티 + + + 비엔티안 + + + 베이루트 + + + 세인트 루시아 + + + 파두츠 + + + 콜롬보 + + + 몬로비아 + + + 마세루 + + + 빌니우스 + + + 룩셈부르크 + + + 리가 + + + 트리폴리 + + + 카사블랑카 + + + 모나코 + + + 키시나우 + + + 안타나나리보 + + + 콰잘렌 + + + 마주로 + + + 바마코 + + + 랑군 + + + 호브드 + + + 울란바토르 + + + 초이발산 + + + 마카오 + + + 사이판 + + + 마티니크 + + + 누악쇼트 + + + 몬세라 + + + 몰타 + + + 모리셔스 + + + 몰디브 + + + 블랜타이어 + + + 티후아나 + + + 에르모시요 + + + 마사틀란 + + + 치와와 + + + 몬테레이 + + + 멕시코 시티 + + + 메리다 + + + 칸쿤 + + + 쿠알라룸푸르 + + + 쿠칭 + + + 마푸토 + + + 빈트후크 + + + 누메아 + + + 니아메 + + + 노퍽 + + + 라고스 + + + 마나과 + + + 암스텔담 + + + 오슬로 + + + 카트만두 + + + 나우루 + + + 니우에 + + + 채텀 + + + 오클랜드 + + + 무스카트 + + + 파나마 + + + 리마 + + + 타히티 + + + 마퀘사스 + + + 감비어 + + + 포트모르즈비 + + + 마닐라 + + + 카라치 + + + 바르샤바 + + + 미퀠론 + + + 피트카이른 + + + 푸에르토리코 + + + 가자 + + + 아조레스 + + + 마데이라 + + + 리스본 + + + 팔라우 + + + 아순시온 + + + 카타르 + + + 불령 리유니온 + + + 부쿠레슈티 + + + 칼리닌그라드 + + + 모스크바 + + + 볼고그라트 + + + 사마라 + + + 예카테린부르크 + + + 옴스크 + + + 노보시비르스크 + + + 크라스노야르스크 + + + 이르쿠츠크 + + + 야쿠츠크 + + + 블라디보스토크 + + + 사할린 + + + 마가단 + + + 캄차카 + + + 아나디리 + + + 키갈리 + + + 리야드 + + + 과달카날 + + + 마헤 + + + 카르툼 + + + 스톡홀름 + + + 싱가포르 + + + 세인트 헬레나 + + + 프리타운 + + + 다카르 + + + 모가디슈 + + + 파라마리보 + + + 사오 투메 + + + 엘살바도르 + + + 다마스쿠스 + + + 음바바네 + + + 그랜드 터크 + + + 엔자메나 + + + 케르켈렌 + + + 로메 + + + 방콕 + + + 두샨베 + + + 파카오푸 + + + 딜리 + + + 아쉬가바트 + + + 튀니스 + + + 통가타푸 + + + 이스탄불 + + + 포트오브스페인 + + + 푸나푸티 + + + 타이베이 + + + 다르에스살람 + + + 우주고로트 + + + 키예프 + + + 심페로폴 + + + 자포로지예 + + + 캄팔라 + + + 미드웨이 + + + 존스톤 + + + 웨이크 + + + 에이닥 + + + 놈 + + + 호놀룰루 + + + 앵커리지 + + + 야쿠타트 + + + 주노 + + + 로스앤젤레스 + + + 보이시 + + + 피닉스 + + + 십록 + + + 덴버 + + + 노스 다코타주, 뉴살렘 + + + 중부, 노스다코타 + + + 시카고 + + + 메노미니 + + + 인디아나주, 뱅센 + + + 인디애나주, 피츠버그 + + + 인디아나주, 텔시티 + + + 인디애나주 녹스 + + + 인디아나주, 워너맥 + + + 인디애나주, 마렝고 + + + 인디애나폴리스 + + + 루이빌 + + + 자포로제 + + + 켄터키주, 몬티첼로 + + + 디트로이트 + + + 뉴욕 + + + 몬테비데오 + + + 사마르칸트 + + + 타슈켄트 + + + 세인트 빈센트 + + + 카라카스 + + + 토르톨라 + + + 세인트 토마스 + + + 사이공 + + + 에파테 + + + 월리스 + + + 아피아 + + + 아덴 + + + 메요트 + + + 요하네스버그 + + + 루사카 + + + 하라레 + + + + 아크레 표준시 + 아크레 하계 표준시 + + + ACT (아크레) + ACST (아크레) + + + + + 중앙아프리카 시간 + + + + + 동아프리카 시간 + + + + + 남아프리카 시간 + 남아프리카 표준시 + + + + + 서아프리카 시간 + 서아프리카 하계 표준시 + + + + + 알래스카 표준시 + 알래스카 하계 표준시 + + + + + 아마존 표준시 + 아마존 하계 표준시 + + + + + 중부 표준시 + 중부 표준시 + 미 중부 하계 표준시 + + + CST + CDT + + + + + 동부 표준시 + 동부 표준시 + 미 동부 하계 표준시 + + + EST + EDT + + + + + 산지 표준시 + 산악 표준시 + 미 산지 하계 표준시 + + + MST + MDT + + + + + 태평양 표준시 + 태평양 표준시 + 미 태평양 하계 표준시 + + + PST + PDT + + + + + AQTT (아크타우) + AQTST (아크타우) + + + + + AQTT (악퇴베) + AQTST (악퇴베) + + + + + 아라비아 시간 + 아라비아 표준시 + 아라비아 하계 표준시 + + + AT(아라비아) + AST(아라비아) + ADT(아라비아) + + + + + 대서양 표준시 + 대서양 표준시 + 미 대서양 하계 표준시 + + + AST + ADT + + + + + 중앙 오스트레일리아 시간 + 오스트레일리아 중부 표준시 + 오스트레일리아 중부 하계 표준시 + + + + + 오스트레일리아 중서부 시간 + 오스트레일리아 중서부 표준시 + 오스트레일리아 중서부 하계 표준시 + + + + + 동부 오스트레일리아 시간 + 오스트레일리아 동부 표준시 + 오스트레일리아 동부 하계 표준시 + + + + + 서부 오스트레일리아 시간 + 오스트레일리아 서부 표준시 + 오스트레일리아 서부 하계 표준시 + + + + + 아조레스 표준시 + 아조레스 하계 표준시 + + + + + BST (베링) + BDT (베링) + + + + + 브라질리아 표준시 + 브라질리아 하계 표준시 + + + + + 카보 베르데 표준시 + 카보 베르데 하계 표준시 + + + + + 차모로 시간 + 차모로 표준시 + + + + + 채텀 표준시 + 채텀 하계 표준시 + + + + + 중국 표준시 + 중국 하계 표준시 + + + CST (중국) + CDT (중국) + + + + + 크리스마스섬 표준시 + + + + + 코코스섬 표준시 + + + + + 쿡제도 표준시 + 쿡제도 하계 표준시 + + + + + CST (쿠바) + CDT (쿠바) + + + + + 데이비스 표준시 + + + + + 뒤몽 뒤르빌 표준시 + + + + + 이스터섬 표준시 + 이스터섬 하계 표준시 + + + + + 중부유럽 표준시 + 중부유럽 하계 표준시 + + + + + 동부유럽 표준시 + 동부유럽 하계 표준시 + + + + + 서부 유럽 시간 + 서부 유럽 하계 표준시 + + + + + 포클랜드 표준시 + 포클랜드 하계 표준시 + + + + + 피지 표준시 + 피지 하계 표준시 + + + + + 프랑스령 남쪽식민지 표준시 + + + + + 그리니치 표준시 + + + + + 갈라파고스 표준시 + + + + + GST (괌) + + + + + 홍콩 시간 + 홍콩 하계 표준시 + + + + + 인도 표준시 + + + + + 영국령 인도양 식민지 표준시 + + + + + 인도차이나 시간 + + + + + 중앙인도네시아 시간 + + + + + 동인도네시아 시간 + + + + + 서인도네시아 시간 + + + + + 이스라엘 표준시 + 이스라엘 하계 표준시 + + + IST (이스라엘) + + + + + 일본 표준시 + 일본 하계 표준시 + + + + + 한국 표준시 + 한국 하계 표준시 + + true + + + + 로드 하우 시간 + 로드 하우 표준시 + 로드 하우 하계 표준시 + + + + + 몰디브 표준시 + + + + + 모리셔스 표준시 + + + + + 모슨 표준시 + + + + + 모스크바 표준시 + 모스크바 하계 표준시 + + + + + 뉴질랜드 시간 + 뉴질랜드 표준시 + 뉴질랜드 하계 표준시 + + + + + 뉴펀들랜드 표준시 + 뉴펀들랜드 하계 표준시 + + + + + 리유니온 표준시 + + + + + 로데라 표준시 + + + + + SAMT (사마르칸트) + SAMST (사마르칸트) + + + + + 세이셸 표준시 + + + + + 사우스 조지아 표준시 + + + GST (사우스 조지아) + + + + + 쇼와 표준시 + + + + + 보스토크 표준시 + + + + + + + . + , + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + {0} {1} + + + + 안도라 페세타 + + + 아랍에미리트 디르함 + + + 아프가니 (1927-2002) + + + 아프가니 + + + 알바니아 레크 + + + 아르메니아 드람 + + + 네덜란드령 안틸레스 길더 + + + 앙골라 콴자 + + + 앙골라 콴자 (1977-1990) + + + 앙골라 신콴자 (1990-2000) + + + 앙골라 콴자 Reajustado (1995-1999) + + + 아르헨티나 오스트랄 + + + 아르헨티나 페소 (1983-1985) + + + 아르헨티나 페소 + + + 호주 실링 + + + 호주 달러 + + + 아루바 길더 + + + 아제르바이젠 마나트(1993-2006) + + + 아제르바이잔 마나트 + + + 보스니아-헤르체고비나 디나르 + + + 보스니아-헤르체고비나 태환 마르크 + + + 바베이도스 달러 + + + 방글라데시 타카 + + + 벨기에 프랑 (태환) + + + 벨기에 프랑 + + + 벨기에 프랑 (금융) + + + 불가리아 동전 렛 + + + 불가리아 신권 렛 + + + 바레인 디나르 + + + 부룬디 프랑 + + + 버뮤다 달러 + + + 부루나이 달러 + + + 볼리비아노 + + + 볼리비아노 페소 + + + 볼리비아노 Mvdol(기금) + + + 볼리비아노 크루제이루 노보 (1967-1986) + + + 브라질 크루자두 + + + 브라질 크루제이루 (1990-1993) + + + 브라질 레알 + + + 브라질 크루자두 노보 + + + 브라질 크루제이루 + + + 바하마 달러 + + + 부탄 눌투눔 + + + 버마 차트 + + + 보츠와나 폴라 + + + 벨라루스 신권 루블 (1994-1999) + + + 벨라루스 루블 + + + 벨리즈 달러 + + + 캐나다 달러 + + + 콩고 프랑 콩골라스 + + + WIR 유로 + + + 스위스 프랑 + + + WIR 프랑 + + + 칠레 UF (Unidades de Fomento) + + + 칠레 페소 + + + 중국 위안 인민폐 + ¥ + + + 콜롬비아 페소 + + + UVR (Unidad de Valor Real) + + + 코스타리카 콜론 + + + 고 세르비아 디나르 + + + 체코슬로바키아 동전 코루나 + + + 쿠바 페소 + + + 카보베르데 에스쿠도 + + + 싸이프러스 파운드 + + + 체코 공화국 코루나 + + + 동독 오스트마르크 + + + 독일 마르크 + + + 지부티 프랑 + + + 덴마크 크로네 + + + 도미니카 페소 + + + 알제리 디나르 + + + 에쿠아도르 수크레 + + + 에콰도르 UVC(Unidad de Valor Constante) + + + 에스토니아 크룬 + + + 이집트 파운드 + + + 에리트리아 나크파 + + + 스페인 페세타(예금) + + + 스페인 페세타(변환 예금) + + + 스페인 페세타 + + + 이디오피아 비르 + + + 유로화 + + + 핀란드 마르카 + + + 피지 달러 + + + 포클랜드제도 파운드 + + + 프랑스 프랑 + + + 영국령 파운드 스털링 + + + 그루지야 지폐 라리트 + + + 그루지야 라리 + + + 가나 시디 (1979-2007) + + + 가나 시디 + + + 지브롤터 파운드 + + + 감비아 달라시 + + + 기니 프랑 + + + 기니 시리 + + + 적도 기니 에쿨 (Ekwele) + + + 그리스 드라크마 + + + 과테말라 케트살 + + + 포르투갈령 기니 에스쿠도 + + + 기네비쏘 페소 + + + 가이아나 달러 + + + 홍콩 달러 + + + 온두라스 렘피라 + + + 크로아티아 디나르 + + + 크로아티아 쿠나 + + + 하이티 구르드 + + + 헝가리 포린트 + + + 인도네시아 루피아 + + + 아일랜드 파운드 + + + 이스라엘 파운드 + + + 이스라엘 신권 세켈 + + + 인도 루피 + + + 이라크 디나르 + + + 이란 리얄 + + + 아이슬란드 크로나 + + + 이탈리아 리라 + ₤ + + + 자메이카 달러 + + + 요르단 디나르 + + + 일본 엔화 + ¥ + + + 케냐 실링 + + + 키르기스스탄 솜 + + + 캄보디아 리얄 + + + 코모르 프랑 + + + 조선 민주주의 인민 공화국 원 + ₩ + + + 대한민국 원 + ₩ + + + 쿠웨이트 디나르 + + + 케이맨 제도 달러 + + + 카자흐스탄 텐게 + + + 라오스 키프 + + + 레바논 파운드 + + + 스리랑카 루피 + + + 라이베리아 달러 + + + 레소토 로티 + + + 리투아니아 리타 + + + 룩셈부르크 타로나 + + + 룩셈부르크 변환 프랑 + + + 룩셈부르크 프랑 + + + 룩셈부르크 재정 프랑 + + + 라트비아 라트 + + + 라트비아 루블 + + + 리비아 디나르 + + + 모로코 디렘 + + + 모로코 프랑 + + + 몰도바 레이 + + + 마다가스카르 아리아리 + + + 마다가스카르 프랑 + + + 마케도니아 디나르 + + + 말리 프랑 + + + 미얀마 키얏 + + + 몽골 투그릭 + + + 마카오 파타카 + + + 모리타니 우기야 + + + 몰타 리라 + + + 몰타 파운드 + + + 모리셔스 루피 + + + 몰디브 제도 루피아 + + + 말라위 콰쳐 + + + 멕시코 페소 + + + 멕시코 실버 페소 (1861-1992) + + + 멕시코 UDI(Unidad de Inversion) + + + 말레이시아 링깃 + + + 모잠비크 에스쿠도 + + + 고 모잠비크 메티칼 + + + 모잠비크 메티칼 + + + 나미비아 달러 + + + 니제르 나이라 + + + 니카라과 코르도바 + + + 니카라과 코르도바 오로 + + + 네델란드 길더 + + + 노르웨이 크로네 + + + 네팔 루피 + + + 뉴질랜드 달러 + + + 오만 리얄 + + + 파나마 발보아 + + + 페루 인티 + + + 페루 솔 누에보 + + + 페루 솔 + + + 파푸아뉴기니 키나 + + + 필리핀 페소 + + + 파키스탄 루피 + + + 폴란드 즐로티 + + + 폴란드 즐로티 (1950-1995) + + + 포르투갈 에스쿠도 + + + 파라과이 과라니 + + + 카타르 리얄 + + + 로디지아 달러 + + + 루마니아 레이 + + + 루마니아 레우 + + + 세르비아 디나르 + + + 러시아 루블 + + + 러시아 루블 (1991-1998) + + + 르완다 프랑 + + + 사우디아라비아 리얄 + + + 솔로몬 제도 달러 + + + 세이쉴 루피 + + + 수단 디나르 + + + 수단 파운드 + + + 고 수단 파운드 + + + 스웨덴 크로나 + + + 싱가폴 달러 + + + 세인트헬레나 파운드 + + + 슬로베니아 톨라르 + + + 슬로바키아 코루나 + + + 시에라리온 리온 + + + 소말리아 실링 + + + 수리남 달러 + + + 수리남 길더 + + + 상투메 프린시페 도브라 + + + 소련 루블 + + + 엘살바도르 콜론 + + + 시리아 파운드 + + + 스와질란드 릴랑게니 + + + 태국 바트 + + + 타지키스탄 루블 + + + 타지키스탄 소모니 + + + 투르크메니스탄 마나트 + + + 튀니지 디나르 + + + 통가 파앙가 + + + 티모르 에스쿠도 + + + 터키 리라 + + + 신 터키 리라 + + + 트리니다드 토바고 달러 + + + 대만 신권 달러 + + + 탄자니아 실링 + + + 우크라이나 그리브나 + + + 우크라이나 카보바네츠 + + + 우간다 실링 (1966-1987) + + + 우간다 실링 + + + 미국 달러 + + + 미국 달러(다음날) + + + 미국 달러(당일) + + + 우루과이 페소 UI (Unidades Indexadas) + + + 우루과이 페소 (1975-1993) + + + 우루과이 페소 우루과요 + + + 우즈베키스탄 숨 + + + 베네주엘라 볼리바르 + + + 베네주엘라 볼리바르 푸에르떼 + + + 베트남 동 + + + 바누아투 바투 + + + 서 사모아 탈라 + + + CFA 프랑 BEAC + + + 은화 + + + 금 + + + 유르코 (유럽 회계 단위) + + + 유럽 통화 동맹 + + + 유럽 계산 단위 (XBC) + + + 유럽 계산 단위 (XBD) + + + 동카리브 달러 + + + 특별인출권 + + + 유럽 환율 단위 + + + 프랑스 Gold 프랑 + + + 프랑스 UIC-프랑 + + + CFA 프랑 BCEAO + + + 팔라듐 + + + CFP 프랑 + + + 백금 + + + RINET 기금 + + + 테스트 통화 코드 + + + 알수없거나 유효하지않은 통화단위 + + + 예멘 디나르 + + + 예멘 리알 + + + 유고슬라비아 동전 디나르 + + + 유고슬라비아 노비 디나르 + + + 유고슬라비아 전환 디나르 + + + 남아프리카 랜드 (금융) + + + 남아프리카 랜드 + + + 쟘비아 콰쳐 + + + 자이르 신권 자이르 + + + 자이르 자이르 + + + 짐바브웨 달러 + + + + + + {0}일 + + + {0}시간 + + + {0}분 + + + {0}개월 + + + {0}초 + + + {0}주 + + + {0}년 + + + + + 예 + 아니오 + + + + diff --git a/lib/zend/Zend/Locale/Data/ko_KR.xml b/lib/zend/Zend/Locale/Data/ko_KR.xml new file mode 100644 index 0000000000..851be11737 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ko_KR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/kok.xml b/lib/zend/Zend/Locale/Data/kok.xml new file mode 100644 index 0000000000..3631221107 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kok.xml @@ -0,0 +1,363 @@ + + + + + + + + + + + अफार + अबखेज़ियन + अफ्रिकान्स + अमहारिक् + अरेबिक् + असामी + ऐमरा + अज़रबैजानी + बष्किर + बैलोरुसियन् + बल्गेरियन + बीहारी + बिसलमा + बंगाली + तिबेतियन + ब्रेटन + कटलान + कोर्शियन + ज़ेक् + वेळ्ष् + डानिष + जर्मन + भूटानी + ग्रीक् + आंग्ल + इस्परान्टो + स्पानिष + इस्टोनियन् + बास्क + पर्षियन् + फिन्निष् + फिजी + फेरोस् + फ्रेन्च + फ्रिशियन् + ऐरिष + स्काटस् गेलिक् + गेलीशियन + गौरानी + गुजराती + हौसा + हेब्रु + हिन्दी + क्रोयेषियन् + हंगेरियन् + आर्मीनियन् + इन्टरलिंग्वा + इन्डोनेषियन + इन्टरलिंग् + इनूपेयाक् + आईस्लान्डिक + इटालियन + इन्युकट्ट + जापनीस् + जावनीस् + जार्जियन् + कज़ख् + ग्रीनलान्डिक + कंबोडियन + कन्नडा + कोरियन् + कोंकणी + कश्मीरी + कुर्दिष + किर्गिज़ + लाटिन + लिंगाला + लाओतियन् + लिथुआनियन् + लाट्वियन् (लेट्टिष्) + मलागसी + माओरी + मसीडोनियन् + मळियाळम + मंगोलियन् + मोल्डावियन् + मराठी + मलय + मालतीस् + बर्मीज़् + नौरो + नेपाळी + डच् + नोर्वेजियन + ओसिटान् + ओरोमो (अफान) + ओरिया + पंजाबी + पोलिष + पाष्टो (पुष्टो) + पोर्चुगीज़् + क्वेच्वा + रहटो-रोमान्स् + किरुन्दी + रोमानियन् + रष्यन् + किन्यार्वान्डा + संस्कृत + सिंधी + सांग्रो + सेर्बो-क्रोयेषियन् + सिन्हलीस् + स्लोवाक + स्लोवेनियन् + समोन + शोना + सोमाळी + आल्बेनियन् + सेर्बियन् + सिस्वाती + सेसोथो + सुंदनीस + स्वीदीष + स्वाहिली + तमिळ + तेलुगू + तजिक + थाई + तिग्रिन्या + तुर्कमन + तगालोग + सेत्स्वाना + तोंगा + तुर्किष + त्सोगा + तटार + त्वि + उधूर + युक्रेनियन् + उर्दू + उज़बेक + वियत्नामीज़ + ओलापुक + उलोफ़ + झ़ौसा + इद्दिष् + यूरुबा + झ्हुन्ग + चीनीस् + जुलू + + + भारत + + + + [़ ँ-ः ०-९ ॐ अ-ऍ ए-ऑ ओ-क {क़} ख {ख़} ग {ग़} घ-ज {ज़} झ-ड {ड़} ढ {ढ़} ण-न प फ {फ़} ब-य {य़} र ल ळ व-ह ऽ-ॅ े-ॉ ो-्] + [\u200C \u200D] + + + + + + + + जानेवारी + फेबृवारी + मार्च + एप्रिल + मे + जून + जुलै + ओगस्ट + सेप्टेंबर + ओक्टोबर + नोव्हेंबर + डिसेंबर + + + जानेवारी + फेब्रुवारी + मार्च + एप्रिल + मे + जून + जुलै + ओगस्ट + सेप्टेंबर + ओक्टोबर + नोव्हेंबर + डिसेंबर + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + रवि + सोम + मंगळ + बुध + गुरु + शुक्र + शनि + + + आदित्यवार + सोमवार + मंगळार + बुधवार + गुरुवार + शुक्रवार + शनिवार + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + म.पू. + म.नं. + + + क्रिस्तपूर्व + क्रिस्तशखा + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + dd-MM-yyyy + + + + + d-M-yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + भारतीय समय + + true + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + रु + + + + diff --git a/lib/zend/Zend/Locale/Data/kok_IN.xml b/lib/zend/Zend/Locale/Data/kok_IN.xml new file mode 100644 index 0000000000..c77c996c35 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kok_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/kpe.xml b/lib/zend/Zend/Locale/Data/kpe.xml new file mode 100644 index 0000000000..b2666a4a5a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kpe.xml @@ -0,0 +1,184 @@ + + + + + + + + + + [a b ɓ d e ə ɛ f g ĝ {gb} {gw} ɣ h-k {kp} {kw} l-n {ny} ɲ ŋ {ŋw} o ɔ p t-w y z] + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BCE + CE + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + $ + + + + diff --git a/lib/zend/Zend/Locale/Data/kpe_GN.xml b/lib/zend/Zend/Locale/Data/kpe_GN.xml new file mode 100644 index 0000000000..7779d2b940 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kpe_GN.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + L$ + + + + diff --git a/lib/zend/Zend/Locale/Data/kpe_LR.xml b/lib/zend/Zend/Locale/Data/kpe_LR.xml new file mode 100644 index 0000000000..4be308c42c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/kpe_LR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ku.xml b/lib/zend/Zend/Locale/Data/ku.xml new file mode 100644 index 0000000000..33aa9ec207 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ku.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + ئه‌فریكای + ئه‌مهه‌رینجی + عه‌ره‌بی + ئا سسامی (زوبان) + ئازه‌ربایجانی + بێلاڕووسی + بۆلگاری + بیهاری + به‌نگلادێشی + برێتونی + بۆسنی + كاتالۆنی + چه‌كی + وێلزی + دانماركی + ئاڵمانی + یۆنانی + ئینگلیزی + ئێسپیرانتۆ + ئیسپانی + ئیستۆنی + باسكی + فارسی + فینله‌ندی + تاگالۆگی + فه‌رئۆیی + فه‌رانسی + فریسی + ئیرله‌ندی + گه‌لیكی سكۆتله‌ندی + گالیسی + گووارانی + گوجاراتی + هیبرێ + هیندی + كرواتی + هه‌نگاری (مه‌جاری) + ئه رمه نی + ئینترلینگوی + ئێه‌ندونیزی + ئه نته ر لينگ (زوبان) + ئیسله‌ندی + ئیتالی + ژاپۆنی + جاڤانی + گۆرجستانی + کامبۆجی (زوبان) + كه‌نه‌دایی + كۆری + كوردی + كرگیزی + لاتینی + لينگالا + لاو‏ى + لیتوانی + لێتۆنی + ماكێدۆنی + مالایلام + مه‌نگۆلی + ماراتی + مالیزی + ماڵتایی + نێپالی + هۆڵه‌ندی + نۆروێژی + ئۆسیتانی + ئۆرییا + په‌نجابی + پۆڵۆنیایی (له‌هستانی) + په‌شتوو + پۆرتۆگالی + پورتوگاڵی (برازیل) + پورتوگاڵی (پورتوگاڵ) + ڕۆمانی + ڕووسی + سانسکريت + سيندی(زوبان) + سێربۆكرواتی + سینهه‌لی + سلۆڤاكی + سلۆڤێنی + سۆمالی + ئاڵبانی + سه‌ربی + سێسۆتۆ + سودانی + سویدی + سواهیلی + تامیلی + ته‌لۆگوی + تایله‌ندی + تیگرینیای + تروكمانی + كلینگۆن + توركی + توی + ئويخووری + ئۆكراینی + ئۆردو‌و + ئۆزبه‌كی + ڤیه‌تنامی + سسوسا + یوددی + زولو + + + + + + + [ئ-ب پ ت ج چ ح-د ر ز ڕ ژ س ش ع غ ف ڤ ق ک گ ل ڵ م-ه ھ و ۆ ی ێ] + [\u064B-\u0652 ء-ة ث ذ ص-ظ ك ى ي] + + + + + + + + یەکشەممە + دووشەممە + سێشەممە + چوارشەممە + + + یەکشەممە + دووشەممە + سێشەممە + چوارشەممە + + + + + ی + د + س + + + + + + Q yy + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ku_Arab.xml b/lib/zend/Zend/Locale/Data/ku_Arab.xml new file mode 100644 index 0000000000..2c0981ad4e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ku_Arab.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + Cîhan + Tirkiye + + + salname + rêzkirin + + + mîladî + hîcrî + + + + + + + [a-c ç d e ê f-i î j-s ş t u û v-z] + + + + + + + + çil + sib + adr + nîs + gul + hez + tîr + + + çile + sibat + adar + nîsan + gulan + hezîran + + + + + ç + s + a + n + g + h + + + + + + + yş + dş + sş + çş + pş + în + ş + + + yekşem + duşem + şê + çarşem + pêncşem + în + şemî + + + + + y + d + s + ç + p + î + ş + + + + + + + Ç1 + Ç2 + Ç3 + Ç4 + + + Ç1 + Ç2 + Ç3 + Ç4 + + + + BN + PN + + + BZ + PZ + + + + + + yy/MM/dd + + + + + + sal + + + meh + + + hefte + + + roj + + + demjimêr + + + xulek + + + çirke + + + + + + + + muẖerem + sefer + rebîʿulewel + rebîʿulaxer + cemazîyelewel + cemazîyelaxer + receb + şeʿban + remezan + şewal + zîlqeʿde + zîlẖece + + + + + + + + + erê:e + na:n + + + diff --git a/lib/zend/Zend/Locale/Data/ku_Latn_TR.xml b/lib/zend/Zend/Locale/Data/ku_Latn_TR.xml new file mode 100644 index 0000000000..24c2e0fd58 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ku_Latn_TR.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + + + + mokili mobimba + Afríka + Ameríka ya Sídi + Afríka ya límbe + Afríka ya Nola + Afríka ya Sídi + Azía + Erópa + Erópa ya Nola + Erópa ya límbe + Andora + Afganistáni + Antigua mpé Barbuda + Angóla + Argentina + Albania + Bosnia na Erzegovina + Bángaladɛ́si + Bɛ́ljika + Burkina Faso + Bulgaria + Burundi + Bresíli + Butáni + Botswana + Bielorusia + Kanadá + Kongó-Kinsásá + Santrafríka + Kongó-Brazzaville + Swisi + Kamerun + Sína + Republiki Sheki + Alémani + Djibuti + Aljeria + Ejipti + Sahara ya límbe + Espania + Etiopya + Finilanda + Falansia + Ingɛlɛ́tɛlɛ + Ghana + Gibraltar + Gambia + Gine + Gresi + Gine-Bisau + Kroasia + Ungri + Indoneziá + Irlandí + Ɛndɛ + Islandi + Italia + Zordaní + Yapan + Kenya + Kirghizistáni + KI + Kore ya Nola + Kore ya Sidi + Kazakstáni + Liban + Liberia + Litwani + Luksamburg + Letoni + Libíya + Masedoni + Mali + Mongolí + Makau + Madívi + Mozambíki + Namibia + Nijé + Nijeria + Holanda + Norvej + Nepáli + Pakistáni + Poloni + Pulutugal + Rumania + Rusí + Rwanda + Sudani + Swési + Santu Helena + Santu Marino + Somalia + Sǎo Tomé na Principe + Sirí + Togo + Tazikistáni + Turkmenistáni + Tunizia + Turkí + Trinidad mpé Tobago + Taiwan + Etazíni + Uzbekistáni + Vatikáni + Vietnami + Yeméni + Sidafríka + Zambia + Zimbabwe + Esíká eyébámí tɛ́ + + + manáka + elandiseli + mbɔ́ngɔ + + + manáka ya Gregor + + + na míli + na mɛ́tɛlɛ + + + + [a á â ǎ b-e é ê ě ɛ {ɛ\u0301} {ɛ\u0302} {ɛ\u030C} f g {gb} h i í î ǐ k-m {mb} {mp} n {nd} {ng} {nk} {ns} {nt} {nz} o ó ô ǒ ɔ {ɔ\u0301} {ɔ\u0302} {ɔ\u030C} p r-u ú û ǔ v w y z] + [j q x] + [c f F] + + + « + » + “ + ” + + + + + + + + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + + + sánzá ya yambo + sánzá ya míbalé + sánzá ya mísáto + sánzá ya mínei + sánzá ya mítáno + sánzá ya motóbá + sánzá ya nsambo + sánzá ya mwambe + sánzá ya libwa + sánzá ya zómi + sánzá ya zómi na mɔ̌kɔ́ + sánzá ya zómi na míbalé + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + eye + m1 + m2 + m3 + m4 + m5 + mps + + + eyenga + mokɔlɔ ya libosó + mokɔlɔ ya míbalé + mokɔlɔ ya mísáto + mokɔlɔ ya mínéi + mokɔlɔ ya mítáno + mpɔ́sɔ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + SM1 + SM2 + SM3 + SM4 + + + sánzá mísáto ya yambo + sánzá mísáto ya míbalé + sánzá mísáto ya mísáto + sánzá mísáto ya mínei + + + + AM + PM + + + libosó ya Y.-K. + nsima ya Y.-K. + + + libosó ya Y.-K. + nsima ya Y.-K. + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + mokɔlɔ + lɛlɔ́ + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Kinsásá + + + Santrafríka + + + + + + . + + + + falánga ya Bɛ́ljika + + + falánga ya Burundi + + + falánga kongolé + F + + + Falánga ya Swisi + + + Falánga ya Falansia + + + Falánga CFA BCEAO + + + Falánga CFP + + + mbɔ́ngɔ eyébámí tɛ́ + + + + + diff --git a/lib/zend/Zend/Locale/Data/ln_CD.xml b/lib/zend/Zend/Locale/Data/ln_CD.xml new file mode 100644 index 0000000000..5903b02511 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ln_CD.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ln_CG.xml b/lib/zend/Zend/Locale/Data/ln_CG.xml new file mode 100644 index 0000000000..74e749fa2a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ln_CG.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/lo.xml b/lib/zend/Zend/Locale/Data/lo.xml new file mode 100644 index 0000000000..3c8ac4847f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/lo.xml @@ -0,0 +1,624 @@ + + + + + + + + + + + ອາຟາ + ແອບຄາເຊຍ + ອັຟຣິກາ + ອຳຫາຣິກ + ອາຣັບ + ອັສສຳ + ໄອມາລາ + ອາແຊກບາຍຊານ + ບາສສີ + ເບລາລຸດຊີ + ບຸນກາຣີ + ບີຮາຣີ + ບິສລາມາ + ເບັງການ + ທິເບດ + ບເຣີຕົງ + ບອສນີ + ກາຕາລັງ + ຄໍຊິກ້າ + ເຊັກ + ແວວ + ເດັນມາກ + ເຍຍລະມັນ + ພູຖານີ + ກເຣັກ + ອັງກິດ + ເອສເປຣັງໂຕ + ແອສປາໂຍນ + ເອສໂຕນີ + ບັສເກີ + ເປີເຊຍ + ແຟງລັງ + ຕາກາລ໊ອກ + ຟິຈິ + ຟາໂຣ + ຝຣັ່ງ + ຟຣີຊຽນ + ໄອແລນ + ສະກັອດ ແກລິກ + ກາລິດ + ກົວຣານີ + ກູຊາຣາຕີ + ໂອຊາ + ຍິວ + ຮິນດູ + ໂກຣອາຊີ + ຮັງກາຣີ + ອາກເມນີ + ອິນເຕີລິງກາ + ອິນໂດເນເຊຍ + ອິນເຕີລິງ + ໄອນູປຽກ + ອິສລັງ + ອີຕາລີ + ໄອນຸກຕິຕັກ + ຍີ່ປຸ່ນ + ຊວາ + ຊອກຊີ + ຄາຊັກ + ກຼີນແລນດິດ + ກຳປູເຈຍ + ກັນນາດາ + ເກົາຫຼີ + ຄັດຊະມີລີ + ເຄີດິສ + ເກຍກິສ + ລາແຕັງ + ລິງກາລາ + ລາວ + ລີທົວນີ + ລັດເວຍ + ມາລາກາຊິ + ເມົາລີ + ມາເຊໂດນີ + ມາລາຢາລຳ + ມົງໂກນ + ໂມຄາເວຍ + ມາຣາທີ + ມາເລ + ມານຕາ + ພະມ່າ + ນໍລູ + ເນປານ + ໂຮນລັງ + ນອກແວ (ນີນອກ) + ນອກແວ + ອົກຊີຕານ + ໂອໂລໂມ(ອາຟານ) + ໂອຣີຢາ + ປັນຈາບ + ໂປໂລຍ + ປາສໂຕ + ປອກຕຸຍການ + ປອກຕຸຍການ (ບຣາຊີນ) + ປອກຕຸຍການ (ປອກຕຸຍການ) + ຄິວຊົວ + ເລໂຕ-ໂລແມນ + ຄິລັນສີ + ໂຣມານີ + ລັດເຊຍ + ຄິນຍາວັນດາ + ສັນສະກິດ + ສິນທິ + ສັນໂຄ + ແຊັກໂບ-ໂກຣແອັດ + ສິງຫານ + ສະໂລວັກກີ + ສະໂລວານີ + ຊາມົວ + ໂຊນາ + ໂຊມາລີ + ອານບານີ + ແຊກບີ + ຊິສວາຕິ + ເຊໂຊໂທ + ຊັນດານ + ຊູແອັດ + ຊວາຮີລີ + ທະມິນ + ເຕລູກູ + ທາຈິດ + ໄທ + ຕີກຣິນຢາ + ຕວຽກເມນ + ຕາກາລັອກ + ກລິງກອງ + ເຊຕະສະວານາ + ທອງກ້າ + ຕວກກີ + ຊອງກາ + ຕາດ + ຕວີ + ອຸຍເຄີ + ອູແກຣນ + ອູຣະດູ + ອຸດຊະເບັກກິດສະຖານ + ຫວຽດນາມ + ໂວລາພຸກ + ວູບ + ໂຊຊາ + ຢິດດິສ + ໂຢລູບາ + ຈວງ + ຈີນ + ຊູລູ + + + ອັນດໍລາ + ສະຫະລັດອາຫລັບເອມິເລດ + ອັຟການິດສະຖານ + ອັນກິລາ + ແອລເບເນຍ + ອາມິເນຍ + ເນເທີແລນແອນເທິນ + ອັນໂກລາ + ອາເຈນຕິນາ່ + ອົອດສະເຕຼຍ + ອົອດສະຕາລີ + ອາລູບາ + ອາເຊີໄບຈັນ + ບັອດສເນຍ ແລະ ເຮີດໂກວິເນຍ + ບາບາຄັອດ + ບັງກະລາເທດ + ເບວຢຽມ + ເບີກິນາຟາໂຊ + ບັງກາເລຍ + ບາເລນ + ບູລັນຕິ + ເບນິນ + ເບີມິວດາ + ບູຮໄນ + ໂບລິເວຍ + ບຼາຊິວ + ບາຮາມາສ + ພູຖານ + ບອັດສະວານາ + ເບນລາຮັສ + ເບລິຊ + ການາດາ + ສາທາລະນະລັດອັບຟຼິກກາກາງ + ຄອງໂກ + ສະວິດເຊີແລນ + ຝັ່ງທະເລໄອວໍລິ + ຊິສິ + ຄາເມລູນ + ຈີນ + ໂຄລຳເບຍ + ຄອສຕາລິກາ + ເຊີເບຍ + ຄິວບາ + ເຄບວອດ + ໄຊປັຼດ + ສາທາລະນະລັດເຊັກ + ເຢຍລະມັນ + ຄິໂບຕິ + ເດນມາກ + ໂດເມນິກາ + ສາທາລະນະລັດໂດມິນິກັນ + ແອລຈິເລຍ + ເອກວາດໍ + ເອສໂຕເນຍ + ອີຢິບ + ຊາຮາລາຕະເວັນຕົກ + ອິນຊີ + ສະເປນ + ເອທິໂອເປຍ + ຟິນແລນ + ຟິຈິ + ໄມໂຄນິເຊຍ + ຝລັ່ງ + ກາບອນ + ສະຫະລາດຊະອານາຈັກ + ຈໍເຈຍ + ເຟັນສກິວນາ + ການ່າ + ແກມເບຍ + ກິວນີ + ກົວເດີລູບ + ເອຄົວໂທເລຍລະກິນີ + ກິຼກ + ກົວເຕມາລາ + ກິວນີ-ບິສໂຊ + ກູຢານາ + ຮ່ອງກົງ + ອວນຄູຣັສ + ໂຄເອເຊຍ + ໄອທີ + ຮົງກາຣີ + ອິນໂດເນເຊຍ + ໄອແລນ + ອິສລະເອວ + ອິນເດຍ + ອີລັກ + ອີລ່ານ + ໄອສແລນ + ອິຕາລີ + ຈາໄມກາ + ຈໍແດນ + ຍີ່ປຸ່ນ + ເຄນຢ່າ + ເດີກິດສະຖານ + ກຳປູເຈຍ + ຄີລິບາດ + ໂຄໂມຣອດ + ເກົາຫລີເໜືອ + ເກົາຫລີໃຕ້ + ຄູເວດ + ຄາຊັດສະຖານ + ລາວ + ເລບານອນ + ໄລເທນສະໄຕ + ສີລັງກາ + ລິເບີເລຍ + ເລໂຊໂທ + ລິເທີເນຍ + ລຸກແຊມເບີກ + ລຼາດເວຍ + ລິເບຍ + ໂມລັອກໂຄ + ໂມນາໂກ + ໂມນໂຄວາ + ມາຄາກັສກາ + ແມຊິໂຄເນຍ + ມາລິ + ສະຫະພາບພະມ້າ + ມົງໂກລີ + ມາເກົ້າ + ມາຕິນິກ + ມໍລິກທາເນຍ + ມອນເຊີລາດ + ມັນຕາ + ມໍຣິຕຽດ + ແມັກຊິໂກ + ມາເລເຊຍ + ໂມແຊມບິກ + ນາມິເບຍ + ນິວຄາລິໂຄເນຍ + ໄນເຈີ + ໄນຈີເລຍ + ນິຄາລາກົວ + ເນເທີແລນ + ນໍເວ + ເນປານ + ນີຢູ + ນິວຊີແລນ + ໂອມານ + ປານາມາ + ເປລູ + ເຟັນຣໂພລິນີເຊຍ + ປາປົວນິວກີນີ + ຟິລິປິນ + ປາກິສຖານ + ໂປແລນ + ເປີໂຕລິໂກ + ໂປຕຸກກັນ + ປາລາກວຍ + ກາຕາ + ລູເມເນຍ + ລັດເຊຍ + ລາວັນດາ + ຊາອຸດິອາລະເບຍ + ເຊແຊວ + ຊູດານ + ສະວິເດັນ + ສິງກະໂປ + ສະໂລເວເນຍ + ສະໂລວາເກຍ + ເຊຍລາສິອອນ + ຊິນີກັນ + ໂຊມາເລຍ + ຊູລິນາມິ + ເອຊາວາດໍ + ຊິເລຍ + ສະວາຊິແລນ + ຊາດ + ອານາເຂດທາງໃຕ້ຂອງຝລັ່ງເສດ + ໂຕໂກ + ປະເທດໄທ + ທາຈິກິສະຖານ + ໂທກິໂລ + ຕິມໍຕາເວັນອອກ + ເຕຣີກເມນິສະຖານ + ຕູນິເຊຍ + ຕອງກາ + ຕຸນກີ + ທິນິແດດ + ໄຕ້ຫວັນ + ທານຊາເນຍ + ຢູເຄຼນ + ອູການດາ + ສະຫະລັດອາເມລິກາ + ລູກວຍອຸຣ + ອຸດເບກິສະຖານ + ວາຕິກັນ + ເວເນຊູເອລາ + ບຣິທິດເວີຈິນໄອແລນ + ຢູເອສເວີຈິນໄອແລນ + ຫວຽດນາມ + ວານົວຕູ + ເຢເມນ + ມາຢອດ + ອາຟະລິກາໃຕ້ + ແຊມເບຍ + ຊິມບັບເວ + + + + [່-ໍ ໆ ກ ຂ ຄ ງ ຈ ຊ ຍ ດ-ທ ນ-ຟ ມ-ຣ ລ ວ ສ ຫ ໜ ໝ ອ-ູ ົ-ຽ ເ-ໄ] + [\u200B ໐-໙] + + + ' + ' + " + " + + + + + + + ພ.ສ. + + + + + + EEEEທີ່ d MMMM G y + + + + + d MMMM y + + + + + d MMM y + + + + + d/M/yyyy + + + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + + + + + ມ.ກ. + ກ.ພ. + ມີ.ນ. + ມ.ສ.. + ພ.ພ. + ມິ.ຖ. + ກ.ລ. + ສ.ຫ. + ກ.ຍ. + ຕ.ລ. + ພ.ຈ. + ທ.ວ. + + + ມັງກອນ + ກຸມພາ + ມີນາ + ເມສາ + ພຶດສະພາ + ມິຖຸນາ + ກໍລະກົດ + ສິງຫາ + ກັນຍາ + ຕຸລາ + ພະຈິກ + ທັນວາ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + ອາ. + ຈ. + ອ. + ພ. + ພຫ. + ສກ. + ສ. + + + ວັນອາທິດ + ວັນຈັນ + ວັນອັງຄານ + ວັນພຸດ + ວັນພະຫັດ + ວັນສຸກ + ວັນເສົາ + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ກ່ອນທ່ຽງ + ຫລັງທ່ຽງ + + + ປີກ່ອນຄິດສະການທີ່ + ຄ.ສ. + + + + + + EEEEທີ d MMMM G y + + + + + d MMMM y + + + + + d MMM y + + + + + d/M/yyyy + + + + + + + Hໂມງ mນາທີ ss ວິນາທີzzzz + + + + + H ໂມງ mນາທີss z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + d MMMM + d/M + mm:ss + Q yy + M/yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + + + + ກີບ + + + + + diff --git a/lib/zend/Zend/Locale/Data/lo_LA.xml b/lib/zend/Zend/Locale/Data/lo_LA.xml new file mode 100644 index 0000000000..09b1b13eb1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/lo_LA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/lt.xml b/lib/zend/Zend/Locale/Data/lt.xml new file mode 100644 index 0000000000..beaeb37b04 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/lt.xml @@ -0,0 +1,3328 @@ + + + + + + + + + + + afarų + abchazų + ačinezų + acoli + adangmų + adygėjų + avestų + afrikanų + afroazijos kalba + afrihili + ainų + akanų + akadianų + aleutų + algonkuanų kalba + pietų altajaus + amharų + aragonesų + senoji anglų + angikų + apačių kalba + arabų + aramaikų + araukanų + arapahų + dirbtinė kalba + aravakų + asamų + asturianų + athapaskanų kalba + australų kalba + avarikų + avadhi + aimarų + azerbaidžaniečių + baškirų + bandų + bamilekų kalba + baluči + balinezų + basų + baltų kalba + baltarusių + bėjų + bembų + berberų + bulgarų + biharų + baučpuri + bislama + bikolų + bini + siksika + bambarų + bengalų + bantų + tibetiečių + bretonų + brajų + bosnių + batakų + buriatų + buginezų + blin + katalonų + kado + Centrinės Amerikos indėnų kalba + karibų + kaukaziečių kalba + atsamų + čečėnų + cebuanų + keltų kalba + čamorų + čibča + čagatų + čukesų + mari + činuk žargonas + čoktau + čipvėjų + čerokių + čajenų + čamikų kalba + korsikiečių + koptų + kreolų ir pidžinų kalba pagal anglų + kreolų ir pidžinų kalba pagal prancūzų + kreolų ir pidžinų kalba pagal portugalų + kry + krymo turkų + kreolų ir pidžinų + čekų + kašubų + bažnytinė slavų + kušitik kalba + čiuvašų + valų + danų + dakotų + dargva + bidayuh kalba + vokiečių + Austrijos vokiečių + aukštoji Šveicarijos vokiečių + delavero + slave + dogribų + dinkų + dogri + dravidų kalba + Žemutinės Serbijos + dualų + Vidurio Vokietijos + divehi + dyulų + svazilando + eve + efik + senovės egiptiečių + ekajuk + graikų + elamitų + anglų + anglų kalba (australija) + Kanados anglų + anglų (britų) + anglų (amerikiečių) + Vidurio Anglijos + esperanto + ispanų + Lotynų Amerikos ispanų + Iberijos ispanų + estų + baskų + evondo + persų + fang + fanti + fulahų + suomių + tagalų + finougrų kalba + fidžio + farerų kalba + fon + prancūzų + Kanados prancūzų + Šveicarijos prancūzų + Vidurio Prancūzijos + senoji prancūzų + šiaurinių fryzų + rytų fryzų + frulan + vakarų fryzų + airių + ga + gajo + gbaja + škotų (gėlų) + germanų kalba + gyz + kiribati + galisų + Vidurio aukštosios Vokietijos + gvaranių + Senoji Aukštosios Vokietijos + gondi + gorontalo + gotų + grebo + senovės graikų + Šveicarijos vokiečių + gudžaratų + manks + gvičino + hausų + haido + havajų + hebrajų + hindi + hiligainon + himačali + hititų + hmong + hiri motu + kroatų + viršutinė sorbian + haičio + vengrų + hupa + armėnų + herero + interlingva + iban + indoneziečių + interkalba + igbo + sičuan ji + ijo + inupiak + iloko + indų kalba + indoeuropiečių kalba + ingušų + ido + Iraniečių + irako kalba + islandų + italų + inukitut + japonų + loiban + judėjų persų + judėjų arabų + javiečių + gruzinų + karakalpakų + kabilo + kačin + ju + kamba + karenų + kavi + kabardinų + tyap + koro + kongo + kasi + koisan kalba + kotanezų + kikui + kuaniama + kazachų + kalalisut + khmerų + kimbundu + kanadų + korėjiečių + kankani + kosreanų + kpele + kanuri + karačiajų balkarijos + karelų + kru kalba + kuruk + kašmyro + kurdų + kumik + kutenai + komi + kornų + kirgizų + lotynų + ladino + landa + lamba + liuksemburgiečių + lezginų + ganda + limburgiš + lingala + laosiečių + mongo + lozi + lietuvių + luba katanga + luba lula + luiseno + lunda + luo + lušai + latvių + madurezų + magahi + maithili + makasaro + mandingo + austronezų + masajų + mokša + mandar + mende + malagasijos + Vidurio Airijos + Maršalo salų + maorių + mikmak + minankabu + įvairios kalbos + makedonų + mon khmer kalba + malajalių + mongolų + manču + manipuri + manobo kalba + moldavų + mohok + mosi + maratų + malajiečių + maltiečių + kelios kalbos + munda kalba + krykų + mirandezų + marvari + birmiečių + majanų + erzyjų + naurų + nahuatlų + Šiaurės Amerikos indėnų kalba + neapoliečių + Norvegijos bokmal + šiaurės ndebelų + Žemutinės Vokietijos + nepalų + nevari + ndongų + nias + Nigerio kordofanų kalba + niuenų + olandų + flamandų + naujoji norvegų + norvegų + nogų + norsu + enko + pietų ndebele + šiaurės sothų + nubijos kalba + navajų + klasikinė nevari + nianja + niamvezi + niankole + nioro + nzima + provansalų + ojibva + oromo + orijų + osetinų + osage + osmanų turkų + otomanų kalba + pandžabų + papuasų kalba + pangasinan + pahlavi + pampanga + papiemento + palau + senoji persų + filipinų kalba + finikiečių + pali + lenkų + ponapean + prakrit kalba + senovės provansalų + puštūnų + portugalų + portugalų (Brazilijos) + Iberijos portugalų + kečujų + radžastano + rapanui + rarotongan + raeto romanų + rundi + rumunų + romanų kalba + romų kalba + rūt + rusų + aromanių + kinjarvanda + sanskritas + sandavi + jakutų + Pietų Amerikos indėnų kalba + sališan kalba + samarėjų aramių + sasak + santali + sardiniečių + siciliečių + škotų + sindų + šiaurinių samių + selkup + samitų kalba + sango + senoji airių + ženklų kalba + serbų-kroatų + šan + sinhalų + sidamo + siouan kalba + sino tibeto kalba + slovakų + slovėnų + slavų kalba + samoa + pietų sami + samių kalba + lule sami + inari sami + skolt sami + šona + soninke + somalių + sogdien + songhai + albanų + serbų + sranan tongo + sererų + svati + Nilo Sacharos kalba + pietų sesuto + sundų + sukuma + susu + šumerų + švedų + svahili + klasikinė siriečių + sirų + tamilų + tajų kalba + telugų + timne + tereno + tetum + tadžikų + tajų + tigrajų + tigre + tiv + turkmėnų + tokelau + tagalogų + „žvaigždžių kelionių“ + tlingit + tamašek + tsvana + tonga + niasa tongos + tok pisin + turkų + tsonga + tsimšian + totorių + tumbuka + tupi kalba + altaikų kalba + tuvalu + tvi + taitiečių + tuvių + udmurtų + uigūrų + ugaritic + ukrainiečių + umbundu + nenustatyta kalba + urdų + uzbekų + vai + venda + vietnamiečių + volapiuk + votik + valonų + vakašan kalba + valamo + varai + vašo + sorbų kalba + volof + kalmukų + kosų + jao + japezų + jidiš + joruba + jupik kalba + chuang + zapotekų + „Bliss“ simbolių kalba + zenaga + kinų + kinų supaprastinta + kinų tradicinė + zande + zulų + zuni + Nėra kalbinio turinio + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pasaulis + Afrika + Šiaurės Amerika + Pietų Amerika + Okeanija + Vakarų Afrika + Centrinė Amerika + Rytų Afrika + Šiaurės Afrika + Vidurio Afrika + Pietų Afrika [018] + Amerika + Šiaurinė Amerika + Karibai + Rytų Azija + Pietų Azija + Pietryčių Azija + Pietų Europa + Australija ir Naujoji Zelandija + Melanezija + Mikronezijos regionas + Polinezija + Pietų vidurio Azija + Azija + Centrinė Azija + Vakarų Azija + Europa + Rytų Europa + Šiaurės Europa + Vakarų Europa + Nepriklausomų Valstybių Sandrauga + Čekoslovakija + Lotynų Amerika ir Karibai + Andora + Jungtiniai Arabų Emyratai + Afganistanas + Antigva ir Barbuda + Angilija + Albanija + Armėnija + Olandijos Antilai + Angola + Antarktis + Argentina + Amerikos Samoa + Austrija + Australija + Aruba + Alandų salos + Azerbaidžanas + Bosnija ir Hercegovina + Barbadosas + Bangladešas + Belgija + Burkina Fasas + Bulgarija + Bahreinas + Burundis + Beninas + Švento Baltramiejaus sala + Bermuda + Brunėjus + Bolivija + Brazilija + Bahamos + Butanas + Bouvet sala + Botsvana + Baltarusija + Belizas + Kanada + Kokosų salos + Kongo Demokratinė Respublika + Centrinės Afrikos Respublika + Kongas + Šveicarija + Dramblio Kaulo Krantas + Kuko salos + Čilė + Kamerūnas + Kinija + Kolumbija + Kosta Rika + Serbija ir Juodkalnija + Kuba + Žaliasis Kyšulys + Kalėdų sala + Kipras + Čekija + Vokietija + Džibutis + Danija + Dominika + Dominikos Respublika + Alžyras + Ekvadoras + Estija + Egiptas + Vakarų Sachara + Eritrėja + Ispanija + Etiopija + Suomija + Fidžis + Falklando salos + Mikronezija + Farerų salos + Prancūzija + Gabonas + Didžioji Britanija + Grenada + Gruzija + Prancūzijos Gviana + Guernsis + Gana + Gibraltaras + Grenlandija + Gambija + Gvinėja + Gvadelupė + Pusiaujo Gvinėja + Graikija + Pietų Džordžija ir Pietų Sandvičo salos + Gvatemala + Guamas + Bisau Gvinėja + Gajana + Kinijos S.A.R.Honkongas + Heardo ir McDonaldo Salų Sritis + Hondūras + Kroatija + Haitis + Vengrija + Indonezija + Airija + Izraelis + Meino sala + Indija + Indijos vandenyno britų sritis + Irakas + Iranas + Islandija + Italija + Džersis + Jamaika + Jordanija + Japonija + Kenija + Kirgiztanas + Kambodža + Kiribatis + Komorai + Sent Kitsas ir Nevis + Šiaurės Korėja + Pietų Korėja + Kuveitas + Kaimanų salos + Kazachstanas + Laosas + Libanas + Šventoji Liucija + Lichtenšteinas + Šri Lanka + Liberija + Lesotas + Lietuva + Liuksemburgas + Latvija + Libija + Marokas + Monakas + Moldova + Juodkalnija + Saint-Martin + Madagaskaras + Maršalo Salos + Makedonija + Malis + Mianmaras + Mongolija + Macao + Marianos šiaurinės salos + Martinika + Mauritanija + Montserratas + Malta + Mauricijus + Maldivai + Malavis + Meksika + Malaizija + Mozambikas + Namibija + Naujoji Kaledonija + Nigeris + Norfolko sala + Nigerija + Nikaragva + Nyderlandai + Norvegija + Nepalas + Nauru + Niue + Naujoji Zelandija + Omanas + Panama + Peru + Prancūzų Polinezija + Papua Naujoji Gvinėja + Filipinai + Pakistanas + Lenkija + Sen Pjeras ir Mikelonas + Pitkernas + Puerto Rikas + Palestinos teritorija + Portugalija + Palau + Paragvajus + Kataras + Europos Sąjunga + Reunionas + Rumunija + Serbija + Rusijos Federacija + Ruanda + Saudo Arabija + Saliamono salos + Seišeliai + Sudanas + Švedija + Singapūras + Šventoji Elena + Slovėnija + Svalbardo ir Jan Majen salos + Slovakija + Siera Leonė + San Marinas + Senegalas + Somalis + Surinamas + San Tomė ir Principė + Salvadoras + Sirija + Svazilendas + Turkso ir Caicoso salos + Čadas + Prancūzijos Pietų sritys + Togas + Tailandas + Tadžikistanas + Tokelau + Rytų Timoras + Turkmėnistanas + Tunisas + Tonga + Turkija + Trinidadas ir Tobagas + Tuvalu + Taivanas + Tanzanija + Ukraina + Uganda + Jungtinių Valstijų mažosios aplinkinės salos + Jungtinės Valstijos + Urugvajus + Uzbekistanas + Vatikanas + Šventasis Vincentas ir Grenadinai + Venesuela + Didžiosios Britanijos Mergelių salos + Mergelių salos (JAV) + Vietnamas + Vanuatu + Wallisas ir Futuna + Samoa + Jemenas + Mayotte’as + Pietų Afrika + Zambija + Zimbabvė + Nežinoma ar neteisinga sritis + + + Kompiuteris + + + kalendorius + lyginimas + valiuta + + + Budistų kalendorius + Kiniečių kalendorius + Grigaliaus kalendorius + Hebrajų kalendorius + Islamo kalendorius + Japonų kalendorius + Kinijos respublikos kalendorius + + + JAV + Metrinė + + + Kalba: {0} + Rašmenys: {0} + Sritis: {0} + + + + [a ą b c č d e ę ė f-i į y j-p r s š t u ų ū v z ž] + [{į\u0307} {i\u0307} {i\u0307\u0301} {i\u0307\u0300} {i\u0307\u0303} {j\u0307} q w x] + [a ą b c č d e ę ė f-i į y j-p r s š t u ų ū v z ž] + + + „ + “ + „ + “ + + + {0}−{1} + + + ryte + + + + y G, MMMM d, EEEE + + + + + + + + + Sau + Vas + Kov + Bal + Geg + Bir + Lie + Rgp + Rgs + Spl + Lap + Grd + + + sausio + vasario + kovo + balandžio + gegužės + birželio + liepos + rugpjūčio + rugsėjo + spalio + lapkričio + gruodžio + + + + + S + V + K + B + G + B + L + R + R + S + L + G + + + Sausis + Vasaris + Kovas + Balandis + Gegužė + Birželis + Liepa + Rugpjūtis + Rugsėjis + Spalis + Lapkritis + Gruodis + + + + + + + Sk + Pr + An + Tr + Kt + Pn + Št + + + sekmadienis + pirmadienis + antradienis + trečiadienis + ketvirtadienis + penktadienis + šeštadienis + + + + + S + P + A + T + K + P + Š + + + + + + + K1 + K2 + K3 + K4 + + + pirmas ketvirtis + antras ketvirtis + trečias ketvirtis + ketvirtas ketvirtis + + + + + 1K + 2K + 3K + 4K + + + + priešpiet + popiet + + + prieš Kristų + po Kristaus + + + pr. Kr. + po Kr. + + + + + + y 'm'. MMMM d 'd'.,EEEE + + + + + y 'm'. MMMM d 'd'. + + + + + yyyy.MM.dd + + + + + yyyy-MM-dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + HH:mm:ss + MMM-dd + MM.dd + hh:mm a + hh:mm:ss a + Q yy + yyyy.MM + + + {0} - {1} + + M-M + + + MM-ddE - MM-ddE + MM-ddE - MM-ddE + + + MMM-MMM + + + MMM d 'd'.E - MMM d 'd'.E + MMM d 'd'.E - d 'd'.E + + + MMM d 'd'. - MMM d 'd'. + MMM d 'd'.-d 'd'. + + + MM-dd - MM-dd + MM-dd - MM-dd + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + yyyy-MM - yyyy-MM + yyyy-MM - yyyy-MM + + + yyyy-MM-ddE - yyyy-MM-ddE + yyyy-MM-ddE - yyyy-MM-ddE + yyyy-MM-ddE - yyyy-MM-ddE + + + y 'm'. MMM-MMM + y 'm'. MMM - y 'm'. MMM + + + y 'm'. MMM d 'd'.,E - MMM d 'd'.,E + y 'm'. MMM d 'd'.,E - d 'd'.,E + y 'm'. MMM d 'd'.,E - y 'm'. MMM d 'd'.,E + + + y 'm'. MMM d 'd'. - MMM d 'd'. + y 'm'. MMM d 'd'.-d 'd'. + y 'm'. MMM d 'd'. - y 'm'. MMM d 'd'. + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + + + + + + era + + + metai + + + mėnuo + + + savaitė + + + diena + už užvakar + užvakar + vakar + šiandien + rytoj + poryt + užporyt + + + savaitės diena + + + dienos metas + + + valanda + + + minutė + + + sekundė + + + juosta + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + {0} ({1}) + + Nežinoma + + + Andora + + + Dubajus + + + Kabulas + + + Tirana + + + Jerevanas + + + Palmeris + + + Pietų ašigalis + + + Syova + + + Vostokas + + + Dumont D'Urville + + + Rio Galjegosas + + + Mendosa + + + San Chuanas + + + Ušuaja + + + La Riocha + + + Sent Luisas + + + Katamarka + + + Chuchujus + + + Tukumanas + + + Kordoba + + + Buenos Airės + + + Viena + + + Pertas + + + Darvinas + + + Adelaidė + + + Melburnas + + + Hobartas + + + Sidnėjus + + + Brisbanas + + + Lordo Hau sala + + + Barbadosas + + + Daka + + + Briuselis + + + Sofija + + + Bahreinas + + + Porto Novas + + + Bermudų salos + + + Brunėjus + + + La Pasas + + + Rio Brankas + + + Manausas + + + Kujaba + + + Santarenas + + + Belemas + + + San Paulas + + + Resifė + + + Gaboronas + + + Minskas + + + Belizas + + + Dosonas + + + Vaithorsas + + + Vankuveris + + + Dosono įlanka + + + Jelounaifas + + + Edmontonas + + + Kembridžo įlanka + + + Redžina + + + Vinipegas + + + Tander Bėjus + + + Nipigonas + + + Torontas + + + Monrealis + + + Ikaluitas + + + Pangnirtungas + + + Monktonas + + + Halifaksas + + + Kinšasa + + + Lubumbašis + + + Brazavilis + + + Ciurichas + + + Abidžanas + + + Velykų sala + + + Santjagas + + + Kashi + + + Urumči + + + Čongčingas + + + Harbinas + + + Kosta Rika + + + Kalėdų sala + + + Nikosija + + + Berlynas + + + Džibutis + + + Kopenhaga + + + Dominika + + + Santo Domingas + + + Galapagai + + + Talinas + + + Kairas + + + Asmara + + + Kanarų salos + + + Seuta + + + Madridas + + + Addis Abeba + + + Helsinkis + + + Fidžis + + + Stenlis + + + Trukas + + + Ponapė + + + Farerai + + + Paryžius + + + Librevilis + + + Londonas + + + Tbilisis + + + Kajenas + + + Gibraltaras + + + Tūla + + + Godthabas + + + Danmarkshavn’as + + + Konakris + + + Gvadelupė + + + Atėnai + + + Gvatemala + + + Guamas + + + Gajana + + + Honkongas + + + Budapeštas + + + Džakarta + + + Pontianakas + + + Makasaras + + + Džajapura + + + Dublinas + + + Bagdadas + + + Teheranas + + + Reikjavikas + + + Roma + + + Jamaika + + + Amanas + + + Nairobis + + + Biškekas + + + Enderburis + + + Tarava + + + Komoras + + + St. Kitsas + + + Seulas + + + Kuveitas + + + Kaimanas + + + Aktau + + + Uralskas + + + Aktiubinskas + + + Kzyl-Orda + + + Alma Ata + + + Vientianas + + + Beirutas + + + St. Lucia + + + Vaducas + + + Kolombo + + + Monrovija + + + Liuksemburgas + + + Ryga + + + Tripolis + + + Kasablanka + + + Monakas + + + Antananarivas + + + Rangūnas + + + Ulan-Batoras + + + Čoibalsanas + + + Makao + + + Saipanas + + + Martinika + + + Montseratas + + + Mauricijus + + + Maldyvai + + + Tichuana + + + Hermosiljas + + + Mazatlanas + + + Čihuahua + + + Monterėjus + + + Meksikas + + + Kankunas + + + Kučingas + + + Norfolkas + + + Managva + + + Amsterdamas + + + Oslas + + + Maskatas + + + Taitis + + + Markizo salos + + + Varšuva + + + Pitcairno salos + + + Puerto Rikas + + + Gazos ruožas + + + Azorai + + + Lisabona + + + Asunsjonas + + + Kataras + + + Reunionas + + + Bukareštas + + + Kaliningradas + + + Maskva + + + Volgogradas + + + Jekaterinburgas + + + Omskas + + + Novosibirskas + + + Krasnojarskas + + + Irkutskas + + + Jakutskas + + + Vladivostokas + + + Sachalinas + + + Magadanas + + + Kamčiatka + + + Anadyrė + + + Rijadas + + + Gvadalkanalas + + + Chartumas + + + Stokholmas + + + Singapūras + + + Šv. Helena + + + Frytaunas + + + Dakaras + + + Mogadišas + + + San Tomė + + + Salvadoras + + + Damaskas + + + Grand Terkas + + + Ndžamena + + + Bankokas + + + Dušanbė + + + Dilis + + + Ašchabadas + + + Tunisas + + + Stambulas + + + Port of Speinas + + + Užhorodas + + + Kijevas + + + Simferopolis + + + Zaporožė + + + Jungtinių Valstijų mažosios aplinkinės salos (Midway + + + Džonstonas + + + Jungtinių Valstijų mažosios aplinkinės salos (Klivateris) + + + Ankoridžas + + + Jakutat + + + Džūnas + + + Los Andželas + + + Boisė + + + Fyniksas + + + Denveris + + + Naujasis Salemas, Šiaurės Dakota + + + Jungtinės Valstijos (Centras, Šiaurės Dakota) + + + Čikaga + + + Vincenas, Indiana + + + Peterburgas + + + Noksas, Indiana + + + Vinamakas, Indiana + + + Luizvilis + + + Monticelas, Kentukis + + + Detroitas + + + Niujorkas + + + Montevidëjas + + + Samarkandas + + + Taškentas + + + Sant Vincentė + + + Karakasas + + + St. Thomas + + + Efatas + + + Apija + + + Adenas + + + Majotas + + + Johanesburgas + + + + Centrinės Afrikos laikas + + + + + Rytų Afrikos laikas + + + + + Pietų Afrikos laikas + Pietų Afrikos standartinis laikas + + + + + Vakarų Afrikos laikas + Vakarų Afrikos vasaros laikas + + + + + Aliaskos laikas + Aliaskos standartinis laikas + Aliaskos vasaros laikas + + + + + Aliaskos-Havajų laikas + Aliaskos-Havajų standartinis laikas + Aliaskos-Havajų vasaros laikas + + + + + Amazonės laikas + Amazonės vasaros laikas + + + + + Centro laikas + Centro standartinis laikas + Centro vasaros laikas + + + + + Rytų laikas + Rytų standartinis laikas + Rytų vasaros laikas + + + + + Ramiojo vandenyno laikas + Ramiojo vandenyno standartinis laikas + Ramiojo vandenyno vasaros laikas + + + + + AQTT (Aktau) + AQTST (Aktau) + + + + + AQTT (Aktobė) + AQTST (Aktobė) + + + + + Argentinos laikas + Argentinos vasaros laikas + + + + + Vakarų Argentinos laikas + + + + + Atlanto laikas + Atlanto standartinis laikas + Atlanto vasaros laikas + + + + + Beringo laikas + Beringo standartinis laikas + Beringo vasaros laikas + + + + + Bolivijos laikas + + + + + Brazilijos laikas + Brazilijos vasaros laikas + + + + + Čilės laikas + Čilės vasaros laikas + + + + + Kolumbijos laikas + Kolumbijos vasaros laikas + + + + + Kubos laikas + Kubos standartinis laikas + Kubos vasaros laikas + + + + + Olandų Gajanos laikas + + + + + Ekvadoro laikas + + + + + Vidurio Europos laikas + Vidurio Europos vasaros laikas + + + CET + CEST + + + + + Rytų Europos laikas + Rytų Europos vasaros laikas + + + EET + EEST + + + + + WET + WEST + + + + + Prancūzų Gajanos laikas + + + + + GMT + + + + + Grenlandijos centro laikas + Grenlandijos centro vasaros laikas + + + + + Grenlandijos rytų laikas + Grenlandijos rytų vasaros laikas + + + + + Grenlandijos vakarų laikas + Grenlandijos vakarų vasaros laikas + + + + + Gajanos laikas + + + + + Kuibyševo laikas + Kuibyševo vasaros laikas + + + + + Maskvos laikas + Maskvos standartinis laikas + Maskvos vasaros laikas + + + + + Niufaundlendo laikas + Niufaundlendo standartinis laikas + Niufaundlendo vasaros laikas + + + + + Paragvajaus laikas + Paragvajaus vasaros laikas + + + + + Peru laikas + Peru vasaros laikas + + + + + Samaros laikas + Samaros vasaros laikas + + + + + SAMT (Samarkandas) + SAMST (Samarkandas) + + + + + Turkijos laikas + Turkijos vasaros laikas + + + + + Urugvajaus laikas + Urugvajaus vasaros laikas + + + + + Venesuelos laikas + + + + + Volgogrado laikas + Volgogrado vasaros laikas + + + + + + + , + . + ; + % + 0 + # + + + − + ×10^ + ‰ + ∞ + ¤¤¤ + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + {0} {1} + + + + Andoros peseta + Andoros pesetos + Andoros peseta + Andoros pesetos + + + JAE dirhamas + + + Afganis (1927-2002) + Afganiai (1927-2002) + Afganis (1927-2002) + Afganiai (1927-2002) + + + Afganis + Afganiai + Afganis + Afganiai + + + Albanijos lekas + Albanijos lekai + Albanijos lekas + Albanijos lekai + + + Armėnijos dramas + Armėnijos dramai + Armėnijos dramas + Armėnijos dramai + + + Nyderlandų Antilų guldenas + Nyderlandų Antilų guldenas + Nyderlandų Antilų guldenai + + + Angolos kvanza + Angolos kvanzos + Angolos kvanza + Angolos kvanzai + + + Angolos kvanza (1977-1990) + Angolos kvanzos (1977-1990) + Angolos kvanza (1977-1990) + Angolos kvanzai (1977-1990) + + + Angolos naujoji kvanza + Angolos naujosios kvanzos + Angolos naujoji kvanza + Angolos naujosios kvanzos + + + Argentinos pesas (1983-1985) + Argentinos pesai (1983-1985) + Argentinos pesas (1983-1985) + Argentinos pesai (1983-1985) + + + Argentinos pesas + Argentinos pesas + Argentinos pesai + + + Austrijos šilingas + Austrijos šilingai + Austrijos šilingas + Austrijos šilingai + + + Australijos doleris + Australijos doleris + Australijos doleriai + + + Arubos guldenas + Arubos guldenai + Arubos guldenas + Arubos guldenai + + + Azerbaidžano manatas (1993-2006) + Azerbaidžano manatai (1993-2006) + Azerbaidžano manatas (1993-2006) + Azerbaidžano manatai (1993-2006) + + + Azerbaidžano manatas + Azerbaidžano manatai + Azerbaidžano manatas + Azerbaidžano manatai + + + Bosnijos ir Hercegovinos dinaras + Bosnijos ir Hercegovinos dinarai + Bosnijos ir Hercegovinos dinaras + Bosnijos ir Hercegovinos dinarai + + + Bosnijos ir Hercegovinos konvertuojamoji markė + Bosnijos ir Hercegovinos konvertuojamosios markės + Bosnijos ir Hercegovinos konvertuojamoji markė + Bosnijos ir Hercegovinos konvertuojamosios markės + + + Barbadoso doleris + Barbadoso doleriai + Barbadoso doleris + Barbadoso doleriai + + + Bangladešo taka + Bangladešo takos + Bangladešo taka + Bangladešo takos + + + Belgijos frankas (konvertuojamas) + Belgijos frankai (konvertuojami) + Belgijos frankas (konvertuojamas) + Belgijos frankai (konvertuojami) + + + Belgijos frankas + Belgijos frankai + Belgijos frankas + Belgijos frankai + + + Belgijos frankas (finansinis) + Belgijos frankai (finansiniai) + Belgijos frankas (finansinis) + Belgijos frankai (finansiniai) + + + Bulgarijos levas (1962-1999) + Bulgarijos levai + Bulgarijos levas (1962-1999) + Bulgarijos levai + + + Bulgarijos levas + Bulgarijos naujasis levas + Bulgarijos naujasis levai + + + Bahreino dinaras + Bahreino dinarai + Bahreino dinaras + Bahreino dinarai + + + Burundžio frankas + Burundžio frankai + Burundžio frankas + Burundžio frankai + + + Bermudos doleris + Bermudos doleriai + Bermudos doleris + Bermudos doleriai + + + Brunėjaus doleris + Brunėjaus doleris + Brunėjaus doleriai + + + Bolivijos bolivijanas + Bolivijos bolivijanas + Bolivijos bolivijanai + + + Bolivijos pesas + Bolivijos pesai + Bolivijos pesas + Bolivijos pesai + + + Bolivijos mvdol + Bolivijos mvdol + Bolivijos mvdol + + + Brazilijos naujasis kruzeiras + Brazilijos naujieji kruzeirai + Brazilijos naujasis kruzeiras + Brazilijos naujieji kruzeirai + + + Brazilijos kruzadas + Brazilijos kruzadai + Brazilijos kruzadas + Brazilijos kruzadai + + + Brazilijos kruzeiras (1990-1993) + Brazilijos kruzeirai (1990-1993) + Brazilijos kruzeiras (1990-1993) + Brazilijos kruzeirai (1990-1993) + + + Brazilijos realas + Brazilijos realas + Brazilijos realai + + + Brazilijos naujasis kruzadas + Brazilijos naujieji kruzadai + Brazilijos naujasis kruzadas + Brazilijos naujieji kruzadai + + + Brazilijos kruzeiras + Brazilijos kruzeirai + Brazilijos kruzeiras + Brazilijos kruzeirai + + + Bahamų doleris + Bahamų doleriai + Bahamų doleris + Bahamų doleriai + + + Butano ngultrumas + Butano ngultrumai + Butano ngultrumas + Butano ngultrumai + + + Botsvanos pula + Botsvanos pulos + Botsvanos pula + Botsvanos pulos + + + Baltarusijos naujasis rublis + Baltarusijos naujasis rublis + Baltarusijos naujieji rubliai + + + Baltarusijos rublis + Baltarusijos rublis + Baltarusijos rubliai + + + Belizo doleris + Belizo doleris + Belizo doleriai + + + Kanados doleris + Kanados doleris + Kanados doleriai + + + Kongo frankas + Kongo frankas + Kongo frankai + + + Šveicarijos frankas + + + Čilės pesas + Čilės pesas + Čilės pesai + + + Ženminbi juanis + Kinijos juanis + Kinijos juaniai + + + Kolumbijos pesas + Kolumbijos pesas + Kolumbijos pesai + + + Kosta Rikos kolonas + Kosta Rikos kolonas + Kosta Rikos kolonai + + + Senasis Serbijos dinaras + + + Kubos pesas + + + Kipro svaras + + + Čekijos krona + + + Rytų Vokietijos ostmarkė + + + Vokietijos markė + + + Džibučio frankas + + + Danijos krona + + + Dominikos pesas + + + Alžyro dinaras + Alžyro dinaras + Alžyro dinarai + + + Ekvadoro sukrė + + + Ekvadoro constante (UVC) + + + Estijos krona + + + Egipto svaras + + + Eritrėjos nakfa + + + Ispanijos peseta + + + Etiopijos biras + + + Euras + + + Suomijos markė + + + Fidžio doleris + + + Folklando salų svaras + + + Prancūzijos frankas + + + Svaras sterlingų + Didžiosios Britanijos svaras sterlingų + Didžiosios Britanijos svarai sterlingų + + + Gruzijos laris + + + Ganos sedis (1979-2007) + + + Ganos sedis + + + Gibraltaro svaras + + + Gambijos dalasis + + + Gvinėjos frankas + + + Graikijos drachma + + + Gvatemalos kecalis + + + Portugalų Gvinėjos eskudas + + + Gvinėjos-Bisau pesas + + + Gajanos doleris + + + Honkongo doleris + + + Hondūro lempira + + + Kroatijos dinaras + + + Kroatijos kuna + + + Haičio gurdas + + + Vengrijos forintas + + + Indonezijos rupija + + + Airijos svaras + + + Izraelio svaras + + + Izraelio šekelis + + + Indijos rupija + + + Irako dinaras + + + Irano rialas + + + Islandijos krona + + + Italijos lira + + + Jamaikos doleris + + + Jordanijos dinaras + + + Jena + + + Kenijos šilingas + + + Kirgizijos somas + + + Komoro frankas + Komoro frankas + Komoro frankai + + + Šiaurės Korėjos vonas + + + Pietų Korėjos vonas + + + Kuveito dinaras + + + Kaimanų salų doleris + + + Kazachstano tengė + + + Laoso kipas + + + Libano svaras + + + Šri Lankos rupija + + + Liberijos doleris + + + Lesoto lotis + + + Litas + + + Lietuvos talonas + + + Liuksemburgo konvertuojamas frankas + + + Liuksemburgo frankas + + + Liuksemburgo finansinis frankas + + + Latvijos latas + + + Latvijos rublis + + + Libijos dinaras + + + Maroko dirhamas + + + Maroko frankas + + + Moldovos lėja + + + Madagaskaro ariaris + + + Madagaskaro frankas + + + Makedonijos denaras + + + Malio frankas + + + Mianmaro kijatas + + + Mongolijos tugrikas + + + Makao pataka + + + Mauritanijos ugija + + + Maltos lira + + + Maltos svaras + + + Mauricijaus rupija + + + Maldyvų salų rufija + + + Malavio kvača + + + Meksikos pesas + + + Meksikos sidabrinis pesas (1861-1992) + + + Meksikos United de Inversion (UDI) + + + Malaizijos ringitas + + + Mozambiko eskudas + + + Senasis Mozambiko metikalis + + + Mozambiko metikalis + + + Namibijos doleris + + + Nigerijos naira + + + Nikaragvos kardoba + + + Nikaragvos kardoba oras + + + Nyderlandų guldenas + + + Norvegijos krona + + + Nepalo rupija + + + Naujosios Zelandijos doleris + + + Omano rialas + + + Panamos balboja + + + Peru naujasis solis + + + Peru solis + + + Papua Naujosios Gvinėjos kina + + + Filipinų pesas + + + Pakistano rupija + + + Lenkijos zlotas + + + Lenkijos zlotas (1950-1995) + + + Portugalijos eskudas + + + Paragvajaus guaranis + + + Kataro rialas + + + Rodezijos doleris + + + Senoji Rumunijos lėja + + + Naujoji Rumunijos lėja + + + Serbijos dinaras + + + Rusijos rublis + + + Rusijos rublis (1991-1998) + + + Ruandos frankas + + + Saudo Arabijos rialas + + + Saliamono salų doleris + + + Seišelių salų rupija + + + Senasis Sudano dinaras + + + Sudano svaras + + + Senasis Sudano svaras + + + Švedijos krona + + + Singapūro doleris + + + Šv. Elenos salų svaras + + + Slovėnijos tolaras + + + Slovakijos krona + + + Siera Leonės leonė + + + Somalio šilingas + + + Surimano doleris + + + Surimano guldenas + + + Sao Tomės ir Principės dobra + + + Sovietų Sąjungos rublis + + + Salvadoro kolonas + + + Sirijos svaras + + + Svazilendo lilangenis + + + Tailando batas + + + Tadžikistano rublis + + + Tadžikistano somonis + + + Turkmėnistano manatas + + + Tuniso dinaras + + + Tongo paanga + + + Timoro eskudas + + + Turkijos lira + + + Naujoji Turkijos lira + + + Trinidado ir Tobago doleris + + + Naujasis Taivano doleris + + + Tanzanijos šilingas + + + Ukrainos grivina + + + Ukrainos karbovanecas + + + Ugandos šilingas (1966-1987) + + + Ugandos šilingas + + + JAV doleris + + + JAV doleris (kitos dienos) + + + JAV doleris (šios dienos) + + + Urugvajaus pesas (1975-1993) + + + Urugvajaus pesas + + + Uzbekistano sumas + + + Venesuelos bolivaras + + + Stiprusis Venesuelos bolivaras + + + Vietnamo dongas + + + Vakarų Samoa tala + + + CFA BEAC frankas + CFA BEAC frankas + CFA BEAC frankai + + + Sidabras + + + Auksas + + + Europos suvestinės vienetas + + + Europos piniginis vienetas + + + Europos valiutos/apskaitos vienetas (XBC) + + + Europos valiutos/apskaitos vienetas (XBD) + + + Rytų Karibų doleris + + + SDR Tarptautinis valiutos fondas + + + Europos piniginis vienetas (1993-1999) + + + Aukso frankas + + + Uic -frankas + + + CFA BCEAO frankas + CFA BCEAO frankas + CFA BCEAO frankai + + + Paladis + + + CFP frankas + CFP frankas + CFP frankai + + + Platina + + + RINET fondai + + + Tikrinamas valiutos kodas + + + Nežinoma arba neteisinga valiuta + + + Jemeno dinaras + + + Jemeno rialas + + + Jugoslavijos naujasis dinaras + + + Jugoslavijos konvertuojamas dinaras + + + Pietų Afrikos finansinis randas + + + Pietų Afrikos randas + + + Zambijos kvača + + + Zairo naujasis zairas + + + Zairo zairas + + + Zimbabvės doleris + + + + + + {0} dienos + {0} diena + {0} dienų + + + {0} valandos + {0} valanda + {0} valandų + + + {0} minutės + {0} minutė + {0} minučių + + + {0} mėnesiai + {0} mėnuo + {0} mėnesių + + + {0} sekundės + {0} sekundė + {0} sekundžių + + + {0} savaitės + {0} savaitė + {0} savaičių + + + {0} metai + {0} metai + {0} metų + + + + + taip:t + ne:n + + + + diff --git a/lib/zend/Zend/Locale/Data/lt_LT.xml b/lib/zend/Zend/Locale/Data/lt_LT.xml new file mode 100644 index 0000000000..38c47a3242 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/lt_LT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/lv.xml b/lib/zend/Zend/Locale/Data/lv.xml new file mode 100644 index 0000000000..abe2966775 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/lv.xml @@ -0,0 +1,2987 @@ + + + + + + + + + + + {0} ({1}) + , + + + afāru + abhāzu + ačinu + ačolu + adangmu + adigu + avesta + afrikandu + afroaziātu valodas + afrihili + ainu + akanu + akadiešu + aleutu + algonkinu valodas + dienvidaltajiešu + amharu + aragoniešu + senangļu + angika + apaču valodas + arābu + aramiešu + araukāņu + arapahu + mākslīgās valodas + aravaku + asamiešu + astūriešu + atapasku valodas + austrāliešu valodas + avāru + avadhu + aimaru + azerbaidžāņu + baškīru + bandu + bamileku valoda + beludžu + baliešu + basu + baltu valodas + baltkrievu + bedžu + bembu + berberu + bulgāru + biharu + bhodžpūru + bišlamā + bikolu + binu + siksiku + bambaru + bengāļu + bantu + tibetiešu + bretoņu + bradžiešu + bosniešu + bataku + burjatu + bugu + bilinu + katalāņu + kadu + Centrālamerikas indiāņu valodas + karību + kaukāziešu valodas + čečenu + sebuāņu + ķeltu valoda + čamorru + čibču + džagatajs + čūku + mariešu + činuku žargons + čoktavu + čipevaianu + irokēzu + šejenu + čamiešu valodas + korsikāņu + koptu + angliskās kreoliskās valodas un pidžinvalodas + franciskās kreoliskās valodas un pidžinvalodas + portugāliskās kreoliskās valodas un pidžinvalodas + krī + Krimas tatāru + kreoliskās valodas un pidžinvalodas + čehu + kašubu + baznīcslāvu + kušītu valodas + čuvašu + velsiešu + dāņu + dakotu + dargu + dajaku + vācu + Austrijas vācu + Šveices augšvācu + delavēru + sleivu + dogribu + dinku + dogru + dravīdu valodas + lejassorbu + dualu + vidusholandiešu + maldīviešu + diūlu + dzongke + evu + efiku + ēģiptiešu + ekadžuku + grieķu + elamiešu + angļu + Austrālijas angļu + Kanādas angļu + angļu (ASV) + vidusangļu + esperanto + spāņu + spāņu (Latīņamerika) + ibēriešu spāņu + igauņu + basku + evondu + persiešu + fangu + fantu + fulu + somu + filipīniešu + somugru valodas + fidžiešu + fēru + fonu + franču + Kanādas franču + Šveices franču + vidusfranču + senfranču + ziemeļfrīzu + austrumfrīzu + friūlu + rietumfrīzu + īru + ga + gajo + gbaju + gēlu + ģermāņu valodas + gēzu + kiribatiešu + galisiešu + vidusaugšvācu + gvaranu + senaugšvācu + gondu valodas + gorontalu + gotu + grebo + sengrieķu + Šveices vācu + gudžaratu + meniešu + kučinu + hausu + haidu + havajiešu + ivrits + hindi + hiligainonu + himačali + hetu + hmongu + hirimotu + horvātu + augšsorbu + haitiešu + ungāru + hupu + armēņu + hereru + interlingva + ibanu + indonēziešu + interlingve + igbo + Sičuaņas ji + idžbu + inupiaku + iloku + indoāriešu valodas + indoeiropiešu valodas + ingušu + ido + irāņu valodas + irokēzu valodas + īslandiešu + itāliešu + inuītu + japāņu + ložbans + jūdpersiešu + jūdarābu + javiešu + gruzīnu + karakalpaku + kabilu + kačinu + kambu + karenu + kāvi + kabardiešu + koru + kongu + khasu + hosjanu valodas + hotaniešu + kikuju + kvaņamu + kazahu + grenlandiešu + khmeru + kimbundu + kannadu + korejiešu + konkanu + kosrājiešu + kpellu + kanuru + karačaju un balkāru + karēļu + krū + kuruhu + kašmiriešu + kurdu + kumiku + kutenaju + komiešu + korniešu + kirgīzu + latīņu + ladino + landu + lambu + luksemburgiešu + lezgīnu + gandu + limburgiešu + lingala + laosiešu + mongu + lozu + lietuviešu + lubakatanga + lubalulva + luisenu + lundu + luo + lušeju + latviešu + maduriešu + magahiešu + maithili + makasaru + mandingu + austronēziešu valoda + masaju + mokšu + mandaru + mendu + malagasu + vidusīru + māršaliešu + maoru + mikmaku + minangkabavu + dažādas valodas + maķedoniešu + monkhmeru valodas + malajalu + mongoļu + mandžūru + manipūru + manobu valodas + moldāvu + mohauku + mosu + maratu + malajiešu + maltiešu + vairākas valodas + mundu valoda + krīku + mirandiešu + marvaru + birmiešu + maiju valodas + erzju + nauruiešu + navatlu + Ziemeļamerikas indiāņu valodas + neapoliešu + norvēģu bukmols + ziemeļndebelu + lejasvācu + nepāliešu + nevaru + ndongu + njasu + nigēriešu-kordofāņu valodas + niuāņu + holandiešu + flāmu + jaunnorvēģu + norvēģu + nogaju + sennorvēģu + n-ko + dienvidndebelu + ziemeļsotu + nūbiešu valodas + navahu + klasiskā nevaru + čičeva + ņamvezu + ņankolu + ņoru + nzemu + oksitāņu + odžibvu + oromu + orisiešu + osetīnu + važāžu + turku osmaņu + otomu valoda + pandžabu + papuasu valoda + pangasinanu + pehlevi + pampanganu + papjamento + palaviešu + senpersu + filipīniešu valoda + feniķiešu + pāli + poļu + ponapiešu + prākrita valoda + senprovansiešu + puštu + portugāļu + Brazīlijas portugāļu + ibēriešu portugāļu + kečvu + radžastāņu + rapanuju + rarotongiešu + retoromāņu + rundu + rumāņu + romāņu valoda + čigānu + sakne + krievu + aromūnu + kiņaruanda + sanskrits + sandavu + jakutu + Dienvidamerikas indiāņu + sališu valodas + Samārijas aramiešu + sasaku + santalu + sardīniešu + sicīliešu + skotu + sindhu + ziemeļsāmu + selkupu + semītu valodas + sangu + senīru + zīmju valodas + serbu-horvātu + šanu + singāļu + sidamu + siū valodas + sinotibetiešu valodas + slovāku + slovēņu + slāvu + samoāņu + dienvidsāmu + sāmu valoda + Luleo sāmu + Inari sāmu + skoltsāmu + šonu + soninku + somāļu + sogdiešu + songaju + albāņu + serbu + sranantogo + serēru + svatu + Nīlas-Sahāras valodas + sesoto + sundaniešu + sukumu + susu + šumeru + zviedru + svahili + klasiskā sīriešu + sīriešu + tamilu + taju valodas + telugu + temnu + tereno + tetumu + tadžiku + taju + tigrinja + tigru + tivu + turkmēņu + tokelaviešu + tagalu + klingoņu + tlinkitu + tuaregu + cvanu + tongu + Njasas tongu valoda + tokpisins + turku + congu + cimšiāņu + tatāru + tumbuku + tupu valodas + altajiešu valodas + tuvaliešu + tvī + taitiešu + tuviešu + udmurtu + uiguru + ugaritiešu + ukraiņu + umbundu + nezināma vai nederīga valoda + urdu + uzbeku + vaju + vendu + vjetnamiešu + volapiks + votu + valoņu + vakašu valodas + valamu + varaju + vašo + sorbu + volofu + kalmiku + khosu + jao + japiešu + jidišs + jorubu + jopiku valodas + džuanu + sapoteku + zenagu + ķīniešu + ķīniešu vienkāršotā + ķīniešu tradicionālā + zandē + zulu + zunju + Bez lingvistiska satura + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pasaule + Āfrika + Ziemeļamerika + Dienvidamerika + Okeānija + Rietumāfrika + Centrālamerika + Austrumāfrika + Ziemeļāfrika + Vidusāfrika + Āfrikas dienvidi + Amerika + Amerikas ziemeļi + Karību jūras reģions + Austrumāzija + Dienvidāzija + Centrālaustrumāzija + Dienvideiropa + Austrālija un Jaunzēlande + Melanēzija + Mikronēzijas reģions + Polinēzija + Centrāldienvidāzija + Āzija + Centrālāzija + Rietumāzija + Eiropa + Austrumeiropa + Ziemeļeiropa + Rietumeiropa + Neatkarīgo Valstu Savienība + Latīņamerika un Karību jūras reģions + Andora + Apvienotie Arābu Emirāti + Afganistāna + Antigva un Barbuda + Angilja + Albānija + Armēnija + Nīderlandes Antiļas + Angola + Antarktika + Argentīna + Amerikāņu Samoa + Austrija + Austrālija + Aruba + Olandes salas + Azerbaidžāna + Bosnija un Hercegovina + Barbadosa + Bangladeša + Beļģija + Burkinafaso + Bulgārija + Bahreina + Burundi + Benina + Senbartelmī + Bermudu salas + Bruneja + Bolīvija + Brazīlija + Bahamas + Butāna + Buvē sala + Botsvāna + Baltkrievija + Beliza + Kanāda + Kokosu jeb Kīlinga salas + Kongo Demokrātiskā Republika + Centrālāfrikas Republika + Kongo + Šveice + Kotdivuāra + Kuka salas + Čīle + Kamerūna + Ķīna + Kolumbija + Kostarika + Serbija un Melnkalne + Kuba + Kaboverde + Ziemsvētku sala + Kipra + Čehija + Vācija + Džibutija + Dānija + Dominika + Dominikānas Republika + Alžīrija + Ekvadora + Igaunija + Ēģipte + Rietumsahāra + Eritreja + Spānija + Etiopija + Somija + Fidži + Folklenda salas + Mikronēzijas Federatīvās Valstis + Farēru salas + Francija + Gabona + Lielbritānija + Grenāda + Gruzija + Franču Gviāna + Gērnsija + Gana + Gibraltārs + Grenlande + Gambija + Gvineja + Gvadelupa + Ekvatoriālā Gvineja + Grieķija + Dienviddžordžija un Dienvidsendviču salas + Gvatemala + Guama + Gvineja-Bisava + Gajāna + Ķīnas īpašās pārvaldes apgabals Honkonga + Hērda un Makdonalda salas + Hondurasa + Horvātija + Haiti + Ungārija + Indonēzija + Īrija + Izraēla + Mena + Indija + Britu Indijas okeāna teritorija + Irāka + Irāna + Īslande + Itālija + Džērsija + Jamaika + Jordānija + Japāna + Kenija + Kirgīzija + Kambodža + Kiribati + Komoru salas + Sentkitsa un Nevisa + Ziemeļkoreja + Dienvidkoreja + Kuveita + Kaimanu salas + Kazahstāna + Laosa + Libāna + Sentlūsija + Lihtenšteina + Šrilanka + Libērija + Lesoto + Lietuva + Luksemburga + Latvija + Lībija + Maroka + Monako + Moldova + Melnkalne + Senmartēna + Madagaskara + Māršala salas + Maķedonija + Mali + Mjanma + Mongolija + Ķīnas īpašās pārvaldes apgabals Makao + Ziemeļu Marianas salas + Martinika + Mauritānija + Montserrata + Malta + Maurīcija + Maldīvija + Malāvija + Meksika + Malaizija + Mozambika + Namībija + Jaunkaledonija + Nigēra + Norfolkas sala + Nigērija + Nikaragva + Nīderlande + Norvēģija + Nepāla + Nauru + Niue + Jaunzēlande + Omāna + Panama + Peru + Franču Polinēzija + Papua-Jaungvineja + Filipīnas + Pakistāna + Polija + Senpjēra un Mikelona + Pitkērna + Puertoriko + Palestīniešu pašpārvaldes teritorija + Portugāle + Palau + Paragvaja + Katara + ASV Mazās Aizjūras salas + Eiropas Savienība + Reinjona + Rumānija + Serbija + Krievija + Ruanda + Saūda Arābija + Zālamana salas + Seišeļu salas + Sudāna + Zviedrija + Singapūra + Sv. Helēnas sala + Slovēnija + Svalbāra un Jana Majena sala + Slovākija + Sjerraleone + Sanmarīno + Senegāla + Somālija + Surinama + Santome un Prinsipi + Salvadora + Sīrija + Svazilenda + Tērksas un Kaikosas salas + Čada + Franču dienvidu teritorijas + Togo + Taizeme + Tadžikistāna + Tokelau + Austrumtimora + Turkmenistāna + Tunisija + Tonga + Turcija + Trinidāda un Tobāgo + Tuvalu + Taivāna + Tanzānija + Ukraina + Uganda + ASV mazās aizjūras teritorijas + Amerikas Savienotās Valstis + Urugvaja + Uzbekistāna + Vatikāns + Sentvinsenta un Grenadīnas + Venecuēla + Britu Virdžīnu salas + Amerikāņu Virdžīnu salas + Vjetnama + Vanuatu + Volisa un Futuna + Samoa + Jemena + Majota + Dienvidāfrika + Zambija + Zimbabve + nezināms vai nederīgs reģions + + + kalendārs + salīdzināšana + valūta + + + tradicionālās ķīniešu valodas kārtošanas secība - Big5 + budistu kalendārs + ķīniešu kalendārs + tiešā kārtošanas secība + vienkāršotās ķīniešu valodas kārtošanas secība - GB2312 + Gregora kalendārs + ebreju kalendārs + Indijas nacionālais kalendārs + islāma kalendārs + islāma pilsoņu kalendārs + japāņu kalendārs + tālruņu grāmatas kārtošanas secība + Pinyin kārtošanas secība + Ķīnas Republikas kalendārs + Stroke kārtošanas secība + tradicionālā kārtošanas secība + + + britu + metriskā + + + Valoda: {0} + Rakstība: {0} + Reģions: {0} + + + + [a ā b c č d e ē f g ģ h i ī j k ķ l ļ m n ņ o p r s š t u ū v z ž] + [y q w x] + [a-i y j-x z] + + + “ + ” + ‘ + ’ + + + {0} − {1} + + + + + + janv. + febr. + marts + apr. + maijs + jūn. + jūl. + aug. + sept. + okt. + nov. + dec. + + + janvāris + februāris + marts + aprīlis + maijs + jūnijs + jūlijs + augusts + septembris + oktobris + novembris + decembris + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + Sv + Pr + Ot + Tr + Ce + Pk + Se + + + svētdiena + pirmdiena + otrdiena + trešdiena + ceturtdiena + piektdiena + sestdiena + + + + + S + P + O + T + C + P + S + + + + + + + C1 + C2 + C3 + C4 + + + 1. ceturksnis + 2. ceturksnis + 3. ceturksnis + 4. ceturksnis + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + pirms mūsu ēras + mūsu ērā + + + p.m.ē. + m.ē. + + + p.m.ē. + m.ē. + + + + + + EEEE, y. 'gada' d. MMMM + + + + + y. 'gada' d. MMMM + + + + + y. 'gada' d. MMM + + + + + dd.MM.yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + EEE, d. + EEE, d. + H + HH:mm + HH:mm:ss + HH:mm + L + E, dd.MM. + LLL + E, d. MMM + E, d. MMMM + d. MMMM + d. MMM + dd.mm. + d + mm:ss + mm:ss + y. 'g'. + mm.yyyy. + EEE, dd.mm.yyyy. + yyyy. 'g'. MMM + EEE, yyyy. 'g'. dd. MMM + y. 'g'. MMMM + Q yyyy + y QQQ + Q yy + y. 'g'. + + + {0} - {1} + + mm.–mm. + + + E, dd.MM - E, dd.MM + E, dd.MM – E, dd.MM + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. MMM – E, d. MMM + + + LLLL–LLLL + + + d. MMM - d. MMM + d.-d. MMM + + + dd.mm–dd.mm + dd.mm.–dd.mm. + + + d.–d. + + + HH–HH + HH-HH + + + HH:mm–HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm–HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH–HH v + HH-HH v + + + y.–y. + + + mm.yyyy.–mm.yyyy. + mm.yyyy.–mm.yyyy. + + + EEE, dd.mm.yy. – EEE, dd.mm.yy. + EEE, dd.mm.yy. – EEE, dd.mm.yy. + EEE, dd.mm.yy. – EEE, dd.mm.yy. + + + y. 'gada' MMM-MMM + y. 'gada' MMM - y. 'gada' MMM + + + E, y. 'gada' d. MMM - E, y. 'gada' d. MMM + E, y. 'gada' d. MMM - E, y. 'gada' d. MMM + E, y. 'gada' d. MMM - E, y. 'gada' d. MMM + + + mm.yyyy.–mm.yyyy. + mm.yyyy.–mm.yyyy. + + + y. 'gada' d. MMM - d. MMM + y. 'gada' d.-d. MMM + y. 'gada' d. MMM - y. 'gada' d. MMM + + + dd.mm.yy.–dd.mm.yy. + dd.mm.yyyy.–dd.mm.yyyy. + dd.mm.yy.–dd.mm.yy. + + + + + + ēra + + + Gads + + + Mēnesis + + + Nedēļa + + + diena + aizaizvakar + aizvakar + vakar + šodien + rīt + parīt + aizparīt + + + Nedēļas diena + + + Dayperiod + + + Stundas + + + Minūtes + + + Sekundes + + + Josla + + + + + + + + tišri + hešvans + kisļevs + tevets + ševats + adars + nisans + ijars + sivans + tamuzs + avs + eluls + + + + + + + + + muharams + safars + 1. rabī + 2. rabī + 1. džumādā + 2. džumādā + radžabs + šabans + ramadāns + šauvals + du al-kidā + du al-hidžā + + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + {1} ({0}) + + Nezināma + + + Andora + + + Dubaija + + + Kabula + + + Antigva + + + Angilja + + + Tirāna + + + Erevāna + + + Nīderlandes Antiļas + + + Rotera + + + Palmera + + + Dienvidpols + + + Sjova + + + Mavsona + + + Deivisa + + + Vostoka + + + Kesija + + + Dumont D'Urville + + + Makmerdo + + + Riogaljegosa + + + Mendosa + + + Sanhuana + + + Ušuaja + + + Larioha + + + Sanluisa + + + Katamarka + + + Žužuja + + + Tukumana + + + Kordoba + + + Buenosairesa + + + Pagopago + + + Vīne + + + Pērta + + + Jūkla + + + Dārvina + + + Adelaida + + + Brokenhila + + + Kerija + + + Melburna + + + Hobarta + + + Lindemana + + + Sidneja + + + Brisbena + + + Lordhova + + + Barbadosa + + + Daka + + + Brisele + + + Vagadugu + + + Sofija + + + Bahreina + + + Bužumbura + + + Portonovo + + + Bermudu salas + + + Bruneja + + + Lapasa + + + Eirenupe + + + Riobranko + + + Portuvelju + + + Boavista + + + Manausa + + + Kujaba + + + Santarena + + + Kampugrandi + + + Belena + + + Aragvaina + + + Sanpaulu + + + Brazīlija (Salvadora) + + + Fortalesa + + + Maseio + + + Resifi + + + Noroņa + + + Naso + + + Timpu + + + Minska + + + Beliza + + + Dausona + + + Vaithorsa + + + Inuvika + + + Vankūvera + + + Dousonkrīka + + + Jelounaifa + + + Edmontona + + + Sviftkarenta + + + Kembridžbeja + + + Regīna + + + Vinipega + + + Rezolūta + + + Reinirivera + + + Rankininleta + + + Koralharbora + + + Tanderbeja + + + Nipigona + + + Monreāla + + + Ikaluita + + + Pangnirtanga + + + Monktona + + + Halifaksa + + + Gūsbeja + + + Gleisbeja + + + Blanksablona + + + Sentdžonsa + + + Kokosa + + + Kinšasa + + + Lubumbaši + + + Bangi + + + Brazavila + + + Cīrihe + + + Abidžana + + + Lieldienu sala + + + Santjago + + + Duala + + + Kašgara + + + Urumči + + + Čuncina + + + Harbina + + + Kostarika + + + Havanna + + + Kaboverde + + + Ziemsvētku + + + Nikosija + + + Berlīne + + + Džibutija + + + Kopenhāgena + + + Dominika + + + Santodomingo + + + Alžīra + + + Galapagu salas + + + Gvajakila + + + Tallina + + + Kaira + + + Ajūna + + + Kanāriju salas + + + Seūta + + + Madride + + + Adisabeba + + + Fidži + + + Stenlija + + + Trūka + + + Ponpeja + + + Kosraja + + + Farēru salas + + + Parīze + + + Librevila + + + Londona + + + Grenāda + + + Kajenna + + + Akra + + + Gibraltārs + + + Tūle + + + Nūka + + + Skoresbisunda + + + Denmārkšavna + + + Bandžula + + + Konakri + + + Gvadelupa + + + Atēnas + + + Dienviddžordžija + + + Gvatemala + + + Guama + + + Bisava + + + Gajāna + + + Honkonga + + + Portoprensa + + + Budapešta + + + Džakarta + + + Pontianaka + + + Makasara + + + Džajapūra + + + Dublina + + + Čagosa + + + Bagdāde + + + Teherāna + + + Reikjavīka + + + Roma + + + Jamaika + + + Ammāna + + + Tokija + + + Biškeka + + + Pnompeņa + + + Enderburija + + + Kirisimasi + + + Tarava + + + Komoru + + + Sentkitsa + + + Phenjana + + + Seula + + + Kuveita + + + Kaimanu Salas + + + Aktau + + + Orāla + + + Aktobe + + + Kizilorda + + + Almati + + + Vjangčana + + + Beirūta + + + Sentlūsija + + + Vaduca + + + Kolombo + + + Monrovija + + + Viļņa + + + Luksemburga + + + Rīga + + + Tripole + + + Kasablanka + + + Monako + + + Kišiņeva + + + Antananarivu + + + Kvadžaleina + + + Madžuro + + + Jangona + + + Hovda + + + Ulanbatora + + + Čoibalsana + + + Makao + + + Saipana + + + Martinika + + + Nuakšota + + + Montserrata + + + Maurīcija + + + Maldīvija + + + Blantaira + + + Tihuāna + + + Ermosiljo + + + Masatlāna + + + Čihuahua + + + Montereja + + + Mehiko + + + Kankūna + + + Kualalumpura + + + Kučinga + + + Vindhuka + + + Numea + + + Niameja + + + Norfolka + + + Lagosa + + + Managva + + + Amsterdama + + + Četema + + + Oklenda + + + Muskata + + + Taiti + + + Markvesa + + + Gambjera + + + Portmorsbi + + + Karači + + + Varšava + + + Mikelona + + + Pitkērna + + + Puertoriko + + + Azoru salas + + + Lisabona + + + Asunsjona + + + Katara + + + Reinjona + + + Bukareste + + + Kaļiņingrada + + + Maskava + + + Volgograda + + + Jekaterinburga + + + Omska + + + Novosibirska + + + Krasnojarska + + + Irkutska + + + Jakutska + + + Vladivostoka + + + Sahalīna + + + Magadāna + + + Kamčatka + + + Anadira + + + Rijāda + + + Gvadelkanāla + + + Hartūma + + + Stokholma + + + Singapūra + + + Sv. Helēna + + + Frītauna + + + Dakāra + + + Mogadīšo + + + Santome + + + Salvadora + + + Damaska + + + Grendturka + + + Ndžamena + + + Kergvelena + + + Bangkoka + + + Dušanbe + + + Ašgabata + + + Tunisa + + + Istanbula + + + Portofspeina + + + Taipeja + + + Dāresalāma + + + Užgoroda + + + Kijeva + + + Simferopole + + + Zaporožje + + + Midveja + + + Džonstauna + + + Veika + + + Adaka + + + Noma + + + Ankurāža + + + Jakutata + + + Džuno + + + Losandželosa + + + Fīniksa + + + Šiproka + + + Denvera + + + Ņūsalema + + + Centra Ziemeļdakotā + + + Čikāga + + + Menominī + + + Vinsensa + + + Pēterburga + + + Tellsitija + + + Noksa + + + Vinimaka + + + Marengo + + + Indianapolisa + + + Luisvilla + + + Viveja + + + Montiselo + + + Detroita + + + Ņujorka + + + Samarkanda + + + Taškenta + + + Sentvinsenta + + + Karakasa + + + Senttomasa + + + Hošimina + + + Vallisa + + + Adena + + + Majota + + + Johannesburga + + + + Centrāleiropas laiks + Centrāleiropas vasaras laiks + + + CET + CEST + + + + + Austrumeiropas laiks + Austrumeiropas vasaras laiks + + + EET + EEST + + + + + Kuibiševas laiks + Kuibiševas vasaras laiks + + + + + Maskavas laiks + Maskavas standarta laiks + Maskavas vasaras laiks + + + + + Samaras laiks + Samaras vasaras laiks + + + + + Turcijas laiks + Turcijas vasaras laiks + + + + + Volgogradas laiks + Volgogradas vasaras laiks + + + + + + + , +   + ; + % + 0 + # + + + − + E + ‰ + ∞ + nav skaitlis + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + {0} {1} + + + + Apvienoto Arābu Emirātu dirhēms + + + Afganistānas afgāns + + + Albānijas leks + + + Armēnijas drams + + + Nīderlandes Antiļu guldenis + + + Angolas jaunā kvanza + + + Argentīnas peso + + + Austrijas šiliņš + + + Austrālijas dolārs + + + Arubas guldenis + + + Azerbaidžānas manats + + + Bosnijas konvertējamā marka + + + Barbadosas dolārs + + + Bangladešas taka + + + Beļģijas franks + + + Bulgārijas leva + + + Burundi franks + + + Bermudu salu dolārs + + + Brunejas dolārs + + + Bolīvijas boliviano + + + Brazīlijas reāls + + + Bahamu dolārs + + + Butānas ngultrums + + + Botsvānas pula + + + Baltkrievijas rubelis + + + Belizas dolārs + + + Kanādas dolārs + + + KDR franks + + + Šveices franks + + + Čīles peso + + + Ķīnas juana + + + Kolumbijas peso + + + Kolumbijas reāls + + + Kostarikas kolons + + + Kubas peso + + + Kaboverdes eskudo + + + Kipras mārciņa + + + Čehijas krona + + + Vācijas marka + + + Džibutijas franks + + + Dānijas krona + + + Dominikānas peso + + + Alžīrijas dinārs + + + Igaunijas krona + + + Ēģiptes mārciņa + + + Eritrejas nakfa + + + Spānijas peseta + + + Etiopijas birs + + + eiro + + + Somijas marka + + + Fidži dolārs + + + Folklenda salu mārciņa + + + Francijas franks + + + Lielbritānijas sterliņu mārciņa + + + Gruzijas lari + + + Ganas sedi + + + Gibraltāra mārciņa + + + Gambijas dalasi + + + Gvinejas franks + + + Grieķijas drahma + + + (Gvatemalas) ketsals + + + Gajānas dolārs + + + Honkongas dolārs + + + Hondurasas lempīra + + + Horvātijas kuna + + + Haiti gurds + + + Ungārijas forints + + + Indonēzijas rūpija + + + Īrijas mārciņa + + + Izraēlas šekelis + + + Indijas rūpija + + + Irākas dinārs + + + Irānas riāls + + + Īslandes krona + + + Itālijas lira + + + Jamaikas dolārs + + + Jordānas dinārs + + + Japānas jena + + + Kenijas šiliņš + + + Kirgizstānas soms + + + Ziemeļkorejas vona + + + Dienvidkorejas vona + + + Kuveitas dinārs + + + Kazahstānas tenge + Kazahstānas tenge + + + Laosas kips + + + Libānas mārciņa + + + Šrilankas rūpija + + + Libērijas dolārs + + + Lesoto loti + + + Lietuvas lits + + + Luksemburgas franks + + + Latvijas lats + + + Latvijas rublis + + + Lībijas dinārs + + + Marokas dirhēms + + + Moldovas leja + + + ariari + + + Maķedonijas denārs + + + CFA (Āfrikas) franks + + + Mjanmas kjats + + + Mongolijas tugriks + + + Makao pataka + + + Mauritānijas ugija + + + Maltas lira + + + Maltas mārciņa + + + Maurīcijas rūpija + + + Maldīvijas rūfija + + + Malāvijas kvača + + + Meksikas peso + + + Malaizijas ringits + + + Mozambikas eskudo + + + Mozambikas metikals + + + Namībijas dolārs + + + Nigērijas naira + + + Kordovas oro + + + Nīderlandes guldenis + + + Norvēģijas krona + + + Nepālas rūpija + + + Jaunzēlandes dolārs + + + Omānas riāls + + + Panamas balboa + + + Peru jaunais sols + + + Papua-Jaungvinejas kina + + + Filipīnu peso + + + Pakistānas rūpija + + + Polijas zlots + + + Portugāles eskudo + + + Kataras riāls + + + Rumānijas leja + + + Serbijas dinārs + + + Krievijas rublis + + + Ruandas franks + + + Saūda riāls + + + Zālamana salu dolārs + + + Seišelu salu rūpija + + + Sudānas mārciņa + + + Zviedrijas krona + + + Singapūras dolārs + + + Sv.Helēnas salas mārciņa + + + Slovēnijas tolars + + + Slovakijas krona + + + Sjerraleones leone + + + Somālijas šiliņš + + + Surinamas dolārs + + + Surinamas guldenis + + + Santome un Prinsipi dobra + + + Salvadoras kolons + + + Svazilendas lilangeni + + + Taizemes bāts + + + Tadžikistānas somons + + + Turkmēnijas manats + + + Tunisijas dinārs + + + Tongas paanga + + + Turcijas lira + + + jaunā Turcijas lira + + + Trinidādas un Tobāgo dolārs + + + jaunais Taivānas dolārs + + + Tanzānijas šiliņš + + + Ukrainas grivna + + + Ugandas šiliņš + + + ASV dolārs + + + Urugvajas peso + + + Uzbekistānas sums + + + Venecuēlas bolivārs + + + Venecuēlas stiprais bolivārs + + + Vjetnamas dongi + + + Vanuatu vatu + + + Samoa tala + + + sudrabs + + + zelts + + + Eiropas naudas vienība + + + Austrumkarību dolārs + + + Speciālās aizņēmuma tiesības + + + Eiropas norēķinu vienība + + + Francijas zelta franks + + + Francijas UIC franks + + + pallādijs + + + platīns + + + nezināma vai nederīga valūta + + + Jemenas riāls + + + Dienvidāfrikas rands + + + Zambijas kvača + + + Zimbabves dolārs + + + + + + {0} diena + {0} dienas + {0} dienas + + + {0} stunda + {0} stundas + {0} stundas + + + {0} minūte + {0} minūtes + {0} minūtes + + + {0} mēnesis + {0} mēneši + {0} mēneši + + + {0} sekunde + {0} sekundes + {0} sekundes + + + {0} nedēļa + {0} nedēļas + {0} nedēļas + + + {0} gads + {0} gadi + {0} gadi + + + + + jā:ja:j + nē:ne:n + + + + diff --git a/lib/zend/Zend/Locale/Data/lv_LV.xml b/lib/zend/Zend/Locale/Data/lv_LV.xml new file mode 100644 index 0000000000..8195da026c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/lv_LV.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/metazoneInfo.xml b/lib/zend/Zend/Locale/Data/metazoneInfo.xml new file mode 100644 index 0000000000..e90a70a360 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/metazoneInfo.xml @@ -0,0 +1,1404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/mk.xml b/lib/zend/Zend/Locale/Data/mk.xml new file mode 100644 index 0000000000..da9a5c4ff2 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/mk.xml @@ -0,0 +1,2322 @@ + + + + + + + + + + + афар + абхазиски + акинески + аколи + адангме + адиге + авестан + африкански + афроазијатски + африхили + аину + акан + акадијски + алеут + алгонквијански + јужен алтај + амхариски + арагонески + стар англиски + ангика + апачи + арапски + арамејски + арокенски + арапахо + вештачки + аравак + асамски + астуриски + атапаски + австралиски + аварски + авади + ајмара + азербејџански + башкирски + банда + бамилеке + балучи + балинезе + баса + балтички + белоруски + беха + бемба + бербер + бугарски + бихари + бојпури + бислама + бикол + бини + сиксика + бамбара + бенгалски + банту + тибетски + бретонски + брај + босански + батак + буријат + буџински + блин + каталонски + кадо + централноамерикански индијански + кариб + кавкаски + ацам + чеченски + себуано + селтички + чаморо + чибча + чагатај + чуук + мари + жаргон чинук + чокто + чипујан + чироки + чејенски + чамски + корзикански + коптски + англиски креолски + француски креолски + португалски креолски + кри + кримско турски + креолски + чешки + кашубиски + црковнословенски + кушитски + чувашки + велшки + дански + дакота + даргва + дајак + германски + германски (во Австрија) + германски (во Швајцарија) + делавер + славски + догриб + динка + догри + дравидијски + долносорбиски + дуала + среднохоландски + дивехи + џула + џонга + еве + ефик + староегипетски + екајук + грчки + еламит + англиски + англиски (во Австралија) + англиски (во Канада) + англиски (во Велика Британија) + американски англиски + средноанглиски + есперанто + шпански + шпански (во Латинска Америка) + шпански (во Португалија) + естонски + баскиски + евондо + персиски + фанг + фанти + фула + фински + филипински + финоугриски + фиџиски + фарски + фон + француски + француски (во Канада) + француски (во Швајцарија) + среднофранцуски + стар француски + северен фризиски + источен фризиски + фрулијански + фризиски + ирски + га + гајо + гбаја + шкотско галски + германски јазици + гиз + гилбертански + галициски + среден горногермански + гуарани + стар високогермански + гонди + горонтало + готски + грево + старогрчки + швајцарско германски + гуџарати + манкс + гвишин + хауза + хајда + хавајски + хебрејски + хинди + хилигајнон + химашали + хитите + хмонг + хири моту + хрватски + горносорбиски + хаитски + унгарски + хупа + ерменски + хереро + интерлингва + ибан + индонезиски + интерлинг + игбо + сичуан ји + ихо + инупијак + илоко + индиски јазици + индоевропски + ингуш + идо + ирански + ироквијански јазици + исландски + италијански + инуктитут + јапонски + лојбански + еврејско персиски + еврејско арапски + јавански + грузиски + кара калпак + кабиле + кашин + жжи + камба + карен + кави + кабардиски + тјап + коро + конго + каси + којсански јазици + котанески + кикују + куањама + казакстански + калалисут + камбоџански + кимбунду + каннада + корејски + конкани + козрејски + кпеле + канури + карашај-балкар + карелијски + кру + курук + кашмирски + курдски + кумик + кутенајски + коми + корнуолски келтски + киргистански + латински + ладино + ланда + ламба + луксембуршки + лежгијски + ганда + лимбуршки + лингала + лао + монго + лози + литвански + луба-катанга + луба-лулуа + луизено + лунда + луо + лушајски + латвиски + мадурески + магахи + маитхили + макасарски + мандинго + австронезиски + масаи + мокша + мандар + мендески + малгашки + средноирски + маршалски + маорски + микмек + минанкабау + други јазици + македонски + мон-кмерски јазици + малајалам + монголски + манчу + манипури + манобо + молдавски + мохак + моси + марати + малезиски + малтешки + повеќе јазици + мунда јазици + крик + мирандески + марвари + бурмански + мајански јазици + ержа + науру + нахуатл + северноамерикански индијански јазици + неаполски + норвешки бокмал + северен ндебеле + долногермански + непалски + невари + ндонга + нијас + нигер-кордофаниски јазици + најуан + холандски + холандски (во Белгија) + норвешки ниноршк + норвешки + ногај + стар норски + нко + јужен ндебелески + северен сото + нубијски јазици + навахо + класичен невари + њања + њамвези + њанколе + њоро + нзима + окситански + оџибва + оромо + орија + осетиски + осаж + отомански турски + отомиски јазици + пунџаби + папуански + пангасинан + палависки + пампанга + папиаменто + палауански + стар персиски + филипински јазик + феникиски + пали + полски + понпејански + пракритски јазици + стар провенчал + пашто + португалски + португалски (во Бразил) + португалски (во Португалија) + кечуа + раџастански + рапануи + раротонган + реторомански + рундиски + романски + романски јазици + ромски + рутски + руски + влашки + кињарванда + санскрит + сандаве + јакутски + јужноамерикански индијански + салишански јазици + самариќански арамејски + сасак + сантали + сардиниски + сицилијански + скоц + синди + северен самиски + селкап + семитски + санго + стар ирски + знаковни јазици + српско-хрватски + шан + синхалиски + сидамо + сијуски јазици + синотибетански + словачки + словенечки јазик + словенски јазици + самоански + јужен сами + самиски јазици + луле сами + инари сами + сколт сами + шона + сонинке + сомалиски + согдијен + сонгај + албански + српски + срански тонго + серер + свати + нилско-сахарски јазици + сесото + сунданески + сукума + сусу + сумериски + шведски + свахили + класичен сиријак + сиријак + тамилски + таи + телугу + тимне + терено + тетум + таџикистански + тајландски + тигрејски + тигре + тив + туркменистански + токелау + тагалог + клингонски + тлингит + тамашек + цвана + тонга + њаса тонга + ток писин + турски + цонга + цимшијански + татарски + тумбука + туписки јазици + алтајски + тувалу + тви + тахитски + тувинијански + удмурт + ујгурски + угаритски + украински + умбунду + непознат или неважечки јазик + урду + узбекистански + ваи + венда + виетнамски + волапјок + вотски + валунски + вакашански + валамо + вареј + вашо + сорбиски + волофски + калмик + хауса + јао + јапезе + јидски + јоруба + јуписки јазици + жуанг + запотек + блисимболс + зенага + кинески + поедноставен кинески + традиционален кинески + зандиски + зулу + зуни + без лингвистичка содржина + заза + + + + + + + + + + + + Свет + Африка + Северна Америка + Јужна Америка + Океанија + Западна Африка + Централна Америка + Источна Африка + Северна Африка + Средна Африка + Јужна континентална Африка + Америки + Северна континентална Америка + Кариби + Источна Азија + Јужна Азија + Југоисточна Азија + Јужна Европа + Австралија и Нов Зеланд + Меланезија + Микронезиски регион + Полинезија + Јужно-централна Азија + Азија + Централна Азија + Западна Азија + Европа + Источна Европа + Северна Европа + Западна Европа + Комонвелт на независни држави + Латинска Америка и Карибите + Андора + Обединети Арапски Емирати + Авганистан + Антигва и Барбуда + Ангвила + Албанија + Ерменија + Холандски Антили + Ангола + Антарктик + Аргентина + Американска Самоа + Австрија + Австралија + Аруба + Аландски острови + Азербејџан + Босна и Херцеговина + Барбадос + Бангладеш + Белгија + Буркина Фасо + Бугарија + Бахреин + Бурунди + Бенин + Сент Бартоломеј + Бермуди + Брунеи + Боливија + Бразил + Бахами + Бутан + Боувитови острови + Боцвана + Белорусија + Белизе + Канада + Кокосови острови + Демократска Република Конго + Централна Африканска Република + Конго + Швајцарија + Брегот на Слоновата Коска + Кукови Острови + Чиле + Камерун + Кина + Колумбија + Костарика + Србија и Црна Гора + Куба + Зеленортски Острови + Божиќни Острови + Кипар + Чешка Република + Германија + Џибути + Данска + Доминика + Доминиканска Република + Алжир + Еквадор + Естонија + Египет + Западна Сахара + Еритреја + Шпанија + Етиопија + Финска + Фиџи + Фолкландски Острови + Микронезија + Фарски Острови + Франција + Габон + Велика Британија + Гренада + Грузија + Француска Гвајана + Гвернзи + Гана + Гибралтар + Гренланд + Гамбија + Гвинеја + Гвадалупе + Екваторска Гвинеја + Грција + Јужна Грузија и Јужни Сендвич Острови + Гватемала + Гвам + Гвинеа-Биса + Гвајана + Хонг Конг С.А.Р Кина + Хардови острови и Мекдоналд Острови + Хондурас + Хрватска + Хаити + Унгарија + Индонезија + Ирска + Израел + Островот Ман + Индија + Британско Индиско Океанска територија + Ирак + Иран + Исланд + Италија + Џерси + Јамајка + Јордан + Јапонија + Кенија + Киргистан + Камбоџа + Кирибати + Коморос + Сент Кристофер и Невис + Северна Кореја + Јужна Кореја + Кувајт + Кајмански Острови + Казахстан + Лаос + Либан + Света Лучија + Лихтенштајн + Шри Ланка + Либерија + Лесото + Литванија + Луксембург + Латвија + Либија + Мароко + Монако + Молдавија + Црна Гора + Сент Мартин + Мадагаскар + Маршалови острови + Македонија + Мали + Мјанмар + Монголија + Макао С.А.Р Кина + Северни Маријанини Острови + Мартиник + Мавританија + Монсерат + Малта + Маурициус + Малдиви + Малави + Мексико + Малезија + Мозамбик + Намибија + Нова Каледонија + Нигер + Нофролк Остров + Нигерија + Никарагва + Холандија + Норвешка + Непал + Науру + Ние + Нов Зеланд + Оман + Панама + Перу + Француска Полинезија + Папуа Нова Гвинеја + Филипини + Пакистан + Полска + Сент Пјер и Микелан + Питкарн + Порторико + Палестинска Територија + Португалија + Палау + Парагвај + Катар + Зависни земји во Океанија + Европска унија + Ријунион + Романија + Србија + Русија + Руанда + Саудиска Арабија + Соломоновите Острови + Сејшели + Судан + Шведска + Сингапур + Света Елена + Словенија + Свалбард и Жан Мејен + Словачка + Сиера Леоне + Сан Марино + Сенегал + Сомалија + Суринам + Сао Томе и Принчипе + Ел Салвадор + Сирија + Свазиленд + Турк и Каикос Острови + Чад + Француски Јужни територии + Того + Тајланд + Таџикистан + Токелау + Источен Тимор + Туркменистан + Тунис + Тонга + Турција + Тринидад и Тобаго + Тувалу + Тајван + Танзанија + Украина + Уганда + Американски територии во Пацификот + Соединети Американски Држави + Уругвај + Узбекистан + Ватикан + Сент Винсент и Гренадините + Венецуела + Британски Девствени Острови + Девствени Острови на САД + Виетнам + Ванату + Волис и Футуна острови + Самоа + Јемен + Мајоте + Јужна Африка + Замбија + Зимбабве + Непознат регион + + + Календар + Сортирање + Валута + + + Традиционално кинеско сортирање + Будистички календар + Кинески календар + Директно сортирање + Поедноставено кинеско сортирање + Грегоријански календар + Еврејски календар + Индијски национален календар + Исламски календар + Исламски граѓански календар + Јапонски календар + Азбучен редослед + Сортирање Pinyin + Календар на Република Кина + Ритмички редослед + Традиционално сортирање + + + Американски + Метрички + + + Јазик: {0} + Писмо: {0} + Регион: {0} + + + + [а-г ѓ д-з ѕ и ј к ќ л љ м н њ о-ч џ ш] + [ѐ ѝ] + [a-c č d-l ł m-o º p-z] + + + + + + + + јан. + фев. + мар. + апр. + мај + јун. + јул. + авг. + септ. + окт. + ноем. + декем. + + + јануари + февруари + март + април + мај + јуни + јули + август + септември + октомври + ноември + декември + + + + + ј + ф + м + а + м + ј + ј + а + с + о + н + д + + + + + + + нед. + пон. + вт. + сре. + чет. + пет. + саб. + + + недела + понеделник + вторник + среда + четврток + петок + сабота + + + + + н + п + в + с + ч + п + с + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + + јан-мар + апр-јун + јул-сеп + окт-дек + + + прво тромесечје + второ тромесечје + трето тромесечје + четврто тромесечје + + + + претпладне + попладне + + + пр.н.е. + ае. + + + + + + EEEE, dd MMMM y + + + + + dd MMMM y + + + + + dd.M.yyyy + + + + + dd.M.yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + dd MMMM + dd.M + Q yy + M.yyyy + MMMM y + + + {0} - {1} + + M-M + + + E, dd.M - E, dd.M + E, dd.M - E, dd.M + + + MMM-MMM + + + E, dd MMM - E, dd MMM + E, dd - E, dd MMM + + + dd MMM - dd MMM + dd-dd MMM + + + dd.M - dd.M + dd.M - dd.M + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + M.yy - M.yy + M.yy - M.yy + + + E, dd.M.yy - E, dd.M.yy + E, dd.M.yy - E, dd.M.yy + E, dd.M.yy - E, dd.M.yy + + + MMM-MMM y + MMM y - MMM y + + + E, dd MMM - E, dd MMM y + E, dd - E, dd MMM y + E, dd MMM y - E, dd MMM y + + + dd MMM - dd MMM y + dd-dd MMM y + dd MMM y - dd MMM y + + + dd.M.yy - dd.M.yy + dd.M.yy - dd.M.yy + dd.M.yy - dd.M.yy + + + + + + Ера + + + Месец + + + Недела + + + завчера + Вчера + Денес + Утре + задутре + + + Ден во неделата + + + Час + + + Минута + + + Секунда + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Непознато + + + Ротера + + + Палмер + + + Јужен пол + + + Сајова + + + Мосон + + + Дејвис + + + Восток + + + Кејси + + + Димон дурвиј + + + Мекмурдо + + + Рио Галегос + + + Мендоза + + + Сан Хуан + + + Ушуаја + + + Ла Риоха + + + Сан Луис + + + Катамарка + + + Салта + + + Џуџуи + + + Тукуман + + + Кордоба + + + Буенос Аирес + + + Перт + + + Јукла + + + Дарвин + + + Аделаида + + + Брокен Хил + + + Курие + + + Мелбурн + + + Хобарт + + + Линдеман + + + Сиднеј + + + Бризбејн + + + Лорд Хоув + + + Еирунепе + + + Рио Бранко + + + Порто Вељо + + + Боа Виста + + + Манаус + + + Куиаба + + + Сантарем + + + Кампо Гранде + + + Белем + + + Арагвајана + + + Сао Паоло + + + Бахиа + + + Форталеза + + + Масијо + + + Ресифе + + + Нороња + + + Досон + + + Вајтхорс + + + Инувик + + + Ванкувер + + + Досон Крик + + + Јелоунајф + + + Едмонтон + + + Свифт Курент + + + КембриџŸ Беј + + + Реџина + + + Винипег + + + Резолут + + + Рејни Ривер + + + Ренкин Инлет + + + Корал Харбор + + + Тандр Беј + + + Нипигон + + + Торонто + + + Монтреал + + + Иквалит + + + Пангниртунг + + + Монктон + + + Халифакс + + + Гус Беј + + + Глејс Беј + + + Бланк-Сејблон + + + Сент Џонс + + + Киншаса + + + Лубумбаши + + + Велигденски остров + + + Кашгар + + + Урумки + + + Чонгкинг + + + Харбин + + + Галапагос + + + Канарски острови + + + Сеута + + + Трук + + + Понапе + + + Кошре + + + Туле + + + Скорзбисинд + + + Данмаркшан + + + Џакарта + + + Понтијанак + + + Макасар + + + Џајапура + + + Ендербери + + + Киритимати + + + Тарава + + + Актау + + + Орал + + + Акутобе + + + Кизилорда + + + Алма-Ата + + + Кваџалеин + + + Ховд + + + Улан Батор + + + Чојбалсан + + + Тихуана + + + Хермосиљо + + + Мецатлан + + + Чихуахуа + + + Монтереј + + + Мексико Сити + + + Мерида + + + Канкун + + + Кучинг + + + Катхам + + + Маркесас + + + Гамбије + + + Азори + + + Мадеира + + + Калининград + + + Москва + + + Волгоград + + + Самара + + + Јекатеринбург + + + Омск + + + Новосибирск + + + Краснојарск + + + Иркутск + + + Јакутск + + + Владивосток + + + Сакалин + + + Магадан + + + Камчатка + + + Анадир + + + Ужгород + + + Симферопол + + + Запорожје + + + Мидвеј + + + Џонстон + + + Вејк + + + Адак + + + Ноум + + + Хонолулу + + + Енкориџ + + + Јакутат + + + Џуно + + + Лос Анџелес + + + Бојзи + + + Феникс + + + Шипрок + + + Денвер + + + Њу Салем, Северна Дакота + + + Центар, Северна Дакота + + + Чикаго + + + Меномини + + + Винчен, Индијана + + + Питерсбург, Индијана + + + Тел Сити, Индијана + + + Нокс, Индијана + + + Винамек, Индијана + + + Маренго, Индијана + + + Индијанаполис + + + Луизвил + + + Вивај, Индијана + + + Монтичело, Кентаки + + + Детроит + + + Њујорк + + + Самарканд + + + true + + + + Средноевропско време + Средноевропско летно време + + + CET + CEST + + true + + + + Источноевропско време + Источноевропско летно време + + + EET + EEST + + true + + + true + + + + Кујбишев + Летно време во Кујбишев + + + + + Москва + Стандардно време во Москва + Летно време во Москва + + + + + Самара + Летно време во Самара + + + + + Турција + Летно време во Турција + + true + + + + Волгоград + Летно време во Волгоград + + + + + + + , + . + + + + + #,##0.###;(#,##0.###) + + + + + + Андорска Пезета + + + Обединети Арапски Емирати Дирхам + + + Авгани (1927-2002) + + + Авгани + + + Албански Лек + + + Ермениски Драм + + + Анголска Кванза + + + Анголска Кванза (1977-1990) + + + Анголска нова Кванза (1990-2000) + + + Аргентински Пезос (1983-1985) + + + Аргентински Пезос + + + Австралиски Шилинг + + + Австралиски Долар + + + Босанско-Херцеговски Динар + + + Босанско-Херцеговска конвертибилна марка + + + Барбадоски Долар + + + Белгиски Франк (конвертибилен) + + + Белгиски Франк + + + Белгиски Франк (финансиски) + + + Бугарски цврст лев + + + Бугарски нов лев + + + Бахреински Динар + + + Бурундиски Франк + + + Бермудски Долар + + + Брунејски долар + + + Бахамски Долар + + + Боцванска Пула + + + Белоруска нова рубља (1994-1999) + + + Белоруска Рубља + + + Белизиски Долар + + + Канадски Долар + + + Швајцарски Франк + + + Чилеански пезос + + + Колумбиски Пезос + + + Костарикански Колон + + + Чехословачка цврста корона + + + Кубански пезос + + + Кипарска фунта + + + Чешка корона + + + Германска Марка + + + Данска круна + + + Доминикански Пезос + + + Алжирски Динар + + + Египетска Фунта + + + Шпанска Пезета + + + Етиописки Бир + + + Евро + + + Финска марка + + + Фиџи долар + + + Фолкландска фунта + + + Француски франк + + + Британска Фунта + + + Грузиски лари + + + Ганајски Седи + + + Гибралтарска фунта + + + Гамбиски Даласи + + + Гвинејски франк + + + Грчка драхма + + + Гватемалски кветцал + + + Гвинејски Бисау пезос + + + Гвијански Долар + + + Хонгконшки долар + + + Хондурска лемпира + + + Хрватски динар + + + Хрватска Куна + + + Хаитски гурд + + + Унгарска форинта + + + Индонезиска рупија + + + Ирска фунта + + + Изрелска фунта + + + Израелски нов шекел + + + Индијска рупија + + + Ирачки динар + + + Ирански риал + + + Исландска крона + + + Италијанска лира + + + Јамајкански долар + + + Јордански динар + + + Јапонски јен + + + Кениски шилинг + + + Киргистански сом + + + Камбоџиски рел + + + Коморски долар + + + Северно корејски вон + + + Јужно корејски вон + + + Кувајтски динар + + + Казахстанска тенга + + + Лаоски кип + + + Либанска фунта + + + Шриланканска рупија + + + Либериски долар + + + Лесотско лоти + + + Литваниска лита + + + Литваниски литаз + + + Луксембуршки франк + + + Латвијски лат + + + Латвијска рубља + + + Либијски динар + + + Марокански Дирхам + + + Марокански франк + + + Молдавски леу + + + Македонски денар + + + Малски франк + + + Монголиски тугрик + + + Макао патака + + + Малтешка лира + + + Малтешка фунта + + + Мексикански пезос + + + Мексикански сребрен пезос (1861-1992) + + + Малазиски рингит + + + Мозамбиско ескудо + + + Стар мозамбиски метикал + + + Намибиски долар + + + Нигериска наира + + + Никарагванска кордоба + + + Холандски гилдер + + + Норвешка круна + + + Непалска рупија + + + Новозеландски долар + + + Омански риал + + + Панамска балбоа + + + Перуански нов сол + + + Перуански сол + + + Папуа новогвинејска кина + + + Филипински пезос + + + Пакистанска рупија + + + Полска злота + + + Полска злота (1950-1995) + + + Португалско ескудо + + + Парагвајска гуарана + + + Катарски риал + + + Романска леа + Романски леи + + + Српски динар + + + Руска рубља + + + Руска рубља (1991-1998) + + + Руандски франк + + + Саудиски ријал + + + Соломонски долар + + + Сејшелска рупија + + + Стар судански динар + + + Стара суданска фунта + + + Шведска круна + + + Сингапурски долар + + + Словенечки толар + + + Словачка круна + + + Сиералеонско леоне + + + Сомалијски шилинг + + + Суринамски гилдер + + + Советска рубља + + + Салвадорски колон + + + Сиријска фунта + + + Свазилендски лиланген + + + Таи бат + + + Таџикистанска рубља + + + Таџикистански сомони + + + Туркменистански манат + + + Тунезиски динар + + + Тиморски ескудо + + + Турска лира + + + Тајвански нов долар + + + Танзаниски шилинг + + + Украинска хривнија + + + Угандиски шилинг (1966-1987) + + + Угандиски шилинг + + + Американски долар + + + САД долар (Next day) + + + САД долар (Same day) + + + Уругвајски пезос (1975-1993) + + + Уругвајски пезос + + + Узбекистански сом + + + Венецуелски боливар + + + Виетнамски донг + + + Ванатски вату + + + Самоанска тала + + + Источно карибиски долар + + + Јеменски динар + + + Јеменски риал + + + Југословенски динар + + + Југословенски конвертибилен динар + + + Јужно афрички ранд(финансиски) + + + Јужно афрички ранд + + + Замбијска квача + + + Заирско новозаире + + + Заирско заире + + + Зимбабвиски долар + + + + + + {0} ден + {0} денови + + + {0} час + {0} часови + + + {0} минута + {0} минути + + + {0} месец + {0} месеци + + + {0} секунда + {0} секунди + + + {0} недела + {0} недели + + + {0} година + {0} години + + + + + да:д + не:н + + + + diff --git a/lib/zend/Zend/Locale/Data/mk_MK.xml b/lib/zend/Zend/Locale/Data/mk_MK.xml new file mode 100644 index 0000000000..5de9c719d2 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/mk_MK.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ml.xml b/lib/zend/Zend/Locale/Data/ml.xml new file mode 100644 index 0000000000..7a05cbc6cd --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ml.xml @@ -0,0 +1,4424 @@ + + + + + + + + + + + {0} ({1}) + , + + + അഫാര്‍ + അബ്ഖാസിയന്‍ + അചിനീസ് + അകോലി + അഡാങ്ഗമി + അഡൈഗേ + അവസ്റ്റാന്‍ + ആഫ്രിക്കാന്‍സ് + ആഫ്രോ-ഏഷ്യാറ്റിക് ഭാഷ + ആഫ്രിഹിലി + അയിനു + അകാന്‍ + അക്കാഡിയന്‍ + അലൈട്ട് + അല്‍ഗോണ്‍ക്യന്‍ ഭാഷ + സതേണ്‍ അള്‍ട്ടായി + അമാറിക് + അരഗോണീസ് + പഴയ ഇംഗ്ലീഷ് + ആന്‍ഗിക + അപ്പാചേ ഭാഷ + അറബി + അരമായഭാഷ + ആരൗകാനിയന്‍ + അരപാഹോ + കൃത്രിമഭാഷ + അറാവക് + ആസ്സാമീസ് + ഓസ്‌ട്രിയന്‍ + അതപാസ്കന്‍ ഭാഷ + ഓസ്ട്രേലിയന്‍ ഭാഷ + അവാരിക് + അവധി + അയ്മാറ + അസര്‍ബൈജാനി + ബഷ്ഖിര്‍ + ബന്‍ഡ + ബാമിലകേ ഭാഷ + ബലൂചി + ബാലിനീസ് + ബസ + ബാള്‍ട്ടിക് ഭാഷ + ബൈലോറഷ്യന്‍ + ബേജ + ബെംബ + ബെര്‍ബര്‍ + ബള്‍ഗേറിയന്‍ + ബീഹാറി + ഭോജ്‌പൂരി + ബിസ്‌ലാമ + ബികോല്‍ + ബിനി + സിക്സിക + ബംബാറ + ബംഗാളി + ബാന്‌ടു + തിബറ്റന്‍ + ബ്രറ്റണ്‍ + ബ്രജ് + ബോസ്നിയന്‍ + ബാറ്റക് + ബുറിയത്ത് + ബുഗിനീസ് + ബ്ലിന്‍ + കറ്റാലന്‍ + കാഡോ + മദ്ധ്യ അമേരിക്കന്‍ ഇന്‍ഡ്യന്‍ ഭാഷ + കാരിബ് + കൊക്കേഷ്യന്‍ ഭാഷ + അറ്റ്സാം + ചെചന്‍ + സെബുവാനോ + സെല്‍റ്റിക് ഭാഷ + കമോറോ + ചിബ്ച + ചഗതൈ + ചൂകീസ് + മാരി + ചിനൂഗ്-ജാര്‍ഗണ്‍ + ചോക്റ്റാവ് + ചിപേവ്യന്‍ + ചെരോകീ + ചിയേന്നേ + ചാമിക് ഭാഷ + കോഴ്സിക്കണ്‍ + കോപ്റ്റിക് + ഇംഗ്ലീഷ് അധിഷ്ഠിത മിശ്ര ഭാഷ + ഫ്രഞ്ച് അധിഷ്ഠിത മിശ്രഭാഷ + പോര്‍ച്ചുഗീസ് അധിഷ്ടിത മിശ്ര ഭാഷ + ക്രീ + ക്രിമിയന്‍ ടര്‍ക്കിഷ് + മിശ്രഭാഷ + ചെക്ക് + കാഷുബിയാന്‍ + ചര്‍ച്ച് സ്ലാവിക് + കുഷിറ്റിക് ഭാഷ + ചുവാഷ് + വെല്‍ഷ് + ഡാനിഷ് + ഡകോട്ട + ഡര്‍ഗ്വാ + ദയാക് + ജര്‍മ്മന്‍ + ഓസ്ട്രിയന്‍ ജര്‍മന്‍ + സ്വിസ് ഉച്ച ജര്‍മന്‍ + ദലവാരെ + സ്ലേവ് + ഡോഗ്രിബ് + ദിന്‍ക + ഡോഗ്രി + ദ്രാവിഡഭാഷ + ലോവര്‍ സോര്‍ബിയന്‍ + ദ്വാല + മദ്ധ്യ ഡച്ച് + ദിവെഹി + ദ്വൈല + ഭൂട്ടാനി + എവ് + എഫിക് + പ്രാചീന ഈജിപ്ഷ്യന്‍ + എകാജുക് + ഗ്രീക്ക് + എലാമൈറ്റ് + ഇംഗ്ലീഷ് + ഓസ്ട്രേലിയന്‍ ഇംഗ്ലീഷ് + കനേഡിയന്‍ ഇംഗ്ലീഷ് + ബ്രിട്ടീഷ് ഇംഗ്ലീഷ് + അമേരിക്കന്‍ ഇംഗ്ലീഷ് + മദ്ധ്യ ഇംഗ്ലീഷ് + എസ്പരാന്തോ + സ്പാനിഷ് + ലാറ്റിന്‍ അമേരിക്കന്‍ സ്പാനിഷ് + ഇബേറിയന്‍ സ്പാനിഷ് + എസ്റ്റോണിയന്‍ + ബാസ്ക് + എവോന്‍ഡോ + പേര്‍ഷ്യന്‍ + ഫങ് + ഫിലിപ്പീനോ + ഫുല + ഫിന്നിഷ് + ഫിലിപ്പിനോ + ഫിന്നോ-ഉഗ്രിയന്‍ ഭാഷ + ഫിജിയന്‍ + ഫാറോസ് + ഫോന്‍ + ഫ്രഞ്ച് + കനേഡിയന്‍ ഫ്രഞ്ച് + സ്വിസ് ഫ്രഞ്ച് + മദ്ധ്യ ഫ്രഞ്ച് + പഴയ ഫ്രഞ്ച് + നോര്‍ത്തേന്‍ ഫ്രിഷ്യന്‍ + ഈസ്റ്റേണ്‍ ഫ്രിഷ്യന്‍ + ഫ്രിയുലിയാന്‍ + പശ്ചിമ ഫ്രിഷിയന്‍ + ഐറിഷ് + ഗാ + ഗയൊ + ഗബ്യ + സ്കോട്ടിഷ് ഗൈലിക് + ജര്‍മാനിക് ഭാഷ + ഗീസ് + ഗില്‍ബര്‍സേ + ഗലീഷ്യന്‍ + മദ്ധ്യ ഉച്ച ജര്‍മന്‍ + ഗ്വാറാനി + പ്രാചീന ഉച്ച ജര്‍മന്‍ + ഗോണ്ഡി + ഗൊറോന്‍റാലോ + ഗോഥിക്ക് + ഗ്രബൊ + പുരാതന യവന ഭാഷ + സ്വിസ് ജര്‍മന്‍ + ഗുജറാത്തി + മാന്‍സ് + ഗ്വിച്ച് ഇന്‍ + ഹൗസ + ഹൈഡ + ഹവായിയന്‍ + ഹീബ്രു + ഹിന്ദി + ഹിലിഗയ്നോണ്‍ + ഹിമാചലി + ഹിറ്റൈറ്റേ + മോങ് + ഹിരി മോതു + ക്രൊയേഷ്യന്‍ + അപ്പര്‍ സോര്‍ബിയന്‍ + ഹെയ്തിയന്‍ + ഹംഗേറിയന്‍ + ഹൂപ + അര്‍മേനിയന്‍ + ഹെരേരൊ + ഇന്‍റര്‍ലിംഗ്വാ + ഇബാന്‍ + ഇന്‍ഡോനേഷ്യന്‍ + ഇന്റര്‍ലിംഗ്വ + ഇഗ്ബോ + ഷുവാന്‍യി + ഇജോ + ഇനുപിയാക് + ഇലോകോ + ഭാരതീയഭാഷ + ഇന്‍ഡോ-യൂറോപ്യന്‍ ഭാഷ + ഇംഗ്വിഷ് + ഇഡോ + ഇറാനിയന്‍ ഭാഷ + ഇറോക്വായിയന്‍ ഭാഷ + ഐസ്‌ലാന്‍ഡിക് + ഇറ്റാലിയന്‍ + ഇനുക്റ്റിറ്റട്ട് + ജപ്പാനീസ് + ലോജ്ബാന്‍ + ജൂഡിയോ-പേര്‍ഷ്യന്‍ + ജൂഡിയോ-അറബിക് + ജാവാനീസ് + ജോര്‍ജിയന്‍ + കര-കാല്‍പ്പക് + കബൈല്‍ + കാചിന്‍ + ജ്ജു + കംബ + കരേന്‍ + കാവി + കബര്‍ഡിയാന്‍ + ട്യാപ് + കോറോ + കോംഗോ + ഘാസി + ഘോയിസന്‍ ഭാഷ + ഘോറ്റാനേസേ + കികൂയു + ക്വാന്യമ + കസാഖ് + കലാല്ലിസട്ട് + കംബോഡിയന്‍ + ക്ലിംഗന്‍ + കന്നഡ + കൊറിയന്‍ + കൊങ്കണി + കൊസറേയന്‍ + കപെല്ലേ + കനൂറി + കരചൈ-ബാല്‍കര്‍ + കരീലിയന്‍ + ക്രു + കുരുഖ് + കാശ്മീരി + കുര്‍ദ്ദിഷ് + കുമൈക് + കുതേനൈ + കോമി + കോര്‍ണിഷ് + കിര്‍ഗിസ് + ലാറ്റിന്‍ + ലാഡിനോ + ലഹ്‌ന്‍ഡ + ലംബ + ലക്സംബര്‍ഗിഷ് + ലഹ്ഗിയാന്‍ + ഗാന്‍ഡ + ലിംബര്‍ഗിഷ് + ലിംഗാല + ലാവോ + മോങ്കോ + ലോസി + ലിത്വേനിയന്‍ + ലുബ-കറ്റംഗ + ലൂബ-ലുലുവ + ലൂയിസെനോ + ലുന്‍ഡ + ലവോ + ലുഷായി + ലാത്വിയന്‍ + മദുരേസേ + മഗാഹി + മൈഥിലി + മകാസര്‍ + മണ്ഡിന്‍ഗോ + ഓസ്ട്രോനേഷ്യന്‍ + മസൈ + മോക്ഷ + മണ്ഡാര്‍ + മെന്‍ഡെ + മലഗാസി + മദ്ധ്യ ഐറിഷ് + മാര്‍ഷല്ലീസ് + മൗറി + മിക്മാക് + മിനാങ്കബൗ + ഇതരഭാഷ + മാസിഡോണിയന്‍ + മോണ്‍-ഖമര്‍ ഭാഷ + മലയാളം + മംഗോളിയന്‍ + മന്‍ചു + മണിപ്പൂരി + മനോബോ ഭാഷ + മോള്‍ഡാവിയന്‍ + മോഹാക് + മൊസ്സി + മറാഠി + മലയ + മാള്‍ട്ടീസ് + പലഭാഷകള്‍ + മുണ്ഡ ഭാഷ + ക്രീക്ക് + മിരാന്‍റസേ + മര്‍വാരി + ബര്‍മീസ് + മായന്‍ ഭാഷ + ഏഴ്സ്യ + നൗറു + നാഹ്വാള്‍‍ട്ട് + വടക്കേ അമേരിക്കന്‍ ഇന്‍ഡ്യന്‍ ഭാഷ + നെപ്പോളിറ്റാന്‍ + നോര്‍വീജിയന്‍ ബുക്‌മല്‍ + നോര്‍ത്ത് ഡെബിള്‍ + ലോ ജര്‍മന്‍ + നേപ്പാളി + നേവാരി + ഡോങ്ക + നിയാസ് + നൈ‍ജര്‍-കോര്‍‍ഡോഫാനിയന്‍ + ന്യുവാന്‍ + ഡച്ച് + ഫ്ലമിഷ് + നോര്‍വീജിയന്‍ നൈനോര്‍ക്സ് + നോര്‍വീജിയന്‍ + നോഗൈ + പഴയ പേര്‍ഷ്യന്‍ + ഇന്‍കോ + ദക്ഷിണ നെഡിബിള്‍ + നോര്‍ത്തേന്‍ സോതോ + നുബിയന്‍ ഭാഷ + നവാഹൊ + ക്ലാസിക്കല്‍ നേവാരി + ന്യന്‍ജ + ന്യാംവേസി + ന്യാന്‍കലേ + ന്യോറോ + സിമ + ഒക്സിററന്‍ + ഓജിബ്വാ + ഒറോമൂ + ഒറിയ + ഒസ്സെറ്റിക് + ഒസേജ് + ഓട്ടോമന്‍ തുര്‍ക്കിഷ് + ഓട്ടോമിയന്‍ ഭാഷ + പഞ്ചാബി + പാപുവാന്‍ ഭാഷ + പങ്കാസിനന്‍ + പാഹ്ലവി + പാംപന്‍ഗ + പാപിയാമെന്‍റൊ + പലാവുന്‍ + പ്രാചീന പേര്‍ഷ്യന്‍ + ഫിലിപീനി ഭാഷ + ഫീനിഷ്യന്‍ + പാലി + പോളിഷ് + പൊന്‍പിയന്‍ + പ്രാകൃതം + പ്രൊവന്‍ഷ്ല്‍ + പഷ്തു + പോര്‍ച്ചുഗീസ് + ബ്രസീലിയന്‍ പോര്‍ച്ചുഗീസ് + ഇബേറിയന്‍ പോര്‍ച്ചുഗീസ് + ക്വെച്ചുവ + രാജസ്ഥാനി + രാപനൂയി + രാരോടോങ്കന്‍ + രഹയ്ട്ടോ-റോമന്‍സ് + റുണ്ടി + റുമേനിയന്‍ + റോമന്‍സ് ഭാഷ + റോമനി + മൂലഭാഷ + റഷ്യന്‍ + ആരോമാനിയന്‍ + കിന്യര്‍വണ്ട + സംസ്കൃതം + സാന്‍ഡവേ + യാകൂട് + ദക്ഷിണ അമേരിക്കന്‍ ഇന്‍ഡ്യന്‍ ഭാഷ + സാലിഷാന്‍ ഭാഷ + സമരിയാക്കാരുടെ അരമായ + സസാക് + സന്താലി + സര്‍ഡിനിയാന്‍ + സിസിലിയന്‍ + സ്കോട്സ് + സിന്ധി + വടക്കന്‍ സമി + സെല്‍കപ് + സെമറ്റിക് ഭാഷ + സാങ്കോ + പ്രാചീന ഐറിഷ് + ആംഗ്യഭാഷ + സെര്‍ബോ-ക്രൊയേഷ്യന്‍ + ഷാന്‍ + സിംഹള + സിഡാമോ + സിവോന്‍ ഭാഷ + ചീന-ടിബത്തന്‍ ഭാഷ + സ്ലോവാക്ക് + സ്ലോവേനിയന്‍ + സ്ലേവിക് ഭാഷ + സമോവന്‍ + സതേണ്‍ സമി + സമി ഭാഷ + ലൂലീ സമി + ഇനാരി സാമി + സ്കോള്‍ട്ട് സമി + ഷോണാ + സോണിന്‍കെ + സോമാലി + സോജിഡിയന്‍ + സോംഗൈ + അല്‍ബേനിയന്‍ + സെര്‍ബിയന്‍ + ശ്രാനന്‍ ഡോങ്കോ + സെറര്‍ + സ്വാറ്റി + നിളോ-സഹാറന്‍ ഭാഷ + തെക്കന്‍ സോതോ + സുഡാനീസ് + സുകുമ + സുസു + സുമേരിയന്‍ + സ്വീഡിഷ് + സ്വാഹിലി + പുരാതന സുറിയാനിഭാഷ + സുറിയാനി + തമിഴ് + തായ് ഭാഷ + തെലുങ്ക് + ടിംനേ + ടെറേനോ + ടെറ്റും + താജിക് + തായ് + ടൈഗ്രിന്യ + ടൈഗ്രി + ടിവ് + തുര്‍ക്മെന്‍ + ടൊക്കേലൗ + തഗാലോഗ് + ക്ലിംഗോണ്‍ + ലിംഗ്വിറ്റ് + ടമഷേക് + ത്സ്വാന + ടോംഗ + ന്യാസാ ഡോങ്ക + ടോക് പിസിന്‍ + തുര്‍ക്കി + ത്സോംഗ + സിംഷ്യന്‍ + ടാട്ടാര്‍ + തുംബുക + തുപി ഭാഷ + അറ്റ്ലാന്‍റിക്ക് ഭാഷ + തുവാലു + ട്വി + താഹിതിയന്‍ + തുവിനിയന്‍ + ഉഡ്മുര്‍ട്ട് + ഉയ്ഘുര്‍ + ഉഗറിട്ടിക് + ഉക്രേനിയന്‍ + ഉംബുന്ദു + അറിയാത്തതോ നിലവിലില്ലാത്തതോ ആയ ഭാഷ + ഉറുദു + ഉസ്ബെക് + വൈ + വെന്ദ + വിയറ്റ്നാമീസ് + വോളാപുക് + വോട്ടിക് + വല്ലൂണ്‍ + വകഷന്‍ ഭാഷകള്‍ + വലമൊ + വാരേയ് + വാഷൊ + സോര്‍ബിയന്‍ ഭാഷ + വൊളോഫ് + കല്‍മൈക് + ഖോസാ + യാവോ + യെപ്പീസ് + യിദ്ദിഷ് + യൊറൂബാ + യുപിക് + സ്വാംഗ് + സാപ്പോടെക് + ബ്ലിസ്സിംബല്‍സ് + സെനഗ + ചൈനീസ് + ലളിതചീനഭാഷ + പരമ്പരാഗത ചൈനീസ്‌ + സാന്ദെ + സുലു + സുനി + ഭാഷേതരം + സാസാ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ലോകം + ആഫ്രിക്ക + വടക്കേ അമേരിക്കന്‍ ഭൂഖണ്ഡം + തെക്കേ അമേരിക്കന്‍ ഭൂഖണ്ഡം + ഓഷ്യാനിയ + പശ്ചിമ ആഫ്രിക്ക + മദ്ധ്യഅമേരിക്ക + കിഴക്കന്‍ ആഫ്രിക്ക + വടക്കേ ആഫ്രിക്ക + മദ്ധ്യആഫ്രിക്ക + തെക്കേ ആഫ്രിക്ക + അമേരിക്കന്‍ ഭൂഖണ്ഡം + വടക്കേ അമേരിക്ക + കരീബിയന്‍ + കിഴക്കന്‍ ഏഷ്യ + തെക്കേ ഏഷ്യ + തെക്ക്-കിഴക്കന്‍ ഏഷ്യ + തെക്കേ യൂറോപ്പ് + ഓസ്ട്രേലിയയും ന്യൂസിലാന്‍ഡും + മെലനേഷ്യ + മൈക്രോനേഷ്യന്‍ പ്രദേശം + പോളിനേഷ്യ + ദക്ഷിണ-മദ്ധ്യ ഏഷ്യ + ഏഷ്യ + മദ്ധ്യേഷ്യ + പശ്ചിമേഷ്യ + യൂറോപ്പ് + കിഴക്കന്‍ യൂറോപ്പ് + വടക്കേ യൂറോപ്പ് + പശ്ചിമ യൂറോപ്പ് + സ്വതന്ത്രരാഷ്ട്രങ്ങളുടെ കോമണ്‍‌വെല്‍ത്ത് + ചെക്കോസ്ലോവാക്യ + ലാറ്റിനമേരിക്കയും കരീബിയനും + ചാനല്‍ ദ്വീപുകള്‍ + അന്‍റോറ + സംയുക്ത അറബ് രാഷ്ട്രം + അഫ്ഗാനിസ്ഥാന്‍ + ആന്‍റിഗ്വയും ബര്‍ബുഡയും + ആന്‍ഗ്വില്ല + അല്‍ബേനിയ + അര്‍മേനിയ + നെതര്‍ലന്‍ഡ്സ് ആന്‍റിലിസ് + അംഗോള + അന്‍റാര്‍ട്ടിക്ക + അര്‍ജന്‍റീന + അമേരിക്കന്‍ സാമോവ + ഓസ്ട്രിയ + ഓസ്ട്രേലിയ + അറുബ + അലന്‍ഡ് ദ്വീപുകള്‍ + അസര്‍ബൈജാന്‍ + ബോസ്നിയയും ഹെര്‍സഗോവിനയും + ബാര്‍ബഡോസ് + ബംഗ്ലാദേശ് + ബെല്‍ജിയം + ബുര്‍ക്കിനാ ഫാസോ + ബള്‍ഗേറിയ + ബഹ്റൈന്‍ + ബുറുണ്ടി + ബെനിന്‍ + സെന്‍റ് ബാര്‍ത്തെല്‍മി + ബര്‍മുഡ + ബ്രൂണൈ + ബൊളീവിയ + ബ്രസീല്‍ + ബഹാമാസ് + ഭൂട്ടാന്‍ + ബൗവെറ്റ് ദ്വീപ് + ബോട്സ്വാന + ബെലറൂസ് + ബെലീസ് + കാനഡ + കോക്കസ് + കോംഗോ - കിന്‍ഷാസ + സെന്‍ട്രല്‍ ആഫ്രിക്കന്‍ റിപ്പബ്ലിക് + കോംഗോ - ബ്രാസാവില്‍ + സ്വിറ്റ്സര്‍ലാന്‍ഡ് + ഐവറി കോസ്റ്റ് + കൂക്ക് ദ്വീപുകള്‍ + ചിലി + കാമറൂണ്‍ + ചൈന + കൊളംബിയ + കോസ്റ്ററിക്ക + സെര്‍ബിയയും മോണ്ടനേഗ്രോയും + ക്യൂബ + കേപ്പ് വെര്‍ഡെ + ക്രിസ്മസ് ദ്വീപ് + സൈപ്രസ്സ് + ചെക്ക് റിപ്പബ്ലിക് + ജര്‍മനി + ജിബൂട്ടി + ഡെന്‍മാര്‍ക്ക് + ഡൊമിനിക്ക + ഡൊമിനിക്കന്‍ റിപ്പബ്ലിക് + അള്‍ജീരിയ + ഇക്വഡോര്‍ + എസ്റ്റോണിയ‍ + ഈജിപ്ത് + പശ്ചിമ സഹാറ + എറിത്രിയ + സ്പെയിന്‍ + എത്യോപ്യ + ഫിന്‍ലാന്‍ഡ് + ഫിജി + ഫാക്ക്‌ലാന്‍റ് ഐലന്‍റ് + മൈക്രോനേഷ്യ + ഫറോയി ദ്വീപുകള്‍ + ഫ്രാന്‍സ് + ഗാബോണ്‍ + ബ്രിട്ടന്‍ + ഗ്രനേഡ + ജോര്‍ജിയ + ഫ്രഞ്ച് ഗയാന + ഗേണ്‍സി + ഘാന + ജിബ്രാള്‍ട്ടര്‍ + ഗ്രീന്‍ലാന്‍റ് + ഗാംബിയ + ഗ്വിനിയ + ഗുവാഡെലോപ് + ഇക്വിറ്റോറിയല്‍ ഗ്വിനിയ + ഗ്രീസ് + ദക്ഷിണ ജോര്‍ജ്ജിയയും ദക്ഷിണ സാന്‍ഡ്‌വിച്ച് ദ്വീപുകളും + ഗ്വാട്ടിമാലാ + ഗ്വാം + ഗിനി-ബിസോ + ഗയാന + ഹോങ് കോങ് എസ്.ഏ.ആര്‍. ചൈന + ഹിയേര്‍ഡ് ദ്വീപും മക്ഡൊണാള്ഡ് ദ്വീപുകളും + ഹോണ്ടുറാസ് + ക്രൊയേഷ്യ + ഹെയ്തി + ഹംഗറി + ഇന്‍ഡോനേഷ്യ + അയര്‍ലാന്‍ഡ് + ഇസ്രായേല്‍ + ഐല്‍ ഓഫ് മാന്‍ + ഇന്ത്യ + ബ്രിട്ടീഷ് ഇന്ത്യന്‍ മഹാസമുദ്ര പ്രദേശം + ഇറാക്ക് + ഇറാന്‍ + ഐസ്‌ലാന്റ് + ഇറ്റലി + ജേഴ്സി + ജമൈക്ക + ജോര്‍ദ്ദാന്‍ + ജപ്പാന്‍ + കെനിയ + കിര്‍ഗിസ്ഥാന്‍ + കംബോഡിയ + കിരിബാത്തി + കോമറോസ് + സെയ്ന്‍റ് കിറ്റ്സും നെവിസും + ഉത്തരകൊറിയ + ദക്ഷിണകൊറിയ + കുവൈറ്റ് + കേയ്മാന്‍ ദ്വീപുകള്‍ + കസാഖിസ്ഥാന്‍ + ലാവോസ് + ലബനോണ്‍ + സെന്‍റ് ലൂസിയ + ലൈച്ടെസ്റ്റിന്‍ + ശ്രീലങ്ക + ലൈബീരിയ + ലെസോത്തോ + ലിത്വാനിയ + ലക്സംബര്‍ഗ് + ലാത്വിയ + ലിബിയ + മൊറോക്കൊ + മൊണോക്കൊ + മള്‍ഡോവ + മോണ്ടേനേഗ്രോ + സെന്‍റ് മാര്‍ട്ടിന്‍ + മഡഗാസ്കര്‍ + മാര്‍ഷല്‍‍‍ ദ്വീപുകള്‍ + മാസിഡോണിയ + മാലി + മ്യാന്‍മാര്‍ + മംഗോളിയ + മക്കാവോ SAR ചൈന + ഉത്തര മറിയാനാ ദ്വീപുകള്‍ + മാര്‍ട്ടീനിക് + മൗറിറ്റാനിയ + മോണ്ട്സെറാറ്റ് + മാള്‍ട്ട + മൗറീഷ്യസ് + മാലിദ്വീപ് + മലാവി + മെക്സിക്കോ + മലേഷ്യ + മൊസാംബിക്ക് + നമീബിയ + പുതിയ കാലിഡോണിയ + നൈജര്‍ + നോര്‍ഫോക് ദ്വീപ് + നൈജീരിയ + നിക്കാരഗ്വ + നെതര്‍ലന്‍ഡ്സ് + നോര്‍വെ + നേപ്പാള്‍ + നൗറൂ + ന്യൂവേ + ന്യൂസിലാന്‍റ് + ഒമാന്‍ + പനാമ + പെറു + ഫ്രഞ്ച് പോളിനേഷ്യ + പപ്പുവ ന്യൂ ഗ്വിനി + ഫിലിപ്പൈന്‍സ് + പാക്കിസ്ഥാന്‍ + പോളണ്ട് + സെന്‍റ് പിറേയും മിക്വലണും + പിറ്റ്കെയ്ന്‍ + പോര്‍ട്ടോ റിക്കോ + പാലസ്തീന്‍ + പോര്‍ച്ചുഗല്‍ + പലാവു + പരാഗ്വേ + ഖത്തര്‍ + പുറംദ്വീപുകള്‍ + യൂറോപ്യന്‍ യൂണിയന്‍ + റീയൂണിയന്‍ + റുമേനിയ + സെര്‍ബിയ + റഷ്യ + റുവാണ്ട + സൗദി അറേബ്യ + സോളമന്‍‍ ദ്വീപുകള്‍ + സെയ്ഷെല്‍സ് + സുഡാന്‍ + സ്വീഡന്‍ + സിംഗപ്പുര്‍ + സെന്‍റ് ഹെലീന + സ്ലോവേനിയ + സ്വാല്‍ബാഡും ജാന്‍ മായേനും + സ്ലോവാക്യ + സിയേറാ ലിയോണ്‍ + സാന്‍ മറിനോ + സെനഗല്‍ + സോമാലിയ + സുറിനാം + സാവോ റ്റമെ ആന്‍ഡ് പ്രിന്‍സിപ്പി + എല്‍ സാല്‍വദോര്‍ + സിറിയ + സ്വാസിലാന്‍റ് + ടര്‍ക്ക്സും കൈക്കോ ദ്വീപുകളും + ചാഡ് + ഫ്രഞ്ച് ദക്ഷിണ ഭൂപ്രദേശം + ടോഗോ + തായ്‌ലാന്‍ഡ് + താജിക്കിസ്ഥാന്‍ + ടൊകെലാവു + കിഴക്കന്‍ തിമൂര്‍ + തുര്‍ക്ക്മെനിസ്ഥാന്‍ + ടുണീഷ്യ + ടോംഗ + തുര്‍ക്കി + ട്രിനിഡാഡും റ്റൊബാഗോയും + തുവാലു + തായ്‌വാന്‍ + ടാന്‍സാനിയ + ഉക്രൈന്‍ + ഉഗാണ്ട + യുണൈറ്റഡ് സ്റ്റേറ്റ്സും ചെറിയ പുറംദ്വീപുകളും + അമേരിക്കന്‍ ഐക്യനാടുകള്‍ + ഉറുഗ്വേ + ഉസ്ബെക്കിസ്ഥാന്‍ + വത്തിക്കാന്‍ + സെന്‍റ് വിന്‍സന്‍റും ഗ്രനഡൈന്‍സും + വെനിസ്വേല + ബ്രിട്ടീഷ് വിര്‍ജിന്‍ ദ്വീപുകള്‍ + യു.എസ്. വെര്‍ജിന്‍ ദ്വീപുകള്‍ + വിയറ്റ്നാം + വന്വാത്തു + വാലിസ് ആന്‍ഡ് ഫ്യുചൂന + സാമോവ + യമന്‍ + മയോട്ട് + ദക്ഷിണാഫ്രിക്ക + സാംബിയ + സിംബാബ്വേ + അറിയപ്പെടാത്തതോ നിലവിലില്ലാതµതതോ ആയ പ്രദേശം + + + 1996-ലെ ജര്‍മന്‍ ലിപി + 1606 വരെയുള്ള ആധുനികമദ്ധ്യകാല ഫ്രഞ്ച് + കിഴക്കന്‍ അര്‍മീനിയന്‍ + ബൂണ്ട്‌ലിങ്ങ് + ഐപി‌എ സ്വനവ്യവസ്ഥ + മോണോറ്റോണിക് + നേറ്റിസോണ്‍ പ്രാദേശികരൂപം + ഗ്നിവ/നിജിവ പ്രാദേശികരൂപം + കമ്പ്യൂട്ടര്‍ + പരിഷ്ക്കരിച്ച ലിപി + + + കലണ്ടര്‍ + അകാരാദിക്രമം + നാണയം + + + പരമ്പരാഗത ചൈനീസ് ക•്രമീകരണം - ബിഗ്5 + ബുദ്ധമതകലണ്ടര്‍ + ചൈനീസ് കലണ്ടര്‍ + പ്രത്യക്ഷക്രമീകരണം + ലളിതമായ ചൈനീസ് ക്രമീകരണം - ജീബി2312 + ഇംഗ്ലീഷ് കലണ്ടര്‍ + ഹീബ്രൂ കലണ്ടര്‍ + ശകവര്‍ഷ കലണ്ടര്‍ + ഇസ്ലാം കലണ്ടര്‍ + ഇസ്ലാം-സിവില്‍ കലണ്ടര്‍ + ജാപ്പനീസ് കലണ്ടര്‍ + ഫോണ്‍ബുക്കിലെ ക്രമീകരണം + പിന്‍‌യിന്‍ ക്രമീകരണം + ചൈനീസ് കലണ്ടര്‍ + സ്റ്റ്രോക്ക് ക്രമീകരണം + പരമ്പരാഗത ക്രമീകരണം + + + യു.എസ്. + മെട്രിക് + + + ഭാഷ: {0} + ലിപി: {0} + ദേശം: {0} + + + + [\u200C \u200D ഃ അ-ഋ ൠ ഌ ൡ എ-ഐ ഒ-ന പ-മ ം യ ര ല വ-ഹ ള ഴ റ ാ-ൃ െ-ൈ ൊ ോ ൗ ൌ \u0D4D] + [a-z] + [a-z] + + + “ + ” + ‘ + ’ + + + + + + + + ജനു + ഫെബ്രു + മാര്‍ + ഏപ്രി + മേയ് + ജൂണ്‍ + ജൂലൈ + ഓഗ + സെപ്റ്റം + ഒക്ടോ + നവം + ഡിസം + + + ജനുവരി + ഫെബ്രുവരി + മാര്‍ച്ച് + ഏപ്രില്‍ + മേയ് + ജൂണ്‍ + ജൂലൈ + ഓഗസ്റ്റ് + സെപ്റ്റംബര്‍ + ഒക്ടോബര്‍ + നവംബര്‍ + ഡിസംബര്‍ + + + + + ജ + ഫെ + മാ + ഏ + മേ + ജൂ + ജൂ + ഓ + സെ + ഒ + ന + ഡി + + + + + + + ഞായര്‍ + തിങ്കള്‍ + ചൊവ്വ + ബുധന്‍ + വ്യാഴം + വെള്ളി + ശനി + + + ഞായറാഴ്ച + തിങ്കളാഴ്ച + ചൊവ്വാഴ്ച + ബുധനാഴ്ച + വ്യാഴാഴ്ച + വെള്ളിയാഴ്ച + ശനിയാഴ്ച + + + + + ഞാ + തി + ചൊ + ബു + വ്യാ + വെ + ശ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + ഒന്നാം പാദം + രണ്ടാം പാദം + മൂന്നാം പാദം + നാലാം പാദം + + + + + 1 + 2 + 3 + 4 + + + + am + pm + + + ക്രിസ്തുവിനു് മുമ്പ്‌ + ക്രിസ്തുവിന് പിന്‍പ് + + + ക്രി.മു. + ക്രി.പി. + + + ക്രി.മു. + ക്രി.പി. + + + + + + y, MMMM d, EEEE + + + + + y, MMMM d + + + + + y, MMM d + + + + + dd/MM/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + + {1} {0} + + + + d EEE + L + M/d, E + LLL + MMM d, E + MMMM d, E + MMMM d + MMM d + dd-MM + d/M + d + h:mm a + mm:ss + y + M-y + d-M-yyyy, EEE + y MMM + y MMM d, EEE + y MMMM + yyyy Q + y QQQ + Q yy + MM-yyyy + MMMM y + + + {0} - {1} + + M-M + + + d/M, E - d/M, E + d/M, E - d/M, E + + + MMM-MMM + + + MMM d, E - MMM d, E + MMM d, E - MMM d, E + + + LLLL-LLLL + + + MMM d - MMM d + MMM d-d + + + d/M - d/M + d/M - d/M + + + d-d + + + h a – h a + h–h a + + + h:mm a – h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + h:mm a – h:mm a v + h:mm–h:mm a v + h:mm–h:mm a v + + + h a – h a v + h–h a v + + + y-y + + + M/yy – M/yy + M/yy – M/yy + + + d/M/yy, E - d/M/yy, E + d/M/yy, E - d/M/yy, E + d/M/yy, E - d/M/yy, E + + + y MMM-MMM + y MMM - y MMM + + + y MMM d, E - MMM d, E + y, MMM d, E - d, E + y MMM d, E - y MMM d, E + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + y MMM d - MMM d + y MMM d-d + y MMM d - y MMM d + + + d/M/yy – d/M/yy + d/M/yy – d/M/yy + d/M/yy – d/M/yy + + + + + + അബ്ദം + + + വര്‍ഷം + + + മാസം + + + ആഴ്ച + + + ദിവസം + മൂന്നുദിവസം മുമ്പ് + മിനിഞ്ഞാന്ന് + ഇന്നലെ + ഇന്നു് + നാളെ + മറ്റന്നാള്‍ + ഇന്നേക്ക് മൂന്നാം‌പക്കം + + + ആഴ്ചയിലെ ദിവസം + + + am/pm + + + മണിക്കൂര്‍ + + + മിനിട്ട് + + + സെക്കന്റ് + + + മേഖല + + + + + + + + ചൈത്രം + വൈശാഖം + ജ്യേഷ്ഠം + ആഷാഢം + ശ്രാവണം + ഭാദ്രപാദം + ആശ്വിനം + കാര്‍ത്തികം + മാര്‍ഗശീര്‍ഷം + പൗഷം + മാഘം + ഫല്‍ഗുനം + + + + + ചൈ + വൈ + ജ്യേ + ആ + ശ്രാ + ഭാ + ആ + കാ + മാ + പൗ + മാ + ഫ + + + + + + ശക + + + + + + + + മുഹറം + സഫര്‍ + റബീഹുല്‍ അവ്വല്‍ + റബീഹുല്‍ ആഖിര്‍ + ജമാദുല്‍ അവ്വല്‍ + ജമാദുല്‍ ആഖിര്‍ + റജബ് + ശഹബാന്‍ + റമളാന്‍ + ശവ്വാല്‍ + ദുല്‍ ഖഹദ് + ദുല്‍ ഹിജ്ജ + + + + + മു + സ + റ-അ + റ-ആ + ജ-അ + ജ-ആ + റ + ശ + റ + ശ + ദു + ദു-ഹി + + + + + + ഹിജറ + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} സമയം + {1} ({0}) + + അറിയപ്പെടാത്ത നഗരം + + + റൊതീറ + + + പാമര്‍ + + + ദക്ഷിണ ധ്രൂവം + + + സ്യോവ + + + മാവ്സണ്‍ + + + ഡെയ്‌വിസ് + + + വോസ്റ്റോക് + + + കാസെ + + + ഡ്യൂമണ്ട് ഡി യുര്‍വില്‍ + + + മാക്മര്‍ഡോ + + + റിയോ ഗ്യാലഗോസ് + + + മെന്‍ഡോസ + + + സാന്‍ ജുവാന്‍ + + + ഉഷിയ + + + ലാ റിയോജ + + + സാന്‍ ലൂയിസ് + + + ‍ക്യാറ്റമാര്‍ക്ക + + + ജുജുയ് + + + റ്റുകുമാന്‍ + + + കൊര്‍ദോവ + + + ബ്യൂനസ് ഐറിസ് + + + പെര്‍ത്ത് + + + യൂക്ല + + + ഡാര്‍വിന്‍ + + + അഡലെയ്ഡ് + + + ബ്രോക്കണ്‍ ഹില്‍ + + + ക്യൂറി + + + മെല്‍ബണ്‍ + + + ഹൊബാര്‍ട്ട് + + + ലിന്‍ഡെമാന്‍ + + + സിഡ്നി + + + ബ്രിസ്‌ബേയ്ന്‍ + + + ലോഡ് ഹോവ് + + + യെറുനീപ്പെ + + + റിയോ ബ്രാങ്കോ + + + പോര്‍ട്ടോ വെല്ലോ + + + ബോവ വിസ്റ്റ + + + മനൌസ് + + + കുയ്ബ + + + ക്യാന്പോ ഗ്രാന്‍ഡെ + + + ബെലം + + + അറഗ്വൈന + + + സാവോ പോലോ + + + ബഹിയ + + + ഫോര്‍ട്ടലീസ + + + മാസിയോ + + + റെസീഫെ + + + നൊറോന + + + ഡോവ്സണ്‍ + + + വൈറ്റ്ഹോഴ്സ് + + + ഇനുവിക് + + + വാന്‍‌കൂവര്‍ + + + ഡോവ്സണ്‍ ക്രീക്ക് + + + യെല്ലോനൈഫ് + + + എഡ്മോണ്‍ടണ്‍ + + + സ്വിഫ്റ്റ് കറന്‍റ് + + + കെയ്ന്പ്രിഡ്ജ് ബേ + + + റിജീന + + + വിന്നിപെഗ് + + + റെസല്യൂട്ട് + + + റെയ്നി റിവര്‍ + + + റാങ്കിന്‍ ഇന്‍ലെറ്റ് + + + കോറല്‍ ഹാര്‍ബര്‍ + + + തണ്ടര്‍ ബേ + + + നിപ്പിഗോണ്‍ + + + ടൊറണ്ടോ + + + മോണ്ട്രിയാല്‍ + + + ഇഖാലിത് + + + പാന്‍ഗ്‌നിറ്റങ് + + + മോങ്റ്റണ്‍ + + + ഹാലിഫാക്സ് + + + ഗൂസ് ബേ + + + ഗ്ലെയ്സ് ബേ + + + ബ്ലാങ്ക് സാബ്ലോണ്‍ + + + സെയ്ന്‍റ് ജോണ്‍സ് + + + കിന്‍ഷാസ + + + ലൂബുംബാഷി + + + ഈസ്റ്റര്‍ + + + കാഷ്ഗര്‍ + + + ഉറുംഖി + + + ചോങ്ഖിങ് + + + ഹാര്‍ബിന്‍ + + + ഗാലപ്പാഗോസ് + + + ക്യാനറി + + + ക്യൂട്ട + + + ട്രക് + + + പൊനാപ് + + + കൊസ്രേ + + + തൂളി + + + സ്കോര്‍സ്ബൈസണ്ട് + + + ഡാന്‍മാര്‍ക്ക്ഷാവ്ന്‍ + + + ജക്കാര്‍ത്ത + + + പൊന്‍റിയാനക് + + + മകസ്സര്‍ + + + ജയപുര + + + എന്‍ഡബറി + + + കിരിതിമാത്തി + + + തരാവ + + + അഖ്തൌ + + + ഓറല്‍ + + + അഖ്തോബ് + + + ഖിസിലോര്‍ഡ + + + അല്‍മതി + + + ക്വാജലെയ്ന്‍ + + + മജൂറോ + + + ഹൌഡ് + + + ഉലാന്‍ബട്ടൂര്‍ + + + ചൊയ്ബല്‍സന്‍ + + + തിയുവാന + + + ഹെര്‍മോസില്ലോ + + + മാസറ്റ്ലാന്‍ + + + ചിവാവു + + + മോണ്ടര്‍‌റേ + + + മെക്സിക്കോ സിറ്റി + + + മെരിഡ + + + കന്‍കൂന്‍ + + + കുചിങ് + + + ചാത്തം + + + മാര്‍ക്യുസാസ് + + + ഗാന്പിയര്‍ + + + എയ്സോര്‍സ് + + + മഡെയ്റ + + + ക്യാലിനിന്‍ഗ്രാഡ് + + + മോസ്കോ + + + വോള്‍ഗോഗ്രാഡ് + + + സമാറ + + + യാകാറ്റെറിന്‍ബര്‍ഗ് + + + ഒംസ്ക് + + + നൊവോസിബിര്‍സ്ക് + + + ക്രാസ്നോയാസ്ക് + + + ഇര്‍കസ്ക് + + + യാകസ്ക് + + + വ്ളാഡിവോസ്റ്റോക് + + + സഖാലിന്‍ + + + മഗഡാന്‍ + + + കാംചട്ക + + + അനാഡിര്‍ + + + ഉസ്ഗൊറോഡ് + + + കീവ് + + + സിംഫെറോപോള്‍ + + + സാപ്പറോസൈ + + + മിഡ്‌വേ + + + ജോണ്‍സ്റ്റണ്‍ + + + വെയ്ക് + + + അഡാക് + + + നൌം + + + ഹോണലൂലു + + + ആങ്കറേജ് + + + യാകുറ്റാറ്റ് + + + ജുനിയു + + + ലോസ് എയ്ഞ്ചലസ് + + + ബൊയ്സി + + + ഫീനിക്സ് + + + ഷിപ്പ്റോക്ക് + + + ഡെന്‍‌വര്‍ + + + ന്യൂ സെയ്‌ലം, നോര്‍ത്ത് ഡക്കോട്ട + + + സെന്‍റര്‍, നോര്‍ത്ത് ഡക്കോട്ട + + + ചിക്കാഗോ + + + മെനോമിനീ + + + വിന്‍സെന്‍സ്, ഇന്‍ഡ്യാന + + + പീറ്റേഴ്സ്ബര്‍ഗ്, ഇന്‍ഡ്യാന + + + റ്റെല്‍ സിറ്റി, ഇന്‍ഡ്യാന + + + നോക്സ്, ഇന്‍ഡ്യാന + + + വിനാമാക്, ഇന്‍ഡ്യാന + + + മരെങ്കോ, ഇന്‍ഡ്യാനാ + + + ഇന്‍ഡ്യാനാപോലീസ് + + + ലൂയിവില്‍ + + + വിവെയ്, ഇന്‍ഡ്യാന + + + മോണ്ടിസെല്ലോ, കെന്‍റക്കി + + + ഡെട്രോയിറ്റ് + + + ന്യൂയോര്‍ക്ക് + + + സമര്‍ക്കന്ദ് + + + + എയ്ക്കര്‍ സമയം + എയ്ക്കര്‍ വേനല്‍ക്കാല സമയം + + + ACT (എയ്ക്കര്‍) + ACST (എയ്ക്കര്‍) + + + + + അഫ്ഗാനിസ്ഥാന്‍ സമയം + + + + + മദ്ധ്യ ആഫ്രിക്കന്‍ സമയം + + + + + കിഴക്കേ ആഫ്രിക്കന്‍ സമയം + + + + + ദക്ഷിണാഫ്രിക്കന്‍ സമയം + ദക്ഷിണാഫ്രിക്കന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + പശ്ചിമാഫ്രിക്കന്‍ സമയം + പശ്ചിമാഫ്രിക്കന്‍ വേനല്‍ക്കാല സമയം + + + + + അക്ത്യുബിന്‍സ്ക് സമയം + അക്ത്യുബിന്‍സ്ക് വേനല്‍ക്കാല സമയം + + + + + അലാസ്ക്ക സമയം + അലാസ്ക സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + അലാസ്ക പകല്‍ സമയം + + + + + അലാസ്ക-ഹവായി സമയം + അലാസ്ക-ഹവായി സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + അലാസ്ക-ഹവായി പകല്‍ സമയം + + + + + അല്‍മതി സമയം + അല്‍മതി വേനല്‍ക്കാല സമയം + + + + + ആമസോണ്‍ സമയം + ആമസോണ്‍ വേനല്‍ക്കാല സമയം + + + + + സെന്‍ട്രല്‍ സമയം + സെന്‍ട്രല്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + സെന്‍ട്രല്‍ പകല്‍ സമയം + + + + + കിഴക്കന്‍ സമയം + കിഴക്കന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + കിഴക്കന്‍ പകല്‍ സമയം + + + + + മൌണ്ടന്‍ സമയം + മൌണ്ടന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + മൌണ്ടന്‍ പകല്‍ സമയം + + + + + പസഫിക് സമയം + പസഫിക് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + പസഫിക് പകല്‍ സമയം + + + + + അനാഡിര്‍ സമയം + അനാഡിര്‍ വേനല്‍ക്കാല സമയം + + + + + അഖ്തൌ സമയം + അഖ്തൌ വേനല്‍ക്കാല സമയം + + + AQTT (അഖ്തൌ) + AQTST (അഖ്തൌ) + + + + + അഖ്തോബ് സമയം + അഖ്തോബ് വേനല്‍ക്കാല സമയം + + + AQTT (അഖ്തോബ്) + AQTST (അഖ്തോബ്) + + + + + അറേബ്യന്‍ സമയം + അറേബ്യന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + അറേബ്യന്‍ പകല്‍ സമയം + + + AT (അറേബ്യന്‍) + AST (അറേബ്യന്‍) + ADT (അറേബ്യന്‍) + + + + + അര്‍ജന്‍റീന സമയം + അര്‍ജന്‍റീന വേനല്‍ക്കാല സമയം + + + + + പശ്ചിമ അര്‍ജന്‍റീന സമയം + + + + + അര്‍മേനിയ സമയം + അര്‍മേനിയ വേനല്‍ക്കാല സമയം + + + AMT (അര്‍മേനിയ) + AMST (അര്‍മേനിയ) + + + + + അഷ്ഖാബാദ് സമയം + അഷ്ഖാബാദ് വേനല്‍ക്കാല സമയം + + + + + അറ്റ്ലാന്‍റിക് സമയം + അറ്റ്ലാന്‍റിക് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + അറ്റ്ലാന്‍റിക് പകല്‍ സമയം + + + + + സെന്‍ട്രല്‍ ഓസ്ട്രേലിയ സമയം + ഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ പകല്‍ സമയം + + + + + ഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ വെസ്റ്റേണ്‍ സമയം + ഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ വെസ്റ്റേണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ വെസ്റ്റേണ്‍ പകല്‍ സമയം + + + + + ഈസ്റ്റേണ്‍ ഓസ്ട്രേലിയ സമയം + ഓസ്ട്രേലിയന്‍ ഈസ്റ്റേണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ഓസ്ട്രേലിയന്‍ ഈസ്റ്റേണ്‍ പകല്‍ സമയം + + + + + വെസ്റ്റേണ്‍ ഓസ്ട്രേലിയ സമയം + ഓസ്ട്രേലിയന്‍ ‍വെസ്റ്റേണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് + ഓസ്ട്രേലിയന്‍ ‍വെസ്റ്റേണ്‍ പകല്‍ സമയം + + + + + അസര്‍ബയ്ജാന്‍ സമയം + അസര്‍ബയ്ജാന്‍ വേനല്‍ക്കാല സമയം + + + + + എയ്സോര്‍സ് സമയം + എയ്സോര്‍സ് വേനല്‍ക്കാല സമയം + + + + + ബാകു സമയം + ബാകു വേനല്‍ക്കാല സമയം + + + + + ബംഗ്ലാദേശ് സമയം + + + + + ബെറിങ് സമയം + ബെറിങ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ബെറിങ് പകല്‍ സമയം + + + BT (ബെറിങ് ) + BST (ബെറിങ് ) + BDT (ബെറിങ് ) + + + + + ഭൂട്ടാന്‍ സമയം + + + + + ബൊളീവിയ സമയം + + + + + ബോര്‍ണിയോ സമയം + ബോര്‍ണിയോ വേനല്‍ക്കാല സമയം + + + + + ബ്രസീലിയ സമയം + ബ്രസീലിയ വേനല്‍ക്കാല സമയം + + + + + ബ്രൂണെ ഡാറുസ്സലാം സമയം + + + + + കെയ്പ് വെര്‍ഡെ സമയം + കെയ്പ് വെര്‍ഡെ വേനല്‍ക്കാല സമയം + + + + + കമോറോ സമയം + കമോറോ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + ചാങ്ബയ് സമയം + + + + + ചാതം സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ചാതം വേനല്‍ക്കാല സമയം + + + + + ചിലി സമയം + ചിലി വേനല്‍ക്കാല സമയം + + + + + ചൈന സമയം + ചൈനാ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ചൈന പകല്‍ സമയം + + + CT (ചൈന) + CST (ചൈന) + CDT (ചൈന) + + + + + ചോയ്ബല്‍സന്‍ സമയം + ചോയ്ബല്‍സന്‍ വേനല്‍ക്കാല സമയം + + + + + ക്രിസ്മസ് ദ്വീപ് സമയം + + + + + കൊക്കോസ് ദ്വീപുകള്‍ സമയം + + + + + കൊളംബിയ സമയം + കൊളംബിയ വേനല്‍ക്കാല സമയം + + + + + കുക്ക് ദ്വീപുകള്‍ സമയം + കുക്ക് ദ്വീപുകള്‍ അര്‍ദ്ധ വേനല്‍ക്കാല സമയം + + + + + ക്യൂബ സമയം + ക്യൂബ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ക്യൂബ പകല്‍ സമയം + + + CST (ക്യൂബ ) + CST (ക്യൂബ) + CDT (ക്യൂബ ) + + + + + ഡാക്ക സമയം + + + + + ഡെയ്‌വിസ് സമയം + + + + + ഡ്യൂമണ്ട് ഡി യൂര്‍വില്‍ സമയം + + + + + ദുഷാന്‍ബെ സമയം + ദുഷാന്‍ബെ വേനല്‍ക്കാല സമയം + + + + + ഡച്ച് ഗയാന സമയം + + + + + കിഴക്കന്‍ തിമൂര്‍ സമയം + + + + + ഈസ്റ്റര്‍ ദ്വീപ് സമയം + ഈസ്റ്റര്‍ ദ്വീപ് വേനല്‍ക്കാല സമയം + + + + + ഇക്വഡോര്‍ സമയം + + + + + സെന്‍ട്രല്‍ യൂറോപ്യന്‍ സമയം + സെന്‍ട്രല്‍ യൂറോപ്യന്‍ വേനല്‍ക്കാല സമയം + + + + + കിഴക്കന്‍ യൂറോപ്യന്‍ സമയം + കിഴക്കന്‍ യൂറോപ്യന്‍ വേനല്‍ക്കാല സമയം + + + + + ഫാക്‌ലാന്‍ഡ് ദ്വീപുകള്‍ സമയം + ഫാക്‌ലാന്‍ഡ് ദ്വീപുകള്‍ വേനല്‍ക്കാല സമയം + + + + + ഫിജി സമയം + ഫിജി വേനല്‍ക്കാല സമയം + + + + + ഫ്രെഞ്ച് ഗയാന സമയം + + + + + ഫ്രെഞ്ച് സതേണ്‍ ആന്‍ഡ് അന്‍റാര്‍ട്ടിക് സമയം + + + + + ഫ്രൂന്‍സ് സമയം + ഫ്രൂന്‍സ് വേനല്‍ക്കാല സമയം + + + + + ഗാലപ്പാഗോസ് സമയം + + + + + ഗാന്പിയര്‍ സമയം + + + + + ജോര്‍ജ്ജിയ സമയം + ജോര്‍ജ്ജിയ വേനല്‍ക്കാല സമയം + + + + + ഗില്‍ബര്‍ട്ട് ദ്വീപുകള്‍ സമയം + + + + + സെന്‍ട്രല്‍ ഗ്രീന്‍ലാന്‍ഡ് സമയം + സെന്‍ട്രല്‍ ഗ്രീന്‍ലാന്‍ഡ് വേനല്‍ക്കാല സമയം + + + + + കിഴക്കന്‍ ഗ്രീന്‍ലാന്‍ഡ് സമയം + കിഴക്കന്‍ ഗ്രീന്‍ലാന്‍ഡ് വേനല്‍ക്കാല സമയം + + + + + പശ്ചിമ ഗ്രീന്‍ലാന്‍ഡ് സമയം + പശ്ചിമ ഗ്രീന്‍ലാന്‍ഡ് വേനല്‍ക്കാല സമയം + + + + + ഗ്വാം സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + GST (ഗ്വാം) + + + + + ഗള്‍ഫ് സമയം + ഗള്‍ഫ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + ഗയാന സമയം + + + + + ഹവായി-അലൂഷ്യന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + ഹോങ് കോങ് സമയം + ഹോങ് കോങ് വേനല്‍ക്കാല സമയം + + + + + ഹൌഡ് സമയം + ഹൌഡ് വേനല്‍ക്കാല സമയം + + + + + ഇന്‍‌ഡ്യ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + ഇന്‍ഡ്യന്‍ മഹാസമുദ്ര സമയം + + + + + ഇന്‍ഡോചൈന സമയം + + + + + സെന്‍ട്രല്‍ ഇന്‍ഡോനേഷ്യ സമയം + + + + + കിഴക്കന്‍ ഇന്‍ഡോനേഷ്യ സമയം + + + + + പശ്ചിമ ഇന്‍ഡോനേഷ്യ സമയം + + + + + ഇറാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ഇറാന്‍ പകല്‍ സമയം + + + + + ഇര്‍കസ്ക് സമയം + ഇര്‍കസ്ക് വേനല്‍ക്കാല സമയം + + + + + ഇസ്രായേല്‍ സമയം + ഇസ്രായേല്‍ സ്റ്റാന്‍ഡേ‡ര്‍ഡ് സമയം + ഇസ്രായേല്‍ പകല്‍ സമയം + + + IST (ഇസ്രായേല്‍) + + + + + ജപ്പാന്‍ സമയം + ജപ്പാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ജപ്പാന്‍ പകല്‍ സമയം + + + + + പെട്രോപാവ്‌ലോസ്ക് കംചാസ്കി സമയം + പെട്രോപാവ്‌ലോസ്ക് കംചാസ്കി വേനല്‍ക്കാല സമയം + + + + + കറാച്ചി സമയം + + + + + കാഷ്ഗര്‍ സമയം + + + + + കിഴക്കന്‍ കസാഖ്സ്ഥാന്‍ സമയം + കിഴക്കന്‍ കസാഖ്സ്ഥാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + പടിഞ്ഞാറന്‍ കസാഖ്സ്ഥാന്‍ സമയം + പടിഞ്ഞാറന്‍ കസാഖ്സ്ഥാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + കിസിലോര്‍ഡ സമയം + കിസിലോര്‍ഡ വേനല്‍ക്കാല സമയം + + + + + കൊറിയന്‍ സമയം + കൊറിയന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + കൊറിയന്‍ പകല്‍ സമയം + + + + + കൊസ്റേ സമയം + + + + + ക്രാസ്നോയാഴ്സ്ക് സമയം + ക്രാസ്നോയാഴ്സ്ക് വേനല്‍ക്കാല സമയം + + + + + കുയ്ബൈഷെവ് സമയം + കുയ്ബൈഷെവ് വേനല്‍ക്കാല സമയം + + + + + ക്വാജലെയ്ന്‍ സമയം + + + + + കിര്‍ഗിസ്ഥാന്‍ സമയം + + + + + ലങ്ക സമയം + + + + + ലൈന്‍ ദ്വീപുകള്‍ സമയം + + + + + ലോങ്-ഷു സമയം + + + + + ലോര്‍ഡ് ഹോവ് സമയം + ലോര്‍ഡ് ഹോവ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ലോര്‍ഡ് ഹോവ് പകല്‍ സമയം + + + + + മകൌ സമയം + മകൌ വേനല്‍ക്കാല സമയം + + + + + മഗാഡന്‍ സമയം + മഗാഡന്‍ വേനല്‍ക്കാല സമയം + + + + + മലയ സമയം + + + + + മലേഷ്യ സമയം + + + + + മാലിദ്വീപ് സമയം + + + + + മാര്‍ക്യുസാസ് സമയം + + + + + മാര്‍ഷല്‍ ദ്വീപുകള്‍ സമയം + + + + + മൌറിഷ്യസ് സമയം + + + + + മാവ്സണ്‍ സമയം + + + + + യുലാന്‍ ബാറ്റര്‍ സമയം + യുലാന്‍ ബാറ്റര്‍ വേനല്‍ക്കാല സമയം + + + + + മോസ്കോ സമയം + മോസ്കോ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + മോസ്കോ വേനല്‍ക്കാല സമയം + + + + + മ്യാന്‍മാര്‍ സമയം + + + + + നൌറു സമയം + + + + + നേപ്പാള്‍ സമയം + + + + + ന്യൂ കാലിഡോണിയ സമയം + ന്യൂ കാലിഡോണിയ വേനല്‍ക്കാല സമയം + + + + + ന്യൂസീലന്‍ഡ് സമയം + ന്യൂസീലന്‍ഡ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ന്യൂസീലന്‍ഡ് പകല്‍ സമയം + + + + + ന്യൂഫൌണ്ട്‌ലാന്‍ഡ് സമയം + ന്യൂഫൌണ്ട്‌ലാന്‍ഡ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + ന്യൂഫൌണ്ട്‌ലാന്‍ഡ് പകല്‍‌ സമയം + + + + + നിയു സമയം + + + + + നോര്‍ഫോക് ദ്വീപുകള്‍ സമയം + + + + + ഫെര്‍ണാണ്ടോ ഡി നൊറോന സമയം + ഫെര്‍ണാണ്ടോ ഡി നൊറോന വേനല്‍ക്കാല സമയം + + + + + നോര്‍ത്ത് മറിയാനാ ദ്വീപുകള്‍ സമയം + + + + + നോവോസിബിര്‍സ്ക് സമയം + നോവോസിബിര്‍സ്ക് വേനല്‍ക്കാല സമയം + + + + + ഓംസ്ക് സമയം + ഓംസ്ക് വേനല്‍ക്കാല സമയം + + + + + പാകിസ്ഥാന്‍ സമയം + പാകിസ്ഥാന്‍ വേനല്‍ക്കാല സമയം + + + + + പലൌ സമയം + + + + + പാപ്യു ന്യൂ ഗിനിയ സമയം + + + + + പരാഗ്വേ സമയം + പരാഗ്വേ വേനല്‍ക്കാല സമയം + + + + + പെറു സമയം + പെറു വേനല്‍ക്കാല സമയം + + + + + ഫിലിപ്പീന്‍ സമയം + ഫിലിപ്പീന്‍ വേനല്‍ക്കാല സമയം + + + + + ഫീനിക്സ് ദ്വീപുകള്‍ സമയം + + + + + പിയറി ആന്‍ഡ് മിക്വിലോണ്‍ സമയം + പിയറി ആന്‍ഡ് മിക്വിലോണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ്സമയം + പിയറി ആന്‍ഡ് മിക്വിലോണ്‍ പകല്‍ സമയം + + + + + പിറ്റ്കെയ്ന്‍ സമയം + + + + + പൊനാപ് സമയം + + + + + ഖിസിലോര്‍ഡ സമയം + ഖിസിലോര്‍ഡ വേനല്‍ക്കാല സമയം + + + + + റീയൂണിയന്‍ സമയം + + + + + റൊതീറ സമയം + + + + + സഖാലിന്‍ സമയം + സഖാലിന്‍ വേനല്‍ക്കാല സമയം + + + + + സമാറ സമയം + സമാറ വേനല്‍ക്കാല സമയം + + + + + സമര്‍കന്ദ് സമയം + സമര്‍കന്ദ് വേനല്‍ക്കാല സമയം + + + SAMT (സമര്‍കന്ദ് ) + SAMST (സമര്‍കന്ദ് ) + + + + + സമോവാ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + സെയ്ഷെല്‍സ് സമയം + + + + + ഷെവ്ചെങ്കോ സമയം + ഷെവ്ചെങ്കോ വേനല്‍ക്കാല സമയം + + + + + സിങ്കപ്പൂര്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + + + + + സോളമന്‍ ദ്വീപുകള്‍ സമയം + + + + + ദക്ഷിണ ജോര്‍ജ്ജിയ സമയം + + + GST (ദക്ഷിണ ജോര്‍ജ്ജിയ) + + + + + സൂറിനാം സമയം + + + + + സ്‌വേഡ്‌ലോവ്സ്ക് സമയം + സ്‌വേഡ്‌ലോവ്സ്ക് വേനല്‍ക്കാല സമയം + + + + + സ്യോവ സമയം + + + + + തഹിതി സമയം + + + + + തജികിസ്ഥാന്‍ സമയം + + + + + താഷ്കന്ദ് സമയം + താഷ്കന്ദ് വേനല്‍ക്കാല സമയം + + + + + തിബിലീസി സമയം + തിബിലീസി വേനല്‍ക്കാല സമയം + + + + + റ്റോക്കിലൌ സമയം + + + + + റ്റോംഗാ സമയം + റ്റോംഗാ വേനല്‍ക്കാല സമയം + + + + + ട്രക്ക് സമയം + + + + + തുര്‍ക്കി സമയം + തുര്‍ക്കി വേനല്‍ക്കാല സമയം + + + + + തുര്‍ക്ക്മെനിസ്ഥാന്‍ സമയം + തുര്‍ക്ക്മെനിസ്ഥാന്‍ വേനല്‍ക്കാല സമയം + + + + + തുവാലു സമയം + + + + + യുറാല്‍സ്ക് സമയം + യുറാല്‍സ്ക് വേനല്‍ക്കാല സമയം + + + + + ഉറുഗ്വെ സമയം + ഉറുഗ്വെ വേനല്‍ക്കാല സമയം + + + + + ഉറുംഖി വേനല്‍‌ക്കാല സമയം + + + + + ഉസ്ബക്കിസ്ഥാന്‍ സമയം + ഉസ്ബക്കിസ്ഥാന്‍ വേനല്‍‌ക്കാല സമയം + + + + + വന്വാതു സമയം + വന്വാതു വേനല്‍ക്കാല സമയം + + + + + വെനസ്വേല സമയം + + + + + വ്‌ളാഡിവോസ്റ്റോക് സമയം + വ്‌ളാഡിവോസ്റ്റോക് വേനല്‍ക്കാല സമയം + + + + + വോള്‍ഗോഗ്രാഡ് സമയം + വോള്‍ഗോഗ്രാഡ് വേനല്‍ക്കാല സമയം + + + + + വോസ്റ്റോക് സമയം + + + + + വെയ്ക് ദ്വീപ് സമയം + + + + + വാലിസ് ആന്‍ഡ് ഫ്യൂചുന സമയം + + + + + യാകസ്ക് സമയം + യാകസ്ക് വേനല്‍ക്കാല സമയം + + + + + യെക്കാറ്ററിന്‍ബര്‍ഗ് സമയം + യെക്കാറ്ററിന്‍ബര്‍ഗ് വേനല്‍ക്കാല സമയം + + + + + യെരെവാന്‍ സമയം + യെരെവാന്‍ വേനല്‍ക്കാല സമയം + + + + + യൂക്കോണ്‍ സമയം + യൂക്കോണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയം + യൂക്കണ്‍ പകല്‍ സമയം + + + + + + + . + , + ; + % + 0 + # + + + - + E + ‰ + ∞ + സംഖ്യയല്ല + + + + + #,##,##0.### + + + + + + + #E0 + + + + + + + #,##,##0% + + + + + + + #,##,##0.00¤ + + + {0} {1} + {0} {1} + + + + അന്‍ഡോറന്‍ പെസെയ്റ്റ + അന്‍ഡോറന്‍ പെസെയ്റ്റ + അന്‍ഡോറന്‍ പെസെയ്റ്റാസ് + + + യു.എ.ഇ. ദിര്‍ഹം + യു.എ.ഇ. ദിര്‍ഹം + യു.എ.ഇ. ദിര്‍ഹംസ് + + + അഫ്ഘാനി (1927-2002) + അഫ്ഘാനി (AFA) + അഫ്ഘാനിസ് (AFA) + + + അഫ്ഘാനി + അഫ്ഘാനി + അഫ്ഘാനിസ് + + + അല്‍ബേനിയന്‍ ലെക് + അല്‍ബേനിയന്‍ ലെക് + അല്‍ബേനിയന്‍ ലെക്സ് + + + അര്‍മേനിയന്‍ ഡ്രാം + അര്‍മേനിയന്‍ ഡ്രാം + അര്‍മേനിയന്‍ ഡ്രാംസ് + + + നെതര്‍ലന്‍ഡ്സ് ആന്‍റിലന്‍ ഗില്‍ഡര്‍ + നെതര്‍ലന്‍ഡ്സ് ആന്‍ഡിലന്‍ ഗില്‍ഡര്‍ + നെതര്‍ലന്‍ഡ്സ് ആന്‍ഡിലന്‍ ഗില്‍ഡേഴ്സ് + + + അംഗോളന്‍ ‍ക്വാന്‍സ + അംഗോളന്‍ ക്വാന്‍സ + അംഗോളന്‍ ക്വാന്‍സാസ് + + + അംഗോളന്‍ ‍ക്വാന്‍സ (1977-1990) + അംഗോളന്‍ ക്വാന്‍സാ (AOK) + അംഗോളന്‍ ക്വാന്‍സാസ് (AOK + + + അംഗോളന്‍ ‍ന്യൂ ക്വാന്‍സ (1990-2000) + അംഗോളന്‍ ന്യൂ ക്വാന്‍സാ (AON) + അംഗോളന്‍ ന്യൂ ക്വാന്‍സാസ് (AON) + + + അംഗോളന്‍ ‍ക്വാന്‍സ റിയാജസ്റ്റാഡോ (1995-1999) + അംഗോളന്‍ ക്വാന്‍സ റീഅഡ്ജസ്റ്റാഡോ (AOR) + അംഗോളന്‍ ക്വാന്‍സാസ് റീഅഡ്ജസ്റ്റാഡോ (AOR) + + + അര്‍ജന്‍റീന്‍ ഓസ്ട്രല്‍ + അര്‍ജന്‍റീന്‍ ഓസ്ട്രല്‍ + അര്‍ജന്‍റീന്‍ ഓസ്ട്രല്‍സ് + + + അര്‍ജന്‍റീന്‍ പെയ്സോ (1983-1985) + അര്‍ജന്‍റീന്‍ പെയ്സോ (ARP) + അര്‍ജന്‍റീന്‍ പെയ്സോസ് (ARP) + + + അര്‍ജന്‍റീന്‍ പെയ്സോ + അര്‍ജന്‍റീന്‍ പെയ്സോ + അര്‍ജന്‍റീന്‍ പെയ്സോസ് + + + ഓസ്ട്രേലിയന്‍ ഷില്ലിംഗ് + ഓസ്ട്രിയന്‍ ഷില്ലിംഗ് + ഓസ്ട്രിയന്‍ ഷില്ലിംഗ്സ് + + + ആസ്ട്രേലിയന്‍ ഡോളര്‍ + ഓസ്ട്രേലിയന്‍ ഡോളര്‍ + ഓസ്ട്രേലിയന്‍ ഡോളേഴ്സ് + + + അറൂബന്‍ ഗില്‍ഡര്‍ + അറൂബന്‍ ഗില്‍ഡര്‍ + അറൂബന്‍ ഗില്‍ഡേഴ്സ് + + + അസര്‍ബയ്ജാനിയന്‍ മനത് (1993-2006) + അസര്‍ബയ്ജാന്‍ മനത്‌ (AZM) + അസര്‍ബയ്ജാന്‍ മനത്‌സ് (AZM) + + + അസര്‍ബയ്ജാനിയന്‍ മനത് + അസര്‍ബയ്ജാന്‍ മനത് + അസര്‍ബയ്ജാന്‍ മനത്‌സ് + + + ബോസ്നിയ-ഹെര്‍സഗോവിന ദിനാര്‍ + ബോസ്നിയ ഹെര്‍സഗോവിന ദിനാര്‍ + ബോസ്നിയ ഹെര്‍സഗോവിന ദിനാര്‍സ് + + + ബോസ്നിയ-ഹെര്‍സഗോവിന കണ്‍വേര്‍ട്ടിബിള്‍ മാര്‍ക്ക് + ബോസ്നിയ ഹെര്‍സഗോവിന കണ്‍വേര്‍ട്ടിബിള്‍ മാര്‍ക്ക് + ബോസ്നിയ ഹെര്‍സഗോവിന കണ്‍വേര്‍ട്ടിബിള്‍ മാര്‍ക്സ് + + + ബാര്‍ബഡോസ് ഡോളര്‍ + ബാര്‍ബഡോസ് ഡോളര്‍ + ബാര്‍ബഡോസ് ഡോളേഴ്സ് + + + ബംഗ്ലാദേശി ടാക്ക + ബംഗ്ലാദേശ് താക്കാ + ബംഗ്ലാദേശ് താക്കാസ് + + + ബെല്‍ജിയന്‍ ഫ്രാങ്ക് (കൈമാറ്റം ചെയ്യാവുന്നത്) + ബെല്‍ജിയന്‍ ഫ്രാങ്ക് (കൈമാറ്റം ചെയ്യാവുന്നത്) + ബെല്‍ജിയന്‍ ഫ്രാങ്ക്സ് (കൈമാറ്റം ചെയ്യാവുന്നത്) + + + ബെല്‍ജിയന്‍ ഫ്രാങ്ക് + ബെല്‍ജിയന്‍ ഫ്രാങ്ക് + ബെല്‍ജിയന്‍ ഫ്രാങ്ക്സ് + + + ബല്‍ജിയന്‍ ഫ്രാങ്ക് + ബെല്‍ജിയന്‍ ഫ്രാങ്ക് (ഫിനാന്‍ഷ്യല്‍) + ബെല്‍ജിയന്‍ ഫ്രാങ്ക്സ്(ഫിനാന്‍ഷ്യല്‍) + + + ബള്‍ഗേറിയന്‍ ഹാര്‍ഡ് ലെവ് + ബള്‍ഗേറിയന്‍ ഹാര്‍ഡ് ലെവ് + ബള്‍ഗേറിയന്‍ ഹാര്‍ഡ് ലെവ്സ് + + + ബള്‍ഗേറിയന്‍ ന്യൂലവ് + ബള്‍ഗേറിയന്‍ ന്യൂ ലെവ് + ബള്‍ഗേറിയന്‍ ന്യൂ ലെവ്സ് + + + ബഹറിന്‍ ദിനാര്‍ + ബഹ്റൈന്‍ ദിനാര്‍ + ബഹ്റൈന്‍ ദിനാര്‍സ് + + + ബുറുണ്ടി ഫ്രാങ്ക് + ബുറുണ്ടി ഫ്രാങ്ക് + ബുറുണ്ടി ഫ്രാങ്ക്സ് + + + ബെര്‍മുഡന്‍ ഡോളര്‍ + ബെര്‍മുഡന്‍ ഡോളര്‍ + ബെര്‍മുഡന്‍ ഡോളേഴ്സ് + + + ബ്രൂണെ ഡോളര്‍ + ബ്രൂണെ ഡോളര്‍ + ബ്രൂണെ ഡോളറുകള്‍ + + + ബൊളീവിയാനോ + ബൊളീവിയാനോ + ബൊളീവിയാനോസ് + + + ബൊളീവിയന്‍ പെയ്സോ + ബൊളീവിയന്‍ പെയ്സോ + ബൊളീവിയന്‍ പെയ്സോസ് + + + ബൊളീവിയന്‍ എംവിഡോള്‍ + ബൊളീവിയന്‍ എംവിഡോ + ബൊളീവിയന്‍ എംവിഡോസ് + + + ബ്രസീലിയന്‍ ക്രുസെയ്റോ നോവോ (1967-1986) + ബ്രസീലിയന്‍ ക്രുസെയ്റോ നോവോ (BRB) + ബ്രസീലിയന്‍ ക്രുസെയ്റോസ് നോവോ (BRB) + + + ബ്രസീലിയന്‍ ക്രുസാഡോ + ബ്രസീലിയന്‍ ക്രുസാഡോ + ബ്രസീലിയന്‍ ക്രുസാഡോസ് + + + ബ്രസീലിയന്‍ ക്രുസെയ്റോ (1990-1993) + ബ്രസീലിയന്‍ ക്രുസെയ്റോ (BRE) + ബ്രസീലിയന്‍ ക്രുസെയ്റോസ് (BRE) + + + ബ്രസീലിയന്‍ റിയാല്‍ + ബ്രസീലിയന്‍ റിയാല്‍ + ബ്രസീലിയന്‍ റിയാല്‍സ് + + + ബ്രസീലിയന്‍ ക്രുസാഡോ നോവോ + ബ്രസീലിയന്‍ ക്രുസാഡോ നോവോ + ബ്രസീലിയന്‍ ക്രുസാഡോ നോവോസ് + + + ബ്രസീലിയന്‍ ക്രുസെയ്റോ + ബ്രസീലിയന്‍ ക്രുസെയ്റോ + ബ്രസീലിയന്‍ ക്രുസെയ്റോസ് + + + ബഹാമിയന്‍ ഡോളര്‍ + ബഹാമിയന്‍ ഡോളര്‍ + ബഹാമിയന്‍ ഡോളേഴ്സ് + + + ഭൂട്ടാന്‍ എന്‍ഗള്‍ട്രം + ഭൂട്ടാന്‍ എന്‍ഗള്‍ട്രം + ഭൂട്ടാന്‍ എന്‍ഗള്‍ട്രംസ് + + + ബര്‍മീസ് ചാറ്റ് + ബര്‍മീസ് ചാറ്റ് + ബര്‍മീസ് ചാറ്റ്സ് + + + ബോട്സ്വാനന്‍ പ്യൂല + ബോട്സ്വാനന്‍ പ്യൂല + ബോട്സ്വാനന്‍ പ്യൂലാസ് + + + ബെലാറഷ്യന്‍ ന്യൂ റൂബിള്‍ (1994-1999) + ബെലാറഷ്യന്‍ ന്യൂ റൂബിള്‍ (BYB) + ബെലാറഷ്യന്‍ ന്യൂ റൂബിള്‍സ് (BYB) + + + ബെലാറഷ്യന്‍ റൂബിള്‍ + ബെലാറഷ്യന്‍ റൂബിള്‍ + ബെലാറഷ്യന്‍ റൂബിള്‍സ് + + + ബെലീസ് ഡോളര്‍ + ബെലീസ് ഡോളര്‍ + ബെലീസ് ഡോളേഴ്സ് + + + കനേഡിയന്‍ ഡോളര്‍ + കനേഡിയന്‍ ഡോളര്‍ + കനേഡിയന്‍ ഡോളേഴ്സ് + + + കോങ്കളീസ് ഫ്രാങ്ക് കോങ്കൊളൈസ് + കോങ്കളീസ് ഫ്രാങ്ക് കോങ്കൊളൈസ് + കോങ്കളീസ് ഫ്രാങ്ക്സ് കോങ്കൊളൈസ് + + + WIR യൂറോ + WIR യൂറോ + WIR യൂറോസ് + + + സ്വിസ് ഫ്രാങ്ക് + സ്വിസ് ഫ്രാങ്ക് + സ്വിസ് ഫ്രാങ്ക്സ് + + + WIR ഫ്രാങ്ക് + WIR ഫ്രാങ്ക് + WIR ഫ്രാങ്ക്സ് + + + ചിലിയന്‍ യൂണിഡാഡ്സ് ഡി ഫോമെന്‍റോ + ചിലിയന്‍ യൂണിഡാഡ്സ് ഡി ഫോമെന്‍റോ + ചിലിയന്‍ യൂണിഡാഡ്സ് ഡി ഫോമെന്‍റോസ് + + + ചിലിയന്‍ പെസോ + ചിലിയന്‍ പെസോ + ചിലിയന്‍ പെസോസ് + + + ചൈനീസ് യുവാന്‍ + ചൈനീസ് യുവാന്‍ + ചൈനീസ് യുവാന്‍ + + + കൊളംബിയന്‍ പെസോ + കൊളംബിയന്‍ പെസോ + കൊളംബിയന്‍ പെസോസ് + + + യൂണിഡാഡ് ഡി വാലര്‍ റിയല്‍ + യൂണിഡാഡ് ഡി വാലര്‍ റിയല്‍ + യൂണിഡാഡ് ഡി വാലര്‍ റിയല്‍സ് + + + കോസ്റ്റാ റിക്കന്‍ കോളന്‍ + കോസ്റ്റാ റിക്കന്‍ കോളന്‍ + കോസ്റ്റാ റിക്കന്‍ കോളന്‍സ് + + + പ്രാചീന സെര്‍ബിയന്‍ ദിനാര്‍ + പ്രാചീന സെര്‍ബിയന്‍ ദിനാര്‍ + പ്രാചീന സെര്‍ബിയന്‍ ദിനാര്‍സ് + + + ചെക്കോസ്ലൊവാക്ക് ഹാര്‍ഡ് കൊരൂന + ചെക്കോസ്ലൊവാക്ക് ഹാര്‍ഡ് കൊരൂന + ചെക്കോസ്ലൊവാക്ക് ഹാര്‍ഡ് കൊരൂനാസ് + + + ക്യൂബന്‍ പെസോ + ക്യൂബന്‍ പെസോ + ക്യൂബന്‍ പെസോസ് + + + കെയ്പ് വെര്‍ഡെ എസ്ക്യുഡോ + കെയ്പ് വെര്‍ഡെ എസ്ക്യുഡോ + കെയ്പ് വെര്‍ഡെ എസ്ക്യുഡോസ് + + + സൈപ്രസ് പൌണ്ട് + സൈപ്രസ് പൌണ്ട് + സൈപ്രസ് പൌണ്ട്സ് + + + ചെക്ക് റിപ്പബ്ലിക് കൊരൂന + ചെക്ക് റിപ്പബ്ലിക് കൊരൂന + ചെക്ക് റിപ്പബ്ലിക് കൊരൂനാസ് + + + കിഴക്കന്‍ ജര്‍മന്‍ ഓസ്റ്റ്മാര്‍ക്ക് + കിഴക്കന്‍ ജര്‍മന്‍ ഓസ്റ്റ്മാര്‍ക്ക് + കിഴക്കന്‍ ജര്‍മന്‍ ഓസ്റ്റ്മാര്‍ക്ക്സ് + + + ജര്‍മന്‍ മാര്‍ക്ക് + ജര്‍മന്‍ മാര്‍ക്ക് + ജര്‍മന്‍ മാര്‍ക്ക്സ് + + + ജീബോട്ടി ഫ്രാങ്ക് + ജീബോട്ടി ഫ്രാങ്ക് + ജീബോട്ടി ഫ്രാങ്ക്സ് + + + ഡാനിഷ് ക്രോണെ + ഡാനിഷ് ക്രോണ്‍ + ഡാനിഷ് ക്രോണ്‍സ് + + + ഡൊമിനിക്കന്‍ പെയ്സോ + ഡൊമിനിക്കന്‍ പെയ്സോ + ഡൊമിനിക്കന്‍ പെയ്സോസ് + + + അള്‍ജീരിയന്‍ ദിനാര്‍ + അള്‍ജീരിയന്‍ ദിനാര്‍ + അള്‍ജീരിയന്‍ ദിനാര്‍സ് + + + ഇക്വഡോര്‍ സൂക്രേ + ഇക്വഡോര്‍ സൂക്രേ + ഇക്വഡോര്‍ സൂക്രേസ് + + + ഇക്വഡോര്‍ യൂണിഡാഡ് വാലര്‍ കോണ്‍സ്റ്റന്‍റെ (UVC) + ഇക്വഡോര്‍ യൂണിഡാഡ് ഡി വാലര്‍ കോണ്‍സ്റ്റന്‍റെ (UVC) + ഇക്വഡോര്‍ യൂണിഡാഡ്സ് ഡി വാലര്‍ കോണ്‍സ്റ്റന്‍റെ (UVC) + + + എസ്റ്റൌനിയന്‍ ക്രൂണ്‍ + എസ്റ്റൌനിയന്‍ ക്രൂണ്‍ + എസ്റ്റൌനിയന്‍ ക്രൂണ്‍സ് + + + ഈജിപ്ഷ്യന്‍ പൌണ്ട് + ഈജിപ്ഷ്യന്‍ പൌണ്ട് + ഈജിപ്ഷ്യന്‍ പൌണ്ട്സ് + + + എറിത്രിയന്‍ നക്ഫ + എറിത്രിയന്‍ നക്ഫ + എറിത്രിയന്‍ നക്ഫാസ് + + + സ്പാനിഷ് പസെയ്റ്റ (A അക്കൌണ്ട്) + സ്പാനിഷ് പസെയ്റ്റ (A അക്കൌണ്ട്) + സ്പാനിഷ് പസെയ്റ്റാസ് (A അക്കൌണ്ട്) + + + സ്പാനിഷ് പസെയ്റ്റ (കൈമാറ്റം ചെയ്യാവുന്ന അക്കൌണ്ട്) + സ്പാനിഷ് പസെയ്റ്റ (കൈമാറ്റം ചെയ്യാവുന്ന അക്കൌണ്ട്) + സ്പാനിഷ് പസെയ്റ്റാസ് (കൈമാറ്റം ചെയ്യാവുന്ന അക്കൌണ്ട്) + + + സ്പാനിഷ് പസെയ്റ്റ + സ്പാനിഷ് പസെയ്റ്റ + സ്പാനിഷ് പസെയ്റ്റാസ് + + + എത്യോപ്പിയന്‍ ബിര്‍ + എത്യോപ്പിയന്‍ ബിര്‍ + എത്യോപ്പിയന്‍ ബിര്‍സ് + + + യൂറോ + യൂറോ + യൂറോസ് + + + ഫിന്നിഷ് മാര്‍ക്ക + ഫിന്നിഷ് മാര്‍ക്ക + ഫിന്നിഷ് മാര്‍ക്കാസ് + + + ഫിജി ഡോളര്‍ + ഫിജി ഡോളര്‍ + ഫിജി ഡോളേഴ്സ് + + + ഫോക്‌ലാന്‍ഡ് ദ്വീപുകളുടെ പൌണ്ട് + ഫോക്‌ലാന്‍ഡ് ദ്വീപുകളുടെ പൌണ്ട് + ഫോക്‌ലാന്‍ഡ് ദ്വീപുകളുടെ പൌണ്ട്സ് + + + ഫ്രാങ്ക് + ഫ്രെഞ്ച് ഫ്രാങ്ക് + ഫ്രെഞ്ച് ഫ്രാങ്ക്സ് + + + ബ്രിട്ടീഷ് പൌണ്ട് സ്റ്റെര്‍ലിംങ് + ബ്രിട്ടീഷ് പൌണ്ട് സ്റ്റെര്‍ലിംഗ് + ബ്രിട്ടീഷ് പൌണ്ട് സ്റ്റെര്‍ലിംഗ്സ് + + + ജോര്‍‍ജ്ജിയന്‍ ക്യൂപോണ്‍ ലാരിറ്റ് + ജോര്‍‍ജ്ജിയന്‍ ക്യൂപോണ്‍ ലാരിറ്റ് + ജോര്‍‍ജ്ജിയന്‍ ക്യൂപോണ്‍ ലാരിറ്റ്സ് + + + ജോര്‍‍ജ്ജിയന്‍ ലാരി + ജോര്‍‍ജ്ജിയന്‍ ലാരി + ജോര്‍‍ജ്ജിയന്‍ ലാരിസ് + + + ഘാന കെഡി (1979-2007) + ഘാന കെഡി (GHC) + ഘാന കെഡിസ് (GHC) + + + ഘാന കെഡി + ഘാന കെഡി + ഘാന കെഡിസ് + + + ഗിബ്രാല്‍ട്ടര്‍ പൌണ്ട് + ഗിബ്രാല്‍ട്ടര്‍ പൌണ്ട് + ഗിബ്രാല്‍ട്ടര്‍ പൌണ്ട്സ് + + + ഗാന്പിയ ദലാസി + ഗാന്പിയ ദലാസി + ഗാന്പിയ ദലാസിസ് + + + ഗിനിയ ഫ്രാങ്ക് + ഗിനിയ ഫ്രാങ്ക് + ഗിനിയ ഫ്രാങ്ക്സ് + + + ഗിനിയ സൈലി + ഗിനിയ സൈലി + ഗിനിയ സൈലിസ് + + + ഇക്വിറ്റോറിയല്‍ ഗിനിയ എക്വീലെ ഗിനിയാന + ഇക്വിറ്റോറിയല്‍ ഗിനി എക്വീലെ + ഇക്വിറ്റോറിയല്‍ ഗിനി എക്വീലെ + + + ഗ്രീക്ക് ഡ്രാക്ക്മ + ഗ്രീക്ക് ഡ്രാക്ക്മ + ഗ്രീക്ക് ഡ്രാക്ക്മാസ് + + + ഗ്വാട്ടിമാല ക്വെറ്റ്സല്‍ + ഗ്വാട്ടിമാല ക്വെറ്റ്സല്‍ + ഗ്വാട്ടിമാല ക്വെറ്റ്സല്‍സ് + + + പോര്‍ച്ചുഗീസ് ഗിനി എസ്ക്യൂഡോ + പോര്‍ച്ചുഗീസ് ഗിനി എസ്ക്യൂഡോ + പോര്‍ച്ചുഗീസ് ഗിനി എസ്ക്യൂഡോസ് + + + ഗിനിയ-ബിസാവു പെയ്സോ + ഗിനി-ബിസാവു പെയ്സോ + ഗിനി-ബിസാവു പെയ്സോസ് + + + ഗയാന ഡോളര്‍ + ഗയാന ഡോളര്‍ + ഗയാന ഡോളേഴ്സ് + + + ഹോങ് കോങ് ഡോളര്‍ + ഹോങ് കോങ് ഡോളര്‍ + ഹോങ് കോങ് ഡോളേഴ്സ് + + + ഹോന്‍ഡ്യുറാസ് ലെംപീര + ഹോന്‍ഡ്യുറാസ് ലെംപീര + ഹോന്‍ഡ്യുറാസ് ലെംപീരാസ് + + + ക്രൊയേഷ്യന്‍ ദിനാര്‍ + ക്രൊയേഷ്യന്‍ ദിനാര്‍ + ക്രൊയേഷ്യന്‍ ദിനാര്‍സ് + + + ക്രൊയേഷ്യന്‍ ക്യൂന + ക്രൊയേഷ്യന്‍ ക്യൂന + ക്രൊയേഷ്യന്‍ ക്യൂനാസ് + + + ഹെയ്ഷ്യന്‍ ഗൂര്‍ഡ് + ഹെയ്ഷ്യന്‍ ഗൂര്‍ഡ് + ഹെയ്ഷ്യന്‍ ഗൂര്‍ഡ്സ് + + + ഹംഗേറിയന്‍ ഫോറിന്‍റ് + ഹംഗേറിയന്‍ ഫോറിന്‍റ് + ഹംഗേറിയന്‍ ഫോറിന്‍റ്സ് + + + ഇന്തോനേഷ്യന്‍ രൂപ + ഇന്തോനേഷ്യന്‍ രൂപ + ഇന്തോനേഷ്യന്‍ രൂപ + + + ഐറിഷ് പൌണ്ട് + ഐറിഷ് പൌണ്ട് + ഐറിഷ് പൌണ്ട്സ് + + + ഇസ്രയേലി പൌണ്ട് + ഇസ്രയേലി പൌണ്ട് + ഇസ്രയേലി പൌണ്ട്സ് + + + ഇസ്രായേലി ഷക്കേല്‍ + ഇസ്രായേലി ന്യൂ ഷെക്കല്‍ + ഇസ്രായേലി ന്യൂ ഷെക്കല്‍സ് + + + ഇന്ത്യന്‍ രൂപ + ഇന്ത്യന്‍ രൂപ + ഇന്ത്യന്‍ രൂപ + രൂ + + + ഇറാക്കി ദിനാര്‍ + ഇറാക്കി ദിനാര്‍ + ഇറാക്കി ദിനാര്‍സ് + + + ഇറാനിയന്‍ റിയാല്‍ + ഇറാനിയന്‍ റിയാല്‍ + ഇറാനിയന്‍ റിയാല്‍സ് + + + ഐസ്‌ലാന്‍ഡിക് ക്രോണ + ഐസ്‌ലാന്‍ഡിക് ക്രോണ + ഐസ്‌ലാന്‍ഡിക് ക്രോണാസ് + + + ഇറ്റാലിയന്‍ ലിറ + ഇറ്റാലിയന്‍ ലിറ + ഇറ്റാലിയന്‍ ലിറാസ് + + + ജമൈക്കന്‍ ഡോളര്‍ + ജമൈക്കന്‍ ഡോളര്‍ + ജമൈക്കന്‍ ഡോളേഴ്സ് + + + ജോര്‍ദ്ദാന്‍ ദിനാര്‍ + ജോര്‍ദ്ദാന്‍ ദിനാര്‍ + ജോര്‍ദ്ദാന്‍ ദിനാര്‍സ് + + + ജപ്പാനീസ് യെന്‍ + ജാപ്പനീസ് യെന്‍ + ജാപ്പനീസ് യെന്‍ + + + കെനിയന്‍ ഷില്ലിംഗ് + കെനിയന്‍ ഷില്ലിംഗ് + കെനിയന്‍ ഷില്ലിംഗ്സ് + + + കിര്‍ഗിസ്ഥാന്‍ സോം + കിര്‍ഗിസ്ഥാന്‍ സോം + കിര്‍ഗിസ്ഥാന്‍ സോംസ് + + + കംബോഡിയന്‍ റീല്‍ + കംബോഡിയന്‍ റീല്‍ + കംബോഡിയന്‍ റീല്‍സ് + + + കൊമോറോ ഫ്രാങ്ക് + കൊമോറോ ഫ്രാങ്ക് + കൊമോറോ ഫ്രാങ്ക്‍സ് + + + നോര്‍ത്ത് കൊറിയന്‍ വോണ്‍ + ഉത്തര കൊറിയന്‍ വോണ്‍ + ഉത്തര കൊറിയന്‍ വോണ്‍സ് + + + ദക്ഷിണ കൊറിയന്‍ വോണ്‍ + ദക്ഷിണ കൊറിയന്‍ വോണ്‍ + ദക്ഷിണ കൊറിയന്‍ വോണ്‍സ് + + + കുവൈറ്റി ദിനാര്‍ + കുവൈറ്റ് ദിനാര്‍ + കുവൈറ്റി ദിനാര്‍സ്‌ + + + കെയ്മന്‍ദ്വീപുകളുടെ ഡോളര്‍‌ + കെയ്മന്‍ദ്വീപുകളുടെ ഡോളര്‍‌ + കെയ്മന്‍ദ്വീപുകളുടെ ഡോളേഴ്സ് + + + കസാഖ്സ്ഥാന്‍ റ്റെംഗെ + കസാഖ്സ്ഥാന്‍ റ്റെംഗെ + കസാഖ്സ്ഥാന്‍ റ്റെംഗെസ്‌ + + + ലാവോഷിയന്‍ കിപ് + ലാവോഷ്യന്‍ കിപ്‌ + ലാവോഷ്യന്‍ കിപ്‌സ്‌ + + + ലെബനീസ് പൌണ്ട് + ലെബനീസ് പൌണ്ട് + ലെബനീസ് പൌണ്ട്സ് + + + ശ്രീലങ്കന്‍ രൂപ + ശ്രീലങ്കന്‍ രൂപ + ശ്രീലങ്കന്‍ രൂപ + + + ലൈബീരിയന്‍ ഡോളര്‍ + ലൈബീരിയന്‍ ഡോളര്‍ + ലൈബീരിയന്‍ ഡോളേഴ്സ് + + + ലെസോതോ ലോത്തി + ലെസോതോ ലോത്തി + ലെസോതോ ലോത്തിസ്‌ + + + ലിത്വാനിയന്‍ ലിത + ലിത്വാനിയന്‍ ലിത + ലിത്വാനിയന്‍ ലിതാസ്‌ + + + ലിത്വാനിയന്‍ തലോനാസ് + ലിത്വാനിയന്‍ തലോനാസ് + ലിത്വാനിയന്‍ തലോനാസെസ്‌ + + + ലക്സംബര്‍ഗ് കണ്‍വേര്‍ട്ടിബിള്‍ ഫ്രാങ്ക് + ലക്സംബര്‍ഗ് കൈമാറ്റം ചെയ്യാവുന്ന ഫ്രാങ്ക്‌ + ലക്സംബര്‍ഗ് കൈമാറ്റം ചെയ്യാവുന്ന ഫ്രാങ്ക്‌സ്‌ + + + ലക്സംബര്‍ഗ് ഫ്രാങ്ക് + ലക്സംബര്‍ഗ് ഫ്രാങ്ക് + ലക്സംബര്‍ഗ് ഫ്രാങ്ക്‌സ്‌ + + + ലക്സംബര്‍ഗ് ഫിനാന്‍ഷ്യല്‍ ഫ്രാങ്ക് + ലക്സംബര്‍ഗ് ഫിനാന്‍ഷ്യല്‍ ഫ്രാങ്ക് + ലക്സംബര്‍ഗ് ഫിനാന്‍ഷ്യല്‍ ഫ്രാങ്ക്‌സ്‌ + + + ലാറ്റ്വിയന്‍ ലാറ്റ്സ് + ലാറ്റ്വിയന്‍ ലാറ്റ്സ് + ലാറ്റ്വിയന്‍ ലാറ്റ്സെസ്‌ + + + ലാറ്റ്വിയന്‍ റൂബിള്‍ + ലാറ്റ്വിയന്‍ റൂബിള്‍ + LVR + + + ലിബിയന്‍ ദിനാര്‍ + LYD + LYD + + + മൊറോക്കന്‍ ദിര്‍ഹം + MAD + MAD + + + മൊറോക്കന്‍ ഫ്രാങ്ക് + MAF + MAF + + + മൊല്‍ഡോവന്‍ ലിയൂ + MDL + MDL + + + മഡഗാസ്കര്‍ ഏരിയറി + MGA + MGA + + + മഡഗാസ്കര്‍ ഫ്രാങ്ക് + MGF + MGF + + + മാസിഡോണിയന്‍ ദിനാര്‍ + MKD + MKD + + + മാലി ഫ്രാങ്ക് + MLF + MLF + + + മ്യാന്‍മാര്‍ ചാറ്റ് + മ്യാന്‍മാര്‍ ചാറ്റ് + MMK + + + മംഗോളിയന്‍ തുഗ്രിക് + MNT + MNT + + + മകൌ പതാക്ക + മകൌ പതാക്ക + മകൌ പതാക്കാസ് + + + മൌറിറ്റേനിയ ഔഗിയ + MRO + MRO + + + മല്‍ത്തീസ് ലിറ + MTL + MTL + + + മല്‍ത്തീസ് പൌണ്ട് + MTP + MTP + + + മൌറീഷ്യസ് രൂപ + MUR + MUR + + + മാലദ്വീപ് രൂപ + മാലദ്വീപ് രൂപ + മാലദ്വീപ് രൂപ + + + മലാവി ക്വാച + MWK + MWK + + + മെക്സിക്കന്‍ പെസോ + MXN + MXN + + + മെക്സിക്കന്‍ സില്‍വര്‍ പെയ്സോ (1861-1992) + മെക്സിക്കന്‍ സില്‍വര്‍ പെയ്സോ (MXP) + മെക്സിക്കന്‍ സില്‍വര്‍ പെയ്സോസ് (MXP) + + + മെക്സിക്കന്‍ യൂണിഡാഡ് ഡി ഇന്‍വെര്‍ഷന്‍ (UDI) + മെക്സിക്കന്‍ യൂണിഡാഡ് ഡി ഇന്‍വെര്‍ഷന്‍ (UDI) + മെക്സിക്കന്‍ യൂണിഡാഡ്സ് ഡി ഇന്‍വെര്‍ഷന്‍ (UDI) + + + മലേഷ്യന്‍ റിംഗിറ്റ് + MYR + MYR + + + മൊസാന്പിക്ക് എസ്ക്യുഡോ + MZE + MZE + + + ഓള്‍ഡ് മൊസാന്പിക്ക് മെറ്റിക്കല്‍ + MZM + MZM + + + മൊസാന്പിക്ക് മെറ്റിക്കല്‍ + MZN + MZN + + + നമീബിയന്‍ ഡോളര്‍ + NAD + NAD + + + നൈജീരിയന്‍ നൈറ + NGN + NGN + + + നികരാഗ്വന്‍ കൊര്‍ഡോബ + NIC + NIC + + + നികരാഗ്വന്‍ കൊര്‍ഡോബ ഒരോ + NIO + NIO + + + നെതര്‍ലന്‍ഡ്സ് ഗില്‍ഡര്‍ + നെതര്‍ലന്‍ഡ്സ് ഗില്‍ഡര്‍ + നെതര്‍ലന്‍ഡ്സ് ഗില്‍ഡേഴ്സ് + + + നോര്‍വീജിയന്‍ ക്രോണെ + നോര്‍വീജിയന്‍ ക്രോണ്‍ + നോര്‍വീജിയന്‍ ക്രോണ്‍സ് + + + നേപ്പാളി രൂപ + NPR + NPR + + + ന്യൂസിലാന്‍ഡ് ഡോളര്‍ + ന്യൂസിലന്‍ഡ് ഡോളര്‍ + ന്യൂസിലന്‍ഡ് ഡോളേഴ്സ് + + + ഒമാന്‍ റിയാല്‍ + OMR + OMR + + + പനാമെയ്നിയന്‍ ബാല്‍ബോവ + പനാമെയ്നിയന്‍ ബാല്‍ബോവ + പനാമെയ്നിയന്‍ ബാല്‍ബോവാസ് + + + പെറൂവിയന്‍ ഇന്‍റി + പെറൂവിയന്‍ ഇന്‍റി + പെറൂവിയന്‍ ഇന്‍റിസ് + + + പെറൂവിയന്‍ സോള്‍ ന്യൂവോ + പെറൂവിയന്‍ സോള്‍ ന്യൂവോ + പെറൂവിയന്‍ സോള്‍ ന്യൂവോസ് + + + പെറൂവിയന്‍ സോള്‍ + പെറൂവിയന്‍ സോള്‍ + പെറൂവിയന്‍ സോള്‍സ് + + + പാപുവ ന്യൂ ഗിനി കിന + പാപുവ ന്യൂ ഗിനി കിന + പാപുവ ന്യൂ ഗിനി കിനാസ് + + + ഫിലിപ്പൈന്‍ പെയ്സോ + ഫിലിപ്പൈന്‍ പെയ്സോ + ഫിലിപ്പൈന്‍ പെയ്സോസ് + + + പാക്കിസ്ഥാനി രൂപ + പാക്കിസ്ഥാനി രൂപ + പാക്കിസ്ഥാനി രൂപ + + + പോളിഷ് സ്ലോട്ടി + പോളിഷ് സ്ലോട്ടി + പോളിഷ് സ്ലോട്ടീസ് + + + പോളിഷ് സ്ലോട്ടി (1950-1995) + PLZ + PLZ + + + പോര്‍ച്ചുഗീസ് എസ്ക്യുഡോ + PTE + PTE + + + പരാഗ്വേ ഗ്വരനീ + PYG + PYG + + + ഖത്തര്‍ റിയാല്‍ + QAR + QAR + + + റൊഡേഷ്യന്‍ ഡോളര്‍ + RHD + RHD + + + പ്രാചീന റൊമേനിയന്‍ ലിയു + ROL + ROL + + + റൊമേനിയന്‍ ലിയു + RON + RON + + + സെര്‍ബിയന്‍ ദിനാര്‍ + RSD + RSD + + + റഷ്യന്‍ റൂബിള്‍ + റഷ്യന്‍ റൂബിള്‍ + റഷ്യന്‍ റൂബിള്‍സ് + + + റഷ്യന്‍ റൂബിള്‍ (1991-1998) + RUR + RUR + + + റുവാണ്ടന്‍ ഫ്രാങ്ക് + RWF + RWF + + + സൌദി റിയാല്‍ + SAR + SAR + + + സോളമന്‍ ദ്വീപുകളുടെ ഡോളര്‍ + SBD + SBD + + + സെയ്ഷെല്‍സ് രൂപ + SCR + SCR + + + പ്രാചീന സുഡാനീസ് ദിനാര്‍ + SDD + SDD + + + സുഡാനീസ് പൌണ്ട് + SDG + SDG + + + പ്രാചീന സുഡാനീസ് പൌണ്ട് + SDP + SDP + + + സ്വീഡിഷ് ക്രോണ + SEK + SEK + + + സിംഗപ്പൂര്‍ ഡോളര്‍ + SGD + SGD + + + സെയ്ന്‍റ് ഹെലെന പൌണ്ട് + SHP + SHP + + + സ്ലൊവേനിയ റ്റോളര്‍ + SIT + SIT + + + സ്ലോവാക് കൊരൂന + SKK + SKK + + + സിയറാ ലിയോണ്‍ ലിയോണ്‍ + SLL + SLL + + + സൊമാലി ഷില്ലിംഗ് + SOS + SOS + + + സൂരിനാം ഡോളര്‍ + SRD + SRD + + + സൂരിനാം ഗില്‍ഡര്‍ + SRG + SRG + + + സാവോ റ്റോമി ആന്‍ഡ് പ്രിന്‍സിപ്പി ഡോബ്ര + STD + STD + + + സോവിയറ്റ് റൂബിള്‍ + SUR + SUR + + + എല്‍ സാല്‍വഡോര്‍ കോളന്‍ + SVC + SVC + + + സിറിയന്‍ പൌണ്ട് + SYP + സിറിയന്‍ പൌണ്ട് + + + സ്വാസിലാന്‍ഡ് ലിലാംഗനി + SZL + SZL + + + തായ് ബട്ട് + തായ് ബട്ട് + തായ് ബട്ട് + + + താജിക്കിസ്ഥാന്‍ റൂബിള്‍ + തജിക്സ്ഥാന്‍ റൂബിള്‍ + തജിക്സ്ഥാന്‍ റൂബിള്‍സ് + + + താജിക്കിസ്ഥാന്‍ സൊമോനി + തജികിസ്ഥാന്‍ സൊമോനി + തജികിസ്ഥാന്‍ സൊമോനിസ് + + + തുര്‍ക്മെനിസ്ഥാന്‍ മനത് + തുര്‍ക്മെനിസ്ഥാന്‍ മനത് + തുര്‍ക്മെനിസ്ഥാന്‍ മനത്‌സ് + + + തുനീസിയന്‍ ദിനാര്‍ + TND + TND + + + റ്റോംഗ പാംഗ + റ്റോംഗ പാംഗ + റ്റോംഗ പാംഗാസ് + + + തിമോര്‍ എസ്ക്യൂഡോ + തിമോര്‍ എസ്ക്യൂഡോ + തിമോര്‍ എസ്ക്യൂഡോസ് + + + പ്രാചീന തുര്‍ക്കിഷ് ലിറ + TRL + പ്രാചീന തുര്‍ക്കിഷ് ലിറാസ് + + + തുര്‍ക്കിഷ് ലിറ + തുര്‍ക്കിഷ് ലിറ + തുര്‍ക്കിഷ് ലിറാസ് + + + ട്രിനിഡാഡ് ആന്‍ഡ് റ്റൊബാഗോ ഡോളര്‍ + TTD + TTD + + + തായ്‌വാന്‍ ഡോളര്‍ + തായ്‌വാന്‍ ഡോളര്‍ + തായ്‌വാന്‍ ഡോളേഴ്സ് + + + ടാന്‍സാനിയന്‍ ഷില്ലിംഗ് + TZS + TZS + + + യുക്രേനിയന്‍ ഹ്രിവ്നിയ + ഉക്രേനിയന്‍ ഹ്രിവ്നിയ + ഉക്രേനിയന്‍ ഹ്രിവ്നിയാസ് + + + യുക്രേനിയന്‍ കാര്‍ബോവാനെസ് + ഉക്രേനിയന്‍ കാര്‍ബോവാനെസ് + ഉക്രേനിയന്‍ കാര്‍ബോവാനെസ് + + + ഉഗാണ്ടന്‍ ഷില്ലിംഗ് (1966-1987) + UGS + UGS + + + ഉഗാണ്ടന്‍ ഷില്ലിംഗ് + UGX + UGX + + + യു.എസ്. ഡോളര്‍ + യു.എസ് ഡോളര്‍ + യു.എസ് ഡോളേഴ്സ് + $ + + + യുഎസ് ഡോളര്‍ (അടുത്ത ദിവസം) + USN + USN + + + യുഎസ് ഡോളര്‍ (അതേ ദിവസം) + USS + യുഎസ് ഡോളേഴ്സ് (അതേ ദിവസം) + + + ഉറുഗ്വേ പെയ്സോ എന്‍ യൂണിഡാഡ്സ് + ഉറുഗ്വേ പെയ്സോ എന്‍ യൂണിഡാഡ്സ് ഇന്‍ഡെക്സാഡാസ് + ഉറുഗ്വേ പെയ്സോസ് എന്‍ യൂണിഡാഡ്സ് ഇന്‍ഡെക്സാഡാസ് + + + ഉറുഗ്വേ പെയ്സോ (1975-1993) + ഉറുഗ്വേ പെയ്സോ (UYP) + ഉറുഗ്വേ പെയ്സോസ് (UYP) + + + ഉറുഗ്വേ പെയ്സോ ഉറുഗായോ + ഉറുഗ്വേ പെയ്സോ + ഉറുഗ്വേ പെയ്സോ + + + ഉസ്ബക്കിസ്ഥാന്‍ സം + ഉസ്ബക്കിസ്ഥാന്‍ സം + ഉസ്ബക്കിസ്ഥാന്‍ സംസ് + + + വെനസ്വേലന്‍ ബോലിവര്‍ + വെനസ്വേലന്‍ ബോലിവര്‍ + വെനസ്വേലന്‍ ബോലിവര്‍സ് + + + വെനസ്വേലന്‍ ബോലിവര്‍ ഫുവെര്‍റ്റെ + വെനസ്വേലന്‍ ബോലിവര്‍ ഫുവെര്‍റ്റെ + വെനസ്വേലന്‍ ബോലിവര്‍ ഫുവെര്‍റ്റെസ് + + + വിയറ്റ്നാമീസ് ഡോങ് + VND + VND + + + വനുവാതു വാതു + വനുവാതു വാതു + വനുവാതു വാതൂസ് + + + പശ്ചിമ സമോവ താല + പശ്ചിമ സമോവ താല + പശ്ചിമ സമോവ താലാസ് + + + CFA ഫ്രാങ്ക് BEAC + CFA ഫ്രാങ്ക് BEAC + CFA ഫ്രാങ്ക്സ് BEAC + + + വെള്ളി + വെള്ളി + വെള്ളി + + + സ്വര്‍ണ്ണം + സ്വര്‍ണ്ണം + സ്വര്‍ണ്ണം + + + യൂറോപ്യന്‍ കോന്പസിറ്റ് യൂണിറ്റ് + യൂറോപ്യന്‍ കോന്പസിറ്റ് യൂണിറ്റ് + യൂറോപ്യന്‍ കോന്പസിറ്റ് യൂണിറ്റ്സ് + + + യൂറോപ്യന്‍ മോണിറ്ററി യൂണിറ്റ് + യൂറോപ്യന്‍ മോണിറ്ററി യൂണിറ്റ് + യൂറോപ്യന്‍ മോണിറ്ററി യൂണിറ്റ്സ് + + + യൂറോപ്യന്‍ യൂണിറ്റ് ഓഫ് അക്കൌണ്ട് (XBC) + യൂറോപ്യന്‍ യൂണിറ്റ് ഓഫ് അക്കൌണ്ട് (XBC) + യൂറോപ്യന്‍ യൂണിറ്റ്സ് ഓഫ് അക്കൌണ്ട് (XBC) + + + യൂറോപ്യന്‍ യൂണിറ്റ് ഓഫ് അക്കൌണ്ട് (XBD) + യൂറോപ്യന്‍ യൂണിറ്റ് ഓഫ് അക്കൌണ്ട് (XBD) + യൂറോപ്യന്‍ യൂണിറ്റ്സ് ഓഫ് അക്കൌണ്ട് (XBD) + + + കിഴക്കന്‍ കരീബിയന്‍ ഡോളര്‍ + കിഴക്കന്‍ കരീബിയന്‍ ഡോളര്‍ + കിഴക്കന്‍ കരീബിയന്‍ ഡോളേഴ്സ് + + + സ്പെഷ്യല്‍ ഡ്രോയിംഗ് റൈറ്റ്സ് + സ്പെഷ്യല്‍ ഡ്രോയിംഗ് റൈറ്റ്സ് + സ്പെഷ്യല്‍ ഡ്രോയിംഗ് റൈറ്റ്സ് + + + യൂറോപ്യന്‍ നാണയ യൂണിറ്റ് + യൂറോപ്യന്‍ നാണയ യൂണിറ്റ് + യൂറോപ്യന്‍ നാണയ യൂണിറ്റ്സ് + + + ഫ്രെഞ്ച് ഗോള്‍ഡ് ഫ്രാങ്ക് + ഫ്രെഞ്ച് ഗോള്‍ഡ് ഫ്രാങ്ക് + ഫ്രെഞ്ച് ഗോള്‍ഡ് ഫ്രാങ്ക്സ് + + + ഫ്രെഞ്ച് UIC-ഫ്രാങ്ക് + ഫ്രെഞ്ച് UIC-ഫ്രാങ്ക് + ഫ്രെഞ്ച് UIC-ഫ്രാങ്ക്സ് + + + CFA ഫ്രാങ്ക് BCEAO + CFA ഫ്രാങ്ക് BCEAO + CFA ഫ്രാങ്ക്സ് BCEAO + + + പലാഡിയം + പലാഡിയം + പലാഡിയം + + + CFP ഫ്രാങ്ക് + CFP ഫ്രാങ്ക് + CFP ഫ്രാങ്ക്സ് + + + പ്ലാറ്റിനം + പ്ലാറ്റിനം + പ്ലാറ്റിനം + + + RINET ഫണ്ട്സ് + RINET ഫണ്ട്സ് + RINET ഫണ്ട്സ് + + + ടെസ്റ്റിംഗിനുള്ള കറന്‍സി കോഡ് + റ്റെസ്റ്റിംഗ് കറന്‍സി കോഡ് + റ്റെസ്റ്റിംഗ് കറന്‍സി കോഡ് + + + അറിയപ്പെടാത്തതോ നിലവിലില്ലാത്തതോ ആയ നാണയം + അറിയപ്പെടാത്തതോ നിലവിലില്ലാത്തതോ ആയ നാണയം + അറിയപ്പെടാത്തതോ നിലവിലില്ലാത്തതോ ആയ നാണയം + + + യമനി ദിനാര്‍ + യമനി ദിനാര്‍ + യമനി ദിനാര്‍സ് + + + യമനി റിയാല്‍ + യമനി റിയാല്‍ + യമനി റിയാല്‍സ് + + + യൂഗോസ്ലേവിയന്‍ ഹാര്‍ഡ് ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ ഹാര്‍ഡ് ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ ഹാര്‍ഡ് ദിനാര്‍സ് + + + യൂഗോസ്ലേവിയന്‍ നോവി ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ നോവി ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ നോവി ദിനാര്‍സ് + + + യൂഗോസ്ലേവിയന്‍ കണ്‍വേര്‍ട്ടിബിള്‍ ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ കണ്‍വേര്‍ട്ടിബിള്‍ ദിനാര്‍ + യൂഗോസ്ലേവിയന്‍ കണ്‍വേര്‍ട്ടിബിള്‍ ദിനാര്‍സ് + + + ദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ് (ഫിനാന്‍ഷ്യല്‍) + ദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ് (ഫിനാന്‍ഷ്യല്‍) + ദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ്സ് (ഫിനാന്‍ഷ്യല്‍) + + + ദക്ഷിണ ആഫ്രിക്കന്‍ റാന്‍ഡ് + ദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ് + ദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ്സ് + + + സാംബിയന്‍ ക്വാച + സാംബിയന്‍ ക്വാച + സാംബിയന്‍ ക്വാചാസ് + + + സൈറിയന്‍ ന്യൂ സൈര്‍ + സൈറിയന്‍ ന്യൂ സൈര്‍ + സൈറിയന്‍ ന്യൂ സൈര്‍സ് + + + സൈറിയന്‍ സൈര്‍ + സൈറിയന്‍ സൈര്‍ + സൈറിയന്‍ സൈര്‍സ് + + + സിംബാബ്‌വെ ഡോളര്‍ + സിംബാബ്‌വെ ഡോളര്‍ + സിംബാബ്‌വെ ഡോളേഴ്സ് + + + + + + {0} ദിവസം + {0} ദിവസം + + + {0} മണിക്കൂര്‍ + {0} മണിക്കൂര്‍ + + + {0} മിനിട്ട് + {0} മിനിട്ട് + + + {0} മാസം + {0} മാസം + + + {0} സെക്കന്റ് + {0} സെക്കന്റ് + + + {0} ആഴ്ച + {0} ആഴ്ച + + + {0} വര്‍ഷം + {0} വര്‍ഷം + + + + + അതെ + അല്ല + + + + diff --git a/lib/zend/Zend/Locale/Data/ml_IN.xml b/lib/zend/Zend/Locale/Data/ml_IN.xml new file mode 100644 index 0000000000..c1ad9f9b7b --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ml_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/mn.xml b/lib/zend/Zend/Locale/Data/mn.xml new file mode 100644 index 0000000000..4cb7818647 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/mn.xml @@ -0,0 +1,316 @@ + + + + + + + + + + + африк + амхарик + араб + ассам үндэстэн + азарбежан + беларусь + болгар + бихари хэл + бенгаль + бретон + босниа + каталан + чех + уэлс + дани + герман + грек + англи + эсперанто + испани + эстони + баск + перс + финлянд + тагало + фөриэс хэл + франц + голландын фрисиан хэл + ирланд + шотланд келт + галик + гуарани + энэтхэгийн гужарати + кипр + хинди + хорвати + унгар + армен + интерлингво + индонези + нэгдмэл хэл + исланд + итали + япон + ява + гүрж + камбуч + каннада + солонгос + курд + киргиз + латин + лингала + лаотиан + литви + латви + македони + малайлам + монгол + энэтхэгийн марати + малай + малти + балба + голланд + норвеги (нынорск) + норвеги + францын окситан + ория + пенжаби + польш + афган + португали + португали (бразил) + португали (португали) + румын + орос + санскирит + синдхи + хорватын серб + шри ланк + словак + словени + сомали + албани + серби + сесото + сунданес хэл + швед + африкийн свахили хэл + тамил + тэлүгү + тай + тикрина + туркмен + клингон хэл + турк + тви + уйгур + украин + пакистаны урду + узбек + вьетнам + хоса + иддиш + хятад + зулу + + + Бразили + Герман + Франц + Энэтхэг + Итали + Япон + Монгол улс + Орос + Тонга + Америкийн Нэгдсэн Улс + + + + [а-е ё ж-о ө п-у ү ф-я] + [ә җ ӊ һ] + + + ‘ + ’ + “ + ” + + + + + + + + хул + үхэ + бар + туу + луу + мог + мор + хон + бич + тах + нох + гах + + + Хулгана + Үхэр + Бар + Туулай + Луу + Могой + Морь + Хонь + Бич + Тахиа + Нохой + Гахай + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Ня + Да + Мя + Лх + Пү + Ба + Бя + + + ням + даваа + мягмар + лхагва + пүрэв + баасан + бямба + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + 1/4 + 2/4 + 3/4 + 4/4 + + + дөрөвний нэг + дөрөвний хоёр + дөрөвний гурав + дөрөвний дөрөв + + + + AM + PM + + + манай эриний өмнөх + манай эриний + + + м.э.ө + м.э. + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + diff --git a/lib/zend/Zend/Locale/Data/mn_CN.xml b/lib/zend/Zend/Locale/Data/mn_CN.xml new file mode 100644 index 0000000000..e9dabe27f0 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/mn_CN.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/mn_Cyrl.xml b/lib/zend/Zend/Locale/Data/mn_Cyrl.xml new file mode 100644 index 0000000000..844b32e9fc --- /dev/null +++ b/lib/zend/Zend/Locale/Data/mn_Cyrl.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + विश्व + अफ्रिका + उत्तर अमेरिका + दक्षिण अमेरिका + ओशनिया + पश्चिम अफ्रिका + मध्य अमेरीका + पूर्व अफ्रिका + उत्तर अफ्रिका + मध्य अफ्रिका + दक्षिणी अफ्रिका + अमेरिकास + उत्तरी अमेरिका + कॅरीबियन + पूर्व अशिया + दक्षिण अशिया + दक्षिण पूर्व अशिया + दक्षिण युरोप + ऑस्ट्रेलिया आणि न्यूझीलंड + मेलानेशिया + मायक्रोनेशियन रीजन + पॉलिनेशिया + दक्षिण-मध्य अशिया + अशिया + मध्य अशिया + पश्चिम अशिया + युरोप + पूर्व युरोप + उत्तर युरोप + पश्चिम युरोप + स्वतंत्र राष्ट्रांचे कॉमनवेल्थ + झेकोस्लवाकिया + लॅटिन अमेरिका आणि कॅरीबियन + चॅनल बेटे + अँडोरा + संयुक्त अरब अमीरात + अफगाणिस्तान + अँटिग्वा आणि बर्बुडा + अँग्विला + अल्बानिया + आर्मेनिया + नेदरलँड्स अँटिल्स + अंगोला + अंटार्क्टिक + अर्जेंटिना + अमेरिकन सामोआ + ऑस्ट्रिया + ऑस्ट्रेलिया + अरुबा + अ‍ॅलँड बेटे + अझरबैजान + बोस्निया अणि हर्जेगोविना + बार्बाडोस + बांग्लादेश + बेल्जियम + बुर्किना फासो + बल्गेरिया + बहारीन + बुरुंडी + बेनिन + सेंट बार्थेलेमी + बर्मुडा + ब्रुनेई + बोलिव्हिया + ब्राझिल + बहामाज + भूतान + बोउवेट बेट + बोट्सवाना + बेलारूस + बेलिझे + कॅनडा + कोकोस बेटे + काँगो - किंशासा + केंद्रीय अफ्रिकी प्रजासत्ताक + काँगो - ब्राजाविले + स्वित्झर्लंड + आयव्हरी कोस्ट + कुक बेटे + चिली + कॅमेरून + चीन + कोलम्बिया + कोस्टारिका + सर्बिया आणि माँटेनेग्रो + क्यूबा + केप व्हर्डे + ख्रिसमस बेट + सायप्रस + झेक प्रजासत्ताक + जर्मनी + जिबौटी + डेन्मार्क + डोमिनिका + डोमिनिकन प्रजासत्ताक + अल्जीरिया + इक्वेडोर + एस्टोनिया + इजिप्त + पश्चिम सहारा + इरिट्रिया + स्पेन + इथिओपिया + फिनलंड + फिजी + फॉकलंड बेटे + मायक्रोनेशिया + फरोए बेटे + फ्रान्स + गॅबॉन + ब्रिटन + ग्रेनेडा + जॉर्जिया + फ्रेंच गयाना + ग्वेर्नसे + घाना + जिब्राल्टर + ग्रीनलँड + गाम्बिया + गिनी + ग्वाडेलोउपे + इक्वेटोरियल गिनी + ग्रीस + दक्षिण जॉर्जिया आणि दक्षिण सँडविच बेटे + ग्वाटेमाला + गुआम + गिनी-बिसाउ + गयाना + हाँगकाँग विशेष प्रशासनिक क्षेत्र चीन + हर्ड बेट आणि मैकडोनाल्ड बेट + होंडुराज् + क्रोएशिया + हैती + हंगेरी + इंडोनेशिया + आयर्लंड + इस्त्राइल + इस्ले ऑफ मॅन + भारत + ब्रिटिश हिंद महासागरीय क्षेत्र + इराक + ईराण + आइसलँड + इटली + जर्सी + जमैका + जॉर्डन + जपान + केनिया + किरगीझस्तान + कंबोडिया + किरीबाटी + कोमोरोज + सेंट किट्स आणि नेव्हिस + उत्तर कोरिया + दक्षिण कोरिया + कुवेत + केमन बेटे + कझाकस्तान + लाओस + लेबानन + सेंट ल्यूसिया + लिंचेनस्टाइन + श्रीलंका + लायबेरिया + लेसोथो + लिथुआनिया + लक्झेंबर्ग + लाट्‌विया + लिबिया + मोरोक्को + मोनॅको + मोल्डोव्हा + मोंटेनेग्रो + सेंट मार्टिन + मादागास्कर + मार्शल बेटे + मॅसेडोनिया + माली + म्यानमार + मंगोलिया + मकाऊ SAR चीन + उत्तरी मारियाना बेटे + मार्टिनिक + मॉरिटानिया + मॉन्ट्सेराट + माल्टा + मॉरिशस + मालदीव्ज + मलावी + मेक्सिको + मलेशिया + मोझाम्बिक + नमीबिया + न्यू कॅलेडोनिया + नाइजर + नॉरफॉक बेट + नायजेरिया + निकाराग्वे + नेदरलँड + नॉर्वे + नेपाळ + नऊरु + नीयू + न्यूझीलंड + ओमान + पनामा + पेरू + फ्रेंच पॉलिनेशिया + पापुआ न्यू गिनी + फिलीपिन्स + पाकिस्तान + पोलंड + सेंट पियरे आणि मिक्वेलोन + पिटकॅर्न + पोर्टो रिको + पॅलेस्टिनी प्रदेश + पोर्तुगाल + पलाऊ + पराग्वे + कतार + आउटलायिंग ओशनिया + यूरोपीय संघ + रियूनियन + रोमानिया + सर्बिया + रशिया + रवांडा + सौदी अरब + सोलोमन बेटे + सेशेल्स + सूदान + स्वीडन + सिंगापूर + सेंट हेलेना + स्लोव्हेनिया + स्वालबर्ड आणि जान मायेन + स्लोव्हाकिया + सिएरा लेओन + सॅन मरीनो + सेनेगल + सोमालिया + सुरिनाम + साओ टोम आणि प्रिंसिपे + अल साल्वाडोर + सीरिया + स्वाझिलँड + टर्क्स आणि कैकोस बेटे + चाड + फ्रेंच दाक्षिणात्य प्रदेश + टोगो + थायलंड + ताजिकिस्तान + तोकेलाउ + पूर्व तिमोर + तुर्कमेनिस्तान + ट्यूनिशिया + टोंगा + तुर्की + त्रिनिदाद आणि टोबॅगो + टुवालु + तैवान + टांझानिया + यूक्रेन + युगांडा + युनाइटेड स्टेट्स माइनर आउटलाइंग बेटे + संयुक्त राज्ये /अमेरिका + उरुग्वे + उझबेकिस्तान + व्हॅटिकन + सेंट व्हिन्सेंट आणि ग्रेनडाइन्स + व्हेनेझुएला + ब्रिटिश व्हर्जिन बेटे + यू.एस. व्हर्जिन बेटे + व्हिएतनाम + वानौटु + वालिस आणि फ्यूचूना + सामोआ + येमेन + मायोट्टे + दक्षिण अफ्रिका + झाम्बिया + झिम्बाब्वे + अज्ञात वा अवैध प्रदेश + + + + [़ ँ-ः ०-९ ॐ अ-ऍ ए-ऑ ओ-न प-र ल ळ व-ह ऽ-ॅ े-ॉ ो-्] + [\u200C \u200D] + + + ' + ' + " + " + + + + + + + + जानेवारी + फेब्रुवारी + मार्च + एप्रिल + मे + जून + जुलै + ऑगस्ट + सप्टेंबर + ऑक्टोबर + नोव्हेंबर + डिसेंबर + + + + + जा + फे + मा + ए + मे + जू + जु + ऑ + स + ऑ + नो + डि + + + + + + + रवि + सोम + मंगळ + बुध + गुरु + शुक्र + शनि + + + रविवार + सोमवार + मंगळवार + बुधवार + गुरुवार + शुक्रवार + शनिवार + + + + + र + सो + मं + बु + गु + शु + श + + + + + + + Q1 + Q2 + Q3 + Q4 + + + प्रथम तिमाही + द्वितीय तिमाही + तृतीय तिमाही + चतुर्थ तिमाही + + + + am + pm + + + ईसवीसनपूर्व + ईसवीसन + + + ई.स.पू. + ई.स. + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + d-M-yy + + + + + + + h-mm-ss a zzzz + + + + + h-mm-ss a z + + + + + h-mm-ss a + + + + + h-mm a + + + + + + H-mm + H-mm-ss + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM y + + + + + युग + + + वर्ष + + + महिना + + + आठवडा + + + दिवस + तीन दिवसांपूर्वी + परवा + काल + आज + उद्या + परवा + आजपासून तीन दिवस + + + आठवड्याचा दिवस + + + तास + + + मिनिट + + + सेकंद + + + झोन + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + भारतीय समय + + true + + + + + deva + + ० + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + रु + + + + + + होयःहो + नाहीःना + + + diff --git a/lib/zend/Zend/Locale/Data/mr_IN.xml b/lib/zend/Zend/Locale/Data/mr_IN.xml new file mode 100644 index 0000000000..4bdcf3ec16 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/mr_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ms.xml b/lib/zend/Zend/Locale/Data/ms.xml new file mode 100644 index 0000000000..ebfcd3ee55 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ms.xml @@ -0,0 +1,557 @@ + + + + + + + + + + + Afrikaans + Amharic + Arab + Assam + Azerbaijan + Belarus + Bulgaria + Bihari + Benggala + Brittany + Bosnia + Catalonia + Czech + Wales + Denmark + Jerman + Greek + Inggeris + Esperanto + Sepanyol + Estonia + Basque + Parsi + Finland + Tagalog + Faroese + Perancis + Frisian + Ireland + Scots Gaelic + Galicia + Guarani + Gujerat + Ibrani + Hindi + Croat + Hungary + Armenia + Interlingua + Indonesia + Interlingue + Iceland + Itali + Jepun + Jawa + Georgia + Khmer + Kannada + Korea + Kurdish + Kyrgyz + Latin + Lingala + Laos + Lithuania + Latvia + Macedonia + Malayalam + Mongolia + Marathi + Bahasa Melayu + Malta + Nepal + Belanda + Nynorsk Norway + Norway + Occitan + Oriya + Punjabi + Poland + Pashto + Portugis + Portugis Iberia + Romania + Rusia + Sanskrit + Sindhi + SerboCroatia + Sinhala + Slovak + Slovenia + Somali + Albania + Serbia + Sesoto + Sunda + Sweden + Swahili + Tamil + Telugu + Thai + Tigrinya + Turkmen + Klingon + Turki + Twi + Uighur + Ukraine + Urdu + Uzbek + Vietnam + Xhosa + Yahudi + Zulu + + + Andorra + Emiriah Arab Bersatu + Afghanistan + Antigua dan Barbuda + Anguilla + Albania + Armenia + Netherlands Antilles + Angola + Antarctica + Argentina + American Samoa + Austria + Australia + Aruba + Azerbaijan + Bosnia dan Herzegovina + Barbados + Bangladesh + Belgium + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Bermuda + Brunei + Bolivia + Brazil + Bahamas + Bhutan + Bouvet Island + Botswana + Belarus + Belize + Kanada + Cocos (Keeling) Islands + Democratic Republic of the Congo + Republik Afrika Tengah + Congo + Switzerland + Pantai Gading + Cook Islands + Cile + Kamerun + Cina + Colombia + Kosta Rika + Serbia dan Montenegro + Cuba + Cape Verde + Christmas Island + Kibris + Republik Czech + Jerman + Jibouti + Denmark + Dominica + Republik Dominican + Aljazair + Ecuador + Estonia + Mesir + Sahara Barat + Eritrea + Sepanyol + Ethiopia + Finland + Fiji + Falkland Islands + Micronesia + Faroe Islands + Perancis + Gabon + United Kingdom + Grenada + Georgia + French Guiana + Ghana + Gibraltar + Greenland + Gambia + Guinea + Guadeloupe + Equatorial Guinea + Yunani + South Georgia and the South Sandwich Islands + Guatemala + Guam + Guinea Bissau + Guyana + Hong Kong S.A.R., China + Heard Island and McDonald Islands + Honduras + Croatia + Haiti + Hungari + Indonesia + Ireland + Israel + Hindia + British Indian Ocean Territory + Iraq + Iran + Iceland + Itali + Jamaika + Jordan + Jepun + Kenya + Kyrgyzstan + Kemboja + Kiribati + Comoros + Saint Kitts dan Nevis + Utara Korea + Selatan Korea + Kuwait + Cayman Islands + Kazakhstan + Laos + Lubnan + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lithuania + Luksembourg + Latvia + Libya + Maghribi + Monaco + Moldova + Madagaskar + Kepulauan Marshall + Macedonia + Mali + Myanmar + Mongolia + Macao S.A.R., China + Northern Mariana Islands + Martinique + Mauritania + Montserrat + Malta + Mauritius + Maldiv + Malawi + Meksiko + Malaysia + Mozambik + Namibia + New Caledonia + Niger + Norfolk Island + Nigeria + Nicaragua + Belanda + Norway + Nepal + Nauru + Niue + New Zealand + Oman + Panama + Peru + French Polynesia + Papua New Guinea + Filipina + Pakistan + Poland + Saint Pierre and Miquelon + Pitcairn + Puerto Rico + Palestinian Territory + Feringgi + Palau + Paraguay + Qatar + Réunion + Romania + Russia + Rwanda + Arab Saudi + Kepulauan Solomon + Seychelles + Sudan + Sweden + Singapura + Saint Helena + Slovenia + Svalbard and Jan Mayen + Slovakia + Siera Leon + San Marino + Senegal + Somalia + Surinam + Sao Tome dan Principe + El Salvador + Syria + Swaziland + Turks and Caicos Islands + Cad + French Southern Territories + Togo + Thailand + Tadjikistan + Tokelau + Timor-Leste + Turkmenistan + Tunisia + Tonga + Turki + Trinidad dan Tobago + Tuvalu + Taiwan + Tanzania + Ukraine + Uganda + United States Minor Outlying Islands + Amerika Syarikat + Uruguay + Uzbekistan + Vatican + Saint Vincent dan Grenadines + Venezuela + British Virgin Islands + U.S. Virgin Islands + Vietnam + Vanuatu + Wallis and Futuna + Samoa + Yaman + Mayotte + Afrika Selatan + Zambia + Zimbabwe + + + + [a {ai} {au} b-d {dz} e-k {kh} l-n {ng} {ngg} {ny} o-s {sy} t {ts} u {ua} v-z] + + + ‘ + ’ + “ + ” + + + + + + + + Jan + Feb + Mac + Apr + Mei + Jun + Jul + Ogos + Sep + Okt + Nov + Dis + + + Januari + Februari + Mac + April + Mei + Jun + Julai + Ogos + September + Oktober + November + Disember + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Ahd + Isn + Sel + Rab + Kha + Jum + Sab + + + Ahad + Isnin + Selasa + Rabu + Khamis + Jumaat + Sabtu + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + S1 + S2 + S3 + S4 + + + suku pertama + suku kedua + suku ketiga + suku keempat + + + + AM + PM + + + S.M. + T.M. + + + + + + EEEE dd MMM y + + + + + dd MMMM y + + + + + dd MMM y + + + + + dd/MM/yyyy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm + + + + + + H:mm + dd MMMM + dd/MM + Q yy + MM/yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00;(¤#,##0.00) + + + + + + Ringgit Malaysia + + + + + + ya:y + tidak:t + + + diff --git a/lib/zend/Zend/Locale/Data/ms_BN.xml b/lib/zend/Zend/Locale/Data/ms_BN.xml new file mode 100644 index 0000000000..4fbeadc4d6 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ms_BN.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + dd MMMM y + + + + + dd/MM/yyyy + + + + + + + h:mm:ss aa zzzz + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + {0} - {1} + + MM-dd - MM-dd + MM-dd - MM-dd + + + MMM-MMM + + + MMM d - MMM d + MMM d-d + + + MMM d - MMM d + MMM d-d + + + MM-dd - MM-dd + MM-dd - MM-dd + + + H-H + + + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + + + yyyy-MM - yyyy-MM + yyyy-MM - yyyy-MM + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + + + y MMM-MMM + y MMM - y MMM + + + dd MMM - dd MMM y + dd-dd MMM y + dd MMM y - dd MMM y + + + y MMM d - MMM d + y MMM d-d + y MMM d - y MMM d + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + + + + + + + + + , + . + + + + + ¤ #,##0.00 + + + + + + $ + + + + diff --git a/lib/zend/Zend/Locale/Data/ms_MY.xml b/lib/zend/Zend/Locale/Data/ms_MY.xml new file mode 100644 index 0000000000..afe5ddac6e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ms_MY.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/mt.xml b/lib/zend/Zend/Locale/Data/mt.xml new file mode 100644 index 0000000000..9562e27822 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/mt.xml @@ -0,0 +1,1141 @@ + + + + + + + + + + + Afar + Abkażjan + Aċiniż + Akoli + Adangme + Adyghe + Avestan + Afrikans + Afro-Asjatiku (Oħra) + Afriħili + Ajnu + Akan + Akkadjen + Aleut + Lingwi Algonqwinjani + Amħariku + Aragonese + Ingliż, Antik + Angika + Lingwi Apaċi + Għarbi + Aramajk + Arawkanjan + Arapaħo + Artifiċjali (Oħra) + Arawak + Assamese + Asturian + Lingwi Atabaskani + Lingwi Awstraljani + Avarik + Awadħi + Ajmara + Ażerbajġani + Baxkir + Banda + Lingwi Bamileke + Baluċi + Baliniż + Basa + Baltiku (Oħra) + Belarussu + Beja + Bemba + Beber + Bulgaru + Biħari + Bojpuri + Bislama + Bikol + Bini + Siksika + Bambara + Bengali + Bantu + Tibetjan + Brenton + Braj + Bosnijan + Batak + Burjat + Buginiż + Blin + Katalan + Kaddo + Amerika Ċentrali (Oħra) + Karib + Kawkasu (Oħra) + Atsam + Ċeċen + Sibwano + Keltiku (Oħra) + Ċamorro + Ċibċa + Ċagataj + Ċukese + Mari + Ġargon taċ-Ċinuk + Ċostaw + Ċipewjan + Ċerokij + Xajenn + Lingwi Ċamiki + Korsiku + Koptiku + Kreoli u Piġini, Bbażat fuq l-Ingliż (Oħra) + Kreoli u Piġini, Bbażat fuq il-Franċiż (Oħra) + Kreoli u Piġini, Bbażat fuq il-Portugiż (Oħra) + Krij + Crimean Turkish; Crimean Tatar + Kreoli u Piġini (Oħra) + Ċek + Kashubian + Slaviku tal-Knisja + Kuxtiku (Oħra) + Ċuvax + Welx + Daniż + Dakota + Dargwa + Dajak + Ġermaniż + Delawerjan + Slav + Dogrib + Dinka + Dogri + Dravidjan (Oħra) + Lower Sorbian + Dwala + Olandiż, Medjevali + Diveħi + Djula + Dżongka + Ewe + Efik + Eġizzjan (Antik) + Ekajuk + Grieg + Elamit + Ingliż + Ingliż, Medjevali (1100-1500) + Esperanto + Spanjol + Estonjan + Bask + Ewondo + Persjan + Fang + Fanti + Fulaħ + Finlandiż + Filippino + Finno - Ugrijan + Fiġi + Fawriż + Fon + Franċiż + Franċiż, Medjevali + Franċiż, Antik + Frijuljan + Friżjan + Irlandiż + Ga + Gajo + Gbaja + Galliku Skoċċiż + Ġermaniku (Oħra) + Geez + Gilbertjan + Gallegjan + Ġermaniku, Medjevali Pulit + Gwarani + Ġermaniku, Antik Pulit + Gondi + Gorontalo + Gotiku + Ġerbo + Grieg, Antik (to 1453) + Guġarati + Manks + Gwiċin + Ħawsa + Ħajda + Ħawajjan + Ebrajk + Ħindi + Hiligaynon + Ħimaċali + Ħittit + Ħmong + Ħiri Motu + Kroat + Upper Sorbian + Haitian + Ungeriż + Ħupa + Armenjan + Ħerero + Interlingua + Iban + Indoneżjan + Interlingue + Igbo + Sichuan Yi + Iġo + Inupjak + Iloko + Indjan (Oħra) + Indo-Ewropew + Ingush + Ido + Iranjan + Lingwi Irogwjani + Iżlandiż + Taljan + Inukitut + Ġappuniż + Lojban + Lhudi-Persjan + Lhudi-Għarbi + Ġavaniż + Ġorġjan + Kara-Kalpak + Kabuljan + Kaċin + Kamba + Karen + Kawi + Kabardian + Kongo + Kasi + Kojsan + Kotaniż + Kikuju + Kuanyama + Każak + Kalallisut + Kmer + Kimbundu + Kannada + Korejan + Konkani + Kosrejan + Kpelle + Kanuri + Karachay-Balkar + Kru + Kurusk + Kaxmiri + Kurdiż + Kumiku + Kutenaj + Komi + Korniku + Kirgiż + Latin + Ladino + Landa + Lamba + Letżburgiż + Leżgjan + Ganda + Limburgish + Lingaljan + Lao + Mongo + Lożi + Litwanjan + Luba-Katanga + Luba-Luluwa + Luwisinuż + Lunda + Luwa + Luxaj + Latvjan (Lettix) + Maduriż + Magaħi + Majtili + Makasar + Mandingwan + Awstronesjan + Masaj + Moksha + Mandar + Mende + Malagażi + Irlandiż, Medjevali (900-1200) + Marxall + Maori + Mikmek + Minangkabaw + Lingwi Oħra + Maċedonjan + Mon-Kmer (Oħra) + Malajalam + Mongoljan + Manċurjan + Manipuri + Lingwi Manobo + Moldavjan + Moħak + Mossi + Marati + Malajan + Malti + Lingwi Diversi + Lingwi tal-Munda + Kriek + Mirandiż + Marwari + Burmiż + Majan + Erzya + Nawuru + Naħwatil + Indjan tal-Amerika ta’ Fuq (Oħra) + Neapolitan + Bokmahal Norveġiż + Ndebele, ta’ Fuq + Ġermaniż Komuni; Sassonu Komuni + Nepaliż + Newari + Ndonga + Nijas + Niġerjan - Kordofanjan + Nijuwejan + Olandiż + Ninorsk Norveġiż + Norveġiż + Nogai + Skandinav, Antik + Ndebele, t’Isfel + Soto, ta’ Fuq + Lingwi Nubjani + Navaħo + Classical Newari + Ċiċewa; Njanġa + Njamweżi + Nyankole + Njoro + Nżima + Oċċitan + Oġibwa + Oromo (Afan) + Orija + Ossettiku + Osaġjan + Tork (Imperu Ottoman) + Lingwi Otomjani + Punġabi + Papwan (Oħra) + Pangasinjan + Paħlavi + Pampamga + Papjamento + Palawjan + Persjan Antik + Filippin (Oħra) + Feniċju + Pali + Pollakk + Ponpejan + Lingwi Prakriti + Provenzal, Antik (sa l-1500) + Paxtun + Portugiż + Keċwa + Raġastani + Rapanwi + Rarotongani + Reto-Romanz + Rundi + Rumen + Romanz (Oħra) + Żingaru + Għerq + Russu + Aromanijan + Kinjarwanda + Sanskrit + Sandawe + Jakut + Indjan tal-Amerika t’Isfel (Oħra) + Salixan + Samritan + Saska + Santali + Sardinjan + Skoċċiż + Sindi + Sami ta’ Fuq + Selkup + Semitiku + Sango + Irlandiż, Antik (sa l-900) + Lingwa tas-Sinjali + Serbo-Kroat + Xan + Sinħaliż + Sidamo + Lingwi Suwjani + Sino-Tibetjani (Oħra) + Slovakk + Sloven + Slavic (Other) + Samojan + Southern Sami + Sami languages (Other) + Lule Sami + Inari Sami + Skolt Sami + Xona + Soninke + Somali + Sogdien + Songaj + Albaniż + Serb + Serer + Swati + Nilo-Saħaram + Soto, t’Isfel + Sundaniż + Sukuma + Susu + Sumerjan + Svediż + Swaħili + Sirjan + Tamil + Tai (Oħra) + Telugu + Timne + Tereno + Tetum + Taġik + Tajlandiż + Tigrinja + Tigre + Tiv + Turkmeni + Tokelau + Tagalog + Klingon + Tlingit + Tamaxek + Zwana + Tongan (Gżejjer ta’ Tonga) + Tonga (Njasa) + Tok Pisin + Tork + Tsonga + Zimxjan + Tatar + Tumbuka + Tupi languages + Altajk (Oħra) + Tuvalu + Twi + Taħitjan + Tuvinjan + Udmurt + Wigur + Ugaritiku + Ukranjan + Umbundu + Indeterminat + Urdu + Użbek + Vai + Venda + Vjetnamiż + Volapuk + Votik + Walloon + Lingwi Wakaxani + Walamo + Waraj + Waxo + Lingwi Sorbjani + Wolof + Kalmyk + Ħoża + Jao + Japese + Jiddix + Joruba + Lingwi Jupiċi + Żwang + Żapotek + Żenaga + Ċiniż + Żande + Żulu + Żuni + + + + + + + + + + + + + + Dinja + Affrika + Amerika ta’ Fuq + Amerika t’Isfel + Oċejanja + Affrika tal-Punent + Amerika Ċentrali + Affrika tal-Lvant + Affrika ta’ Fuq + Affrika Nofsani + Affrika t’Isfel + Amerika + Amerika Nòrdiku + Karibew + Asja tal-Lvant + Asja t’Isfel Ċentrali + Asja tax-Xlokk + Ewropa t’Isfel + Awstralja u New Zealand + Melanesja + Reġjun ta’ Mikroneżja + Polinesja + Asja + Asja Ċentrali + Asja tal-Punent + Ewropa + Ewropa tal-Lvant + Ewropa ta’ Fuq + Ewropa tal-Punent + Commonwealth tal-Istati Independenti + Amerika Latina u l-Karibew + Gżejjer tal-Kanal Ingliż + Andorra + Emirati Għarab Maqgħuda + Afganistan + Antigua and Barbuda + Angwilla + Albanija + Armenja + Antilles Olandiżi + Angola + Antartika + Arġentina + Samoa Amerikana + Awstrija + Awstralja + Aruba + Gżejjer Aland + Ażerbajġan + Bożnija Ħerżegovina + Barbados + Bangladexx + Belġju + Burkina Faso + Bulgarija + Baħrajn + Burundi + Benin + Bermuda + Brunej + Bolivja + Brażil + Baħamas + Butan + Bouvet Island + Botswana + Bjelorussja + Beliże + Kanada + Cocos (Keeling) Islands + Democratic Republic of the Congo + Repubblika Afrikana Ċentrali + Kongo + Svizzera + Kosta ta’ l-Avorju + Cook Islands + Ċili + Kamerun + Ċina + Kolumbja + Kosta Rika + Serbja u Montenegro + Kuba + Kape Verde + Christmas Island + Ċipru + Repubblika Ċeka + Ġermanja + Ġibuti + Danimarka + Dominika + Republikka Domenikana + Alġerija + Ekwador + Estonja + Eġittu + Sahara tal-Punent + Eritreja + Spanja + Etijopja + Finlandja + Fiġi + Falkland Islands + Mikronesja + Gżejjer Faroe + Franza + Gabon + Ingilterra + Grenada + Ġorġja + Gujana Franċiża + Gana + Gibraltar + Grinlandja + Gambja + Gineja + Gwadelupe + Ginea Ekwatorjali + Greċja + South Georgia and the South Sandwich Islands + Gwatemala + Gwam + Ginea-Bissaw + Gujana + Ħong Kong S.A.R., Ċina + Heard Island and McDonald Islands + Ħonduras + Kroazja + Ħaiti + Ungerija + Indoneżja + Irlanda + Iżrael + Isle of Man + Indja + British Indian Ocean Territory + Iraq + Iran + Islanda + Italja + Ġamajka + Ġordan + Ġappun + Kenja + Kirgistan + Kambodja + Kiribati + Komoros + Saint Kitts and Nevis + Koreja ta’ Fuq + Koreja t’Isfel + Kuwajt + Gżejjer Kajmani + Każakstan + Laos + Libanu + Santa Luċija + Liechtenstein + Sri Lanka + Liberja + Lesoto + Litwanja + Lussemburgu + Latvja + Libja + Marokk + Monako + Maldova + Madagaskar + Gżejjer ta’ Marshall + Maċedonja + Mali + Mjanmar + Mongolja + Macao S.A.R., China + Gżejjer Marjana ta’ Fuq + Martinik + Mawritanja + Montserrat + Malta + Mawrizju + Maldives + Malawi + Messiku + Malasja + Możambik + Namibja + New Caledonia + Niġer + Norfolk Island + Niġerja + Nikaragwa + Olanda + Norveġja + Nepal + Nauru + Niue + New Zealand + Oman + Panama + Peru + Polinesja Franċiża + Papwa-Ginea Ġdida + Filippini + Pakistan + Polonja + Saint Pierre and Miquelon + Pitcairn + Puerto Rico + Palestinian Territory + Portugall + Palau + Paragwaj + Qatar + Unjoni Ewropea + Réunion + Rumanija + Russja + Rwanda + Għarabja Sawdita + Solomon Islands + Seychelles + Sudan + Żvezja + Singapor + Saint Helena + Slovenja + Svalbard and Jan Mayen + Slovakkja + Sierra Leone + San Marino + Senegal + Somalja + Surinam + Sao Tome and Principe + El Salvador + Sirja + Sważiland + Turks and Caicos Islands + Ċad + Territorji Franċiżi ta’ Nofsinhar + Togo + Tajlandja + Taġikistan + Tokelaw + Timor tal-Lvant + Turkmenistan + Tuneż + Tonga + Turkija + Trinidad u Tobago + Tuvalu + Tajwan + Tanżanija + Ukraina + Uganda + United States Minor Outlying Islands + Stati Uniti + Urugwaj + Użbekistan + Vatikan + Saint Vincent and the Grenadines + Venezwela + British Virgin Islands + U.S. Virgin Islands + Vjetnam + Vanwatu + Wallis and Futuna + Samoa + Jemen + Majotte + Afrika t’Isfel + Żambja + Żimbabwe + Reġjun Mhux Magħruf jew Mhux Validu + + + Ortografija Irriveda + + + Kalendarju + Kollazjoni + Munita + + + Ordni Ċiniż Tradizzjonali (Big5) + Kalendarju Buddist + Kalendarju Ċiniż + Ordni Diretta + Ordni Ċiniż Sempliċi (GB2312) + Kalendarju Gregorjan + Kalendarju Ebrajk + Kalendarju Islamiku + Kalendarju Islamiku-Ċivili + Kalendarju Ġappuniż + Ordni Telefonika + Ordni tal-Pinjin + Ordni Maħżuża + Tradizzjonali + + + Metriku + + + Lingwa: {0} + Skritt: {0} + Reġjun: {0} + + + + [a à b ċ d e è f ġ g {għ} h ħ i ì j-o ò p-u ù v-x ż z] + [c y] + + + + + + + + Jan + Fra + Mar + Apr + Mej + Ġun + Lul + Aww + Set + Ott + Nov + Diċ + + + Jannar + Frar + Marzu + April + Mejju + Ġunju + Lulju + Awwissu + Settembru + Ottubru + Novembru + Diċembru + + + + + J + F + M + A + M + Ġ + L + A + S + O + N + D + + + + + + + Ħad + Tne + Tli + Erb + Ħam + Ġim + Sib + + + Il-Ħadd + It-Tnejn + It-Tlieta + L-Erbgħa + Il-Ħamis + Il-Ġimgħa + Is-Sibt + + + + + Ħ + T + T + E + Ħ + Ġ + S + + + + + + + K1 + K2 + K3 + K4 + + + K1 + K2 + K3 + K4 + + + + QN + WN + + + Qabel Kristu + Wara Kristu + + + QK + WK + + + + + + EEEE, d 'ta'’ MMMM y + + + + + d 'ta'’ MMMM y + + + + + dd MMM y + + + + + dd/MM/yyyy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + d 'ta'’ MMMM + dd/MM + Q yy + MM/yyyy + MMM y + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + MMM-MMM + + + E, d 'ta'’ MMM - E, d 'ta'’ MMM + E, d 'ta'’ - E, d 'ta'’ MMM + + + d 'ta'’ MMM - d 'ta'’ MMM + d 'ta'’-d 'ta'’ MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + E, dd/MM/yyyy - E, dd/MM/yyyy + + + MMM-MMM y + MMM y - MMM y + + + E, d 'ta'’ MMM - E, d 'ta'’ MMM y + E, d 'ta'’ - E, d 'ta'’ MMM y + E, d 'ta'’ MMM y - E, d 'ta'’ MMM y + + + d 'ta'’ MMM - d 'ta'’ MMM y + d 'ta'’-d 'ta'’ MMM y + d 'ta'’ MMM y - d 'ta'’ MMM y + + + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + Epoka + + + Sena + + + Xahar + + + Ġimgħa + + + Jum + Lbieraħ + Illum + Għada + + + Jum tal-Ġimgħa + + + Siegħa + + + Minuta + + + Sekonda + + + Żona + + + + + + +HH:mm;-HH:mm + GMT{0} + Ħin ta’ {0} + + Mhux Magħruf + + + Londra + + + Valletta + + + + Ħin Ċentrali Ewropew + Ħin Ċentrali Ewropew tas-Sajf + + true + + + + + + . + , + + + + + ¤#,##0.00 + + + + + + Ewro + + + Lira Maltija + + + Munita Mhux Magħruf jew Mhux Validu + + + + + + iva:i + le:l + + + + diff --git a/lib/zend/Zend/Locale/Data/mt_MT.xml b/lib/zend/Zend/Locale/Data/mt_MT.xml new file mode 100644 index 0000000000..f24b8e35f0 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/mt_MT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/my.xml b/lib/zend/Zend/Locale/Data/my.xml new file mode 100644 index 0000000000..2af96de14a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/my.xml @@ -0,0 +1,1581 @@ + + + + + + + + + + + ၊ + + + အင်္ဂလိပ်စာဟောင်း + အာရေဗီ + အယောင်ဆောင် ဘာသာစကား + ဘာလီ + ဘာဆာ + ဘော်လတစ် ဘာသာစကား + ဘီလာရု + ဘူဂေးရီးယား + ဘင်္ဂါလီ + တိဘက် + ဘော့စ်နီးယား + အလယ်ပိုင်း အမေရိကန် အိန္ဒြိယ ဘာသာစကား + ကောက်ကေးရှပ် ဘာသာစကား + ချေချင်း + ချာရိုကီ + ပေါ်တူဂီ အခြေခံ အနောက်အိန္ဒြိယ ကျွန်းစုသား သို့မဟုတ် ဗန်းစကား + ခရီး + အနောက်အိန္ဒြိယ ကျွန်းစုသား သို့မဟုတ် ဗန်းစကား + ချက် + ဝေလ + ဒိန်းမတ် + ဒါကိုတာ + ဂျာမန် + ဩစတြီးယ ဂျာမန် + ဆွစ် အမြင့် ဂျာမန် + ဒီလာဝဲ + အလယ်ပိုင်း ဒတ်ချ် + ဒွန်ကာ + ရှေးဟောင်း အီဂျစ် + ဂရိ + အင်္ဂလိပ် + ဩစတြေးလျှ အင်္ဂလိပ် + ကနေဒါ အင်္ဂလိပ် + ဗြိတိသျှ အင်္ဂလိပ် + အမေရိကန် အင်္ဂလိပ် + အလယ်ပိုင်း အင်္ဂလိပ် + စပိန် + လက်တင်အမေရိက စပိန် + အက်စ်တိုးနီးရန်း + ပါရှန် + ဖင်နစ်ရှ် + ဖိလစ်ပီနို + ဖီဂျီ + ပြင်သစ် + ကနေဒါ ပြင်သစ် + ဆွစ် ပြင်သစ် + အလယ်ပိုင်းပြင်သစ် + ပြင်သစ်ဟောင်း + မြောက်ပိုင်း ဖရီစီရန် + အရှေ့ပိုင်း ဖရီစီရန် + အနောက်ပိုင်း ဖရီစီရန် + အိုင်းရစ် + ဂျာမန် အခြေခံဘာသာစကား + အလယ်ပိုင်းအမြင့်ဂျာမန် + ရှေးဟောင်း ဂရိ + ဆွစ် ဂျာမန် + ဂူဂျာရသီ + ဟာဝေယံ + ဟီးဘရူး + ဟိန္ဒီ + ခရိုအေရှန် + ဟန်ဂေရီ + အင်ဒိုနီးရှား + စီချွမ် ရီ + အင်ဒို ဥရောပ ဘာသာစကား + အီရန် အခြေခံ ဘာသာစကား + အီတလီ + ဂျပန် + ဂျူဒီယို-ပါရှန် + ဂျူဒီယို-အာရေဗျ + ဂျာဗားနီးစ် + ဂျော်ဂျီယန် + ကချင် + ကရင် + ကွန်ဂို + ခါစီ + ခမာ + ကန်နာဒါ + ကိုးရီးယား + ကဒ် + လက်တင် + လာအို + အလယ်ပိုင်း အိုင်းရစ် + အမျိုးမျိုးသော ဘာသာစကား + မွန်-ခမာ ဘာသာစကား + မလေးရာလမ် + မွန်ဂိုလီးယန်း + မန်ချူး + မနိပူရီ + မနိုဘို ဘာသာစကား + မာရသီ + မလေး + အကြိမ်များစွာ ဘာသာစကားများ + ဗမာ + အနိမ့် ဂျာမန် + နီပေါလ် + ဒတ်ချ် + နော်ဝေး + ပန်ဂျာပီ + ပါပူရန် ဘာသာစကား + ပါရှန် အဟောင်း + ဖိလစ်ပိုင် ဘာသာစကား + ပါဠိ + ပိုလန် + ပေါ်တူဂီ + ဘရာဇီး ပေါ်တူဂီ + ရိုမေနီယား + မူလရင်းမြစ် + ရုရှ + သင်္သကရိုက် + တောင် အမေရိကန် အိန္ဒြိယ ဘာသာစကား + စကော့ + စင်ဒီ + အိုင်းရစ် ဟောင်း + အချက်ပြ ဘာသာစကား + ရှမ်း + ဆင်ဟာလ + တရုတ်-တိဘက် ဘာသာစကား + စလိုဗက် + စလိုဗေးနီးယမ်း + စလိုဗစ် ဘာသာစကား + တောင်ပိုင်း ဆာမိ + ဆာမိ ဘာသာစကား + ဆိုမာလီ + အယ်လ်ဘေးနီးယန်း + ဆားဗီးယန်း + ဆူဒန် + ဆွီဒင် + တမီးလ် + တိုင် ဘာသာစကား + ထိုင်း + တူပီ ဘာသာစကား + ယူကရိန်း + မသိ သို့မဟုတ် မရှိ သော ဘာသာစကား + ဗီယက်နမ် + တရုတ် + ရိုးရှင်းသော တရုတ် + ရှေးရိုးစဉ်လာ တရုတ် + ဇူလူ + ဘာသာစကား နှင့် ပတ်သက် သောအရာမရှိ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ကမ္ဘာ + အာဖရိက + မြောက် အမေရိက + တောင် အမေရိက + သမုဒ္ဒရာဒေသ + အနောက် အာဖရိက + အလယ်ပိုင်း အမေရိက + အရှေ့ပိုင်း အာဖရိက + မြောက်ပိုင်း အာဖရိက + အလယ်ပိုင်း အာဖရိက + တောင်ပိုင်း အာဖရိက + အမေရိကများ + မြောက်ပိုင်း အမေရိက + ကာရီဘီယံ + အရှေ့ပိုင်း အာရှ + တောင်ပိုင်း အာရှ + အ‌ရှေ့တောင်ပိုင်း အာရှ + တောင်ပိုင်း ဥရောပ + ဩစတြေးလျှ နှင့် နယူးဇီလန် + တောင်-အလယ် အာရှ + အာရှ + အလယ် အာရှ + အနောက် အာရှ + ဥရောပ + အရှေ့ပိုင်း ဥရောပ + မြောက်ပိုင်း ဥရောပ + အနောက်ပိုင်း ဥရောပ + လွတ်လပ်သော ပြည်ထောင်စုများ၏ ဓနသဟာယအဖွဲ့ + လက်တင် အမေရိက နှင့် ကာရီဘီယန် + ယူအေအီး + အာဖဂန်နစ္စတန် + အန်ကွီလာ + အာမေနီးယား + အင်ဂိုလာ + အန္တာတိက + အာဂျင်တီးနား + အမေရိကန် စမိုအ + ဩစတြီးယား + ဩစတြေးလျှား + အဇာဘိုင်ဂျန် + ဘော့စနီးယား နှင့် ဟာဇီဂိုဘီးနား + ဘင်္ဂလားဒေ့ရှ် + ဘယ်လ်ဂျီယမ် + ဘူဂေးရီးယား + ဘာရိန်း + ဘာမူဒါ + ဘရူနိုင်း + ဘိုလီးဘီးယား + ဘရာဇီး + ဘဟားမား + ဘူတန် + ဘော့စ်ဝါနာ + ဘီလာရုစ် + ဘေလီဇ် + ကနေဒါ + ကိုကိုး ကျွန်းစု + အလယ်ပိုင်း အာဖရိက ပြည်ထောင်စု + ဆွစ်ဇလန် + အိုင်ဗရီကိုစ့် + ကွတ် ကျွန်းစု + ချီလီ + ကင်မရွန်း + တရုတ် + ကိုလံဘီယာ + ကော့စ်တာရီကာ + ကျူးဘား + ခရစ်စမတ် ကျွန်း + ဆိုက်ပရက်စ် + ချက် ပြည်ထောင်စု + ဂျာမဏီ + ဒိန်းမတ် + ဒိုမီနီကာ + ဒိုမီနီကန် + အယ်လ်ဂျီးရီးယား + အီကွေဒေါ + အက်စတိုးနီးယား + အီဂျစ် + အနောက်ပိုင်း ဆာဟာရ + စပိန် + အီသီယိုးပီးယား + ဖင်လန် + ဖီဂျီ + ဖောက်ကလန် ကျွန်းစု + ဖာရိုး ကျွန်းစုများ + ပြင်သစ် + ယူနိုက်တက်ကင်းဒမ်း + ဂျော်ဂျီယာ + ပြင်သစ် ဂီယာနာ + ဂါနာ + ဂျီဘရော်လ်တာ + ဂရင်းလန်း + ဂန်ဘီရာ + ဂီရာနာ + အီကွေတာ ဂီရာနာ + ဂရိ + တောင် ဂျော်ဂျီယာ နှင့် တောင် ဆင်းဒဝစ်ဂျ် ကျွန်းစုများ + ဂွာတီမာလာ + ဂူအမ် + တရုတ်၏ အထူးအုပ်ချုပ်ခွင့်ရ ဟောင်ကောင် + ဟွန်ဒူးရပ်စ် + ခရိုအေးရှား + ဟေတီ + ဟန်ဂေရီ + အင်ဒိုနီးရှား + အိုင်ယာလန် + အစ္စရေး + အိန္ဒိယ + ဗြိတိသျှ အိန္ဒြိယ သမုဒ္ဒရာ ပိုင်နက် + အီရတ် + အီရန် + အိုက်စလန် + အီတလီ + ဂျာစီ + ဂျမေနီကာ + ဂျော်ဒန် + ဂျပန် + ကင်ညာ + ခယ်ကစ်စတန် + ကမ္ဘောဒီးယား + မြောက်ကိုရီးယား + တောင်ကိုရီးယား + ကူဝိတ် + ကေမန် ကျွန်းစု + ကာဇက်စတန် + လာအို + လက်ဘနွန် + သီရိလင်္ကာ + လိုင်ဘေးရီးယား + လစ်သူယေးနီးယား + လူဇင်ဘတ် + လတ်ဗီးယား + မော်ရိုကို + မိုနကို + မွန်တီနိဂရိုး + စိန့်မာတင် + မဒဂတ်စကာ + မာရှယ် ကျွန်းစု + မာစီဒိုးနီးယား + မာလီ + မြန်မာ + မွန်ဂိုးလီးယား + တရုတ်၏ အထူးအုပ်ချုပ်ခွင့်ရ မကာအို + မော်လဒိုက် + မာလာဝီ + မက္ကဆီကို + မလေးရှား + မိုဇန်ဘစ် + နမ်မီးဘီးယား + နယူး ကယ်လီဒိုနီးယား + နိုင်ဂျာ + နိုင်ဂျီးရီးယား + နီကာရာဂွာ + နယ်သာလန် + နော်ဝေ + နီပေါ + နယူးဇီလန် + အိုမန် + ပနားမား + ပီရူး + ပြင်သစ် ပေါ်လီနေးရှား + ပါပူရာနယူးဂီနီ + ဖိလစ်ပိုင် + ပါကစ္စတန် + ပိုလန် + ပေါ်တူရီကို + ပါလက်စတိုင်း ပိုင်နက် + ပေါ်တူဂီ + ပါရာဂွေး + ကာတာ + ဥရောပသမဂ္ဂ + ရိုမေးနီးယား + ဆားဘီးယား + ရုရှ + ရဝန်ဒါ + ဆော်ဒီအာရေးဗီးယား + ဆော်လမွန်ကျွန်းစု + ဆူဒန် + ဆွီဒင် + စင်္ကာပူ + စလိုဗေးနီးယား + စလိုဗေးကီးယား + ဆီနီဂေါ + ဆိုမာလီယာ + အယ်လ်ဆာဗေးဒိုး + ဆီးရီးယား + ချဒ် + ပြင်သစ် တောင်ပိုင်း ပိုင်နက်များ + ထိုင်း + တာဂျီကစ္စတန် + အရှေ့တီမော + တူနီးရှား + တွန်ဂါ + တူရကီ + ထိုင်ဝမ် + တန်ဇန်နီးယား + ယူကရိန်း + ယူဂန္ဒာ + ယူနိုက်တက်စတိတ် အပြင်ထွက် နေသည့် သေးငယ်သောကျွန်းများ + ယူနိုက်တက်စတိတ် + ဥရုဂွေး + ဥဘက်ကစ္စတန် + ဗာတီကန် + ဗင်နီဇွဲလား + ဗြိတိသျှ ဗာဂျင်း ကျွန်းစု + ယူအက်စ် ဗာဂျင်း ကျွန်းစု + ဗီယက်နမ် + ယီမင် + တောင်အာဖရိက + ဇမ်ဘီယာ + ဇင်ဘာဘွေ + မသိ သို့မဟုတ် မရှိ သော နေရာ + + + ရှေးရိုးစဉ်လာ ဂျာမန် ရေးထုံး + ၁၉၉၆ ဂျာမန် ရေးထုံး + အလယ်ပိုင်းနောက်ကျသောပြင်သစ်မှ ၁၆၀၆ + ၁၆၉၄ACAD + အရှေ့ပိုင်းအာမေးနီးယန်း + ပေါင်းစပ်ထားသော တူရကီ လက်တင်စကားလုံး + IPA အသံထွက် + UPA အသံထွက် + ကွန်ပျူတာ + ပြန်လည်စီစစ်ထားသော ရေးထုံး + စကော့ စံ အင်္ဂလိပ် + + + ပြက္ခဒိန် + စနစ်တကျစီသော + ငွေကြေး + + + ဗုဒ္ဓ ပြက္ခဒိန် + တရုတ် ပြက္ခဒိန် + တိုက်ရိုက်အစဉ် + နိုင်ငံတကာသုံး ပြက္ခဒိန် + ဟီဗရူး ပြက္ခဒိန် + အိန္ဒြိယ အမျိုးသား ပြက္ခဒိန် + အစ္စလာမ် ပြက္ခဒိန် + ဂျပန် ပြက္ခဒိန် + ဖုန်းစာအုပ် အစီအစဉ် + + + အမေရိကန်စနစ် + မက်ထရစ်စနစ် + + + ဘာသာစကား - {0} + စာ - {0} + နယ်ပယ်ဒေသ - {0} + + + + [က-အ ဣ-ဧ ဩ ဪ] + [\u1036-း ျ-\u103E ာ ါ \u102D-\u1032 \u1039 \u103A] + [a-z] + + + “ + ” + ‘ + ’ + + + + + + + + ဇန် + ဖေ + မတ် + ဧ + မေ + ဇွန် + ဇူ + ဩ + စက် + အောက် + နို + ဒီ + + + ဇန်နဝါရီ + ဖေဖော်ဝါရီ + မတ် + ဧပြီ + မေ + ဇွန် + ဇူလိုင် + ဩဂုတ် + စက်တင်ဘာ + အောက်တိုဘာ + နိုဝင်ဘာ + ဒီဇင်ဘာ + + + + + ဇ + ဖ + မ + ဧ + မ + ဇ + ဇ + ဩ + စ + အ + န + ဒ + + + + + + + နွေ + လာ + ဂါ + ဟူး + တေး + ကြာ + နေ + + + တနင်္ဂနွေ + တနင်္လာ + အင်္ဂါ + ဗုဒ္ဓဟူး + ကြာသပတေး + သောကြာ + စနေ + + + + + တ + တ + အ + ဗ + က + သ + စ + + + + + + + ပ-စိတ် + ဒု-စိတ် + တ-စိတ် + စ-စိတ် + + + ပထမ သုံးလပတ် + ဒုတိယ သုံးလပတ် + တတိယ သုံးလပတ် + စတုတ္ထ သုံးလပတ် + + + + + ပ-စိတ် + ဒု-စိတ် + တ-စိတ် + စ-စိတ် + + + ပ + ဒု + တ + စ + + + ပထမ သုံးလပတ် + ဒုတိယ သုံးလပတ် + တတိယ သုံးလပတ် + စတုတ္ထ သုံးလပတ် + + + + နံနက် + ညနေ + + + ခရစ်တော် မပေါ်မီကာလ + ခရစ်တော် ပေါ်ထွန်းပြီးကာလ + + + ဘီစီ + အေဒီ + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + H:mm + L + E, M-d + LLL + E MMM d + E MMMM d + MMMM d + MMM d + M-d + d + mm:ss + y + yyyy-M + EEE, yyyy-M-d + y MMM + EEE, y MMM d + y MMMM + yyyy Q + y QQQ + Q yy + + + {0} – {1} + + M-M + + + EEEE၊ d/M – EEEE၊ d/M + EEEE၊ d/M – EEEE၊ d/M + + + MMM d၊ EEEE – MMM d၊ EEEE + MMM d၊ EEEE – MMM d၊ EEEE + + + d/M – d/M + d/M – d/M + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + EEEE၊ d/M/yy – EEEE၊ d/M/yy + EEEE၊ d/M/yy – EEEE၊ d/M/yy + EEEE၊ d-M-yyyy – EEEE၊ d-M-yyyy + + + y၊ MMM d၊ EEEE – MMM d၊ EEEE + y၊ MMM d၊ EEEE – MMM d၊ EEEE + y၊ MMM d၊ EEEE – y၊ MMM d၊ EEEE + + + y၊ MMM d – MMM d + y MMM d – y MMM d + + + d/M/yy – d/M/yy + d/M/yy – d/M/yy + d/M/yy – d/M/yy + + + + + + ခေတ် + + + နှစ် + + + လ + + + ပတ် + + + ရက် + တနေ့က + မနေ့က + ယနေ့ + မနက်ဖြန် + သဘက်ခါ + + + နေ့ + + + နံနက်/ညနေ + + + နာရီ + + + မိနစ် + + + စက္ကန့် + + + ဇုန် + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} အချိန် + + မသိသော + + + ရီယို ဗြန်ကို + + + ကိမ်ပို ဂရန်ဒ + + + ဆာပိုလို + + + ဟိုနိုလူလူ + + + အန်ကာရေ့ဂျ် + + + လော့စ်အိန်ဂျယ်လိစ် + + + ဖီးနစ် + + + ဒင်ဗာ + + + ချီကာကို + + + အင်ဒီယားနားပိုလစ် + + + နယူးယောက် + + + + အာဖဂန်နစ္စတန် အချိန် + + + + + အလယ်ပိုင်း အာဖရိက အချိန် + + + + + အရှေ့ပိုင်း အာဖရိက အချိန် + + + + + တောင်အာဖရိက အချိန် + တောင်အာဖရိက စံတော်ချိန် + + + + + အနောက်ပိုင်း အာဖရိက အချိန် + အနောက်ပိုင်း အာဖရိက နွေရာသီ အချိန် + + + + + အလယ်ပိုင်း အမေရိက အချိန် + အလယ်ပိုင်း အမေရိက စံတော်ချိန် + အလယ်ပိုင်း အမေရိက နွေရာသီ အချိန် + + + + + အရှေ့ပိုင်း အမေရိက အချိန် + အရှေ့ပိုင်း အမေရိက စံတော်ချိန် + အရှေ့ပိုင်း အမေရိက အချိန် + + + + + အမေရိက တောင် အချိန် + အမေရိက တောင် စံတော်ချိန် + အမေရိက တောင် နေ့ပိုင်း အချိန် + + + + + ပစိဖိတ် အချိန် + ပစိဖိတ် စံတော်ချိန် + ပစိဖိတ် နေ့ပိုင်း အချိန် + + + + + အာရေဗျ အချိန် + အာရေဗျ စံတော်ချိန် + အာရေဗျ နေ့ပိုင်း အချိန် + + + + + အာဂျင်တီးနား အချိန် + အာဂျင်တီးနား နွေရာသီ အချိန် + + + + + အနောက် အာဂျင်တီးနား အချိန် + + + + + အာမေနီးယား အချိန် + အာမေနီးယား နွေရာသီ အချိန် + + + + + အတ္ထလန်တစ် အချိန် + အတ္ထလန်တစ် စံတော်ချိန် + အတ္ထလန်တစ် နေ့ပိုင်း အချိန် + + + + + အလယ်ဩစတြေးလျှား အချိန် + အလယ်ပိုင်း ဩစတြေးလျှား စံတော်ချိန် + အလယ်ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန် + + + + + အလယ်အနောက်ပိုင်း ဩစတြေးလျှား အချိန် + အလယ်အနောက်ပိုင်း ဩစတြေးလျှား စံတော်ချိန် + အလယ်အနောက်ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန် + + + + + အရှေ့ဩစတြေးလျှား အချိန် + အရှေ့ပိုင်း ဩစတြေးလျှား စံတော်ချိန် + အရှေ့ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန် + + + + + အနောက် ဩစတြေးလျှား အချိန် + အနောက်ပိုင်း ဩစတြေးလျှား စံတော်ချိန် + အနောက်ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန် + + + + + အဇာဘိုင်ဂျန် အချိန် + အဇာဘိုင်ဂျန် နွေရာသီ အချိန် + + + + + ဘင်္ဂလားဒေ့ရှ် အချိန် + + + + + ဘူတန် အချိန် + + + + + ဘိုလီးဘီးယား အချိန် + + + + + ဘရာဇီး အချိန် + ဘရာဇီး နွေရာသီ အချိန် + + + + + ဗြိတိသျှ အချိန် + ဗြိတိသျှ နွေရာသီ အချိန် + + + + + ဘရူနိုင်း စံတော်ချိန် + + + + + ချီလီ အချိန် + ချီလီ နွေရာသီ အချိန် + + + + + တရုတ် အချိန် + တရုတ် စံတော်ချိန် + တရုတ် နေ့ပိုင်း အချိန် + + + + + ကိုလံဘီယာ အချိန် + ကိုလံဘီယာ နွေရာသီ အချိန် + + + + + ကျူးဘား အချိန် + ကျူးဘား စံတော်ချိန် + ကျူးဘား နွေရာသီ အချိန် + + + + + ဒတ်ချ် ဂီယာနာ အချိန် + + + + + အရှေ့တီမော အချိန် + + + + + အီကွေဒေါ အချိန် + + + + + ပြင်သစ် အချိန် + ဥရောပ အလယ်ပိုင်း အချိန် + ဥရောပ အလယ်ပိုင်း နွေရာသီ အချိန် + + + + + ရိုမေးနီးယား အချိန် + အရှေ့ဥရောပ အချိန် + အရှေ့ဥရောပ နွေရာသီ အချိန် + + + + + အနောက်ပိုင်း ဥရောပ အချိန် + အနောက်ပိုင်း ဥရောပ နွေရာသီ အချိန် + + + + + ဖောင်ကလန်ကျွန်းစု အချိန် + ဖောင်ကလန်ကျွန်းစု နွေရာသီ အချိန် + + + + + ပြင်သစ် ဂီယာနာ အချိန် + + + + + ဂရင်းနစ် စံတော်ချိန် + + + + + ဂျော်ဂျီယာ အချိန် + ဂျော်ဂျီယာ နွေရာသီ အချိန် + + + + + အလယ်ဂရင်းလန်း အချိန် + အလယ်ဂရင်းလန်း နွေရာသီ အချိန် + + + + + အရှေ့ဂရင်းလန်း အချိန် + အရှေ့ဂရင်းလန်း နွေရာသီ အချိန် + + + + + အနောက် ဂရင်းလန်း အချိန် + အနောက် ဂရင်းလန်း နွေရာသီ အချိန် + + + + + ပင်လယ်ဂွေ့ အချိန် + ပင်လယ်ဂွေ့ စံတော်ချိန် + + + + + ဟောင်ကောင် အချိန် + ဟောင်ကောင် နွေရာသီ အချိန် + + + + + အိန္ဒြိယ စံတော်ချိန် + + + + + အိန္ဒြိယ သမုဒ္ဒရာ အချိန် + + + + + အင်ဒိုချိုင်းနား အချိန် + + + + + အလယ်ပိုင်း အင်ဒိုနီးရှား အချိန် + + + + + အရှေ့ပိုင်း အင်ဒိုနီးရှား အချိန် + + + + + အနောက်ပိုင်း အင်ဒိုနီးရှား အချိန် + + + + + အီရန် စံတော်ချိန် + အီရန် နေ့ပိုင်း အချိန် + + + + + အိုင်ယာလန် အချိန် + + + + + အစ္စရေး အချိန် + အစ္စရေး စံတော်ချိန် + အစ္စရေး နေ့ပိုင်း အချိန် + + + IST (အစ္စရေး) + + + + + ဂျပန် အချိန် + ဂျပန် စံတော်ချိန် + ဂျပန် နေ့ပိုင်း အချိန် + + + + + အရှေ့ကာဇက်စတန် အချိန် + အရှေ့ကာဇက်စတန် စံတော်ချိန် + + + + + ကိုးရီးယား အချိန် + ကိုးရီးယား စံတော်ချိန် + ကိုးရီးယား နေ့ပိုင်း အချိန် + + + + + သီရိလင်္ကာ အချိန် + + + + + မကာအို အချိန် + မကာအို နွေရာသီ အချိန် + + + + + မလေးရှား အချိန် + + + + + မော်စကို အချိန် + မော်စကို စံတော်ချိန် + မော်စကို နွေရာသီ အချိန် + + + + + မြန်မာ အချိန် + + true + + + + နီပေါ အချိန် + + + + + နယူးဇီလန် အချိန် + နယူးဇီလန် စံတော်ချိန် + နယူးဇီလန် နေ့ပိုင်း အချိန် + + + + + နယူးဖောင်လန် အချိန် + နယူးဖောင်လန် စံတော်ချိန် + နယူးဖောင်လန် နေ့ပိုင်း အချိန် + + + + + ပါကစ္စတန် အချိန် + ပါကစ္စတန် နွေရာသီ အချိန် + + + + + ပါပူရာနယူးဂီနီ အချိန် + + + + + ပါရာဂွေး အချိန် + ပါရာဂွေး နွေရာသီ အချိန် + + + + + ပီရူး အချိန် + ပီရူး နွေရာသီ အချိန် + + + + + ဖိလစ်ပိုင် အချိန် + ဖိလစ်ပိုင် နွေရာသီ အချိန် + + + + + စင်္ကာပူ စံတော်ချိန် + + + + + တောင်ဂျော်ဂျီယာ အချိန် + + + + + တူရကီ စံတော်ချိန် အချိန် + တူရကီ နွေရာသီ အချိန် + + + + + ဥရုဂွေး အချိန် + ဥရုဂွေး နွေရာသီ အချိန် + + + + + ဥဘက်ကစ္စတန် အချိန် + ဥဘက်ကစ္စတန် နွေရာသီ အချိန် + + + + + ဗင်နီဇွဲလား အချိန် + + + + + + mymr + + . + , + ၊ + ၀ + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + + + + နယ်သာလန် အန်တီလန် ဂင်းဒါး + + + အာဂျင်တီးနား ပီဆို (၁၉၈၃-၁၉၈၅) + + + အာဂျင်တီးနား ပီဆို + + + ဩစတြေးလျှား ဒေါ်လာ + + + အရူဘန် ဂင်းဒါး + + + ဘင်္ဂလားဒေ့ရှ် တာကာ + + + ဘယ်လ်ဂျီယမ် ဖရန့် + + + ဘူရွန်ဒီ ဖရန့် + + + ဘာမူဒါ ဒေါ်လာ + + + ဘရူနိုင်း ဒေါ်လာ + + + ဘိုလီးဘီးယား ပီဆို + + + ဘရာဇီး ရီးယဲ + + + ဘဟားမား ဒေါ်လာ + + + ဗမာ ကျပ် + + + ဘော့စ်ဝါနာ ပုလ + + + ဘီလာရုစ် ရူဘယ်အသစ် (၁၉၉၄-၁၉၉၉) + + + ဘီလာရုစ် ရူဘယ် + + + ဘေလီဇ် ဒေါ်လာ + + + ကနေဒါ ဒေါ်လာ + + + ဆွစ် ဖရန့် + + + ချီလီ ပီဆို + + + တရုတ် ယွမ် + + + ကိုလံဘီယာ ပီဆို + + + ကျူးဘား ပီဆို + + + ဆိုက်ပရက်စ် ပေါင် + + + ဂျာမဏီ မတ် + + + ဒိန်းမတ် ခရိုဏာ + + + ဒိုမီနီကန် ပီဆို + + + အီဂျစ် ပေါင် + + + စပိန် ပယ်စေးတာ + + + ယူရို + + + ဖီဂျီ ဒေါ်လာ + + + ဖောက်ကလန် ကျွန်းစု ပေါင် + + + ပြင်သစ် ဖရန့် + + + ဗြိတိသျှ ပေါင် + + + ဂျီဘရော်လ်တာ ပေါင် + + + ဂီရာနာ ဖရန့် + + + ဟောင်ကောင် ဒေါ်လာ + + + အင်ဒိုနီးရှား ရူပီးယား + + + အစ္စရေး ပေါင် + + + အိန္ဒြိယ ရူပီး + + + ဂျမေနီကာ ဒေါ်လာ + + + ဂျပန်ယန်း + + + ကမ္ဘောဒီးယား ရီးယဲ + + + မြောက်ကိုးရီးယား ဝမ် + + + တောင်ကိုးရီးယား ဝမ် + + + ကေမန် ကျွန်းစု ဒေါ်လာ + + + လက်ဘနွန် ပေါင် + + + သီရိလင်္ကာ ရူပီး + + + လိုင်ဘေးရီးယား ဒေါ်လာ + + + မြန်မာ ကျပ် + K + + + မက္ကဆီကို ပီဆို + + + မလေးရှား ရင်းဂစ် + + + နမ်မီးဘီးယား ဒေါ်လာ + + + နော်ဝေ ခရိုဏာ + + + နီပေါ ရူပီး + + + နယူးဇီလန် ဒေါ်လာ + + + ဖိလစ်ပိုင် ပီဆို + + + ပါကစ္စတန် ရူပီး + + + ပိုလန် ဇ‌လော့တီ + + + ရုရှ ရူဘယ် + + + ရုရှ ရူဘယ် (၁၉၉၁-၁၉၉၈) + + + ရဝန်ဒါ ဖရန့် + + + ဆော်လမွန်ကျွန်းစု ဒေါ်လာ + + + ဆူဒန် ပေါင် + + + ဆူဒန် ပေါင်အဟောင်း + + + ဆွီဒင် ခရိုဏာ + + + စင်္ကာပူ ဒေါ်လာ + + + ဆူရိနမ် ဒေါ်လာ + + + ဆိုဗီယက် ရူဗယ် + + + ထိုင်းဘတ် + + + ရှေးဟောင်းတူရကီ လိုင်ရာ + + + တူရကီ လိုင်ရာ + + + ထိုင်ဝမ် ဒေါ်လာအသစ် + + + အမေရိကန် ဒေါ်လာ + + + အမေရိကန် ဒေါ်လာ (နောက်နေ့) + + + အမေရိကန် ဒေါ်လာ (တနေ့တည်း) + + + ဗီယက်နမ် ဒေါင် + + + ငွေ + + + ရွှေ + + + ဥရောပငွေကြေးစံနစ် + + + အထူးထုတ်ယူခွင့် + + + CFA ဖရန့် BCEAO + + + ပလက်တီနမ် + + + စမ်းသပ် ငွေကြေး ကုဒ် + + + မသိ သို့မဟုတ် မရှိသော ငွေကြေး + + + ဇင်ဘာဘွေ ဒေါ်လာ + + + + + + {0} ရက် + + + {0} နာရီ + + + {0} မိနစ် + + + {0} လ + + + {0} စက္ကန့် + + + {0} ပတ် + + + {0} နှစ် + + + + + ဟုတ်တယ် + မဟုတ်ဘူး + + + + diff --git a/lib/zend/Zend/Locale/Data/my_MM.xml b/lib/zend/Zend/Locale/Data/my_MM.xml new file mode 100644 index 0000000000..c1d863d6e0 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/my_MM.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/nb.xml b/lib/zend/Zend/Locale/Data/nb.xml new file mode 100644 index 0000000000..5a2d7640a4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nb.xml @@ -0,0 +1,3082 @@ + + + + + + + + + nn da sv en + + + {0} ({1}) + , + + + afar + abkhasisk + achinesisk + acoli + adangme + adyghe + avestisk + afrikaans + afroasiatisk språk + afrihili + ainu + akan + akkadisk + aleutisk + algonkinsk språk + søraltaisk + amharisk + aragonsk + gammelengelsk + angika + apachespråk + arabisk + arameisk + araukansk + arapaho + kunstig språk + arawak + assamisk + asturisk + athapaskansk språk + australsk språk + avarisk + awadhi + aymara + aserbajdsjansk + basjkirsk + banda + bamilekisk språk + baluchi + balinesisk + basa + baltisk språk + hviterussisk + beja + bemba + berbisk + bulgarsk + bihari + bhojpuri + bislama + bikol + bini + siksika + bambara + bengali + bantu + tibetansk + bretonsk + braj + bosnisk + batak + buriat + buginesisk + blin + katalansk + caddo + sentralamerikansk indiansk språk + karibisk + kaukasisk språk + atsam + tsjetsjensk + cebuansk + keltisk språk + chamorro + chibcha + chagatai + chuukesisk + mari + chinook + choctaw + chipewiansk + cherokee + cheyenne + kamisk språk + korsikansk + koptisk + engelskbasert kreol- eller pidginspråk + franskbasert kreol- eller pidginspråk + portugisiskbasert kreol- eller pidginspråk + cree + krimtatarisk + kreol- eller pidginspråk + tsjekkisk + kasjubisk + kirkeslavisk + kusjitisk språk + tsjuvansk + walisisk + dansk + dakota + dargwa + dayak + tysk + østerriksk tysk + sveitsisk høytysk + delaware + slavisk + dogrib + dinka + dogri + dravidisk språk + lavsorbisk + duala + mellomnederlandsk + divehi + dyula + dzongkha + ewe + efik + gammelegyptisk + ekajuk + gresk + elamittisk + engelsk + australsk engelsk + canadisk engelsk + britisk engelsk + amerikansk engelsk + mellomengelsk + esperanto + spansk + latinamerikansk spansk + iberisk spansk + estisk + baskisk + ewondo + persisk + fang + fanti + fulani + finsk + filippinsk + finsk-ugrisk språk + fijiansk + færøysk + fon + fransk + canadisk fransk + sveitsisk fransk + mellomfransk + gammelfransk + nordfrisisk + østfrisisk + friuliansk + vestfrisisk + irsk + ga + gayo + gbaya + skotsk gælisk + germansk språk + ges + kiribatisk + galisisk + mellomhøytysk + guarani + gammelhøytysk + gondi + gorontalo + gotisk + grebo + gammelgresk + sveitsertysk + gujarati + manx + gwichin + hausa + haida + hawaiisk + hebraisk + hindi + hiligaynon + himachali + hettittisk + hmong + hiri motu + kroatisk + høysorbisk + haitisk + ungarsk + hupa + armensk + herero + interlingua + iban + indonesisk + interlingue + ibo + sichuan-yi + ijo + inupiak + iloko + indisk språk + indoeuropeisk språk + ingusjisk + ido + iransk + irokansk språk + islandsk + italiensk + inuktitut + japansk + lojban + jødepersisk + jødearabisk + javanesisk + georgisk + karakalpakisk + kabylsk + kachin + jju + kamba + karensk + kawi + kabardisk + tyap + koro + kikongo + khasi + khoisanspråk + khotanesisk + kikuyu + kuanyama + kasakhisk + grønlandsk + khmer + kimbundu + kannada + koreansk + konkani + kosraeansk + kpelle + kanuri + karachay-balkar + karelsk + kru + kurukh + kasjmiri + kurdisk + kumyk + kutenai + komi + kornisk + kirgisisk + latin + ladinsk + lahnda + lamba + luxemburgsk + lezghian + ganda + limburgisk + lingala + laotisk + mongo + lozi + litauisk + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + latvisk + maduresisk + magahi + maithili + makasar + mandingo + austronesisk + masai + moksha + mandar + mende + madagassisk + mellomirsk + marshallesisk + maori + micmac + minangkabau + annet språk + makedonsk + mon-khmerspråk + malayalam + mongolsk + mandsju + manipuri + manobospråk + moldavisk + mohawk + mossi + marathi + malayisk + maltesisk + flere språk + mundaspråk + creek + mirandesisk + marwari + burmesisk + mayaspråk + erzya + nauru + nahuatl + nordamerikansk indiansk språk + napolitansk + norsk bokmål + nord-ndebele + lavtysk + nepalsk + newari + ndonga + nias + niger-kordofiansk språk + niueansk + nederlandsk + flamsk + norsk nynorsk + norsk + nogai + gammelnorsk + nkå + sør-ndebele + nord-sotho + nubisk språk + navajo + klassisk newari + nyanja + nyamwezi + nyankole + nyoro + nzima + oksitansk + ojibwa + oromo + oriya + ossetisk + osage + ottomansk tyrkisk + otomisk språk + panjabi + papuisk språk + pangasinan + pahlavi + pampanga + papiamento + palauisk + gammelpersisk + filippinsk språk + fønikisk + pali + polsk + ponapisk + prakritspråk + gammelprovençalsk + pashto + portugisisk + brasiliansk portugisisk + iberisk portugisisk + quechua + rajasthani + rapanui + rarotongansk + retoromansk + rundi + rumensk + romansk språk + romani + rot + russisk + aromansk + kinjarwanda + sanskrit + sandawe + jakutsk + søramerikansk indiansk språk + salishansk språk + samaritansk arameisk + sasak + santali + sardinsk + siciliansk + skotsk + sindhi + nordsamisk + selkupisk + semittisk språk + sango + gammelirsk + tegnspråk + serbokroatisk + shan + singalesisk + sidamo + siouxspråk + sino-tibetansk språk + slovakisk + slovensk + slavisk språk + samoansk + sørsamisk + samisk språk + lulesamisk + enaresamisk + skoltesamisk + shona + soninke + somali + sogdisk + songhai + albansk + serbisk + sranan tongo + serer + swati + nilo-saharaspråk + sør-sotho + sundanesisk + sukuma + susu + sumerisk + svensk + swahili + klassisk syrisk + syrisk + tamil + taispråk + telugu + temne + tereno + tetum + tadsjikisk + thai + tigrinja + tigré + tiv + turkmensk + tokelau + tagalog + klingon + tlingit + tamasjek + setswana + tongansk + nyasa-tongansk + tok pisin + tyrkisk + tsonga + tsimshian + tatarisk + tumbuka + tupispråk + altaisk språk + tuvalu + twi + tahitisk + tuvinisk + udmurt + uigurisk + ugaritisk + ukrainsk + umbundu + ukjent eller ugyldig språk + urdu + usbekisk + vai + venda + vietnamesisk + volapyk + votisk + vallonsk + wakasjansk språk + walamo + waray + washo + sorbisk språk + wolof + kalmyk + xhosa + yao + yapesisk + jiddisk + joruba + jupisk språk + zhuang + zapotec + blissymboler + zenaga + kinesisk + forenklet kinesisk + tradisjonell kinesisk + zande + zulu + zuni + uten språklig innhold + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + verden + Afrika + Nord-Amerika + Sør-Amerika + Oseania + Vest-Afrika + Sentral-Amerika + Øst-Afrika + Nord-Afrika + Sentral-Afrika + Sørlige Afrika + Amerika + Nordlige Amerika + Karibia + Øst-Asia + Sør-Asia + Sørøst-Asia + Sør-Europa + Australia og New Zealand + Melanesia + Mikronesia + Polynesia + Sørsentral-Asia + Asia + Sentral-Asia + Vest-Asia + Europa + Øst-Europa + Nord-Europa + Vest-Europa + Samveldet av uavhengige stater + Latin-Amerika og Karibia + Andorra + De forente arabiske emirater + Afghanistan + Antigua og Barbuda + Anguilla + Albania + Armenia + De nederlandske antiller + Angola + Antarktis + Argentina + Amerikansk Samoa + Østerrike + Australia + Aruba + Åland + Aserbajdsjan + Bosnia-Hercegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei Darussalam + Bolivia + Brasil + Bahamas + Bhutan + Bouvetøya + Botswana + Hviterussland + Belize + Canada + Kokosøyene + Kongo-Kinshasa + Den sentralafrikanske republikk + Kongo-Brazzaville + Sveits + Elfenbenskysten + Cookøyene + Chile + Kamerun + Kina + Colombia + Costa Rica + Serbia og Montenegro + Cuba + Kapp Verde + Christmasøya + Kypros + Tsjekkia + Tyskland + Djibouti + Danmark + Dominica + Den dominikanske republikk + Algerie + Ecuador + Estland + Egypt + Vest-Sahara + Eritrea + Spania + Etiopia + Finland + Fiji + Falklandsøyene + Mikronesiaføderasjonen + Færøyene + Frankrike + Gabon + Storbritannia + Grenada + Georgia + Fransk Guyana + Guernsey + Ghana + Gibraltar + Grønland + Gambia + Guinea + Guadeloupe + Ekvatorial-Guinea + Hellas + Sør-Georgia og de sørlige Sandwich-øyene + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong S.A.R. Kina + Heardøya og McDonaldøyene + Honduras + Kroatia + Haiti + Ungarn + Indonesia + Irland + Israel + Man + India + Britiske territorier i Indiahavet + Irak + Iran + Island + Italia + Jersey + Jamaica + Jordan + Japan + Kenya + Kirgisistan + Kambodsja + Kiribati + Komorene + St. Kitts og Nevis + Nord-Korea + Sør-Korea + Kuwait + Caymanøyene + Kasakhstan + Laos + Libanon + St. Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litauen + Luxembourg + Latvia + Libya + Marokko + Monaco + Moldova + Montenegro + Saint Martin + Madagaskar + Marshalløyene + Makedonia + Mali + Myanmar + Mongolia + Macao S.A.R. Kina + Nord-Marianene + Martinique + Mauritania + Montserrat + Malta + Mauritius + Maldivene + Malawi + Mexico + Malaysia + Mosambik + Namibia + Ny-Caledonia + Niger + Norfolkøya + Nigeria + Nicaragua + Nederland + Norge + Nepal + Nauru + Niue + New Zealand + Oman + Panama + Peru + Fransk Polynesia + Papua Ny-Guinea + Filippinene + Pakistan + Polen + St. Pierre og Miquelon + Pitcairn + Puerto Rico + Palestinsk territorium + Portugal + Palau + Paraguay + Qatar + avsidesliggende Oceania + Den europeiske union + Reunion + Romania + Serbia + Russland + Rwanda + Saudi-Arabia + Salomonøyene + Seychellene + Sudan + Sverige + Singapore + St. Helena + Slovenia + Svalbard og Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Surinam + São Tomé og Príncipe + El Salvador + Syria + Swaziland + Turks- og Caicosøyene + Tsjad + De franske sørterritorier + Togo + Thailand + Tadsjikistan + Tokelau + Øst-Timor + Turkmenistan + Tunisia + Tonga + Tyrkia + Trinidad og Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + USAs ytre småøyer + USA + Uruguay + Usbekistan + Vatikanstaten + St. Vincent og Grenadinene + Venezuela + De britiske jomfruøyene + De amerikanske jomfruøyene + Vietnam + Vanuatu + Wallis og Futuna + Samoa + Jemen + Mayotte + Sør-Afrika + Zambia + Zimbabwe + ukjent eller ugyldig område + + + tradisjonell tysk ortografi + standardisert resisk ortografi + tysk ortografi fra 1996 + nyere mellomfransk til 1606 + eldre nyfransk + øst-armensk + vest-armensk + san giorgio- og biladialekt + boontling + det internasjonale fonetiske alfabet (IPA) + det uraliske fonetiske alfabet (UPA) + monotonisk rettskriving + natisonedialekt + gniva- og njivadialekt + oseacco- og osojanedialekt + polytonisk rettskriving + dataspråk + revidert rettskriving + resisk dialekt + saaho dialekt + skotsk standard engelsk + scouse dialekt + stolvizza- og solbicadialekt + valensisk dialekt + + + kalender + kollasjon + valuta + + + tradisjonell kinesisk sortering - Big 5 + buddhistisk kalender + kinesisk kalender + direkte sortering + forenklet kinesisk sortering - GB2312 + gregoriansk kalender + hebraisk kalender + indisk nasjonalkalender + islamsk kalender + islamsk sivil kalender + japansk kalender + telefonkatalogsortering + pinyinsortering + kalender for Republikken Kina + streksortering + tradisjonell sortering + + + amerikansk + metrisk + + + Språk: {0} + Skrift: {0} + Område: {0} + + + + lowercase-words + titlecase-firstword + titlecase-firstword + titlecase-firstword + lowercase-words + titlecase-firstword + lowercase-words + titlecase-firstword + lowercase-words + lowercase-words + + + [a à b-e é f-o ó ò ô p-z æ ø å] + [á ǎ ã č ç đ è ê í ń ñ ŋ š ŧ ü ž ä ö] + [a-z] + + + “ + ” + ‘ + ’ + + + {0}–{1} + + + + + + EEEE d. MMMM y G + + + + + d. MMMM y G + + + + + d. MMM y G + + + + + d.M yyyy + + + + + + + + + jan. + feb. + mars + apr. + mai + juni + juli + aug. + sep. + okt. + nov. + des. + + + januar + februar + mars + april + mai + juni + juli + august + september + oktober + november + desember + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + søn. + man. + tir. + ons. + tor. + fre. + lør. + + + søndag + mandag + tirsdag + onsdag + torsdag + fredag + lørdag + + + + + S + M + T + O + T + F + L + + + + + + + K1 + K2 + K3 + K4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + f.Kr. + e.Kr. + + + f.Kr. + e.Kr. + + + + + + EEEE d. MMMM y + + + + + d. MMMM y + + + + + d. MMM y + + + + + dd.MM.yy + + + + + + + 'kl'. HH.mm.ss zzzz + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + EEE d + HH.mm.ss + HH.mm + L + E d.M + LLL + E d. MMM + E d. MMMM + d. MMMM + d. MMM + dd.MM + d.M. + d. + h.mm a + h.mm.ss a + mm.ss + y + M yyyy + EEE d.M.yyyy + MMM y + EEE d. MMM y + MMMM y + Q yyyy + QQQ y + MM.yy + MMM yy + Q yy + QQQQ yy + MMMM y + + + {0}–{1} + + M.–M. + + + E dd.MM.–E dd.MM. + E dd.MM.–E dd.MM. + + + MMM–MMM + + + E d. MMM–E d. MMM + E d.–E d. MMM + + + LLLL–LLLL + + + d. MMM–d. MMM + d.–d. MMM + + + dd.MM.–dd.MM. + dd.MM.–dd.MM. + + + d.–d. + + + HH–HH + HH–HH + + + HH.mm–HH.mm + HH.mm–HH.mm + HH.mm–HH.mm + + + HH.mm–HH.mm v + HH.mm–HH.mm v + HH.mm–HH.mm v + + + HH–HH v + HH–HH v + + + y–y + + + MM.yy–MM.yy + MM.yy–MM.yy + + + E dd.MM.yy–E dd.MM.yy + E dd.MM.yy–E dd.MM.yy + E dd.MM.yy–E dd.MM.yy + + + MMM–MMM y + MMM y–MMM y + + + E d. MMM–E d. MMM y + E d.–E d. MMM y + E d. MMM y–E d. MMM y + + + MM–MM yyyy + MM yyyy–MM yyyy + + + d. MMM–d. MMM y + d.–d. MMM y + d. MMM y–d. MMM y + + + dd.MM.yy–dd.MM.yy + dd.MM.yy–dd.MM.yy + dd.MM.yy–dd.MM.yy + + + + + + tidsalder + + + år + + + måned + + + uke + + + dag + for tre dager siden + i forgårs + i går + i dag + i morgen + i overmorgen + om tre dager + + + ukedag + + + AM/PM + + + time + + + minutt + + + sekund + + + sone + + + + + + +HH.mm;-HH.mm + GMT{0} + {0} + {1} ({0}) + + Ukjent + + + Tirana + + + Jerevan + + + Curaçao + + + Sydpolen + + + Dumont D'Urville + + + Wien + + + Brussel + + + Porto Novo + + + Cuiabá + + + Belém + + + Araguaína + + + São Paulo + + + Maceió + + + Thimpu + + + Kokosøyene + + + Zürich + + + Påskeøya + + + Bogotá + + + Kapp Verde + + + Christmasøya + + + København + + + Alger + + + Galápagos + + + Kairo + + + El Aaiún + + + Asmara + + + Kanariøyene + + + Addis Abeba + + + Pohnpei + + + Færøyene + + + Godthåb + + + Athen + + + Sør-Georgia + + + Jajapura + + + Bagdad + + + Teheran + + + Roma + + + Bisjkek + + + Komorene + + + St. Kitts + + + Caymanøyene + + + St. Lucia + + + Luxemburg + + + Ulan Bator + + + Maldivene + + + Mexico by + + + Warszawa + + + Azorene + + + Lisboa + + + Asunción + + + Réunion + + + Bucuresti + + + Moskva + + + Jekaterinburg + + + Krasnojarsk + + + Jakutsk + + + St. Helena + + + São Tomé + + + Salvador + + + Damaskus + + + Dusjanbe + + + Asjkhabad + + + Dar-es-Salaam + + + Uzjhorod + + + Zaporozje + + + Alaska + + + Center, Nord-Dakota + + + Tasjkent + + + St. Vincent + + + St. Thomas + + + + Acre-tid + Acre sommertid + + + + + sentralafrikansk tid + + + + + østafrikansk tid + + + + + sørafrikansk normaltid + + + + + vestafrikansk tid + vestafrikansk sommertid + + + + + Amazonas-tid + Amazonas sommertid + + + + + normaltid + + + CT + CDT + + + + + EDT + + + + + MST + + + + + PST + PDT + + + + + arabisk tid + arabisk standardtid + arabisk sommertid + + + AT (arabisk) + AST (arabisk) + ADT (arabisk) + + + + + AT + AST + ADT + + + + + sentralaustralsk tid + sentralaustralsk standardtid + sentralaustralsk sommertid + + + ACT + + + + + vest-sentralaustralsk tid + vest-sentralaustralsk standardtid + vest-sentralaustralsk sommertid + + + + + østaustralsk tid + østaustralsk standardtid + østaustralsk sommertid + + + AET + + + + + vestaustralsk tid + vestaustralsk standardtid + vestaustralsk sommertid + + + AWT + + + + + Brasilia-tid + Brasilia sommertid + + + + + kinesisk standardtid + + + CST (Kina) + + + + + sentraleuropeisk normaltid + sentraleuropeisk sommertid + + + CET + CEST + + + + + østeuropeisk normaltid + østeuropeisk sommertid + + + EET + EEST + + + + + vesteuropeisk tid + vesteuropeisk sommertid + + + WET + WEST + + + + + Greenwich middeltid + + + GMT + + + + + Hong Kong-tid + Hong Kong-sommertid + + + + + indisk standardtid + + + + + indokinesisk tid + + + + + sentralindonesisk tid + + + + + østindonesisk tid + + + + + vestindonesisk tid + + + + + israelsk standardtid + israelsk sommertid + + + IST (Israel) + + + + + japansk standardtid + + + + + koreansk standardtid + + + + + Moskva normaltid + Moskva sommertid + + + + + newzealandsk tid + newzealandsk standardtid + newzealandsk sommertid + + + NZT + + + + + + + , +   + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + ¤ #,##0.00 + + + {0} {1} + {0} {1} + + + + andorranske pesetas + andorransk pesetas + + + UAE dirham + + + afghani (1927-2002) + + + afghani + AFN + + + albanske lek + albansk lek + + + armenske dram + armensk dram + + + nederlandske antillegylden + nederlandsk antillegylden + ANG + + + angolanske kwanza + angolansk kwanza + AOA + + + angolanske kwanza (1977-1990) + angolansk kwanza (1977-1990) + + + angolanske nye kwanza (1990-2000) + angolansk ny kwanza + + + angolanske kwanza reajustado (1995-1999) + angolansk kwanza reajustado (1995-1999) + + + argentinske australer + argentinsk austral + + + ARL + + + ARM + + + argentinske pesos (1983-1985) + argentinsk pesos (1983-1985) + + + argentinske pesos + argentinsk pesos + ARS + + + østerrikske shilling + østerriksk schilling + østerrikske schilling + + + australske dollar + australsk dollar + AUD + + + arubiske gylden + arubisk gylden + AWG + + + aserbajdsjanske manat (1993-2006) + aserbajdsjansk manat (1993-2006) + + + aserbajdsjanske manat + aserbajdsjansk manat + AZN + + + bosnisk-hercegovinske dinarer + bosnisk-hercegovinsk dinar + + + bosnisk-hercegovinske mark (konvertible) + bosnisk-hercegovinsk mark (konvertibel) + BAM + + + barbadiske dollar + barbadisk dollar + BBD + + + bangladeshiske taka + bangladeshisk taka + BDT + + + belgiske franc (konvertible) + belgisk franc (konvertibel) + + + belgiske franc + belgisk franc + + + belgiske franc (finansielle) + belgisk franc (finansiell) + + + bulgarske lev (hard) + bulgarsk lev (hard) + + + bulgarske lev + bulgarsk lev + + + bahrainske dinarer + bahrainsk dinar + BHD + + + burundiske franc + burundisk franc + BIF + + + bermudiske dollar + bermudisk dollar + BMD + + + bruneiske dollar + bruneisk dollar + BND + + + boliviano + BOB + + + bolivianske pesos + boliviansk pesos + BOP + + + bolivianske mvdol + BOV + + + brasilianske cruzeiro novo (1967-1986) + brasiliansk cruzeiro novo (1967-1986) + BRB + + + brasilianske cruzado + brasiliansk cruzado + BRC + + + brasilianske cruzeiro (1990-1993) + brasiliansk cruzeiro (1990-1993) + BRE + + + brasilianske realer + brasiliansk real + BRL + + + brasilianske cruzado novo + brasiliansk cruzado novo + + + brasilianske cruzeiro + brasiliansk cruzeiro + + + BRZ + + + bahamske dollar + bahamsk dollar + BSD + + + bhutanske ngultrum + bhutansk ngultrum + BTN + + + burmesiske kyat + burmesisk kyat + + + botswanske pula + botswansk pula + + + hviterussiske nye rubler (1994-1999) + hviterussisk ny rubel (1994-1999) + + + hviterussiske rubler + hviterussisk rubel + + + beliziske dollar + belizisk dollar + BZD + + + kanadiske dollar + kanadisk dollar + CAD + + + kongolesiske franc (congolais) + kongolesisk franc (congolais) + + + WIR euro + + + sveitsiske franc + sveitsisk franc + CHF + + + WIR franc + + + CLE + + + chilenske unidades de fomento + chilensk unidades de fomento + + + chilenske pesos + chilensk pesos + CLP + + + kinesiske yuan renminbi + kinesisk yuan renminbi + CNY + + + colombianske pesos + colombiansk pesos + COP + + + unidad de valor real + + + costaricanske colon + costaricansk colon + CRC + + + gamle serbiske dinarer + gammel serbisk dinar + gamle serbiske dinarer + + + tsjekkoslovakiske koruna (hard) + tsjekkoslovakisk koruna (hard) + + + CUC + + + kubanske pesos + kubansk pesos + CUP + + + kappverdiske escudo + kappverdisk escudo + kappverdiske escudos + CVE + + + kypriotiske pund + kypriotisk pund + CYP + + + tsjekkiske koruna + tsjekkisk koruna + CZK + + + østtyske ostmark + østtysk ostmark + + + tyske mark + tysk mark + + + djiboutiske franc + djiboutisk franc + DJF + + + danske kroner + dansk krone + danske kroner + DKK + + + dominikanske pesos + dominikansk pesos + dominikanske pesos + DOP + + + algeriske dinarer + algerisk dinar + algeriske dinarer + DZD + + + ecuadorianske sucre + ecuadoriansk sucre + ecuadorianske sucre + + + ecuadorianske unidad de valor constante (UVC) + ecuadoriansk unidad de valor constante (UVC) + + + estiske kroon + estisk kroon + EEK + + + egyptiske pund + egyptisk pund + EGP + + + eritreiske nakfa + eritreisk nakfa + ERN + + + spanske peseta (A-konto) + spansk peseta (A-konto) + + + spanske peseta (konvertibel konto) + spansk peseta (konvertibel konto) + + + spanske peseta + spansk peseta + + + etiopiske birr + etiopisk birr + ETB + + + euro + EUR + + + finske mark + finsk mark + + + fijianske dollar + fijiansk dollar + FJD + + + Falkland-pund + FKP + + + franske franc + fransk franc + + + britiske pund sterling + britisk pund sterling + GBP + + + georgiske kupon larit + georgisk kupon larit + + + georgiske lari + georgisk lari + + + ghanesisk cedi (1979-2007) + ghanesisk cedi (GHC) + ghanesiske cedi (GHC) + GHC + + + ghanesisk cedi + ghanesisk cedi + ghanesiske cedi + GHS + + + gibraltarske pund + gibraltarsk pund + GIP + + + gambiske dalasi + gambisk dalasi + + + guineanske franc + guineansk franc + GNF + + + guineanske syli + guineansk syli + + + ekvatorialguineanske ekwele guineana + ekvatorialguineansk ekwele guineana + + + greske drakmer + gresk drakme + + + guatemalanske quetzal + guatemalansk quetzal + + + portugisiske guinea escudo + portugisisk guinea escudo + + + Guinea-Bissau-pesos + + + guyanske dollar + guyansk dollar + + + Hongkong-dollar + + + Hoduras Lempira + + + kroatiske dinarer + kroatisk dinar + + + kroatiske kuna + kroatisk kuna + + + haitiske gourde + haitisk gourde + + + ungarske forinter + ungarsk forint + + + indonesiske rupier + indonesisk rupi + + + irske pund + irsk pund + IEP + + + israelske pund + israelsk pund + + + israelsk gammel shekel + israelsk gammel shekel + israelske gamle shekler + + + israelske nye shekler + israelsk ny shekel + + + indiske rupier + indisk rupi + INR + + + irakske dinarer + iraksk dinar + + + iranske rialer + iransk rial + + + gammel islandsk krone + gammel islandsk krone + gamle islandske kroner + + + islandske kroner + islandsk krone + + + italienske lire + italiensk lire + ITL + + + jamaikanske dollar + jamaikansk dollar + + + jordanske dinarer + jordansk dinar + JOD + + + japanske yen + japansk yen + JPY + + + kenyanske shilling + kenyansk shilling + + + kirgisiske som + kirgisisk som + + + kambodsjanske riel + kambodsjansk riel + + + komoriske franc + komorisk franc + + + nordkoreanske won + nordkoreansk won + + + sørkoreanske won + sørkoreansk won + + + kuwaitiske dinarer + kuwaitisk dinar + + + caymanske dollar + caymansk dollar + + + kasakhstanske tenge + kasakhstansk tenge + + + laotiske kip + laotisk kip + + + libanesiske pund + libanesisk pund + + + srilankiske rupier + srilankisk rupi + LKR + + + liberiske dollar + liberisk dollar + + + lesothiske loti + lesothisk loti + + + litauiske lita + litauisk lita + LTL + + + litauiske talonas + litauisk talonas + + + luxemburgske konvertible franc + luxemburgsk konvertibel franc + + + luxemburgske franc + luxemburgsk franc + + + luxemburgske finansielle franc + luxemburgsk finansiell franc + + + latviske lats + latvisk lats + + + latviske rubler + latvisk rubel + + + libyske dinarer + libysk dinar + LYD + + + marokkanske dirham + marokkansk dirham + + + marokkanske franc + marokkansk franc + + + moldovske leu + moldovsk leu + + + madagassiske ariary + madagassisk ariary + + + madagassiske franc + madagassisk franc + + + makedonske denarer + makedonsk denar + + + maliske franc + malisk franc + + + myanmarske kyat + myanmarsk kyat + + + mongolske tugrik + mongolsk tugrik + MNT + + + makaoske pataca + makaosk pataca + + + mauritanske ouguiya + mauritansk ouguiya + + + maltesiske lira + maltesisk lira + + + maltesiske pund + maltesisk pund + MTP + + + mauritiske rupier + mauritisk rupi + + + maldiviske rufiyaa + maldivisk rufiyaa + + + malawiske kwacha + malawisk kwacha + + + meksikanske pesos + meksikansk pesos + + + meksikanske sølvpesos (1861-1992) + meksikansk sølvpesos (MXP) + meksikanske sølvpesos (MXP) + MXP + + + meksikanske unidad de inversion (UDI) + meksikansk unidad de inversion (UDI) + + + malaysiske ringgit + malaysisk ringgit + + + mosambikiske escudo + mosambikisk escudo + + + gamle mosambikiske metical + gammel mosambikisk metical + + + mosambikiske metical + mosambikisk metical + + + namibiske dollar + namibisk dollar + NAD + + + nigerianske naira + nigeriansk naira + + + nicaraguanske cordoba + nicaraguansk cordoba + + + nicaraguanske cordoba oro + nicaraguansk cordoba oro + + + nederlandske gylden + nederlandsk gylden + NLG + + + norske kroner + norsk krone + kr + + + nepalske rupier + nepalsk rupi + NPR + + + new zealandske dollar + new zealandsk dollar + + + omanske rialer + omansk rial + + + panamanske balboa + panamansk balboa + + + peruvianske inti + peruviansk inti + PEI + + + peruvianske nye sol + peruviansk ny sol + + + peruvianske sol + peruviansk sol + + + papuanske kina + papuansk kina + + + filippinske pesos + filippinsk pesos + + + pakistanske rupier + pakistansk rupi + PKR + + + polske zloty + polsk zloty + + + polske zloty (1950-1995) + polsk zloty (PLZ) + polske zloty (PLZ) + + + portugisiske escudo + portugisisk escudo + PTE + + + paraguayanske guarani + paraguayansk guarani + + + qatarske rialer + qatarsk rial + + + rhodesiske dollar + rhodesisk dollar + RHD + + + gamle rumenske leu + gammel rumensk leu + + + rumenske leu + rumensk leu + + + serbiske dinarer + serbisk dinar + + + russiske rubler + russisk rubel + + + russiske rubler (1991-1998) + russisk rubel (RUR) + russiske rubler (RUR) + + + rwandiske franc + rwandisk franc + RWF + + + saudiarabiske riyaler + saudiarabisk riyal + SAR + + + salomonske dollar + salomonsk dollar + + + seychelliske rupier + seychellisk rupi + + + sudanesiske dinarer + sudansk dinar + sudanske dinarer + + + sudanske pund + sudansk pund + + + sudanesiske pund + gammelt sudansk pund + gamle sudanske pund + + + svenske kroner + svensk krone + SEK + + + singaporske dollar + singaporsk dollar + + + sankthelenske pund + sankthelensk pund + + + slovenske tolar + slovensk tolar + + + slovakiske koruna + slovakisk koruna + + + sierraleonske leone + sierraleonsk leone + sierraleonske leone + + + somaliske shilling + somalisk shilling + + + surinamske dollar + surinamsk dollar + + + surinamske gylden + surinamsk gylden + + + Sao Tome og Principe-dobra + + + sovjetiske rubler + sovjetisk rubel + + + salvadoranske colon + salvadoransk colon + + + syriske pund + syrisk pund + SYP + + + swazilandske lilangeni + swazilandsk lilangeni + + + thailandske baht + thailandsk baht + THB + + + tadsjikiske rubler + tadsjikisk rubel + + + tadsjikiske somoni + tadsjikisk somoni + + + turkmenske manat + turkmensk manat + + + tunisiske dinarer + tunisisk dinar + + + tonganske paʻanga + tongansk paʻanga + + + timoresiske escudo + timoresisk escudo + + + tyrkiske lire + tyrkisk lire + tyrkiske lire + + + ny tyrkisk lire + ny tyrkisk lire + nye tyrkiske lire + + + trinidadiske dollar + trinidadisk dollar + + + taiwanske nye dollar + taiwansk ny dollar + + + tanzanianske shilling + tanzaniansk shilling + + + ukrainske hryvnia + ukrainsk hryvnia + + + ukrainske karbovanetz + ukrainsk karbovanetz + + + ugandiske shilling (1966-1987) + ugandisk shilling (UGS) + + + ugandiske shilling + ugandisk shilling + + + amerikanske dollar + amerikansk dollar + USD + + + amerikanske dollar (neste dag) + amerikansk dollar (neste dag) + + + amerikanske dollar (samme dag) + amerikansk dollar (samme dag) + + + Uruguayan Peso en Unidades Indexadas + + + uruguayanske pesos (1975-1993) + uruguayansk pesos (UYP) + uruguayanske pesos (UYP) + + + uruguayanske peso uruguayo + uruguayansk peso uruguayo + + + usbekiske sum + usbekisk sum + + + venezuelanske bolivar + venezuelansk bolivar + + + venezuelanske bolivar fuerte + venezuelansk bolivar fuerte + + + vietnamesiske dong + vietnamesisk dong + + + vanuatiske vatu + vanuatisk vatu + + + vestsamoiske tala + vestsamoisk tala + + + CFA franc BEAC + + + sølv + + + gull + + + europeisk sammensatt enhet + europeiske sammensatte enheter + + + europeisk monetær enhet + europeiske monetære enheter + + + europeisk kontoenhet (XBC) + europeiske kontoenheter + + + europeisk kontoenhet (XBD) + europeiske kontoenheter (XBD) + + + østkaribiske dollar + østkaribisk dollar + XCD + + + spesielle trekkrettigheter + spesiell trekkrettighet + + + europeisk valutaenhet + europeiske valutaenheter + + + franske gullfranc + fransk gullfranc + + + franske UIC-franc + fransk UIC-franc + + + CFA franc BCEAO + + + palladium + + + CFP franc + + + platina + + + RINET-fond + + + testvalutakode + testvaluta + testvaluta + + + ukjent eller ugyldig valuta + ukjent eller ugyldig valuta + ukjent eller ugyldig valuta + + + jemenittiske dinarer + jemenittisk dinar + + + jemenittiske rialer + jemenittisk rial + + + jugoslaviske dinarer (hard) + jugoslavisk dinar (hard) + + + jugoslaviske noviy-dinarer + jugoslavisk noviy-dinar + + + jugoslaviske konvertible dinarer + jugoslavisk konvertibel dinar + + + sørafrikanske rand (finansielle) + sørafrikansk rand (finansiell) + + + sørafrikanske rand + sørafrikansk rand + + + zambiske kwacha + zambisk kwacha + + + zairiske nye zaire + zairisk ny zaire + ZRN + + + zairiske zaire + zairisk zaire + + + zimbabwiske dollar + zimbabwisk dollar + + + + + + {0} dag + {0} dager + + + {0} time + {0} timer + + + {0} minutt + {0} minutter + + + {0} måned + {0} måneder + + + {0} sekund + {0} sekunder + + + {0} uke + {0} uker + + + {0} år + {0} år + + + + + ja + nei + + + diff --git a/lib/zend/Zend/Locale/Data/nb_NO.xml b/lib/zend/Zend/Locale/Data/nb_NO.xml new file mode 100644 index 0000000000..9ccbefd648 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nb_NO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/nds.xml b/lib/zend/Zend/Locale/Data/nds.xml new file mode 100644 index 0000000000..44a7c84fb7 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nds.xml @@ -0,0 +1,1149 @@ + + + + + + + + + + + {0} ({1}) + , + + + Afar + Abchaasch + Aceh + Acholi + Adangme + Adygeisch + Avestsch + Afrikaansch + Afro-Asiaatsche Spraken + Afrihili + Ainu + Akan + Akkadsch + Aleutsch + Algonkin-Spraken + Süüd-Altaisch + Amhaarsch + Aragoneesch + Ooldengelsch + Angika + Apache + Araabsch + Aramääsch + Araukaansch + Arapaho + Kunstspraken + Arawak-Spraken + Assameesch + Asturiaansch + Athabasksche Spraken + Austraalsche Spraken + Awaarsch + Awadhi + Aymara + Aserbaidschaansch + Baschkiersch + Banda + Bamileke + Belutschisch + Balineesch + Basaa + Baltsche Spraken + Wittruss’sch + Bedscha + Bemba + Berberspraken + Bulgaarsch + Bihaarsch + Bhodschpuri + Bislama + Bikol + Bini + Siksika + Bambara + Bengaalsch + Bantuspraken + Tibeetsch + Bretoonsch + Braj-Bhakha + Bosnisch + Batak + Burjaatsch + Bugineesch + Blin + Katalaansch + Caddo + Indianerspraken in Zentralamerika + Kariebsche Spraken + Kaukaasche Spraken + Atsam + Tschetscheensch + Cebuano + Keltsche Spraken + Chamorro + Chibcha-Spraken + Tschagataisch + Trukeesch + Mari + Chinook + Choctaw + Chipewyan + Cherokee + Cheyenne + Cham-Spraken + Koorsch + Koptsch + Kreoolsch-Engelsche Spraken + Kreoolsch-Franzöösche Spraken + Kreoolsch-Portugeesche Spraken + Cree + Krimtataarsch + Kreoolsche Spraken + Tschech’sch + Kaschuubsch + Karkenslaavsch + Kuschietsche Spraken + Tschuwasch’sch + Waliesch + Däänsch + Dakota + Dargiensch + Dajak + Düütsch + Öösterrieksch Hoochdüütsch + Swiezer Hoochdüütsch + Delaware + Slave + Dogrib + Dinka + Dogri + Drawiedsche Spraken + Neddersorbsch + Duala + Middelnedderlandsch + Maledievsch + Dyula + Bhutaansch + Ewe + Efik + Ägyptsch + Ekajuk + Greeksch + Elaamsch + Engelsch + Austraalsch Engelsch + Kanaadsch Engelsch + Brietsch Engelsch + Amerikaansch Engelsch + Middelengelsch + Esperanto + Spaansch + Latienamerikaansch Spaansch + Ibeersch Spaansch + Eestnisch + Basksch + Ewondo + Pers’sch + Pangwe + Fanti + Ful + Finnsch + Philippiensch + Finnougrische Spraken + Fidschiaansch + Färöösch + Fon + Franzöösch + Kanaadsch Franzöösch + Swiezer Franzöösch + Middelfranzöösch + Ooldfranzöösch + Noordfreesch + Saterfreesch + Friuulsch + Westfreesch + Iersch + Ga + Gayo + Gbaya + Schottsch Gäälsch + Germaansche Spraken + Geez + Gilberteesch + Galizisch + Middelhoochdüütsch + Guarani + Ooldhoochdüütsch + Gondi + Gorontalo + Gootsch + Grebo + Ooldgreeksch + Swiezerdüütsch + Gujarati + Manx + Kutchin + Haussa + Haida + Hawaiiaansch + Hebrääsch + Hindi + Hiligaynon + Himachali + Hethitsch + Miao-Spraken + Hiri-Motu + Kroaatsch + Böversorbsch + Haitiaansch-Kreoolsch + Ungaarsch + Hupa + Armeensch + Herero + Interlingua + Iban + Indoneesch + Interlingue + Igbo + Sichuan Yi + Ijo + Inupiak + Ilokano + Indoarische Spraken + Indogermaansche Spraken + Ingusch’sch + Ido + Iraansche Spraken + Irokeesche Spraken + Ieslandsch + Italieensch + Inuktitut + Japaansch + Lojban + Jöödsch-Pers’sch + Jöödsch-Araabsch + Javaansch + Georgsch + Karakalpaksch + Kabyylsch + Kachin + Jju + Kamba + Kareensch + Kawi + Kabardiensch + Tyap + Koro + Kongo + Khasi + Khoisan-Spraken + Saaksch + Kikuyu + Kwanyama + Kasach’sch + Gröönlandsch + Kambodschaansch + Kimbundu + Kannada + Koreaansch + Konkani + Kosraeaansch + Kpelle + Kanuursch + Karatschaisch-Balkaarsch + Kareelsch + Kru-Spraken + Oraon + Kaschmiersch + Kurdsch + Kumücksch + Kutenai + Komi + Koornsch + Kirgiesch + Latiensch + Ladiensch + Lahnda + Lamba + Luxemborgsch + Lesgisch + Ganda + Limborgsch + Lingala + Laootsch + Mongo + Rotse + Litausch + Luba + Luba-Lulua + Luiseno + Lunda + Luo + Lushai + Lettsch + Madureesch + Magahi + Maithili + Makassarsch + Manding + Austroneesche Spraken + Massai + Mokscha + Mandareesch + Mende + Madagassisch + Middeliersch + Marschalleesch + Maori + Micmac + Minangkabau + Verschedene Spraken + Mazedoonsch + Mon-Khmer-Spraken + Malayalam + Mongoolsch + Mandschuursch + Manipuri + Manobo + Moldaawsch + Mohawk + Mossi + Marathi + Malaisch + Malteesch + Mehrsprakig + Munda-Spraken + Muskogee-Spraken + Mirandeesch + Marwari + Birmaansch + Maya-Spraken + Erzya + Nauruusch + Nahuatl + Indianerspraken in Noordamerika + Neapolitaansch + Norweegsch Bokmål + Noord-Ndebele + Plattdüütsch + Nepaleesch + Newari + Ndonga + Nias + Nigerkordofaansche Spraken + Niue + Nedderlandsch + Fläämsch + Norweegsch Nynorsk + Norweegsch + Nogai + Ooldnoorsch + N’Ko + Süüd-Ndebele + Noord-Sotho + Nuubsche Spraken + Navajo + Oold-Newari + Nyanja + Nyamwezi + Nyankole + Nyoro + Nzima + Okzitaansch + Ojibwa + Oromo + Orija + Ossetsch + Osage + Osmaansch + Otomangue-Spraken + Pandschabsch + Papuaspraken + Pangasinan + Middelpers’sch + Pampanggan + Papiamento + Palausch + Ooldpers’sch + Philippinen-Austroneesche Spraken + Phönieksch + Pali + Poolsch + Ponapeaansch + Prakrit + Ooldprovenzaalsch + Paschtu + Portugeesch + Brasiliaansch Portugeesch + Ibeersch Portugeesch + Quechua + Rajasthani + Oosterinsel-Spraak + Rarotongaansch + Rätoromaansch + Rundi + Rumäänsch + Romaansche Spraken + Romani + Wortel + Russ’sch + Aromuunsch + Ruandsch + Sanskrit + Sandawe + Jakuutsch + Indianerspraken in Süüdamerika + Salish + Samaritaansch + Sasak + Santali + Sardsch + Siziliaansch + Schottsch + Sindhi + Noord-Saamsch + Selkupsch + Semietsche Spraken + Sango + Oold-Iersch + Tekenspraken + Schan + Singhaleesch + Sidamo + Sioux-Spraken + Sinotibeetsche Spraken + Slowaaksch + Sloweensch + Slaavsche Spraken + Samoaansch + Süüd-Lappsch + Lappsch + Lule-Lappsch + Inari-Lappsch + Skolt-Lappsch + Schona + Soninke + Somaalsch + Sogdisch + Songhai + Albaansch + Serbsch + Surinaamsch + Serer + Swazi + Nilosaharaansche Spraken + Süüd-Sotho + Sundaneesch + Sukuma + Susu + Sumersch + Sweedsch + Suaheli + Oold-Syyrsch + Syyrsch + Tamilsch + Thaispraken + Telugu + Temne + Tereno + Tetum + Tadschiksch + Thai + Tigrinja + Tigre + Tiv + Turkmeensch + Tokelausch + Tagalog + Klingoonsch + Tlingit + Tamaschek + Tswana + Tongaasch + Tonga (Nyasa) + Tok Pisin + Törksch + Tsonga + Tsimshian + Tataarsch + Tumbuka + Tupi-Spraken + Altaische Spraken + Elliceaansch + Twi + Tahitsch + Tuwinsch + Udmurtsch + Uiguursch + Ugaritsch + Ukrainsch + Mbundu + Unbestimmte Spraak + Urdu + Usbeeksch + Vai + Venda + Vietnameesch + Volapük + Wootsch + Walloonsch + Wakashaansch + Walamo + Waray + Washo + Sorbsch + Wolof + Kalmücksch + Xhosa + Yao + Yapeesch + Jiddisch + Yoruba + Yupik + Zhuang + Zapoteeksch + Bliss-Symbolen + Zenaga + Chineesch + Vereenfacht Chineesch + Traditschonell Chineesch + Zande + Zulu + Zuni + Keen Spraakinhold + Zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Welt + Afrika + Noordamerika + Süüdamerika + Ozeanien + Westafrika + Middelamerika + Oostafrika + Noordafrika + Zentralafrika + Süüdlich Afrika + Amerika + Karibik + Oostasien + Süüdasien + Süüdoostasien + Süüdeuropa + Australien un Neeseeland + Melanesien + Polynesien + Süüd-Zentralasien + Asien + Zentralasien + Westasien + Europa + Oosteuropa + Noordeuropa + Westeuropa + Gemeenschop vun Unafhängige Staten + Latienamerika un Karibik + Andorra + Vereenigte Araabsche Emiraten + Afghanistan + Antigua un Barbuda + Anguilla + Albanien + Armenien + Nedderlandsche Antillen + Angola + Antarktis + Argentinien + Amerikaansch-Samoa + Öösterriek + Australien + Aruba + Ålandeilannen + Aserbaidschan + Bosnien un Herzegowina + Barbados + Bangladesch + Belgien + Burkina Faso + Bulgarien + Bahrain + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei Darussalam + Bolivien + Brasilien + Bahamas + Bhutan + Bouvet-Eiland + Botswana + Wittrussland + Belize + Kanada + Kokos-Eilannen + Demokraatsche Republik Kongo + Zentralafrikaansche Republik + Republik Kongo + Swiez + Elfenbeenküst + Cook-Eilannen + Chile + Kamerun + China + Kolumbien + Costa Rica + Kuba + Kap Verde + Wiehnachtseiland + Zypern + Tschechien + Düütschland + Dschibuti + Däänmark + Dominica + Dominikaansche Republik + Algerien + Ecuador + Eestland + Ägypten + Westsahara + Eritrea + Spanien + Äthiopien + Finnland + Fidschi + Falkland-Eilannen + Mikronesien + Färöer + Frankriek + Gabun + Vereenigt Königriek + Grenada + Georgien + Franzöösch-Guayana + Guernsey + Ghana + Gibraltar + Gröönland + Gambia + Guinea + Guadeloupe + Äquatorialguinea + Grekenland + Süüdgeorgien un de Südlichen Sandwich-Eilannen + Guatemala + Guam + Guinea-Bissau + Guyana + Sünnerverwaltensrebeed Hongkong + Heard- un McDonald-Eilannen + Honduras + Kroatien + Haiti + Ungarn + Indonesien + Irland + Israel + Insel Man + Indien + Britisch Rebeed in’n Indischen Ozean + Irak + Iran + Iesland + Italien + Jersey + Jamaika + Jordanien + Japan + Kenia + Kirgisistan + Kambodscha + Kiribati + Komoren + St. Kitts un Nevis + Noordkorea + Süüdkorea + Kuwait + Kaiman-Eilannen + Kasachstan + Laos + Libanon + St. Lucia + Liechtensteen + Sri Lanka + Liberia + Lesotho + Litauen + Luxemborg + Lettland + Libyen + Marokko + Monaco + Moldawien + Montenegro + Saint Martin + Madagaskar + Marshall-Eilannen + Makedonien + Mali + Birma + Mongolei + Sünnerverwaltensrebeed Macao + Nöördliche Marianen + Martinique + Mauretanien + Montserrat + Malta + Mauritius + Malediven + Malawi + Mexiko + Malaysia + Mosambik + Namibia + Neekaledonien + Niger + Norfolk + Nigeria + Nikaragua + Nedderlannen + Norwegen + Nepal + Nauru + Niue + Neeseeland + Oman + Panama + Peru + Franzöösch-Polynesien + Papua-Neeguinea + Philippinen + Pakistan + Polen + St. Pierre un Miquelon + Pitcairn + Puerto Rico + Palästinensische Rebeden + Portugal + Palau + Paraguay + Katar + Büter Ozeanien + Europääsche Union + Reunion + Rumänien + Serbien + Russland + Ruanda + Saudi-Arabien + Salomonen + Seychellen + Sudan + Sweden + Singapur + St. Helena + Slowenien + Svalbard un Jan Mayen + Slowakei + Sierra Leone + San Marino + Senegal + Somalia + Surinam + São Tomé un Príncipe + El Salvador + Syrien + Swasiland + Turks- un Caicosinseln + Tschad + Franzöösche Süüd- un Antarktisrebeden + Togo + Thailand + Tadschikistan + Tokelau + Oosttimor + Turkmenistan + Tunesien + Tonga + Törkie + Trinidad un Tobago + Tuvalu + Taiwan + Tansania + Ukraine + Uganda + Amerikaansch-Ozeanien + USA + Uruguay + Usbekistan + Vatikan + St. Vincent un de Grenadinen + Venezuela + Brietsche Jumfern-Eilannen + Amerikaansche Jumfern-Eilannen + Vietnam + Vanuatu + Wallis un Futuna + Samoa + Jemen + Mayotte + Süüdafrika + Sambia + Simbabwe + Unbekannte oder ungüllige Region + + + Ole düütsche Rechtschrievung + Standardiseert Resiaansch Rechtschrievung + Ne’e düütsche Rechtschrievung + Laat Middelfranzöösch bet 1606 + Fröh Neefranzöösch + Oostarmeensch + Westarmeensch + Vereenheitlicht Törksch Latienalphabet + San Giorgio-/Bila-Dialekt + Boontling + Phoneetsch (IPA) + Phoneetsch (UPA) + Lipovaz-Dialekt vun dat Resiaansche + Monotoonsch + Natisone-Dialekt + Gniva-/Njiva-Dialekt + Oseacco-/Osojane-Dialekt + Polytoonsch + Computer + Överarbeidt Rechtschrievung + Resiaansch + Saho + Schottsch Standard-Engelsch + Scouse + Stolvizza-/Solbica-Dialekt + Taraskievica-Rechtschrievung + Valenziaansch + + + Klenner + Bookstaven-Folgreeg + Geldteken + + + Traditschonell Chineesch Sorteerregeln - Big5 + Buddhistisch Klenner + Chineesch Klenner + Direkte Sorteerregeln + Vereenfacht Chineesch Sorteerregeln - GB2312 + Gregoriaansch Klenner + Hebrääsch Klenner + Indsch Nationalklenner + Islaamsch Klenner + Islaamsch Zivilklenner + Japaansch Klenner + Telefonbook-Sorteerregeln + Pinyin-Sorteerregeln + Klenner vun de Republik China + Streekfolg + Traditschonelle Sorteerregeln + + + US-amerikaansch + Metrisch + + + Spraak: {0} + Schrift: {0} + Region: {0} + + + + [a å ä b-o ö p-s ß t u ü v-z] + [á à ă â ā æ ç é è ĕ ê ë ę ē í ì ĭ î ï ī ñ ó ò ŏ ô ø ō œ ú ù ŭ û ū ÿ] + + + „ + “ + ‚ + ‘ + + + + {1} ({0}) + + Unbekannt + + + Süüdpool + + + Wostok + + + Dumont d’Urville + + + Kanaren + + + Ulanbator + + + Mexiko-Stadt + + + Azoren + + + Moskau + + + Wolgograd + + + Jekaterinborg + + + Nowosibirsk + + + Krasnojarsk + + + Jakutsk + + + Wladiwostok + + + Sachalin + + + Kamschatka + + + Uschgorod + + + Saporoschje + + + New Salem, Noord-Dakota + + + Center, Noord-Dakota + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + + + + + {0} Daag + + + {0} Stünnen + + + {0} Minuten + + + {0} Maanden + + + {0} Sekunnen + + + {0} Weken + + + {0} Johren + + + + + jo:j + nee:n + + + + diff --git a/lib/zend/Zend/Locale/Data/nds_DE.xml b/lib/zend/Zend/Locale/Data/nds_DE.xml new file mode 100644 index 0000000000..8c913f604b --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nds_DE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ne.xml b/lib/zend/Zend/Locale/Data/ne.xml new file mode 100644 index 0000000000..fc399061c7 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ne.xml @@ -0,0 +1,1383 @@ + + + + + + + + + + + अफ्रिकाली + अम्हारिक + अरबी + आसामी + अजरबैजानी + बेलारुसियाली + बुल्गेरियाली + बिहारी + बंगाली + बोस्नियाली + क्याटालन + चेकोस्लोभाकियाली + वेल्श + ड्यानिश + जर्मन + ग्रीक + अँग्रेजी + एस्पेरान्तो + स्प्यानिश + इस्टोनियाली + बास्क + फारसी + फिनिश + फिलिपिनी + फारोइज + फ्रांसेली + फ्रिजीयन + आइरिश + स्कट्स गाएलिक + गलिसियाली + गुजराती + हिब्रु + हिन्दी + क्रोएसियाली + हंग्रीयाली + इन्टर्लिङ्गुआ + इन्डोनेसियाली + अन्तरभाषी + आइसल्यान्डिक + इटालियन + जापानी + जाभानिज + जोरजियन + कम्बोडीयाली + कन्नाडा + कोरियाली + कुर्दिश + ल्याटिन + लिंगाला + लाओ + लिथुआनियाली + लात्भियाली + म्याकेडोनियन + मलयालम + मंगोल + मराठी + मलाया + माल्टिज + नेपाली + डच + नर्वेजियाली + अक्सिटन + ओरिया + पंजाबी + पोलिश + पाश्तो + पोर्तुगाली + पर्तुगाली (ब्राजिल्याली) + आइबेरी, पर्तुगाली + रोमानियाली + रसियाली + संस्कृत + सिन्हाली + स्लोभाकियाली + स्लोभेनियाली + सोमाली + अल्बेनियन + सर्बियाली + सुडानी + स्विडिश + स्वाहिली + तामिल + तेलुगु + थाई + तिग्रीन्या + क्लिङ्गन + टर्की + युक्रेनी + उर्दु + उज़्बेक + भियतनामी + झोसा + यिद्दिस + चिनियाँ + सरलिकृत चिनियाँ + परम्परागत चिनियाँ + जुलू + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + विश्व + अफ्रिका + उत्तर अमेरिका + दक्षिण अमेरिका + ओसनिया + पश्चिमी अफ्रिका + केन्द्रीय अमेरिका + पूर्वी अफ्रिका + उत्तरी अफ्रिका + मध्य अफ्रिका + दक्षिणी अफ्रिका + अमेरिकास + उत्तरी अमेरिका + क्यारिबिएन + पूर्वी एशिया + दक्षिणी एशिया + दक्षिण पूर्वी एशिया + दक्षिणी युरोप + अष्ट्रेलिया र न्युजिल्याण्ड + मेलानेसिया + माइक्रोनेसियाली क्षेत्र + पोलिनेशिया + दक्षिण मध्य एशिया + एशिया + केन्द्रीय एशिया + पश्चिमी एशिया + युरोप + पूर्वी युरोप + उत्तरी युरोप + पश्चिमी युरोप + कमनवेल्थका स्वतन्त्र राज्यहरू + ल्याटिन अमेरिका तथा क्यारिबियन + अन्डोर्रा + संयुक्त अरब इमिराट्स + अफ्गानिष्तान + एन्टिगुआ र बारबुडा + आङ्गुइला + अल्बानिया + आर्मेनिया + नेदरल्याण्ड्स एण्टिलिस + अङ्गोला + अन्टारतिका + अर्जेण्टिना + अमेरिकी समोआ + अष्ट्रिया + अष्ट्रेलिया + आरूबा + अलान्ड टापु + अजरबैजान + बोस्निया र हर्जगोभिनिया + बार्बाडोस + बङ्गलादेश + बेल्जियम + बर्किना फासो + बल्गेरिया + बाह्रेन + बुरूण्डी + बेनिन + सेन्ट बार्थालेमी + बर्मुडा + ब्रुनाइ + बोलिभिया + ब्राजिल + बहामास + भुटान + बुभेट टापु + बोट्स्वाना + बेलारूस + बेलिज + क्यानाडा + कोकोस टापु + कोङ्गो-किन्शासा + केन्द्रीय अफ्रिकी गणतन्त्र + कोङ्गो - ब्राज्जाभिल्ले + स्विजरल्याण्ड + आइभोरी कोष्ट + कुक टापु + चिली + क्यामेरून + चीन + कोलोम्बिया + कोष्टारिका + क्युबा + केप भर्डे + क्रिष्टमस टापु + साइप्रस + चेख गणतन्त्र + जर्मनी + डिजिबुटी + डेन्मार्क + डोमिनिका + डोमिनिकन गणतन्त्र + अल्जेरिया + इक्वडेर + इस्टोनिया + इजिप्ट + पश्चिमी साहारा + एरित्रिया + स्पेन + इथोपिया + फिन्ल्याण्ड + फिजी + फकल्याण्ड टापु + माइक्रोनेसिया + फारोर टापु + फ्रान्स + गावोन + संयुक्त अधिराज्य + ग्रेनाडा + जोर्जिया + फ्रान्सेली गायना + गुएर्नसे + घाना + जिब्राल्टार + ग्रिनल्याण्ड + गाम्विया + गिनी + ग्वाडेलुप + भू-मध्यीय गिनी + ग्रिश + ग्वाटेमाला + गुवाम + गिनी-बिसाउ + गुयाना + हङकङ चिनिँया समाजवादी स्वायत्त क्षेत्र + हर्ड टापु र म्याकडोनाल्ड टापु + हन्डुरास + क्रोएशिया + हैटी + हङ्गेरी + इन्डोनेशिया + आइरल्याण्ड + इज्रायल + आइज्ले अफ् म्यान + भारत + बेलायती हिन्द महासागर क्षेत्र + इराक + इरान + आइस्ल्याण्ड + इटाली + जर्सी + जमाइका + जोर्डन + जापान + केन्या + किर्गिस्थान + कम्बोडिया + किरिबाटी + कोमोरोस + सेन्ट किट्स र नेभिस + उत्तर कोरिया + दक्षिण कोरिया + कुवेत + केयमान टापु + काजाकस्थान + लाओस + लेबनोन + सेन्ट लुसिया + लिएखटेन्स्टाइन + श्रीलङ्का + लाइबेरिया + लेसोथो + लिथुअनिया + लक्जेमबर्ग + लाट्भिया + लिबिया + मोरोक्को + मोनाको + माल्डोभा + मोन्टेनेग्रो + सेन्ट मार्टिन + मडागास्कर + मार्शल टापु + म्याकेडोनिया + माली + म्यान्मार + मङ्गोलिया + मकावो चिनिँया स्वशासित क्षेत्र + उत्तरी मारिआना टापु + मार्टिनिक + माउरिटानिया + मोन्टसेर्राट + माल्टा + माउरिटस + माल्दिभ्स + मालावी + मेक्सिको + मलेसिया + मोजाम्बिक + नामिबिया + नयाँ कालेडोनिया + नाइजर + नोरफोल्क टापु + नाइजेरिया + निकारागुवा + नेदरल्याण्ड्स + नर्वे + नेपाल + नाउरू + नियुइ + न्युजिल्याण्ड + ओमन + पनामा + पेरू + फ्रान्सेली पोलिनेसिया + पपुआ न्यू गाइनिया + फिलिपिन्स + पाकिस्तान + पोल्याण्ड + सेन्ट पिर्रे र मिक्केलोन + पिटकाइर्न + प्युर्टोरिको + प्यालेस्टनी भू-भाग + पोर्तुगल + पलाउ + प्यारागुये + कटार + बाह्य ओसनिया + युरोपियन युनियन + रियुनियन + रोमानिया + सर्बिया + रूस + रवाण्डा + साउदी अरब + सोलोमोन टापु + सेचेलेस + सुडान + स्विडेन + सिङ्गापुर + सेन्ट हेलेना + स्लोभेनिया + सभाल्बार्ड र जान मायेन + स्लोभाकिया + सिएर्रा लिओन + सान् मारिनो + सेनेगाल + सोमालिया + सुरिनेम + साओ टोमे र प्रिन्सिप + एल् साल्भाडोर + सिरिया + स्वाजिल्याण्ड + तुर्क र काइकोस टापु + चाड + फ्रान्सेली दक्षिणी क्षेत्र + टोगो + थाइल्याण्ड + ताजिकिस्तान + तोगो + पूर्वी टिमोर + तुर्कमेनिस्तान + टुनिसिया + टोंगा + टर्की + त्रिनिडाड र तोबागो + तुभालु + ताइवान + तान्जानिया + युक्रेन + युगाण्डा + संयुक्त राज्य अल्प बाह्य टापु + संयुक्त राज्य + युरूगुए + उज्बेकिस्तान + भेटिकन + सेन्ट भिन्सेन्ट र ग्रेनाडिन्स + भेनेजुएला + बेलायती भर्जिन टापु + संयुक्त राज्य भर्जिन टापु + भिएतनाम + भानुआतु + वालिस र फुटुना + सामोआ + येमेन + मायोट्ट + दक्षिण अफ्रिका + जाम्बिया + जिम्बाबे + अपरिचित वा अवैध क्षेत्र + + + पूर्वी आर्मेनियाली + कम्प्युटर + + + पात्रो + कोलेशन + मुद्रा + + + परम्परागत चिनिँया क्रमबद्धता पद्दति - बिग फाइभ + बुद्धिष्ट पात्रो + चिनिँया पात्रो + प्रत्यक्ष क्रमबद्धता पद्दति + सरलिकृत चिनियाँ क्रमबद्धता पद्दति-गीबीटुथ्रीवानटु + ग्रेगोरियन पात्रो + हिब्रु पात्रो + भारतीय राष्ट्रिय पात्रो + इस्लामी पात्रो + इस्लामी नागरिक पात्रो + जापानी पात्रो + टेलिफोन पुस्तिका क्रमबद्धतापद्दति + पिनयिन क्रमबद्धता पद्दति + चिनिँया गणतन्त्र पात्रो + स्ट्रोक क्रमबद्धता पद्दति + परम्परागत क्रमबद्धता पद्दति + + + + [ँ-ः ०-९ अ-ऋ ए ऐ ओ-न प-र ल व-ह ा-ृ े ै ो ्] + [\u200C \u200D] + + + ' + ' + " + " + + + + + पूर्व मध्यान्ह + पूर्व अपरान्ह + + + + + + जन + फेब + मार्च + अप्रि + मे + जुन + जुला + अग + सेप्ट + अक्टो + नोभे + डिसे + + + जनवरी + फेब्रुअरी + मार्च + अप्रिल + मे + जुन + जुलाई + अगस्त + सेप्टेम्बर + अक्टोबर + नोभेम्बर + डिसेम्बर + + + + + १ + २ + ३ + ४ + ५ + ६ + ७ + ८ + ९ + १० + ११ + १२ + + + + + + + आइत + सोम + मङ्गल + बुध + बिही + शुक्र + शनि + + + आइतबार + सोमबार + मङ्गलबार + बुधबार + बिहीबार + शुक्रबार + शनिबार + + + + + १ + २ + ३ + ४ + ५ + ६ + ७ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + पहिलो सत्र + दोस्रो सत्र + तेस्रो सत्र + चौथो सत्र + + + + + १ + २ + ३ + ४ + + + + पूर्व मध्यान्ह + उत्तर मध्यान्ह + + + ईसा पूर्व + सन् + + + ईसा पूर्व + सन् + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + काल + + + बर्ष + + + महिना + + + हप्ता + + + बार + तीन दिन पछि + अस्ति + हिजो + आज + भोलि + + + हप्ताको बार + + + पूर्व मध्यान्ह/उत्तर मध्यान्ह + + + घण्टा + + + मिनेट + + + दोस्रो + + + क्षेत्र + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + अज्ञात + + + रोथेरा + + + पाल्मेर + + + दक्षिण पोल + + + सिओआ + + + माजन + + + डेभिस + + + भास्टोक + + + केजे + + + दुमोन्ट डि उर्भेल्ले + + + माकमुर्डो + + + रियो ग्यालेगोस + + + मेन्डोजा + + + सान जुवान + + + उशुआइआ + + + ला रियोजा + + + सान लुइस + + + कातामार्का + + + जुजु + + + टुकुमान + + + कोरडोवा + + + ब्यनेश आयर्स + + + पर्थ + + + इयुक्ला + + + डार्विन + + + एडेलेड + + + ब्रोकन हिल + + + क्युरी + + + मेल्बर्न + + + होभार्ट + + + लिन्डेम्यान + + + सिड्नी + + + ब्रिस्बेन + + + लर्ड होवे + + + आइरनेपे + + + रियो ब्रान्को + + + पोर्टो भेल्हो + + + बोआ भिष्टा + + + मानाउस + + + क्युइआबा + + + क्याम्पो ग्रान्डे + + + बेलेम + + + आरागुवाना + + + साओ पाउलो + + + बाहिया + + + फोर्टालेजा + + + मासेइओ + + + रिसाइफ + + + नोरोन्हा + + + डेजन + + + ह्वाइटहर्स + + + इनुभिक + + + भ्यानकोभर + + + डेजन क्रिक + + + येल्लोनाइफ + + + एड्मोन्टन + + + स्विफ्ट करेण्ट + + + क्याम्ब्रिज बे + + + रेजिना + + + विन्निपेग + + + रिजोलुट + + + रेनिरिभर + + + रान्किन इन्लेट + + + कोराल बन्दरगाहा + + + थण्डर बे + + + निपिगन + + + टोरोण्टो + + + मोन्ट्रिल + + + इक्वालुइट + + + पाङ्निरतुङ + + + मोन्कटन + + + हालेफाक्स + + + गुज बे + + + ग्लेस बे + + + ब्लान्क-साब्लोन + + + सेन्ट जोन्स + + + किन्शासा + + + लुबुम्बासी + + + इस्टर + + + काश्गर + + + उरूम्की + + + चोङकिङ + + + हार्विन + + + गलापागोस + + + क्यानारी + + + सेउटा + + + ट्रुक + + + पोनापे + + + कोस्राए + + + थुले + + + स्कोर्सबाइसन्ड + + + डान्मार्कशाभन + + + जाकार्ता + + + पोन्टिआनाक + + + माकास्सार + + + जयापुरा + + + एन्डरबरी + + + किरितिमाटी + + + तरवा + + + आक्टाउ + + + ओरल + + + आक्टोब + + + किजिलोर्डा + + + आल्माटी + + + क्वाजालेइन + + + माजुरो + + + होभ्ड + + + उलानबटार + + + चोइबाल्सान + + + तिजुआना + + + हेर्मोसिल्लो + + + माजाट्लान + + + चिहुआहुआ + + + मोन्टेर्रे + + + मेक्सिको सिटी + + + मेरिडा + + + कानकुन + + + कुचिङ + + + चाथाम + + + मार्केसास + + + ग्याम्बियर + + + आजोर्स + + + माडेइरा + + + कालिनिनग्राद + + + मस्को + + + भोल्गोग्राद + + + सामारा + + + एकटरिनबुर्ग + + + ओम्स्क + + + नोबोसिबिर्स्क + + + क्रास्नोयार्स्क + + + इर्कुत्स्क + + + याकुत्स्क + + + भ्लाडिभास्टोक + + + साखालिन + + + मागाडान + + + कामचट्का + + + आनाडियर + + + उझगोरद + + + किभ + + + सिम्फेरोपोल + + + जापोरोझ्ये + + + मिडवे + + + जोन्सटन + + + वेक + + + आडाक + + + नोमे + + + होनोलुलु + + + याकुतात + + + जुनिउ + + + लस् एन्जेलस + + + बोइज + + + फोनिक्स + + + शिपरक + + + डेन्भर + + + नयाँ सालेम, उत्तर डाकोटा + + + उत्तर डाकोटा, केन्द्र + + + चिकागो + + + मेनोमिनी + + + भिन्सेन्स + + + पिटर्सबर्ग, इन्डियाना + + + टेल सिटी, इन्डियाना + + + नोक्स, इण्डियाना + + + विनामाक, इन्डियाना + + + मारेन्गो, इन्डियाना + + + इण्डियानापोलिस + + + लुइसभिल्ले + + + भेभे, इन्डियाना + + + मोन्टिसेल्लो,केन्टकी + + + डिट्रोइट + + + न्युयोर्क + + + समारकण्ड + + + + १३:२५ मोजाम्बिक समय + १३:२५ केन्द्रीय अफ्रिकी समय + + + + + + deva + + . + , + ; + ० + - + + + + अफ्गानी(१९२७-२००२) + + + अफ्गानी + + + अल्बानियन लेक + + + अष्ट्रेलियन डलर + + + ब्राजिलियन रियल + + + चिनिँया युआन रेनिबी + + + युरो + + + बेलायती पाउण्ड स्टर्लिङ + + + भारती रूपिँया + + + जापानी येन + + + नर्वेजियाली क्रोन + + + नेरू + + + फिलिपिनी पेसो + + + रूसी रूबल + + + संयुक्त राज्य डलर + + + अपरिचित वा अवैध मुद्रा + + + + + + {0} दिन + + + {0} घण्टा + + + {0} मिनेट + + + {0} महिना + + + {0} सेकेण्ड + + + {0} हप्ता + + + {0} बर्ष + {0} बर्ष + + + diff --git a/lib/zend/Zend/Locale/Data/ne_IN.xml b/lib/zend/Zend/Locale/Data/ne_IN.xml new file mode 100644 index 0000000000..8280fcbdad --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ne_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ne_NP.xml b/lib/zend/Zend/Locale/Data/ne_NP.xml new file mode 100644 index 0000000000..19c03c2fc1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ne_NP.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/nl.xml b/lib/zend/Zend/Locale/Data/nl.xml new file mode 100644 index 0000000000..4aa0f3d05f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nl.xml @@ -0,0 +1,3798 @@ + + + + + + + + + + + {0} ({1}) + , + + + Afar + Abchazisch + Atjees + Akoli + Adangme + Adyghe + Avestisch + Afrikaans + Afro-Aziatische taal + Afrihili + Ainu + Akan + Akkadisch + Aleut + Algonkium-taal + Zuid-Altaïsch + Amhaars + Aragonees + Oudengels + Angika + Apache-taal + Arabisch + Aramees + Araukaans + Arapaho + Kunstmatige taal + Arawak + Assamees + Asturisch + Athapascaanse taal + Australische taal + Avarisch + Awadhi + Aymara + Azerbeidzjaans + Basjkiers + Banda + Bamileke-taal + Baloetsji + Balinees + Basa + Baltische taal + Wit-Russisch + Beja + Bemba + Berber + Bulgaars + Bihari + Bhojpuri + Bislama + Bikol + Bini + Siksika + Bambara + Bengalees + Bantoe + Tibetaans + Bretons + Braj + Bosnisch + Batak + Buriat + Buginees + Blin + Catalaans + Caddo + Midden-Amerikaans Indiaanse taal + Caribisch + Kaukasische taal + Atsam + Chechen + Cebuano + Keltische taal + Chamorro + Chibcha + Chagatai + Chuukees + Mari + Chinook-jargon + Choctaw + Chipewyan + Cherokee + Cheyenne + Chamische taal + Corsicaans + Koptisch + Op Engels gebaseerd Creools of Pidgin + Op Frans gebaseerd Creools of Pidgin + Op Portugees gebaseerd Creools of Pidgin + Cree + Krim-Tataars + Creools of Pidgin + Tsjechisch + Kasjoebisch + Kerkslavisch + Koesjitische taal + Tsjoevasjisch + Welsh + Deens + Dakota + Dargwa + Dajak + Duits + Oostenrijks Duits + Zwitsers Hoogduits + Delaware + Slave + Dogrib + Dinka + Dogri + Dravidische taal + Nedersorbisch + Duala + Middelnederlands + Divehi + Dyula + Dzongkha + Ewe + Efik + Oudegyptisch + Ekajuk + Grieks + Elamitisch + Engels + Australisch Engels + Canadees Engels + Brits Engels + Amerikaans Engels + Middelengels + Esperanto + Spaans + Latijns-Amerikaans Spaans + Iberisch Spaans + Estlands + Baskisch + Ewondo + Perzisch + Fang + Fanti + Fulah + Fins + Filippijns + Fins-Oegrische taal + Fijisch + Faeröers + Fon + Frans + Canadees Frans + Zwitsers Frans + Middelfrans + Oudfrans + Noord-Fries + Oost-Fries + Friulisch + Fries + Iers + Ga + Gayo + Gbaya + Schots Gaelic + Germaanse taal + Geez + Gilbertees + Galicisch + Middelhoogduits + Guarani + Oudhoogduits + Gondi + Gorontalo + Gothisch + Grebo + Oudgrieks + Zwitsers Duits + Gujarati + Manx + Gwichʼin + Hausa + Haida + Hawaïaans + Hebreeuws + Hindi + Hiligaynon + Himachali + Hettitisch + Hmong + Hiri Motu + Kroatisch + Oppersorbisch + Haïtiaans + Hongaars + Hupa + Armeens + Herero + Interlingua + Iban + Indonesisch + Interlingue + Igbo + Sichuan Yi + Ijo + Inupiaq + Iloko + Indische taal + Indo-Europese taal + Ingoesj + Ido + Iraanse taal + Irokese taal + IJslands + Italiaans + Inuktitut + Japans + Lojban + Judeo-Perzisch + Judeo-Arabisch + Javaans + Georgisch + Karakalpaks + Kabyle + Kachin + Jju + Kamba + Karen + Kawi + Kabardisch + Tyap + Koro + Kongo + Khasi + Khoisan-taal + Khotanees + Kikuyu + Kuanyama + Kazachs + Kalaallisut + Khmer + Kimbundu + Kannada + Koreaans + Konkani + Kosraeaans + Kpelle + Kanuri + Karachay-Balkar + Karelisch + Kru + Kurukh + Kashmiri + Koerdisch + Kumyk + Kutenai + Komi + Cornish + Kirgizisch + Latijn + Ladino + Lahnda + Lamba + Luxemburgs + Lezgisch + Ganda + Limburgs + Lingala + Lao + Mongo + Lozi + Litouws + Luba-Katanga + Luba-Lulua + Luiseno + Lunda + Luo + Lushai + Letlands + Madurees + Magahi + Maithili + Makassaars + Mandingo + Austronesisch + Masai + Moksha + Mandar + Mende + Malagasisch + Middeliers + Marshallees + Maori + Mi'kmaq + Minangkabau + Diverse talen + Macedonisch + Mon-Khmer-taal + Malayalam + Mongools + Mantsjoe + Manipoeri + Manobo-taal + Moldavisch + Mohawk + Mossi + Marathi + Maleis + Maltees + Meerdere talen + Munda-taal + Creek + Mirandees + Marwari + Birmees + Mayan-taal + Erzya + Nauru + Nahuatl + Noord-Amerikaans Indiaanse taal + Napolitaans + Noors - Bokmål + Noord-Ndbele + Laagduits + Nepalees + Newari + Ndonga + Nias + Niger-Kordofanische taal + Niueaans + Nederlands + Vlaams + Noors - Nynorsk + Noors + Nogai + Oudnoors + N’ko + Zuid-Ndbele + Noord-Sotho + Nubische taal + Navajo + Klassiek Newari + Nyanja + Nyamwezi + Nyankole + Nyoro + Nzima + Occitaans + Ojibwa + Oromo + Oriya + Ossetisch + Osage + Ottomaans-Turks + Otomi-taal + Punjabi + Papoeataal + Pangasinan + Pahlavi + Pampanga + Papiamento + Palauaans + Oudperzisch + Filippijnse taal + Foenicisch + Pali + Pools + Pohnpeiaans + Prakrit-taal + Oudprovençaals + Pasjtoe + Portugees + Braziliaans Portugees + Iberisch Portugees + Quechua + Rajasthani + Rapanui + Rarotongan + Reto-Romaans + Rundi + Roemeens + Romaanse taal + Romani + Root + Russisch + Aromaniaans + Kinyarwanda + Sanskriet + Sandawe + Yakut + Zuid-Amerikaans Indiaanse taal + Salishan-taal + Samaritaans-Aramees + Sasak + Santali + Sardinisch + Siciliaans + Schots + Sindhi + Noord-Samisch + Selkup + Semitische taal + Sango + Oudiers + Gebarentaal + Servokroatisch + Shan + Singalees + Sidamo + Siouaanse talen + Sino-Tibetaanse taal + Slowaaks + Sloveens + Slavische taal + Samoaans + Zuid-Samisch + Sami-taal + Lule Sami + Inari Sami + Skolt Sami + Shona + Soninke + Somalisch + Sogdisch + Songhai + Albanees + Servisch + Sranantongo + Serer + Swati + Nilo-Saharaanse taal + Zuid-Sotho + Soendanees + Sukuma + Soesoe + Soemerisch + Zweeds + Swahili + Klassiek Syrisch + Syriac + Tamil + Tai-taal + Teloegoe + Timne + Tereno + Tetum + Tadzjieks + Thais + Tigrinya + Tigre + Tiv + Turkmeens + Tokelau + Tagalog + Klingon + Tlingit + Tamashek + Tswana + Tonga + Nyasa Tonga + Tok Pisin + Turks + Tsonga + Tsimshian + Tataars + Toemboeka + Tupi-taal + Altaïsche taal + Tuvalu + Twi + Tahitisch + Tuvinisch + Udmurt + Oeigoers + Oegaritisch + Oekraïens + Umbundu + Onbepaald + Urdu + Oezbeeks + Vai + Venda + Vietnamees + Volapük + Votisch + Wallonisch + Wakashan-taal + Walamo + Waray + Washo + Sorbische taal + Wolof + Kalmyk + Xhosa + Yao + Yapees + Jiddisch + Yoruba + Yupik-talen + Zhuang + Zapotec + Blissymbolen + Zenaga + Chinees + Vereenvoudigd Chinees + Traditioneel Chinees + Zande + Zulu + Zuni + Geen linguïstische inhoud + Zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wereld + Afrika + Noord-Amerika + Zuid-Amerika + Oceanië + West-Afrika + Midden-Amerika + Oost-Afrika + Noord-Afrika + Centraal-Afrika + Zuidelijk Afrika + Amerika + Noordelijk Amerika + Caribisch gebied + Oost-Azië + Zuid-Azië + Zuidoost-Azië + Zuid-Europa + Australië en Nieuw-Zeeland + Melanesië + Micronesische regio + Polynesië + Zuidelijk Centraal-Azië + Azië + Centraal-Azië + West-Azië + Europa + Oost-Europa + Noord-Europa + West-Europa + Gemenebest van Onafhankelijke Staten + Latijns-Amerika en het Caribisch gebied + Kanaaleilanden + Andorra + Verenigde Arabische Emiraten + Afghanistan + Antigua en Barbuda + Anguilla + Albanië + Armenië + Nederlandse Antillen + Angola + Antarctica + Argentinië + Amerikaans Samoa + Oostenrijk + Australië + Aruba + Alandeilanden + Azerbeidzjan + Bosnië en Herzegovina + Barbados + Bangladesh + België + Burkina Faso + Bulgarije + Bahrein + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei + Bolivia + Brazilië + Bahama’s + Bhutan + Bouveteiland + Botswana + Wit-Rusland + Belize + Canada + Cocoseilanden + Congo-Kinshasa + Centraal-Afrikaanse Republiek + Congo + Zwitserland + Ivoorkust + Cookeilanden + Chili + Kameroen + China + Colombia + Costa Rica + Servië en Montenegro + Cuba + Kaapverdië + Christmaseiland + Cyprus + Tsjechië + Duitsland + Djibouti + Denemarken + Dominica + Dominicaanse Republiek + Algerije + Ecuador + Estland + Egypte + Westelijke Sahara + Eritrea + Spanje + Ethiopië + Finland + Fiji + Falklandeilanden + Micronesië + Faeröer + Frankrijk + Gabon + Verenigd Koninkrijk + Grenada + Georgië + Frans-Guyana + Guernsey + Ghana + Gibraltar + Groenland + Gambia + Guinee + Guadeloupe + Equatoriaal-Guinea + Griekenland + Zuid-Georgië en Zuidelijke Sandwicheilanden + Guatemala + Guam + Guinee-Bissau + Guyana + Hongkong SAR van China + Heard- en McDonaldeilanden + Honduras + Kroatië + Haïti + Hongarije + Indonesië + Ierland + Israël + Isle of Man + India + Britse Gebieden in de Indische Oceaan + Irak + Iran + IJsland + Italië + Jersey + Jamaica + Jordanië + Japan + Kenia + Kirgizië + Cambodja + Kiribati + Comoren + Saint Kitts en Nevis + Noord-Korea + Zuid-Korea + Koeweit + Caymaneilanden + Kazachstan + Laos + Libanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litouwen + Luxemburg + Letland + Libië + Marokko + Monaco + Moldavië + Montenegro + Sint-Maarten + Madagaskar + Marshalleilanden + Macedonië + Mali + Myanmar + Mongolië + Macao SAR van China + Noordelijke Marianeneilanden + Martinique + Mauritanië + Montserrat + Malta + Mauritius + Maldiven + Malawi + Mexico + Maleisië + Mozambique + Namibië + Nieuw-Caledonië + Niger + Norfolkeiland + Nigeria + Nicaragua + Nederland + Noorwegen + Nepal + Nauru + Niue + Nieuw-Zeeland + Oman + Panama + Peru + Frans-Polynesië + Papoea-Nieuw-Guinea + Filipijnen + Pakistan + Polen + Saint Pierre en Miquelon + Pitcairn + Puerto Rico + Palestijns Gebied + Portugal + Palau + Paraguay + Qatar + Oceanië (overige) + Europese Unie + Réunion + Roemenië + Servië + Rusland + Rwanda + Saoedi-Arabië + Salomonseilanden + Seychellen + Soedan + Zweden + Singapore + Sint-Helena + Slovenië + Svalbard en Jan Mayen + Slowakije + Sierra Leone + San Marino + Senegal + Somalië + Suriname + Sao Tomé en Principe + El Salvador + Syrië + Swaziland + Turks- en Caicoseilanden + Tsjaad + Franse Gebieden in de zuidelijke Indische Oceaan + Togo + Thailand + Tadzjikistan + Tokelau + Oost-Timor + Turkmenistan + Tunesië + Tonga + Turkije + Trinidad en Tobago + Tuvalu + Taiwan + Tanzania + Oekraïne + Oeganda + Amerikaanse kleinere afgelegen eilanden + Verenigde Staten + Uruguay + Oezbekistan + Vaticaanstad + Saint Vincent en de Grenadines + Venezuela + Britse Maagdeneilanden + Amerikaanse Maagdeneilanden + Vietnam + Vanuatu + Wallis en Futuna + Samoa + Jemen + Mayotte + Zuid-Afrika + Zambia + Zimbabwe + Onbekend of onjuist gebied + + + Traditionele Duitse spelling + Gestandaardiseerde Resiaanse spelling + Duitse spelling van 1996 + Laat Middelfrans tot 1606 + Vroeg modern Frans + Oost-Armeens + West-Armeens + Eenvormig Turkse Latijnse alfabet + San Giorgio/Bila-dialect + Boontling + Internationaal Fonetisch Alfabet + Oeralisch Fonetisch Alfabet + Het Lipovaz-dialect van het Resiaans + Monotonaal + Natisone-dialect + Gniva/Njiva-dialect + Oseacco/Osojane-dialect + Polytonaal + Computer + Gewijzigde spelling + Resiaans + Saho + Schots standaard-Engels + Liverpools (Scouse) + Stolvizza/Solbica-dialect + Taraskievica-spelling + Valenciaans + + + Kalender + Volgorde + Munteenheid + + + Traditioneel Chinees + Boeddhistische kalender + Chinese kalender + Directe sorteervolgorde + Vereenvoudigd Chinees + Gregoriaanse kalender + Hebreeuwse kalender + Indiase nationale kalender + Islamitische kalender + Islamitische kalender (cyclisch) + Japanse kalender + Telefoonboeksorteervolgorde + Pinyinvolgorde + Kalender van de Chinese Republiek + Streeksorteervolgorde + Traditionele sorteervolgorde + + + Amerikaans + Metriek + + + Taal: {0} + Schrift: {0} + Regio: {0} + + + + titlecase-firstword + lowercase-words + titlecase-firstword + titlecase-firstword + titlecase-firstword + + + [a á ä b-e é ë f-i í ï {ij} j-o ó ö p-u ú ü v-z] + [å ã ç ñ ô] + [a-z] + + + ‘ + ’ + “ + ” + + + {0}−{1} + + + + + + jan. + feb. + mrt. + apr. + mei + jun. + jul. + aug. + sep. + okt. + nov. + dec. + + + januari + februari + maart + april + mei + juni + juli + augustus + september + oktober + november + december + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + zo + ma + di + wo + do + vr + za + + + zondag + maandag + dinsdag + woensdag + donderdag + vrijdag + zaterdag + + + + + Z + M + D + W + D + V + Z + + + + + + + K1 + K2 + K3 + K4 + + + 1e kwartaal + 2e kwartaal + 3e kwartaal + 4e kwartaal + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Voor Christus + Anno Domini + + + v. Chr. + n. Chr. + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + dd-MM-yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + L + E d-M + LLL + E d MMM + E d MMMM + d MMMM + d-MMM + d-MM + dd-MM + d-M + d + mm:ss + mm:ss + y + M-yyyy + EEE d-M-yyyy + MMM y + EEE d MMM y + MMMM y + Q yyyy + QQQ y + MM-yy + MMM yy + Q yy + QQQQ yy + MMMM y + + + {0} - {1} + + M-M + + + E dd-MM - E dd-MM + E dd-MM - E dd-MM + + + MMM-MMM + + + E d MMM - E d MMM + E d - E d MMM + + + LLLL-LLLL + + + d MMM - d MMM + d-d MMM + + + dd-MM - dd-MM + dd-MM - dd-MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM-yy - MM-yy + MM-yy - MM-yy + + + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + E dd-MM-yy - E dd-MM-yy + + + MMM-MMM y + MMM y - MMM y + + + E d MMM - E d MMM y + E d - E d MMM y + E d MMM y - E d MMM y + + + MM–MM – yyyy + MM-yyyy – MM-yyyy + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + dd-MM-yy - dd-MM-yy + + + + + + Tijdperk + + + Jaar + + + Maand + + + Week + + + Dag + Drie dagen geleden + Eergisteren + Gisteren + Vandaag + Morgen + Overmorgen + Over drie dagen + + + Dag van de week + + + AM/PM + + + Uur + + + Minuut + + + Seconde + + + Zone + + + + + + + + Tisjrie + Chesjwan + Sjevat + Adar + Adar B + Ijar + Tammoez + Elloel + + + + + + + + + Moeharram + Rabiʻa al awal + Rabiʻa al thani + Joemadʻal awal + Joemadʻal thani + Sjaʻaban + Sjawal + Doe al kaʻaba + Doe al hizja + + + + + + Saʻna Hizjria + + + + + + +HH:mm;-HH:mm + GMT{0} + {0}-tijd + {1} ({0}) + + Onbekend + + + Tirana + + + Erevan + + + Curaçao + + + Zuidpool + + + Río Gallegos + + + Córdoba + + + Wenen + + + Bakoe + + + Brussel + + + Bahrein + + + Pôrto Velho + + + Cuiabá + + + Belém + + + São Paulo + + + Maceió + + + Montréal + + + St. Johns + + + Cocoseilanden + + + Zürich + + + Paaseiland + + + Sjanghai + + + Bogotá + + + Kaapverdië + + + Christmaseiland + + + Berlijn + + + Kopenhagen + + + Galápagos + + + Asmara + + + Canarische Eilanden + + + Addis Abeba + + + Pohnpei + + + Faeröer + + + Parijs + + + Londen + + + Athene + + + Zuid-Georgië + + + Hongkong + + + Boedapest + + + Jeruzalem + + + Teheran + + + Tokio + + + Bisjkek + + + Enderbury-eiland + + + St. Kitts + + + Koeweit + + + Aqtöbe + + + Alma-Ata + + + Beiroet + + + St. Lucia + + + Luxemburg + + + Ulaanbaator + + + Maldiven + + + Mazatlán + + + Mexico-stad + + + Mérida + + + Cancún + + + Nouméa + + + Kathmandu + + + Marquesaseilanden + + + Gambier-eilanden + + + Manilla + + + Warschau + + + Azoren + + + Lissabon + + + Asunción + + + Réunion + + + Boekarest + + + Moskou + + + Jekaterinenburg + + + Krasnojarsk + + + Irkoetsk + + + Jakoetsk + + + Sachalin + + + Kamtsjatka + + + Riyad + + + Mahé + + + Khartoem + + + Sint-Helena + + + Sao Tomé + + + Salvador + + + Turks Eilanden + + + Lomé + + + Dusjanbe + + + Asjchabad + + + Istanboel + + + Oezjhorod + + + Zaporizja + + + Wake-eiland + + + Tasjkent + + + St. Vincent + + + St. Thomas + + + + Acre-tijd + Acre-zomertijd + + true + + + + Afghaanse tijd + + true + + + + Centraal-Afrikaanse tijd + + + + + Oost-Afrikaanse tijd + + + + + Zuid-Afrikaanse tijd + Zuid-Afrikaanse standaardtijd + + + + + West-Afrikaanse tijd + West-Afrikaanse zomertijd + + + + + Aktyubinsk-tijd + Aktyubinsk-zomertijd + + true + + + + Alaska-tijd + Alaska - standaardtijd + Alaska - zomertijd + + true + + + + Alaska-Hawaii-tijd + Alaska-Hawaii-standaardtijd + Alaska-Hawaii-zomertijd + + true + + + + Alma-Ata-tijd + Alma-Ata-zomertijd + + true + + + + Amazone-tijd + Amazone-zomertijd + + true + + + + Central-tijd + Central-standaardtijd + Central-zomertijd + + true + + + + Eastern-tijd + Eastern-standaardtijd + Eastern-zomertijd + + true + + + + Mountain-tijd + Mountain-standaardtijd + Mountain-zomertijd + + true + + + + Pacific-tijd + Pacific-standaardtijd + Pacific-zomertijd + + true + + + + Anadyr-tijd + Anadyr-zomertijd + + true + + + + Aqtau-tijd + Aqtau-zomertijd + + true + + + + Aqtöbe-tijd + Aqtöbe-zomertijd + + + AQTT (Aqtöbe) + AQTST (Aqtöbe) + + true + + + + Arabische tijd + Arabische standaardtijd + Arabische zomertijd + + + AT (Arabisch) + AST (Arabisch) + ADT (Arabisch) + + + + + Argentijnse tijd + Argentijnse zomertijd + + true + + + + West-Argentijnse tijd + + true + + + + Armeense tijd + Armeense zomertijd + + + AMT (Armenië) + AMST (Armenië) + + + + + Ashkhabad-tijd + Ashkhabad-zomertijd + + true + + + + Atlantic-tijd + Atlantic - standaardtijd + Atlantic - zomertijd + + true + + + + Midden-Australische tijd + Midden-Australische standaardtijd + Midden-Australische zomertijd + + true + + + + Midden-Australische westelijke tijd + Midden-Australische westelijke standaardtijd + Midden-Australische westelijke zomertijd + + true + + + + Oost-Australische tijd + Oost-Australische standaardtijd + Oost-Australische zomertijd + + true + + + + West-Australische tijd + West-Australische standaardtijd + West-Australische zomertijd + + true + + + + Azerbeidzjaanse tijd + Azerbeidzjaanse zomertijd + + true + + + + Azoren-tijd + Azoren-zomertijd + + true + + + + Bakoe-tijd + Bakoe-zomertijd + + true + + + + Bengalese tijd + + true + + + + Bering-tijd + Bering-standaardtijd + Bering-zomertijd + + true + + + + Bhutaanse tijd + + true + + + + Boliviaanse tijd + + true + + + + Borneose tijd + Borneose zomertijd + + true + + + + Braziliaanse tijd + Braziliaanse zomertijd + + true + + + + Bruneise tijd + + true + + + + Kaapverdische tijd + Kaapverdische zomertijd + + true + + + + Chamorro-tijd + Chamorro-standaardtijd + + true + + + + Changbai-tijd + + true + + + + Chatham-standaardtijd + Chatham-zomertijd + + true + + + + Chileense tijd + Chileense zomertijd + + true + + + + Chinese tijd + Chinese standaardtijd + Chinese zomertijd + + + CT (China) + CST (China) + CDT (China) + + true + + + + Choibalsan-tijd + Choibalsan-zomertijd + + true + + + + Christmaseilandse tijd + + true + + + + Cocoseilandse tijd + + true + + + + Colombiaanse tijd + Colombiaanse zomertijd + + true + + + + Cookeilandse tijd + Cookeilandse halve zomertijd + + + + + Cubaanse tijd + Cubaanse standaardtijd + Cubaanse zomertijd + + + CST (Cuba) + CDT (Cuba) + + true + + + + Dhaka-tijd + + true + + + + Davis-tijd + + true + + + true + + + + Dumont-d'Urville-tijd + + true + + + + Dushanbe-tijd + Dushanbe-zomertijd + + true + + + + Nederlands-Guyaanse tijd + + + + + Oost-Timorese tijd + + true + + + + Paaseilandse tijd + Paaseilandse zomertijd + + true + + + + Ecuadoriaanse tijd + + true + + + + Midden-Europese standaardtijd + Midden-Europese zomertijd + + + + + Oost-Europese standaardtijd + Oost-Europese zomertijd + + + + + West-Europese tijd + West-Europese zomertijd + + true + + + + Falklandeilandse tijd + Falklandeilandse zomertijd + + true + + + + Fijische tijd + Fijische zomertijd + + true + + + + Frans-Guyaanse tijd + + true + + + + Franse zuidelijke en Antarctische tijd + + true + + + + Frunze-tijd + Frunze-zomertijd + + + + + Greenwich Mean Time + + true + + + + Galapagoseilandse tijd + + true + + + + Gambiereilandse tijd + + true + + + + Georgia-tijd + Georgia-zomertijd + + true + + + + Gilberteilandse tijd + + true + + + true + + + + Centraal-Groenlandse tijd + Centraal-Groenlandse zomertijd + + true + + + + Oost-Groenlandse tijd + Oost-Groenlandse zomertijd + + true + + + + West-Groenlandse tijd + West-Groenlandse zomertijd + + true + + + + Guamese standaardtijd + + + GST (Guam) + + + + + Golf-tijd + Golf-standaardtijd + + true + + + + Guyaanse tijd + + true + + + + Hawaii-Aleoetische standaardtijd + + true + + + + Hongkong-tijd + Hongkong-zomertijd + + true + + + + Hovd-tijd + Hovd-zomertijd + + true + + + + Indiaase standaardtijd + + true + + + + Indische Oceaan-tijd + + true + + + + Indochinese tijd + + true + + + + Centraal-Indonesische tijd + + true + + + + Oost-Indonesische tijd + + true + + + + West-Indonesische tijd + + true + + + + Iraanse standaardtijd + Iraanse zomertijd + + true + + + + Irkoetsk-tijd + Irkoetsk-zomertijd + + true + + + + Israëlische tijd + Israëlische standaardtijd + Israëlische zomertijd + + + IST (Israël) + + true + + + + Japanse tijd + Japanse standaardtijd + Japanse zomertijd + + true + + + + Petropavlovsk-Kamtsjatski-tijd + Petropavlovsk-Kamtsjatski-zomertijd + + true + + + + Karachi-tijd + + true + + + + Kashgar-tijd + + true + + + + Oost-Kazachse tijd + Oost-Kazachse standaardtijd + + true + + + + West-Kazachse tijd + West-Kazachse standaardtijd + + true + + + + Kizilorda-tijd + Kizilorda-zomertijd + + true + + + + Koreaanse tijd + Koreaanse standaardtijd + Koreaanse zomertijd + + true + + + + Kosraese tijd + + + + + Krasnojarsk-tijd + Krasnojarsk-zomertijd + + true + + + + Kuybyshev standaardtijd + Kuybyshev-tijd + Kuybyshev-zomertijd + + true + + + + Kwajaleinse tijd + + true + + + + Kirgizische tijd + + true + + + + Lanka-tijd + + true + + + + Line-eilandse tijd + + + + + Long-Shu-tijd + + true + + + + Lord Howe-tijd + Lord Howe-standaardtijd + Lord Howe-zomertijd + + true + + + + Macause tijd + Macause zomertijd + + true + + + + Magadan-tijd + Magadan-zomertijd + + true + + + + Malakka-tijd + + true + + + + Maleisische tijd + + true + + + + Maldivische tijd + + true + + + + Marquesaseilandse tijd + + true + + + + Marshalleilandse tijd + + true + + + + Mauritiaanse tijd + + true + + + + Mawson-tijd + + true + + + + Ulaanbaatar-tijd + Ulaanbaatar-zomertijd + + true + + + + Moskou-tijd + Moskou-standaardtijd + Moskou-zomertijd + + true + + + + Myanmarese tijd + + true + + + + Nauruaanse tijd + + true + + + + Nepalese tijd + + true + + + + Nieuw-Caledonische tijd + Nieuw-Caledonische zomertijd + + true + + + + Nieuw-Zeelandse tijd + Nieuw-Zeelandse standaardtijd + Nieuw-Zeelandse zomertijd + + true + + + + Newfoundland-tijd + Newfoundland-standaardtijd + Newfoundland-zomertijd + + true + + + + Niuese tijd + + true + + + + Norfolkeilandse tijd + + true + + + + Fernando de Noronha-tijd + Fernando de Noronha-zomertijd + + true + + + + Noordelijk Mariaanse tijd + + true + + + + Novosibirsk-tijd + Novosibirsk-zomertijd + + true + + + + Omsk-tijd + Omsk-zomertijd + + true + + + true + + + + Pakistaanse tijd + Pakistaanse zomertijd + + true + + + + Belause tijd + + true + + + + Papoea-Nieuw-Guinea-tijd + + true + + + + Paraguayaanse tijd + Paraguayaanse zomertijd + + true + + + + Peruaanse tijd + Peruaanse zomertijd + + true + + + + Filipijnse tijd + Filipijnse zomertijd + + true + + + + Phoenixeilandse tijd + + true + + + + Pierre en Miquelon-tijd + Pierre en Miquelon-standaardtijd + Pierre en Miquelon-zomertijd + + true + + + + Pitcairnse tijd + + true + + + + Pohnpeise tijd + + true + + + + Qyzylorda-tijd + Qyzylorda-zomertijd + + true + + + + Réunionse tijd + + true + + + + Rothera-tijd + + true + + + + Sachalin-tijd + Sachalin-zomertijd + + true + + + + Samara-tijd + Samara-zomertijd + + true + + + + Samarkand-tijd + Samarkand-zomertijd + + true + + + + Samoaanse standaardtijd + + true + + + + Seychelse tijd + + true + + + + Shevchenko-tijd + Shevchenko-zomertijd + + true + + + + Singaporese standaardtijd + + true + + + + Solomoneilandse tijd + + true + + + + Zuid-Georgische tijd + + + GST (Z. Georgië) + + true + + + + Surinaamse tijd + + true + + + + Sverdlovsk-tijd + Sverdlovsk-zomertijd + + true + + + + Syowa-tijd + + true + + + + Tahitiaanse tijd + + true + + + + Tadzjiekse tijd + + true + + + + Tasjkent-tijd + Tasjkent-zomertijd + + true + + + + Tbilisi-tijd + Tbilisi-zomertijd + + true + + + + Tokelause tijd + + true + + + + Tongaanse tijd + Tongaanse zomertijd + + true + + + + Chuukse tijd + + true + + + + Turkse tijd + Turkse zomertijd + + true + + + + Turkmeense tijd + Turkmeense zomertijd + + true + + + + Tuvaluaanse tijd + + true + + + + Oral-tijd + Oral-zomertijd + + true + + + + Uruguayaanse tijd + Uruguayaanse zomertijd + + true + + + + Ürümqi-tijd + + true + + + + Oezbeekse tijd + Oezbeekse zomertijd + + true + + + + Vanuatuaanse tijd + Vanuatuaanse zomertijd + + true + + + + Venezolaanse tijd + + true + + + + Vladivostok-tijd + Vladivostok-zomertijd + + true + + + + Wolgograd-tijd + Wolgograd-zomertijd + + true + + + + Vostok-tijd + + true + + + + Wake-eilandse tijd + + true + + + + Wallis en Futunase tijd + + true + + + + Jakoetsk-tijd + Jakoetsk-zomertijd + + true + + + + Jekaterinenburg-tijd + Jekaterinenburg-zomertijd + + true + + + + Jerevan-tijd + Jerevan-zomertijd + + true + + + + Yukon-tijd + Yukon-standaardtijd + Yukon-zomertijd + + true + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00;¤ #,##0.00- + + + {0} {1} + {0} {1} + + + + Andorrese peseta + Andorrese peseta + Andorrese peseta + + + Verenigde Arabische Emiraten-dirham + Verenigde Arabische Emiraten-dirham + Verenigde Arabische Emiraten-dirham + + + Afghani (1927-2002) + Afghani (AFA) + Afghani (AFA) + + + Afghani + Afghani + Afghani + + + Albanese lek + Albanese lek + Albanese lek + + + Armeense dram + + + Nederlands-Antilliaanse gulden + + + Angolese kwanza + + + Angolese kwanza (1977-1990) + + + Angolese nieuwe kwanza (1990-2000) + + + Angolese kwanza reajustado (1995-1999) + + + Argentijnse austral + + + Argentijnse peso (1983-1985) + + + Argentijnse peso + + + Oostenrijkse schilling + + + Australische dollar + + + Arubaanse gulden + + + Azerbeidzjaanse manat (1993-2006) + + + Azerbeidzjaanse manat + + + Bosnische dinar + + + Bosnische convertibele mark + + + Barbadaanse dollar + + + Bengalese taka + + + Belgische frank (convertibel) + + + Belgische frank + + + Belgische frank (financieel) + + + Bulgaarse harde lev + + + Bulgaarse nieuwe lev + + + Bahreinse dinar + + + Burundese franc + + + Bermuda-dollar + + + Bruneise dollar + + + Boliviano + + + Boliviaanse peso + + + Boliviaanse mvdol + + + Braziliaanse cruzeiro novo (1967-1986) + + + Braziliaanse cruzado + + + Braziliaanse cruzeiro (1990-1993) + + + Braziliaanse real + + + Braziliaanse cruzado novo + + + Braziliaanse cruzeiro + + + Bahamaanse dollar + + + Bhutaanse ngultrum + + + Birmese kyat + + + Botswaanse pula + + + Wit-Russische nieuwe roebel (1994-1999) + + + Wit-Russische roebel + + + Belizaanse dollar + + + Canadese dollar + + + Congolese franc + + + WIR euro + + + Zwitserse franc + + + WIR franc + + + Chileense unidades de fomento + + + Chileense peso + + + Chinese yuan renminbi + + + Colombiaanse peso + + + Unidad de Valor Real + + + Costaricaanse colón + + + Oude Servische dinar + + + Tsjechoslowaakse harde koruna + + + Cubaanse peso + + + Kaapverdische escudo + + + Cyprisch pond + + + Tsjechische koruna + + + Oost-Duitse ostmark + + + Duitse mark + + + Djiboutiaanse franc + + + Deense kroon + + + Dominicaanse peso + + + Algerijnse dinar + + + Ecuadoraanse sucre + + + Ecuadoraanse unidad de valor constante (UVC) + + + Estlandse kroon + + + Egyptisch pond + + + Eritrese nakfa + + + Spaanse peseta (account A) + + + Spaanse peseta (convertibele account) + + + Spaanse peseta + + + Ethiopische birr + + + Euro + + + Finse markka + + + Fiji dollar + + + Falklandeilands pond + + + Franse franc + + + Brits pond sterling + + + Georgische kupon larit + + + Georgische lari + + + Ghanese cedi (1979-2007) + + + Ghanese cedi + + + Gibraltarees pond + + + Gambiaanse dalasi + + + Guinese franc + + + Guinese syli + + + Equatoriaal-Guinese ekwele guineana + + + Griekse drachme + + + Guatemalteekse quetzal + + + Portugees-Guinese escudo + + + Guinee-Bissause peso + + + Guyaanse dollar + + + Hongkongse dollar + + + Hondurese lempira + + + Kroatische dinar + + + Kroatische kuna + + + Haïtiaanse gourde + + + Hongaarse forint + + + Indonesische rupiah + + + Iers pond + + + Israëlisch pond + + + Israëlische nieuwe shekel + + + Indiase rupee + + + Iraakse dinar + + + Iraanse rial + + + IJslandse kroon + + + Italiaanse lire + + + Jamaicaanse dollar + + + Jordaanse dinar + + + Japanse yen + + + Keniaanse shilling + + + Kirgizische som + + + Cambodjaanse riel + + + Comorese franc + + + Noord-Koreaanse won + + + Zuid-Koreaanse won + + + Koeweitse dinar + + + Caymaneilandse dollar + + + Kazachstaanse tenge + + + Laotiaanse kip + + + Libanees pond + + + Srilankaanse rupee + + + Liberiaanse dollar + + + Lesothaanse loti + + + Litouwse litas + + + Litouwse talonas + + + Luxemburgse convertibele franc + + + Luxemburgse frank + + + Luxemburgse financiële franc + + + Letse lats + + + Letse roebel + + + Libische dinar + + + Marokkaanse dirham + + + Marokkaanse franc + + + Moldavische leu + + + Malagassische ariary + + + Malagassische franc + + + Macedonische denar + + + Malinese franc + + + Myanmarese kyat + + + Mongoolse tugrik + + + Macause pataca + + + Mauritaanse ouguiya + + + Maltese lire + + + Maltees pond + + + Mauritiaanse rupee + + + Maldivische rufiyaa + + + Malawische kwacha + + + Mexicaanse peso + + + Mexicaanse zilveren peso (1861-1992) + + + Mexicaanse unidad de inversion (UDI) + + + Maleisische ringgit + + + Mozambikaanse escudo + + + Oude Mozambikaanse metical + + + Mozambikaanse metical + + + Namibische dollar + + + Nigeriaanse naira + + + Nicaraguaanse córdoba + + + Nicaraguaanse córdoba oro + + + Nederlandse gulden + + + Noorse kroon + + + Nepalese rupee + + + Nieuw-Zeelandse dollar + + + Omaanse rial + + + Panamese balboa + + + Peruaanse inti + + + Peruaanse nieuwe sol + + + Peruaanse sol + + + Papuaanse kina + + + Filipijnse peso + + + Pakistaanse rupee + + + Poolse zloty + + + Poolse zloty (1950-1995) + + + Portugese escudo + + + Paraguayaanse guarani + + + Qatarese rial + + + Rhodesische dollar + + + Oude Roemeense leu + + + Roemeense leu + + + Servische dinar + + + Russische roebel + + + Russische roebel (1991-1998) + + + Rwandese franc + + + Saoedische rial + + + Salomonseilandse dollar + + + Seychelse rupee + + + Soedanese dinar + + + Soedanese pond + + + Soedanees pond + + + Zweedse kroon + + + Singaporese dollar + + + Sint-Heleense pond + + + Sloveense tolar + + + Slowaakse koruna + + + Sierraleoonse leone + + + Somalische shilling + + + Surinaamse dollar + + + Surinaamse gulden + + + Santomese dobra + + + Sovjet-roebel + + + Salvadoraanse colón + + + Syrisch pond + + + Swazische lilangeni + + + Thaise baht + + + Tadzjikistaanse roebel + + + Tadzjikistaanse somoni + + + Turkmeense manat + + + Tunesische dinar + + + Tongaanse paʻanga + + + Timorese escudo + + + Turkse lire + oude Turkse lira + oude Turkse lira + + + Nieuwe Turkse lire + Turkse lira + Turkse lira + + + Trinidad en Tobago-dollar + + + Nieuwe Taiwanese dollar + + + Tanzaniaanse shilling + + + Oekraïense hryvnia + + + Oekraïense karbovanetz + + + Oegandese shilling (1966-1987) + + + Oegandese shilling + + + Amerikaanse dollar + + + Amerikaanse dollar (volgende dag) + + + Amerikaanse dollar (zelfde dag) + + + Uruguayaanse peso en geïndexeerde eenheden + + + Uruguayaanse peso (1975-1993) + + + Uruguayaanse peso uruguayo + + + Oezbekistaanse sum + + + Venezolaanse bolivar + + + Venezolaanse sterke bolivar + + + Vietnamese dong + + + Vanuatuaanse vatu + + + West-Samoaanse tala + + + CFA-franc BEAC + + + Zilver + + + Goud + + + Europese samengestelde eenheid + + + Europese monetaire eenheid + + + Europese rekeneenheid (XBC) + + + Europese rekeneenheid (XBD) + + + Oost-Caribische dollar + + + Special Drawing Rights + + + European Currency Unit + + + Franse gouden franc + + + Franse UIC-franc + + + CFA-franc BCEAO + + + Palladium + + + CFP-franc + + + Platina + + + RINET-fondsen + + + Valutacode voor testdoeleinden + + + Geen valuta + onbekende/ongeldige munteenheid + + + Jemenitische dinar + + + Jemenitische rial + + + Joegoslavische harde dinar + + + Joegoslavische noviy-dinar + + + Joegoslavische convertibele dinar + + + Zuid-Afrikaanse rand (financieel) + + + Zuid-Afrikaanse rand + + + Zambiaanse kwacha + + + Zaïrese nieuwe zaïre + + + Zaïrese zaïre + + + Zimbabwaanse dollar + + + + + + {0} dag + {0} dagen + + + {0} uur + {0} uur + + + {0} minuut + {0} minuten + + + {0} maand + {0} maanden + + + {0} seconde + {0} seconden + + + {0} week + {0} weken + + + {0} jaar + {0} jaar + + + + + ja:j + nee:n + + + + diff --git a/lib/zend/Zend/Locale/Data/nl_BE.xml b/lib/zend/Zend/Locale/Data/nl_BE.xml new file mode 100644 index 0000000000..59de34915c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nl_BE.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + Lets + Occitaans (na 1500); Provençaals + Servo-Kroatisch + Nilo-Saharaans + + + Centraal-Amerika + Het Eiland Man + Malediven + Salomoneilanden + + + Traditioneel + + + + + + + + + d-MMM-y + + + + + d/MM/yy + + + + + + + E d/MM - E d/MM + E d/MM - E d/MM + + + d/MM - d/MM + d/MM - d/MM + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + E d/MM/yy - E d/MM/yy + + + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + d/MM/yy - d/MM/yy + + + + + + + + + + + #,##0.00 ¤ + + + + + diff --git a/lib/zend/Zend/Locale/Data/nl_NL.xml b/lib/zend/Zend/Locale/Data/nl_NL.xml new file mode 100644 index 0000000000..7d6376c6d1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nl_NL.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/nn.xml b/lib/zend/Zend/Locale/Data/nn.xml new file mode 100644 index 0000000000..ccbd75395d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nn.xml @@ -0,0 +1,2825 @@ + + + + + + + + + nb da sv en + + + {0} ({1}) + , + + + afar + abkhasisk + achinesisk + acoli + adangme + adyghe + avestisk + afrikaans + afroasiatisk språk + afrihili + ainu + akan + akkadisk + aleutisk + algonkinsk språk + sør-altai + amharisk + aragonsk + gammalengelsk + angika + apache-språk + arabisk + arameisk + araukansk + arapaho + kunstig språk + arawak + assamisk + asturisk + athapaskansk språk + australsk språk + avarisk + awadhi + aymara + aserbajdsjansk + basjkirsk + banda + bamilekisk språk + baluchi + balinesisk + basa + baltisk språk + kviterussisk + beja + bemba + berbisk + bulgarsk + bihari + bhojpuri + bislama + bikol + bini + siksika + bambara + bengali + bantu + tibetansk + bretonsk + braj + bosnisk + batak + burjatisk + buginesisk + blin + katalansk + caddo + sentralamerikansk indiansk språk + karibisk + kaukasisk språk + atsam + tsjetsjensk + cebuansk + keltisk språk + chamorro + chibcha + chagatai + chuukesisk + mari + chinook + choctaw + chipewiansk + cherokee + cheyenne + kamisk språk + korsikansk + koptisk + engelskbasert kreol- eller pidginspråk + franskbasert kreol- eller pidginspråk + portugisiskbasert kreol- eller pidginspråk + cree + krimtatarisk + kreol- eller pidginspråk + tsjekkisk + kasjubisk + kyrkjeslavisk + kusjitisk språk + tsjuvansk + walisisk + dansk + dakota + dargwa + dayak + tysk + austerriksk tysk + sveitsisk høgtysk + delaware + slavej + dogrib + dinka + dogri + dravidisk språk + lågsorbisk + duala + mellumnederlandsk + divehi + dyula + dzongkha + ewe + efik + gammalegyptisk + ekajuk + gresk + elamittisk + engelsk + kanadisk engelsk + engelsk (amerikansk) + mellomengelsk + esperanto + spansk + latinamerikansk spansk + iberisk spansk + estisk + baskisk + ewondo + persisk + fang + fanti + fulani + finsk + filippinsk + finsk-ugrisk språk + fijiansk + færøysk + fon + fransk + kanadisk fransk + sveitsisk fransk + mellomfransk + gammalfransk + nordfrisisk + austfrisisk + friuliansk + vestfrisisk + irsk + ga + gayo + gbaya + skotsk-gælisk + germansk språk + ges + kiribatisk + galicisk + mellomhøgtysk + guarani + gammalhøgtysk + gondi + gorontalo + gotisk + grebo + gammalgresk + sveitsertysk + gujarati + manx + gwichin + hausa + haida + hawaiisk + hebraisk + hindi + hiligaynon + himachali + hettittisk + hmong + hiri motu + kroatisk + høgsorbisk + haitisk + ungarsk + hupa + armensk + herero + interlingua + iban + indonesisk + interlingue + ibo + sichuan-yi + ijo + inupiak + iloko + indisk språk + indo-europeisk språk + ingusjisk + ido + iransk + irokansk språk + islandsk + italiensk + inuktitut + japansk + lojban + jødepersisk + jødearabisk + javanesisk + georgisk + karakalpakisk + kabylsk + kachin + jju + kamba + karensk + kawi + kabardisk + tyap + koro + kikongo + khasi + khoisanspråk + khotanesisk + kikuyu + kuanyama + kasakhisk + kalaallisut; grønlandsk + khmer + kimbundu + kannada + koreansk + konkani + kosraeansk + kpelle + kanuri + karachay-balkar + karelsk + kru + kurukh + kasjmiri + kurdisk + kumyk + kutenai + komi + kornisk + kirgisisk + latin + ladinsk + lahnda + lamba + luxemburgsk + lezghian + ganda + limburgisk + lingala + laotisk + mongo + lozi + litauisk + luba-katanga + luba-lulua + luiseno + lunda + luo + lushai + latvisk + maduresisk + magahi + maithili + makasar + mandingo + austronesisk + masai + moksha + mandar + mende + madagassisk + mellomirsk + marshallesisk + maori + micmac + minangkabau + anna språk + makedonsk + mon-khmerspråk + malayalam + mongolsk + mandsju + manipuri + manobospråk + moldavisk + mohawk + mossi + marathi + malayisk + maltesisk + fleire språk + mundaspråk + creek + mirandesisk + marwari + burmesisk + mayaspråk + erzya + nauru + nahuatl + nordamerikansk indiansk språk + napolitansk + bokmål + nord-ndebele + lågtysk + nepalsk + newari + ndonga + nias + niger-kordofaniansk språk + niueansk + nederlandsk + flamsk + nynorsk + norsk + nogai + gammalnorsk + n'ko + sør-ndebele + nordsotho + nubisk språk + navajo + klassisk newarisk + nyanja + nyamwezi + nyankole + nyoro + nzima + oksitansk + ojibwa + oromo + oriya + ossetisk + osage + ottomansk tyrkisk + otomisk språk + panjabi + papuisk språk + pangasinan + pahlavi + pampanga + papiamento + palauisk + gammalpersisk + filippinsk språk + fønikisk + pali + polsk + ponapisk + prakrit-språk + gammalprovençalsk + pashto + portugisisk + brasiliansk portugisisk + quechua + rajasthani + rapanui + rarotongansk + retoromansk + rundi + rumensk + romansk språk + romani + rot + russisk + aromansk + kinjarwanda + sanskrit + sandawe + jakutsk + søramerikansk indiansk språk + salishansk språk + samaritansk arameisk + sasak + santali + sardinsk + siciliansk + skotsk + sindhi + nordsamisk + selkupisk + semittisk språk + sango + gammalirsk + teiknspråk + serbokroatisk + shan + singalesisk + sidamo + sioux-språk + sino-tibetansk språk + slovakisk + slovensk + slavisk språk + samoansk + sørsamisk + samisk språk + lulesamisk + enaresamisk + skoltesamisk + shona + soninke + somali + sogdisk + songhai + albansk + serbisk + sranan tongo + serer + swati + nilo-saharaspråk + sørsotho + sundanesisk + sukuma + susu + sumerisk + svensk + swahili + klassisk syrisk + syrisk + tamil + taispråk + telugu + temne + tereno + tetum + tatsjikisk + thai + tigrinja + tigré + tivi + turkmensk + tokelau + tagalog + klingon + tlingit + tamasjek + tswana + tonga (Tonga-øyane) + tonga (Nyasa) + tok pisin + tyrkisk + tsonga + tsimshian + tatarisk + tumbuka + tupi-språk + altaisk språk + tuvalu + twi + tahitisk + tuvinisk + udmurt + uigurisk + ugaritisk + ukrainsk + umbundu + ikkje bestemt + urdu + usbekisk + vai + venda + vietnamesisk + volapyk + votisk + vallonsk + wakasjansk språk + walamo + waray + washo + sorbisk språk + wolof + kalmyk + xhosa + yao + yapesisk + jiddisk + joruba + jupisk språk + zhuang + zapotec + blissymbol + zenaga + kinesisk + forenkla kinesisk + tradisjonell kinesisk + zande + zulu + zuni + utan språkleg innhald + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + verda + Afrika + Nord-Amerika + Sør-Amerika + Oseania + Vest-Afrika + Sentral-Amerika + Aust-Afrika + Nord-Afrika + Sentral-Afrika + Sørlege Afrika + Amerika + nordlege Amerika + Karibia + Aust-Asia + Sør-Asia + Søraust-Asia + Sør-Europa + Australia og New Zealand + Melanesia + Mikronesia + Polynesia + Sørlege Sentral-Asia + Asia + Sentral-Asia + Vest-Asia + Europa + Aust-Europa + Nord-Europa + Vest-Europa + Samveldet av uavhengige statar + Latin-Amerika og Karibia + Kanaløyane + Andorra + Dei sameinte arabiske emirata + Afghanistan + Antigua og Barbuda + Anguilla + Albania + Armenia + Dei nederlandske Antillane + Angola + Antarktis + Argentina + Amerikansk Samoa + Austerrike + Australia + Aruba + Åland + Aserbajdsjan + Bosnia og Hercegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei Darussalam + Bolivia + Brasil + Bahamas + Bhutan + Bouvetøya + Botswana + Kviterussland + Belize + Canada + Kokosøyane + Kongo-Kinshasa + Den sentralafrikanske republikken + Kongo-Brazzaville + Sveits + Elfenbeinskysten + Cookøyane + Chile + Kamerun + Kina + Colombia + Costa Rica + Serbia og Montenegro + Cuba + Kapp Verde + Christmasøya + Kypros + Tsjekkia + Tyskland + Djibouti + Danmark + Dominica + Den dominikanske republikken + Algerie + Ecuador + Estland + Egypt + Vest-Sahara + Eritrea + Spania + Etiopia + Finland + Fiji + Falklandsøyane + Mikronesiaføderasjonen + Færøyane + Frankrike + Gabon + Storbritannia + Grenada + Georgia + Fransk Guyana + Guernsey + Ghana + Gibraltar + Grønland + Gambia + Guinea + Guadeloupe + Ekvatorial-Guinea + Hellas + Sør-Georgia og Sør-Sandwich-øyane + Guatemala + Guam + Guinea-Bissau + Guyana + Hong Kong S.A.R. (Kina) + Heard- og McDonaldsøyane + Honduras + Kroatia + Haiti + Ungarn + Indonesia + Irland + Israel + Man + India + Britiske område i Det indiske hav + Irak + Iran + Island + Italia + Jersey + Jamaica + Jordan + Japan + Kenya + Kirgisistan + Kambodsja + Kiribati + Komorene + St. Christopher og Nevis + Nord-Korea + Sør-Korea + Kuwait + Caymanøyane + Kasakhstan + Laos + Libanon + St. Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litauen + Luxembourg + Latvia + Libya + Marokko + Monaco + Moldova + Montenegro + Saint Martin + Madagaskar + Marshalløyane + Makedonia + Mali + Myanmar + Mongolia + Macao S.A.R. (Kina) + Nord-Marianane + Martinique + Mauritania + Montserrat + Malta + Mauritius + Maldivane + Malawi + Mexico + Malaysia + Mosambik + Namibia + Ny-Caledonia + Niger + Norfolkøyane + Nigeria + Nicaragua + Nederland + Noreg + Nepal + Nauru + Niue + New Zealand + Oman + Panama + Peru + Fransk Polynesia + Papua Ny-Guinea + Filippinane + Pakistan + Polen + St. Pierre og Miquelon + Pitcairn + Puerto Rico + Palestinsk territorium + Portugal + Palau + Paraguay + Qatar + Ytre Oseania + Den europeiske unionen + Réunion + Romania + Serbia + Russland + Rwanda + Saudi Arabia + Salomonøyane + Seychellane + Sudan + Sverige + Singapore + Saint Helena + Slovenia + Svalbard og Jan Mayen + Slovakia + Sierra Leone + San Marino + Senegal + Somalia + Surinam + São Tomé og Príncipe + El Salvador + Syria + Swaziland + Turks- og Caicosøyane + Tchad + Franske sørområde + Togo + Thailand + Tadsjikistan + Tokelau + Aust-Timor + Turkmenistan + Tunisia + Tonga + Tyrkia + Trinidad og Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + USAs ytre småøyar + USA + Uruguay + Usbekistan + Vatikanstaten + St. Vincent og Grenadinane + Venezuela + Jomfruøyane (britisk) + Jomfruøyane (USA) + Vietnam + Vanuatu + Wallis og Futuna + Samoa + Yemen + Mayotte + Sør-Afrika + Zambia + Zimbabwe + (ukjent eller ugyldig område) + + + tradisjonell tysk ortografi + standardisert resisk ortografi + tysk ortografi frå 1996 + nyare mellomfransk til 1606 + eldre nyfransk + austarmensk + vestarmensk + samla tyrkisk-latinsk alfabet + san giorgio- og biladialekt + boontling + det internasjonale fonetiske alfabetet (IPA) + det uralske fonetiske alfabetet UPA + resian, lipovazdialekt + monotonisk rettskriving + natisonedialekt + gniva- og njivadialekt + oseacco- og osojanedialekt + polytonisk rettskriving + dataspråk + revidert rettskriving + resisk dialekt + saaho-dialekt + skotsk standard engelsk + scouse-dialekt + stolvizza- og solbicadialekt + taraskievica-ortografi + valensisk dialekt + + + kalender + kollasjon + valuta + + + tradisjonell kinesisk sortering + buddhistisk kalender + kinesisk kalender + direkte sortering + forenkla kinesisk sortering + gregoriansk kalender + hebraisk kalender + indisk nasjonalkalender + islamsk kalender + islamsk sivil kalender + japansk kalender + telefonkatalogsortering + pinyin-sortering + kalender for Republikken Kina + streksortering + tradisjonell sortering + + + amerikansk + metrisk + + + Språk: {0} + Skrift: {0} + Område: {0} + + + + [a à b-e é f-o ó ò ô p-z æ ø å] + [á ǎ č ç đ è ê ń ñ ŋ š ŧ ü ž ä ö] + [a-z] + + + « + » + “ + ” + + + {0}−{1} + + + + + + jan + feb + mar + apr + mai + jun + jul + aug + sep + okt + nov + des + + + januar + februar + mars + april + mai + juni + juli + august + september + oktober + november + desember + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + sø. + må. + ty. + on. + to. + fr. + la. + + + søndag + måndag + tysdag + onsdag + torsdag + fredag + laurdag + + + + + må. + la. + + + S + M + T + O + T + F + L + + + + + + + K1 + K2 + K3 + K4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + formiddag + ettermiddag + + + f.Kr. + e.Kr. + + + f.Kr. + e.Kr. + + + + + + EEEE d. MMMM y + + + + + d. MMMM y + + + + + d. MMM. y + + + + + dd.MM.yy + + + + + + + 'kl'. HH.mm.ss zzzz + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + d. MMMM + dd.MM + h.mm a + h.mm.ss a + mm.ss + MM.yy + Q yy + MMMM y + + + {0} – {1} + + M–M + + + E. dd.MM–E. dd.MM + E. dd.MM–E. dd.MM + + + MMM.–MMM. + + + E. d. MMM.–E. d. MMM. + E. d.–E. d. MMM. + + + d. MMM.–d. MMM. + d.–d. MMM + + + dd.MM–dd.MM + dd.MM–dd.MM + + + d.–d. + + + 5–06 + + + HH.mm–HH.mm + HH.mm–HH.mm + + + HH.mm–HH.mm v + HH.mm–HH.mm v + + + HH–HH v + + + y–y + + + MM.yy–MM.yy + MM.yy–MM.yy + + + E. dd.MM.yy–E. dd.MM.yy + E. dd.MM.yy–E. dd.MM.yy + E. dd.MM.yy–E. dd.MM.yy + + + MMM.–MMM. y + MMM. y–MMM. y + + + E. d. MMM.–E. d. MMM. y + E. d.–E. d. MMM. y + E. d. MMM. y–E. d. MMM. y + + + d. MMM.–d. MMM. y + d.–d. MMM. y + d. MMM. y–d. MMM. y + + + dd.MM.yy–dd.MM.yy + dd.MM.yy–dd.MM.yy + dd.MM.yy–dd.MM.yy + + + + + + æra + + + år + + + månad + + + veke + + + dag + for tre dagar sidan + i forgårs + i går + i dag + i morgon + i overmorgon + om tre dagar + + + vekedag + + + f.m./e.m.-val + + + time + + + minutt + + + sekund + + + sone + + + + + + +HH.mm;-HH.mm + GMT{0} + {0} + {1} ({0}) + + ukjend + + + Sørpolen + + + Belém + + + Påskeøya + + + Kapp Verde + + + Kanariøyane + + + Godthåb + + + Hongkong + + + Luxemburg + + + Ulan Bator + + + Mauritania + + + Maldivane + + + Mexico by + + + Cancún + + + Azorane + + + Lisboa + + + Moskva + + + Center, Nord-Dakota + + + Tasjkent + + + + sentralafrikansk tid + + + + + austafrikansk tid + + + + + sørafrikansk tid + sørafrikansk standardtid + + + + + vestafrikansk tid + vestafrikansk sommartid + + + + + Central Time + Central Standard Time + Central Daylight Time + + + + + AMT (Armenia) + AMST (Armenia) + + + + + sentralaustralsk tid + sentralaustralsk standardtid + sentralaustralsk sommartid + + + + + vest-sentralaustralsk tid + vest-sentralaustralsk standardtid + vest-sentralaustralsk sommartid + + + + + austaustralsk tid + austaustralsk standardtid + austaustralsk sommartid + + + + + vestaustralsk tid + vestaustralsk standardtid + vestaustralsk sommartid + + + + + CST (Kina) + CDT (Kina) + + + + + sentraleuropeisk tid + sentraleuropeisk sommartid + + + + + austeuropeisk tid + austeuropeisk sommartid + + + + + vesteuropeisk tid + vesteuropeisk sommartid + + + + + Greenwich middeltid + + + + + IST (Israel) + + + + + + + , +   + ; + % + 0 + # + + + − + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + andorransk peseta + + + UAE dirham + + + afghani (1927-2002) + + + afghani + AFN + + + albansk lek + + + armensk dram + + + nederlansk antillegylden + ANG + + + angolsk kwanza + AOA + + + angolsk kwanza (1977-1990) + + + angolsk ny kwanza (1990-2000) + + + angolsk kwanza reajustado (1995-1999) + + + argentisk austral + ARA + + + ARL + + + ARM + + + argentinsk peso (1983-1985) + + + argentinsk peso + ARS + + + austerriksk schilling + + + australsk dollar + AUD + + + arubisk gylden + AWG + + + aserbaijansk manat + + + aserbajdsjansk manat + aserbajdsjansk manat + aserbajdsjanske manat + AZN + + + bosnisk-hercegovinsk dinar + + + bosnisk-hercegovinsk mark (konvertibel) + BAM + + + barbadisk dollar + BBD + + + bangladeshisk taka + BDT + + + belgisk franc (konvertibel) + + + belgisk franc + BEF + + + belgisk franc (finansiell) + + + bulgarsk hard lev + + + bulgarsk ny lev + + + bahrainsk dinar + BHD + + + burundisk franc + BIF + + + bermudisk dollar + BMD + + + bruneisk dollar + BND + + + boliviano + BOB + + + bolivisk peso + BOP + + + bolivisk mvdol + + + brasiliansk cruzeiro novo (1967-1986) + BRB + + + brasiliansk cruzado + BRC + + + brasiliansk cruzeiro (1990-1993) + BRE + + + brasiliansk real + BRL + + + brasiliansk cruzado novo + BRN + + + brasiliansk cruzeiro + BRR + + + BRZ + + + bahamisk dollar + BSD + + + bhutansk ngultrum + BTN + + + burmesisk kyat + + + botswansk pula + botswansk pula + botswanske pula + + + kviterussisk ny rubel (1994-1999) + kviterussisk ny rubel (BYB) + kviterussiske nye rublar (BYB) + + + kviterussisk rubel + kviterussisk rubel + kviterussiske rublar + + + belizisk dollar + belizisk dollar + beliziske dollar + BZD + + + kanadisk dollar + kanadisk dollar + kanadiske dollar + CAD + + + kongolesisk franc + kongolesisk franc + kongolesiske franc + + + WIR euro + WIR euro + WIR euro + + + sveitsisk franc + sveitsisk franc + sveitsiske franc + CHF + + + WIR franc + WIR franc + WIR franc + + + CLE + + + chilensk unidades de fomento + chilensk unidades de fomento + chilenske unidades de fomento + + + chilensk peso + chilensk peso + chilenske peso + CLP + + + kinesisk yuan renminbi + + + colombiansk peso + colombiansk peso + colombianske peso + COP + + + unidad de valor real + unidad de valor real + unidad de valor real + + + costaricansk colon + costaricansk colon + costaricanske colon + CRC + + + gammal serbisk dinar + gammal serbisk dinar + gamle serbiske dinarar + + + tsjekkoslovakisk koruna (hard) + tsjekkoslovakisk koruna (hard) + tsjekkoslovakiske koruna (hard) + + + kubansk peso + kubansk peso + kubanske peso + + + kappverdisk escudo + CVE + + + kypriotisk pund + kypriotisk pund + kypriotiske pund + CYP + + + tsjekkisk koruna + tsjekkisk koruna + tsjekkiske koruna + CZK + + + austtysk mark + austtysk mark + austtyske mark + + + tysk mark + tysk mark + tyske mark + DEM + + + djiboutisk franc + djiboutisk franc + djiboutiske franc + + + dansk krone + + + dominikansk peso + dominikansk peso + dominikanske peso + DOP + + + algerisk dinar + algerisk dinar + algeriske dinarar + + + ecuadoriansk sucre + ecuadoriansk sucre + ecuadorianske sucre + + + ecuadoriansk unidad de valor constante (UVC) + ecuadoriansk unidad de valor constante (UVC) + ecuadorianske unidad de valor constante (UVC) + + + estisk kroon + estisk kroon + estiske kroon + + + egyptisk pund + egyptisk pund + egyptiske pund + + + eritreisk nakfa + eritreisk nakfa + eritreiske nakfa + + + spansk peseta (A-konto) + spansk peseta (A-konto) + spanske peseta (A-konto) + + + spansk peseta (konvertibel konto) + spansk peseta (konvertibel konto) + spanske peseta (konvertibel konto) + + + spansk peseta + spansk peseta + spanske peseta + + + etiopisk birr + etiopisk birr + etiopiske birr + + + euro + EUR + + + finsk mark + finsk mark + finske mark + + + fijiansk dollar + fijiansk dollar + fijianske dollar + FJD + + + Falkland-pund + Falkland-pund + Falkland-pund + FKP + + + fransk franc + fransk franc + franske franc + FRF + + + britisk pund sterling + GBP + + + georgisk kupon larit + georgisk kupon larit + georgiske kupon larit + + + georgisk lari + georgisk lari + georgiske lari + + + ghanesisk cedi (1979-2007) + ghanesisk cedi (GHC) + ghanesiske cedi (GHC) + GHC + + + ghanesisk cedi + ghanesisk cedi + ghanesiske cedi + GHS + + + gibraltarsk pund + gibraltarsk pund + gibraltarske pund + GIP + + + gambisk dalasi + gambisk dalasi + gambiske dalasi + + + guineansk franc + guineansk franc + guineanske franc + + + guineansk syli + guineansk syli + guineanske syli + + + ekvatorialguineansk ekwele guineana + ekvatorialguineansk ekwele + ekvatorialguineanske ekwele + + + gresk drakme + gresk drakme + greske drakmer + + + guatemalansk quetzal + guatemalansk quetzal + guatemalanske quetzal + + + portugisisk guinea escudo + portugisisk guinea escudo + portugisiske guinea escudo + + + Guinea-Bissau-peso + + + guyansk dollar + guyansk dollar + guyanske dollar + + + Hongkong-dollar + Hongkong-dollar + Hongkong-dollar + + + honduransk lempira + honduransk lempira + honduranske lempira + + + kroatisk dinar + kroatisk dinar + kroatiske dinarar + + + kroatisk kuna + kroatisk kuna + kroatiske kuna + + + haitisk gourde + haitisk gourde + haitiske gourde + + + ungarsk forint + ungarsk forint + ungarske forintar + + + indonesisk rupi + indonesisk rupi + indonesiske rupiar + + + irsk pund + irsk pund + irske pund + + + israelsk pund + israelsk pund + israelske pund + + + israelsk ny shekel + israelsk ny shekel + israelske nye sheklar + + + indisk rupi + INR + + + iraksk dinar + irakisk dinar + irakiske dinarar + + + iransk rial + iransk rial + iranske rialar + + + islandsk krone + islandsk krone + islandske kroner + + + italiensk lire + italiensk lire + italienske lire + + + jamaikansk dollar + jamaikansk dollar + jamaikanske dollar + + + jordansk dinar + jordansk dinar + jordanske dinarar + + + japansk yen + JPY + + + kenyansk shilling + kenyansk shilling + kenyanske shilling + + + kirgisisk som + kirgisisk som + kirgisiske som + + + kambodsjansk riel + kambodsjansk riel + kambodsjanske riel + + + komorisk franc + komorisk franc + komoriske franc + + + nordkoreansk won + nordkoreansk won + nordkoreanske won + + + sørkoreansk won + sørkoreansk won + sørkoreanske won + + + kuwaitisk dinar + kuwaitisk dinar + kuwaitiske dinarar + + + caymansk dollar + caymansk dollar + caymanske dollar + + + kasakhstansk tenge + kasakhstansk tenge + kasakhstanske tenge + + + laotisk kip + laotisk kip + laotiske kip + + + libanesisk pund + libanesisk pund + libanesiske pund + + + srilankisk rupi + srilankisk rupi + srilankiske rupiar + + + liberisk dollar + liberisk dollar + liberiske dollar + + + lesothisk loti + lesothisk loti + lesothiske loti + + + litauisk lita + litauisk lita + litauiske lita + + + litauisk talona + litauisk talona + litauiske talona + + + luxemburgsk konvertibel franc + luxemburgsk konvertibel franc + luxemburgske konvertible franc + + + luxemburgsk franc + luxemburgsk franc + luxemburgske franc + + + luxemburgsk finansiell franc + luxemburgsk finansiell franc + luxemburgske finansielle franc + + + latvisk lat + latvisk lat + latviske lat + + + latvisk rubel + latvisk rubel + latviske rublar + + + libysk dinar + libysk dinar + libyske dinarar + + + marokkansk dirham + marokkansk dirham + marokkanske dirham + + + marokkansk franc + marokkansk franc + marokkanske franc + + + moldovsk leu + moldovsk leu + moldovske lei + + + madagassisk ariary + madagassisk ariary + madagassiske ariary + + + madagassisk franc + madagassisk franc + madagassiske franc + + + makedonsk denar + makedonsk denar + makedonske denarar + + + malisk franc + malisk franc + maliske franc + + + myanmarsk kyat + myanmarsk kyat + myanmarske kyat + + + mongolsk tugrik + mongolsk tugrik + mongolske tugrik + + + makaosk pataca + makaosk pataca + makaoske pataca + + + mauritansk ouguiya + mauritansk ouguiya + mauritanske ouguiya + + + maltesisk lira + maltesisk lira + maltesiske lira + + + maltesisk pund + maltesisk pund + maltesiske pund + + + mauritansk rupi + mauritansk rupi + mauritanske rupiar + + + maldivisk rufiyaa + maldivisk rufiyaa + maldiviske rufiyaa + + + malawisk kwacha + malawisk kwacha + malawiske kwacha + + + meksikansk peso + meksikansk peso + meksikanske peso + + + meksikansk sølvpeso (1861-1992) + meksikansk sølvpeso (MXP) + meksikanske sølvpeso (MXP) + + + meksikansk unidad de inversion (UDI) + meksikansk unidad de inversion (UDI) + meksikanske unidad de inversion (UDI) + + + malaysisk ringgit + malaysisk ringgit + malaysiske ringgit + + + mosambikisk escudo + mosambikisk escudo + mosambikiske escudo + + + gammal mosambikisk metical + gammal mosambikisk metical + gamle mosambikiske metical + + + mosambikisk metical + + + namibisk dollar + namibisk dollar + namibiske dollar + + + nigeriansk naira + nigeriansk naira + nigerianske naira + + + nicaraguansk cordoba + nicaraguansk cordoba + nicaraguanske cordoba + + + nicaraguansk cordoba oro + nicaraguansk cordoba oro + nicaraguanske cordoba oro + + + nederlandsk gylden + nederlandsk gylden + nederlandske gylden + + + norsk krone + kr + + + nepalsk rupi + nepalsk rupi + nepalske rupiar + + + new zealandsk dollar + new zealandsk dollar + new zealandske dollar + + + omansk rial + omansk rial + omanske rial + + + panamansk balboa + panamansk balboa + panamanske balboa + + + peruansk inti + peruansk inti + peruanske inti + + + peruansk nuevo sol + peruansk nuevo sol + peruanske nuevo sol + + + peruansk sol + peruansk sol + peruanske sol + + + papuansk kina + papuansk kina + papuanske kina + + + filippinsk peso + filippinsk peso + filippinske peso + + + pakistansk rupi + pakistansk rupi + pakistanske rupiar + + + polsk zloty + polsk zloty + polske zloty + + + polsk zloty (1950-1995) + polsk zloty (PLZ) + polske zloty (PLZ) + + + portugisisk escudo + portugisisk escudo + portugisiske escudo + + + paraguayansk guarani + paraguayansk guarani + paraguayanske guarani + + + qatarsk rial + qatarsk rial + qatarske rial + + + rhodesisk dollar + rhodesisk dollar + rhodesiske dollar + + + gammal rumensk leu + gammal rumensk leu + gamle rumenske lei + + + rumensk leu + rumensk leu + rumenske lei + + + serbisk dinar + serbisk dinar + serbiske dinarar + + + russisk rubel + + + russisk rubel (1991-1998) + russisk rubel (RUR) + russiske rublar (RUR) + + + rwandisk franc + rwandisk franc + rwandiske franc + + + saudiarabisk rial + saudiarabisk rial + saudiarabiske rial + + + salomonsk dollar + salomonsk dollar + salomonske dollar + + + seychellisk rupi + seychellisk rupi + seychelliske rupiar + + + gammal sudanesisk dinar + gammal sudansk dinar + gamle sudanske dinarar + + + sudansk pund + sudansk pund + sudanske pund + + + gammalt sudanesisk pund + gammalt sudansk pund + gamle sudanske pund + + + svensk krone + svensk krone + svenske kroner + + + singaporsk dollar + singaporsk dollar + singaporske dollar + + + sankthelensk pund + sankthelensk pund + sankthelenske pund + + + slovensk tolar + slovensk tolar + slovenske tolar + + + slovakisk koruna + slovakisk koruna + slovakiske koruna + + + sierraleonsk leone + sierraleonsk leone + sierraleonske leone + + + somalisk shilling + somalisk shilling + somaliske shilling + + + surinamsk dollar + surinamsk dollar + surinamske dollar + + + surinamsk gylden + surinamsk gylden + surinamske gylden + + + Sao Tome og Principe-dobra + + + sovjetisk rubel + sovjetisk rubel + sovjetiske rublar + + + salvadoransk colon + salvadoransk colon + salvadoranske colon + + + syrisk pund + syrisk pund + syriske pund + + + swazilandsk lilangeni + swazilandsk lilangeni + swazilandske lilangeni + + + thailandsk baht + thailandsk baht + thailandske baht + + + tadsjikisk rubel + tadsjikisk rubel + tadsjikiske rublar + + + tadsjikisk somoni + tadsjikisk somoni + tadsjikiske somoni + + + turkmensk manat + turkmensk manat + turkmenske manat + + + tunisisk dinar + tunisisk dinar + tunisiske dinarar + + + tongansk paʻanga + tongansk paʻanga + tonganske paʻanga + + + timoresisk escudo + timoresisk escudo + timoresiske escudo + + + gammal tyrkiske lire + gammal tyrkisk lire + gamle tyrkiske lire + + + tyrkisk lire + tyrkisk lire + tyrkiske lire + + + trinidadisk dollar + trinidadisk dollar + trinidadiske dollar + + + taiwansk ny dollar + taiwansk ny dollar + taiwanske nye dollar + + + tanzaniansk shilling + tanzaniansk shilling + tanzanianske shilling + + + ukrainsk hryvnia + ukrainsk hryvnia + ukrainske hryvnia + + + ukrainsk karbovanetz + ukrainsk karbovanetz + ukrainske karbovanetz + + + ugandisk shilling (1966-1987) + ugandisk shilling (UGS) + ugandiske shilling (UGS) + + + ugandisk shilling + ugandisk shilling + ugandiske shilling + + + amerikansk dollar + USD + + + amerikansk dollar (neste dag) + amerikansk dollar (neste dag) + amerikanske dollar (neste dag) + + + amerikansk dollar (same dag) + amerikansk dollar (same dag) + amerikanske dollar (same dag) + + + uruguayansk peso en unidades indexadas + uruguayansk peso en unidades indexadas + uruguayanske peso en unidades indexadas + + + uruguayansk peso (1975-1993) + uruguayansk peso (UYP) + uruguayanske peso (UYP) + + + uruguayansk peso + uruguayansk peso + uruguayanske peso + + + usbekisk sum + usbekisk sum + usbekiske sum + + + venezuelansk bolivar + venezuelansk bolivar + venezuelanske bolivar + + + venezuelansk bolivar fuerte + venezuelansk bolivar fuerte + venezuelanske bolivar fuerte + + + vietnamesisk dong + vietnamesisk dong + vietnamesiske dong + + + vanuatuisk vatu + vanuatuisk vatu + vanuatuiske vatu + + + vestsamoisk tala + vestsamoisk tala + vestsamoiske tala + + + CFA franc BEAC + CFA franc BEAC + CFA franc BEAC + + + sølv + sølv + sølv + + + gull + gull + gull + + + europeisk samansett eining + europeisk samansett eining + europeiske samansette einingar + + + europeisk monetær eining + europeisk monetær eining + europeiske monetære einingar + + + europeisk kontoeining (XBC) + europeisk kontoeining (XBC) + europeiske kontoeiningar (XBC) + + + europeisk kontoeining (XBD) + europeisk kontoeining (XBD) + europeiske kontoeiningar (XBD) + + + austkaribisk dollar + austkaribisk dollar + austkaribiske dollar + + + spesielle trekkrettar + spesiell trekkrett + spesielle trekkrettar + + + europeisk valutaeining + europeisk valutaeining + europeiske valutaeiningar + + + fransk gullfranc + fransk gullfranc + franske gullfranc + + + fransk UIC-franc + fransk UIC-franc + franske UIC-franc + + + CFA franc BCEAO + + + palladium + palladium + palladium + + + CFP franc + CFP-franc + CFP-franc + + + platina + platina + platina + + + RINET-fond + RINET-fond + RINET-fond + + + testvalutakode + testvalutakode + testvalutakode + + + ukjend eller ugyldig valuta + ukjend/ugyldig valuta + ukjend eller ugyldig valuta + + + jemenittisk dinar + jemenittisk dinar + jemenittiske dinarar + + + jemenittisk rial + jemenittisk rial + jemenittiske rialar + + + jugoslavisk dinar (hard) + jugoslavisk dinar (hard) + jugoslaviske dinarar (hard) + + + jugoslavisk noviy-dinar + jugoslaviske noviy-dinarar + + + jugoslavisk konvertibel dinar + jugoslavisk konvertibel dinar + jugoslaviske konvertible dinarar + + + sørafrikansk rand (finansiell) + + + sørafrikansk rand + + + zambisk kwacha + + + zairisk ny zaire + + + zairisk zaire + + + zimbabwisk dollar + + + + + + {0} dag + {0} dagar + + + {0} time + {0} timar + + + {0} minutt + {0} minutt + + + {0} månad + {0} månader + + + {0} sekund + {0} sekund + + + {0} veke + {0} veker + + + {0} år + {0} år + + + + + ja:j + nei:n + + + + diff --git a/lib/zend/Zend/Locale/Data/nn_NO.xml b/lib/zend/Zend/Locale/Data/nn_NO.xml new file mode 100644 index 0000000000..4d40db4f69 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nn_NO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/no.xml b/lib/zend/Zend/Locale/Data/no.xml new file mode 100644 index 0000000000..a58c03d17f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/no.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/nr.xml b/lib/zend/Zend/Locale/Data/nr.xml new file mode 100644 index 0000000000..9dff206f5e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nr.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + isiNdebele + + + + [a-z] + + + ‘ + ’ + “ + ” + + + + + + + + Jan + Feb + Mat + Apr + Mey + Jun + Jul + Arh + Sep + Okt + Usi + Dis + + + Janabari + uFeberbari + uMatjhi + u-Apreli + Meyi + Juni + Julayi + Arhostosi + Septemba + Oktoba + Usinyikhaba + Disemba + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Son + Mvu + Bil + Tha + Ne + Hla + Gqi + + + uSonto + uMvulo + uLesibili + Lesithathu + uLesine + ngoLesihlanu + umGqibelo + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BC + AD + + + BC + AD + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + diff --git a/lib/zend/Zend/Locale/Data/nr_ZA.xml b/lib/zend/Zend/Locale/Data/nr_ZA.xml new file mode 100644 index 0000000000..d637dd2e78 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nr_ZA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/nso.xml b/lib/zend/Zend/Locale/Data/nso.xml new file mode 100644 index 0000000000..3aac3945c5 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nso.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + Sesotho sa Leboa + + + + [a b d e ê f-o ô p r s š t u w-y] + [c q v z] + [a-z] + + + ‘ + ’ + “ + ” + + + + + + + + Jan + Feb + Mat + Apo + Mei + Jun + Jul + Ago + Set + Okt + Nof + Dis + + + Janaware + Feberware + Matšhe + Aporele + Mei + June + Julae + Agostose + Setemere + Oktobore + Nofemere + Disemere + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Son + Mos + Bed + Rar + Ne + Hla + Mok + + + Sontaga + Mosupalogo + Labobedi + Laboraro + Labone + Labohlano + Mokibelo + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BC + AD + + + BC + AD + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + diff --git a/lib/zend/Zend/Locale/Data/nso_ZA.xml b/lib/zend/Zend/Locale/Data/nso_ZA.xml new file mode 100644 index 0000000000..605e3a1c3e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/nso_ZA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/numberingSystems.xml b/lib/zend/Zend/Locale/Data/numberingSystems.xml new file mode 100644 index 0000000000..3a0287a463 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/numberingSystems.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ny.xml b/lib/zend/Zend/Locale/Data/ny.xml new file mode 100644 index 0000000000..5b7e06bb3e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ny.xml @@ -0,0 +1,189 @@ + + + + + + + + + + [a-p r-u w ŵ y z] + [q v x] + + + + + + + + Jan + Feb + Mal + Epu + Mei + Jun + Jul + Oga + Sep + Oku + Nov + Dis + + + Januwale + Febuluwale + Malichi + Epulo + Mei + Juni + Julai + Ogasiti + Seputemba + Okutoba + Novemba + Disemba + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Mul + Lem + Wir + Tat + Nai + San + Wer + + + Lamulungu + Lolemba + Lachiwiri + Lachitatu + Lachinayi + Lachisanu + Loweruka + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BC + AD + + + BC + AD + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Malawian Kwacha + + + + diff --git a/lib/zend/Zend/Locale/Data/ny_MW.xml b/lib/zend/Zend/Locale/Data/ny_MW.xml new file mode 100644 index 0000000000..fbeb6f1c8a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ny_MW.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/oc.xml b/lib/zend/Zend/Locale/Data/oc.xml new file mode 100644 index 0000000000..e6b05b373d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/oc.xml @@ -0,0 +1,280 @@ + + + + + + + + + + + arabi + lenga artificiala + azerbaijani + berbèr + breton + catalan + lenga celtica + danés + aleman + grec + anglés + espanhòl + bàscol + francés + francés mejan + grec ancian + ebreu + armèni + italian + latin + flamenc + occitan + fenician + occitan ancian + portugués + lenga romança + chinés + + + + + + + + + + + + + + + + + Africa + America centrala + Americas + Austràlia e Nòva Zelanda + Asia + Asia centrala + Euròpa + Andòrra + Afganistan + Antigua e Barbuda + Anguilla + Albania + Armènia + Angòla + Antartica + Argentina + Samòa americana + Àustria + Austràlia + Azerbaijan + Bòsnia e Ercegovina + Barbados + Bangladesh + Belgica + Burkina Faso + Bolgària + Bahrain + Burundi + Benin + Bermuda + Brunei + Bolívia + Brasil + Bahamas + Botan + Isla Bouvet + Botswana + Bielorussia + Belize + Canadà + Còngo - Kinshasa + Republica Centraficana + Còngo - Brazzaville + Soïssa + Còsta d'Evòri + Chile + Cameron + China + Colómbia + Còsta Rica + Cuba + Cap Verd + Chipre + Republica chèca + Alemanha + Jiboti + Danemarc + Republica dominicana + Argeria + Eqüator + Estònia + Egipte + Eritrèa + Espanha + Etiopia + Finlàndia + Fiji + França + Gabon + Reiaume Unit + Guiana francesa + Guinèa Eqüatoriala + Croàcia + Israèl + Índia + Itàlia + Japon + Cambòja + Comòros + Corèa del Nòrd + Corèa del Sud + Islas Caiman + Cazacstan + Libia + Marròc + Mónegue + Birmania + Mauritània + Moçambic + Peró + Portugal + Belau + Union Europèa + Russia + Arabia Saudita + Lo Salvador + Súria + Chad + Timòr Èst + Ucràina + Estats Units + Veneçuèla + Vietnam + Desconegut o Region invalida + + + calendier + òrde alfabetic + moneda + + + Lenga: {0} + Escritura: {0} + Region: {0} + + + + [a á à b-e é è f-i í ï j-o ó ò p-u ú ü v-z] + [á à ç é è í ï ó ò ú ü] + [a-z] + + + + + + + + genièr + febrièr + març + abril + mai + junh + julhet + agost + setembre + octòbre + novembre + dezembre + + + + + + + Dimenge + diluns + dimarç + dimècres + dijòus + divèndres + dissabte + + + + + + era + + + annada + + + mes + + + setmana + + + jorn + ièr + uèi + deman + + + jorn de la setmana + + + ora + + + minuta + + + segonda + + + zòna + + + + + + Ora de: {0} + + + + + + euro + + + + + + {0} jorns + + + {0} oras + + + {0} minutas + + + {0} mes + + + {0} segondas + + + {0} setmanas + + + {0} annadas + + + diff --git a/lib/zend/Zend/Locale/Data/oc_FR.xml b/lib/zend/Zend/Locale/Data/oc_FR.xml new file mode 100644 index 0000000000..2c373fd766 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/oc_FR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/om.xml b/lib/zend/Zend/Locale/Data/om.xml new file mode 100644 index 0000000000..06564e0c43 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/om.xml @@ -0,0 +1,328 @@ + + + + + + + + + + + Afrikoota + Afaan Sidaamaa + Arabiffaa + Afaan Azerbaijani + Afaan Belarusia + Afaan Bulgariya + Afaan Bihari + Afaan Baangladeshi + Afaan Bosniyaa + Afaan Katalaa + Afaan Czech + Welishiffaa + Afaan Deenmaark + Afaan Jarmanii + Afaan Giriiki + Ingliffa + Afaan Esperantoo + Afaan Ispeen + Afaan Istooniya + Afaan Baskuu + Afaan Persia + Afaan Fiilaandi + Afaan Filippinii + Afaan Faroese + Afaan Faransaayii + Afaan Firisiyaani + Afaan Ayirishii + Scots Gaelic + Afaan Galishii + Afaan Guarani + Afaan Gujarati + Afaan Hebrew + Afaan Hindii + Afaan Croatian + Afaan Hangaari + Interlingua + Afaan Indoneziya + Ayiislandiffaa + Afaan Xaaliyaani + Afaan Japanii + Afaan Java + Afaan Georgian + Afaan Kannada + Afaan Korea + Afaan Laatini + Afaan Liituniyaa + Afaan Lativiyaa + Afaan Macedooniyaa + Malayaalamiffaa + Afaan Maratii + Malaayiffaa + Afaan Maltesii + Afaan Nepalii + Afaan Dachii + Afaan Norwegian + Afaan Norweyii + Afaan Occit + Oromoo + Afaan Punjabii + Afaan Polandii + Afaan Porchugaal + Afaan Portugali (Braazil) + Afaan Protuguese + Afaan Romaniyaa + Afaan Rushiyaa + Afaan Sinhalese + Afaan Slovak + Afaan Islovaniyaa + Afaan Albaniyaa + Afaan Serbiya + Afaan Sudaanii + Afaan Suwidiin + Suwahilii + Afaan Tamilii + Afaan Telugu + Afaan Tayii + Afaan Tigiree + Lammii Turkii + Afaan Kilingon + Afaan Turkii + Afaan Ukreenii + Afaan Urdu + Afaan Uzbek + Afaan Veetinam + Afaan Xhosa + Chinese + Afaan Zuulu + + + + + + Brazil + China + Germany + Itoophiyaa + France + United Kingdom + India + Italy + Japan + Keeniyaa + Russia + United States + + + + [a-z] + + + + + + + + Ama + Gur + Bit + Elb + Cam + Wax + Ado + Hag + Ful + Onk + Sad + Mud + + + Amajjii + Guraandhala + Bitooteessa + Elba + Caamsa + Waxabajjii + Adooleessa + Hagayya + Fuulbana + Onkololeessa + Sadaasa + Muddee + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + Dil + Wix + Qib + Rob + Kam + Jim + San + + + Dilbata + Wiixata + Qibxata + Roobii + Kamiisa + Jimaata + Sanbata + + + + + S + M + T + W + T + F + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + WD + WB + + + KD + KB + + + + + + EEEE, MMMM d, y + + + + + dd MMMM y + + + + + dd-MMM-y + + + + + dd/MM/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + Brazilian Real + + + Chinese Yuan Renminbi + + + Itoophiyaa Birrii + + + Euro + + + British Pound Sterling + + + Indian Rupee + + + Japanese Yen + + + Russian Ruble + + + US Dollar + + + + + diff --git a/lib/zend/Zend/Locale/Data/om_ET.xml b/lib/zend/Zend/Locale/Data/om_ET.xml new file mode 100644 index 0000000000..d6ed747586 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/om_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/om_KE.xml b/lib/zend/Zend/Locale/Data/om_KE.xml new file mode 100644 index 0000000000..b4f1f7a341 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/om_KE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/or.xml b/lib/zend/Zend/Locale/Data/or.xml new file mode 100644 index 0000000000..aa152d0b21 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/or.xml @@ -0,0 +1,1142 @@ + + + + + + + + + + + ଅଫାର୍ + ଆବ୍ଖାଜିଆନ୍ + ଆଚାଇନୀଜ୍ + ଆକୋଲି + ଆଦାଙ୍ଗେମ୍ + ଅଦ୍ୟଘେ + ଅବେସ୍ତନ + ଆଫ୍ରିକାନସ୍ + ଆଫ୍ରୋ ଏସିଆଟିକ୍ ଭାଷା + ଆଫ୍ରିହିଲି + ଆଇନୁ + ଅକନ୍ + ଆକାଡିଆନ୍ + ଆଲେଇଟୁ + ଏଲ୍ଗୋନକ୍ବିନା ଭାଷା + ଦକ୍ଷିଣ ଆଲ୍ଟାଇ + ଆମହାରକି + ଆର୍ଗୋନୀ + ପୁରୁଣା ଇଁରାଜୀ + ଅଁଗୀକା + ଆପାଚୀ ଭାଷା + ଆରବିକ୍ + ଆରାମାଇକ୍ + ଆରାଉକାନିଆନ୍ + ଆରାପାହୋ + କୃତ୍ରିମ ଭାଷା + ଆରୱକ + ଆସାମୀ + ଆଷ୍ଟୁରିଆନ୍ + ଆଥପାସ୍କାନ୍ ଭାଷା + ଅଷ୍ଟ୍ରେଲିଆନ୍ ଭାଷା + ଆଭାରିକ୍ + ଆୱାଧି + ଆୟମାରା + ଆଜେରବାଇଜାନି + ବଶଖିର୍ + ବାନ୍ଦା + ବମିଲେକେ ଭାଷା + ବାଲୁଚି + ବାଲିନୀଜ୍ + ବାସା + ବାଲାଟିକ୍ ଭାଷା + ବେଲାରୁଷିଆନ୍ + ବେଜା + ବେମ୍ବା + ବେରବର୍ + ବୁଲଗେରିଆନ୍ + ବିହାରୀ + ଭୋଜପୁରୀ + ବିସଲାମା + ବିକୋଲ୍ + ବିନି + ବିକ୍ସିକା + ବାମ୍ବାରା + ବଙ୍ଗାଳୀ + ବାଣ୍ଟୁ + ତିବେତାନ୍ + ବ୍ରେଟନ୍ + ବ୍ରାଜ୍ + କାଟଲାନ୍ + ବାଟାକ୍ + ବୁରିଆଟ୍ + ବୁଗୀନୀଜ୍ + ବ୍ଲିନ୍ + କାଟାଲାନ୍ + କାଡୋ + ମଧ୍ୟ ଆମେରିକା ଭାରତୀୟ ଭାଷା + କାରିବ୍ + କାକୋଶୀ ଭାଷା + ଆତ୍ସମ୍ + ଚେଚନ୍ + ସୀବୁଆନୋ + କେଲ୍ଟ ଭାଷା + ଚାମୋରୋ + ଚିବ୍ଚା + ଛଗତାଇ + ଚୁକୀସେ + ମାରୀ + ଚିନୁକ୍ ଜାରଗାଁନ୍ + ଚୋଟୱା + ଚିପେୱାନ୍ + ଚେରୋକୀ + ଚେଚେନା + ଚାମିକ୍ ଭାଷା + କୋର୍ସିକାନ୍ + କପ୍ଟିକ୍ + ଇଁରାଜୀ ଆଧାରିତ କ୍ରେଓଲ୍ କିମ୍ବା ପିଜିନ୍ + ଫ୍ରେଞ୍ଚ ଆଧାରିତ କ୍ରେଓଲ୍ କିମ୍ବା ପିଜିନ୍ + ପର୍ତ୍ତୁଗ୍ରୀଜ୍ ଆଧାରିତ କ୍ରେଓଲ୍ କିମ୍ବା ପିଜିନ୍ + କ୍ରୀ + କ୍ରୀମିନ୍ ତୁର୍କୀସ୍ + କ୍ରେଓଲ୍ କିମ୍ବା ପିଜିନ୍ + ଚେକ୍ + କାଶୁବିଆନ୍ + ଚର୍ଚ୍ଚ ସ୍ଲାଭିକ୍ + କୁଶିତିକ୍ ଭାଷା + ଚୁଭାଶ୍ + ୱେଲ୍ସ + ଡାନ୍ନିସ୍ + ଡାକୋଟା + ଡାରାଗ୍ୱା + ଡାୟକ୍ + ଜର୍ମାନ୍ + ଅଷ୍ଟ୍ରିଆନ୍ ଜର୍ମାନ + ସ୍ବିସ୍ ହାଇ ଜର୍ମାନ୍ + ଡେଲାୱେର୍ + ସ୍ଲେଭ୍ + ଡୋଗ୍ରିବ୍ + ଦିଙ୍କା + ଡୋଗ୍ରୀ + ଦ୍ରାବିଡିଆନ୍ ଭାଷା + ନିଚଳା ସର୍ବିଆନ୍ + ଡୁଆନା + ମଧ୍ୟ ପର୍ତ୍ତୁଗାଲୀ + ଡିଭେହୀ + ଡୁଆଲା + ଭୂଟାନୀ + ଇୱେ + ଏଫିକ୍ + ପ୍ରାଚୀନ୍ ମିଶିରି + ଏକାଜୁକ୍ + ଗ୍ରୀକ୍ + ଏଲାମାଇଟ୍ + ଇଂରାଜୀ + ଅଷ୍ଟ୍ରେଲିଆନ୍ ଇଁରାଜୀ + କାନାଡିଆନ୍ ଇଁରାଜୀ + ବ୍ରିଟିଶ୍ ଇଁରାଜୀ + ୟୁ.ଏସ୍. ଇଁରାଜୀ + ମଧ୍ୟ ଇଁରାଜୀ + ଏସ୍ପାରେଣ୍ଟୋ + ସ୍ପାନିସ୍ + ଲାଟିନ୍ ଆମେରିକାନ୍ ସ୍ପାନିଶ୍ + ଲେବେରିଆନ୍ ସ୍ପାନିଶ୍ + ଏସ୍ତୋନିଆନ୍ + ବାସ୍କ୍ୱି + ଇୱୋଣ୍ଡୋ + ପର୍ସିଆନ୍ + ଫାଙ୍ଗ + ଫାଣ୍ଟି + ଫୁଲାହ + ଫିନ୍ନିସ୍ + ଫିଲିପିନୋ + ଫାଣ୍ଟିଫିନ୍ନୋ-ଉଗ୍ରୀଆନ୍ ଭାଷା + ଫିଜି + ଫାରୋଏସେ + ଫନ୍ + ଫ୍ରେଞ୍ଚ + କାନାଡିଆନ୍ ଫ୍ରେଞ୍ଚ + ସ୍ବିସ୍ ଫ୍ରେଞ୍ଚ୍ + ମଧ୍ୟ ଫ୍ରେଞ୍ଚ + ପୁରୁଣା ଫ୍ରେଞ୍ଚ + ଉତ୍ତର ଫ୍ରିସିୟାନ୍ + ପୂର୍ବ ଫ୍ରିସିୟାନ୍ + ଫ୍ରିୟୁଲୀୟାନ୍ + ପଶ୍ଚିମ ଫ୍ରିସିୟନ୍ + ଇରିସ୍ + ଗା + ଗାୟୋ + ଗବାୟା + ସ୍କଟିସ୍ ଗାଏଲିକ୍ + ଜର୍ମାନିକ୍ ଭାଷା + ଗୀଜ୍ + ଜିବ୍ରାଟୀଜ୍ + ଗାଲସିଆନ୍ + ମିଡିଲ୍ ହାଇ ଜର୍ମାନ୍ + ଗୁଆରାନୀ + ପୁରୁଣା ହାଇ ଜର୍ମାନ୍ + ଗୋଣ୍ଡି + ଗୋରୋଣ୍ଟାଲୋ + ଗୋଥିକ୍ + ଗ୍ରେବୋ + ପ୍ରାଚୀନ୍ ୟୁନାନୀ + ସ୍ବିସ୍ ଜର୍ମାନ୍ + ଗୁଜୁରାଟୀ + ମାଁକ୍ସ + ସ୍ବିଚ୍ ଇନ୍ + ହୌସା + ହାଇଡା + ହାୱାଇନ୍ + ହେବ୍ର୍ୟୁ + ହିନ୍ଦୀ + ହିଲିଗୈନନ୍ + ହିମାଚଳୀ + ହିତୀତେ + ହଁଙ୍ଗ + ହିରି ମୋଟୁ + କ୍ରୋଆଟିଆନ୍ + ଉପର ସର୍ବିଆନ୍ + ହୈତାୟିନ୍ + ହଙ୍ଗେରିଆନ୍ + ହୁପା + ଆର୍ମେନିଆନ୍ + ହେରେରୋ + ଇର୍ଣ୍ଟଲିଙ୍ଗୁଆ + ଇବାନ୍ + ଇଣ୍ଡୋନେସିଆନ୍ + ଇର୍ଣ୍ଟରଲିଙ୍ଗୁଇ + ଇଗ୍ବୋ + ସିଚୁଆନ୍ ୟୀ + ଇଜୋ + ଇନୁପିୟାକ୍ + ଇଲୋକୋ + ଇଣ୍ଡିକ୍ ଭାଷା + ଇଣ୍ଡୋ-ୟୁରୋପୀୟ ଭାଷା + ଇଁଙ୍ଗୁଶ୍ + ଇଡୋ + ଇରାନୀ ଭାଷା + ଇରୋକ୍ୱୋୟାନ୍ ଭାଷା + ଆଇସଲାଣ୍ଡିକ୍ + ଇଟାଲିଆନ୍ + ଇନକୀଟୁତ୍ + ଜାପାନୀଜ୍ + ଲୋଜବାନ୍ + ଜୁଡେଓ-ପର୍ସିଆନ୍ + ଜୁଡେଓ-ଆରବୀକ୍ + ଜାଭାନୀଜ୍ + ଜର୍ଜିଆନ୍ + କାରା-କଲ୍ପକ୍ + କବାଇଲ୍ + କଚିନ୍ + ଜ୍ଜୁ + କମ୍ବା + କାରେନ୍ + କାୱି + କାବାର୍ଡିଆନ୍ + ତ୍ୟାପ୍ + କୋରୋ + କଙ୍ଗୋ + ଖାସୀ + ଖୋସୀୟାନ୍ ଭାଷା + ଖୋତାନୀଜ୍ + କୀକୁୟୁ + କ୍ୱାନ୍ୟାମ୍ + କାଜାକ୍ + ଗ୍ରୀନଲାଣ୍ଡିକ୍ + ଖ୍ମେର୍ + କିମ୍ବୁଣ୍ଡୁ + କନ୍ନଡ + କୋରିଆନ୍ + କୋନକାନୀ + କୋସରୈନ୍ + କୈପେଲେ + କନୁରୀ + କରାଚୟ-ବଲ୍କାର + କାରେଲିୟାନ୍ + କ୍ରୁ + କୁରୁଖ + କାଶ୍ମିରୀ + କୁର୍ଦ୍ଦିଶ୍ + କୁମୀକ୍ + କୁତେନାଉ + କୋମି + କୋର୍ନିସ୍ + କିରଗିଜ୍ + ଲାଟିନ୍ + ଲାଦିନୋ + ଲାହାଣ୍ଡା + ଲାମ୍ବା + ଲକ୍ସେମବର୍ଗିସ୍ + ଲେଜଗିୟାନ୍ + ଗନ୍ଦା + ଲିମ୍ବୁର୍ଗିସ୍ + ଲିଙ୍ଗାଲା + ଲାଓ + ମଙ୍ଗୋ + ଲୋଜି + ଲିଥୁଆନିଆନ୍ + ଲ୍ୟୁବା-କାଟାଙ୍ଗା + ଲୁବା-ଲୁଲୁଆ + ଲୁଇସେନୋ + ଲୁଣ୍ଡା + ଲୁଓ + ଲୁସାଉ + ଲାଟଭିଆନ୍ + ମାଦୁରୀସ୍ + ମାଗାହୀ + ମୈଥିଳୀ + ମକାସର୍ + ମାଣ୍ଡିଙ୍ଗୋ + ଅଷ୍ଟ୍ରୋନେସିଆନ୍ + ମାସାଇ + ମୋକ୍ଷ + ମନ୍ଦାର + ମେଣ୍ଡେ + ମାଲାଗାସୀ + ମଧ୍ୟ ଇରିଶ୍ + ମାର୍ଶାଲୀଜ୍ + ମାଓରୀ + ମିକମୌକ୍ + ମିନାଙ୍ଗାବାଉ + ବିବିଧ ଭାଷା + ମାକଡୋନିଆନ୍ + ମଁନ୍-ଖ୍ମେର୍ ଭାଷା + ମାଲାୟଲମ୍ + ମଙ୍ଗୋଲିଆନ୍ + ମାଞ୍ଚୁ + ମଣିପୁରୀ + ମନୋବୋ ଭାଷା + ମୋଲଡୋଭିଆନ୍ + ମୋହୌକ + ମୋସି + ମରାଠୀ + ମାଲୟ + ମାଲଟୀଜ୍ + ବିବିଧ ଭାଷାମାନ + ମୁଣ୍ଡା ଭାଷା + କ୍ରୀକ୍ + ମିରାଣ୍ଡିଜ୍ + ମାରୱାରୀ + ବର୍ମୀଜ୍ + ମାୟା ଭାଷା + ଏର୍ଜୟା + ନାଉରୁ + ନାଉହାତି + ଉତ୍ତର ଆମେରିକା ଇଣ୍ଡିଆନ୍ ଭାଷା + ନୀପୋଲିଟାନ୍ + ନରୱେଜିଆନ୍ ବୋକମଲ୍ + ଉତ୍ତର ନେଡବେଲେ + ଲୋ ଜର୍ମାନ୍ + ନେପାଳୀ + ନେୱାରୀ + ଡୋଙ୍ଗା + ନୀୟାସ୍ + ନାଇଜର୍-କୋର୍ଡୋଫୌନିୟାନ୍ ଭାଷା + ନିୟୁଆନ୍ + ଡଚ୍ + ଫ୍ଲେମିଶ୍ + ନରୱେଜିଆନ୍ ନିୟୋର୍ସ୍କ + ନରୱେଜିଆନ୍ + ନୋଗାଇ + ପୁରୁଣା ନର୍ସ + ଏନ୍କୋ + ଦକ୍ଷିଣ ନେଡବେଲେ + ଉତ୍ତରୀ ସୋଥୋ + ନ୍ୟୁବିଆନ୍ ଭାଷା + ନାଭାଜୋ + ପାରମ୍ପରିକ ନେୱାରୀ + ନିୟାଞ୍ଜ + ନ୍ୟାମୱେଜୀ + ନ୍ୟାନକୋଲ୍ + ନ୍ୟାରୋ + ଞ୍ଜିମା + ଓସିଟାନ୍ + ଓଜିୱା + ଓରୋମୋ + ଓଡ଼ିଆ + ଓସେଟିକ୍ + ୱୌସେଜ୍ + ଓଟ୍ଟୋମନ୍ ତୁର୍କିସ୍ + ଓଟ୍ଟୋମିଆନ୍ ଭାଷା + ପଞ୍ଜାବୀ + ପାପୁଆନ୍ ଭାଷା + ପାଙ୍ଗାସିନିଆନ୍ + ପାହ୍ଲାଭି + ପାମ୍ପାଙ୍ଗା + ପାପିୟାମିଣ୍ଟୋ + ପାଲାଉଆନ୍ + ପୁରୁଣା ପର୍ସିଆନ୍ + ଫିଲିପାଇନ୍ ଭାଷା + ଫୋନେସିଆନ୍ + ପାଲି + ପୋଲିଶ୍ + ପୋହପିଏନ୍ + ପ୍ରାକୃତ ଭାଷା + ପୁରୁଣା ପ୍ରେଭେନେସିଆଲ୍ + ପାସ୍ତୋ + ପର୍ତ୍ତୁଗ୍ରୀଜ୍ + ବ୍ରାଜିଲିଆନ୍ ପର୍ତ୍ତୁଗୀଜ୍ + ଲେବେରିଆନ୍ ପର୍ତ୍ତୁଗୀଜ୍ + କ୍ୱେଚୁଆ + ରାଜସ୍ଥାନୀ + ରାପାନୁଇ + ରାରୋତୋଙ୍ଗନ୍ + ରେହେଟୋ-ରୋମାନ୍ସ + ରୁଣ୍ଡି + ରୋମାନିଆନ୍ + ରୋମାନ୍ସ ଭାଷା + ରୋମାନି + ମୂଳ + ରଷିଆନ୍ + ଆରୋମାନିଆନ୍ + କିନ୍ୟାରୱାଣ୍ଡା + ସଂସ୍କୃତ + ସଣ୍ଡାୱେ + ୟାକୁଟ୍ + ଦକ୍ଷିଣ ଆମେରିକା ଇଣ୍ଡିଆନ୍ ଭାଷା + ଶଲୀସନ୍ ଭାଷା + ସାମୌରିଟନ୍ ଆରମାଇକ୍ + ସାସାକ୍ + ସାନ୍ତାଳି + ସର୍ଦିନିଆନ୍ + ସିଶିଲିଆନ୍ + ସ୍କଟସ୍ + ସିନ୍ଧୀ + ଉତ୍ତର ସାମି + ସେଲ୍କପ୍ + ସେମିଟିକ୍ ଭାଷା + ସାଙ୍ଗୋ + ପୁରୁଣା ଇରିଶ୍ + ସାଙ୍କେତିକ ଭାଷା + ସର୍ବୋ-କ୍ରୋଆଟିଆନ୍ + ଶାନ୍ + ସିଂହଳ + ସିଦାମୋ + ସିଓନ୍ ଭାଷା + ସିନୋ-ତିବ୍ବେତାନ୍ ଭାଷା + ସ୍ଲୋଭାକ୍ + ସ୍ଲୋଭେନିଆନ୍ + ସାଲ୍ଭିକ୍ ଭାଷା + ସାମୋଆନ୍ + ଦକ୍ଷିଣ ସାମି + ସାମି ଭାଷା + ଲୁଲେ ସାମି + ଇନାରୀ ସାମି + ସ୍କୋଲ୍ଟ ସାମୀ + ଶୋନା + ସୋନିଙ୍କେ + ସୋମାଲିଆ + ସୋଗଡିଏନ୍ + ସୋଙ୍ଘାଇ + ଆଲବାନିଆନ୍ + ସର୍ବିଆନ୍ + ଶାରାନା ଟୋଙ୍ଗୋ + ଶେରେର୍ + ସ୍ବାତୀ + ନୀଲ୍ ସାହାରି ଭାଷା + ସେସୋଥୋ + ସୁଦାନୀଜ୍ + ସୁକୁମା + ଶୁଶୁ + ସୁମେରିଆନ୍ + ସ୍ୱେଡିସ୍ + ସ୍ୱାହିଲ୍ + କ୍ଲାସିକାଲ୍ ସିରିକ୍ + ସିରିକ୍ + ତାମିଲ୍ + ତାଇ ଭାଷା + ତେଲୁଗୁ + ତିମନେ + ତେରେନୋ + ତେତୁମ୍ + ତାଜିକ୍ + ଥାଇ + ଟ୍ରିଗିନିଆ + ଟାଇଗ୍ରେ + ତୀଭ୍ + ତୁର୍କମେନ୍ + ଟୋକେଲାଉ + ଟାଗାଲଗ୍ + କ୍ଲିଙ୍ଗନ୍ + ତ୍ଲିଙ୍ଗିଟ୍ + ତାମାଶେକ୍ + ସେସ୍ବାନା + ଟୋଙ୍ଗା + ନ୍ୟାସା ଟୋଙ୍ଗୋ + ଟୋକ୍ ପିସିନ୍ + ତୁର୍କିସ୍ + ସୋଂଗା + ତିସିମିସିଆନ୍ + ତାତାର୍ + ଟୁମ୍ବୁକା + ଟୁପି ଭାଷା + ଆଲ୍ଟିକ୍ ଭାଷା + ତୁଭାଲୁ + ତ୍ୱି + ତାହିତିଆନ୍ + ତୁଭିନିଆନ୍ + ଉଦମୂର୍ତ୍ତ + ୟୁଘୁର୍ + ୟୁଗୋରଟିକ୍ + ୟୁକ୍ରାନିଆନ୍ + ଉମ୍ବୁଣ୍ଡୁ + ଅଜଣା ଏବଂ ଅବୈଧ ଭାଷା + ଉର୍ଦ୍ଦୁ + ଉଜବେକ୍ + ଭାଇ + ଭେଣ୍ଡା + ଭିଏତନାମିଜ୍ + ବୋଲାପୁକ + ଭୋଟିକ୍ + ୱାଲୁନ୍ + ୱାକଶନ୍ ଭାଷା + ୱାଲମୋ + ୱାରୈ + ୱାସୋ + ସର୍ବିଆନ୍ ଭାଷା + ୱୋଲଫ୍ + କାଲ୍ମୀକ୍ + ଖୋସା + ୟାଓ + ୟାପୀସ୍ + ୟିଡିସ୍ + ୟୋରୁବା + ୟୁପିକ୍ ଭାଷା + ଜୁଆଙ୍ଗ + ଜାପୋଟେକ୍ + ବ୍ଲିସିମ୍ବଲସ୍ + ଜେନାଗା + ଚାଇନୀଜ୍ + ସରଳିକରଣ ଚାଇନୀଜ୍ + ପାରମ୍ପରିକ ଚାଇନୀଜ୍ + ଜାଣ୍ଡେ + ଜୁଲୁ + ଜୁନୀ + କୌଣସି ଲିଙ୍ଗୁଇଷ୍ଟ ସାମଗ୍ରୀ ନାହିଁ + ଜାଜା + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ବିଶ୍ବ + ଆଫ୍ରିକା + ଉତ୍ତର ଆମେରିକା + ଦକ୍ଷିଣ ଆମେରିକା + ଓସୋନିଆନ୍ + ପଶ୍ଚିମ ଆଫ୍ରିକା + ମଧ୍ୟ ଆମେରିକା + ପୂର୍ବ ଆଫ୍ରିକା + ଉତ୍ତର ଆଫ୍ରିକା + ମଧ୍ୟ ଆଫ୍ରିକା + ଦକ୍ଷିଣସ୍ଥ ଆଫ୍ରିକା + ଆମେରିକାସ୍ + ଉତ୍ତରସ୍ଥ ଆମେରିକା + କାରିବିଆନ୍ + ପୂର୍ବ ଏସିଆ + ଦକ୍ଷିଣ ଏସିଆ + ଦକ୍ଷିଣ-ପୂର୍ବ ଏସିଆ + ଦକ୍ଷିଣ ୟୁରୋପ୍ + ଅଷ୍ଟ୍ରେଲିଆ ଏବଂ ନ୍ୟୁଜିଲ୍ୟାଣ୍ଡ + ମେଲାନେସିଆ + ମାଇକ୍ରୋନେସିଆନ୍ ଅଞ୍ଚଳ + ପଲିନେସିଆ + ଦକ୍ଷିଣ-ମଧ୍ୟ ଏସିଆ + ଏସିଆ + ମଧ୍ୟ ଏସିଆ + ପଶ୍ଚିମ ଏସିଆ + ୟୁରୋପ୍ + ପୂର୍ବ ୟୁରୋପ୍ + ଉତ୍ତର ୟୁରୋପ୍ + ପଶ୍ଚିମ ୟୁରୋପ୍ + କମନୱେଲ୍ଥ ଅଫ୍ ଇଣ୍ଡିପେଣ୍ଡେଣ୍ଟ ଷ୍ଟେଟସ୍ + ଚେକୋସ୍ଲୋଭିଆ + ଲାଟିନ୍ ଆମେରିକା ଏବଂ କାରିବିଆନ୍ + ଚାନେଲ୍ ଆଇଲ୍ୟାଣ୍ଡ + ଆଣ୍ଡୋରା + ସଂଯୁକ୍ତ ଆରବ ଏମିରେଟସ୍ + ଆଫାଗାନିସ୍ତାନ୍ + ଆଣ୍ଟିଗୁଆ ଏବଂ ବାରବୁଦା + ଆଙ୍ଗୁଇଲ୍ଲା + ଆଲବାନିଆ + ଆର୍ମେନିଆ + ନେଦରଲ୍ୟାଣ୍ଡସ୍ ଆଣ୍ଟିଲିଜ୍ + ଆଙ୍ଗୋଲା + ଆର୍ଣ୍ଟକଟିକା + ଆର୍ଜେଣ୍ଟିନା + ଆମେରିକାନ୍ ସାମୋଆ + ଅଷ୍ଟ୍ରିଆ + ଅଷ୍ଟ୍ରେଲିଆ + ଆରୁବା + ଆଲାଣ୍ଡ ଆଇସଲ୍ୟାଣ୍ଡ + ଆଜେରବାଇଜାନ୍ + ବୋସନିଆ ଏବଂ ହର୍ଜଗୋଭିନା + ବାରବାଡୋସ୍ + ବାଙ୍ଗଲାଦେଶ୍ + ବେଲଜିୟମ୍ + ବୁର୍କିନୋ ଫାସୋ + ବୁଲଗେରିଆ + ବାହାରିନ୍ + ବୁରୁନ୍ଦି + ବେନିନ୍ + ସେଣ୍ଟ ବାର୍ଥେଲେମି + ବରମୁଡା + ବ୍ରୁନେଇ + ବୋଲଭିଆ + ବ୍ରାଜିଲ୍ + ବାହାମାସ୍ + ଭୁଟାନ୍ + ବୌଭେଟ୍ ଆଇସଲ୍ୟାଣ୍ଡ + ବୋଟସ୍ବାନ୍ + ବେଲାରୁଷ୍ + ବେଲିଜ୍ + କାନାଡା + କୋକୋସ୍ ଆଇସଲ୍ୟାଣ୍ଡ + କଙ୍ଗୋ-କିନସାସା + ମଧ୍ୟ ଆଫ୍ରିକୀୟ ଗଣତନ୍ତ୍ର + କଙ୍ଗୋ-ବ୍ରାଜିଭିଲ୍ଲେ + ସ୍ବିଜରଲ୍ୟାଣ୍ଡ + ଆଇବରୀ କୋଷ୍ଟ + କୁକ୍ ଆଇସଲ୍ୟାଣ୍ଡ + ଚିଲ୍ଲୀ + କାମେରୁନ୍ + ଚିନ୍ + କୋଲମ୍ବିଆ + କୋଷ୍ଟା ରିକା + ସର୍ବିଆ ଏବଂ ମଣ୍ଟେନଗ୍ରୋ + କ୍ୱିବା + କେପ୍ ଭର୍ଦେ + ଖ୍ରୀଷ୍ଟମାସ ଆଇଲ୍ୟାଣ୍ଡ + ସାଇପ୍ରସ୍ + ଚେକ୍ ସାଧାରଣତନ୍ତ୍ର + ଜର୍ମାନୀ + ଡିବୌଟି + ଡେନମାର୍କ + ଡୋମିନାକା + ଡୋମିନକାନ୍ ପ୍ରଜାତନ୍ତ୍ର + ଆଲଜେରିଆ + ଇକ୍ୱାଡୋର୍ + ଏସ୍ତୋନିଆ + ଇଜିପ୍ଟ + ପଶ୍ଚିମ ସାହାରା + ଇରିଟ୍ରିୟା + ସ୍ପେନ୍ + ଇଥିଓପିଆ + ଫିନଲ୍ୟାଣ୍ଡ + ଫିଜି + ଫଲ୍କଲ୍ୟାଣ୍ଡ ଦ୍ବୀପପୁଞ୍ଜ + ମାଇକ୍ରୋନେସିଆ + ଫାରୋଇ ଦ୍ବୀପପୁଞ୍ଜ + ଫ୍ରାନ୍ସ + ଗାବୋନ୍ + ବ୍ରିଟେନ୍ + ଗ୍ରେନାଡା + ଜର୍ଜିଆ + ଫ୍ରେଞ୍ଚ ଗୁଇନା + ଗୁଏରନେସି + ଘାନା + ଜିବ୍ରାଲ୍ଟର୍ + ଗ୍ରୀନଲ୍ୟାଣ୍ଡ + ଗାମ୍ବିଆ + ଗୁଏନେଆ + ଗୌଡେଲୌପେ + ଇକ୍ବାଟେରିଆଲ୍ ଗୁଇନିଆ + ଗ୍ରୀସ୍ + ଦକ୍ଷିଣ ଜର୍ଜିଆ ଏବଂ ଦକ୍ଷିଣ ସାଣ୍ଡୱିଚ୍ ଦ୍ବୀପପୁଞ୍ଜ + ଗୁଏତମାଲା + ଗୁଆମ୍ + ଗୁଇନିଆ-ବିସାଉ + ଗୁଇନା + ହଂକଂ ବିଶେଷ ପ୍ରଶାସନିକ କ୍ଷେତ୍ର ଚୀନ୍ + ହାର୍ଡ ଦ୍ବୀପପୁଞ୍ଜ ଏବଂ ମ୍ୟାକଡୋନାଲ୍ ଦ୍ବୀପପୁଞ୍ଜ + ହୋଣ୍ଡାରୁସ୍ + କ୍ରୋଆଟିଆ + ହାଇତି + ହଙ୍ଗେରୀ + ଇଣ୍ଡୋନେସିଆ + ଆୟରଲ୍ୟାଣ୍ଡ + ଇସ୍ରାଏଲ୍ + ଆଇଲ୍ ଅଫ୍ ମୈନ୍ + ଭାରତ + ବ୍ରିଟିଶ୍ ଭାରତୀୟ ସାମୁଦ୍ରିକ କ୍ଷେତ୍ର + ଇରାକ୍ + ଇରାନ୍ + ଆଇସଲ୍ୟାଣ୍ଡ + ଇଟାଲୀ + ଜର୍ସି + ଜାମାଇକା + ଜୋର୍ଡାନ୍ + ଜାପାନ୍ + କେନିୟା + କିର୍ଗିଜିସ୍ଥାନ + କାମ୍ବୋଡିଆ + କିରିବାଟୀ + କାମୋରସ୍ + ସେଣ୍ଟ କିଟସ୍ ଏଣ୍ଡ ନେଭିସ୍ + ଉତ୍ତର କୋରିଆ + ଦକ୍ଷିଣ କୋରିଆ + କୁଏତ୍ + କେମ୍ୟାନ୍ ଦ୍ବୀପପୁଞ୍ଜ + କାଜାକାସ୍ଥାନ୍ + ଲାଓସ୍ + ଲେବାନନ୍ + ସେଣ୍ଟ ଲୁସିଆ + ଲିଚେସ୍ତିଆନାନ୍ + ଶ୍ରୀଲଙ୍କା + ଲିବେରିଆ + ଲେସୋଥୋ + ଲିଥାଆନିଆ + ଲକ୍ସେମବର୍ଗ + ଲାଟଭିଆ + ଲିବିଆ + ମୋରୋକ୍କୋ + ମୋନାକୋ + ମାଲଡୋଭା + ମଣ୍ଟେଗ୍ରୋ + ସେଣ୍ଟ ମାର୍ଟିନ୍ + ମାଡାଗାସ୍କର୍ + ମାର୍ଶଲ୍ ଦ୍ବୀପପୁଞ୍ଜ + ମାସେଡୋନିଆ + ମାଳୀ + ମିୟାମାର୍ + ମଙ୍ଗୋଲିଆ + ମାକାଉ SAR ଚିନ୍ + ଉତ୍ତର ମାରିଆନା ଦ୍ବୀପପୁଞ୍ଜ + ମାର୍ଟିନିକ୍ୟୁ + ମାଉରିଟାନିଆ + ମଣ୍ଟେସେରାଟ୍ + ମାଲ୍ଟା + ମୌରିସସ୍ + ମାଳଦ୍ବୀପ + ମାଲୱି + ମେକ୍ସିକୋ + ମାଲେସିଆ + ମୋଜାମ୍ବିକ୍ୟୁ + ନାମ୍ବିଆ + ନୂତନ କାଲେଡୋନିଆ + ନାଇଜର୍ + ନରଫ୍ଲକ୍ ଦ୍ବୀପ + ନାଇଜେରିଆ + ନିକାରାଗୁଆ + ନେଦରଲ୍ୟାଣ୍ଡ + ନରୱେ + ନେପାଳ + ନାଉରୁ + ନିଉ + ନ୍ୟୁଜିଲାଣ୍ଡ + ଓମାନ୍ + ପାନାମା + ପେରୁ + ଫ୍ରେଞ୍ଚ ପଲିନେସିଆ + ପପୁଆ ନ୍ୟୁ ଗୁଏନିଆ + ଫିଲିପାଇନସ୍ + ପାକିସ୍ତାନ + ପୋଲାଣ୍ଡ + ସେଣ୍ଟ ପିଏରେ ଏବଂ ମିକ୍ବାଲୋନ୍ + ପିଟକାଇରିନ୍ + ପୁଏର୍ତ୍ତୋ ରିକୋ + ପାଲେସ୍ତେନିଆ + ପର୍ତ୍ତୁଗାଲ୍ + ପାଲାଉ + ପାରାଗୁଏ + କତାର୍ + ଆଉଟଲେଇଂ ଓସେନିଆ + ୟୁରୋପିଆନ୍ ୟୁନିଅନ୍ + ରିୟୁନିଅନ୍ + ରୋମାନିଆ + ସର୍ବିଆ + ରୁଷିଆ + ରାୱାଣ୍ଡା + ସାଉଦି ଆରବିଆ + ସୋଲୋମନ୍ ଦ୍ବୀପପୁଞ୍ଜ + ସେଚେଲସ୍ + ସୁଦାନ୍ + ସ୍ୱେଡେନ୍ + ସିଙ୍ଗାପୁର୍ + ସେଣ୍ଟ ହେଲେନା + ସ୍ଲୋଭେନିଆ + ସାଲ୍ଭାର୍ଡ ଏବଂ ଜାନ୍ ମାୟୋନ୍ + ସ୍ଲୋଭାକିଆ + ସିଓରା ଲିଓନ୍ + ସାନ୍ ମାରିନୋ + ସେନେଗାଲ୍ + ସୋମାଲିଆ + ସୁରିନାମ + ସାଓ ଟୋମେ ଏବଂ ପ୍ରିନସିପି + ଏଲ୍ ସାଲଭାଡୋର୍ + ସିରିଆ + ସ୍ବାଜିଲାଣ୍ଡ + ତୁର୍କସ୍ ଏବଂ ସାଇକସ୍ ଦ୍ବୀପପୁଞ୍ଜ + ଚାଦ୍ + ଫରାସୀ ଦକ୍ଷିଣ କ୍ଷେତ୍ର + ଟୋଗୋ + ଥାଇଲାଣ୍ଡ + ତାଜିକିସ୍ଥାନ୍ + ଟୋକେଲାଉ + ପୁର୍ବ ତିମୋର୍ + ତୁର୍କମେନିସ୍ତାନ୍ + ତୁନିସିଆ + ଟୋଙ୍ଗା + ତୁର୍କୀ + ତ୍ରିନିଦାଦ୍ ଏବଂ ଟୋବାଗୋ + ଟୁଭାଲୁ + ତାଇୱାନ୍ + ତାଞ୍ଜାନିଆ + ୟୁକ୍ରାଇନ୍ + ଉଗାଣ୍ଡା + ୟୁନାଇଟେଡ୍ ଷ୍ଟେଟସ୍ ମାଇନର୍ ଆଉଟଲେଇଂ ଦ୍ବୀପପୁଞ୍ଜ + ଯୁକ୍ତ ରାଷ୍ଟ୍ର ଆମେରିକା + ଉରୁଗୁଏ + ଉଜବେକିସ୍ଥାନ୍ + ଭାଟିକାନ୍ + ସେଣ୍ଟ ଭିନସେଣ୍ଟ ଏବଂ ଦି ଗ୍ରେନାଡିସ୍ + ଭେନଜୁଏଲା + ବ୍ରିଟିଶ୍ ଭର୍ଜିନ୍ ଦ୍ବୀପପୁଞ୍ଜ + ୟୁଏସ୍ ଭର୍ଜିନ୍ ଦ୍ବୀପପୁଞ୍ଜ + ଭିଏତନାମ୍ + ଭାନୁଆତୁ + ୱାଲିସ୍ ଏବଂ ଫୁତୁନା + ସାମୋଆ + ୟେମେନ୍ + ମାୟୋଟେ + ଦକ୍ଷିଣ ଆଫ୍ରିକା + ଜାମ୍ବିଆ + ଜିମ୍ବାୱେ + ଅଜଣା କିମ୍ବା ଅବୈଧ ପ୍ରଦେଶ + + + + [୦-୯ ଅ-ଋ ଏ ଐ ଓ-ନ ପ-ର ଲ ଳ ଶ-ହ {ଡ\u0B3C}ଡ଼ {ଢ\u0B3C}ଢ଼ ୟ ୱ ଵ ଂ ଃ ଁ ୍ ଼ ା-ୃ େ ୈ ୋ ୌ] + [\u200C \u200D] + + + + + + + + ଜାନୁଆରୀ + ଫେବ୍ରୁୟାରୀ + ମାର୍ଚ୍ଚ + ଅପ୍ରେଲ + ମେ + ଜୁନ + ଜୁଲାଇ + ଅଗଷ୍ଟ + ସେପ୍ଟେମ୍ବର + ଅକ୍ଟୋବର + ନଭେମ୍ବର + ଡିସେମ୍ବର + + + + + ଜା + ଫେ + ମା + ଅ + ମେ + ଜୁ + ଜୁ + ଅ + ସେ + ଅ + ନ + ଡି + + + + + + + ରବି + ସୋମ + ମଙ୍ଗଳ + ବୁଧ + ଗୁରୁ + ଶୁକ୍ର + ଶନି + + + ରବିବାର + ସୋମବାର + ମଙ୍ଗଳବାର + ବୁଧବାର + ଗୁରୁବାର + ଶୁକ୍ରବାର + ଶନିବାର + + + + + ର + ସୋ + ମ + ବୁ + ଗୁ + ଶୁ + ଶ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + am + pm + + + BCE + CE + + + + + + EEEE, d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + d-M-yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + MMMM d + dd-MM + Q yy + MM-yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + ଖ୍ରୀଷ୍ଟମାସ ଆଇଲ୍ୟାଣ୍ଡ ସମୟ + + + + + + orya + + . + , + ୦ + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + ଟଙକା + + + + + + ହଁ + ନା + + + + diff --git a/lib/zend/Zend/Locale/Data/or_IN.xml b/lib/zend/Zend/Locale/Data/or_IN.xml new file mode 100644 index 0000000000..01b626e5ea --- /dev/null +++ b/lib/zend/Zend/Locale/Data/or_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/pa.xml b/lib/zend/Zend/Locale/Data/pa.xml new file mode 100644 index 0000000000..5a215e51cd --- /dev/null +++ b/lib/zend/Zend/Locale/Data/pa.xml @@ -0,0 +1,310 @@ + + + + + + + + + + + ਅਬਖਾਜ਼ੀਅਨ + ਅਚੀਨੀ + ਅਕੋਲੀ + ਅਫ਼ਰੀਕੀ + ਅਪਾਚੇ ਭਾਸ਼ਾ + ਅਰਬੀ + ਅਸਾਮੀ + ਆਸਟਰੇਲੀਅਨ ਭਾਸ਼ਾ + ਅਜ਼ੇਰਬੈਜਨਿ + ਬੈਲਟਿਕ ਭਾਸ਼ਾ + ਬੇਲਾਰੂਸੀਅਨ + ਬੰਗਾਲੀ + ਡੈਨਿਸ਼ + ਜਰਮਨ + ਅੰਗਰੇਜ਼ੀ + ਏਸਪਰੇਂਟੋ + ਸਪੇਨਿਸ਼ + ਫਿਨਿਸ਼ + ਫਰੈਂਚ + ਗੁਜਰਾਤੀ + ਹਿੰਦੀ + ਇੰਡੋਨੇਸ਼ੀਆਈ + ਇਤਾਲਵੀ + ਜਾਪਾਨੀ + ਮੈਕੇਡੋਨੀਅਨ + ਡੱਚ + ਨਾਰਵੇਜੀਅਨ + ਪੰਜਾਬੀ + ਪੋਰਤੂਗੂਈਸ + ਸਵੈਡਿਸ਼ + ਤਾਮਿਲ + ਤੇਲਗੂ + ਥਾਈ + ਤ੍ਵਿ + ਉਇਘੁਰ + und + + + + + + + + + ਭਾਰਤ + TO + ਅਣਜਾਣ + + + + [਼ ੰ ੱ ੦-੯ ੴ ੳ ਉ ਊ ਓ ਅ ਆ ਐ ਔ ੲ ਇ ਈ ਏ ਸ {ਸ\u0A3C} ਹ ਕ ਖ {ਖ\u0A3C} ਗ {ਗ\u0A3C} ਘ-ਜ {ਜ\u0A3C} ਝ-ਨ ਪ ਫ {ਫ\u0A3C} ਬ-ਰ ਲ ਵ ੜ ਾ-ੂ ੇ ੈ ੋ-੍] + [\u200C \u200D \u0A01-\u0A03 {ਲ\u0A3C}] + + + ' + ' + " + " + + + + + + + + ਜਨਵਰੀ + ਫ਼ਰਵਰੀ + ਮਾਰਚ + ਅਪ੍ਰੈਲ + ਮਈ + ਜੂਨ + ਜੁਲਾਈ + ਅਗਸਤ + ਸਤੰਬਰ + ਅਕਤੂਬਰ + ਨਵੰਬਰ + ਦਸੰਬਰ + + + + + ਜ + ਫ + ਮਾ + ਅ + ਮ + ਜੂ + ਜੁ + ਅ + ਸ + ਅ + ਨ + ਦ + + + + + + + ਐਤ. + ਸੋਮ. + ਮੰਗਲ. + ਬੁਧ. + ਵੀਰ. + ਸ਼ੁਕਰ. + ਸ਼ਨੀ. + + + ਐਤਵਾਰ + ਸੋਮਵਾਰ + ਮੰਗਲਵਾਰ + ਬੁਧਵਾਰ + ਵੀਰਵਾਰ + ਸ਼ੁੱਕਰਵਾਰ + ਸ਼ਨੀਚਰਵਾਰ + + + + + ਐ + ਸੋ + ਮੰ + ਬੁੱ + ਵੀ + ਸ਼ੁੱ + ਸ਼ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + ਪਹਿਲਾਂ ਚੌਥਾਈ + ਦੂਜਾ ਚੌਥਾਈ + ਤੀਜਾ ਚੌਥਾਈ + ਚੌਥਾ ਚੌਥਾਈ + + + + ਸਵੇਰੇ + ਸ਼ਾਮ + + + ਈਸਾਪੂਰਵ + ਸੰਨ + + + BCE + CE + + + + + + EEEE, dd MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + dd/MM/yyyy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + HH:mm:ss + d/M + mm:ss + MMM yy + Q yy + + + + + ਸਾਲ + + + ਮਹੀਨਾ + + + ਹਫ਼ਤਾ + + + ਦਿਨ + ਤਿੰਨ ਦਿਨ ਪਹਿਲਾਂ + ਪਰਸੋਂ + ਅੱਜ + ਭਲਕ + ਭਲਕ + ਤਿੰਨ ਦਿਨ ਬਾਅਦ + + + ਹਫ਼ਤੇ ਦਾ ਦਿਨ + + + ਘੰਟਾ + + + ਮਿੰਟ + + + ਖੇਤਰ + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + guru + + ੦ + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + ਅਫ਼ਗਾਨੀ + + + ਯੂਰੋ + + + ਰੁਪਿਯ + ਰੁ. + + + ਅਣਜਾਣ + + + + + + ਹਾਂ + ਨਹੀਂ + + + + diff --git a/lib/zend/Zend/Locale/Data/pa_Arab.xml b/lib/zend/Zend/Locale/Data/pa_Arab.xml new file mode 100644 index 0000000000..9baae57387 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/pa_Arab.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + پکستان + + + + + + + [\u064F ء آ ؤ ئ-ب پ ت ث ٹ ج چ ح-ذ ڈ ر ز ڑ ژ س-غ ف ق ک گ ل-ن ں ه ھ ہ و ی ے] + [أ ٻ ة ٺ ټ ٽ] + + + + + + + + جنوری + فروری + مارچ + اپریل + مئ + جون + جولائی + اگست + ستمبر + اکتوبر + نومبر + دسمبر + + + + + + + اتوار + پیر + منگل + بُدھ + جمعرات + جمعہ + ہفتہ + + + + + + + چوتھاي پہلاں + چوتھاي دوجا + چوتھاي تيجا + چوتھاي چوتھا + + + + + + ايساپورو + سں + + + + + ورھا + + + مہينا + + + ہفتہ + + + دئن + + + ہفتے دا دن + + + گھنٹا + + + منٹ + + + ٹپہ + + + + + + + arab + + ٠ + + + + يورو + + + روپئیہ [INR] + ر [INR] + + + روپئیہ + ر + + + + + + ہاں + نہيں + + + + diff --git a/lib/zend/Zend/Locale/Data/pa_Arab_PK.xml b/lib/zend/Zend/Locale/Data/pa_Arab_PK.xml new file mode 100644 index 0000000000..f8e78beba6 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/pa_Arab_PK.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Świat + Afryka + Ameryka Północna + Ameryka Południowa + Oceania + Afryka Zachodnia + Ameryka Środkowa + Afryka Wschodnia + Afryka Północna + Afryka Środkowa + Afryka Południowa + Ameryka + Ameryka Północna - Kanada, USA + Karaiby + Azja Wschodnia + Azja Południowa + Azja Południowo-Wschodnia + Europa Południowa + Australia i Nowa Zelandia + Melanezja + Mikronezja + Polinezja + Azja Południowo-Środkowa + Azja + Azja Środkowa + Azja Zachodnia + Europa + Europa Wschodnia + Europa Północna + Europa Zachodnia + Wspólnota Niezależnych Państw + Ameryka Łacińska i Karaiby + Wyspy Normandzkie + Andora + Zjednoczone Emiraty Arabskie + Afganistan + Antigua i Barbuda + Anguilla + Albania + Armenia + Antyle Holenderskie + Angola + Antarktyka + Argentyna + Samoa Amerykańskie + Austria + Australia + Aruba + Wyspy Alandzkie + Azerbejdżan + Bośnia i Hercegowina + Barbados + Bangladesz + Belgia + Burkina Faso + Bułgaria + Bahrajn + Burundi + Benin + Saint Barthélemy + Bermudy + Brunei Darussalam + Boliwia + Brazylia + Bahamy + Bhutan + Wyspa Bouveta + Botswana + Białoruś + Belize + Kanada + Wyspy Kokosowe + Demokratyczna Republika Konga + Republika Środkowoafrykańska + Kongo + Szwajcaria + Wybrzeże Kości Słoniowej + Wyspy Cooka + Chile + Kamerun + Chiny + Kolumbia + Kostaryka + Serbia i Czarnogóra + Kuba + Republika Zielonego Przylądka + Wyspa Bożego Narodzenia + Cypr + Czechy + Niemcy + Dżibuti + Dania + Dominika + Republika Dominikańska + Algieria + Ekwador + Estonia + Egipt + Sahara Zachodnia + Erytrea + Hiszpania + Etiopia + Finlandia + Fidżi + Falklandy + Federalne Stany Mikronezji + Wyspy Owcze + Francja + Gabon + Wielka Brytania + Grenada + Gruzja + Gujana Francuska + Wyspa Guernsey + Ghana + Gibraltar + Grenlandia + Gambia + Gwinea + Gwadelupa + Gwinea Równikowa + Grecja + Georgia Południowa i Sandwich Południowy + Gwatemala + Guam + Gwinea Bissau + Gujana + Hongkong, Specjalny Region Administracyjny Chin + Wyspy Heard i McDonalda + Honduras + Chorwacja + Haiti + Węgry + Indonezja + Irlandia + Izrael + Wyspa Man + Indie + Terytorium Brytyjskie Oceanu Indyjskiego + Irak + Iran + Islandia + Włochy + Wyspa Jersey + Jamajka + Jordania + Japonia + Kenia + Kirgistan + Kambodża + Kiribati + Komory + Saint Kitts i Nevis + Korea Północna + Korea Południowa + Kuwejt + Kajmany + Kazachstan + Laos + Liban + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litwa + Luksemburg + Łotwa + Libia + Maroko + Monako + Mołdawia + Czarnogóra + Sint Maarten + Madagaskar + Wyspy Marshalla + Macedonia + Mali + Birma + Mongolia + Makau, Specjalny Region Administracyjny Chin + Mariany Północne + Martynika + Mauretania + Montserrat + Malta + Mauritius + Malediwy + Malawi + Meksyk + Malezja + Mozambik + Namibia + Nowa Kaledonia + Niger + Norfolk + Nigeria + Nikaragua + Holandia + Norwegia + Nepal + Nauru + Niue + Nowa Zelandia + Oman + Panama + Peru + Polinezja Francuska + Papua Nowa Gwinea + Filipiny + Pakistan + Polska + Saint-Pierre i Miquelon + Pitcairn + Portoryko + Terytoria Palestyńskie + Portugalia + Palau + Paragwaj + Katar + Oceania inne + Unia Europejska + Reunion + Rumunia + Serbia + Rosja + Rwanda + Arabia Saudyjska + Wyspy Salomona + Seszele + Sudan + Szwecja + Singapur + Wyspa Świętej Heleny + Słowenia + Svalbard i Jan Mayen + Słowacja + Sierra Leone + San Marino + Senegal + Somalia + Surinam + Wyspy Świętego Tomasza i Książęca + Salwador + Syria + Suazi + Turks i Caicos + Czad + Francuskie Terytoria Południowe + Togo + Tajlandia + Tadżykistan + Tokelau + Timor Wschodni + Turkmenistan + Tunezja + Tonga + Turcja + Trynidad i Tobago + Tuvalu + Tajwan + Tanzania + Ukraina + Uganda + Dalekie Wyspy Mniejsze Stanów Zjednoczonych + Stany Zjednoczone + Urugwaj + Uzbekistan + Watykan + Saint Vincent i Grenadyny + Wenezuela + Brytyjskie Wyspy Dziewicze + Wyspy Dziewicze Stanów Zjednoczonych + Wietnam + Vanuatu + Wallis i Futuna + Samoa + Jemen + Majotta + Republika Południowej Afryki + Zambia + Zimbabwe + Nieznany lub nieprawidłowy region + + + tradycyjna ortografia niemiecka + standardowa ortografia regionu Resia + ortografia niemiecka z 1996 r. + szesnastowieczny francuski + siedemnastowieczny francuski + ormiański wchodni + ormiański zachodni + turecki zunifikowany alfabet łaciński + dialekt San Giorgio/Bila + dialekt Boontling + fonetyczny międzynarodowy + fonetyczny + dialekt Lipovaz w regionie Resia + monotoniczny + dialekt Natisone + dialekt Gniva/Njiva + dialekt Oseacco/Osojane + politoniczny + komputerowy + ortografia zreformowana + dialekt regionu Resia + dialekt Saho + standardowy szkocki angielski + dialekt Scouse + dialekt Stolvizza/Solbica + ortografia taraszkiewicka + walencki + + + kalendarz + sortowanie + waluta + + + chiński tradycyjny porządek sortowania - Big5 + kalendarz buddyjski + kalendarz chiński + bezpośredni porządek sortowania + chiński uproszczony porządek sortowania - GB2312 + kalendarz gregoriański + kalendarz hebrajski + narodowy kalendarz hinduski + kalendarz islamski (metoda wzrokowa) + kalendarz islamski (metoda obliczeniowa) + kalendarz japoński + porządek sortowania książki telefonicznej + porządek sortowania pinyin + kalendarz Republiki Chińskiej + porządek akcentów + tradycyjny porządek sortowania + + + anglosaski + metryczny + + + Język: {0} + Pismo: {0} + Region: {0} + + + + [a ą b c ć d e ę f-l ł m n ń o ó p r s ś t u w y z ź ż] + [q v x] + [a-z] + + + ‘ + ’ + „ + ” + + + + + + + + EEEE, d MMMM, y G + + + + + d MMMM, y G + + + + + d MMM, y G + + + + + + E d MMMM + d MMM + + + + + + + + sty + lut + mar + kwi + maj + cze + lip + sie + wrz + paź + lis + gru + + + stycznia + lutego + marca + kwietnia + maja + czerwca + lipca + sierpnia + września + października + listopada + grudnia + + + + + s + l + m + k + m + c + l + s + w + p + l + g + + + styczeń + luty + marzec + kwiecień + maj + czerwiec + lipiec + sierpień + wrzesień + październik + listopad + grudzień + + + + + + + niedz. + pon. + wt. + śr. + czw. + pt. + sob. + + + niedziela + poniedziałek + wtorek + środa + czwartek + piątek + sobota + + + + + N + P + W + Ś + C + P + S + + + + + + + K1 + K2 + K3 + K4 + + + I kwartał + II kwartał + III kwartał + IV kwartał + + + + + 1 kw. + 2 kw. + 3 kw. + 4 kw. + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + p.n.e. + n.e. + + + p.n.e. + n.e. + + + + + + EEEE, d MMMM y + + + + + d MMMM y + + + + + dd-MM-yyyy + + + + + dd-MM-yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + HH:mm:ss + H:mm + L + E, M-d + LLL + d MMM E + d MMMM E + d MMMM + MMM d + MM-dd + d.M + d + hh:mm a + hh:mm:ss a + mm:ss + mm:ss + y + yyyy-M + EEE, d.M.yyyy + y MMM + EEE, d MMM y + LLLL y + yyyy Q + y QQQ + MM/yy + MMM yy + Q yy + yyyy-MM + LLLL y + + + {0} - {1} + + M-M + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + LLL-LLL + + + E, d MMM - E, d MMM + E, MM-d – E, MM-d + + + LLLL-LLLL + + + d MMM - d MMM + d-d MMM + + + dd.MM-dd.MM + dd.MM-dd.MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM.yy-MM.yy + MM.yy-MM.yy + + + E, dd.MM.yyyy - E, dd.MM.yyyy + E, dd.MM.yyyy - E, dd.MM.yyyy + E, dd-MM-yyyy-E, dd-MM-yyyy + + + LLL-LLL y + LLL y - LLL y + + + E, d MMM - E, d MMM y + E, d - E, d MMM y + E, d MMM y - E, d MMM y + + + MM.yyyy - MM.yyyy + MM.yyyy - MM.yyyy + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + dd.MM-dd.MM.yyyy + dd-dd.MM.yy + dd.MM.yyyy-dd.MM.yyyy + + + + + + Era + + + Rok + + + Miesiąc + + + Tydzień + + + Dzień + Trzy dni temu + Przedwczoraj + Wczoraj + Dzisiaj + Jutro + Pojutrze + Za trzy dni + + + Dzień tygodnia + + + Dayperiod + + + Godzina + + + Minuta + + + Sekunda + + + Strefa + + + + + + +HH:mm;-HH:mm + GMT{0} + Czas: {0} + {1} ({0}) + + Nieznane + + + GMT-01:0 + + + GMT-02:00 + + + Andora + + + Dubaj + + + Afganistan + + + Antigua i Barbuda + + + Tirana + + + Erewan + + + Curaçao + + + Stacja Naukowa Rothera + + + Archipelag Palmera + + + Biegun południowy + + + Stacja Syowa + + + Wybrzeże Mawsona + + + Stacja Davis + + + Stacja Vostok + + + Stacja Casey + + + Mc Murdo + + + Samoa Amerykańskie + + + Wiedeń + + + Adelajda + + + Wyspa Lord Howe + + + Maarianhamina + + + Azerbejdżan + + + Sarajewo + + + Dakka + + + Bruksela + + + Wagadugu + + + Bułgaria + + + Bahrajn + + + Bużumbura + + + Porto Novo + + + Bermudy + + + Boliwia + + + Pôrto Velho + + + Cuiabá + + + Belém + + + Săo Paulo + + + Salvador + + + Maceió + + + Bahamy + + + Bhutan + + + Mińsk + + + Wyspy Kokosowe + + + Kinszasa + + + Bangi + + + Kongo Brazzaville + + + Zurych + + + Abidżan + + + Wyspy Cooka + + + Wyspa Wielkanocna + + + Duala + + + Kaszgar + + + Urumczi + + + Czunking + + + Szanghaj + + + Kolumbia + + + Kostaryka + + + Hawana + + + Zielony Przylądek + + + Wyspa Bożego Narodzenia + + + Nikozja + + + Praga + + + Niemcy + + + Dżibuti + + + Kopenhaga + + + Dominika + + + Republika Dominikańska + + + Algier + + + Ekwador + + + Tallin + + + Kair + + + Ujun + + + Asmara + + + Wyspy Kanaryjskie + + + Madryt + + + Addis Abeba + + + Finlandia + + + Fidżi + + + Falklandy (Malwiny) + + + Wyspy Owcze + + + Paryż + + + Londyn + + + Gruzja + + + Kajenna + + + Akra + + + Grenlandia + + + Bandżul + + + Konakri + + + Gwadelupa + + + Ateny + + + Georgia Południowa + + + Gwatemala + + + Gujana + + + Hongkong + + + Honduras + + + Zagrzeb + + + Haiti + + + Budapeszt + + + Dżakarta + + + Irlandia + + + Jerozolima + + + Wyspa Man + + + Kalkuta + + + Czagos + + + Bagdad + + + Teheran + + + Rejkiawik + + + Rzym + + + Jamajka + + + Jordania + + + Tokio + + + Biszkek + + + Kambodża + + + Komory + + + Saint Kitts + + + Korea Północna + + + Seul + + + Kuwejt + + + Kajmany + + + Aktau + + + Uralsk + + + Aktiubińsk + + + Kyzył Orda + + + Ałma Ata + + + Wientian + + + Bejrut + + + Saint Lucia + + + Liechtenstein + + + Kolombo + + + Wilno + + + Luksemburg + + + Ryga + + + Trypolis + + + Monako + + + Kiszyniów + + + Czarnogóra + + + Antananarywa + + + Macedonia + + + Rangun + + + Howd + + + Ułan Bator + + + Czojbalsan + + + Makau + + + Mariany Północne + + + Martynika + + + Nawakszut + + + Malediwy + + + Meksyk + + + Kuczing + + + Windhuk + + + Numea + + + Niamej + + + Wyspa Norfolk + + + Nikaragua + + + Holandia + + + Norwegia + + + Nepal + + + Maskat + + + Peru + + + Markizy + + + Papua Nowa Gwinea + + + Filipiny + + + Karaczi + + + Warszawa + + + Saint Pierre i Miquelon + + + Wyspy Pitcairn + + + Portoryko + + + Terytoria Palestyńskie + + + Azory + + + Madera + + + Lizbona + + + Asunción + + + Katar + + + Bukareszt + + + Belgrad + + + Moskwa + + + Wołgograd + + + Jekaterynburg + + + Nowosybirsk + + + Krasnojarsk + + + Irkuck + + + Jakuck + + + Władywostok + + + Sachalin + + + Kamczatka + + + Rijad + + + Wyspy Salomona + + + Mahé + + + Chartum + + + Sztokholm + + + Singapur + + + Święta Helena + + + Lublana + + + Bratysława + + + Mogadiszu + + + Surinam + + + Săo Tomé + + + Salwador + + + Damaszek + + + Turks i Caicos + + + Ndżamena + + + Wyspy Kerguelena + + + Lomé + + + Tajlandia + + + Duszanbe + + + Tokelau + + + Timor Wschodni + + + Aszchabad + + + Tonga + + + Stambuł + + + Port-of-Spain + + + Tuvalu + + + Tajpej + + + Dar es-Salaam + + + Użgorod + + + Kijów + + + Symferopol + + + Zaporoże + + + New Salem + + + Center + + + Vincennes + + + Petersburg + + + Knox + + + Winamac + + + Marengo + + + Vevay + + + Monticello + + + Nowy Jork + + + Urugwaj + + + Samarkanda + + + Taszkient + + + Watykan + + + Saint Vincent + + + Wenezuela + + + Brytyjskie Wyspy Dziewicze + + + Saint Thomas + + + Sajgon + + + Vanuatu + + + Wallis i Futuna + + + Samoa + + + Jemen + + + Majotta + + + + Czas środkowoeuropejski + Czas środkowoeuropejski letni + + true + + + + Czas wschodnioeuropejski + Czas wschodnioeuropejski letni + + + + + Czas zachodnioeuropejski + Czas zachodnioeuropejski letni + + + + + + + , +   + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + + + + peseta andorska + pesety andorskie + peset andorskich + + + dirham arabski + dirhamy arabskie + dirhamów arabskich + + + afgani (1927-2002) + afgani (1927-2002) + afgani (1927-2002) + + + afgani + afgani + afgani + + + lek albański + leki albańskie + leków albańskich + + + dram armeński + dramy armeńskie + dramów armeńskich + + + gulden Antyle Holenderskie + guldeny Antyle Holenderskie + guldenów (Antyle Holenderskie) + + + kwanza angolańska + kwanzy angolańskie + kwanz angolańskich + + + kwanza angolańska (1977-1990) + kwanzy angolańskie (1977-1990) + kwanz angolańskich (1977-1990) + + + nowa kwanza angolańska (1990-2000) + nowe kwanzy angolańskie (1990-2000) + nowych kwanz angolańskich (1990-2000) + + + kwanza angolańska Reajustado (1995-1999) + kwanzy angolańskie Reajustado (1995-1999) + kwanz angolańskich Reajustado (1995-1999) + + + austral argentyński + + + peso argentyńskie (1983-1985) + + + peso argentyńskie + + + szyling austriacki  + + + dolar australijski + dolary australijskie + dolar australijski + dolarów australijskich + + + gulden arubski + + + manat azerbejdżański + + + manat azerski + manaty azerskie + manat azerski + manatów azerskich + + + dinar Bośni i Hercegowiny + + + marka konwertybilna Bośni i Hercegowiny + marki wymienne Bośni i Hercegowiny + marka wymienna Bośni i Hercegowiny + marek wymiennych Bośni i Hercegowiny + + + dolar Barbadosu + + + taka bengalska + + + frank belgijski (zamienny) + + + frank belgijski + + + frank belgijski (finansowy) + + + lew bułgarski + + + nowy lew bułgarski + + + dinar bahrański + + + frank burundyjski + + + dolar bermudzki + + + dolar brunejski + + + boliviano + + + peso boliwijskie + + + mvdol boliwijski + + + cruzeiro novo brazylijskie (1967-1986) + + + cruzado brazylijskie + + + cruzeiro brazylijskie (1990-1993) + + + real brazylijski + + + nowe cruzado brazylijskie + + + cruzeiro brazylijskie + + + dolar bahamski + + + ngultrum Bhutanu + + + kyat birmański + + + pula + + + rubel białoruski (1994-1999) + + + rubel białoruski + ruble białoruskie + rubel białoruski + rubli białoruskich + + + dolar belizeński + + + dolar kanadyjski + dolary kanadyjskie + dolar kanadyjski + dolarów kanadyjskich + + + frank kongijski + + + frank szwajcarski + franki szwajcarskie + frank szwajcarski + franków szwajcarskich + + + peso chilijskie + + + juan renminbi + + + peso kolumbijskie + + + colon kostarykański + + + stary dinar serbski + + + korona czechosłowacka + korony czechosłowackie + korona czechosłowacka + koron czechosłowackich + + + peso kubańskie + + + escudo Zielonego Przylądka + + + funt cypryjski + + + korona czeska + korony czeskie + korona czeska + koron czeskich + + + wschodnia marka wschodnioniemiecka + + + marka niemiecka + marki niemieckie + marka niemiecka + marek niemieckich + + + frank Dżibuti + + + korona duńska + korony duńskie + korona duńska + koron duńskich + + + peso dominikańskie + + + dinar algierski + + + sucre ekwadorski + + + korona estońska + korony estońskie + korona estońska + koron estońskich + + + funt egipski + + + nakfa erytrejska + + + peseta hiszpańska (Konto A) + + + peseta hiszpańska (konto wymienne) + + + peseta hiszpańska + + + birr etiopski + + + euro + euro + euro + euro + + + marka fińska + + + dolar fidżi + + + funt Wysp Falklandzkich + + + frank francuski  + franki francuskie + frank francuski + franków francuskich + + + funt szterling + + + kupon gruziński larit + + + lari gruzińskie + + + cedi ghańskie + + + cedi Ghany + + + funt gibraltarski + + + dalasi gambijskie + + + frank gwinejski + + + syli gwinejskie + + + ekwele gwinejskie Gwinei Równikowej + + + drachma grecka + + + quetzal gwatemalski + + + escudo Gwinea Portugalska + + + peso Guinea-Bissau + + + dolar gujański + + + dolar hongkoński + + + lempira Hondurasu + + + dinar chorwacki + + + kuna chorwacka + + + gourde haitańskie + + + forint węgierski  + forinty węgierskie + forint węgierski + forintów węgierskich + + + rupia indonezyjska + + + funt irlandzki + + + funt izraelski + + + nowy szekel izraelski + + + rupia indyjska + + + dinar iracki + + + rial irański + + + korona islandzka + + + lir włoski + + + dolar jamajski + + + dinar jordański + + + jen japoński + jeny japońskie + jen japoński + jenów japońskich + + + szyling kenijski + + + som kirgiski + + + riel kambodżański + + + frank komoryjski + + + won północnokoreański + + + won południowokoreański + + + dinar kuwejcki + + + dolar kajmański + + + tenge kazachskie + + + kip laotański + + + funt libański + + + rupia lankijska + + + dolar liberyjski + + + loti Lesoto + + + lit litewski + + + talon litewski + + + frank luksemburski + + + łat łotewski + + + rubel łotewski + + + dinar libijski + + + dirham marokański + + + frank marokański + franki marokańskie + frank marokański + franków marokańskich + + + lej mołdawski + + + ariar malgaski + + + frank malgaski + + + denar macedoński + + + frank malijski + + + kyat Myanmar + + + tugrik mongolski + + + pataka Macao + + + ouguiya mauterańska + + + lira maltańska + + + funt maltański + + + rupia Mauritius + + + rufiyaa malediwska + + + kwacha malawska + + + peso meksykańskie + + + peso srebrne meksykańskie (1861-1992) + + + ringgit malezyjski + + + escudo mozambickie + + + metical Mozambik + + + metical Mozambiku + + + dolar namibijski + + + naira nigeryjska + + + cordoba nikaraguańska + + + cordoba oro nikaraguańska + + + gulden holenderski  + + + korona norweska + korony norweskie + korona norweska + koron norweskich + + + rupia nepalska + + + dolar nowozelandzki + dolary nowozelandzkie + dolar nowozelandzki + dolarów nowozelandzkich + + + rial Omanu + + + balboa panamski + + + inti peruwiański + + + nowy sol peruwiański + + + sol peruwiański + + + kina Papua Nowa Gwinea + + + peso filipińskie + + + rupia pakistańska + + + złoty polski + złote polskie + złoty polski + złotych polskich + + + złoty polski (1950-1995) + + + escudo portugalskie + + + guarani paragwajskie + + + rial katarski + + + dolar rodezyjski + + + lej rumuński + + + nowa leja rumuńska + + + dinar serbski + + + rubel rosyjski + ruble rosyjskie + rubel rosyjski + rubli rosyjskich + + + rubel rosyjski (1991-1998) + + + frank ruandyjski + + + rial saudyjski + + + dolar Wysp Salomona + + + rupia seszelska + + + dinar sudański + + + funt sudański + + + stary funt sudański + + + korona szwedzka + korony szwedzkie + korona szwedzka + koron szwedzkich + + + dolar singapurski + + + funt Wyspy Świętej Heleny + + + tolar słoweński + tolary słoweńskie + tolar słoweński + tolarów słoweńskich + + + korona słowacka + korony słowackie + korona słowacka + koron słowackich + + + leone Sierra Leone + + + szyling somalijski + + + dolar surinamski + dolary surinamskie + dolar surinamski + dolarów surinamskich + + + gulden surinamski + + + dobra Wysp Świętego Tomasza i Książęcej + + + rubel radziecki + ruble radzieckie + rubel radziecki + rubli radzieckich + + + colon salwadorski + + + funt syryjski + + + lilangeni Suazi + + + baht tajski + + + rubel tadżycki + + + somoni tadżyckie + + + manat turkmeński + + + dinar tunezyjski + + + paʻanga Tonga + + + escudo timorskie + + + lir turecki + liry tureckie + lira turecka + lir tureckich + + + nowa lira turecka + nowe liry tureckie + nowa lira turecka + nowych lir tureckich + + + dolar Trynidadu i Tobago + + + nowy dolar tajwański + + + szyling tanzański + + + hrywna ukraińska + hrywny ukraińskie + hrywna ukraińska + hrywien ukraińskich + + + karbowaniec ukraiński + karbowańce ukraińskie + karbowaniec ukraiński + karbowańców ukraińskich + + + szyling ugandyjski (1966-1987) + + + szyling ugandyjski + + + dolar amerykański  + dolary amerykańskie + dolar amerykański + dolarów amerykańskich + + + peso urugwajskie (1975-1993) + + + peso urugwajskie + + + som uzbecki + + + boliwar wenezuelski + + + boliwar fuerte + + + dong wietnamski + + + vatu Vanuatu + + + tala samoańska + + + frank CFA BEAC + + + srebro + + + złoto + + + dolar wschodniokaraibski + + + specjalne prawa ciągnienia + + + ECU + + + frank złoty francuski + + + UIC-frank francuski + + + frank CFA + + + pallad + + + frank CFP + + + platyna + + + nieznana/nieprawidłowa waluta + XXX + nieznana/nieprawidłowa waluta + XXX + + + dinar jemeński + + + rial jemeński + + + nowy dinar jugosławiański + + + dinar jugosławiański wymienny + + + rand południowoafrykański (finansowy) + + + rand południowoafrykański + + + kwacha zambijska + + + nowy zair zairski + + + zair zairski + + + dolar Zimbabwe + + + + + + {0} dni + {0} dzień + {0} dni + + + {0} godziny + {0} godzina + {0} godzin + + + {0} minuty + {0} minuta + {0} minut + + + {0} miesiące + {0} miesiąc + {0} miesięcy + + + {0} sekundy + {0} sekunda + {0} sekund + + + {0} tygodnie + {0} tydzień + {0} tygodni + + + {0} lata + {0} rok + {0} lat + + + + + tak:t + nie:n + + + + diff --git a/lib/zend/Zend/Locale/Data/pl_PL.xml b/lib/zend/Zend/Locale/Data/pl_PL.xml new file mode 100644 index 0000000000..c870c5d64a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/pl_PL.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/postalCodeData.xml b/lib/zend/Zend/Locale/Data/postalCodeData.xml new file mode 100644 index 0000000000..398433d0d5 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/postalCodeData.xml @@ -0,0 +1,166 @@ + + + + + + + GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4} + JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2} + GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2} + IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2} + \d{5}([ \-]\d{4})? + [ABCEGHJKLMNPRSTVXY]\d[A-Z][ ]?\d[A-Z]\d + \d{5} + \d{3}-\d{4} + \d{2}[ ]?\d{3} + \d{4} + \d{5} + \d{4} + \d{4} + \d{5} + \d{4}[ ]?[A-Z]{2} + \d{4} + \d{4} + \d{3}[ ]?\d{2} + \d{4} + \d{5}[\-]?\d{3} + \d{4}([\-]\d{3})? + \d{5} + 22\d{3} + \d{3}[\-]\d{3} + \d{6} + \d{3}(\d{2})? + \d{6} + \d{5} + AD\d{3} + ([A-HJ-NP-Z])?\d{4}([A-Z]{3})? + (37)?\d{4} + \d{4} + ((1[0-2]|[2-9])\d{2})? + \d{4} + (BB\d{5})? + \d{6} + [A-Z]{2}[ ]?[A-Z0-9]{2} + \d{5} + BBND 1ZZ + [A-Z]{2}[ ]?\d{4} + \d{4} + \d{5} + \d{4} + \d{7} + \d{4,5}|\d{3}-\d{4} + \d{5} + \d{4} + \d{3}[ ]?\d{2} + \d{5} + ([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})? + \d{5} + \d{5} + \d{3} + \d{4} + \d{3}[ ]?\d{2} + 39\d{2} + \d{5} + \d{4} + (?:\d{5})? + \d{4} + \d{3} + \d{6} + \d{5} + ((D|DUBLIN)?([1-9]|6[wW]|1[0-8]|2[024]))? + \d{5} + \d{5} + \d{6} + \d{5} + \d{5} + \d{5} + \d{4} + (\d{4}([ ]?\d{4})?)? + (948[5-9])|(949[0-7]) + \d{5} + \d{4} + \d{4} + \d{5} + \d{5} + [A-Z]{3}[ ]?\d{2,4} + (\d{3}[A-Z]{2}\d{3})? + \d{5} + \d{4} + 980\d{2} + \d{5} + \d{5} + \d{4} + ((\d{4}-)?\d{3}-\d{3}(-\d{1})?)? + (\d{6})? + (PC )?\d{3} + \d{5} + \d{4} + \d{4} + \d{2}-\d{3} + 00[679]\d{2}([ \-]\d{4})? + \d{6} + \d{6} + 4789\d + \d{5} + \d{5} + \d{3}[ ]?\d{2} + \d{4} + \d{4} + \d{5} + \d{6} + \d{5} + \d{4} + \d{5} + \d{6} + \d{5} + \d{5} + \d{6} + 00120 + \d{4} + \d{5} + 96799 + 6799 + \d{4} + \d{6} + 8\d{4} + \d{5} + \d{5} + 6798 + \d{4} + FIQQ 1ZZ + 2899 + (9694[1-4])([ \-]\d{4})? + 9[78]3\d{2} + \d{3} + 9[78][01]\d{2} + SIQQ 1ZZ + 969[123]\d([ \-]\d{4})? + \d{4} + \d{4} + \d{5} + \d{6} + \d{4} + \d{3} + \d{3} + 969[67]\d([ \-]\d{4})? + \d{6} + 9695[012]([ \-]\d{4})? + 9[78]2\d{2} + 988\d{2} + \d{4} + 008(([0-4]\d)|(5[01]))([ \-]\d{4})? + 987\d{2} + \d{3} + 9[78]5\d{2} + PCRN 1ZZ + 96940 + 9[78]4\d{2} + STHL 1ZZ + \d{4} + \d{5} + [HLMS]\d{3} + TKCA 1ZZ + 986\d{2} + 976\d{2} + + diff --git a/lib/zend/Zend/Locale/Data/ps.xml b/lib/zend/Zend/Locale/Data/ps.xml new file mode 100644 index 0000000000..0134dc9a76 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ps.xml @@ -0,0 +1,417 @@ + + + + + + + + + fa_AF + + + افريکاني + امهاري + عربي + اسمائى ژبه + أذربائجاني + بلوڅي + بېلاروسي + بلغاري + بيهاري + بنګالي + برېتون + بوسني + کټلاني + چېک + ويلشي + ډېنش + الماني + یوناني + انګلیسي + اسپرانتو + هسپانوي + حبشي + باسکي + فارسي + فینلنډي + تګالوګ + فاروئې + فرانسوي + فريزي + ائيرلېنډي + سکاټلېنډي ګېلک + ګلېشيايي + ګوراني + ګجراتي + عبري + هندي + کروواتي + هنګري + ارمني + انټرلنګوا + انډونېشيايي + آسا نا جبة + هند و اروپایي + أيسلېنډي + ایټالوي + جاپانی + جاوايې + جورجيائي + کمبوډيايې يا د کمبوډيا + کنأډه + کوريائي + کردي + کرګيز + لاتیني + لويتين + ليتواني + لېټواني + ملغاسي + مقدوني + مالايالم + مغولي + مراټهي + ملایا + مالټايي + نېپالي + هالېنډي + ناروېئي (نائنورسک) + ناروېئې + اوکسيټاني + اوريا + پنجابي + پولنډي + پښتو + پورتګالي + پرتگال (برازيل) + پرتګالي (پرتګال) + روماني + روسي + سنسکریټ + سندهي + سرب-کروشيايي + سينهالي + سلوواکي + سلوواني + سومالي + الباني + سربيائي + سيسوتو + سوډاني + سویډنی + سواهېلي + تامل + تېليګو + تاجک + تايلېنډي + تيګريني + ترکمني + کلينګاني + ترکي + تاتار + توی + اويگور + اوکرانايي + اردو + ازبکي + وېتنامي + خوسا + يديش + چیني + زولو + + + + + + افغانستان + البانیه + انګولا + انتارکتیکا + اتریش + بنګله‌دیش + بلغاریه + کاناډا + سویس + چین + کولمبیا + کیوبا + المان + ډنمارک + الجزایر + مصر + هسپانیه + حبشه + فنلینډ + فرانسه + برتانیه + ګانا + ګیانا + یونان + ګواتیمالا + هانډوراس + مجارستان + اندونیزیا + هند + عراق + آیسلینډ + ایټالیه + جمیکا + جاپان + کمبودیا + کویټ + لاوس + لبنان + لایبریا + لیبیا + مراکش + مغولستان + مالیزیا + نایجیریا + نکاراګوا + هالېنډ + ناروې + نیپال + نیوزیلنډ + پاکستان + پولنډ + فلسطین + پورتګال + روسیه + روندا + سعودی عربستان + سویډن + سالوېډور + سوریه + تاجکستان + تنزانیا + یوروګوای + یمن + + + + + + + [\u064E \u0650 \u064F \u064B \u064D \u064C \u0651 \u0652 \u0654 \u0670 آ ا أ ء ب پ ت ټ ث ج ځ چ څ ح-د ډ ذ ر ړ ز ژ ږ س ش ښ ص-غ ف ق ک ګ ل-ن ڼ ه ة و ؤ ی ي ې ۍ ئ] + [\u200C \u200D] + + + + + + + + 1 + 2 + 3 + 4 + مـی + جون + 7 + 8 + 9 + 10 + 11 + 12 + + + جنوري + فبروري + مارچ + اپریل + می + جون + جولای + اګست + سپتمبر + اکتوبر + نومبر + دسمبر + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + یکشنبه + دوشنبه + سه‌شنبه + چهارشنبه + پنجشنبه + جمعه + شنبه + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + غ.م. + غ.و. + + + ق.م. + م. + + + + + + EEEE د y د MMMM d + + + + + د y د MMMM d + + + + + d MMM y + + + + + yyyy/M/d + + + + + + + H:mm:ss (zzzz) + + + + + H:mm:ss (z) + + + + + H:mm:ss + + + + + H:mm + + + + + + d MMMM + M/d + mm:ss + Q yy + yyyy/M + د y د MMMM + + + + + + + + وری + غویی + غبرګولی + چنګاښ + زمری + وږی + تله + لړم + لیندۍ + مرغومی + سلواغه + کب + + + + + + + +HH:mm;-HH:mm + GMT{0} + د {0} په وخت + + کابل + + + + + arabext + + ٫ + ٬ + ٪ + ۰ + − + ×۱۰^ + + + + + #,##0.00 ¤ + + + + + + افغانۍ + ؋ + + + + + diff --git a/lib/zend/Zend/Locale/Data/ps_AF.xml b/lib/zend/Zend/Locale/Data/ps_AF.xml new file mode 100644 index 0000000000..058ec30b7c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ps_AF.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/pt.xml b/lib/zend/Zend/Locale/Data/pt.xml new file mode 100644 index 0000000000..b127cec4b1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/pt.xml @@ -0,0 +1,4338 @@ + + + + + + + + + + + {0} ({1}) + , + + + afar + abcázio + achém + acoli + adangme + adigue + avéstico + africâner + idioma afro-asiático + afrihili + ainu + akan + acadiano + aleúte + idioma algonquiano + altai do sul + amárico + aragonês + inglês arcaico + angika + idioma apache + árabe + aramaico + araucano + arapaho + idioma artificial + arauaqui + assamês + asturiano + idioma atabascano + idioma australiano + avaric + awadhi + aimara + azerbaijano + bashkir + banda + idioma bamileke + balúchi + balinês + basa + idioma báltico + bielo-russo + beja + bemba + berbere + búlgaro + biari + bhojpuri + bislamá + bikol + bini + siksika + bambara + bengali + banto + tibetano + bretão + braj + bósnio + bataque + buriat + buguinês + blin + catalão + caddo + idioma indígena centro-americano + caribe + idioma caucásico + atsam + checheno + cebuano + idioma celta + chamorro + chibcha + chagatai + chuukese + mari + chinook jargon + choctaw + chipewyan + cherokee + cheiene + idioma chamic + córsico + copta + crioulo ou pidgin baseado no inglês + crioulo ou pidgin baseado no francês + crioulo ou pidgin baseado no português + cree + turco da Crimeia + crioulo ou pidgin + tcheco + kashubian + eslavo eclesiástico + idioma cuchítico + chuvash + galês + dinamarquês + dacota + dargwa + dayak + alemão + alemão austríaco + alto alemão suíço + delaware + slave + dogrib + dinka + dogri + idioma dravidiano + sérvio baixo + duala + holandês médio + divehi + diúla + dzonga + eve + efique + egípcio arcaico + ekajuk + grego + elamite + inglês + inglês australiano + inglês canadense + inglês britânico + inglês americano + inglês médio + esperanto + espanhol + espanhol latino-americano + espanhol ibérico + estoniano + basco + ewondo + persa + fangue + fanti + fula + finlandês + filipino + idioma fino-úgrico + fijiano + feroês + fom + francês + francês canadense + francês suíço + francês médio + francês arcaico + frísio setentrional + frisão oriental + friulano + frísio ocidental + irlandês + ga + gayo + gbaia + gaélico escocês + idioma germânico + geez + gilbertês + galego + alemão médio-alto + guarani + alemão arcaico alto + gondi + gorontalo + gótico + grebo + grego arcaico + alemão suíço + guzerate + manx + gwichʼin + hauçá + haida + havaiano + hebraico + híndi + hiligaynon + himachali + hitita + hmong + hiri motu + croata + sorábio superior + haitiano + húngaro + hupa + armênio + herero + interlíngua + iban + indonésio + interlingue + ibo + sichuan yi + ijo + inupiaque + ilocano + idioma índico + idioma indo-europeu + inguche + ido + iraniano + idioma iroquês + islandês + italiano + inuktitut + japonês + lojban + judaico-persa + judaico-arábico + javanês + georgiano + kara-kalpak + kabyle + kachin + jju + kamba + karen + kawi + kabardiano + tyap + koro + congolês + khasi + idioma coisã + khotanês + quicuio + kuanyama + cazaque + groenlandês + cmer + quimbundo + canarês + coreano + concani + kosraean + kpelle + canúri + karachay-balkar + idioma carélio + kru + kurukh + caxemira + curdo + kumyk + kutenai + komi + córnico + quirguiz + latim + ladino + lahnda + lamba + luxemburguês + lezghian + luganda + limburguês + lingala + laosiano + mongo + lozi + lituano + luba-catanga + luba-lulua + luiseno + lunda + luo + lushai + letão + madurês + magahi + maithili + makasar + mandinga + austronésio + massai + mocsa + mandar + mende + malgaxe + irlandês médio + marshalês + maori + miquemaque + minangkabau + idiomas diversos + macedônio + idioma mon-khmer + malaiala + mongol + manchu + manipuri + idioma manobo + moldávio + mohawk + mossi + marata + malaio + maltês + idiomas múltiplos + idiomas munda + creek + mirandês + marwari + birmanês + maia + erzya + nauruano + náuatle + idioma indígena norte-americano + napolitano + bokmål norueguês + ndebele do norte + baixo-alemão + nepali + newari + dongo + nias + idioma cordofano-nigeriano + niueano + holandês + flamengo + nynorsk norueguês + norueguês + nogai + nórdico arcaico + n'ko + ndebele do sul + soto setentrional + idioma núbio + navajo + newari clássico + nianja + nyamwezi + nyankole + nyoro + nzima + occitânico + ojibwa + oromo + oriya + ossetic + osage + turco otomano + idioma otomano + panjabi + idioma papuano + pangasinã + pálavi + pampanga + papiamento + palauano + persa arcaico + idioma filipino + fenício + páli + polonês + pohnpeian + idioma prácrito + provençal arcaico + pashto + português + português do Brasil + português ibérico + quíchua + rajastani + rapanui + rarotongano + reto-romano + rundi + romeno + idioma românico + romani + root + russo + aromeno + kinyarwanda + sânscrito + sandawe + iacuto + idioma indígena sul-americano + idioma salisano + aramaico samaritano + sasak + santali + sardo + siciliano + escocês + sindi + sami do norte + selkup + idioma semítico + sango + irlandês arcaico + linguagem de sinais + servo-croata + shan + cingalês + sidamo + idioma sioux + idioma sino-tibetano + eslovaco + esloveno + idioma eslavo + samoano + sami do sul + idioma sami + lule sami + inari sami + skolt sami + shona + soninquê + somali + sogdiano + songai + albanês + sérvio + idioma surinamês + serere + swati + idioma nilo-saariano + soto do sul + sundanês + sukuma + sosso + sumério + sueco + suaili + siríaco clássico + siríaco + tâmil + idioma tailandês + telugu + timne + tereno + tétum + tadjique + tailandês + tigrínia + tigré + tiv + turcomano + toquelauano + tagalo + klingon + tlinguite + tamaxeque + tswana + tonganês + tonganês de Nyasa + tok pisin + turco + tsonga + tsimshian + tatar + tumbuka + idioma tupi + idioma altaico + tuvaluano + twi + taitiano + tuvinian + udmurt + uighur + ugarítico + ucraniano + umbundu + idioma inválido ou desconhecido + urdu + usbeque + vai + venda + vietnamita + volapuque + votic + valão + idioma wakashan + walamo + waray + washo + idioma sorábio + uólofe + kalmyk + xosa + yao + yapese + iídiche + ioruba + idioma iúpique + zhuang + zapoteca + símbolos blis + zenaga + chinês + chinês simplificado + chinês tradicional + zande + zulu + zunhi + sem conteúdo linguístico + zaza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mundo + África + América do Norte + América do Sul + Oceania + África Ocidental + América Central + África Oriental + África do Norte + África Central + África Austral + Américas + América Setentrional + Caribe + Ásia Oriental + Ásia do Sul + Ásia Centro-Oriental + Europa do Sul + Austrália e Nova Zelândia + Melanésia + Região da Micronésia + Polinésia + Ásia Centro-Meridional + Ásia + Ásia Central + Ásia Ocidental + Europa + Europa Oriental + Europa Setentrional + Europa Ocidental + Comunidade dos Estados Independentes + América Latina e Caribe + Andorra + Emirados Árabes Unidos + Afeganistão + Antígua e Barbuda + Anguilla + Albânia + Armênia + Antilhas Holandesas + Angola + Antártida + Argentina + Samoa Americana + Áustria + Austrália + Aruba + Ilhas Aland + Azerbaijão + Bósnia-Herzegovina + Barbados + Bangladesh + Bélgica + Burquina Faso + Bulgária + Bahrain + Burundi + Benin + São Bartolomeu + Bermudas + Brunei + Bolívia + Brasil + Bahamas + Butão + Ilha Bouvet + Botsuana + Belarus + Belize + Canadá + Ilhas Coco + Congo-Kinshasa + República Centro-Africana + Congo + Suíça + Costa do Marfim + Ilhas Cook + Chile + República dos Camarões + China + Colômbia + Costa Rica + Sérvia e Montenegro + Cuba + Cabo Verde + Ilhas Natal + Chipre + República Tcheca + Alemanha + Djibuti + Dinamarca + Dominica + República Dominicana + Argélia + Equador + Estônia + Egito + Saara Ocidental + Eritreia + Espanha + Etiópia + Finlândia + Fiji + Ilhas Malvinas + Micronésia + Ilhas Faroe + França + Gabão + Reino Unido + Granada + Geórgia + Guiana Francesa + Guernsey + Gana + Gibraltar + Groênlandia + Gâmbia + Guiné + Guadalupe + Guiné Equatorial + Grécia + Geórgia do Sul e Ilhas Sandwich do Sul + Guatemala + Guam + Guiné Bissau + Guiana + Hong Kong, Região Admin. Especial da China + Ilha Heard e Ilhas McDonald + Honduras + Croácia + Haiti + Hungria + Indonésia + Irlanda + Israel + Ilha de Man + Índia + Território Britânico do Oceano Índico + Iraque + Irã + Islândia + Itália + Jersey + Jamaica + Jordânia + Japão + Quênia + Quirguistão + Camboja + Quiribati + Comores + São Cristovão e Nevis + Coreia do Norte + Coreia do Sul + Kuwait + Ilhas Caiman + Casaquistão + República Popular Democrática do Laos + Líbano + Santa Lúcia + Liechtenstein + Sri Lanka + Libéria + Lesoto + Lituânia + Luxemburgo + Letônia + Líbia + Marrocos + Mônaco + Moldávia + Montenegro + São Martinho + Madagascar + Ilhas Marshall + Macedônia + Mali + Mianmar + Mongólia + Macau, Região Admin. Especial da China + Ilhas Marianas do Norte + Martinica + Mauritânia + Montserrat + Malta + Maurício + Maldivas + Malawi + México + Malásia + Moçambique + Namíbia + Nova Caledônia + Níger + Ilha Norfolk + Nigéria + Nicarágua + Holanda + Noruega + Nepal + Nauru + Niue + Nova Zelândia + Omã + Panamá + Peru + Polinésia Francesa + Papua-Nova Guiné + Filipinas + Paquistão + Polônia + Saint Pierre e Miquelon + Pitcairn + Porto Rico + Território da Palestina + Portugal + Palau + Paraguai + Catar + Oceania Remota + União Europeia + Reunião + Romênia + Sérvia + Rússia + Ruanda + Arábia Saudita + Ilhas Salomão + Seychelles + Sudão + Suécia + Cingapura + Santa Helena + Eslovênia + Svalbard e Jan Mayen + Eslováquia + Serra Leoa + San Marino + Senegal + Somália + Suriname + São Tomé e Príncipe + El Salvador + Síria + Suazilândia + Ilhas Turks e Caicos + Chade + Territórios Franceses do Sul + Togo + Tailândia + Tadjiquistão + Tokelau + Timor Leste + Turcomenistão + Tunísia + Tonga + Turquia + Trinidad e Tobago + Tuvalu + Taiwan + Tanzânia + Ucrânia + Uganda + Ilhas Menores Distantes dos Estados Unidos + Estados Unidos + Uruguai + Uzbequistão + Vaticano + São Vicente e Granadinas + Venezuela + Ilhas Virgens Britânicas + Ilhas Virgens dos EUA + Vietnã + Vanuatu + Wallis e Futuna + Samoa + Iêmen + Mayotte + África do Sul + Zâmbia + Zimbábue + Região desconhecida ou inválida + + + ortografia alemã tradicional + ortografia resiana padronizada + ortografia alemã de 1996 + francês antigo de 1606 + francês da idade moderna + armênio oriental + armênio ocidental + alfabeto latino turco unificado + dialeto san giorgio/bila + boontling + fonética do Alfabeto Fonético Internacional + fonética do Alfabeto Fonético Urálico + dialeto lipovaz de Resian + monotônico + dialeto natisone + dialeto gniva/njiva + dialeto oseacco/osojane + politônico + computador + Ortografia Revisada + resiano + saho + inglês padrão escocês + scouse + dialeto stolvizza/solbica + ortografia taraskievica + valenciano + + + Calendário + Ordenação + Moeda + + + Ordem do Chinês Tradicional - Big5 + Calendário Budista + Calendário Chinês + Ordem Direta + Ordem do Chinês Simplificado - GB2312 + Calendário Gregoriano + Calendário Hebraico + Calendário Nacional Indiano + Calendário Islâmico + Calendário Civil Islâmico + Calendário Japonês + Ordem de Lista Telefônica + Ordem Pin-yin + Calendário da República da China + Ordem dos Traços + Ordem Tradicional + + + americano + métrico + + + Idioma: {0} + Roteiro: {0} + Região: {0} + + + + [a á à â ã b c ç d e é ê f-i í j-o ó ò ô õ p-u ú v-z] + [ă å ä ā æ-è ĕ ë ē ì ĭ î ï ī ñ ŏ ö ø ō œ ß ù ŭ û ü ū ÿ] + [a-c č d-l ł m-z] + + + “ + ” + ‘ + ’ + + + + + + + + EEEE, d 'de' MMMM 'de' y G + + + + + d 'de' MMMM 'de' y G + + + + + d 'de' MMMM 'de' y G + + + + + d/M/yyyy + + + + + + MM-yy + + + + + + + + jan + fev + mar + abr + mai + jun + jul + ago + set + out + nov + dez + + + janeiro + fevereiro + março + abril + maio + junho + julho + agosto + setembro + outubro + novembro + dezembro + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + dom + seg + ter + qua + qui + sex + sáb + + + domingo + segunda-feira + terça-feira + quarta-feira + quinta-feira + sexta-feira + sábado + + + + + D + S + T + Q + Q + S + S + + + + + + + T1 + T2 + T3 + T4 + + + 1º trimestre + 2º trimestre + 3º trimestre + 4º trimestre + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Antes de Cristo + Ano do Senhor + + + a.C. + d.C. + + + + + + EEEE, d 'de' MMMM 'de' y + + + + + d 'de' MMMM 'de' y + + + + + dd/MM/yyyy + + + + + dd/MM/yy + + + + + + + HH'h'mm'min'ss's' zzzz + + + + + HH'h'mm'min'ss's' z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + EEE, d + HH'h'mm + H'h'mm'min'ss's' + H'h'mm + L + EEE, dd/MM + LLL + EEE, d 'de' MMM + EEE, d 'de' MMMM + d 'de' MMMM + d 'de' MMM + dd/MM + d/M + d + mm'min'ss's' + mm'min'ss's' + y + MM/yyyy + EEE, dd/MM/yyyy + MMM 'de' y + EEE, d 'de' MMM 'de' y + MMMM 'de' y + yyyy Q + y QQQ + MM/yy + MMM 'de' yy + EEE, d 'de' MMM 'de' yy + d 'de' MMM 'de' yy + Q yy + MM/yyyy + MMM 'de' y + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + MMM - MMM + + + E, d 'de' MMM - E, d 'de' MMM + E, d - E, d 'de' MMM + + + LLLL - LLLL + + + d 'de' MMM - d 'de' MMM + d-d 'de' MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + H'h' - H'h' + H'h' - H'h' + + + H'h'mm - H'h'mm + H'h'mm - H'h'mm + H'h'mm - H'h'mm + + + H'h'mm - H'h'mm v + H'h'mm - H'h'mm v + H'h'mm - H'h'mm v + + + H'h'mm - H'h'mm v + H'h'mm - H'h'mm v + + + y - y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E, dd/MM/yy - E, dd/MM/yy + E, dd/MM/yy - E, dd/MM/yy + E, dd/MM/yy - E, dd/MM/yy + + + MMM-MMM 'de' y + MMM 'de' y - MMM 'de' y + + + E, d 'de' MMM - E, d 'de' MMM 'de' y + E, d - E, d 'de' MMM 'de' y + E, d 'de' MMM 'de' y - E, d 'de' MMM 'de' y + + + MM – MM-yyyy + MM-yyyy – MM-yyyy + + + d 'de' MMM - d 'de' MMM 'de' y + d-d 'de' MMM 'de' y + d 'de' MMM 'de' y - d 'de' MMM 'de' y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + Era + + + Ano + + + Mês + + + Semana + + + Dia + Há três dias + Anteontem + Ontem + Hoje + Amanhã + Depois de amanhã + Daqui a três dias + + + Dia da semana + + + Período do dia + + + Hora + + + Minuto + + + Segundo + + + Fuso + + + + + + + + EEEE, d MMMM y G + + + + + d 'de' MMMM 'de' y G + + + + + d MMM y G + + + + + d/M/yy + + + + + + + + Antes de R.O.C. + + + Antes de R.O.C. + + + + + + +HH:mm;-HH:mm + GMT{0} + Horário {0} + {1} ({0}) + + Desconhecido + + + Cabul + + + Antígua + + + Anguila + + + Tirana + + + Ierevan + + + Curaçao + + + Pólo Sul + + + Tucumã + + + Córdoba + + + Viena + + + Dacca + + + Bruxelas + + + Sófia + + + Barein + + + Porto Novo + + + Bermudas + + + Eirunepé + + + Cuiabá + + + Santarém + + + Belém + + + Araguaína + + + São Paulo + + + Maceió + + + Fernando de Noronha + + + St. Johns + + + Zurique + + + Abidjã + + + Ilha de Páscoa + + + Xangai + + + Bogotá + + + Cabo Verde + + + Nicósia + + + Berlim + + + Djibuti + + + Copenhague + + + Argel + + + Galápagos + + + Guaiaquil + + + Canárias + + + Madri + + + Helsinque + + + Ilhas Faroe + + + Londres + + + Granada + + + Caiena + + + Guadalupe + + + Atenas + + + Geórgia do Sul + + + Guiana + + + Porto Príncipe + + + Budapeste + + + Jacarta + + + Jerusalém + + + Bagdá + + + Teerã + + + Roma + + + Amã + + + Tóquio + + + Nairóbi + + + São Cristóvão + + + Seul + + + Caimã + + + Vienciana + + + Beirute + + + Santa Lúcia + + + Monróvia + + + Luxemburgo + + + Trípoli + + + Mônaco + + + Martinica + + + Ilhas Maurício + + + Maldivas + + + Cidade do México + + + Mérida + + + Cancún + + + Manágua + + + Amsterdã + + + Catmandu + + + Panamá + + + Taiti + + + Varsóvia + + + Porto Rico + + + Açores + + + Lisboa + + + Asunción + + + Catar + + + Ilha Reunião + + + Bucareste + + + Moscou + + + Volgogrado + + + Ecaterimburgo + + + Riad + + + Estocolmo + + + Cingapura + + + Santa Helena + + + Dacar + + + São Tomé + + + Salvador + + + Damasco + + + Lomé + + + Tunísia + + + Istambul + + + Porto Espanha + + + New Salen, Dakota do Norte + + + Central, Dakota do Norte + + + Indianápolis + + + Nova York + + + Montevidéu + + + São Vicente + + + St. Thomas + + + Ilha Mayotte + + + Johannesburgo + + + + Horário do Acre + Horário de Verão do Acre + + + ACT + ACST + + true + + + + Horário do Afeganistão + + + + + Horário da África Central + + + + + Horário da África Oriental + + + + + Horário da África do Sul + Horário Padrão da África do Sul + + + + + Horário da África Ocidental + Horário de Verão da África Ocidental + + + + + Horário do Aktyubinsk + Horário de Verão do Aktyubinsk + + + + + Horário do Alaska + Horário Padrão do Alasca + Horário de Verão do Alasca + + + AKT + + true + + + + Horário do Alasca-Havaí + Horário Padrão do Alaska-Havaí + Horário de Verão do Alaska-Havaí + + + AHT + + + + + Horário do Almaty + Horário de Verão do Almaty + + + + + Horário do Amazonas + Horário de Verão do Amazonas + + true + + + + Horário Central + Horário Padrão Central + Horário de Verão Central + + + CT + CST + CDT + + + + + Horário Oriental + Horário Padrão Oriental + Horário de Verão Oriental + + + ET + EST + EDT + + + + + Horário da Montanha + Horário Padrão da Montanha + Horário de Verão da Montanha + + + MT + MST + MDT + + + + + Horário do Pacífico + Horário Padrão do Pacífico + Horário de Verão do Pacífico + + + PT + PST + PDT + + + + + Horário do Anadyr + Horário de Verão do Anadyr + + + + + Horário do Aqtau + Horário de Verão do Aqtau + + + + + Horário do Aqtobe + Horário de Verão do Aqtobe + + + + + Horário da Arábia + Horário Padrão da Arábia + Horário de Verão da Arábia + + + AT (Arábia) + AST (Arábia) + ADT (Arábia) + + + + + Horário da Argentina + Horário de Verão da Argentina + + + + + Horário da Argentina Ocidental + + + + + Horário da Armênia + Horário de Verão da Armênia + + + AMT (Armênia) + AMST (Armênia) + + + + + Horário de Ashkhabad + Horário de Verão de Ashkhabad + + + + + Horário do Atlântico + Horário Padrão do Atlântico + Horário de Verão do Atlântico + + + AT + AST + ADT + + + + + Horário da Austrália Central + Horário Padrão da Austrália Central + Horário de Verão da Austrália Central + + + ACT (Austrália) + ACST (Austrália) + + + + + Horário da Austrália Centro-Ocidental + Horário Padrão da Austrália Centro-Ocidental + Horário de Verão da Austrália Centro-Ocidental + + + ACWT + + + + + Horário da Austrália Oriental + Horário Padrão da Austrália Oriental + Horário de Verão da Austrália Oriental + + + AET + + + + + Horário da Austrália Ocidental + Horário Padrão da Austrália Ocidental + Horário de Verão da Austrália Ocidental + + + AWT + + + + + Horário do Arzeibaijão + Horário de Verão do Arzeibaijão + + + + + Horário dos Açores + Horário de Verão dos Açores + + + + + Horário de Baku + Horário de Verão de Baku + + + + + Horário de Bangladesh + + + + + Horário de Bering + Horário Padrão de Bering + Horário de Verão de Bering + + + BT (Bering) + + + + + Horário do Butão + + + + + Horário da Bolívia + + + + + Horário de Bornéu + Horário de Verão de Bornéu + + + + + Horário de Brasília + Horário de Verão de Brasília + + true + + + + Horário de Brunei Darussalam + + + + + Horário do Cabo Verde + Horário de Verão do Cabo Verde + + + + + Horário de Chamorro + Horário Padrão de Chamorro + + + ChT + + + + + Horário de Changbai + + + + + Horário de Padrão de Chatham + Horário de Verão de Chatham + + + + + Horário do Chile + Horário de Verão do Chile + + + + + Horário da China + Horário Padrão da China + Horário de Verão da China + + + CT (China) + CST (China) + CDT (China) + + + + + Horário de Choibalsan + Horário de Verão de Choibalsan + + + + + Horário das Ilhas Christmas + + + + + Horário das Ilhas Coco + + + + + Horário da Colômbia + Horário de Verão da Colômbia + + + + + Horário das Ilhas Cook + Meio Horário de Verão das Ilhas Cook + + + + + Horário de Cuba + Horário Padrão de Cuba + Horário de Verão de Cuba + + + CST (Cuba) + CDT (Cuba) + + + + + Horário de Dacca + + + + + Horário de Davis + + + + + Horário de Dumont-d'Urville + + + + + Horário de Dushanbe + Horário de Verão de Dushanbe + + + + + Horário da Guiana Holandesa + + + + + Horário do Timor-Leste + + + + + Horário da Ilha de Páscoa + Horário de Verão da Ilha de Páscoa + + + + + Horário do Equador + + + + + Horário da Europa Central + Horário de Verão da Europa Central + + + CET + CEST + + + + + Horário Padrão da Europa Oriental + Horário de Verão da Europa Oriental + + + EET + EEST + + + + + Horário da Europa Ocidental + Horário de Verão da Europa Ocidental + + + WET + WEST + + + + + Horário das Ilhas Falkland + Horário de Verão das Ilhas Falkland + + + + + Horário de Fiji + Horário de Verão de Fiji + + + + + Horário da Guiana Francesa + + + + + Horário da Antártida e do Sul da França + + + + + Horário de Frunze + Horário de Verão de Frunze + + + + + Horário do Meridiano de Greenwich + + + GMT + + true + + + + Horário de Galápagos + + + + + Horário de Gambier + + + + + Horário da Geórgia + Horário de Verão da Geórgia + + + + + Horário das Ilhas Gilberto + + + + + Horário da Groelândia Central + Horário de Verão da Groenlândia Central + + + + + Horário da Groelândia Oriental + Horário de Verão da Groelândia Oriental + + + + + Horário da Groenlândia Ocidental + Horário de Verão da Groenlândia Ocidental + + + + + Horário Padrão de Guam + + + GST (Guam) + + + + + Horário do Golfo + Horário Padrão do Golfo + + + GT + + + + + Horário da Guiana + + + + + Horário Padrão do Havaí-Aleuta + + true + + + + Horário de Hong Kong + Horário de Verão de Hong Kong + + + + + Horário de Hovd + Horário de Verão de Hovd + + + + + Horário Padrão da Índia + + + + + Horário do Oceano Índico + + + + + Horário da Indochina + + + + + Horário da Indonésia Central + + + + + Horário da Indonésia Oriental + + + + + Horário da Indonésia Ocidental + + + + + Horário Padrão do Irã + Horário de Verão do Irã + + + + + Horário de Irkutsk + Horário de Verão de Irkutsk + + + + + Horário de Israel + Horário Padrão de Israel + Horário de Verão de Israel + + + IST (Israel) + + + + + Horário do Japão + Horário Padrão do Japão + Horário de Verão do Japão + + + JT + + + + + Horário de Petropavlovsk-Kamchatski + Horário de Verão de Petropavlovsk-Kamchatski + + + + + Horário de Karachi + + + + + Horário de Kashgar + + + + + Horário do Casaquistão Oriental + Horário Padrão do Cazaquistão Oriental + + + + + Horário do Casaquistão Ocidental + Horário Padrão do Casaquistão Ocidental + + + + + Horário de Kizilorda + Horário de Verão de Kizilorda + + + + + Horário da Coréia + Horário Padrão da Coréia + Horário de Verão da Coréia + + + + + Horário de Kosrae + + + + + Horário de Krasnoyarsk + Horário de Verão de Krasnoyarsk + + + + + Horário de Kuybyshev + Horário de Verão de Kuybyshev + + + + + Horário de Kwajalein + + + + + Horário do Quirguistão + + + + + Horário de Lanka + + + + + Horário das Ilhas Line + + + + + Horário de Long-Shu + + + + + Horário de Lord Howe + Horário Padrão de Lord Howe + Horário de Verão de Lord Howe + + + LHT + + + + + Horário de Macau + Horário de Verão de Macau + + + + + Horário de Magadan + Horário de Verão de Magadan + + + + + Horário de Malaia + + + + + Horário da Malásia + + + + + Horário das Ilhas Maldivas + + + + + Horário das Marquesas + + + + + Horário das Ilhas Marshall + + + + + Horário das Ilhas Maurício + Horário de Verão das Ilhas Maurício + + + + + Horário de Mawson + + + + + Horário de Ulan Bator + Horário de Verão de Ulan Bator + + + + + Horário de Moscou + Horário Padrão de Moscou + Horário de Verão de Moscou + + + + + Horário de Mianmar + + + + + Horário de Nauru + + + + + Horário do Nepal + + + + + Horário da Nova Caledônia + Horário de Verão da Nova Caledônia + + + + + Horário da Nova Zelândia + Horário Padrão da Nova Zelândia + Horário de Verão da Nova Zelândia + + + NZT + + + + + Horário de Terra Nova + Horário Padrão de Terra Nova + Horário de Verão de Terra Nova + + + NT + + + + + Horário de Niue + + + + + Horário das Ilhas Norfolk + + + + + Horário de Fernando de Noronha + Horário de Verão de Fernando de Noronha + + + + + Horário das Ilhas Mariana do Norte + + + + + Horário de Novosibirsk + Horário de Verão de Novosibirsk + + + + + Horário de Omsk + Horário de Verão de Omsk + + + + + Horário do Paquistão + Horário de Verão do Paquistão + + + + + Horário de Palau + + + + + Horário de Papua Nova Guiné + + + + + Horário do Paraguai + Horário de Verão do Paraguai + + + + + Horário do Peru + Horário de Verão do Peru + + + + + Horário das Filipinas + Horário de Verão das Filipinas + + + + + Horário das Ilhas Fênix + + + + + Horário de Pierre e Miquelon + Horário Padrão de Pierre e Miquelon + Horário de Verão de Pierre e Miquelon + + + PMT + + + + + Horário de Pitcairn + + + + + Horário de Ponape + + + + + Horário de Qyzylorda + Horário de Verão de Qyzylorda + + + + + Horário das Ilhas Reunião + + + + + Horário de Rothera + + + + + Horário de Sakhalin + Horário de Verão de Sakhalin + + + + + Horário de Samara + Horário de Verão de Samara + + + + + Horário de Samarkand + Horário de Verão de Samarkand + + + + + Horário Padrão de Samoa + + + + + Horário das Ilhas Seychelles + + + + + Horário de Shevchenko + Horário de Verão de Shevchenko + + + + + Horário Padrão de Cingapura + + + + + Horário das Ilhas Salomão + + + + + Horário da Geórgia do Sul + + + GST (Geórgia do Sul) + + + + + Horário do Suriname + + + + + Horário de Sverdlovsk + Horário de Verão de Sverdlovsk + + + + + Horário de Syowa + + + + + Horário do Taiti + + + + + Horário do Tajiquistão + + + + + Horário de Tashkent + Horário de Verão de Tashkent + + + + + Horário de Tbilisi + Horário de Verão de Tbilisi + + + + + Horário de Tokelau + + + + + Horário de Tonga + Horário de Verão de Tonga + + + + + Horário de Truk + + + + + Horário da Turquia + Horário de Verão da Turquia + + + + + Horário do Turcomenistão + Horário de Verão do Turcomenistão + + + + + Horário de Tuvalu + + + + + Horário de Ural'sk + Horário de Verão de Ural'sk + + + + + Horário do Uruguai + Horário de Verão do Uruguai + + + + + Horário de Urumqi + + + + + Horário do Uzbequistão + Horário de Verão do Uzbequistão + + + + + Horário de Vanuatu + Horário de Verão de Vanuatu + + + + + Horário da Venezuela + + + + + Horário de Vladivostok + Horário de Verão de Vladivostok + + + + + Horário de Volvogrado + Horário de Verão de Volvogrado + + + + + Horário de Vostok + + + + + Horário das Ilhas Wake + + + + + Horário de Wallis e Futuna + + + + + Horário de Yakutsk + Horário de Verão de Yakutsk + + + + + Horário de Yekaterinburg + Horário de Verão de Yekaterinburg + + + + + Horário de Yerevan + Horário de Verão de Yerevan + + + + + Horário de Yukon + Horário Padrão de Yukon + Horário de Verão de Yukon + + + YT + + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00;(¤#,##0.00) + + + {0} {1} + {0} {1} + + + + Peseta de Andorra + Peseta de Andorra + Pesetas de Andorra + + + Dirém dos Emirados Árabes Unidos + Dirrã dos Emirados Árabes Unidos + Dirrãs dos Emirados Árabes Unidos + + + Afegane (1927-2002) + Afegane do Afeganistão (AFA) + Afeganes do Afeganistão (AFA) + + + Afegane + Afegane do Afeganistão + Afeganes do Afeganistão + + + Lek Albanês + Lek albanês + Leks albaneses + + + Dram armênio + Dram armênio + Drams armênios + + + Guilder das Antilhas Holandesas + Florim das Antilhas Holandesas + Florins das Antilhas Holandesas + + + Cuanza angolano + Kwanza angolano + Kwanzas angolanos + + + Cuanza angolano (1977-1990) + Kwanza angolano (AOK) + Kwanzas angolanos (AOK) + + + Novo cuanza angolano (1990-2000) + Novo kwanza angolano (AON) + Novos kwanzas angolanos (AON) + + + Cuanza angolano reajustado (1995-1999) + Kwanza angolano reajustado (AOR) + Kwanzas angolanos reajustados (AOR) + + + Austral argentino + Austral argentino + Austrais argentinos + + + Peso argentino (1983-1985) + Peso argentino (ARP) + Pesos argentinos (ARP) + + + Peso argentino + Peso argentino + Pesos argentinos + + + Xelim austríaco + Schilling australiano + Schillings australianos + + + Dólar australiano + Dólar australiano + Dólares australianos + + + Guilder de Aruba + Florim de Aruba + Florins de Aruba + + + Manat azerbaijano + Manat do Azeibaijão (AZM) + Manats do Azeibaijão (AZM) + + + Manat do Azerbaijão + Manat do Azeibaijão + Manats do Azeibaijão + + + Dinar da Bósnia-Herzegovina + Dinar da Bósnia Herzegovina + Dinares da Bósnia Herzegovina + + + Marco bósnio-herzegovino conversível + Marca conversível da Bósnia Herzegovina + Marcas conversíveis da Bósnia Herzegovina + + + Dólar de Barbados + Dólar de Barbados + Dólares de Barbados + + + Taka de Bangladesh + Taka de Bangladesh + Takas de Bangladesh + + + Franco belga (conversível) + Franco belga (conversível) + Francos belgas (conversíveis) + + + Franco belga + Franco belga + Francos belgas + + + Franco belga (financeiro) + Franco belga (financeiro) + Francos belgas (financeiros) + + + Lev forte búlgaro + Lev forte búlgaro + Levs fortes búlgaros + + + Lev novo búlgaro + Lev búlgaro + Levs búlgaros + + + Dinar bareinita + Dinar bareinita + Dinares bareinitas + + + Franco do Burundi + Franco burundiano + Francos burundianos + + + Dólar das Bermudas + Dólar bermudense + Dólares bermudenses + + + Dólar do Brunei + Dólar bruneano + Dólares bruneanos + + + Boliviano + Boliviano + Bolivianos + + + Peso boliviano + Peso boliviano + Pesos bolivianos + + + Mvdol boliviano + Mvdol boliviano + Mvdols bolivianos + + + Cruzeiro novo brasileiro (1967-1986) + Cruzeiro novo brasileiro (BRB) + Cruzeiros novos brasileiros (BRB) + + + Cruzado brasileiro + Cruzado brasileiro + Cruzados brasileiros + + + Cruzeiro brasileiro (1990-1993) + Cruzeiro brasileiro (BRE) + Cruzeiros brasileiros (BRE) + + + Real brasileiro + Real brasileiro + Reais brasileiros + + + Cruzado novo brasileiro + Cruzado novo brasileiro + Cruzados novos brasileiros + + + Cruzeiro brasileiro + Cruzeiro brasileiro + Cruzeiros brasileiros + + + Dólar das Bahamas + Dólar de Bahamian + Dólares de Bahamian + + + Ngultrum do Butão + Ngultrum butanês + Ngultruns butaneses + + + Kyat birmanês + Kyat burmês + Kyats burmeses + + + Pula botsuanesa + Pula de Botsuana + Pulas de Botsuana + + + Rublo novo bielo-russo (1994-1999) + Novo rublo bielorusso (BYB) + Novos rublos bielorussos (BYB) + + + Rublo bielo-russo + Rublo bielorusso + Rublos bielorussos + + + Dólar do Belize + Dólar belizenho + Dólares belizenhos + + + Dólar canadense + Dólar canadense + Dólares canadenses + + + Franco congolês + Franco congolês + Francos congoleses + + + Euro WIR + Euro WIR + Euros WIR + + + Franco suíço + Franco suíço + Francos suíços + + + Franco WIR + Franco WIR + Francos WIR + + + Unidades de Fomento chilenas + Unidade de fomento chilena + Unidades de fomento chilenas + + + Peso chileno + Peso chileno + Pesos chilenos + + + Yuan Renminbi chinês + Yuan chinês + Yuans chineses + + + Peso colombiano + Peso colombiano + Pesos colombianos + + + Unidade de Valor Real + Unidade de valor real + Unidades de valor real + + + Colon da Costa Rica + Colon costa-riquenho + Colons costa-riquenhos + + + Dinar sérvio antigo + Dinar antigo da Sérvia + Dinares antigos da Sérvia + + + Coroa Forte checoslovaca + Coroa forte tchecoslovaca + Coroas fortes tchecoslovacas + + + Peso cubano + Peso cubano + Pesos cubanos + + + Escudo cabo-verdiano + Escudo cabo-verdiano + Escudos cabo-verdianos + + + Libra cipriota + Libra cipriota + Libras cipriotas + + + Coroa checa + Coroa da República Tcheca + Coroas da República Tcheca + + + Ostmark da Alemanha Oriental + Marco da Alemanha Oriental + Marcos da Alemanha Oriental + + + Marco alemão + Marco alemão + Marcos alemães + + + Franco do Djibuti + Franco djibutiense + Francos djibutienses + + + Coroa dinamarquesa + Coroa dinamarquesa + Coroas dinamarquesas + + + Peso dominicano + Peso dominicano + Pesos dominicanos + + + Dinar argelino + Dinar argelino + Dinares argelinos + + + Sucre equatoriano + Sucre equatoriano + Sucres equatorianos + + + Unidade de Valor Constante (UVC) do Equador + Unidade de valor constante equatoriana (UVC) + Unidades de valor constante equatorianas (UVC) + + + Coroa estoniana + Coroa estoniana + Coroas estonianas + + + Libra egípcia + Libra egípcia + Libras egípcias + + + Nakfa da Eritreia + Nakfa da Eritreia + Nakfas da Eritreia + + + Peseta espanhola (conta A) + Peseta espanhola (conta A) + Pesetas espanholas (conta A) + + + Peseta espanhola (conta conversível) + Peseta espanhola (conta conversível) + Pesetas espanholas (conta conversível) + + + Peseta espanhola + Peseta espanhola + Pesetas espanholas + + + Birr etíope + Birr etíope + Birrs etíopes + + + Euro + euro + euros + + + Marca finlandesa + Marco finlandês + Marcos finlandeses + + + Dólar de Fiji + Dólar de Fiji + Dólares de Fiji + + + Libra das Malvinas + Libra das Ilhas Falkland + Libras das Ilhas Falkland + + + Franco francês + Franco francês + Francos franceses + + + Libra esterlina britânica + Libra esterlina britânica + Libras esterlinas britânicas + + + Cupom Lari georgiano + Kupon larit da Geórgia + Kupon larits da Geórgia + + + Lari georgiano + Lari da Geórgia + Laris da Geórgia + + + Cedi de Gana (1979-2007) + Cedi de Gana (GHC) + Cedis de Gana (GHC) + + + Cedi ganês + Cedi de Gana + Cedis de Gana + + + Libra de Gibraltar + Libra de Gibraltar + Libras de Gibraltar + + + Dalasi de Gâmbia + Dalasi da Gâmbia + Dalasis da Gâmbia + + + Franco de Guiné + Franco guineano + Francos guineanos + + + Syli da Guiné + Syli guineano + Sylis guineanos + + + Ekwele da Guiné Equatorial + Ekwele da Guiné Equatorial + Ekweles da Guiné Equatorial + + + Dracma grego + Dracma grego + Dracmas gregos + + + Quetçal da Guatemala + Quetzal da Guatemala + Quetzales da Guatemala + + + Escudo da Guiné Portuguesa + Escudo da Guiné Portuguesa + Escudos da Guinéa Portuguesa + + + Peso da Guiné-Bissau + Peso de Guiné-Bissau + Pesos de Guiné-Bissau + + + Dólar da Guiana + Dólar da Guiana + Dólares da Guiana + + + Dólar de Hong Kong + Dólar de Hong Kong + Dólares de Hong Kong + + + Lempira de Honduras + Lempira de Honduras + Lempiras de Honduras + + + Dinar croata + Dinar croata + Dinares croatas + + + Kuna croata + Kuna croata + Kunas croatas + + + Gurde do Haiti + Gourde haitiano + Gourdes haitianos + + + Forinte húngaro + Forint húngaro + Forints húngaros + + + Rupia indonésia + Rúpia da Indonésia + Rúpias da Indonésia + + + Libra irlandesa + Libra irlandesa + Libras irlandesas + + + Libra israelita + Libra israelita + Libras israelitas + + + Sheqel antigo israelita + Sheqel antigo israelita + Sheqels antigos israelitas + + + Sheqel Novo israelita + Sheqel novo israelita + Sheqels novo israelitas + + + Rúpia indiana + Rúpia indiana + Rúpias indianas + + + Dinar iraquiano + Dinar iraquiano + Dinares iraquianos + + + Rial iraniano + Rial iraniano + Riales iranianos + + + Coroa antiga islandesa + Coroa antiga islandesa + Coroas antigas islandesas + + + Coroa islandesa + Coroa islandesa + Coroas islandesas + + + Lira italiana + Lira italiana + Liras italianas + + + Dólar jamaicano + Dólar jamaicano + Dólares jamaicanos + + + Dinar jordaniano + Dinar jordaniano + Dinares jordanianos + + + Iene japonês + Iene japonês + Ienes japoneses + + + Xelim queniano + Shilling queniano + Shillings quenianos + + + Som quirguiz + Som do Quirguistão + Soms do Quirguistão + + + Riel cambojano + Riel cambojano + Rieles cambojanos + + + Franco de Comores + Franco de Comoro + Francos de Comoro + + + Won norte-coreano + Won norte-coreano + Wons norte-coreanos + + + Won sul-coreano + Won sul-coreano + Wons sul-coreanos + + + Dinar coveitiano + Dinar kuwaitiano + Dinares kuwaitianos + + + Dólar das Ilhas Caiman + Dólar das Ilhas Cayman + Dólares das Ilhas Caiman + + + Tenge do Cazaquistão + Tenge do Cazaquistão + Tenges do Cazaquistão + + + Kip de Laos + Kip do Laos + Kips do Laos + + + Libra libanesa + Libra libanesa + Libras libanesas + + + Rupia do Sri Lanka + Rúpia do Sri Lanka + Rúpias do Sri Lanka + + + Dólar liberiano + Dólar da Libéria + Dólares da Libéria + + + Loti do Lesoto + Loti do Lesoto + Lotis do Lesoto + + + Lita lituano + Litas lituana + Litai lituanas + + + Talonas lituano + Talonas lituanas + Talonases lituanas + + + Franco conversível de Luxemburgo + Franco conversível de Luxemburgo + Francos conversíveis de Luxemburgo + + + Franco luxemburguês + Franco de Luxemburgo + Francos de Luxemburgo + + + Franco financeiro de Luxemburgo + Franco financeiro de Luxemburgo + Francos financeiros de Luxemburgo + + + Lats letão + Lats da Letônia + Latses da Letônia + + + Rublo letão + Rublo da Letônia + Rublos da Letônia + + + Dinar líbio + Dinar líbio + Dinares líbios + + + Dirém marroquino + Dirrã marroquino + Dirrãs marroquinos + + + Franco marroquino + Franco marroquino + Francos marroquinos + + + Leu moldávio + Leu da Moldávia + Leus da Moldávia + + + Ariary de Madagascar + Ariari de Madagascar + Ariaries de Madagascar + + + Franco de Madagascar + Franco de Madagascar + Francos de Madagascar + + + Dinar macedônio + Dinar da Macedônia + Dinares da Macedônia + + + Franco de Mali + Franco de Mali + Francos de Mali + + + Kyat de Mianmar + Kyat de Mianmar + Kyats de Mianmar + + + Tugrik mongol + Tugrik da Mongólia + Tugriks da Mongólia + + + Pataca macaense + Pataca de Macau + Patacas de Macau + + + Ouguiya da Mauritânia + Ouguiya da Mauritânia + Ouguiyas da Mauritânia + + + Lira maltesa + Lira Maltesa + Liras maltesas + + + Libra maltesa + Libra maltesa + Libras maltesas + + + Rupia de Maurício + Rúpia mauriciana + Rúpias mauricianas + + + Rupias das Ilhas Maldivas + Rufiyaa das Ilhas Maldivas + Rufiyaas das Ilhas Maldivas + + + Cuacha do Maláui + Kwacha do Malawi + Kwachas do Malawi + + + Peso mexicano + Peso mexicano + Pesos mexicanos + + + Peso Prata mexicano (1861-1992) + Peso de prata mexicano (MXP) + Pesos de prata mexicanos (MXP) + + + Unidade Mexicana de Investimento (UDI) + Unidade de investimento mexicana (UDI) + Unidades de investimento mexicanas (UDI) + + + Ringgit malaio + Ringgit malaio + Ringgits malaios + + + Escudo de Moçambique + Escudo de Moçambique + Escudos de Moçambique + + + Metical antigo de Moçambique + Metical antigo de Moçambique + Meticales antigos de Moçambique + + + Metical do Moçambique + Metical de Moçambique + Meticales de Moçambique + + + Dólar da Namíbia + Dólar da Namíbia + Dólares da Namíbia + + + Naira nigeriana + Naira da Nigéria + Nairas da Nigéria + + + Córdoba nicaraguense + Córdoba nicaraguense + Córdobas da Nicarágua + + + Córdoba Ouro nicaraguense + Córdoba de ouro da Nicarágua + Córdobas de ouro da Nicarágua + + + Florim holandês + Florim holandês + Florins holandeses + + + Coroa norueguesa + Coroa norueguesa + Coroas norueguesas + + + Rupia nepalesa + Rúpia nepalesa + Rúpias nepalesas + + + Dólar da Nova Zelândia + Dólar da Nova Zelândia + Dólares da Nova Zelândia + + + Rial de Omã + Rial de Omã + Riales de Omã + + + Balboa panamenho + Balboa do Panamá + Balboas do Panamá + + + Inti peruano + Inti peruano + Intis peruanos + + + Sol Novo peruano + Novo sol peruano + Novos soles peruanos + + + Sol peruano + Sol peruano + Soles peruanos + + + Kina da Papua-Nova Guiné + Kina de Papua Nova Guiné + Kinas de Papua Nova Guiné + + + Peso filipino + Peso filipino + Pesos filipinos + + + Rupia paquistanesa + Rúpia paquistanesa + Rúpias paquistanesas + + + Zloti polonês + Zloti polonês + Zlotis poloneses + + + Zloti polonês (1950-1995) + Zloti polonês (PLZ) + Zlotis poloneses (PLZ) + + + Escudo português + Escudo português + Escudos portugueses + Esc. + + + Guarani paraguaio + Guarani paraguaio + Guaranis paraguaios + + + Rial catariano + Rial do Qatar + Riales do Qatar + + + Dólar rodesiano + Dólar da Rodésia + Dólares da Rodésia + + + Leu romeno antigo + Leu antigo da Romênia + Leus antigos da Romênia + + + Leu romeno + Leu da Romênia + Lei da Romênia + + + Dinar sérvio + Dinar sérvio + Dinares sérvios + + + Rublo russo + Rublo russo + Rublos russos + + + Rublo russo (1991-1998) + Rublo russo (RUR) + Rublos russos (RUR) + + + Franco ruandês + Franco de Ruanda + Francos de Ruanda + + + Rial saudita + Riyal saudita + Riyales sauditas + + + Dólar das Ilhas Salomão + Dólar das Ilhas Salomão + Dólares das Ilhas Salomão + + + Rupia das Seychelles + Rúpia das Ilhas Seychelles + Rúpias das Ilhas Seychelles + + + Dinar sudanês + Dinar antigo do Sudão + Dinares antigos do Sudão + + + Libra sudanesa + Libra sudanesa + Libras sudanesas + + + Libra sudanesa antiga + Libra antiga sudanesa + Libras antigas sudanesas + + + Coroa sueca + Coroa sueca + Coroas suecas + + + Dólar de Cingapura + Dólar de Singapura + Dólares de Singapura + + + Libra de Santa Helena + Libra de Santa Helena + Libras de Santa Helena + + + Tolar Bons esloveno + Tolar da Eslovênia + Tolares da Eslovênia + + + Coroa eslovaca + Coroa eslovaca + Coroas eslovacas + + + Leone de Serra Leoa + Leone de Serra Leoa + Leones de Serra Leoa + + + Xelim somali + Shilling da Somália + Shillings da Somália + + + Dólar do Suriname + Dólar do Suriname + Dólares do Suriname + + + Florim do Suriname + Florim do Suriname + Florins do Suriname + + + Dobra de São Tomé e Príncipe + Dobra de São Tomé e Príncipe + Dobras de São Tomé e Príncipe + + + Rublo soviético + Rublo soviético + Rublos soviéticos + + + Colom salvadorenho + Colon de El Salvador + Colons de El Salvador + + + Libra síria + Libra síria + Libras sírias + + + Lilangeni da Suazilândia + Lilangeni da Suazilândia + Lilangenis da Suazilândia + + + Baht tailandês + Baht da Tailândia + Bahts da Tailândia + + + Rublo do Tadjiquistão + Rublo do Tajaquistão + Rublos do Tajaquistão + + + Somoni tadjique + Somoni do Tajaquistão + Somonis do Tajaquistão + + + Manat do Turcomenistão + Manat do Turcomenistão + Manats do Turcomenistão + + + Dinar tunisiano + Dinar da Tunísia + Dinares da Tunísia + + + Paʻanga de Tonga + Paʻanga de Tonga + Paʻangas de Tonga + + + Escudo timorense + Escudo do Timor + Escudos do Timor + + + Lira turca antiga + Lira turca antiga + Liras turcas antigas + + + Lira turca + Lira turca + Liras turcas + + + Dólar de Trinidad e Tobago + Dólar de Trinidad e Tobago + Dólares de Trinidad e Tobago + + + Dólar Novo de Taiwan + Dólar de Taiwan + Dólares de Taiwan + + + Xelim da Tanzânia + Shilling da Tanzânia + Shillings da Tanzânia + + + Hryvnia ucraniano + Hryvnia da Ucrânia + Hryvnias da Ucrânia + + + Karbovanetz ucraniano + Karbovanetz da Ucrânia + Karbovanetzs da Ucrânia + + + Xelim ugandense (1966-1987) + Shilling de Uganda (UGS) + Shillings de Uganda (UGS) + + + Xelim ugandense + Shilling de Uganda + Shillings de Uganda + + + Dólar norte-americano + Dólar americano + Dólares americanos + + + Dólar norte-americano (Dia seguinte) + Dólar americano (dia seguinte) + Dólares americanos (dia seguinte) + + + Dólar norte-americano (Mesmo dia) + Dólar americano (mesmo dia) + Dólares americanos (mesmo dia) + + + Peso uruguaio en unidades indexadas + Peso uruguaio em unidades indexadas + Pesos uruguaios em unidades indexadas + + + Peso uruguaio (1975-1993) + Peso uruguaio (UYP) + Pesos uruguaios (UYP) + + + Peso uruguaio + Peso uruguaio + Pesos uruguaios + + + Sum do Usbequistão + Som do Uzbequistão + Somes do Uzbequistão + + + Bolívar venezuelano + Bolívar venezuelano + Bolívares venezuelanos + + + Bolívar v enezuelano forte + Bolívar forte da Venezuela + Bolívares fortes da Venezuela + + + Dong vietnamita + Dong vietnamês + Dongs vietnameses + + + Vatu de Vanuatu + Vatu de Vanuatu + Vatus de Vanuatu + + + Tala samoano + Tala samoano + Talas samoanos + + + Franco CFA BEAC + Franco CFA de BEAC + Francos CFA de BEAC + + + Prata + Prata + Pratas + + + Ouro + Ouro + Ouros + + + Unidade Composta Europeia + Unidade de composição europeia + Unidades de composição europeias + + + Unidade Monetária Europeia + Unidade monetária europeia + Unidades monetárias europeias + + + Unidade de Conta Europeia (XBC) + Unidade europeia de conta (XBC) + Unidades europeias de conta (XBC) + + + Unidade de Conta Europeia (XBD) + Unidade europeia de conta (XBD) + Unidades europeias de conta (XBD) + + + Dólar do Caribe Oriental + Dólar do Caribe Oriental + Dólares do Caribe Oriental + + + Direitos Especiais de Giro + direitos de desenho especiais + direitos de desenho especiais + + + Unidade de Moeda Europeia + Unidade de moeda europeia + Unidades de moedas europeias + + + Franco-ouro francês + Franco de ouro francês + Francos de ouro franceses + + + Franco UIC francês + Franco UIC francês + Francos UIC franceses + + + Franco CFA BCEAO + Franco CFA de BCEAO + Francos CFA de BCEAO + + + Paládio + Paládio + Paládios + + + Franco CFP + Franco CFP + Francos CFP + + + Platina + Platina + Platinas + + + Fundos RINET + Fundos RINET + Fundos RINET + + + Código de Moeda de Teste + Código de moeda de teste + Códigos de moeda de teste + + + Moeda Desconhecida ou Inválida + moeda desconhecida ou inválida + Moedas inválidas ou desconhecidas + + + Dinar iemenita + Dinar do Iêmen + Dinares do Iêmen + + + Rial iemenita + Rial do Iêmen + Riales do Iêmen + + + Dinar forte iugoslavo + Dinar forte iugoslavo + Dinares fortes iugoslavos + + + Dinar noviy iugoslavo + Dinar noviy da Iugoslávia + Dinares noviy da Iugoslávia + + + Dinar conversível iugoslavo + Dinar conversível da Iugoslávia + Dinares conversíveis da Iugoslávia + + + Rand sul-africano (financeiro) + Rand da África do Sul (financeiro) + Rands da África do Sul (financeiro) + + + Rand sul-africano + Rand da África do Sul + Rands da África do Sul + + + Cuacha zambiano + Kwacha da Zâmbia + Kwachas da Zâmbia + + + Zaire Novo zairense + Novo zaire do Zaire + Novos zaires do Zaire + + + Zaire zairense + Zaire do Zaire + Zaires do Zaire + + + Dólar do Zimbábue + Dólar do Zimbábue + Dólares do Zimbábue + + + + + + {0} dia + {0} dias + + + {0} hora + {0} horas + + + {0} minuto + {0} minutos + + + {0} mês + {0} meses + + + {0} segundo + {0} segundos + + + {0} semana + {0} semanas + + + {0} ano + {0} anos + + + + + sim:s + não:n + + + + diff --git a/lib/zend/Zend/Locale/Data/pt_BR.xml b/lib/zend/Zend/Locale/Data/pt_BR.xml new file mode 100644 index 0000000000..a484e3f8d3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/pt_BR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/pt_PT.xml b/lib/zend/Zend/Locale/Data/pt_PT.xml new file mode 100644 index 0000000000..f1c31878e3 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/pt_PT.xml @@ -0,0 +1,1867 @@ + + + + + + + + + + + + afrikaans + idioma artifical + Awadhi + bamileke Languages + Buginese + chechene + idioma céltico + jargão chinook + crioulo ou pidgin do inglês + crioulo ou pidgin do francês + crioulo ou pidgin do português + checo + idioma cuchita + alemão alto (Suíça) + idioma dravítico + diula + egípcio clássico + Inglês + inglês medieval + estónio + idioma ugro-finês + francês medieval + frísio oriental + alemão medieval alto + grego clássico + alemão da Suíça + sorbiano superior + arménio + Iban + igbo + Inupiaq + jv + khoisan + lezghiano + irlandês, medieval (900-1200) + macedónio + Nauatle + baixo alemão + nigeriano - cordofano + flamengo (Bélgica) + norse, old + provençal + ossético + persa arcaico (aprox. 600-400 a.C.) + polaco + idioma prácito + provençal, arcaico (até 1500) + português europeu + reto-romance + romanês + idioma indígeno sul-americano + salishan languages + linguages de sinais + idioma nilo-sariano + tamil + idioma tailândes + tetum + tajique + tagalogue + tonga + toganês + tuviniano + idioma sórbio + zazaki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Oceânia + Norte de África + África Interior + África Meridional + Sudeste Asiático + Micronésia + Ásia Sul-Central + Europa de Leste + Europa do Norte + 172 + Emiratos Árabes Unidos + Anguilha + Arménia + Antárctica + Ilhas Alanda + Azerbeijão + Bangladeche + Burkina-Faso + Bahrein + Benim + Baamas + Botswana + Bielorrússia + Ilhas Cocos + República Democrática do Congo + Congo-Brazzaville + Ilha do Natal + República Checa + Estónia + Egipto + Sara Ocidental + Ilhas Falkland ou Malvinas + Estados Federados da Micronésia + Ilhas Faroé + Gronelândia + Guiné-Bissau + Hong Kong - Região Administrativa Especial da China + Irão + Quénia + Quirguizistão + Saint Kitts e Nevis + Cuaite + Ilhas Caimão + Cazaquistão + Laos, República Popular Democrática do + Letónia + Mónaco + Moldávia, República da + Madagáscar + Macedónia, República da + Macau - Região Administrativa Especial da China + Ilhas Mariana do Norte + Monserrate + Maurícias + Malaui + Nova Caledónia + Ilha Norfolque + Países Baixos + Papua Nova Guiné + Polónia + Território Palestiniano + Qatar + Oceânia Insular + Roménia + Seicheles + Singapura + Eslovénia + Esvalbarda e Jan Mayen + São Marino + Ilhas Turcas e Caicos + Tajiquistão + Toquelau + Turquemenistão + Trindade e Tobago + Ilhas Minor Outlying (E.U.A) + Usbequistão + The main pump fixing screws with the correct strength class + Ilhas Virgin E.U.A. + Vietname + Iémen + Zimbabwe + + + Alemão Tradicional + Alemão Moderno + arménio oriental + arménio ocidental + dialecto san giorgio/bila + buntlingue + Alfabeto Fonético Internacional + Alfabeto Fonético Urálico + dialecto lipovaz de Resian + monotónico + dialecto natisone + dialecto gniva/njiva + dialecto oseacco/osojane + politónico + Computador + Revisão Ortográfica + Saho + Scouse + dialecto stolvizza/solbica + + + Ordem + + + Ordem de Chinês Tradicional - Big5 + Ordem Directa + Ordem de Chinês Simplificado - GB2312 + Ordem da Lista Telefónica + + + Métrico + + + + [ª á à ă â å ä ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ º ó ò ŏ ô ö ø ō œ ß ú ù ŭ û ü ū ÿ] + + + + + + + + EEEE, MMMM d, y G + + + + + MMMM d, y G + + + + + MMM d, y G + + + + + M/d/yyyy + + + + + + d de MMMM + d-M + + + + + + + + Jan + Fev + Mar + Abr + Mai + Jun + Jul + Ago + Set + Out + Nov + Dez + + + Janeiro + Fevereiro + Março + Abril + Maio + Junho + Julho + Agosto + Setembro + Outubro + Novembro + Dezembro + + + + + + + 1.º trimestre + 2.º trimestre + 3.º trimestre + 4.º trimestre + + + + Antes do meio-dia + Depois do meio-dia + + + + d 'de' MMM 'de' yyyy + + + + + + QQQ 'de' yyyy + QQQ 'de' y + QQQ 'de' yy + + + + MMM-MMM + + + H'h' - H'h' + + + y-y + + + MM-MM 'de' yyyy + + + + + + + + + EEEE, MMMM d, y G + + + + + MMMM d, y G + + + + + MMM d, y G + + + + + M/d/yy + + + + + + + + Tucumán + + + Cuibá + + + Araguaina + + + Baía + + + St.John's + + + Páscoa + + + Madrid + + + Marrocos + + + Ulan Bator + + + Cancun + + + Kaliningrado + + + Moscovo + + + Sacalina + + + Center + + + Petersburgo + + + + Hora do Acre + Hora de Verão do Acre + + false + + + + Hora do Afeganistão + + true + + + + Hora da África Central + + true + + + + Hora da África Oriental + + true + + + + Hora do Sara Ocidental + + + Hora do Sara Ocidental + + true + + + + Hora da África do Sul + Hora Padrão da África do Sul + + true + + + + Hora da Nigéria + Hora da África Ocidental + Hora de Verão da África Ocidental + + + Hora da Nigéria + + true + + + + Hora de Aktyubinsk + Hora de Verão de Aktyubinsk + + true + + + + Hora do Alaska + Hora Padrão do Alaska + Hora de Verão do Alaska + + + + + Hora do Alaska- Havai + Hora Padrão do Alaska-Havai + Hora de Verão do Alaska-Havai + + true + + + + Hora de Almaty + Hora de Verão de Almaty + + true + + + + Hora do Amazonas + Hora de Verão do Amazonas + + false + + + + Hora Central + Hora Padrão Central + Hora de Verão Central + + + + + Hora Oriental + Hora Padrão Oriental + Hora de Verão Oriental + + true + + + + Hora da Montanha + Hora Padrão da Montanha + Hora de Verão da Montanha + + true + + + + Hora do Pacífico + Hora Padrão do Pacífico + Hora de Verão do Pacífico + + true + + + + Hora de Anadyr + Hora de Verão de Anadyr + + true + + + + Hora de Aqtau + Hora de Verão de Aqtau + + true + + + + Hora de Aqtobe + Hora de Verão de Aqtobe + + true + + + + Hora da Arábia + Hora Padrão da Arábia + Hora de Verão da Arábia + + + + + Hora da Argentina + Hora de Verão da Argentina + + true + + + + Hora da Argentina Ocidental + + true + + + + Hora da Arménia + Hora da Arménia + Hora de Verão da Arménia + + + Hora da Arménia + AMT (Arménia) + AMST (Arménia) + + true + + + + Hora do Turquemenistão + Hora de Ashkhabad + Hora de Verão de Ashkhabad + + + Hora do Turquemenistão + + true + + + + Hora do Atlântico + Hora Padrão do Atlântico + Hora de Verão do Atlântico + + true + + + + Hora da Austrália Central + Hora Padrão da Austrália Central + Hora de Verão da Austrália Central + + true + + + + Hora da Austrália Central Ocidental + Hora Padrão da Austrália Central Ocidental + Hora de Verão da Austrália Central Ocidental + + true + + + + Hora da Austrália Oriental + Hora Padrão da Austrália Oriental + Hora de Verão da Austrália Oriental + + true + + + + Hora da Austrália Ocidental + Hora Padrão da Austrália Ocidental + Hora de Verão da Austrália Ocidental + + + + + Hora do Azerbeijão + Hora do Azerbeijão + Hora de Verão do Azerbeijão + + + Hora do Azerbeijão + + true + + + + Hora dos Açores + Hora de Verão dos Açores + + true + + + + Hora do Azerbeijão + Hora de Baku + Hora de Verão de Baku + + + Hora do Azerbeijão + + true + + + + Hora do Bangladesh + Hora do Bangladesh + + + Hora do Bangladesh + + true + + + + Hora de Bering + Hora Padrão de Bering + Hora de Verão de Bring + + true + + + + Hora do Botão + Hora do Botão + + + Hora do Botão + + true + + + + Hora da Bolívia + + true + + + + Hora do Bornéu + Hora de Verão do Bornéu + + true + + + + Hora de Brasília + Hora de Verão de Brasília + + false + + + true + + + + Hora do Brunei + Hora do Brunei Darussalam + + + Hora do Brunei + + true + + + + Hora de Cabo Verde + Hora de Verão de Cabo Verde + + true + + + + Hora de Chamarro + Hora Padrão de Chamarro + + true + + + + Hora de Changbai + + true + + + + Hora Padrão de Chatham + Hora de Verão de Chatham + + true + + + + Hora do Chile + Hora de Verão do Chile + + true + + + + Hora da China + Hora Padrão da China + Hora de Verão da China + + true + + + + Hora de Choibalsan + Hora de Verão de Choibalsan + + true + + + + Hora da Ilha de Natal + + true + + + + Hora das Ilhas Cocos + + true + + + + Hora da Colômbia + Hora de Verão da Colômbia + + true + + + + Hora das Ilhas Cook + Hora das Ilhas Cook + Hora Intermédia de Verão das Ilhas Cook + + + Hora das Ilhas Cook + + true + + + + Hora de Cuba + Hora Padrão de Cuba + Hora de Verão de Cuba + + true + + + + Hora do Bangladesh + Hora de Dacca + + + Hora do Bangladesh + + true + + + + Hora de Davis + + + + true + + + + Hora de Dumont-d'Urville + + + + + Hora do Tajiquistão + Hora de Dushanbe + Hora de Verão de Dushanbe + + + Hora do Tajiquistão + + true + + + + Hora da Guiana Holandesa + + true + + + + Hora de Timor Leste + Hora de Timor Leste + + + Hora de Timor Leste + + true + + + + Hora da Ilha de Páscoa + Hora de Verão da Ilha de Páscoa + + true + + + + Hora do Equador + + true + + + + Horário Padrão da Europa Central + Hora de Verão da Europa Central + + true + + + + Hora da Europa Oriental + Hora de Verão da Europa Oriental + + true + + + + Hora da Europa Ocidental + Hora de Verão da Europa Ocidental + + true + + + + Hora das Ilhas Malvinas + Hora de Verão das Ilhas Malvinas + + true + + + + Hora das Ilhas Fiji + Hora das Ilhas Fiji + Hora de Verão das Ilhas Fiji + + + Hora das Ilhas Fiji + + true + + + + Hora da Guiana Francesa + + true + + + + Hora da Antártida e dos Territórios Franceses do Sul + + true + + + + Hora do Quirguizistão + Hora de Frunze + Hora de Verão de Frunze + + + Hora do Quirguizistão + + true + + + + Hora do Meridiano de Greenwich + + + + + Hora de Galápagos + + + + + Hora de Gambier + + + + + Hora da Geórgia + Hora da Georgia + Hora de Verão da Georgia + + + Hora da Geórgia + + true + + + + Hora das Ilhas Gilbert + + + + true + + + + Hora da Gronelândia Central + Hora de Verão da Gronelândia Central + + true + + + + Hora Padrão de Guam + + + + + Hora Padrão do Golfo + + true + + + + Hora Padrão do Havai + + + + + Hora de Hong Kong - Região Administrativa Especial da China + Hora de Hong Kong + Hora de Verão de Hong Kong + + + Hora de Hong Kong - Região Administrativa Especial da China + + true + + + + Hora de Hovd + Hora de Verão de Hovd + + true + + + + Hora da Índia + Hora Padrão da Índia + + + Hora da Índia + + true + + + + Hora do Oceano Índico + + + + + Hora do Vietname + + + Hora do Vietname + + true + + + + Hora da Indonésia Central + + true + + + + Hora da Indonésia Oriental + + true + + + + Hora da Indonésia Ocidental + + true + + + + Hora do Irão + Hora Padrão do Irão + Hora de Verão do Irão + + + Hora do Irão + + true + + + true + + + + Hora de Irkutsk + Hora de Verão de Irkutsk + + true + + + + Hora de Israel + Hora Padrão de Israel + Hora de Verão de Israel + + + Hora de Israel + + true + + + + Hora do Japão + Hora Padrão do Japão + Hora de Verão do Japão + + true + + + + Hora de Petropavlovsk-Kamchatski + Hora de Verão de Petropavlovsk-Kamchatski + + true + + + + Hora do Paquistão + Hora de Carachi + + + Hora do Paquistão + + true + + + + Hora de Kashgar + + true + + + + Hora do Casaquistão do Leste + Hora Padrão do Cazaquistão do Leste + + true + + + + Hora do Casaquistão do Oeste + Hora Padrão do Casaquistão do Oeste + + true + + + + Hora de Kizilorda + Hora de Verão de Kizilorda + + true + + + + Hora da Coreia + Hora Padrão da Coreia + Hora de Verão da Coreia + + true + + + + Hora de Kosrae + + + + + Hora de Krasnoyarsk + Hora de Verão de Krasnoyarsk + + true + + + + Hora de Kuybyshev + Hora de Verão de Kuybyshev + + true + + + + Hora de Kwajalein + + + + + Hora do Quirguizistão + Hora do Quirguizistão + + + Hora do Quirguizistão + + true + + + + Hora do Sri Lanka + Hora do Sri Lanka + + + Hora do Sri Lanka + + true + + + + Hora da Libéria + + + Hora da Libéria + + true + + + + Hora das Ilhas Line + + true + + + + Hora de Long-Shu + + true + + + + Hora de Lord Howe + Hora Padrão de Lord Howe + Hora de Verão de Lord Howe + + + + + Hora de Macau - Região Administrativa Especial da China + Hora de Macau + Hora de Verão de Macau + + + Hora de Macau - Região Administrativa Especial da China + + true + + + + Hora de Magadan + Hora de Verão de Magadan + + true + + + + Hora da Malásia + Hora de Malaia + + + Hora da Malásia + + true + + + + Hora da Malásia + + true + + + + Hora das Ilhas Maldivas + + + + + Hora das Marquesas + + true + + + + Hora das Ilhas Marshall + + true + + + + Hora das Ilhas Maurícias + + + + + Hora de Mawson + + + + + Hora de Ulan Bator + Hora de Verão de Ulan Bator + + true + + + + Hora de Moscovo + Hora Padrão de Moscovo + Hora de Verão de Moscovo + + true + + + + Hora de Mianmar + + + Hora de Mianmar + + true + + + + Hora de Nauru + + true + + + + Hora do Nepal + Hora do Nepal + + + Hora do Nepal + + true + + + + Hora da Nova Caledónia + Hora da Nova Caledónia + Hora de Verão da Nova Caledónia + + + Hora da Nova Caledónia + + true + + + + Hora da Nova Zelândia + Hora Padrão da Nova Zelândia + Hora de Verão da Nova Zelândia + + true + + + + Horário Padrão da Terra Nova + Horário de Verão da Terra Nova + + + + + Hora de Niue + Hora de Niue + + + Hora de Niue + + true + + + + Hora da Ilha Norfolque + + + Hora da Ilha Norfolque + + true + + + + Hora das Ilhas Mariana do Norte + Hora das Ilhas Mariana do Norte + + + Hora das Ilhas Mariana do Norte + + true + + + + Hora de Novosibirsk + Hora de Verão de Novosibirsk + + true + + + + Hora de Omsk + Hora de Verão de Omsk + + true + + + true + + + + Hora do Paquistão + Hora de Verão do Paquistão + + + Hora do Paquistão + + true + + + + Hora de Palau + Hora de Palau + + + Hora de Palau + + true + + + + Hora da Papua Nova Guiné + Hora da Papua Nova Guiné + + + Hora da Papua Nova Guiné + + true + + + + Hora das Filipinas + Hora das Filipinas + Hora de Verão das Filipinas + + + Hora das Filipinas + + true + + + + Hora das Ilhas Fénix + + true + + + + Hora de Pitcairn + Hora de Pitcairn + + + Hora de Pitcairn + + true + + + + Hora de Ponape + + true + + + + Hora de Qyzylorda + Hora de Verão de Qyzylorda + + true + + + + Hora das Ilhas de Reunião + + + + + Hora de Rothera + + + + + Hora de Sakhalin + Hora de Verão de Sakhalin + + true + + + + Hora de Samara + Hora de Verão de Samara + + true + + + + Hora de Samarkand + Hora de Verão de Samarkand + + true + + + + Hora da Samoa + Hora Padrão da Samoa + + + Hora da Samoa + + true + + + + Hora das Ilhas Seicheles + + + + + Hora de Shevchenko + Hora de Verão de Shevchenko + + true + + + + Hora de Singapura + Hora Padrão de Singapura + + + Hora de Singapura + + true + + + + Hora das Ilhas Salomão + + + Hora das Ilhas Salomão + + true + + + + Hora da Georgia do Sul + + true + + + + Hora de Sverdlovsk + Hora de Verão de Sverdlovsk + + true + + + + Hora de Syowa + + + + + Hora da Polinésia Francesa + Hora do Tahiti + + + Hora da Polinésia Francesa + + true + + + + Hora do Tajiquistão + Hora do Tajiquistão + + + Hora do Tajiquistão + + true + + + + Hora de Tashkent + Hora de Tashkent + Hora de Verão de Tashkent + + + Hora do Uzbequistão + + true + + + + Hora da Geórgia + Hora de Tbilisi + Hora de Verão de Tbilisi + + + Hora de Geórgia + + true + + + + Hora de Toquelau + Hora de Toquelau + + + Hora de Toquelau + + true + + + + Hora de Tonga + Hora de Verão de Tonga + + + Hora de Tonga + + true + + + + Hora de Truk + + true + + + + Hora da Turquia + Hora de Verão da Turquia + + true + + + + Hora do Turquemenistão + Hora do Turquemenistão + Hora de Verão do Turquemenistão + + + Hora do Turquemenistão + + true + + + + Hora de Tuvalu + + + Hora de Tuvalu + + true + + + + Hora de Ural'sk + Hora de Verão de Ural'sk + + true + + + + Hora de Urumqi + + true + + + + Hora do Uzbequistão + Hora do Uzbequistão + Hora de Verão do Uzbequistão + + + Hora do Uzbequistão + + true + + + + Hora de Vanuatu + Hora de Vanuatu + + + Hora de Vanuatu + + true + + + + Hora de Vladivostok + Hora de Verão de Vladivostok + + true + + + + Hora de Volvograd + Hora de Verão de Volgograd + + true + + + + Hora de Vostok + + + + + Hora das Ilhas Wake + + + + + Hora de Wallis e Futuna + Hora de Wallis e Futuna + + + Hora de Wallis e Futuna + + true + + + + Hora de Yakutsk + Hora de Verão de Yakutsk + + true + + + + Hora de Yekaterinburg + Hora de Verão de Yekaterinburg + + true + + + + Hora da Arménia + Hora de Yerevan + Hora de Verão de Yerevan + + + Hora da Arménia + + true + + + + + +   + + + + + #,##0.00 ¤ + + + + + + Dirham dos Emirados Árabes Unidos + + + Afeghani (1927-2002) + + + Afeghani + + + Florim das Antilhas Holandesa + + + Florim de Aruba + + + Dinar da Bósnia-Herzegóvina + + + Marco bósnio-herzegóvino conversível + + + Franco belga (convertível) + + + Rublo novo bielorusso (1994-1999) + + + Libra de Chipre + + + Coroa da República Checa + + + Unidad de Valor Constante (UVC) do Equador + + + Dólar das Fiji + + + Cedi do Gana + + + Dalasi da Gâmbia + + + Franco da Guiné + + + Quetzal da Guatemala + + + Lempira das Honduras + + + Dinar koweitiano + + + Dólar das Ilhas Caimão + + + Dinar macedónio + + + Franco do Mali + + + Cuacha do Malawi + + + Peso Plata mexicano (1861-1992) + + + Unidad de Inversion (UDI) mexicana + + + Córdoba nicaraguano + + + Córdoba Ouro nicaraguano + + + Zloti polaco + + + Zloti polaco (1950-1995) + + + #,##0.00 ¤;-#,##0.00 ¤ + $ + , + + + Rial do Qatar + + + Dólar de Singapura + + + Xelim de Tanzânia + + + Tala de Samoa Ocidental + + + Unidade da Moeda Europeia + + + Moeda inválida ou desconhecida + + + Dinar forte jugoslavo + + + Super Dinar jugoslavo + + + Dinar conversível jugoslavo + + + Dólar do Zimbabwe + + + + + diff --git a/lib/zend/Zend/Locale/Data/ro.xml b/lib/zend/Zend/Locale/Data/ro.xml new file mode 100644 index 0000000000..af501bced1 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ro.xml @@ -0,0 +1,2479 @@ + + + + + + + + + + + {0} ({1}) + , + + + abhază + afrikaans + limbă afro-asiatică + ainu + akkadiană + aleută + altaică meridională + amharică + aragoneză + engleză veche + limbă apașă + arabă + aramaică + limbă artificială + asameză + asturiană + limbă australiană + avară + aymara + azeră + bașkiră + limbă baltică + bielorusă + berberă + bulgară + bihari + bengaleză + bantu + tibetană + bretonă + bosniacă + catalană + limbă central-amerindiană + limbă caucaziană + cecenă + limbă celtică + corsicană + coptă + cehă + slavonă + ciuvașă + velșă + daneză + germană + germană austriacă + germană standard elvețiană + limbă dravidiană + egipteană veche + greacă + elamită + engleză + engleză australiană + engleză canadiană + engleză britanică + engleză americană + esperanto + spaniolă + spaniolă latino-americană + spaniolă iberică + estoniană + bască + persană + finlandeză + filipineză + limbă fino-ugrică + fijiană + faroeză + franceză + franceză canadiană + franceză elvețiană + franceză veche + frizonă orientală + frizonă occidentală + irlandeză + gaelică scoțiană + limbă germanică + galiciană + guarani + gotică + greacă veche + germană elvețiană + gujarati + hawaiană + ebraică + hindi + hitită + croată + haitiană + maghiară + armeană + interlingua + indoneziană + interlingue + inupiak + limbă indiană + limbă indo-europeană + limbă iraniană + islandeză + italiană + japoneză + iudeo-persană + iudeo-arabă + javaneză + georgiană + congoleză + kazahă + kalaallisut + khmeră + kannada + coreeană + cașmireză + kurdă + kîrgîză + latină + luxemburgheză + lingala + laoțiană + lituaniană + letonă + austroneziană + malgașă + maori + limbi diverse + macedoneană + malayalam + mongolă + manciuriană + moldovenească + marathi + malay + malteză + limbi multiple + limbă munda + mirandeză + birmaneză + limbă mayașă + limbă nord-amerindiană + napolitană + nepaleză + olandeză + flamandă + norvegiană nynorsk + norvegiană + limbă nubiană + navajo + occitană + oromo + oriya + turcă otomană + limbă otomi + punjabi + limbă papuașă + persană veche + limbă filipineză + feniciană + pali + poloneză + provensală veche + pașto + portugheză + portugheză braziliană + portugheză iberică + quechua + retoromană + română + limbă romanică + rusă + aromână + sanscrită + limbă sud-amerindiană + aramaică samariteană + sardiniană + siciliană + scots + sindhi + limbă semitică + irlandeză veche + limbaj mimico-gestual + sârbo-croată + singaleză + limbă sino-tibetană + slovacă + slovenă + limbă slavă + samoană + somaleză + albaneză + sârbă + sesotho + sundaneză + sumeriană + suedeză + swahili + siriacă + tamilă + limbă thai + telugu + tadjică + thailandeză + tigrinya + turkmenă + tagalog + klingoniană + setswana + turcă + tătară + limbă altaică + twi + tahitiană + uigură + ucraineană + limbă necunoscută sau nevalidă + urdu + uzbecă + vietnameză + volapuk + valonă + wolof + calmucă + xhosa + idiș + yoruba + zapotecă + chineză + chineză simplificată + chineză tradițională + zulu + fară conținut lingvistic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lume + Africa + America de Nord + America de Sud + Oceania + Africa Occidentală + America Centrală + Africa Orientală + Africa Septentrională + Africa Centrală + Africa Meridională + Americi + America Septentrională + Caraibe + Asia Orientală + Asia Meridională + Asia de Sud-Est + Europa Meridională + Australia și Noua Zeelandă + Melanezia + Regiunea Micronezia + Polinezia + Asia Centrală de Sud + Asia + Asia Centrală + Asia Occidentală + Europa + Europa Orientală + Europa Septentrională + Europa Occidentală + Comunitatea Statelor Independente + America Latină și Caraibe + Insulele Anglo-Normande + Andorra + Emiratele Arabe Unite + Afganistan + Antigua și Barbuda + Anguilla + Albania + Armenia + Antilele Olandeze + Angola + Antarctica + Argentina + Samoa Americană + Austria + Australia + Aruba + Insulele Aland + Azerbaidjan + Bosnia și Herțegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Sfântul Bartolomeu + Bermuda + Brunei + Bolivia + Brazilia + Bahamas + Bhutan + Insula Bouvet + Botswana + Bielorusia + Belize + Canada + Insulele Cocos + Republica Democrată Congo + Republica Centrafricană + Congo + Eleveția + Coasta de Fildeș + Insulele Cook + Chile + Camerun + China + Columbia + Costa Rica + Serbia și Muntenegru + Cuba + Capul Verde + Insula Christmas + Cipru + Republica Cehă + Germania + Djibouti + Danemarca + Dominica + Republica Dominicană + Algeria + Ecuador + Estonia + Egipt + Sahara Occidentală + Eritreea + Spania + Etiopia + Finlanda + Fiji + Insulele Falkland + Micronezia + Insulele Feroe + Franța + Gabon + Marea Britanie + Grenada + Georgia + Guyana Franceză + Guernsey + Ghana + Gibraltar + Groenlanda + Gambia + Guineea + Guadelupa + Guineea Ecuatorială + Grecia + Insulele Georgia de Sud și Sandwich de Sud + Guatemala + Guam + Guineea-Bissau + Guyana + R.A.S. Hong Kong a Chinei + Insula Heard și Insulele McDonald + Honduras + Croația + Haiti + Ungaria + Indonezia + Irlanda + Israel + Insula Man + India + Teritoriul Britanic din Oceanul Indian + Irak + Iran + Islanda + Italia + Jersey + Jamaica + Iordania + Japonia + Kenya + Kârgâzstan + Cambodgia + Kiribati + Comore + Sfântul Kitts și Nevis + Coreea de Nord + Coreea de Sud + Kuweit + Insulele Cayman + Kazahstan + Laos + Liban + Sfânta Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Luxemburg + Letonia + Libia + Maroc + Monaco + Republica Moldova + Muntenegru + Sfântul Martin + Madagascar + Insulele Marshall + Macedonia + Mali + Myanmar + Mongolia + R.A.S. Macao a Chinei + Insulele Mariane de Nord + Martinica + Mauritania + Montserrat + Malta + Mauritius + Maldive + Malawi + Mexic + Malaezia + Mozambic + Namibia + Noua Caledonie + Niger + Insulele Norfolk + Nigeria + Nicaragua + Olanda + Norvegia + Nepal + Nauru + Niue + Noua Zeelandă + Oman + Panama + Peru + Polinezia Franceză + Papua Noua Guinee + Filipine + Pakistan + Polonia + Sfântul Pierre și Miquelon + Pitcairn + Porto Rico + Teritoriul Palestinian + Portugalia + Palau + Paraguay + Qatar + Oceania Periferică + Uniunea Europeană + Reunion + România + Serbia + Rusia + Rwanda + Arabia Saudită + Insulele Solomon + Seychelles + Sudan + Suedia + Singapore + Sfânta Elena + Slovenia + Svalbard și Jan Mayen + Slovacia + Sierra Leone + San Marino + Senegal + Somalia + Surinam + Sao Tome și Principe + El Salvador + Siria + Swaziland + Insulele Turks și Caicos + Ciad + Teritoriile Australe și Antarctice Franceze + Togo + Thailanda + Tadjikistan + Tokelau + Timorul de Est + Turkmenistan + Tunisia + Tonga + Turcia + Trinidad-Tobago + Tuvalu + Taiwan + Tanzania + Ucraina + Uganda + Insulele mici îndepărtate ale Statelor Unite ale Americii + Statele Unite ale Americii + Uruguay + Uzbekistan + Vatican + Sfântul Vincent și Grenadine + Venezuela + Insulele Virgine Britanice + Insulele Virgine S.U.A. + Vietnam + Vanuatu + Wallis și Futuna + Samoa + Yemen + Mayotte + Africa de Sud + Zambia + Zimbabwe + Regiune necunoscută sau nevalidă + + + ordine de sortare + monedă + + + sortare pentru chineza tradițională - Big5 + calendar budist + calendar chinezesc + sortare directă + sortare pentru chineza simplificată - GB2312 + calendar gregorian + calendar ebraic + calendar național indian + calendar islamic + calendar islamic civil + calendar japonez + sortare după cartea de telefon + sortare pinyin + calendar al Republicii Chineze + ordine de sortare după trasare + sortare tradițională + + + american + metric + + + Limbă: {0} + Scriere: {0} + Regiune: {0} + + + + titlecase-firstword + lowercase-words + lowercase-words + lowercase-words + titlecase-firstword + + + [a ă â b-i î j-p r s ș t ț u v x z] + [á à å ä ç é è ê ë ñ ö q ş ţ ü w y] + [a ă â b-i î j-s ș t ț u-z] + + + „ + ” + « + » + + + {0} – {1} + + + + + era budistă + + + e.b. + + + + + + EEEE, d MMMM, y G + + + + + d MMMM y G + + + + + d MMM y G + + + + + d/M/yyyy + + + + + + E d MMM + E d MMMM + d MMMM + d MMM + EEE, d/M/y + EEE, d MMM Y + 'T'Q y + QQQ y + + + + + + + + ian. + feb. + mar. + apr. + mai + iun. + iul. + aug. + sept. + oct. + nov. + dec. + + + ianuarie + februarie + martie + aprilie + mai + iunie + iulie + august + septembrie + octombrie + noiembrie + decembrie + + + + + I + F + M + A + M + I + I + A + S + O + N + D + + + + + + + Du + Lu + Ma + Mi + Jo + Vi + Sâ + + + duminică + luni + marți + miercuri + joi + vineri + sâmbătă + + + + + Du + Lu + + + D + L + M + M + J + V + S + + + sâmbătă + + + + + + + trim. I + trim. II + trim. III + trim. IV + + + T1 + T2 + T3 + T4 + + + trimestrul I + trimestrul al II-lea + trimestrul al III-lea + trimestrul al IV-lea + + + + + T1 + T2 + T3 + T4 + + + trimestrul I + trimestrul al II-lea + trimestrul al III-lea + trimestrul al IV-lea + + + + AM + PM + + + înainte de Hristos + după Hristos + + + î.Hr. + d.Hr. + + + + + + EEEE, d MMMM y + + + + + d MMMM y + + + + + dd.MM.yyyy + + + + + dd.MM.yyyy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + EEE d + H:mm + L + E, d MMM + LLL + EEE, d MMM + E, d MMM + E, d MMMM + d MMMM + d MMM + dd.MM + d.M + d + mm:ss + y + M.yyyy + EEE, d/M/yyyy + MMM y + EEE, d MMM y + MMMM y + 'trimestrul' Q y + QQQ y + MM.yy + MMM yy + Q yy + MM.yyyy + MMMM y + + + {0} - {1} + + M-M + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + MMM-MMM + + + E, d MMM - E, d MMM + E, d MMM - E, d MMM + + + LLLL-LLLL + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM.yyyy - MM.yyyy + MM.yyyy - MM.yyyy + + + E, dd.MM.yyyy - E, dd.MM.yyyy + E, dd.MM.yyyy - E, dd.MM.yyyy + E, dd.MM.yyyy - E, dd.MM.yyyy + + + MMM-MMM y + MMM y - MMM y + + + E, d MMM - E, d MMM y + E, d MMM - E, d MMM y + E, d MMM y - E, d MMM y + + + MMMM-MMMM y + MMMM y – MMMM y + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + dd.MM.yyyy - dd.MM.yyyy + dd.MM.yyyy - dd.MM.yyyy + dd.MM.yyyy - dd.MM.yyyy + + + + + + eră + + + an + + + lună + + + săptămână + + + zi + răsalaltăieri + alaltăieri + ieri + azi + mâine + poimâine + răspoimâine + + + zi a săptămânii + + + perioada zilei + + + oră + + + minut + + + secundă + + + zonă + + + + + + +HH:mm;−HH:mm + GMT{0} + {0} + {1} ({0}) + + Necunoscut + + + Tirana + + + Erevan + + + Polul Sud + + + Dumont D'Urville + + + Viena + + + Bruxelles + + + Insula Paștelui + + + Capul Verde + + + Copenhaga + + + Alger + + + Insulele Canare + + + Addis Abeba + + + Londra + + + Guadalupe + + + Atena + + + Georgia de Sud + + + Budapesta + + + Ierusalim + + + Bagdad + + + Teheran + + + Roma + + + St. Kitts + + + Seul + + + Kuweit + + + Kyzylorda + + + St. Lucia + + + Luxemburg + + + Chișinău + + + Ulan Bator + + + Martinica + + + Maldive + + + Marchize + + + Varșovia + + + Azore + + + Lisabona + + + Quatar + + + București + + + Moscova + + + Ekaterinburg + + + Krasnoiarsk + + + Irkuțk + + + Yakuțk + + + Sahalin + + + Kamciatka + + + Riyad + + + Sf. Elena + + + Salvador + + + Damasc + + + Zaporoje + + + New Salem, Dakota de Nord + + + Centru, Dakota de Nord + + + Saint Vincent și Grenadines + + + St. Thomas + + + + Ora Acre + Ora de vară Acre + + + + + Ora Africii Centrale + + + + + Ora Africii Orientale + + + + + Ora Africii Meridionale + Ora Standard a Africii Meridionale + + + + + Ora Africii Occidentale + Ora de vară a Africii Occidentale + + + + + Ora zonei Alaska + Ora standard în zona Alaska + Ora de vară în zona Alaska + + + + + Ora zonei Alaska-Hawaii + Ora standard în zona Alaska-Hawaii + Ora de vară în zona Alaska-Hawaii + + + + + Ora Amazon + Ora de vară Amazon + + + + + Ora Centrală + Ora standard centrală + Ora de vară centrală + + + + + Ora orientală + Ora standard orientală + Ora de vară orientală + + + + + Ora zonei montane + Ora standard în zona montană + Ora de vară în zona montană + + + + + Ora zonei Pacific + Ora standard în zona Pacific + Ora de vară în zona Pacific + + + + + Ora Argentinei + Ora de vară a Argentinei + + + + + Ora Argentinei Occidentale + + + + + Ora zonei Atlantic + Ora standard în zona Atlantic + Ora de vară în zona Atlantic + + + + + Ora Australiei Centrale + Ora de vară a Australiei Centrale + + + + + Ora Australiei Central Occidentale + Ora standard a Australiei Central Occidentale + Ora de vară a Australiei Central Occidentale + + + + + Ora Australiei Orientale + Ora standard a Australiei Orientale + Ora de vară a Australiei Orientale + + + + + Ora Australiei Occidentale + Ora de vară a Australiei Occidentale + + + + + Ora Bering + Ora standard Bering + Ora de vară Bering + + + + + Ora Boliviei + + + + + Ora Davis + + + + + Ora Dumont-d'Urville + + + + + Ora Europei Centrale + Ora de vară a Europei Centrale + + + + + Ora Europei de Est + Ora de vară a Europei de Est + + + + + Ora Europei Occidentale + Ora de vară a Europei Occidentale + + + WET + WEST + + + + + Greenwich Mean Time + + + GMT + + true + + + + Ora Lord Howe + Ora standard Lord Howe + Ora de vară Lord Howe + + + + + Ora Mawson + + + + + Ora Rothera + + + + + Ora Syowa + + + + + Ora Vostok + + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + {0} {1} + + + + pesetă andorrană + pesete andorrane + pesete andorrane + + + dirham Emiratele Arabe Unite + dirhami Emiratele Arabe Unite + dirhami Emiratele Arabe Unite + + + leka albanez + leka albanezi + leka albanez + leka albanezi + + + dram armenesc + drami armenești + dram armenesc + drami armenești + + + gulden Antilele Olandeze + guldeni Antilele Olandeze + guldeni Antilele Olandeze + + + peso argentinian (1983–1985) + pesos argentinieni (ARP) + peso argentinian (ARP) + pesos argentinieni (ARP) + + + peso argentinian + pesos argentinieni + pesos argentinieni + + + șiling austriac + șilingi austrieci + șilingi austrieci + + + dolar australian + dolari australieni + dolari australieni + + + manat Azerbaidjan + manați Azerbaidjan + manați Azerbaidjan + + + dinar Bosnia-Herțegovina + dinari Bosnia-Herțegovina + dinari Bosnia-Herțegovina + + + marcă convertibilă bosniacă + mărci convertibile bosniace + mărci convertibile bosniace + + + dolar Barbados + dolari Barbados + dolari Barbados + + + taka Bangladeș + + + franc belgian (convertibil) + franci belgieni (convertibili) + franci belgieni (convertibili) + + + franc belgian + franci belgieni + franci belgieni + + + franc belgian (financiar) + franci belgieni (financiari) + franci belgieni (financiari) + + + leva bulgărească nouă + leva bulgărești noi + leva bulgărești noi + + + franc Burundi + franci Burundi + franci Burundi + + + dolar Bermude + dolari Bermude + dolari Bermude + + + dolar Brunei + dolari Brunei + dolari Brunei + + + bolivian bolivian + bolivieni bolivieni + bolivieni bolivieni + + + peso bolivian + pesos bolivieni + pesos bolivieni + + + mvdol bolivian + + + cruzeiro brazilian (1990–1993) + + + real brazilian + reali brazilieni + reali brazilieni + + + cruzeiro brazilian + + + dolar Bahamas + dolari Bahamas + dolari Bahamas + + + ngultrum Bhutan + + + kyat birman + + + rublă bielorusă + ruble bieloruse + ruble bieloruse + + + dolar Belize + dolari Belize + dolari Belize + + + dolar canadian + dolari canadieni + dolari canadieni + + + franc congolez + franci congolezi + franci congolezi + + + franc elvețian + franci elvețieni + franci elvețieni + + + peso chilian + pesos chilieni + pesos chilieni + + + yuan renminbi chinezesc + yuani renminbi chinezești + yuani renminbi chinezești + + + peso columbian + pesos columbieni + pesos columbieni + + + colon costarican + coloni costaricani + coloni costaricani + + + dinar vechi Serbia și Muntenegru + dinari vechi Serbia și Muntenegru + dinari vechi Serbia și Muntenegru + + + peso cubanez + pesos cubanezi + pesos cubanezi + + + escudo Capul Verde + escudo Capul Verde + escudo Capul Verde + escudo Capul Verde + + + liră cipriotă + lire cipriote + lire cipriote + + + coroană cehă + coroane cehe + coroane cehe + + + marcă est-germană + mărci est-germane + mărci est-germane + + + marcă germană + mărci germane + mărci germane + + + franc Djibouti + franci Djibouti + franci Djibouti + + + coroană daneză + coroane daneze + coroane daneze + + + peso dominican + pesos dominicani + pesos dominicani + + + dinar algerian + dinari algerieni + dinari algerieni + + + sucre Ecuador + + + coroană estoniană + coroane estoniene + coroane estoniene + + + liră egipteană + lire egiptene + lire egiptene + + + peseta spaniolă (cont A) + + + peseta spaniolă (cont convertibil) + + + pesetă spaniolă + pesete spaniole + pesete spaniole + + + birr Etiopia + birr Etiopia + birr Etiopia + birr Etiopia + + + euro + + + marcă finlandeză + mărci finlandeze + mărci finlandeze + mărci finlandeze + + + dolar Fiji + dolari Fiji + dolari Fiji + + + liră Insulele Falkland + lire Insulele Falkland + lire Insulele Falkland + + + franc francez + franci francezi + franci francezi + + + liră sterlină + lire sterline + lire sterline + + + lari Georgia + lari Georgia + lari Georgia + lari Georgia + + + cedi Ghana + + + liră Gibraltar + lire Gibraltar + lire Gibraltar + + + dalasi Gambia + + + franc Guineea + franci Guineea + franci Guineea + + + drahmă grecească + drahme grecești + drahme grecești + + + quetzal Guatemala + + + peso Guineea-Bissau + pesos Guineea-Bissau + pesos Guineea-Bissau + + + dolar Guyana + dolari Guyana + dolari Guyana + + + dolar Hong Kong + dolari Hong Kong + dolari Hong Kong + + + lempira Honduras + + + dinar croat + dinari croați + dinari croați + + + kuna croată + kune croate + kune croate + + + gourde Haiti + + + forint maghiar + forinți maghiari + forinți maghiari + + + rupie indoneziană + rupii indoneziene + rupii indoneziene + + + liră irlandeză + lire irlandeze + lire irlandeze + + + liră israeliană + lire israeliene + lire israeliene + + + șechel israelian nou + șecheli israelieni noi + șecheli israelieni noi + + + rupie indiană + rupii indiene + rupii indiene + + + dinar irakian + dinari irakieni + dinari irakieni + + + rial iranian + riali iranieni + riali iranieni + + + coroană islandeză + coroane islandeze + coroane islandeze + + + liră italiană + lire italiene + lire italiene + + + dolar jamaican + dolari jamaicani + dolari jamaicani + + + dinar iordanian + dinari iordanieni + dinari iordanieni + + + yen japonez + yeni japonezi + yeni japonezi + + + șiling kenyan + șilingi kenyeni + șilingi kenyeni + + + som Kirghizstan + + + riel cambodgian + rieli cambodgieni + rieli cambodgieni + + + franc comorian + franci comorieni + franci comorieni + + + won nord-coreean + woni nord-coreeni + woni nord-coreeni + + + won sud-coreean + woni sud-coreeni + woni sud-coreeni + + + dinar kuweitian + dinari kuweitieni + dinari kuweitieni + + + dolar Insulele Cayman + dolari Insulele Cayman + dolari Insulele Cayman + + + kip Laos + + + liră libaneză + lire libaneze + lire libaneze + + + rupie Sri Lanka + rupii Sri Lanka + rupii Sri Lanka + + + dolar liberian + dolari liberieni + dolari liberieni + + + litu lituanian + lite lituaniene + lite lituaniene + + + franc convertibil luxemburghez + franci convertibili luxemburghezi + franci convertibili luxemburghezi + + + franc luxemburghez + franci luxemburghezi + franci luxemburghezi + + + franc financiar luxemburghez + franci financiari luxemburghezi + franci financiari luxemburghezi + + + lats Letonia + + + rublă Letonia + ruble Letonia + ruble Letonia + + + dinar libian + dinari libieni + dinari libieni + + + dirham marocan + dirhami marocani + dirhami marocani + + + franc marocan + franci marocani + franci marocani + + + leu moldovenesc + lei moldovenești + lei moldovenești + + + franc Madagascar + franci Madagascar + franci Madagascar + + + dinar macedonean + dinari macedoneni + dinari macedoneni + + + franc Mali + franci Mali + franci Mali + + + kyat Myanmar + + + tugrik mongol + + + liră malteză + lire malteze + lire malteze + + + peso mexican + pesos mexicani + pesos mexicani + + + peso mexican de argint (1861–1992) + pesos mexicani de argint (1861–1992 + pesos mexicani de argint (1861–1992 + + + ringgit malaiezian + + + escudo Mozambic + + + metical Mozambic vechi + + + metical Mozambic + + + dolar namibian + dolari namibieni + dolari namibieni + + + cordoba Nicaragua + + + gulden olandez + guldeni olandezi + guldeni olandezi + + + coroană norvegiană + coroane norvegiene + coroane norvegiene + + + rupie nepaleză + rupii nepaleze + rupii nepaleze + + + dolar neozeelandez + dolari neozeelandezi + dolari neozeelandezi + + + riyal Oman + riyali Oman + riyali Oman + + + balboa panameză + balboa panameze + balboa panameze + + + inti peruvian + + + sol nou peruvian + soli noi Peru + soli noi Peru + + + sol peruvian + soli Peru + soli Peru + + + kina Papua-Noua Guinee + + + peso filipinez + pesos filipinezi + pesos filipinezi + + + rupie pakistaneză + rupii pakistaneze + rupii pakistaneze + + + zlot nou polonez + zloți noi polonezi + zloți noi polonezi + + + zlot polonez (1950–1995) + zloți polonezi (1950–1995) + zloți polonezi (1950–1995) + + + guarani Paraguay + + + riyal Qatar + riyali Qatar + riyali Qatar + + + dolar rhodesian + dolari rhodesieni + dolari rhodesieni + + + leu vechi + lei vechi + lei vechi + + + leu + lei + lei + + + dinar sârbesc + dinari sârbești + dinari sârbești + + + rublă rusească + ruble rusești + ruble rusești + + + franc Rwanda + franci Rwanda + franci Rwanda + + + riyal Arabia Saudită + riyali Arabia Saudită + riyali Arabia Saudită + + + dolar Insulele Solomon + dolari Insulele Solomon + dolari Insulele Solomon + + + rupie Seychelles + rupii Seychelles + rupii Seychelles + + + dinar sudanez + dinari sudanezi + dinari sudanezi + + + liră sudaneză + lire sudaneze + lire sudaneze + + + coroană suedeză + coroane suedeze + coroane suedeze + + + dolar Singapore + dolari Singapore + dolari Singapore + + + liră Insula Sf. Elena + lire Insula Sf. Elena + lire Insula Sf. Elena + + + tolar sloven + tolari sloveni + tolari sloveni + + + coroană slovacă + coroane slovace + coroane slovace + + + leu Sierra Leone + lei Sierra Leone + lei Sierra Leone + + + șiling somalez + șilingi somalezi + șilingi somalezi + + + dolar Surinam + dolari Surinam + dolari Surinam + + + gulden Surinam + guldeni Surinam + guldeni Surinam + + + dobra Sao Tome și Principe + + + rublă sovietică + ruble sovietice + ruble sovietice + + + colon El Salvador + coloni El Salvador + coloni El Salvador + + + liră siriană + lire siriene + lire siriene + + + baht thailandez + + + rublă Tadjikistan + ruble Tadjikistan + ruble Tadjikistan + + + dinar tunisian + dinari tunisieni + dinari tunisieni + + + liră turcească + lire turcești + + + liră turcească nouă + lire turcești noi + + + dolar Trinidad-Tobago + dolari Trinidad-Tobago + dolari Trinidad-Tobago + + + dolar nou Taiwan + dolari noi Taiwan + dolari noi Taiwan + + + șiling tanzanian + șilingi tanzanieni + șilingi tanzanieni + + + hryvna ucraineană + hryvna ucrainiene + hryvna ucrainiene + + + carboavă ucraineană + carboave ucrainiene + carboave ucrainiene + + + șiling ugandez (1966–1987) + șilingi ugandezi (1966–1987) + șilingi ugandezi (1966–1987) + + + șiling ugandez + șilingi ugandezi + șilingi ugandezi + + + dolar american + dolari americani + dolari americani + + + dolar american (ziua următoare) + dolari americani (ziua următoare) + dolari americani (ziua următoare) + + + dolar american (aceeași zi) + dolari americani (aceeași zi) + dolari americani (aceeași zi) + + + peso Uruguay (1975–1993) + pesos Uruguay (1975–1993) + pesos Uruguay (1975–1993) + + + peso nou Uruguay + pesos noi Uruguay + pesos noi Uruguay + + + sum Uzbekistan + + + bolivar Venezuela + bolivari Venezuela + bolivari Venezuela + + + dong vietnamez + + + franc Comunitatea Financiară + franci Comunitatea Financiară + franci Comunitatea Financiară + + + argint + + + aur + + + unitate compusă europeană + + + unitate monetară europeană + + + unitate de cont europeană (XBC) + + + unitate de cont europeană (XBD) + + + dolar Caraibele de Est + dolari Caraibele de Est + dolari Caraibele de Est + + + drepturi speciale de tragere + + + unitate de monedă europeană + + + franc francez de aur + franci francezi de aur + franci francezi de aur + + + franc UIC francez + + + paladiu + + + platină + + + cod monetar de test + + + monedă necunoscută sau nevalidă + monede necunoscute sau nevalide + monede necunoscute sau nevalide + + + dinar Yemen + dinari Yemen + dinari Yemen + + + riyal Yemen + riyali Yemen + riyali Yemen + + + dinar iugoslav greu + dinari iugoslavi grei + dinari iugoslavi grei + + + dinar iugoslav nou + dinari iugoslavi noi + dinari iugoslavi noi + + + dinar iugoslav convertibil + dinari iugoslavi convertibili + dinari iugoslavi convertibili + + + rand sud-african (financiar) + + + rand sud-african + + + zair nou + zairi noi + zairi noi + + + dolar Zimbabwe + dolari Zimbabwe + dolari Zimbabwe + + + + + + {0} zile + {0} zi + {0} de zile + + + {0} ore + {0} oră + {0} de ore + + + {0} minute + {0} minut + {0} de minute + + + {0} luni + {0} lună + {0} de luni + + + {0} secunde + {0} secundă + {0} de secunde + + + {0} săptămâni + {0} săptămână + {0} de săptămâni + + + {0} ani + {0} an + {0} de ani + + + + + da:d + nu:n + + + + diff --git a/lib/zend/Zend/Locale/Data/ro_MD.xml b/lib/zend/Zend/Locale/Data/ro_MD.xml new file mode 100644 index 0000000000..01c89c7871 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ro_MD.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ro_RO.xml b/lib/zend/Zend/Locale/Data/ro_RO.xml new file mode 100644 index 0000000000..0a00c221fa --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ro_RO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/root.xml b/lib/zend/Zend/Locale/Data/root.xml new file mode 100644 index 0000000000..2e24a413ad --- /dev/null +++ b/lib/zend/Zend/Locale/Data/root.xml @@ -0,0 +1,3208 @@ + + + + + + + + + + + + {0} ({1}) + , + + + US + Metric + + + {0} + {0} + {0} + + + + + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + mixed + + + [] + [] + [a-c č d-l ł m-o º p-z] + + + “ + ” + ‘ + ’ + + + {0} - {1} + + + + + + + + + + + + + AM + PM + + + + + + BE + + + + + + + + + + EEEE, MMMM d, y G + + + + + MMMM d, y G + + + + + MMM d, y G + + + + + M/d/yyyy + + + + + + + + + + + + EEE d + H:mm + H:mm:ss + L + E, M-d + LLL + E MMM d + E MMMM d + MMMM d + MMM d + M-d + d + h:mm a + h:mm:ss a + mm:ss + y + M/y + EEE, M/d/y + MMM, y + EEE, MMM d, y + MMMM, y + y Q + y QQQ + + + {0} ({2}: {1}) + {0} {1} + {0} {1} + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} {1} + {0} ({2}: {1}) + {0} {1} + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + AM + PM + + + + + EEEE y'x'G-Ml-d + + + + + y'x'G-Ml-d + + + + + y'x'G-Ml-d + + + + + y'x'G-Ml-d + + + + + + + + + + + + + + + + + + + + + + + Tout + Baba + Hator + Kiahk + Toba + Amshir + Baramhat + Baramouda + Bashans + Paona + Epep + Mesra + Nasie + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + + + + + + + + + + + + + AM + PM + + + + + + ERA0 + ERA1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + Meskerem + Tekemt + Hedar + Tahsas + Ter + Yekatit + Megabit + Miazia + Genbot + Sene + Hamle + Nehasse + Pagumen + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + + + + + + + + + + + + + AM + PM + + + + + + ERA0 + ERA1 + + + + + + + + + + + + + + + + + + + + + + + + + + AM + PM + + + + + + ERA0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + + + + + + + + + + Q1 + Q2 + Q3 + Q4 + + + + + + + + 1 + 2 + 3 + 4 + + + + + + + AM + PM + + + + + + BCE + CE + + + + + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yyyy-MM-dd + + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d EEE + H:mm + H:mm:ss + L + E, M-d + LLL + E MMM d + E MMMM d + MMMM d + MMM d + M-d + d + h:mm a + h:mm:ss a + mm:ss + y + y-M + EEE, y-M-d + y MMM + EEE, y MMM d + y MMMM + y Q + y QQQ + + + {0} ({2}: {1}) + {0} {1} + {0} {1} + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} {1} + {0} ({2}: {1}) + {0} {1} + + + {0} – {1} + + M-M + + + E, MM-dd – E, MM-dd + E, MM-dd – E, MM-dd + + + LLL-LLL + + + E, MM-d – E, MM-d + E, MM-d – E, MM-d + + + LLLL-LLLL + + + MM-d – MM-d + MM-d – d + + + MM-dd – MM-dd + MM-dd – dd + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + yyyy-MM-dd – MM-d + yyyy-MM-d – d + yyyy-MM-dd – yyyy-MM-dd + + + yyyy-MM-dd – MM-dd + yyyy-MM-dd – dd + yyyy-MM-dd – yyyy-MM-dd + + + + + + Era + + + Year + + + Month + + + Week + + + Day + Yesterday + Today + Tomorrow + + + Day of the Week + + + Dayperiod + + + Hour + + + Minute + + + Second + + + Zone + + + + + + + + + + + + + + + + Tishri + Heshvan + Kislev + Tevet + Shevat + Adar I + Adar + Nisan + Iyar + Sivan + Tamuz + Av + Elul + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + + + + + + + + + + + + + AM + PM + + + + + + AM + + + + + + + + + + + + + + + + + + + + + + + + + + + + Chaitra + Vaisakha + Jyaistha + Asadha + Sravana + Bhadra + Asvina + Kartika + Agrahayana + Pausa + Magha + Phalguna + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + AM + PM + + + + + + SAKA + + + + + + + + + + + + + + + + + + + + + + + + + + + + Muharram + Safar + Rabiʻ I + Rabiʻ II + Jumada I + Jumada II + Rajab + Shaʻban + Ramadan + Shawwal + Dhuʻl-Qiʻdah + Dhuʻl-Hijjah + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + AM + PM + + + + + + AH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AM + PM + + + + + + Taika + Hakuchi + Hakuhō + Shuchō + Taihō + Keiun + Wadō + Reiki + Yōrō + Jinki + Tempyō + Tempyō-kampō + Tempyō-shōhō + Tempyō-hōji + Temphō-jingo + Jingo-keiun + Hōki + Ten-ō + Enryaku + Daidō + Kōnin + Tenchō + Shōwa + Kajō + Ninju + Saiko + Tennan + Jōgan + Genkei + Ninna + Kampyō + Shōtai + Engi + Enchō + Shōhei + Tengyō + Tenryaku + Tentoku + Ōwa + Kōhō + Anna + Tenroku + Ten-en + Jōgen + Tengen + Eikan + Kanna + Ei-en + Eiso + Shōryaku + Chōtoku + Chōhō + Kankō + Chōwa + Kannin + Jian + Manju + Chōgen + Chōryaku + Chōkyū + Kantoku + Eishō + Tengi + Kōhei + Jiryaku + Enkyū + Shōho + Shōryaku + Eiho + Ōtoku + Kanji + Kaho + Eichō + Shōtoku + Kōwa + Chōji + Kashō + Tennin + Ten-ei + Eikyū + Gen-ei + Hoan + Tenji + Daiji + Tenshō + Chōshō + Hoen + Eiji + Kōji + Tenyō + Kyūan + Ninpei + Kyūju + Hogen + Heiji + Eiryaku + Ōho + Chōkan + Eiman + Nin-an + Kaō + Shōan + Angen + Jishō + Yōwa + Juei + Genryuku + Bunji + Kenkyū + Shōji + Kennin + Genkyū + Ken-ei + Shōgen + Kenryaku + Kenpō + Shōkyū + Jōō + Gennin + Karoku + Antei + Kanki + Jōei + Tempuku + Bunryaku + Katei + Ryakunin + En-ō + Ninji + Kangen + Hōji + Kenchō + Kōgen + Shōka + Shōgen + Bun-ō + Kōchō + Bun-ei + Kenji + Kōan + Shōō + Einin + Shōan + Kengen + Kagen + Tokuji + Enkei + Ōchō + Shōwa + Bunpō + Genō + Genkyō + Shōchū + Kareki + Gentoku + Genkō + Kemmu + Engen + Kōkoku + Shōhei + Kentoku + Bunchũ + Tenju + Kōryaku + Kōwa + Genchũ + Meitoku + Kakei + Kōō + Meitoku + Ōei + Shōchō + Eikyō + Kakitsu + Bun-an + Hōtoku + Kyōtoku + Kōshō + Chōroku + Kanshō + Bunshō + Ōnin + Bunmei + Chōkyō + Entoku + Meiō + Bunki + Eishō + Taiei + Kyōroku + Tenmon + Kōji + Eiroku + Genki + Tenshō + Bunroku + Keichō + Genwa + Kan-ei + Shōho + Keian + Shōō + Meiryaku + Manji + Kanbun + Enpō + Tenwa + Jōkyō + Genroku + Hōei + Shōtoku + Kyōhō + Genbun + Kanpō + Enkyō + Kan-en + Hōryaku + Meiwa + An-ei + Tenmei + Kansei + Kyōwa + Bunka + Bunsei + Tenpō + Kōka + Kaei + Ansei + Man-en + Bunkyū + Genji + Keiō + Meiji + Taishō + Shōwa + Heisei + + + M + T + S + H + + + + + + + EEEE, G y MMMM dd + + + + + G y MMMM d + + + + + G y MMM d + + + + + G yy-MM-dd + + + + + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + E d + H + HH:mm + HH:mm:ss + E MMM d + MMMM d + M-d + hh:mm a + hh:mm:ss a + mm:ss + yy GGG + GGGGG yy-MM + GGGGG yy MMM + GGGGG yy MMM d + GGGGG yy-MM-dd + GGGGG yy Q + + + {0} ({2}: {1}) + {0} {1} + {0} {1} + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} {1} + {0} ({2}: {1}) + {0} {1} + + + + + + + + + + + + + + + + Farvardin + Ordibehesht + Khordad + Tir + Mordad + Shahrivar + Mehr + Aban + Azar + Dey + Bahman + Esfand + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + + + + + + + AM + PM + + + + + + AP + + + + + + + + + + + + + + + + + + + + + + + + + + AM + PM + + + + + + Before R.O.C. + R.O.C. + + + + + + + + + + EEEE, MMMM d, G y + + + + + MMMM d, G y + + + + + MMM d, G y + + + + + G y/M/d + + + + + + + + + + + + H:mm + H:mm:ss + E, M/d + E, MMM d + MMM d + M/d + h:mm a + h:mm:ss a + mm:ss + G y + G y/M + EEE, G y/M/d + MMM, G y + EEE, MMM d, G y + Q G y + QQQ G y + + + {0} ({2}: {1}) + {0} {1} + {0} {1} + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} ({2}: {1}) + {0} {1} + {0} ({2}: {1}) + {0} {1} + + + + + + + + + +HH:mm;-HH:mm + {0}/{1} + GMT{0} + GMT + {0} + {1} ({0}) + + + + + Unknown + + + Dumont d'Urville + + + St. John's + + + New Salem, North Dakota + + + Center, North Dakota + + + Vincennes, Indiana + + + Petersburg, Indiana + + + Tell City, Indiana + + + Knox, Indiana + + + Winamac, Indiana + + + Marengo, Indiana + + + Vevay, Indiana + + + Monticello, Kentucky + + + + ACT (Acre) + ACST (Acre) + + + + + AFT + + + + + CAT + + + + + EAT + + + + + SAST + + + + + WAT + WAST + + + + + AKTT + AKTST + + + + + AKST + AKDT + + + + + AHST + AHDT + + + + + ALMT + ALMST + + + + + AMT + AMST + + + + + CST + CDT + + + + + EST + EDT + + + + + MST + MDT + + + + + PST + PDT + + + + + ANAT + ANAST + + + + + AQTT (Aqtau) + AQTST (Aqtau) + + + + + AQTT (Aqtobe) + AQTST (Aqtobe) + + + + + AST (SA) + ADT (SA) + + + + + ART + ARST + + + + + WART + + + + + AMT (AM) + AMST (AM) + + + + + ASHT + ASHST + + + + + AST + ADT + + + + + ACST + ACDT + + + + + ACWST + ACWDT + + + + + AEST + AEDT + + + + + AWST + AWDT + + + + + AZT + AZST + + + + + AZOT + AZOST + + + + + BAKT + BAKST + + + + + BDT + + + + + BST (Bering) + BDT (Bering) + + + + + BTT + + + + + BOT + + + + + BORT + BORST + + + + + BRT + BRST + + + + + BNT + + + + + CVT + CVST + + + + + ChST + + + + + CHAT + + + + + CHAST + CHADT + + + + + CLT + CLST + + + + + CST (CN) + CDT (CN) + + + + + CHOT + CHOST + + + + + CXT + + + + + CCT + + + + + COT + COST + + + + + CKT + CKHST + + + + + CST (CU) + CDT (CU) + + + + + DACT + + + + + DAVT + + + + + DDUT + + + + + DUST + DUSST + + + + + NEGT + + + + + TLT + + + + + EAST + EASST + + + + + ECT + + + + + CET + CEST + + + + + EET + EEST + + + + + WET + WEST + + + + + FKT + FKST + + + + + FJT + FJST + + + + + GFT + + + + + TFT + + + + + FRUT + FRUST + + + + + GMT + + + + + GALT + + + + + GAMT + + + + + GET + GEST + + + + + GILT + + + + + CGT + CGST + + + + + EGT + EGST + + + + + WGT + WGST + + + + + GST (GU) + + + + + GST + + + + + GYT + + + + + HST + + + + + HKT + HKST + + + + + HOVT + HOVST + + + + + IST + + + + + IOT + + + + + ICT + + + + + CIT + + + + + EIT + + + + + WIT + + + + + IRST + IRDT + + + + + IRKT + IRKST + + + + + IST (IL) + IDT + + + + + JST + JDT + + + + + PETT + PETST + + + + + KART + + + + + KAST + + + + + EKST + + + + + WKST + + + + + KIZT + KIZST + + + + + KST + KDT + + + + + KOST + + + + + KRAT + KRAST + + + + + KUYT + KUYST + + + + + KWAT + + + + + KGT + + + + + LKT + + + + + LINT + + + + + LONT + + + + + LHST + LHDT + + + + + MOT + MOST + + + + + MAGT + MAGST + + + + + MALT + + + + + MYT + + + + + MVT + + + + + MART + + + + + MHT + + + + + MUT + MUST + + + + + MAWT + + + + + ULAT + ULAST + + + + + MSK + MSKS + + + + + MMT + + + + + NRT + + + + + NPT + + + + + NCT + NCST + + + + + NZST + NZDT + + + + + NST + NDT + + + + + NUT + + + + + NFT + + + + + FNT + FNST + + + + + MPT + + + + + NOVT + NOVST + + + + + OMST + OMSST + + + + + PKT + PKST + + + + + PWT + + + + + PGT + + + + + PYT + PYST + + + + + PET + PEST + + + + + PHT + PHST + + + + + PHOT + + + + + PMST + PMDT + + + + + PNT + + + + + PONT + + + + + QYZT + QYZST + + + + + RET + + + + + ROTT + + + + + SAKT + SAKST + + + + + SAMT + SAMST + + + + + SAMT (Samarkand) + SAMST (Samarkand) + + + + + SST + + + + + SCT + + + + + SHET + SHEST + + + + + SGT + + + + + SBT + + + + + GST (GS) + + + + + SRT + + + + + SVET + SVEST + + + + + SYOT + + + + + TAHT + + + + + TJT + + + + + TAST + TASST + + + + + TBIT + TBIST + + + + + TKT + + + + + TOT + TOST + + + + + TRUT + + + + + TRT + TRST + + + + + TMT + TMST + + + + + TVT + + + + + URAT + URAST + + + + + UYT + UYST + + + + + URUT + + + + + UZT + UZST + + + + + VUT + VUST + + + + + VET + + + + + VLAT + VLAST + + + + + VOLT + VOLST + + + + + VOST + + + + + WAKT + + + + + WFT + + + + + YAKT + YAKST + + + + + YEKT + YEKST + + + + + YERT + YERST + + + + + YST + YDT + + + + + + latn + + . + , + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + [:letter:] + [:digit:] +   + + + [:letter:] + [:digit:] +   + + + + + ¤ #,##0.00 + + + {0} {1} + + + + Af + + + ALL + + + NAf. + + + Kz + + + ₳ + + + $L + + + m$n + + + AR$ + + + AU$ + + + Afl. + + + man. + + + KM + + + Bds$ + + + Tk + + + BF + + + BD + + + FBu + + + BD$ + + + BN$ + + + Bs + + + $b. + + + NCr + + + Cz$ + + + Cr$ + + + R$ + + + NCz$ + + + CR$ + + + ₢ + + + BS$ + + + Nu. + + + BWP + + + BZ$ + + + CA$ + + + CDF + + + Fr. + + + Eº + + + CL$ + + + CN¥ + + + CO$ + + + ₡ + + + CUC$ + + + CU$ + + + CV$ + + + CY£ + + + Kč + + + DM + + + Fdj + + + Dkr + + + RD$ + + + DA + + + Ekr + + + EG£ + + + Nfk + + + Pts + + + Br + + + € + + + mk + + + FJ$ + + + FK£ + + + ₣ + + + £ + + + ₵ + + + GH₵ + + + GI£ + + + GMD + + + FG + + + ₯ + + + GTQ + + + GY$ + + + HK$ + + + HNL + + + kn + + + HTG + + + Ft + + + Rp + + + IR£ + + + I£ + + + ₪ + + + ₨ + + + Ikr + + + IT₤ + + + J$ + + + JD + + + JP¥ + + + Ksh + + + CF + + + KP₩ + + + ₩ + + + KD + + + KY$ + + + ₭ + + + LB£ + + + SLRs + + + L$ + + + LSL + + + Lt + + + Ls + + + LD + + + MMK + + + ₮ + + + MOP$ + + + UM + + + Lm + + + MT£ + + + MURs + + + Rf + + + MK + + + MX$ + + + RM + + + Mt + + + MTn + + + N$ + + + ₦ + + + C$ + + + fl + + + Nkr + + + NPRs + + + NZ$ + + + B/. + + + I/. + + + S/. + + + PGK + + + ₱ + + + PKRs + + + zł + + + Esc + + + ₲ + + + QR + + + RH$ + + + RON + + + din. + + + RF + + + SR + + + SI$ + + + SRe + + + LSd + + + Skr + + + S$ + + + SH£ + + + Sk + + + Le + + + Ssh + + + SR$ + + + Sf + + + Db + + + SV₡ + + + SY£ + + + SZL + + + ฿ + + + TMM + + + DT + + + T$ + + + TRL + + + TL + + + TT$ + + + NT$ + + + TSh + + + ₴ + + + USh + + + US$ + + + $U + + + Bs. + + + Bs.F. + + + ₫ + + + VT + + + WS$ + + + FCFA + + + EC$ + + + CFA + + + CFPF + + + YR + + + R + + + ZK + + + NZ + + + ZRZ + + + Z$ + + + + + + {0} d + + + {0} h + + + {0} min + + + {0} m + + + {0} s + + + {0} w + + + {0} y + + + + + yes:y + no:n + + + + diff --git a/lib/zend/Zend/Locale/Data/ru.xml b/lib/zend/Zend/Locale/Data/ru.xml new file mode 100644 index 0000000000..4db21e8061 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ru.xml @@ -0,0 +1,3950 @@ + + + + + + + + + + + {0} ({1}) + , + + + афар + абхазский + ачехский + ачоли + адангме + адыгейский + авестийский + африкаанс + афразийский язык + африхили + айну + акан + аккадский + алеутский + алгонкинские языки + южноалтайский + амхарский + арагонский + староанглийский + ангика + апачские языки + арабский + арамейский + арауканский + арапахо + искусственный язык + аравакский + ассамский + астурийский + атапачские языки + австралийский язык + аварский + авадхи + аймара + азербайджанский + башкирский + банда + бамилеке языки + белуджский + балийский + баса + балтийский язык + белорусский + беджа + бемба + берберский + болгарский + бихари + бходжпури + бислама + бикольский + бини + сиксика + бамбарийский + бенгальский + банту + тибетский + бретонский + брауи + боснийский + батакский + бурятский + бугийский + билин (блин) + каталанский + каддо + язык индейцев Центральной Америки + кариб + кавказский язык + атсам + чеченский + кебуано + кельтские другие + чаморро + чибча + чагатайский + чукотский + марийский (черемисский) + чинук жаргон + чоктав + чипевайян + чероки + чейенн + чамский язык + корсиканский + коптский + англо-креольские и пиджин + франко-креольские и пиджины + португало-креольские и пиджины + криийский + крымско-татарский + креольские и пиджины + чешский + кашубианский + церковнославянский + кушитский язык + чувашский + валлийский + датский + дакота + даргва + даяк + немецкий + австрийский немецкий + Швейцарский верхненемецкий + делаварский + славянский + догриб + динка + догри + дравидийский язык + нижнелужицкий + дуала + средненидерландский + мальдивский + диула (дьюла) + дзонг-кэ + эве + эфик + древнеегипетский + экаджук + греческий + эламский + английский + австралийский английский + Канадский английский + британский английский + американский английский + среднеанглийский + эсперанто + испанский + Латино-американский испанский + Испанский иберийский + эстонский + баскский + эвондо + персидский + фанг + фанти + фулах + финский + филиппинский + финно-угорский язык + фиджи + фарерский + фон + французский + Канадский французский + Швейцарский французский + среднефранцузский + старофранцузский + фризский северный + восточный фризский + фриульский + фризский + ирландский + га + гайо + гбая + гэльский + германский язык + геэз + гильбертский + галисийский + средневерхненемецкий + гуарани + древневерхненемецкий + гонди + горонтало + готский + гребо + древнегреческий + Швейцарский немецкий + гуджарати + мэнский + гвичин + хауса + хайда + гавайский + иврит + хинди + хилигайнон + химачали + хеттский + хмонг + хиримоту + хорватский + верхнелужицкий + гаитянский + венгерский + хупа + армянский + гереро + интерлингва + ибанский + индонезийский + интерлингве + игбо + сычуань + иджо + инупиак + илоко + индийский язык + индоевропейский язык + ингушский + идо + иранский язык + ирокезские языки + исландский + итальянский + инуктитут + японский + ложбан + еврейско-персидский + еврейско-арабский + яванский + грузинский + каракалпакский + кабильский + качинский + каджи + камба + каренский + кави + кабардинский + тьяп + коро + конго + кхаси + койсанский язык + хотанский + кикуйю + кунама + казахский + эскимосский (гренландский) + кхмерский + кимбундийский + каннада + корейский + конкани + косраенский + кпелле + канури + карачаево-балкарский + карельский + кру + курух + кашмири + курдский + кумыкский + кутенаи + коми + корнийский + киргизский + латинский + ладино + лахнда + ламба + люксембургский + лезгинский + ганда + лимбургский + лингала + лаосский + монго + лози + литовский + луба-катанга + луба-лулуа + луисеньо + лунда + луо (Кения и Танзания) + лушай + латышский + мадурский + магахи + майтхили + макассарский + мандинго + австронезийский + масаи + мокшанский + мандарский + менде + малагасийский + среднеирландский + маршалльский + маори + микмак + минангкабау + смешанные языки + македонский + монкхмерский язык + малаялам + монгольский + маньчжурский + манипурский + манобо языки + молдавский + мохаук + моси + маратхи + малайский + мальтийский + несколько языков + мунда языки + крик + мирандийский + марвари + бирманский + майя языки + эрзя + науру + ацтекский + язык индейцев Северной Америки + неаполитанский + норвежский букмол + ндебели (северный) + нижнегерманский + непальский + неварский + ндонга + ниас + нигер-кордофанский язык + ниуэ + голландский + Бельгийский фламандский + норвежский нюнорск + норвежский + ногайский + старонорвежский + нко + ндебели южный + сото северный + нубийские языки + навахо + невари (классический) + ньянджа + ньямвези + ньянколе + ньоро + нзима + окситанский + оджибва + оромо + ория + осетинский + оседжи + старотурецкий + отомангские языки + панджаби (пенджаби) + папуасский язык + пангасинан + пехлевийский + пампанга + папьяменто + палау + староперсидский + филиппинский язык + финикийский + пали + польский + понапе + пракриты языки + старопровансальский + пашто (пушту) + португальский + бразильский португальский + Португальский иберийский + кечуа + раджастхани + рапануи + раротонганский + ретороманский + рунди + румынский + романский язык + цыганский + корневой язык + русский + арумынский + киньяруанда + санскрит + сандаве + якутский + язык индейцев Южной Америки + салишские языки + самаритянский арамейский + сасаки + сантали + сардинский + сицилийский + шотландский + синдхи + саамский (северный) + селькупский + семитский язык + санго + староирландский + язык глухонемых + сербскохорватский + шанский + сингальский + сидама + сиу языки + синотибетский язык + словацкий + словенский + славянский язык + самоанский + саамский (южный) + саамские языки + луле-саамский + инари-саамский + скольт-саамский + шона + сонинке + сомали + согдийский + cонгаи + албанский + сербский + сранан тонго + серер + свази + нило-сахарский язык + сото южный + сунданский + сукума + сусу + шумерский + шведский + суахили + классический сирийский + сирийский + тамильский + тайский язык + телугу + темне + терено + тетум + таджикский + тайский + тигринья + тигре + тиви + туркменский + токелайский + тагалог + клингонский + тлингит + тамашек + тсвана + тонга + ньяса (тонга) + ток-писин + турецкий + тсонга + цимшиан + татарский + тумбука + тупи + алтайский язык + тувалу + тви + таитянский + тувинский + удмуртский + уйгурский + угаритский + украинский + умбунду + неизвестный или недействительный язык + урду + узбекский + ваи + венда + вьетнамский + волапюк + водский + валлонский + вакашские языки + воламо + варай + вашо + лужицкие языки + волоф + калмыцкий + ксоза + яо + яп + идиш + йоруба + юпикский язык + чжуань + сапотекский + блиссимволика + зенагский + китайский + упрощенный китайский + Традиционный китайский + занде + зулу + зуньи + без языкового содержания + заза + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Мир + Африка + Северная Америка + Южная Америка + Океания + Западная Африка + Центральная Америка + Восточная Африка + Северная Африка + Центральная Африка + Южная Африка [018] + Центральная и Южная Америка + Северная Америка (021) + Карибы + Восточная Азия + Южная Азия + Юго-Восточная Азия + Южная Европа + Австралия и Новая Зеландия + Меланезия + Микронезия + Полинезия + Юг Средней Азии + Азия + Средняя Азия + Ближний и Средний Восток + Европа + Восточная Европа + Северная Европа + Западная Европа + СНГ + Латинская Америка и Карибские о-ва + Нормандские острова + Андорра + Объединенные Арабские Эмираты + Афганистан + Антигуа и Барбуда + Ангуилла + Албания + Армения + Нидерландские Антильские острова + Ангола + Антарктика + Аргентина + Американское Самоа + Австрия + Австралия + Аруба + Аландские острова + Азербайджан + Босния и Герцеговина + Барбадос + Бангладеш + Бельгия + Буркина Фасо + Болгария + Бахрейн + Бурунди + Бенин + Остров Святого Бартоломея + Бермудские Острова + Бруней Даруссалам + Боливия + Бразилия + Багамские острова + Бутан + Остров Буве + Ботсвана + Беларусь + Белиз + Канада + Кокосовые острова + Демократическая Республика Конго + Центрально-Африканская Республика + Конго + Швейцария + Кот д’Ивуар + Острова Кука + Чили + Камерун + Китай + Колумбия + Коста-Рика + Сербия и Черногория + Куба + Острова Зеленого Мыса + Остров Рождества + Кипр + Чешская республика + Германия + Джибути + Дания + Остров Доминика + Доминиканская Республика + Алжир + Эквадор + Эстония + Египет + Западная Сахара + Эритрея + Испания + Эфиопия + Финляндия + Фиджи + Фолклендские острова + Федеративные Штаты Микронезии + Фарерские острова + Франция + Габон + Великобритания + Гренада + Грузия + Французская Гвиана + Гернси + Гана + Гибралтар + Гренландия + Гамбия + Гвинея + Гваделупа + Экваториальная Гвинея + Греция + Южная Джорджия и Южные Сандвичевы Острова + Гватемала + Гуам + Гвинея-Биссау + Гайана + Гонконг, Особый Административный Район Китая + Острова Херд и Макдональд + Гондурас + Хорватия + Гаити + Венгрия + Индонезия + Ирландия + Израиль + Остров Мэн + Индия + Британская территория в Индийском океане + Ирак + Иран + Исландия + Италия + Джерси + Ямайка + Иордания + Япония + Кения + Кыргызстан + Камбоджа + Кирибати + Коморские Острова + Сент-Киттс и Невис + Корейская Народно-Демократическая Республика + Республика Корея + Кувейт + Каймановы острова + Казахстан + Лаос + Ливан + Сент-Люсия + Лихтенштейн + Шри-Ланка + Либерия + Лесото + Литва + Люксембург + Латвия + Ливия + Марокко + Монако + Молдова + Черногория + Остров Святого Мартина + Мадагаскар + Маршалловы Острова + Македония + Мали + Мьянма + Монголия + Макао (особый административный район КНР) + Северные Марианские Острова + Мартиник + Мавритания + Монсеррат + Мальта + Маврикий + Мальдивы + Малави + Мексика + Малайзия + Мозамбик + Намибия + Новая Каледония + Нигер + Остров Норфолк + Нигерия + Никарагуа + Нидерланды + Норвегия + Непал + Науру + Ниуе + Новая Зеландия + Оман + Панама + Перу + Французская Полинезия + Папуа-Новая Гвинея + Филиппины + Пакистан + Польша + Сен-Пьер и Микелон + Питкерн + Пуэрто-Рико + Палестинская автономия + Португалия + Палау + Парагвай + Катар + Внешняя Океания + Европейский союз + Реюньон + Румыния + Сербия + Россия + Руанда + Саудовская Аравия + Соломоновы Острова + Сейшельские Острова + Судан + Швеция + Сингапур + Остров Святой Елены + Словения + Свальбард и Ян-Майен + Словакия + Сьерра-Леоне + Сан-Марино + Сенегал + Сомали + Суринам + Сан-Томе и Принсипи + Сальвадор + Сирийская Арабская Республика + Свазиленд + Острова Тёркс и Кайкос + Чад + Французские Южные Территории + Того + Таиланд + Таджикистан + Токелау + Восточный Тимор + Туркменистан + Тунис + Тонга + Турция + Тринидад и Тобаго + Тувалу + Тайвань + Танзания + Украина + Уганда + Внешние малые острова (США) + США + Уругвай + Узбекистан + Ватикан + Сент-Винсент и Гренадины + Венесуэла + Британские Виргинские Острова + Американские Виргинские острова + Вьетнам + Вануату + Уоллис и Футуна + Самоа + Йемен + Майотта + Южная Африка + Замбия + Зимбабве + Неизвестный или недействительный регион + + + Традиционная немецкая орфография + Стандартизированная резьянская орфография + Правила немецкой орфографии установленные с 1996 года + Поздне-средневековый французский до 1606 г. + Восточно-армянский + Западно-армянский + Унифицированный тюрско-латинский алфавит + Международный фонетический алфавит + Монотонный + Многотональный + Компьютерный + Резьянский + Сахо + Англо-шотландский + Тарашкевица + Валенсийский + + + Календарь + Сопоставление + Валюта + + + традиционный китайский - Big5 + Буддийский календарь + Китайский календарь + прямой порядок + упрощенный китайский - GB2312 + Григорианский календарь + Еврейский календарь + Национальный календарь Индии + Исламский календарь + Исламский гражданский календарь + Японский календарь + порядок телефонной книги + пиньинь + Китайский календарь + по чертам + традиционный порядок + + + Англо-американская + Метрическая + + + Язык: {0} + Написание: {0} + Регион: {0} + + + + titlecase-firstword + + + [а-е ё ж-я] + [a-e g i m n p r t-x] + [a-z] + + + « + » + „ + “ + + + + + + + + янв. + февр. + марта + апр. + мая + июня + июля + авг. + сент. + окт. + нояб. + дек. + + + января + февраля + марта + апреля + мая + июня + июля + августа + сентября + октября + ноября + декабря + + + + + янв. + февр. + март + апр. + май + июнь + июль + авг. + сент. + окт. + нояб. + дек. + + + Я + Ф + М + А + М + И + И + А + С + О + Н + Д + + + Январь + Февраль + Март + Апрель + Май + Июнь + Июль + Август + Сентябрь + Октябрь + Ноябрь + Декабрь + + + + + + + Вс + Пн + Вт + Ср + Чт + Пт + Сб + + + воскресенье + понедельник + вторник + среда + четверг + пятница + суббота + + + + + В + П + В + С + Ч + П + С + + + Воскресенье + Понедельник + Вторник + Среда + Четверг + Пятница + Суббота + + + + + + + 1-й кв. + 2-й кв. + 3-й кв. + 4-й кв. + + + 1-й квартал + 2-й квартал + 3-й квартал + 4-й квартал + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + до н.э. + н.э. + + + до н.э. + н.э. + + + + + + EEEE, d MMMM y 'г'. + + + + + d MMMM y 'г'. + + + + + dd.MM.yyyy + + + + + dd.MM.yy + + + + + + + H:mm:ss zzzz + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + E d + H + HH:mm + HH:mm:ss + H:mm + L + E, M-d + LLL + E MMM d + E MMMM d + d MMMM + d MMM + dd.MM + d.M + d + mm:ss + mm:ss + y + yyyy-M + EEE, yyyy-M-d + MMM y + E, d MMM y + MMMM y + Q y + y QQQ + MM.yy + MMM yy + EEE, d MMM yy + Q yy + y + LLLL y + MM.yyyy + MMMM y + QQQQ y 'г'. + + + {0} - {1} + + M-M + + + E, MM-dd – E, MM-dd + E, MM-dd – E, MM-dd + + + MMM-MMM + + + d MMM - d MMM + d-d MMM + + + LLLL-LLLL + + + d MMM - d MMM + d-d MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM.yy - MM.yy + MM.yy - MM.yy + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + MMM-MMM y 'г'. + MMM y - MMM y 'г'. + + + d MMM - d MMM y 'г'. + d-d MMM y 'г'. + d MMM y - d MMM y 'г'. + + + LLLL-LLLL y 'г'. + LLLL y - LLLL y 'г'. + + + d MMM - d MMM y 'г'. + d-d MMM y 'г'. + d MMM y - d MMM y 'г'. + + + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + dd.MM.yy - dd.MM.yy + + + + + + Эра + + + Год + + + Месяц + + + Неделя + + + День + Позавчера + Вчера + Сегодня + Завтра + Послезавтра + + + День недели + + + AM/PM + + + Час + + + Минута + + + Секунда + + + Часовой пояс + + + + + + + + Тишрей + Хешван + Кислев + Тевет + Шеват + Адар + Нисан + Ияр + Сиван + Таммуз + Ав + Элул + + + + + + + + + Мухаррам + Сафар + Раби-уль-авваль + Раби-уль-ахир + Джумад-уль-авваль + Джумад-уль-ахир + Раджаб + Шаабан + Рамадан + Шавваль + Зуль-Каада + Зуль-Хиджжа + + + + + + + + + Фарвардин + Ордибехешт + Хордад + Тир + Мордад + Шахривер + Мехр + Абан + Азер + Дей + Бахман + Эсфанд + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Неизвестный + + + Андорра + + + Дубай + + + Кабул + + + Антигуа + + + Ангилья + + + Тирана + + + Ереван + + + Кюрасао + + + Луанда + + + Ротера + + + Палмер + + + Южный полюс + + + Сева + + + Моусон + + + Дейвис + + + Восток + + + Кейси + + + Дюмон-д'Юрвиль + + + Мак-Мердо + + + Рио-Гальегос + + + Мендоса + + + Сан-Хуан + + + Ушуая + + + Ла-Риоха + + + Сан-Луис + + + Катамарка + + + Жужуй + + + Тукуман + + + Кордова + + + Буэнос-Айрес + + + Паго-Паго + + + Вена + + + Перт + + + Юкла + + + Дарвин + + + Аделаида + + + Брокен-Хилл + + + Керри + + + Мельбурн + + + Хобарт + + + Линдеман + + + Сидней + + + Брисбен + + + Лорд-Хау, о-в + + + Аруба + + + Мариехамн + + + Баку + + + Сараево + + + Барбадос + + + Дакка + + + Брюссель + + + Уагадугу + + + София + + + Бахрейн + + + Бужумбура + + + Порто-Ново + + + Бермуды + + + Бруней + + + Ла-Пас + + + Эйрунепе + + + Риу-Бранку + + + Порту-Велью + + + Боа-Виста + + + Манаус + + + Куяба + + + Кампу-Гранди + + + Белен + + + Арагуаина + + + Сан-Паулу + + + Баия + + + Форталеза + + + Масейо + + + Ресифи + + + Норонха + + + Нассау + + + Тимпу + + + Габороне + + + Минск + + + Белиз + + + Доусон + + + Уайтхорс + + + Инувик + + + Ванкувер + + + Досон-Крик + + + Йеллоунайф + + + Эдмонтон + + + Свифт-Карент + + + Кеймбридж-Бей + + + Реджайна + + + Виннипег + + + Резолют + + + Рейни-Ривер + + + Ранкин-Инлет + + + Корал-Харбор + + + Тандер-Бей + + + Нипигон + + + Торонто + + + Монреаль + + + Икалуит + + + Пангниртанг + + + Монктон + + + Галифакс + + + Гус-Бей + + + Глейс-Бей + + + Бланк-Саблон + + + Сент-Джонс + + + Кокосовые острова + + + Киншаса + + + Лубумбаши + + + Банги + + + Браззавиль + + + Цюрих + + + Абиджан + + + Раротонга + + + Пасхи, о-в + + + Сантьяго + + + Дуала + + + Кашгар + + + Урумчи + + + Чунцин + + + Шанхай + + + Харбин + + + Богота + + + Коста-Рика + + + Гавана + + + Острова Зеленого Мыса + + + Рождества, о-в + + + Никосия + + + Прага + + + Берлин + + + Джибути + + + Копенгаген + + + Доминика + + + Санто-Доминго + + + Алжир + + + Галапагос, о-ва + + + Гуаякиль + + + Таллин + + + Каир + + + Эль-Аюн + + + Асмера + + + Канарские о-ва + + + Сеута + + + Мадрид + + + Аддис-Абеба + + + Хельсинки + + + Фиджи + + + Стэнли + + + Трук, о-ва + + + Понапе, о-в + + + Косрае + + + Фарерские острова + + + Париж + + + Либревиль + + + Лондон + + + Гренада + + + Тбилиси + + + Кайенна + + + Гернси + + + Аккра + + + Гибралтар + + + Туле + + + Готхоб + + + Скорсбисунн + + + Денмарксхавн + + + Банжул + + + Конакри + + + Гваделупа + + + Малабо + + + Афины + + + Ю.Джорджия и Ю.Сэндвинчевы о-ва + + + Гватемала + + + Гуам + + + Бисау + + + Гайана + + + Гонконг + + + Тегусигальпа + + + Загреб + + + Порт-о-Пренс + + + Будапешт + + + Джакарта + + + Понтианак + + + Макасар + + + Джайпур + + + Дублин + + + Иерусалим + + + Мэн, о-в + + + Калькутта + + + Чагос + + + Багдад + + + Тегеран + + + Рейкьявик + + + Рим + + + Джерси + + + Ямайка + + + Амман + + + Токио + + + Найроби + + + Бишкек + + + Пномпень + + + Эндербери, о-в + + + Киритимати + + + Тарава + + + Коморские острова + + + Сент-Китс + + + Пхеньян + + + Сеул + + + Кувейт + + + Каймановы острова + + + Актау + + + Орал (Уральск) + + + Актобе (Актюбинск) + + + Кызылорда + + + Алматы + + + Вьентьян + + + Бейрут + + + Сент-Люсия + + + Вадуц + + + Коломбо + + + Монровия + + + Масеру + + + Вильнюс + + + Люксембург + + + Рига + + + Триполи + + + Касабланка + + + Монако + + + Кишинев + + + Подгорица + + + Антананариву + + + Кваджалейн + + + Маджуро + + + Скопье + + + Бамако + + + Рангун + + + Ховд + + + Улан-Батор + + + Чойбалсан + + + Макао + + + Сайпан + + + Мартиника + + + Нуакшот + + + Монсеррат + + + Мальта + + + Маврикий + + + Мальдивы + + + Блантайр + + + Тихуана + + + Эрмосильо + + + Масатлан + + + Чиуауа + + + Монтеррей + + + Мехико + + + Мерида + + + Канкун + + + Куала-Лумпур + + + Кучинг + + + Мапуту + + + Виндхук + + + Нумеа + + + Ниамей + + + Норфолк + + + Лагос + + + Манагуа + + + Амстердам + + + Осло + + + Катманду + + + Науру + + + Ниуэ + + + Чатем, о-в + + + Окленд + + + Маскат + + + Панама + + + Лима + + + Таити, о-в + + + Маркизские о-ва + + + Гамбье, о-ва + + + Порт-Морсби + + + Манила + + + Карачи + + + Варшава + + + Микелон + + + Питкерн + + + Пуэрто-Рико + + + Газа + + + Азорские о-ва + + + Мадейра, о-в + + + Лиссабон + + + Палау + + + Асунсьон + + + Катар + + + Реюньон + + + Бухарест + + + Белград + + + Калининград + + + Москва + + + Волгоград + + + Самара + + + Екатеринбург + + + Омск + + + Новосибирск + + + Красноярск + + + Иркутск + + + Якутск + + + Владивосток + + + Сахалин, о-в + + + Магадан + + + Петропавловск-Камчатский + + + Анадырь + + + Кигали + + + Эр-Рияд + + + Гвадалканал + + + Маэ + + + Хартум + + + Стокгольм + + + Сингапур + + + Св. Елены, о-в + + + Любляна + + + Лонгйир + + + Братислава + + + Фритаун + + + Сан-Марино + + + Дакар + + + Могадишо + + + Парамарибо + + + Сан-Томе + + + Сальвадор + + + Дамаск + + + Мбабане + + + Гранд Турк + + + Нджамена + + + Кергелен + + + Ломе + + + Бангкок + + + Душанбе + + + Факаофо + + + Дили + + + Ашгабат + + + Тунис + + + Тонгатапу + + + Стамбул + + + Порт-оф-Спейн + + + Фунафути + + + Тайбэй + + + Дар-эс-Салам + + + Ужгород + + + Киев + + + Симферополь + + + Запорожье + + + Кампала + + + Мидуэй, о-ва + + + Джонстон, ат. + + + Уэйк, о-в + + + Адак, о-в + + + Ном + + + Гонолулу + + + Анкоридж + + + Якутат + + + Джуно + + + Лос-Анджелес + + + Бойсе + + + Финикс + + + Шипрок + + + Денвер + + + Нью-Салем + + + Северная Дакота - Центр + + + Чикаго + + + Меномини + + + Винсенс + + + Петерсбург + + + Телл-Сити + + + Нокс + + + Винамак + + + Маренго + + + Индианаполис + + + Луисвилл + + + Вивэй + + + Монтиселло + + + Детройт + + + Нью-Йорк + + + Монтевидео + + + Самарканд + + + Ташкент + + + Ватикан + + + Сент-Винсент + + + Каракас + + + Тортола + + + Сент-Томас + + + Сайгон + + + Эфате + + + Уоллис + + + Апия + + + Аден + + + Майорка + + + Йоханнесбург + + + Лусака + + + Хараре + + + + Акри время + Акри стандартное время + Акри летнее время + + + Акри время + Акри стандартное время + Акри летнее время + + + + + Афганистан время + + + Афганистан время + + true + + + + Центральноафриканское время + + + + + Восточноафриканское время + + + + + Южноафриканское время + + + + + Западноафриканское время + Западноафриканское летнее время + + + + + Актюбинск стандартное время + Актюбинск летнее время + + + Актюбинск стандартное время + Актюбинск летнее время + + true + + + + Аляска время + Аляска стандартное время + Аляска летнее время + + + Аляска время + Аляска стандартное время + Аляска летнее время + + true + + + true + + + + Алма-Ата стандартное время + Алма-Ата летнее время + + + Алма-Ата стандартное время + Алма-Ата летнее время + + true + + + + Средне-американское время + Средне-американское стандартное время + Средне-американское летнее время + + + Средне-американское время + Средне-американское стандартное время + Средне-американское летнее время + + true + + + + Восточно-американское время + Восточно-американское стандартное время + Восточно-американское летнее время + + + Восточно-американское время + Восточно-американское стандартное время + Восточно-американское летнее время + + true + + + + Горное время (США) + Горное стандартное время (США) + Горное летнее время (США) + + + Горное время (США) + Горное стандартное время (США) + Горное летнее время (США) + + true + + + + Тихоокеанское время + Тихоокеанское стандартное время + Тихоокеанское летнее время + + + Тихоокеанское время + Тихоокеанское стандартное время + Тихоокеанское летнее время + + true + + + + Анадырь стандартное время + Анадырь летнее время + + + Анадырь стандартное время + Анадырь летнее время + + true + + + + Актау стандартное время + Актау летнее время + + + Актау стандартное время + Актау летнее время + + true + + + + Актобе стандартное время + Актобе летнее время + + + Актобе стандартное время + Актобе летнее время + + true + + + + Саудовская Аравия время + Саудовская Аравия стандартное время + Саудовская Аравия летнее время + + + Саудовская Аравия время + Саудовская Аравия стандартное время + Саудовская Аравия летнее время + + true + + + + Аргентина стандартное время + Аргентина летнее время + + + Аргентина стандартное время + Аргентина летнее время + + true + + + + Аргентина (запад) стандартное время + + + Аргентина (запад) стандартное время + + true + + + + Армения время + Армения стандартное время + Армения летнее время + + + Армения время + Армения стандартное время + Армения летнее время + + true + + + + Атлантическое время + Атлантическое стандартное время + Атлантическое летнее время + + + Атлантическое время + Атлантическое стандартное время + Атлантическое летнее время + + + + + Бразилия стандартное время + Бразилия дневное время + + + Бразилия стандартное время + Бразилия дневное время + + + + + Китайское стандартное время + + + Китайское стандартное время + + + + + Центральноевропейское время + Центральноевропейское летнее время + + + Центральноевропейское время + Центральноевропейское летнее время + + true + + + + Восточноевропейское время + Восточноевропейское летнее время + + + Восточноевропейское время + Восточноевропейское летнее время + + true + + + + Гонконгское стандартное время + Гонконгское летнее время + + + Гонконгское стандартное время + Гонконгское летнее время + + + + + Индийское стандартное время + + + Индийское стандартное время + + + + + Индокитайское стандартное время + + + Индокитайское стандартное время + + + + + Центральная Индонезия стандартное время + + + Центральная Индонезия стандартное время + + + + + Восточная Индонезия стандартное время + + + Восточная Индонезия стандартное время + + + + + Западная Индонезия стандартное время + + + Западная Индонезия стандартное время + + + + + Израиль стандартное время + Израиль летнее время + + + Израиль стандартное время + Израиль летнее время + + + + + Японское стандартное время + + + Японское стандартное время + + + + + Корейское стандартное время + + + Корейское стандартное время + + + + + Куйбышевское время + Куйбышевское летнее время + + + Куйбышевское время + Куйбышевское летнее время + + true + + + + Московское время + Московское стандартное время + Московское летнее время + + + Московское время + Московское стандартное время + Московское летнее время + + true + + + + Самарское стандартное время + Самарское летнее время + + + Самарское стандартное время + Самарское летнее время + + true + + + + Турецкое время + Турецкое стандартное время + Турецкое летнее время + + + Турецкое вреµµмя + Турецкое стандартное время + Турецкое летнее время + + true + + + + Волгоградское время + Волгоградское летнее время + + + Волгоградское время + Волгоградское летнее время + + true + + + + + + , +   + ; + % + 0 + # + + + - + E + ‰ + ∞ + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + + + + Андоррская песета + андоррские песеты + андоррских песет + + + Дирхам (ОАЭ) + + + Афгани (1927-2002) + + + Афгани + + + Албанский лек + албанских лека + албанских леков + + + Армянский драм + армянских драма + армянских драмов + + + Нидерландский антильский гульден + + + Ангольская кванза + + + Ангольская кванза (1977-1990) + ангольские кванзы + ангольских кванз + + + Ангольская новая кванза (1990-2000) + + + Ангольская кванза реюстадо (1995-1999) + ангольские кванзы реюстадо (1995-1999) + ангольских кванз реюстадо (1995-1999) + + + Аргентинский аустрал + + + Аргентинское песо (1983-1985) + + + Аргентинское песо + + + Австрийский шиллинг + + + Австралийский доллар + + + Арубанский гульден + + + Старый азербайджанский манат + + + Азербайджанский манат + + + Динар Боснии и Герцеговины + + + Конвертируемая марка Боснии и Герцеговины + + + Барбадосский доллар + + + Бангладешская така + + + Бельгийский франк (конвертируемый) + + + Бельгийский франк + + + Бельгийский франк (финансовый) + + + Лев + + + Болгарский лев + + + Бахрейнский динар + + + Бурундийский франк + + + Бермудский доллар + + + Брунейский доллар + + + Боливиано + + + Боливийское песо + + + Боливийский мвдол + + + Бразильский новый крузейро (1967-1986) + + + Бразильское крузадо + + + Бразильский крузейро (1990-1993) + + + Бразильский реал + + + Бразильское новое крузадо + + + Бразильский крузейро + + + Багамский доллар + + + Нгултрум + + + Джа + + + Ботсванская пула + + + Белорусский рубль (1994-1999) + + + Белорусский рубль + + + Белизский доллар + + + Канадский доллар + + + Конголезский франк + + + WIR евро + + + Швейцарский франк + + + WIR франк + + + Условная расчетная единица Чили + + + Чилийское песо + + + Юань Ренминби + + + Колумбийское песо + + + Единица реальной стоимости Колумбии + + + Костариканский колон + + + Старый Сербский динар + + + Чехословацкая твердая крона + + + Кубинское песо + + + Эскудо Кабо-Верде + + + Кипрский фунт + + + Чешская крона + + + Восточногерманская марка + + + Немецкая марка + + + Франк Джибути + + + Датская крона + + + Доминиканское песо + + + Алжирский динар + + + Эквадорский сукре + + + Постоянная единица стоимости Эквадора + + + Эстонская крона + + + Египетский фунт + + + Накфа + + + Испанская песета (А) + + + Испанская песета (конвертируемая) + + + Испанская песета + + + Эфиопский быр + + + Евро + + + Финская марка + + + Доллар Фиджи + + + Фунт Фолклендских островов + + + Французский франк + + + Английский фунт стерлингов + + + Грузинский купон + + + Грузинский лари + + + Ганский седи + + + Седи Ганы + + + Гибралтарский фунт + + + Гамбийский даласи + + + Гвинейский франк + + + Гвинейская сили + + + Эквеле экваториальной Гвинеи + + + Греческая драхма + + + Гватемальский кетсаль + + + Эскудо Португальской Гвинеи + + + Песо Гвинеи-Бисау + + + Гайанский доллар + + + Гонконгский доллар + + + Гондурасская лемпира + + + Хорватский динар + + + Хорватская куна + + + Гаитянский гурд + + + Венгерский форинт + + + Индонезийская рупия + + + Ирландский фунт + + + Израильский фунт + + + Новый израильский шекель + + + Индийская рупия + + + Иракский динар + + + Иранский риал + + + Исландская крона + + + Итальянская лира + + + Ямайский доллар + + + Иорданский динар + + + Японская иена + + + Кенийский шиллинг + + + Киргизский сом + + + Камбоджийский риель + + + Франк Коморских островов + + + Северо-корейская вона + + + Вона Республики Кореи + + + Кувейтский динар + + + Доллар Каймановых островов + + + Казахский тенге + + + Кип ЛНДР + + + Ливанский фунт + + + Шри-Ланкийская рупия + + + Либерийский доллар + + + Лоти + + + Литовский лит + + + Литовский талон + + + Конвертируемый франк Люксембурга + + + Люксембургский франк + + + Финансовый франк Люксембурга + + + Латвийский лат + + + Латвийский рубль + + + Ливийский динар + + + Марокканский дирхам + + + Марокканский франк + + + Молдавский лей + + + Ариари + + + Малагасийский франк + + + Македонский динар + + + Малийский франк + + + Кьят + + + Монгольский тугрик + + + Патака + + + Мавританская угия + + + Мальтийская лира + + + Мальтийский фунт + + + Маврикийская рупия + + + Мальдивская руфия + + + Малавийская квача + + + Мексиканское новое песо + + + Мексиканское серебряное песо (1861-1992) + + + Мексиканская пересчетная единица (UDI) + + + Малайзийский ринггит + + + Мозамбикское эскудо + + + Старый мозамбикский метикал + + + Метикал + + + Доллар Намибии + + + Нигерийская найра + + + Никарагуанская кордоба + + + Золотая кордоба + + + Нидерландский гульден + + + Норвежская крона + + + Непальская рупия + + + Новозеландский доллар + + + Оманский риал + + + Панамское бальбоа + + + Перуанское инти + + + Перуанский новый соль + + + Перуанский соль + + + Кина + + + Филиппинское песо + + + Пакистанская рупия + + + Польский злотый + + + Злотый + + + Португальское эскудо + + + Парагвайский гуарани + + + Катарский риал + + + Родезийский доллар + + + Старый Румынский лей + + + Румынский лей + + + Сербский динар + + + Российский рубль + Российских рубля + Российских рублей + Российский рубль + Российского рубля + руб. + + + Российский рубль (1991-1998) + р. + + + Франк Руанды + + + Саудовский риал + + + Доллар Соломоновых островов + + + Сейшельская рупия + + + Суданский динар + + + Суданский фунт + + + Старый суданский фунт + + + Шведская крона + + + Сингапурский доллар + + + Фунт острова Святой Елены + + + Словенский толар + + + Словацкая крона + + + Леоне + + + Сомалийский шиллинг + + + Суринамский доллар + + + Суринамский гульден + + + Добра + + + Рубль СССР + + + Сальвадорский колон + + + Сирийский фунт + + + Свазилендский лилангени + + + Таиландский бат + + + Таджикский рубль + + + Таджикский сомони + + + Туркменский манат + + + Тунисский динар + + + Паанга + + + Тиморское эскудо + + + Турецкая лира + турецкие лиры + турецких лир + туркцкая лира + турецких лир + + + Новая турецкая лира + новые турецкие лиры + Новых турецких лир + Новая турецкая лира + новых турецких лир + + + Доллар Тринидада и Тобаго + + + Новый тайваньский доллар + + + Танзанийский шиллинг + + + Украинская гривна + + + Карбованец (украинский) + + + Старый угандийский шиллинг + + + Угандийский шиллинг + + + Доллар США + $ + + + Доллар США следующего дня + + + Доллар США текущего дня + + + Уругвайский песо (индекс инфляции) + + + Уругвайское старое песо (1975-1993) + + + Уругвайское песо + + + Узбекский сум + + + Венесуэльский боливар + + + Венесуэльский боливар фуэрте + + + Вьетнамский донг + + + Вату + + + Тала + + + Франк КФА ВЕАС + + + Серебро + + + Золото + + + Европейская составная единица + + + Европейская денежная единица + + + расчетная единица европейского валютного соглашения (XBC) + + + расчетная единица европейского валютного соглашения (XBD) + + + Восточно-карибский доллар + + + СДР (специальные права заимствования) + + + ЭКЮ (единица европейской валюты) + + + Французский золотой франк + + + Французский UIC-франк + + + Франк КФА ВСЕАО + + + Палладий + + + Франк КФП + + + Платина + + + единица RINET-фондов + + + тестовый валютный код + + + Неизвестная или недействительная валюта + + + Йеменский динар + + + Йеменский риал + + + Югославский твердый динар + + + Югославский новый динар + + + Югославский динар + + + Южноафриканский рэнд (финансовый) + + + Южноафриканский рэнд + + + Квача (замбийская) + + + Новый заир + + + Заир + + + Доллар Зимбабве + + + + + + {0} дня + {0} дней + {0} день + {0} дня + + + {0} часа + {0} часов + {0} час + {0} часа + + + {0} минуты + {0} минут + {0} минута + {0} минуты + + + {0} месяца + {0} месяцев + {0} месяц + {0} месяца + + + {0} секунды + {0} секунд + {0} секунда + {0} секунды + + + {0} недели + {0} недель + {0} неделя + {0} недели + + + {0} года + {0} лет + {0} год + {0} года + + + + + да:д + нет:н + + + + diff --git a/lib/zend/Zend/Locale/Data/ru_RU.xml b/lib/zend/Zend/Locale/Data/ru_RU.xml new file mode 100644 index 0000000000..db79799d25 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ru_RU.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ru_UA.xml b/lib/zend/Zend/Locale/Data/ru_UA.xml new file mode 100644 index 0000000000..0d6c0f6ccd --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ru_UA.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + апачский + слэйви + маршальский + клингон + + + US + Metric + + + + + + + + + d MMMM y + + + + + d MMM y + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + E, dd.MM - E, dd.MM + E, dd.MM - E, dd.MM + + + E, d MMM - E, d MMM + E, d - E, d MMM + + + HH-HH 'ч.' + + + HH-HH 'ч.', v + + + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + E, dd.MM.yy - E, dd.MM.yy + + + MMM-MMM y + MMM y - MMM y + + + E, d MMM - E, d MMM y 'г'. + E, d - E, d MMM y 'г'. + E, d MMM y - E, d MMM y 'г'. + + + LLLL-LLLL y + LLLL y - LLLL y + + + d MMM - d MMM y + d-d MMM y + d MMM y - d MMM y + + + + + + + + + + ESB + + + RHD + + + YUM + + + + diff --git a/lib/zend/Zend/Locale/Data/rw.xml b/lib/zend/Zend/Locale/Data/rw.xml new file mode 100644 index 0000000000..3bd5501378 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/rw.xml @@ -0,0 +1,306 @@ + + + + + + + + + + + Ikinyafurikaneri + Inyamuhariki + Icyarabu + Icyasamizi + Inyazeribayijani + Ikibelarusiya + Urunyabuligariya + Inyebihari + Ikibengali + Inyebiritoni + Inyebosiniya + Igikatalani + Igiceke + Ikigaluwa + Ikidaninwa + Ikidage + Ikigereki + Icyongereza + Icyesiperanto + Icyesipanyolo + Icyesitoniya + Ikibasiki + Inyeperisi + Igifinilande + Ikinyafilipine + Inyefaroyizi + Igifaransa + Igifiriziyani + Ikirilandi + Ikigaluwa cy'Igisweduwa + Ikigalisiya + Inyaguwarani + Inyegujarati + Igiheburayo + Igihindi + Igikorowasiya + Igihongiriya + Ikinyarumeniya + Ururimi Gahuzamiryango + Ikinyendoziya + Uruhuzandimi + Igisilande + Igitaliyani + Ikiyapani + Inyejava + Inyejeworujiya + Igikambodiya + Igikanada + Igikoreya + Inyekuridishi + Inkerigizi + Ikilatini + Ilingala + Ikilawotiyani + Ikilituwaniya + Ikinyaletoviyani + Ikimasedoniyani + Ikimalayalami + Ikimongoli + Ikimarati + Ikimalayi + Ikimaliteze + Ikinepali + Ikinerilande + Inyenoruveji (Nyonorusiki) + Ikinoruveji + Inyogusitani + Inyoriya + Igipunjabi + Igipolone + Impashito + Igiporutugali + Inyeporutigali (Brezili) + Inyeporutigali (Igiporutigali) + Ikinyarumaniya + Ikirusiya + Igisansikiri + Igisindi + Inyeseribiya na Korowasiya + Inyesimpaleze + Igisilovaki + Ikinyasiloveniya + Igisomali + Icyalubaniya + Igiseribe + Inyesesoto + Inyesudani + Igisuweduwa + Igiswahili + Igitamili + Igitelugu + Igitayi + Inyatigirinya + Inyeturukimeni + Inyekilingoni + Igiturukiya + Inyetuwi + Ikiwiguri + Ikinyayukereni + Inyeyurudu + Inyeyuzubeki + Ikinyaviyetinamu + Inyehawusa + Inyeyidishi + Inyezulu + + + Igitonga + + + + [a-z] + + + ‘ + ’ + « + » + + + + + + + + mut. + gas. + wer. + mat. + gic. + kam. + nya. + kan. + nze. + ukw. + ugu. + uku. + + + Mutarama + Gashyantare + Werurwe + Mata + Gicuransi + Kamena + Nyakanga + Kanama + Nzeli + Ukwakira + Ugushyingo + Ukuboza + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + cyu. + mbe. + kab. + gtu. + kan. + gnu. + gnd. + + + Ku cyumweru + Kuwa mbere + Kuwa kabiri + Kuwa gatatu + Kuwa kane + Kuwa gatanu + Kuwa gatandatu + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + I1 + I2 + I3 + I4 + + + igihembwe cya mbere + igihembwe cya kabiri + igihembwe cya gatatu + igihembwe cya kane + + + + AM + PM + + + BCE + CE + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , + . + + + + F + + + + diff --git a/lib/zend/Zend/Locale/Data/rw_RW.xml b/lib/zend/Zend/Locale/Data/rw_RW.xml new file mode 100644 index 0000000000..eac7c4cc6c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/rw_RW.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sa.xml b/lib/zend/Zend/Locale/Data/sa.xml new file mode 100644 index 0000000000..8e145d826f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sa.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + अफर + अब्खासियन् + अचिनीस् + अचोलि + अडङ्गमे + अफ्रिक्कान्स् + आफ्रो एष्यन् भाषा + अफ्रिहिलि + अयिनु + अकन् + अक्काटियान् + अलियुट् + अल्गोण्क्यन् भाषा + अंहाऱिक् + अङ्गिक + अपाचे भाषा + अऱबिक् + प्राचीन ईजिप्त्यन् + पुरातन यवन भाषा + नोर्वीजियन् बॊकामल् + संस्कृत भाषा + अल्बेनियन् + आळटिक् भाषा + अज्ञात भाषा + + + + + + + + + + + + भारतम् + + + + [़ ँ-ः ॑-॔ ॐ अ-ऋ ॠ ऌ ॡ ए ऐ ओ-न र ल ळ व-ह ऽ-ॄ ॢ ॣ े ै ो-्] + [\u200C \u200D ०-९ ऍ ऑ ॅ ॉ] + [a-z] + + + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + dd-MM-yyyy + + + + + d-MM-yy + + + + + + + hh:mm:ss a zzzz + + + + + hh:mm:ss a z + + + + + hh:mm:ss a + + + + + hh:mm a + + + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + deva + + ० + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤#,##,##0.00 + + + + + + रु + + + + diff --git a/lib/zend/Zend/Locale/Data/sa_IN.xml b/lib/zend/Zend/Locale/Data/sa_IN.xml new file mode 100644 index 0000000000..53aa5b2898 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sa_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/se.xml b/lib/zend/Zend/Locale/Data/se.xml new file mode 100644 index 0000000000..39878f7b57 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/se.xml @@ -0,0 +1,741 @@ + + + + + + + + + nb sv en + + + acehgiella + afrikánsagiella + aragoniagiella + boares eaŋgalasgiella + apacheš giella + arábagiella + asturiagiella + vilges-ruoššagiella + bulgáriagiella + bengalgiella + bretonagiella + bosniagiella + katalánagiella + kelttalaš gielat + marigiella + corsicagiella + čeahkagiella + dánskkagiella + duiskkagiella + greikkagiella + eaŋgalsgiella + spánskkagiella + esttegiella + persijagiella + suomagiella + fenno-ugrálaš giella + fearagiella + fránskkagiella + oarjifriisagiella + iirragiella + germánalaš gielat + gujaratagiella + manksgiella + hindigiella + kroátiagiella + armeenagiella + islánddagiella + itáliagiella + japánagiella + gárjilgiella + komigiella + kornagiella + láhtengiella + luxemburggagiella + liettuvagiella + látviagiella + mokšagiella + makedoniagiella + ersagiella + girjedárogiella + hollánddagiella + ođđadárogiella + dárogiella + oksitánagiella + polskkagiella + portugálagiella + retorománagiella + romániagiella + románalaš gielat + ruoššagiella + sardigiella + sisiliagiella + davvisámegiella + selkupagiella + slovákiagiella + slovenagiella + lullisámegiella + sámegielat + julevsámegiella + anárašgiella + nuortalašgiella + albánagiella + serbiagiella + ruoŧagiella + udmurtagiella + ukrainagiella + vallonagiella + sorbigiella + kiinnágiella + + + + + + + + + máilbmi + Afrihkká + dávvi-Amerihkká ja gaska-Amerihkká + mátta-Amerihkká + Oseania + oarji-Afrihkká + gaska-Amerihkká + nuorta-Afrihkká + davvi-Afrihkká + gaska-Afrihkká + mátta-Afrihkká + Amerihkká + dávvi-Amerihkká + Karibia + nuorta-Ásia + mátta-Ásia + mátta-nuorta-Ásia + mátta-Eurohpá + Austrália ja Ođđa-Selánda + Melanesia + Polynesia + mátta-gaska-Ásia + Ásia + gaska-Ásia + oarji-Ásia + Eurohpá + nuorta-Eurohpá + davvi-Eurohpá + oarji-Eurohpá + Lulli-Amerihkká ja Karibia + Andorra + Ovttastuvvan Arábaemiráhtat + Afghanistan + Antigua ja Barbuda + Anguilla + Albánia + Armenia + Angola + Antárktis + Argentina + Amerihká Samoa + Nuortariika + Austrália + Aruba + Ålánda + Aserbaižan + Bosnia-Hercegovina + Barbados + Bangladesh + Belgia + Burkina Faso + Bulgária + Bahrain + Burundi + Benin + Saint Barthélemy + Bermuda + Brunei + Bolivia + Brasil + Bahamas + Bhutan + Bouvet-sullot + Botswana + Vilges-Ruošša + Belize + Kanáda + Cocos-sullot + Kongo-Kinshasa + Kongo-Brazzaville + Šveica + Cook-sullot + Čiile + Kamerun + Kiinná + Kolombia + Costa Rica + Kuba + Kap Verde + Kypros + Čeahkka + Duiska + Djibouti + Dánmárku + Dominica + Algeria + Ecuador + Estlánda + Egypta + Oarje-Sahára + Eritrea + Spánia + Etiopia + Suopma + Fijisullot + Falklandsullot + Mikronesia + Fearsullot + Frankriika + Gabon + Stuorra-Británnia + Grenada + Georgia + Frankriikka Guayana + Guernsey + Ghana + Gibraltar + Kalaallit Nunaat + Gámbia + Guinea + Guadeloupe + Ekvatoriála Guinea + Greika + Lulli Georgia ja Lulli Sandwich-sullot + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong + Honduras + Kroátia + Haiti + Ungár + Indonesia + Irlánda + Israel + Mann + India + Irak + Iran + Islánda + Itália + Jersey + Jamaica + Jordánia + Japána + Kenia + Kirgisistan + Kambodža + Kiribati + Komorosullot + Saint Kitts ja Nevis + Davvi-Korea + Mátta-Korea + Kuwait + Cayman-sullot + Kasakstan + Laos + Libanon + Saint Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lietuva + Luxembourg + Látvia + Libya + Marokko + Monaco + Moldávia + Montenegro + Saint Martin + Madagaskar + Marshallsullot + Makedonia + Mali + Burma + Mongolia + Makáo + Davvi-Mariánat + Martinique + Mauretánia + Montserrat + Málta + Mauritius + Malediivvat + Malawi + Meksiko + Malesia + Mosambik + Namibia + Ođđa-Kaledonia + Niger + Norfolksullot + Nigeria + Nicaragua + Vuolleeatnamat + Norga + Nepal + Nauru + Niue + Ođđa-Selánda + Oman + Panama + Peru + Papua-Ođđa-Guinea + Filippiinnat + Pakistan + Polen + Saint Pierre ja Miquelon + Pitcairn + Puerto Rico + Palestina + Portugála + Palau + Paraguay + Qatar + Eurohpa Uniovdna + Reunion + Románia + Serbia + Ruošša + Rwanda + Saudi-Arábia + Salomon-sullot + Seychellsullot + Sudan + Ruoŧŧa + Singapore + Saint Helena + Slovenia + Svalbárda ja Jan Mayen + Slovákia + Sierra Leone + San Marino + Senegal + Somália + Surinam + São Tomé ja Príncipe + El Salvador + Syria + Svazieana + Turks ja Caicos-sullot + Tčad + Togo + Thaieana + Tažikistan + Tokelau + Nuorta-Timor + Turkmenistan + Tunisia + Tonga + Durka + Trinidad ja Tobago + Tuvalu + Taiwan + Tanzánia + Ukraina + Uganda + Amerihká ovttastuvvan stáhtat + Uruguay + Usbekistan + Vatikána + Saint Vincent ja Grenadine + Venezuela + Vietnam + Vanuatu + Wallis ja Futuna + Samoa + Jemen + Mayotte + Mátta-Afrihká + Zambia + Zimbabwe + + + kaleandar + valuhtta + + + US + SI + + + giella: {0} + + + + [a á b c č d đ e-n ŋ o p r s š t ŧ u v z ž] + [à å ä ã æ ç é è í ń ñ ó ò ö ø q ú ü w-y] + [a á à å ä æ b c č d đ e é è f-n ń ŋ o ó ò ö ø p-s š t ŧ u ú v x-z ž] + + + ” + ” + ’ + ’ + + + {0}–{1} + + + + + + ođđj + guov + njuk + cuo + mies + geas + suoi + borg + čakč + golg + skáb + juov + + + ođđajagemánnu + guovvamánnu + njukčamánnu + cuoŋománnu + miessemánnu + geassemánnu + suoidnemánnu + borgemánnu + čakčamánnu + golggotmánnu + skábmamánnu + juovlamánnu + + + + + O + G + N + C + M + G + S + B + Č + G + S + J + + + + + + + sotn + vuos + maŋ + gask + duor + bear + láv + + + sotnabeaivi + vuossárga + maŋŋebárga + gaskavahkku + duorasdat + bearjadat + lávvardat + + + + + s + v + m + g + d + b + L + + + + + + + Q1 + K2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + ovdal Kristtusa + maŋŋel Kristtusa + + + o.Kr. + m.Kr. + + + o.Kr. + m.Kr. + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + éra + + + jáhki + + + mánnu + + + váhkku + + + beaivi + ikte + odne + ihttin + + + váhkkubeaivi + + + diibmu + + + minuhtta + + + sekunda + + + áigeavádat + + + + + + +HH:mm;−HH:mm + UTC{0} + UTC + {0} + {0} ({1}) + + São Paulo + + + Mérida + + + + CET + CEST + + + + + EET + EEST + + + + + WET + WEST + + + + + GMT + + + + + + + , +   + ; + % + 0 + # + + + − + ×10^ + ‰ + ∞ + ¤¤¤ + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + {0} {1} + + + + euro + euro + euro + euro + + + suoma márkki + + + norgga kruvdno + + + ruoŧŧa kruvdno + + + uns silba + + + golli + + + + + + {0} beaivi + {0} beaivi + {0} beaivi + + + {0} tiibmu + {0} tiibmu + + + {0} minuhtta + {0} minuhtta + {0} minuhtta + + + {0} mánnu + {0} mánnu + {0} mánnu + + + {0} sekunda + {0} sekunda + {0} sekunda + + + {0} váhkku + {0} váhkku + {0} váhkku + + + {0} jáhki + {0} jáhki + {0} jáhki + + + + + jo + ii + + + + diff --git a/lib/zend/Zend/Locale/Data/se_FI.xml b/lib/zend/Zend/Locale/Data/se_FI.xml new file mode 100644 index 0000000000..6d0adbe47d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/se_FI.xml @@ -0,0 +1,247 @@ + + + + + + + + + + fi_FI + + + ang + apa + be + cs + da + de + el + en + es + et + fi + fiu + fo + fr + gem + is + nb + nn + no + ru + se + sma + smi + smj + smn + sms + sv + + + Afrihká + Mátta-Amerihká + Oarji-Afrihká + 014 + Davvi-Afrihká + Gaska-Afrihká + Davvi-Amerihká + Nuorta-Ásia + Mátta-Ásia + Mátta-Eurohpa + Gaska-Ásia + Oarji-Ásia + Eurohpa + Nuorta-Eurohpá + Davvi-Eurohpa + Oarji-Eurohpa + AT + AU + AX + BE + BG + BR + BY + CH + CM + CN + CZ + DE + DK + EE + ES + FI + FO + FR + GL + GR + HR + HU + IE + IQ + IR + IS + IT + JP + KP + KR + LB + LT + LV + MA + MG + MH + MK + MP + MR + MV + MY + NL + NO + NZ + PH + PL + PS + RU + SE + SI + SJ + SK + SR + TD + TL + TR + US + ZA + + + calendar + currency + + + Metric + + + + + + + + + ođđajage + guovva + njukča + cuoŋo + miesse + geasse + suoidne + borge + čakča + golggot + skábma + juovla + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + aejlege + måanta + däjsta + gaskevahkoe + dåarsta + bearjadahke + laavadahke + + + + + S + M + D + G + D + B + + + + + + BCE + + + BCE + + + + + Year + + + Month + + + Week + + + Day + + + Day of the Week + + + Hour + + + Minute + + + Second + + + Zone + + + + + + GMT + + + + + + FIM + + + NOK + + + SEK + + + XAG + + + XAU + + + + + + yes:y + no:n + + + + diff --git a/lib/zend/Zend/Locale/Data/se_NO.xml b/lib/zend/Zend/Locale/Data/se_NO.xml new file mode 100644 index 0000000000..2095fade00 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/se_NO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sh.xml b/lib/zend/Zend/Locale/Data/sh.xml new file mode 100644 index 0000000000..4443044515 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sh.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sh_BA.xml b/lib/zend/Zend/Locale/Data/sh_BA.xml new file mode 100644 index 0000000000..7608d1faef --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sh_BA.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sh_CS.xml b/lib/zend/Zend/Locale/Data/sh_CS.xml new file mode 100644 index 0000000000..b318d3a04f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sh_CS.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sh_YU.xml b/lib/zend/Zend/Locale/Data/sh_YU.xml new file mode 100644 index 0000000000..99fac98769 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sh_YU.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/si.xml b/lib/zend/Zend/Locale/Data/si.xml new file mode 100644 index 0000000000..4612bbd749 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/si.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + සිංහල + + + + + + ශ්‍රී ලංකාව + + + දිනදසුන + මුදල් + + + බුද්‍ධ දිනදසුන + දිනදසුන + + + + [අ-ඍ එ-ඖ ං ඃ ක-ඣ ඥ ඤ ට-න ඳ-ර ල ව-ෆ ා-\u0DD4 \u0DD6 ෘ ෲ ෟ ෙ-ෞ \u0DCA] + [\u200B-\u200D ඎ-ඐ ඦ ෳ] + [a-z] + + + + + + + + ජන + පෙබ + මාර්ත + අප්‍රේල + මැය + ජූන + ජූල + අගෝ + සැප + ඔක + නොවැ + දෙසැ + + + ජනවාර + පෙබරවාර + මාර්ත + අප්‍රේල් + මැයි + ජූන + ජූලි + අගෝස්තු + සැප්තැම්බර් + ඔක්තෝබර් + නොවැම්බර් + දෙසැම්බර් + + + + + ජ + පෙ + මා + අ + මැ + ජූ + ජූ + අ + සැ + ඔ + නො + දෙ + + + + + + + ඉරි + සඳු + අඟ + බදා + බ්‍රහ + සිකු + සෙන + + + ඉරිදා + සඳුදා + අඟහරුවාදා + බදාදා + බ්‍රහස්පතින්දා + සිකුරාදා + සෙනසුරාදා + + + + + ඉ + ස + අ + බ + බ්‍ර + සි + සෙ + + + + + + + කාර්:1 + කාර්:2 + කාර්:3 + කාර්:4 + + + 1 වන කාර්තුව + 2 වන කාර්තුව + 3 වන කාර්තුව + 4 වන කාර්තුව + + + + පෙ.ව. + ප.ව. + + + ක්‍රිස්තු පූර්‍ව + ක්‍රිස්තු වර්‍ෂ + + + ක්‍රි.පූ. + ක්‍රි.ව. + + + + + + EEEE, y MMMM d + + + + + y MMMM d + + + + + y MMM d + + + + + yyyy/MM/dd + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + ඊයෙ + අද + හෙට + + + + + + + + ශ්‍රී ලංකා වේලාව + + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤#,##,##0.00;(¤#,##,##0.00) + + + + + + ලංකා රුපියල් + SL Re + + + + + + ඔව්:ඔ + නැත:නැ + + + + diff --git a/lib/zend/Zend/Locale/Data/si_LK.xml b/lib/zend/Zend/Locale/Data/si_LK.xml new file mode 100644 index 0000000000..0e1e51b8e0 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/si_LK.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sid.xml b/lib/zend/Zend/Locale/Data/sid.xml new file mode 100644 index 0000000000..111fcac9eb --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sid.xml @@ -0,0 +1,248 @@ + + + + + + + + + + + Arabic + German + English + Spanish + French + Hindi + Italian + Japanese + Portuguese + Russian + Sidaamu Afo + Chinese + + + + + + Brazil + China + Germany + Itiyoophiya + France + United Kingdom + India + Italy + Japan + Russia + United States + + + + [a-z] + + + + + + + + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + + + January + February + March + April + May + June + July + August + September + October + November + December + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + Sam + San + Mak + Row + Ham + Arb + Qid + + + Sambata + Sanyo + Maakisanyo + Roowe + Hamuse + Arbe + Qidaame + + + + + S + S + M + R + H + A + Q + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + soodo + hawwaro + + + YIA + YIG + + + + + + EEEE, MMMM dd, y + + + + + dd MMMM y + + + + + dd-MMM-y + + + + + dd/MM/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + Brazilian Real + + + Chinese Yuan Renminbi + + + Euro + + + British Pound Sterling + + + Indian Rupee + + + Japanese Yen + + + Russian Ruble + + + US Dollar + + + + diff --git a/lib/zend/Zend/Locale/Data/sid_ET.xml b/lib/zend/Zend/Locale/Data/sid_ET.xml new file mode 100644 index 0000000000..b7126c121d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sid_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sk.xml b/lib/zend/Zend/Locale/Data/sk.xml new file mode 100644 index 0000000000..23b9fa8cfe --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sk.xml @@ -0,0 +1,1901 @@ + + + + + + + + + + + afarčina + abcházština + ačoli + adangme + adygčina + avestčina + afrikánčina + afroázijské jazyky + afrihili + ainčina + akančina + akkadčina + aleutčina + algonkinské jazyky + amharčina + aragónčina + angika + apačské jazyky + arabčina + araukánčina + arapaho + umelý jazyk + arawačtina + ásámčina + astúrčina + athabaské jazyky + austrálske jazyky + avarčina + avadhčina + aymarčina + azerbajdžančina + baskirčina + bamileke + balúčtina + balijčina + basa + baltské jazyky + bieloruština + bedža + bemba + berberské jazyky + bulharčina + bihárske jazyky + bhódžpurčina + bislama + bikol + bini + bambarčina + bengálčina + bantuské jazyky + tibetčina + bretónčina + bradžčina + bosniačtina + batacké jazyky + buriatčina + bugiština + blin + katalánčina + jazyk stredoamerických indiánov + karibský + kaukazské jazyky + čečenčina + cebuánčina + keltské jazyky + čamorčina + čibča + čagatajčina + činucký žargón + čoktavčina + čipevajčina + čerokí + čejenčina + čamaské jazyky + korzičtina + krí + čeština + cirkevná slovančina + čuvaština + waleština + dánčina + dakotčina + darginčina + nemčina + delawarčina + slovančina + dogribčina + dinka + dógrí + drávidské jazyky + duala + divehi + ďula + dzongkä + eweština + efik + staroegyptský + ekadžuk + gréčtina + elamčina + angličtina + austrálska angličtina + britská angličtina + americká angličtina + esperanto + španielčina + estónčina + baskičtina + ewondo + perzština + fangčina + fanti + fulbčina + fínčina + filipínčina + ugrofínske jazyky + fidžijčina + faerčina + fončina + francúzština + východná frízština + friulčina + západná frízština + írčina + ga + gayo + gbaja + škótčina + germánske jazyky + galícijčina + guaraní + gótčina + starogréčtina + švajčiarska nemčina + gudžarátčina + mančina + hauština + havajčina + hebrejčina + hindčina + hiri motu + chorvátčina + haitský + maďarčina + arménčina + herero + interlingua + indonézština + interlingue + igboština + indoeurópske jazyky + iránske jazyky + islandčina + taliančina + japončina + jávčina + gruzínčina + konžština + kuaňama + kazaština + grónska eskimáčtina + kambodžská khmérčina + kannadčina + kórejčina + kanurijčina + kašmírčina + kurdčina + komijčina + kornčina + kirgizština + latinčina + luxemburčina + gandčina + lingalčina + laoština + mongo + litovčina + luba-katanga + lotyština + austronézske jazyky + malgaština + kajin-majol + maorijčina + macedónčina + malajálamčina + mongolčina + moldavčina + maráthčina + malajčina + maltčina + barmčina + mayské jazyky + erzjančina + nauru + jazyk severoamerických indiánov + bokmål + nepálčina + ndonga + holandčina + nórsky nynorsk + nórčina + navajo + čewa + okcitánčina + odžibva + oromčina + uríjčina + osetčina + pandžábčina + papuánsky + pálí + poľština + paštúnčina + portugalčina + brazílska portugalčina + kečuánčina + rétorománčina + rundčina + rumunčina + ruština + rwandčina + sanskrit + jazyk juhoamerických indiánov + sardínčina + sicílčina + sindhčina + sango + znaková reč + srbochorvátčina + sinhalčina + slovenčina + slovinčina + slovenský jazyk + samojčina + šončina + somálčina + albánčina + srbčina + svazijčina + južná sothčina + sundčina + sumerčina + švédčina + swahilčina + sýrčina + tamilčina + telugčina + tadžičtina + thajčina + tigrejčina + turkménčina + tagalčina + klingónčina + tswančina + tonžtina + turečtina + tsonga + tatárčina + altajské jazyky + twi + tahitčina + ujgurčina + ukrajinčina + neznámy alebo neplatný jazyk + urdčina + uzbečtina + vendčina + vietnamčina + volapük + valónčina + wolof + xhosa + jidiš + jorubčina + čuangčina + čínština + zjednodušená čínština + tradičná čínština + zuluština + bez jazykového obsahu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Svet + Afrika + Severná Amerika (003) + Južná Amerika + Oceánia + Západná Afrika + Stredná Amerika + Východná Afrika + Severná Afrika + Stredná Afrika + Južná Afrika [018] + Americký kontinent + Severná Amerika + Karibik + Východná Ázia + Južná Ázia + Juhovýchodná Ázia + Južná Európa + Austrália a Nový Zéland + Melanézia + Mikronésia + Polynézia + Stredná a južná Ázia + Ázia + Stredná Ázia + Západná Ázia + Európa + Východná Európa + Severná Európa + Západná Európa + Spoločenstvo nezávislých štátov + Československo + Latinská Amerika a Karibik + Kanál La Manche + Andorra + Spojené arabské emiráty + Afganistan + Antigua a Barbados + Anguilla + Albánsko + Arménsko + Holandské Antily + Angola + Antarctica + Argentína + Americká Samoa + Rakúsko + Austrália + Aruba + Alandské ostrovy + Azerbajdžan + Bosna a Hercegovina + Barbados + Bangladéš + Belgicko + Burkina Faso + Bulharsko + Bahrajn + Burundi + Benin + Svätý Bartolomej + Bermudy + Brunej + Bolívia + Brazília + Bahamy + Bután + Bouvetov ostrov + Botswana + Bielorusko + Belize + Kanada + Kokosové ostrovy + Konžská demokratická republika + Stredoafrická republika + Kongo + Švajčiarsko + Pobrežie Slonoviny + Cookove ostrovy + Čile + Kamerun + Čína + Kolumbia + Kostarika + Srbsko a Čierna Hora + Kuba + Kapverdy + Vianočný ostrov + Cyprus + Česká republika + Nemecko + Džibuti + Dánsko + Dominika + Dominikánska republika + Alžírsko + Ekvádor + Estónsko + Egypt + Západná Sahara + Eritrea + Španielsko + Etiópia + Fínsko + Fidži + Falklandské ostrovy + Mikronézia + Faerské ostrovy + Francúzsko + Gabon + Spojené kráľovstvo + Grenada + Gruzínsko + Francúzska Guayana + Guernsey + Ghana + Gibraltár + Grónsko + Gambia + Guinea + Guadeloupe + Rovníková Guinea + Grécko + Južná Georgia a Južné Sandwichove ostrovy + Guatemala + Guam + Guinea-Bissau + Guayana + Hong Kong S.A.R. Číny + Heardove ostrovy a McDonaldove ostrovy + Honduras + Chorvátsko + Haiti + Maďarsko + Indonézia + Írsko + Izrael + Ostrov Man + India + Britské územie v Indickom oceáne + Irak + Irán + Island + Taliansko + Jersey + Jamajka + Jordánsko + Japonsko + Keňa + Kirgizsko + Kambodža + Kiribati + Komory + Saint Kitts a Nevis + Kórejská ľudovodemokratická republika + Kórejská republika + Kuvajt + Kajmanské ostrovy + Kazachstan + Laoská ľudovodemokratická republika + Libanon + Svätá Lucia + Lichtenštajnsko + Srí Lanka + Libéria + Lesotho + Litva + Luxembursko + Lotyšsko + Lýbijská arabská džamahírija + Maroko + Monako + Moldavsko + Čierna Hora + Svätý Martin + Madagaskar + Marshallove ostrovy + Macedónsko + Mali + Mjanmarsko + Mongolsko + Makao S.A.R. Číny + Severné Mariány + Martinik + Mauritánia + Montserrat + Malta + Maurícius + Maldivy + Malawi + Mexiko + Malajzia + Mozambik + Namíbia + Nová Kaledónia + Niger + Norfolkov ostrov + Nigéria + Nikaragua + Holandsko + Nórsko + Nepál + Nauru + Niue + Nový Zéland + Omán + Panama + Peru + Francúzska Polynézia + Papua Nová Guinea + Filipíny + Pakistan + Poľsko + Saint Pierre a Miquelon + Pitcairnove ostrovy + Portoriko + Palestínske územie + Portugalsko + Palau + Paraguaj + Katar + Tichomorie - ostatné + Európska únia + Reunion + Rumunsko + Srbsko + Ruská federácia + Rwanda + Saudská Arábia + Šalamúnove ostrovy + Seychelské ostrovy + Sudán + Švédsko + Singapur + Svätá Helena + Slovinsko + Špicbergy a Jan Mayen + Slovenská republika + Sierra Leone + San Maríno + Senegal + Somálsko + Surinam + Svätý Tomáš a Princove ostrovy + Salvador + Sýrska arabská republika + Svazijsko + Turks a Caicos + Čad + Francúzske južné územia + Togo + Thajsko + Tadžikistan + Tokelau + Východný Timor + Turkménsko + Tunisko + Tonga + Turecko + Trinidad a Tobago + Tuvalu + Tajwan + Tanzánia + Ukrajina + Uganda + Menšie odľahlé ostrovy USA + Spojené štáty + Uruguaj + Uzbekistan + Vatikán + Svätý Vincent a Grenadíny + Venezuela + Britské panenské ostrovy + Panenské ostrovy - USA + Vietnam + Vanuatu + Wallis a Futuna + Samoa + Jemen + Mayotte + Južná Afrika + Zambia + Zimbabwe + Neznámy alebo neplatný región + + + Kalendár + Triedenie + Mena + + + Tradičný čínsky Big5 + Buddhistický kalendár + Čínsky kalendár + Priame triedenie + Zjednodušený čínsky GB2312 + Gregoriánsky kalendár + Židovský kalendár + Indický národný kalendár + Islamský kalendár + Islamský občiansky kalendár + Japonský kalendár + Lexikografické triedenie + Triedenie pinyin + Kalendár Čínskej republiky + Tiedenie podľa ťahov + Tradičné + + + Americký + Metrický + + + Jazyk: {0} + Skript: {0} + Región: {0} + + + + titlecase-firstword + + + [a á ä b c č d ď e é f-h {ch} i í j-l ĺ ľ m n ň o ó ô p-r ŕ s š t ť u ú v-y ý z ž] + [á à ă â å ā æ ä ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ö ø ō œ ô ß ú ù ŭ û ü ū ÿ] + + + ‚ + ‘ + „ + “ + + + + + + + + jan + feb + mar + apr + máj + jún + júl + aug + sep + okt + nov + dec + + + januára + februára + marca + apríla + mája + júna + júla + augusta + septembra + októbra + novembra + decembra + + + + + j + f + m + a + m + j + j + a + s + o + n + d + + + január + február + marec + apríl + máj + jún + júl + august + september + október + november + december + + + + + + + ne + po + ut + st + št + pi + so + + + nedeľa + pondelok + utorok + streda + štvrtok + piatok + sobota + + + + + N + P + U + S + Š + P + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1. štvrťrok + 2. štvrťrok + 3. štvrťrok + 4. štvrťrok + + + + dopoludnia + popoludní + + + pred n.l. + n.l. + + + + + + EEEE, d. MMMM y + + + + + d. MMMM y + + + + + d.M.yyyy + + + + + d.M.yyyy + + + + + + + H:mm:ss zzzz + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + EEE, d. + HH:mm + E, d.M. + E, d. MMM + E, d. MMMM + d. MMMM + d. MMM + d.M. + d. + mm:ss + mm:ss + EEE, d.M.yyyy + MMM y + EEE, d. MMM y + MMMM y + Q yyyy + QQQ y + Q yy + QQQQ yy + M.yyyy + MMMM y + + + {0} - {1} + + M.-M. + + + E, d.M. - E, d.M. + E, d.M. - E, d.M. + + + MMM-MMM + + + E, d. MMM - E, d. MMM + E, d. - E, d. MMM + + + LLLL-LLLL + + + d. MMM - d. MMM + d. - d. MMM + + + d.M. - d.M. + d.M. - d.M. + + + d. - d. + + + HH-HH + H-H + + + HH:mm - HH:mm + HH:mm - HH:mm + HH:mm - HH:mm + + + HH:mm - HH:mm v + HH:mm - HH:mm v + HH:mm - HH:mm v + + + HH-HH v + H-H v + + + y - y + + + M.yyyy - M.yyyy + M.yyyy - M.yyyy + + + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + E, d.M.yy - E, d.M.yy + + + MMM - MMM y + MMM y - MMM y + + + E, d. MMM - E, d. MMM y + E, d. - E, d. MMM y + E, d. MMM y - E, d. MMM y + + + MM-yyyy – MM-yyyy + + + d. MMM - d. MMM y + d. - d. MMM y + d. MMM y - d. MMM y + + + d.M.yy - d.M.yy + d.M.yy - d.M.yy + d.M.yy - d.M.yy + + + + + + Éra + + + Rok + + + Mesiac + + + Týždeň + + + Deň + Pred tromi dňami + Predvčerom + Včera + Dnes + Zajtra + Pozajtra + O tri dni + + + Deň v týždni + + + Časť dňa + + + Hodina + + + Minúta + + + Sekunda + + + Pásmo + + + + + + +HHmm;-HHmm + GMT{0} + {0} + + Neznáme časové pásmo + + + Južný pól + + + Dumont D'Urville + + + Bermudy + + + Veľkonočné ostrovy + + + Šanghaj + + + Kostarika + + + Kapverdy + + + Džibutsko + + + Dominika + + + Galapágy + + + Kanárske ostrovy + + + Fidži + + + Londýn + + + Gibraltár + + + Hongkong + + + Jamajka + + + St. Kitts + + + Kuvajt + + + St. Lucia + + + Luxembursko + + + Monako + + + Ulanbátar + + + Macao + + + Martinik + + + Maurícius + + + Maledivy + + + Pitcairnove ostrovy + + + Portoriko + + + Azorské ostrovy + + + Lisabon + + + Katar + + + Moskva + + + Jekaterinburg + + + Krasnojarsko + + + Irkutsko + + + Jakutsko + + + Sachalin + + + Kamčatka + + + Singapur + + + Salvádor + + + Užhorod + + + Kyjev + + + Záporožie + + + Aljaška + + + New Salem, Severná Dakota + + + Taškent + + + St. Vincent + + + St. Thomas + + + + + + , +   + + + + + #,##0.00 ¤ + + + + + + Andorská peseta + + + UAE dirham + + + Albánsky lek + + + Armenský dram + + + Nizozemský Antilský guilder + + + Angolská kwanza + + + Angolská kwanza (1977-1990) + + + Angolská nová kwanza (1990-2000) + + + Angolská kwanza Reajustado (1995-1999) + + + Argentinský austral + + + Argentinské peso (1983-1985) + + + Argentinské peso + + + Rakúsky šiling + + + Austrálsky dolár + + + Arubský guilder + + + Azerbaidžanský manat + + + Bosnianský dinár + + + Bosnianský konvertibilná marka + + + Barbadoský dolár + + + Bangladéšska taka + + + Belgický frank (konvertibilný) + + + Belgický frank + + + Belgický frank (finančný) + + + Bulharský leva + + + Bulharský leva nový + + + Bahraiský dinár + + + Burundský frank + + + Bermudský dolár + + + Bruneiský dolár + + + Bolívijské Boliviano + + + Bolivíjske peso + + + Bolivíjske mvdol + + + Bolivíjske Cruzeiro Novo (1967-1986) + + + Bolivíjske cruzado + + + Bolivíjske cruzeiro (1990-1993) + + + Bolivíjsky real + + + Brazílske Cruzado Novo + + + Brazílske cruzeiro + + + Bahamský dolár + + + Bhutansky ngultrum + + + Burmese Kyat + + + Botswanan Pula + + + Belarussian nový rubeľ (1994-1999) + + + Belarussian rubeľ + + + Belize dolár + + + Kanadský dolár + + + Konžský frank Congolais + + + Švajčiarský frank + + + Čílske Unidades de Fomento + + + Čílske peso + + + Čínsky Yuan Renminbi + + + Colombijské peso + + + Kostarikský colon + + + Československá koruna + + + Kubánske peso + + + Cape Verde eskudo + + + Cypruská libra + + + Česká koruna + + + Východonemecká marka + + + Nemecká marka + + + Džibutský frank + + + Dánska krone + + + Dominikánske peso + + + Alžírsky dinár + + + Ekuadorský sucre + + + Ekuadorský Unidad de Valor Constante (UVC) + + + Estónska kroon + + + Egyptská libra + + + Eritrejská nakfa + + + Španielská peseta + + + Ethiopský birr + + + Euro + + + Finská marka + + + Fiji dolár + + + Falklandská libra + + + Francúzsky frank + + + Britská libra + + + Gruzínsky Kupon Larit + + + Gruzínsky lari + + + Ghanský cedi + + + Gibraltarská libra + + + Gambský dalasi + + + Guinejský frank + + + Guinejský syli + + + Rovníková Guinea Ekwele Guineana + + + Grécka drachma + + + Guatemalský quetzal + + + Portugalská Guinea eskudo + + + Guinea-Bissau peso + + + Guyanský dolár + + + Hong Kongský dolár + + + Hoduraská lempira + + + Chorvátsky dinár + + + Chorvátska kuna + + + Haitské gourde + + + Maďarský forint + + + Indonézska rupia + + + Írska libra + + + Izraelská libra + + + Izraelský šekel + + + Indijská rupia + + + Iracký dinár + + + Iránsky rial + + + Islandská krona + + + Talianská lira + + + Jamajský dolár + + + Jordánsky dinár + + + Japonský yen + + + Keňský šiling + + + Kyrgyský som + + + Kambodžský riel + + + Comoro frank + + + Severokórejský won + + + Juhokórejský won + + + Kuvaitský dinár + + + Kajmanský dolár + + + Kazažský tenge + + + Laoský kip + + + Libanonská libra + + + Šrilanská rupia + + + Libérský dolár + + + Lesothský loti + + + Litevská lita + + + Litevský talonas + + + Luxemburský frank + + + Lotyšský lats + + + Lotyšský rubeľ + + + Libyjský dinár + + + Marocký dirham + + + Marocký frank + + + Moldavský leu + + + Madagaskarský ariary + + + Madagaskarský frank + + + Macedónsky denár + + + Malský frank + + + Myanmarský kyat + + + Mongolský tugrik + + + Macao Pataca + + + Mauritania Ouguiya + + + Maltská lira + + + Maltská libra + + + Mauritská rupia + + + Maldivská rufiyaa + + + Malavská kwacha + + + Mexické peso + + + Mexické striborné peso (1861-1992) + + + Mexické Unidad de Inversion (UDI) + + + Malajský ringgit + + + Mozambijské eskudo + + + Mozambijské metical + + + Namibský dolár + + + Nigerská naira + + + Nikaragujská cordoba + + + Nikaragujská Cordoba Oro + + + Nizozemský guilder + + + Nórksy krone + + + Nepálska rupia + + + Novozélandský dolár + + + Ománský rial + + + Panamská balboa + + + Peruvský inti + + + Peruvský sol Nuevo + + + Peruvský sol + + + Papua Nová Guinea kina + + + Filipínske peso + + + Pakistanská rupia + + + Polský zloty + + + Polský zloty (1950-1995) + + + Portugalské eskudo + + + Paraguayské guarani + + + Qatarský rial + + + Rumunský leu + + + Rumunský Lei + + + Srbský dinár + + + Ruský rubeľ + + + Ruský rubeľ (1991-1998) + + + Rwandský frank + + + Saudský riyal + + + Solomon Islands dolár + + + Sejšelská rupia + + + Sudánsky dinár + + + Sudánska libra + + + Švédska krona + + + Singapúrsky dolár + + + Libra + + + Slovinský Tolar + + + Slovenská koruna + + + Sierra Leone Leone + + + Somálsky šiling + + + Surinamský guilder + + + Sao Tome a Principe dobra + + + Sovietský rubeľ + + + El Salvadorský colon + + + Syrská libra + + + Swaziland lilangeni + + + Thajský bát + + + Tadžikistanský rubeľ + + + Tadžikistanský somoni + + + Turkménsky manat + + + Tuniský dinár + + + Tonga Paʻanga + + + Timorské eskudo + + + Turecká lira + + + Nová turecká líra + + + Trinidad a Tobago dolár + + + Taiwanský nový dolár + + + Tanzanský šiling + + + Ukrainská hrivna + + + Ukrainský karbovanetz + + + Ugandan šiling (1966-1987) + + + Ugandský šiling + + + US dolár + + + US dolár (Next day) + + + US dolár (Same day) + + + Uruguajské peso (1975-1993) + + + Uruguajské peso Uruguayo + + + Uzbekistanský sum + + + Venezuelský bolivar + + + Vietnamský dong + + + Vanuatu vatu + + + Západná Samoa tala + + + CFA frank BEAC + + + Zlato + + + East Caribbean dolár + + + Špeciálne práva čerpania + + + Francúzsky zlatý frank + + + Francúzsky UIC-frank + + + CFA frank BCEAO + + + CFP frank + + + Jemenský dinár + + + Jemenský rial + + + Juhoslávsky dinár [YUD] + + + Juhoslávsky Noviy dinár + + + Juhoslávsky dinár + + + Juhoafrický rand (financial) + + + Juhoafrický rand + + + Zambská kwacha + + + Zairský nový zaire + + + Zairský Zaire + + + Zimbabský dolár + + + + + + {0} dni + {0} deň + {0} dní + + + {0} hodiny + {0} hodina + {0} hodín + + + {0} minúty + {0} minúta + {0} minút + + + {0} mesiace + {0} mesiac + {0} mesiacov + + + {0} sekundy + {0} sekunda + {0} sekúnd + + + {0} týždne + {0} týždeň + {0} týždňov + + + {0} roky + {0} rok + {0} rokov + + + + + ano:a + nie:n + + + + diff --git a/lib/zend/Zend/Locale/Data/sk_SK.xml b/lib/zend/Zend/Locale/Data/sk_SK.xml new file mode 100644 index 0000000000..3db91a2a6c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sk_SK.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sl.xml b/lib/zend/Zend/Locale/Data/sl.xml new file mode 100644 index 0000000000..782fe3bd76 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sl.xml @@ -0,0 +1,2544 @@ + + + + + + + + + + + {0} ({1}) + , + + + afarščina + abhaščina + ačejščina + ačolijščina + adangmejščina + adigejščina + avestijščina + afrikanščina + afroazijski jezik + afrihili + ainujščina + akanščina + akadščina + aleutščina + algonkinski jezik + južna altajščina + amharščina + aragonščina + stara angleščina + angikaščina + apaški jezik + arabščina + aramejščina + aravkanščina + arapaščina + umetni jezik + aravaščina + asamščina + asturijščina + atabaški jezik + avstralski jezik + avarščina + avadščina + ajmarščina + azerbajdžanščina + baškirščina + bandaški jezik + bamilekejski jezik + beludžijščina + balijščina + basa + baltski jezik + beloruščina + bedža + bemba + berberščina + bolgarščina + biharščina + bodžpuri + bislamščina + bikolski jezik + edo + siksika + bambarščina + bengalščina + bantujščina + tibetanščina + bretonščina + bradžbakanščina + bosanščina + bataški jezik + burjatščina + buginščina + blinščina + katalonščina + kadoščina + srednjeameriški indijanski jezik + karibski jezik + kavkaški jezik + čečenščina + sebuanščina + keltski jezik + čamorščina + čibčevščina + čagatajščina + trukeščina + marijščina + činuški žargon + čoktavščina + čipevščina + čerokeščina + čejenščina + camski jezik + korziščina + koptščina + angleška kreolščina ali pidžinščina + francoska kreolščina ali pidžinščina + portugalska kreolščina ali pidžinščina + krijščina + krimska tatarščina + kreolščina ali pidžinščina + češčina + kašubščina + stara cerkvena slovanščina + kušitščina + čuvaščina + valižanščina + danščina + dakotščina + darginščina + dajaščina + nemščina + visoka nemščina (Švica) + delavarščina + slavejščina + dogrib + dinka + dogri + dravidski jezik + dolnja lužiška srbščina + duala + srednja nizozemščina + diveščina + diula + dzonka + evenščina + efiščina + stara egipčanščina + ekajuk + grščina + elamščina + angleščina + angleščina (VB) + angleščina (ZDA) + srednja angleščina + esperanto + španščina + latinskoameriška španščina + iberska španščina + estonščina + baskovščina + evondovščina + perzijščina + fangijščina + fantijščina + fulščina + finščina + filipinščina + ugrofinski jezik + fidžijščina + ferščina + fonščina + francoščina + srednja francoščina + stara francoščina + severna frizijščina + vzhodna frizijščina + furlanščina + frizijščina + irščina + ga + gajščina + gbajščina + škotska gelščina + germanski jezik + etiopščina + kiribatščina + galicijščina + srednja visoka nemščina + gvaranijščina + stara visoka nemščina + gondi + gorontalščina + gotščina + grebščina + stara grščina + nemščina (Švica) + gudžaratščina + manščina + gwi + havščina + haidščina + havajščina + hebrejščina + hindujščina + hiligajnonščina + himačalščina + hetitščina + hmonščina + hiri motu + hrvaščina + gornja lužiška srbščina + haitijska kreolščina + madžarščina + hupa + armenščina + herero + interlingva + ibanščina + indonezijščina + interlingve + igboščina + ii + ijo + inupiaščina + ilokanščina + indijski jezik + indoevropski jezik + inguščina + ido + iranski jezik + irokeški jezik + islandščina + italijanščina + inuktitutščina + japonščina + lojban + judovska perzijščina + judovska arabščina + javanščina + gruzinščina + karakalpaščina + kabilščina + kačinščina + kaj + kamba + karenščina + kavi + kabardinščina + tjapska nigerijščina + kfo + kongovščina + kasi + koisanski jezik + kotanščina + kikujščina + kvanjama + kazaščina + grenlandščina + kmerščina + kimbundu + kanada + korejščina + konkanščina + kosrajščina + kpelejščina + kanurščina + karačaj-balkarščina + karelščina + jezik kru + kuruk + kašmirščina + kurdščina + kumiščina + kutenajščina + komijščina + kornijščina + kirgiščina + latinščina + ladinščina + landa + lamba + luksemburščina + lezginščina + ganda + limburščina + lingala + laoščina + mongo + lozi + litovščina + luba-katanga + luba-lulua + luisenščina + lunda + luo + lushai + latvijščina + madurščina + magadščina + maitili + makasarščina + mandingo + avstronezijski jezik + masajščina + mokšavščina + mandarščina + mende + malagaščina + srednja irščina + marshallovščina + maorščina + mikmaščina + minangkabau + drugi jeziki + makedonščina + monsko-kmerski jezik + malajalamščina + mongolščina + mandžurščina + manipurščina + kotabatski manobo + moldavščina + mohoščina + mosijščina + maratščina + malajščina + malteščina + več jezikov + mundski jezik + mus + mirandeščina + marvarščina + burmanščina + majevski jezik + erzjanščina + naurujščina + nahuatl + severnoameriški indijanski jezik + napolitanščina + knjižna norveščina + severna ndebelščina + nizka nemščina + nepalščina + nevarščina + ng + niaščina + nigrsko-kordofanski jezik + niuejščina + nizozemščina + flamščina + novonorveščina + norveščina + nogajščina + stara nordijščina + nqo + južna ndebelščina + severna sotščina + nubijski jezik + navajščina + klasična nevarščina + njanščina + njamveščina + njankole + njoro + nzima + okcitanščina + anašinabščina + oromo + orijščina + osetinščina + osage + otomanska turščina + otomijski jezik + pandžabščina + papuanski jezik + pangasinanščina + pal + pampanščina + papiamentu + palavanščina + stara perzijščina + filipinski jezik + feničanščina + palijščina + poljščina + ponpejščina + prakritski jezik + stara provansalščina + paštu + portugalščina + brazilska portugalščina + iberska portugalščina + kečuanščina + radžastanščina + rapanujščina + rarotongščina + retoromanščina + rundščina + romunščina + romanski jezik + romščina + root + ruščina + aromunščina + ruandščina + sanskrt + sad + jakutščina + sai + sal + samaritanska aramejščina + sasaščina + santalščina + sardinščina + sicilijanščina + škotščina + sindščina + severna samijščina + selkupščina + semitski jezik + sango + stara irščina + znakovni jezik + srbohrvaščina + šanščina + singalščina + sidamščina + sijuščina + kitajsko-tibetanski jezik + slovaščina + slovenščina + slovanski jezik + samoanščina + južna samijščina + samijski jezik + luleška samijščina + inarska samijščina + samijščina Skolt + šonščina + snk + somalščina + sog + songajščina + albanščina + srbščina + surinamska kreolščina + sererščina + svazijščina + nilsko-saharski jezik + sesoto + sundanščina + sukuma + susujščina + sumerščina + švedščina + svahili + klasična sirščina + sirščina + tamilščina + tajski jezik + telugijščina + temnejščina + ter + tetumščina + tadžiščina + tajščina + tigrajščina + tigrejščina + tivščina + turkmenščina + tokelavščina + tagalogščina + klingonščina + tlingitščina + tamajaščina + cvanščina + tongščina + malavijska tongščina + tok pisin + turščina + tsonga + tsimščina + tatarščina + tumbukščina + tupijski jezik + altajski jezik + tuvalujščina + tvi + tahitščina + tuvinščina + udmurtščina + ujgurščina + ugaritski jezik + ukrajinščina + umbundščina + neznan ali neveljaven jezik + urdujščina + uzbeščina + vajščina + venda + vietnamščina + volapuk + votjaščina + valonščina + vakaški jezik + valamščina + varajščina + vašajščina + lužiško srbski jezik + volofščina + kalmiščina + xhosa + jaojščina + japščina + jidiš + jorubščina + jupiški jezik + za + zapoteščina + znakovni jezik Bliss + zenaščina + kitajščina + poenostavljena kitajščina + tradicionalna kitajščina + zandejščina + zulujščina + zunijščina + brez jezikoslovne vsebine + zazajščina + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Svet + Afrika + Severna Amerika + Južna Amerika + Oceanija + Zahodna Afrika + Srednja Amerika + Vzhodna Afrika + Severna Afrika + Srednja Afrika + Južna Afrika + Amerike + severnoameriška celina + Karibi + Vzhodna Azija + Južna Azija + Jugovzhodna Azija + Južna Evropa + Avstralija in Nova Zelandija + Melanezija + mikronezijska regija + Polinezija + Južna osrednja Azija + Azija + Osrednja Azija + Zahodna Azija + Evropa + Vzhodna Evropa + Severna Evropa + Zahodna Evropa + Skupnost neodvisnih držav + Latinska Amerika in Karibi + Kanalski otoki + Andora + Združeni arabski emirati + Afganistan + Antigva in Barbuda + Angvila + Albanija + Armenija + Nizozemski Antili + Angola + Antarktika + Argentina + Ameriška Samoa + Avstrija + Avstralija + Aruba + Alandsko otočje + Azerbajdžan + Bosna in Hercegovina + Barbados + Bangladeš + Belgija + Burkina Faso + Bolgarija + Bahrajn + Burundi + Benin + Saint Barthelemy + Bermudi + Brunej + Bolivija + Brazilija + Bahami + Butan + Bouvetov otok + Bocvana + Belorusija + Belize + Kanada + Kokosovi otoki + Demokratična republika Kongo + Centralnoafriška republika + Kongo + Švica + Slonokoščena obala + Cookovo otočje + Čile + Kamerun + Kitajska + Kolumbija + Kostarika + Srbija in Črna gora + Kuba + Zelenortski otoki + Božični otok + Ciper + Češka + Nemčija + Džibuti + Danska + Dominika + Dominikanska republika + Alžirija + Ekvador + Estonija + Egipt + Zahodna Sahara + Eritreja + Španija + Etiopija + Finska + Fidži + Falklandski otoki + Mikronezija + Ferski otoki + Francija + Gabon + Velika Britanija + Grenada + Gruzija + Francoska Gvajana + Guernsey + Gana + Gibraltar + Grenlandija + Gambija + Gvineja + Gvadalupe + Ekvatorialna Gvineja + Grčija + Južna Georgia in Južni Sandwichevi otoki + Gvatemala + Guam + Gvineja Bissau + Gvajana + Posebno administrativno območje LR Kitajske Hong Kong + Otok Heard in otočje McDonald + Honduras + Hrvaška + Haiti + Madžarska + Indonezija + Irska + Izrael + Otok Man + Indija + Britansko ozemlje v Indijskem oceanu + Irak + Iran + Islandija + Italija + Jersey + Jamajka + Jordanija + Japonska + Kenija + Kirgizistan + Kambodža + Kiribati + Komori + Saint Kitts in Nevis + Severna Koreja + Južna Koreja + Kuvajt + Kajmanski otoki + Kazahstan + Laos + Libanon + Saint Lucia + Lihtenštajn + Šrilanka + Liberija + Lesoto + Litva + Luksemburg + Latvija + Libija + Maroko + Monako + Moldavija + Črna gora + Saint Martin + Madagaskar + Marshallovi otoki + Makedonija + Mali + Mjanmar + Mongolija + Posebno administrativno območje LR Kitajske Macao + Severni Marianski otoki + Martinik + Mavretanija + Montserrat + Malta + Mauritius + Maldivi + Malavi + Mehika + Malezija + Mozambik + Namibija + Nova Kaledonija + Niger + Norfolški otok + Nigerija + Nikaragva + Nizozemska + Norveška + Nepal + Nauru + Niue + Nova Zelandija + Oman + Panama + Peru + Francoska Polinezija + Papua Nova Gvineja + Filipini + Pakistan + Poljska + Saint Pierre in Miquelon + Pitcairn + Portoriko + Palestinsko ozemlje + Portugalska + Palau + Paragvaj + Katar + Ostala oceanija + Evropska unija + Reunion + Romunija + Srbija + Rusija + Ruanda + Saudova Arabija + Salomonovi otoki + Sejšeli + Sudan + Švedska + Singapur + Sveta Helena + Slovenija + Svalbard in Jan Mayen + Slovaška + Sierra Leone + San Marino + Senegal + Somalija + Surinam + Sao Tome in Principe + Salvador + Sirija + Svazi + Otočji Turks in Caicos + Čad + Francosko južno ozemlje + Togo + Tajska + Tadžikistan + Tokelau + Vzhodni Timor + Turkmenistan + Tunizija + Tonga + Turčija + Trinidad in Tobago + Tuvalu + Tajvan + Tanzanija + Ukrajina + Uganda + Druga ameriška ozemlja v Tihem oceanu + Združene države Amerike + Urugvaj + Uzbekistan + Vatikan + Saint Vincent in Grenadine + Venezuela + Britanski Deviški otoki + Ameriški Deviški otoki + Vietnam + Vanuatu + Wallis in Futuna + Samoa + Jemen + Mayotte + Južnoafriška republika + Zambija + Zimbabve + Neznano ali neveljavno območje + + + tradicionalni nemški pravopis + standardizirani rezijanski pravopis (1994) + novi nemški pravopis (1996) + pozna srednja francoščina (do 1606) + zgodnja sodobna francoščina + vzhodna armenščina + zahodna armenščina + modernizirana turška latinica + rezijansko narečje Bila (San Giorgio) + boonvilski jezik + mednarodna fonetična pisava IPA + uralska fonetska pisava UPA + rezijansko narečje iz Lipovca (Lipovaz) + monotonalni pravopis + nadiško narečje + rezijansko narečje Njiva (Gniva) + rezijansko narečje iz Osojan (Oseacco) + politonalni pravopis + standard prenosljivosti programske opreme + revidiran pravopis + rezijanščina + standardna škotska angleščina + liverpoolsko angleško narečje scouse + rezijansko narečje iz Solbice (Stolvizza) + Taraškievičeva beloruska slovnica + valencijski pravopis + + + koledar + razvrščanje + valuta + + + razvrščanje po sistemu tradicionalne kitajščine - Big5 + budistični koledar + kitajski koledar + neposredno razvrščanje + razvrščanje po sistemu poenostavljene kitajščine - GB2312 + gregorijanski koledar + hebrejski koledar + indijanski koledar + islamski koledar + islamski civilni koledar + japonski koledar + razvrščanje po abecedi + razvrščanje po sistemu pinjin + kitajski državni koledar + razvrščanje po zaporedju pisanja pismenk + razvrščanje po tradicionalnem sistemu + + + imperialni + metrični + + + Jezik: {0} + Regija: {0} + + + + titlecase-firstword + titlecase-firstword + + + [a-c č d-p r s š t-v z ž] + [á à ă â å ä ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ q ß ú ù ŭ û ü ū w-y ÿ] + [a-z] + + + » + « + „ + “ + + + {0} – {1} + + + + + + jan + feb + mar + apr + maj + jun + jul + avg + sep + okt + nov + dec + + + januar + februar + marec + april + maj + junij + julij + avgust + september + oktober + november + december + + + + + j + f + m + a + m + j + j + a + s + o + n + d + + + + + + + ned + pon + tor + sre + čet + pet + sob + + + nedelja + ponedeljek + torek + sreda + četrtek + petek + sobota + + + + + n + p + t + s + č + p + s + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1. četrtletje + 2. četrtletje + 3. četrtletje + 4. četrtletje + + + + + 1 + 2 + 3 + 4 + + + + dop. + pop. + + + pred našim štetjem + naše štetje + + + pr. n. št. + po Kr. + + + + + + EEEE, dd. MMMM y + + + + + dd. MMMM y + + + + + d. MMM. yyyy + + + + + d. MM. yy + + + + + + + H:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + HH:mm:ss + d. MMMM + dd. MMMM + d. M. + mm:ss + mm:ss + y + Q/yy + M/yyyy + MMMM y + + + {0} – {1} + + M.–M. + + + E., d. M. – E., d. M. + E., d. – E., d. M. + + + MMM–MMM + + + E., d. MMM. – E., d. MMM. + E., d. – E., d. MMM. + + + LLLL–LLLL + + + d. MMM. – d. MMM. + d.–d. MMM. + + + d. M. – d. M. + d. – d. M. + + + d.–d. + + + HH–HH + HH–HH + + + HH:mm–HH:mm + HH:mm–HH:mm + HH:mm–HH:mm + + + HH:mm–HH:mm v + HH:mm–HH:mm v + HH:mm–HH:mm v + + + HH–HH v + HH–HH v + + + y–y + + + M – M/yy + M/yy – M/yy + + + E., d. M. – E., d. M. yy + E., d. – E., d. M. yy + E., d. M. yy – E., d. M. yy + + + MMM. – MMM. y + MMM. y – MMM. y + + + E., d. MMM. – E., d. MMM. y + E., d. MMM. – E., d. MMM. y + E., d. MMM. y – E., d. MMM. y + + + MM–MM yyyy + MM/yyyy – MM/yyyy + + + d. MMM. – d. MMM. y + d.–d. MMM. y + d. MMM. y – d. MMM. y + + + d. M. – d. M. yy + d. M. yy – d. M. yy + d. M. yy – d. M. yy + + + + + + Doba + + + Leto + + + Mesec + + + Teden + + + Dan + Pred tremi dnevi + Predvčerajšnjim + Včeraj + Danes + Jutri + Pojutrišnjem + Čez tri dni + + + Dan v tednu + + + Čas dneva + + + Ura + + + Minuta + + + Sekunda + + + Območje + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + neznano + + + Andora + + + Dubaj + + + Tirana + + + Erevan + + + Južni tečaj + + + Kordova + + + Dunaj + + + Daka + + + Bruselj + + + Sofija + + + Bahrajn + + + Bermudi + + + Brunej + + + Kokosovi + + + Kinšasa + + + Lubumbaši + + + Abidžan + + + Velikonočni otok + + + Kašgar + + + Šangaj + + + Kostarika + + + Zelenortski otoki + + + Božični + + + Nikozija + + + Džibuti + + + Kopenhagen + + + Dominika + + + Alžir + + + Talin + + + Kairo + + + Kanarski otoki + + + Adis Abeba + + + Fidži + + + Ferski otoki + + + Pariz + + + Akra + + + Gvadelupe + + + Atene + + + Gvatemala + + + Bisau + + + Gvajana + + + Hongkong + + + Budimpešta + + + Džakarta + + + Makasar + + + Bagdad + + + Teheran + + + Rim + + + Jamajka + + + Aman + + + Tokio + + + Biškek + + + St. Kitts + + + Pjongjang + + + Seul + + + Kuvajt + + + Kajman + + + Aktau + + + Uralsk + + + Aktobe + + + Almati + + + Bejrut + + + St. Lucia + + + Vilna + + + Luksemburg + + + Monako + + + Ulan Bator + + + Macao + + + Martinik + + + Maldivi + + + Karači + + + Varšava + + + Portoriko + + + Azori + + + Lizbona + + + Katar + + + Bukarešta + + + Moskva + + + Jekaterinburg + + + Krasnojarsk + + + Jakutsk + + + Sahalin + + + Kamčatka + + + Anadir + + + Rijad + + + Kartum + + + Singapur + + + St. Helena + + + Mogadiš + + + Salvador + + + Damask + + + Ašgabat + + + Darussalam + + + Užgorod + + + Kijev + + + Zaporožje + + + New Salem, Severna Dakota + + + Center, Severna Dakota + + + Taškent + + + St. Vincent + + + St. Thomas + + + Sajgon + + + + Srednjeevropski čas + Srednjeevropski poletni čas + + + + + Vzhodnoevropski čas + Vzhodnoevropski poletni čas + + + + + + + , + . + ; + % + 0 + # + + + – + e + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + + + + andorska peseta + + + dirham Združenih arabskih emiratov + + + stari afganistanski afgani (1927–2002) + + + afgani + + + albanski lek + + + armenski dram + + + nizozemsko-antilski gulden + + + angolska kvanza + + + stara angolska kvanza (1977–1990) + + + angolska nova kvanza (1990–2000) + + + konvertibilna angolska kvanza (1995–1999) + + + argentinski avstral + + + argentinski peso (1983–1985) + + + argentinski peso + + + avstrijski šiling + + + avstralski dolar + + + arubski florin + + + stari azerbajdžanski manat (1993–2006) + + + azerbajdžanski manat + + + bosansko-hercegovski dinar + + + bosansko-hercegovska konvertibilna marka + + + barbadoški dolar + + + bangladeška taka + + + belgijski konvertibilni frank + + + belgijski frank + + + belgijski finančni frank + + + stari bolgarski lev + + + bolgarski lev + + + bahranski dinar + + + burundski frank + + + bermudski dolar + + + brunejski dolar + + + bolivijski boliviano + + + bolivijski peso + + + bolivijski mvdol + + + brazilski novi kruzeiro (1967–1986) + + + brazilski kruzado + + + stari brazilski kruzeiro (1990–1993) + + + brazilski real + + + novi brazilski kruzado + + + brazilski kruzeiro + + + bahamski dolar + + + butanski ngultrum + + + burmanski kjat + + + bocvanska pula + + + beloruski novi rubelj (1994–1999) + + + beloruski rubelj + + + belizejski dolar + + + kanadski dolar + + + kongoški frank + + + evro WIR + + + švicarski frank + + + frank WIR + + + čilski unidades de fomento + + + čilski peso + + + kitajski juan renminbi + + + kolumbijski peso + + + kolumbijska enota realne vrednosti + + + kostariški kolon + + + stari srbski dinar + + + češkoslovaška krona + + + kubanski peso + + + zelenortski eskudo + + + ciprski funt + + + češka krona + + + vzhodnonemška marka + + + nemška marka + + + džibutski frank + + + danska krona + + + dominikanski peso + + + alžirski dinar + + + ekvadorski sukre + + + ekvadorska enota realne vrednosti (UVC) + + + estonska krona + + + egiptovski funt + + + eritrejska nakfa + + + španska pezeta (račun A) + + + španska pezeta (račun B) + + + španska pezeta + + + etiopski bir + + + evro + + + finska marka + + + fidžijski dolar + + + falklandski funt + + + francoski frank + + + britanski funt + + + gruzijski bon lari + + + gruzijski lari + + + stari ganski cedi (1979–2007) + + + ganski cedi + + + gibraltarski funt + + + gambijski dalasi + + + gvinejski sili + + + ekwele Ekvatorialne Gvineje + + + grška drahma + + + gvatemalski kecal + + + eskudo Portugalske Gvineje + + + peso Gvineje Bissau + + + gvajanski dolar + + + hongkonški dolar + + + honduraška lempira + + + hrvaški dinar + + + hrvaška kuna + + + haitski gurd + + + madžarski forint + + + indonezijska rupija + + + irski funt + + + izraelski funt + + + izraelski šekel + + + indijska rupija + + + iraški dinar + + + iranski rial + + + islandska krona + + + italijanska lira + + + jamajški dolar + + + jordanski dinar + + + japonski jen + ¥ + + + kenijski šiling + + + kirgiški som + + + kamboški riel + + + komorski frank + + + severnokorejski von + + + južnokorejski von + + + kuvajtski dinar + + + kajmanski dolar + + + kazahstanski tenge + + + laoški kip + + + libanonski funt + + + šrilanška rupija + + + liberijski dolar + + + lesoški loti + + + litovski litas + + + litvanski litas + + + luksemburški konvertibilni frank + + + luksemburški frank + + + luksemburški finančni frank + + + latvijski lats + + + latvijski rubelj + + + libijski dinar + + + maroški dirham + + + maroški frank + + + moldavijski leu + + + malgaški ariarij + + + malgaški frank + + + makedonski denar + + + malijski frank + + + mjanmarski kjat + + + mongolski tugrik + + + makavska pataka + + + mavretanska uguija + + + malteška lira + + + malteški funt + + + mavricijska rupija + + + maldivska rufija + + + malavijska kvača + + + mehiški peso + + + mehiški srebrni peso (1861-1992) + + + mehiška inverzna enota (UDI) + + + malezijski ringit + + + mozambiški eskudo + + + stari mozambiški metikal + + + mozambiški metikal + + + namibijski dolar + + + nigerijska naira + + + nikaraška kordova + + + nikaraška zlata kordova + + + nizozemski gulden + + + norveška krona + + + nepalska rupija + + + novozelandski dolar + + + omanski rial + + + panamska balboa + + + perujski inti + + + perujski novi sol + + + perujski sol + + + kina Papue Nove Gvineje + + + filipinski peso + + + pakistanska rupija + + + poljski novi zlot + + + stari poljski zlot (1950–1995) + + + portugalski eskudo + + + paragvajski gvarani + + + katarski rial + + + rodezijski dolar + + + stari romunski leu + + + romunski leu + + + srbski dinar + + + ruski rubelj + + + ruski rubelj (1991–1998) + + + ruandski frank + + + saudski rial + + + solomonski dolar + + + sejšelska rupija + + + stari sudanski dinar + + + sudanski funt + + + stari sudanski funt + + + švedska krona + + + singapurski dolar + + + funt Sv. Helene + + + slovenski tolar + + + slovaška krona + + + sieraleonski leone + + + somalski šiling + + + surinamski dolar + + + surinamski gulden + + + saotomejska dobra + + + sovjetski rubelj + + + salvadorski kolon + + + sirijski funt + + + svazijski lilangeni + + + tajski baht + + + tadžikistanski rubelj + + + tadžikistanski somoni + + + turkmenski manat + + + tunizijski dinar + + + tongovska paanga + + + timorski eskudo + + + stara turška lira + + + nova turška lira + + + dolar Trinidada in Tobaga + + + novi tajvanski dolar + + + tanzanijski šiling + + + ukrajinska grivna + + + ukrajinski karbovanci + + + stari ugandski šiling (1966–1987) + + + ugandski šiling + + + ameriški dolar + $ + + + ameriški dolar, naslednji dan + + + ameriški dolar, isti dan + + + stari urugvajski peso (1975–1993) + + + urugvajski peso + + + uzbeški sum + + + venezuelski bolivar + + + venezuelski bolivar fuerte + + + vientnamski dong + + + vanuatujski vatu + + + samoanska tala + + + CFA frank BEAC + + + srebro + + + zlato + + + evropska sestavljena enota + + + evropska monetarna enota + + + evropska obračunska enota (XBC) + + + evropska obračunska enota (XBD) + + + vzhodnokaribski dolar + + + posebne pravice črpanja + + + evropska denarna enota + + + zlati frank + + + frank UIC + + + CFA frank BCEAO + + + paladij + + + CFP frank + + + platina + + + XRE + + + koda za potrebe testiranja + + + neznana ali neveljavna valuta + + + jemenski dinar + + + jemenski rial + + + stari jugoslovanski dinar + + + novi jugoslovanski dinar + + + jugoslovanski konvertibilni dinar + + + južnoafriški finančni rand + + + južnoafriški rand + + + zambijska kvača + + + zairski novi zaire + + + zairski zaire + + + zimbabvejski dolar + + + + + + {0} dnevi + {0} dan + {0} dni + {0} dni + + + {0} ure + {0} ura + {0} ur + {0} uri + + + {0} minute + {0} minuta + {0} minut + {0} minuti + + + {0} meseci + {0} mesec + {0} mesecev + {0} meseca + + + {0} sekunde + {0} sekunda + {0} sekund + {0} sekundi + + + {0} tedni + {0} teden + {0} tednov + {0} tedna + + + {0} leta + {0} leto + {0} let + {0} leti + + + + + da:d + ne:n + + + + diff --git a/lib/zend/Zend/Locale/Data/sl_SI.xml b/lib/zend/Zend/Locale/Data/sl_SI.xml new file mode 100644 index 0000000000..27355a989b --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sl_SI.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/so.xml b/lib/zend/Zend/Locale/Data/so.xml new file mode 100644 index 0000000000..c28dcf76cd --- /dev/null +++ b/lib/zend/Zend/Locale/Data/so.xml @@ -0,0 +1,560 @@ + + + + + + + + + + + Afrikaanays + Amhari + Carabi + Asaamiis + Azerbaijan + Beleruusiyaan + Bulgeeriyaan + Bixaari + Bangaali + Bereton + Boosniya + Katalaan + Jeeg + Welsh + Danmarkays + Jarmal + Jarmal (Iswiiserlaand) + Giriik + Ingiriisi + Ingiriisi (Boqortooyada Midowday) + Ingiriisi (Maraykan) + Isberento + Isbaanish + Isbaanishka Laatiin Ameerika + Isbaanish (Isbayn) + Istooniyaan + Basquu + Faarisi + Fiinlaandees + Tagalog + Farowsi + Faransiis + Faransiis (Iswiiserlaand) + Firiisiyan Galbeed + Ayrish + Iskot Giilik + Galiisiyaan + Guraani + Gujaraati + Cibri + Hindi + Koro'eeshiyaan + Hangariyaan + Armeeniyaan + Interlinguwa + Indunuusiyaan + Interlingue + Ayslandays + Talyaani + Jabbaaniis + Jafaaniis + Joorijiyaan + Kamboodhian + Kannadays + Kuuriyaan + Kurdishka + Kirgiis + Laatiin + Lingala + Laothian + Lituwaanays + Laatfiyaan + Masadooniyaan + Malayalam + Mangooli + Maarati + Malaay + Maltiis + Nebaali + Holandays + Nowrwejiyan (naynoroski) + Af Noorwiijiyaan + Okitaan + Oriya + Bunjaabi + Boolish + Bashtuu + Boortaqiis + Boortaqiiska Baraasiil + Boortaqiis (Boortuqaal) + Romanka + Ruush + Sanskrit + SINDHI + Serbiyaan + Sinhaleys + Isloofaak + Islofeeniyaan + Soomaali + Albaaniyaan + Seerbiyaan + Sesooto + Suudaaniis + Swiidhis + Sawaaxili + Tamiil + Teluugu + Taaylandays + Tigrinya + Turkumaanish + Kiligoon + Turkish + Tiwiyan + UIGHUR + Yukreeniyaan + Af aan la aqoon ama aan sax ahayn + Urduu + Usbakis + Fiitnaamays + Hoosta + Yadhish + Jayniis + Zuulu + + + + + + + + Afrikada Bari + Aasiyada Bari + Yurubta Bari + Imaaraadka Carabta ee Midoobay + Afgaanistaan + Armeeniya + Angoola + Osteeriya + Awstraaliya + Boosniya Heersigoviina + Baarbadoos + Bangaala-Deesh + Beljiyam + Baxrayn + Beniin + Braasiil + Kanada + Swiiserlaand + Jili + Kameruun + Shiinaha + Kuuba + Jekoslafaakiya + Jarmal + Jabuuti + Danmaark + Ikwadoor + Masar + Isbeyn + Itoobiya + Fiinlaand + Faransiis + United Kingdom + Giriinaada + Gini + Giriigga + Korweeshiya + Hangeri + Indoneesiya + Ayrlaanda + Israaʼiil + Hindiya + Ciraaq + Iiraan + Iislaand + Talyaani + Jameyka + Urdun + Jabbaan + Kiiniya + Kamboodiya + Kuuriyada Waqooyi + Kuuriyada Koonfureed + Kuwayt + Kasaakhistaan + Lubnaan + Siirilaanka + Laybeeriya + Losooto + Luksemboorg + Laatfiya + Liibiya + Marooko + Moonako + Makadooniya + Maali + Muritaaniya + Maalda + Maaldiqeen + Malaawi + Meksiko + Musambiig + Namiibiya + Nayjeeriya + Nikaraaguwa + Noorweey + Neyuusilaand + Cumaan + Filibiin + Bakistaan + Booland + Bortuqaal + Qadar + Rumaaniya + Ruush + Sacuudi Carabiya + Sudaan + Iswidhan + Siraaliyoon + Soomaaliya + Suuriya + Jaad + Toogo + Taylaand + Tuniisiya + Tonga + Turki + Tansaaniya + Ugaanda + Qaramada Midoobey ee Maraykanka + Faatikaan + Fenisuweela + Fiyetnaam + Yaman + Koonfur Afrika + Saambiya + Simbaabwe + Far aan la aqoon amase aan saxnayn + + + Habeentiris + Lacag + + + Habeentiriska yuhuudda + Habeentiriska islaamka + Habeentiriska jabbaanka + + + + [a-z] + + + + + + + + Kob + Lab + Sad + Afr + Sha + Lix + Tod + Sid + Sag + Tob + KIT + LIT + + + Bisha Koobaad + Bisha Labaad + Bisha Saddexaad + Bisha Afraad + Bisha Shanaad + Bisha Lixaad + Bisha Todobaad + Bisha Sideedaad + Bisha Sagaalaad + Bisha Tobnaad + Bisha Kow iyo Tobnaad + Bisha Laba iyo Tobnaad + + + + + K + L + S + A + S + L + T + S + S + T + K + L + + + + + + + Axa + Isn + Sal + Arb + Kha + Jim + Sab + + + Axad + Isniin + Salaaso + Arbaco + Khamiis + Jimco + Sabti + + + + + A + I + S + A + K + J + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + sn + gn + + + Ciise ka hor + Ciise ka dib + + + + + + EEEE, MMMM dd, y + + + + + dd MMMM y + + + + + dd-MMM-y + + + + + dd/MM/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM y + + + {0} - {1} + + M-M + + + E, dd/MM - E, dd/MM + E, dd/MM - E, dd/MM + + + MMM-MMM + + + E, dd MMM - E, dd MMM + E, dd - E, dd MMM + + + dd MMM - dd MMM + dd-dd MMM + + + dd/MM - dd/MM + dd/MM - dd/MM + + + d-d + + + h a - h a + h-h a + + + h:mm a - h:mm a + h:mm-h:mm a + h:mm-h:mm a + + + h:mm a - h:mm a v + h:mm-h:mm a v + h:mm-h:mm a v + + + h a - h a v + h-h a v + + + y-y + + + MM/yy - MM/yy + MM/yy - MM/yy + + + E, dd/MM/yy - E, dd/MM/yy + E, dd/MM/yy - E, dd/MM/yy + E, dd/MM/yy - E, dd/MM/yy + + + MMM-MMM y + MMM y - MMM y + + + E, MMM dd - E, MMM dd, y + E, MMM dd - E, MMM dd, y + E, MMM dd, y - E, MMM dd, y + + + dd MMM - dd MMM y + dd-dd MMM y + dd MMM y - dd MMM y + + + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + dd/MM/yy - dd/MM/yy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Far aan la aqoon amase aan saxnayn + + + + + + . + , + + + + + ¤#,##0.00 + + + + + + Brazilian Real + + + Chinese Yuan Renminbi + + + Faran Jabbuuti + + + Birta Itoobbiya + + + Yuuroo + + + British Pound Sterling + + + Indian Rupee + + + Japanese Yen + + + Russian Ruble + + + Shilin soomaali + + + Doollar maraykan + + + Lacag aan la qoon ama aan saxnayn + + + + + + haa:h + maya:m + + + + diff --git a/lib/zend/Zend/Locale/Data/so_DJ.xml b/lib/zend/Zend/Locale/Data/so_DJ.xml new file mode 100644 index 0000000000..86e77a7375 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/so_DJ.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/so_ET.xml b/lib/zend/Zend/Locale/Data/so_ET.xml new file mode 100644 index 0000000000..1cfa6ef462 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/so_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/so_KE.xml b/lib/zend/Zend/Locale/Data/so_KE.xml new file mode 100644 index 0000000000..ab2b6af4b4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/so_KE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/so_SO.xml b/lib/zend/Zend/Locale/Data/so_SO.xml new file mode 100644 index 0000000000..202d906609 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/so_SO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sq.xml b/lib/zend/Zend/Locale/Data/sq.xml new file mode 100644 index 0000000000..89ae633139 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sq.xml @@ -0,0 +1,656 @@ + + + + + + + + + + + Afrikanisht + Amharike + Arabisht + Asamezisht + Azerbajxhanisht + Bjellorusisht + Bullgarisht + Bihari + Bengalisht + Breton + Boshnjakisht + Katalonisht + Çekisht + Uellsisht + Danisht + Gjermanisht + Greqisht + Anglisht + Esperanto + Spanjisht + Estonisht + Baskisht + Persisht + Finlandisht + Tagalogisht + Faroisht + Frengjisht + Frizianisht + Irlandisht + Galisht + Galicianisht + Guarani + Guxharati + Hebraisht + Hindi + Kroatisht + Hungarisht + Armen + Interlingua + Indonezisht + Gjuha nderkombtare + Islandisht + Italisht + Japanisht + Javanisht + Gjeorgjisht + Kamboxhiane + Kanada + Koreançe + Kurd + Kyrgyz + Latinisht + Lingala + Laosisht + Lituanisht + Letonisht + Maqedonisht + Malajalam + Mongolisht + Marati + Malajzisht + Maltisht + Nepalisht + Holandisht + Norvegjisht (Nynorsk) + Norvegjisht + Oksitanisht + Orija + Punxhabi + Polonisht + Pashto + Portugeze + Portugalisht (Brazil) + Portugalisht (Portugali) + Rumanisht + Rusisht + Sanskritisht + Si'ndi + Serbo-Kroatisht + Sinhalezisht + Sllovakisht + Sllovenisht + Somalisht + shqipe + Serbisht + Sesotho + Sundanisht + Suedisht + Suahilisht + Tamil + Telugu + Tajlandisht + Tigrinja + Turk + Klingon + Turqisht + Twi + Ujgur + Ukrainisht + Unknown or Invalid Language + Urdu + Uzbekistanisht + Vietnamisht + Xhosa + Jiden + Kineze + Zulu + + + + + + + + Andorrë + Emiratet Arabe te Bashkuara + Afganistan + Antigua e Barbuda + Shqipëria + Armeni + Angolë + Argjentinë + Austri + Australi + Ishujt Aland + Azerbajxhan + Bosnja dhe Hercegovina + Belgjikë + Bullgari + Bahrein + Brunej + Bolivi + Brazili + Butan + Botsvana + Bjellorusi + Kanada + Republika Qendrore e Afrikës + Kongo + Zvicër + Bregu i Fildishtë + Kili + Kamerun + Kinë + Kolumbi + Kosta Rika + Serbië en Montenegro + Kubë + Kap Verde + Qipro + Republika e Çekisë + Gjermani + Xhibuti + Danimarkë + Dominikë + Republika Dominikanë + Algjeri + Ekuator + Estoni + Egjipt + Saharaja Perëndimore + Eritre + Spanjë + Etiopi + Finlandë + Fixhi + Mikronezi + Francë + Gjabon + Mbretëria e Bashkuar + Gjeorgji + Ganë + Gambi + Guine + Guineja Ekuatoriale + Greqi + Guatemalë + Guine Bisau + Guajana + Kroaci + Hungari + Indonezi + Irlandë + Izrael + Indi + Irak + Islandë + Itali + Xhamajkë + Jordani + Japoni + Kenia + Kirgistan + Kamboxhi + Qiribati + Komore + Saint Kitts e Nevis + Koreja e Veriut + Koreja e Jugut + Kuvajt + Kazakistan + Liban + Lihtënshtajn + Liberi + Lesoto + Lituani + Luksemburg + Letoni + Libi + Maroko + Monako + Moldavi + Madagaskar + Ishujt Marshall + Maqedoni + Mongoli + Mauritani + Maltë + Maldivit + Malavi + Meksikë + Malajzi + Mozambik + Namibi + Nigeri + Nikaragua + Vendet e Ulëta + Norvegji + Zelanda e Re + Papua Guineja e Re + Filipine + Poloni + Portugali + Paraguaj + Katar + Rumani + Rusi + Ruanda + Arabia Saudite + Ishujt Solomon + Sishel + Suedi + Singapor + Slloveni + Sllovaki + Siera Leone + Somali + Sao Tome e Prinsipe + Siri + Svazilandë + Çad + Togo + Tajlandë + Taxhikistan + Tunisi + Tonga + Turqi + Trinidad e Tobago + Tajvan + Tanzani + Ukrainë + Shtetet e Bashkuara të Amerikës + Uruguaj + Vatikan + Saint Vincent e Grenadinet + Venezuelë + Jemen + Afrika e Jugut + Zambi + Zimbabve + Rajon i panjohur ose i pavlefshëm + + + + [a-c ç d {dh} e ë f g {gj} h-l {ll} m n {nj} o-r {rr} s {sh} t {th} u v x {xh} y z {zh}] + [w] + + + + + + + + Jan + Shk + Mar + Pri + Maj + Qer + Kor + Gsh + Sht + Tet + Nën + Dhj + + + janar + shkurt + mars + prill + maj + qershor + korrik + gusht + shtator + tetor + nëntor + dhjetor + + + + + J + S + M + P + M + Q + K + G + S + T + N + D + + + + + + + Die + Hën + Mar + Mër + Enj + Pre + Sht + + + e diel + e hënë + e martë + e mërkurë + e enjte + e premte + e shtunë + + + + + D + H + M + M + E + P + S + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + + 1 + 2 + 3 + 4 + + + + PD + MD + + + p.e.r. + n.e.r. + + + + + + EEEE, dd MMMM y + + + + + dd MMMM y + + + + + yyyy-MM-dd + + + + + yy-MM-dd + + + + + + + h.mm.ss.a zzzz + + + + + h.mm.ss.a z + + + + + h.mm.ss.a + + + + + h.mm.a + + + + + + H.mm + H.mm.ss + L + E, d.M + LLL + E d MMM + E d MMMM + d MMMM + dd MMMM + d MMM + MM-dd + M-d + d + mm:ss + y + M.yyyy + EEE, d.M.yyyy + MMM y + d MMM y + MMMM y + Q yy + yyyy-MM + MMMM y + + + {0} - {1} + + M-M + + + E, MM-dd - E, MM-dd + E, MM-dd - E, MM-dd + + + MMM-MMM + + + E, dd MMM - E, dd MMM + E, dd - E, dd MMM + + + dd MMM - dd MMM + dd-dd MMM + + + MM-dd - MM-dd + MM-dd - MM-dd + + + d-d + + + h.a - h.a + h.-h.a + + + h.mm.a - h.mm.a + h.mm.-h.mm.a + h.mm.-h.mm.a + + + h.mm.a - h.mm.a v + h.mm.-h.mm.a v + h.mm.-h.mm.a v + + + h.a - h.a v + h.-h.a v + + + y-y + + + yy-MM - yy-MM + yy-MM - yy-MM + + + E, yy-MM-dd - E, yy-MM-dd + E, yy-MM-dd - E, yy-MM-dd + E, yy-MM-dd - E, yy-MM-dd + + + yyyy-MM – MM + MMM y - MMM y + + + E, dd MMM - E, dd MMM y + E, dd - E, dd MMM y + E, dd MMM y - E, dd MMM y + + + dd MMM - dd MMM y + dd-dd MMM y + dd MMM y - dd MMM y + + + yy-MM-dd - yy-MM-dd + yy-MM-dd - yy-MM-dd + yy-MM-dd - yy-MM-dd + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Unknown + + + + Ora qendrore evropiane + + + + + Ora lindore evropiane + + + + + Ora standarde e Moskës + + + + + + + , + . + + + + + ¤#,##0.00 + + + + + + Lek + + + Real Brazilian + + + Renminbi(Yuan) Kinez + + + Euro + + + Paund Sterlina Britanike + + + Rupee indiane + + + Jeni Japonez + + + Rubla ruse + + + Dollar amerikan + + + Unknown or Invalid Currency + + + + + + {0} ditë + {0} ditë + + + {0} orë + + + {0} minutë + {0} minuta + + + {0} muaj + + + {0} sekondë + {0} sekonda + + + {0} javë + + + {0} vit + {0} vjet + + + + + po:p + jo:j + + + diff --git a/lib/zend/Zend/Locale/Data/sq_AL.xml b/lib/zend/Zend/Locale/Data/sq_AL.xml new file mode 100644 index 0000000000..2b54cb4076 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sq_AL.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sr.xml b/lib/zend/Zend/Locale/Data/sr.xml new file mode 100644 index 0000000000..07c601673b --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sr.xml @@ -0,0 +1,5950 @@ + + + + + + + + + + + , + + + Aфaрски + Абказијски + Aчинески + Aколи + Aдaнгмејски + Aдигејски + Aвестaнски + Африканерски + Aфро-aзијaтски + Aфрихили + Aину + Aкaн + Акадијски + Aљут + Aлгонквијaнски језик + Јужни aлтaи + Амхарски + Aрaгонежaнски + Староенглески + Aнгикa + Апачки језик + Арапски + Aрмaјски + Aрокaнијски + Aрaпaхо + Вештaчки + Aрaвaк + Асемијски + Aстуријски + Aтaпaскaн + Аустралијски језик + Аварски + Aвaдхи + Aјмaрa + Азербејџански + Башкир + Бaндa + Бaмилеке + Бaлучи + Бaлинезијски + Бaсa + Балтички језик + Белоруски + Беја + Бембa + Бербер + Бугарски + Бихарски + Бојпури + Бислама + Бикол + Бини + Сисика + Бaмбaрa + Бенгласки + Банту + Тибетански + Бретонски + Брaј + Босански + Бaтaк + Буриaт + Бугинежaнски + Блин + Каталонски + Кaдо + Централно амерички Индијански језик + Кaрипски + Кaвкaски + Атсамски + Чеченски + Цебуaно + Келтски + Чaморо + Чибчa + Чaгaтaи + Чукески + Мaри + Чинукски + Чоктaвски + Чипвијaнски + Чероки + Чејенски + Чaмски језик + Корзикански + Коптски + Креолски или пиџин зaсновaн нa енглеском + Креолски или пиџин зaсновaн нa фрaнцуском + Креолски или пиџин бaзирaн нa португaлском + Кри + Кримеaнски турски + креолски или пиџин + Чешки + Кaшубијaнски + Старословенски + Кушитички језик + Чувaшки + Велшки + Дански + Дакота + Дaргвa + Дaјaшки + Немачки + Аустријски немачки + Швaјцaрски високи немaчки + Делавер + Слaвски + Догриб + Динкa + Догри + Дарвидијски језик + Ниски сорбијански + Дуaлa + Средњи холaндски + Дивехијски + Ђулa + Џонга + Еве + Ефикски + Староегипатски + Екaјук + Грчки + Елaмитски + Енглески + Аустралијски енглески + Канадски енглески + Британски енглески + САД енглески + Средњи енглески + Есперанто + Шпански + Латино-амерички шпански + Иберијски шпански + Естонски + Баскијски + Евондо + Персијски + Фaнг + Фaнти + Фулaх + Фински + Тагалог + Угро-фински + Фиджијски + Фарски + Фон + Француски + Кaнaдски француски + Швaјцaрски фрaнцуски + Средњи фрaнцуски + Старофранцуски + Северно-фризијски + Источни фризијски + Фриулијски + Фризијски + Ирски + Гa + Гaјо + Гбaјa + Шкотски Галски + Германски језик + Џиз + Гилбертшки + Галски + Средњи високи немaчки + Гварани + Старонемачки + Гонди + Горонтaло + Готски + Гребо + Старогрчки + Швајцарски немачки + Гуџарати + Мaнкс + Гвич'ин + Хауса + Хaидa + Хавајски + Хебрејски + Хинди + Хилигaјнон + Химaчaли + Хитите + Хмонг + Хири Моту + Хрватски + Горњи сорбијски + Хаитски + Мађарски + Хупа + Јерменски + Хереро + Интерлингва + Ибaн + Индонежански + Међујезички + Игбо + Сичуaн ји + Ијо + Унупиак + Илоко + Индик + Индо-европски језик + Ингвишки + Идо + Ирански језик + Ироквојaнски + Исландски + Италијански + Инуктитут + Јапански + Лојбaн + Јудео-персијски + Јудео-арапски + Јавански + Грузијски + Кaрa-кaлпaшки + Кaбиле + Кaчин + Ђу + Кaмбa + Кaренски + Кaви + Кaбaрдијски + Тјaп + Коро + Конго + Кaси + Коисaнски језик + Котанешки + Кикују + Куaњaмa + Козачки + Калалисут + Кмерски + Кимбунду + Канада + Корејски + Конкaни + Косреaнски + Кпеле + Кaнури + Кaрaчaј-бaлкaр + Кaрелијски + Кру + Курукх + Кашмирски + Курдски + Кумик + Кутенaи + Коми + Корнишки + Киргиски + Латински + Лaдино + Лaндa + Лaмбa + Луксембуршки + Лезгиaн + Гaндa + Лимбургиш + Лингала + Лаоски + Монго + Лози + Литвански + Лубa-кaтaнгa + Лубa-лулуa + Луисено + Лундa + Луо + Лушaи + Летонски + Мaдурешки + Мaгaхи + Мaитили + Мaкaсaр + Мaндинго + Aустронежaнски + Масаи + Мокшa + Мaндaр + Менде + Малагасијски + Средњи ирски + Мaршaлски + Маорски + Микмaк + Минaнгкaбaу + Рaзни језици + Македонски + Мон-кмерски језик + Малајалам + Монголски + Мaнчу + Мaнипури + Мaнобо језик + Молдавски + Мaхaвски + Моси + Марати + Малајски + Мелтешки + Више језикa + Мундa језик + Кришки + Мирaндешки + Мaрвaри + Бурмански + Мaјaнски језик + Ерзијa + Науру + Нaхуaтл + Језик северноамеричких Индијанаца + Неaполитaнски + Норвешки бокмал + Северни ндебеле + Ниски немачки + Непалски + Невaри + Ндонгa + Ниaс + Нигер-кордофaнијски језик + Ниуеaн + Холандски + Фламански + Норвешки њорск + Норвешки + Ногaи + Стaри норски + Н’ко + Јужни ндебеле + Северни сото + Нубијски језик + Навахо + Клaсични невaри + Њања + Њaмвези + Њaнколе + Њоро + Нзимa + Провансалски + Ојибвa + Оромо + Оријски + Осетски + Осaге + Отомaнски турски + Отомaнски језик + Панџабски + Папуански језик + Пaнгaсински + Пaхлaви + Пaмпaнгa + Пaпиaменто + Пaлaуaнски + Староперсијски + Филипински језик + Феничaнски + Пaли + Пољски + Понпејски + Пракритски + Старопровансалски + Паштунски + Португалски + Бразилски португалски + Иберијски португалски + Квенчa + Рaђaстaни + Рaпaнуи + Рaротонгaн + Рето-Романски + Рунди + Румунски + Ромaнски језик + Ромaни + Рут + Руски + Aромaнијски + Кинјаруанда + Санскрит + Сaндaве + Јaкут + Језик јужноамеричких Индијанаца + Сaлишaнски језик + Сaмaритaнски aрaмејски + Сaсaк + Сaнтaли + Сардињаски + Сицилијански + Шкотски + Синди + Северни сaми + Селкaп + Семитски језик + Санго + Староирски + Знаковни језик + Српскохрватски + Шaн + Сингалески + Сидамо + Сиуaнски језик + Сино-тибетански језик + Словачки + Словеначки + Словенски језик + Самоански + Јужни сaми + Сaми језик + Луле сaми + Инaри сaми + Сколтски језик + Шонa + Сонинке + Сомалски + Соџијенски + Сонгaи + Албански + Српски + Срaнaнски тонго + Серер + Свaти + Нило-сaхaрски језик + Сесото + Судански + Сукумa + Сусу + Сумерски + Шведски + Свахили + Класични сиријски + Сиријски + Тамилски + Тaи језик + Телугу + Тимне + Терено + Тетум + Тађик + Тајландски + Тигриња + Тигре + Тив + Туркменски + Токелaу + Тагалски + Клингонски + Тлингит + Тaмaшек + Тсвaнa + Тонгa + Њaсa тонгa + Ток Писин + Турски + Тсонгa + Тсимшиaн + Татарски + Тумбукa + Тупи језик + Aлтaички језик + Тувaлу + Тви + Тахићански + Тувинијски + Удмурт + Ујгурски + Угaритски + Украјински + Умбунду + Непознат или неважећи језик + Урду + Узбечки + Вaи + Вендa + Вијетнамски + Волапук + Вотски + Вaлун + Вaкaшaнски језик + Вaлaмо + Варај + Вашо + Сорбијaнски језик + Волоф + Кaлмик + Ксхоса + Јaо + Јaпешки + Јидиш + Јоруба + Јупик + Жуанг + Зaпотечки + Блисимболи + Зенaгa + Кинески + Кинески (поједностављен) + Кинески (традиционални) + Зaнде + Зулу + Зуни + Без лингвистичког садржаја + Зaзa + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Свет + Африка + Северноамерички континент + Јужна Америка + Океанија + Западна Африка + Централна Америка + Источна Африка + Северна Африка + Централна Африка + Јужна Африка + Америке + Северна Америка + Кариби + Источна Азија + Јужна Азија + Југоисточна Азија + Јужна Европа + Аустралија и Нови Зеланд + Меланезија + Микронезијски регион + Полинезија + Јужно-централна Азија + Азија + Централна Азија + Западна Азија + Европа + Источна Европа + Северна Европа + Западна Европа + Комонвелт независних држава + Латинска Америка и Кариби + Каналска острва + Андора + Уједињени Арапски Емирати + Авганистан + Антигве и Барбуда + Ангвила + Албанија + Арменија + Холандски Антили + Ангола + Антарктик + Аргентина + Америчка Самоа + Аустрија + Аустралија + Аруба + Аландска острва + Азербејџан + Босна и Херцеговина + Барбадос + Бангладеш + Белгија + Буркина Фасо + Бугарска + Бахреин + Бурунди + Бенин + Свети Бартоломеј + Бермуда + Брунеј + Боливија + Бразил + Бахами + Бутан + Буве Острва + Боцвана + Белорусија + Белизе + Канада + Кокос (Келинг) Острва + Демократска република Конго + Централно Афричка Република + Конго + Швајцарска + Обала Слоноваче + Кукова Острва + Чиле + Камерун + Кина + Колумбија + Костарика + Србија и Црна Гора + Куба + Капе Верде + Божићна острва + Кипар + Чешка + Немачка + Џибути + Данска + Доминика + Доминиканска Република + Алжир + Еквадор + Естонија + Египат + Западна Сахара + Еритреја + Шпанија + Етиопија + Финска + Фиџи + Фолкландска Острва + Микронезија + Фарска Острва + Француска + Габон + Велика Британија + Гренада + Грузија + Француска Гвајана + Гурнси + Гана + Гибралтар + Гренланд + Гамбија + Гвинеја + Гваделупе + Екваторијална Гвинеја + Грчка + Јужна Џорџија и Јужна Сендвич Острва + Гватемала + Гуам + Гвинеја-Бисао + Гвајана + Хонг Конг С. А. Р. Кина + Херд и Мекдоналд Острва + Хондурас + Хрватска + Хаити + Мађарска + Индонезија + Ирска + Израел + Острво Ман + Индија + Британска територија у Индијском океану + Ирак + Иран + Исланд + Италија + Џерси + Јамајка + Јордан + Јапан + Кенија + Киргизстан + Камбоџа + Кирибати + Коморска Острва + Сент Китс и Невис + Северна Кореја + Јужна Кореја + Кувајт + Кајманска Острва + Казахстан + Лаос + Либан + Сент Луција + Лихтенштајн + Шри Ланка + Либерија + Лесото + Литванија + Луксембург + Летонија + Либија + Мароко + Монако + Молдавија + Црна Гора + Сент Мартин + Мадагаскар + Маршалска Острва + Македонија + Мали + Мијанмар + Монголија + Макао С. А. Р. Кина + Северна Маријанска Острва + Мартиник + Мауританија + Монсерат + Малта + Маурицијус + Малдиви + Малави + Мексико + Малезија + Мозамбик + Намибија + Нова Каледонија + Нигер + Норфолк Острво + Нигерија + Никарагва + Холандија + Норвешка + Непал + Науру + Ниуе + Нови Зеланд + Оман + Панама + Перу + Француска Полинезија + Папуа Нова Гвинеја + Филипини + Пакистан + Пољска + Сен Пјер и Микелон + Питкерн + Порто Рико + Палестинска територија + Португал + Палау + Парагвај + Катар + Остала океанија + Европска Унија + Реинион + Румунија + Србија + Русија + Руанда + Саудијска Арабија + Соломонска Острва + Сејшели + Судан + Шведска + Сингапур + Света Јелена + Словенија + Свалбард и Јанмајен Острва + Словачка + Сијера Леоне + Сан Марино + Сенегал + Сомалија + Суринам + Сао Томе и Принципе + Салвадор + Сирија + Свазиленд + Туркс и Кајкос Острва + Чад + Француске Јужне Територије + Того + Тајланд + Таџикистан + Токелау + Источни Тимор + Туркменистан + Тунис + Тонга + Турска + Тринидад и Тобаго + Тувалу + Тајван + Танзанија + Украјина + Уганда + Мања удаљена острва САД + Сједињене Америчке Државе + Уругвај + Узбекистан + Ватикан + Сент Винсент и Гренадини + Венецуела + Британска Девичанска Острва + С.А.Д. Девичанска Острва + Вијетнам + Вануату + Валис и Футуна Острва + Самоа + Јемен + Мајоте + Јужноафричка Република + Замбија + Зимбабве + Непозната или неважећа област + + + Традиционална немачка ортографија + Стандарднизована ресијанска ортографија + Немачка ортографија из 1996 + Француски из касног средњег века до 1606. + Рани модерни француски + Источни арменијски + Западно јерменска + Уједињен турски латинични алфабет + Сан Ђорђио/Била дијалект + Бунтлинг + ИПА фонетика + УПА фонетика + Липовички дијалект ресијански + Монотоник + Натисоне дијалект + Гњива/Њива дијалкект + Осеако/Осојане дијалект + Политоник + Компјутер + Ревидирана ортографија + Ресијан + Сахо + Шкотски стандардни Енглески + Скауз + Столвица/Солбица дијалект + Тараскијевичка ортографија + Валенцијска + + + Календар + Сортирање + Валута + + + Традиционално кинеско сортирање + Будистички календар + Кинески календар + Директно сортирање + Поједностављено кинеско сортирање + Грегоријански календар + Хебрејски календар + Индијски национални календар + Исламски календар + Исламски цивилни календар + Јапански календар + Сортирање као телефонски именик + Пињин сортирање + Календар Републике Кине + Сортирање по броју црта + Традиционално сортирање + + + САД + Метрички + + + {0} + {0} + {0} + + + + [а-д ђ е-и ј к л љ м н њ о-т ћ у-ч џ ш] + [a á à ă â å ä ā æ b c ç d e é è ĕ ê ë ē f-i í ì ĭ î ï ī j-n ñ o ó ò ŏ ô ö ø ō œ p-s ß t u ú ù ŭ û ü ū v-y ÿ z] + [a-c č d-l ł m-o º p-z] + + + “ + ” + ‘ + ’ + + + + + пре подне + поподне + + + БЕ + + + + + пре подне + поподне + + + + + + Таут + Баба + Хатор + Киахк + Тоба + Амшир + Барамхат + Барамуда + Башанс + Паона + Епеп + Месра + Наси + + + + пре подне + поподне + + + + + + Мескерем + Текемт + Хедар + Тахсас + Тер + Јекатит + Мегабит + Миазиа + Генбот + Сене + Хамле + Нехасе + Пагумен + + + + пре подне + поподне + + + + + + јан + феб + мар + апр + мај + јун + јул + авг + сеп + окт + нов + дец + + + јануар + фебруар + март + април + мај + јун + јул + август + септембар + октобар + новембар + децембар + + + + + ј + ф + м + а + м + ј + ј + а + с + о + н + д + + + + + + + нед + пон + уто + сре + чет + пет + суб + + + недеља + понедељак + уторак + среда + четвртак + петак + субота + + + + + н + п + у + с + ч + п + с + + + + + + + К1 + К2 + К3 + К4 + + + Прво тромесечје + Друго тромесечје + Треће тромесечје + Четврто тромесечје + + + + + 1 + 2 + 3 + 4 + + + + пре подне + поподне + + + Пре нове ере + Нове ере + + + п. н. е. + н. е + + + п.н.е. + н.е. + + + + + + EEEE, dd. MMMM y. + + + + + dd. MMMM y. + + + + + dd.MM.y. + + + + + d.M.yy. + + + + + + + HH.mm.ss zzzz + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + d. EEE + E d. + HH.mm + L + E, M-d + LLL + E d. MMM + E MMMM d + MMMM d. + dd. MMMM + MMM d. + dd.MMM + MM-dd + d/M + d + hh.mm a + hh.mm.ss a + mm:ss + y. + y-M + EEE, d. M. yyyy. + MMM. y + EEE, d. MMM y. + y MMMM + y Q + QQQ. y + MM.yy + d. MMM yy. + dd.MM.yy + Q yy + QQQQ yy + y. + yyyy-MM + MMMM y. + + + {0} - {1} + + M-M + + + E, d.M - E, d.M + E, d.M - E, d.M + + + MMM-MMM + + + E, dd. MMM - E, dd. MMM + E, dd. - E, dd. MMM + + + LLLL-LLLL + + + dd. MMM - dd. MMM + dd.-dd. MMM + + + d.M - d.M + d.M - d.M + + + d-d + + + HH-HH + HH-HH + + + HH.mm-HH.mm + HH.mm-HH.mm + HH.mm-HH.mm + + + HH.mm-HH.mm v + HH.mm-HH.mm v + HH.mm-HH.mm v + + + HH-HH v + HH-HH v + + + y-y + + + yyyy M - M + yyyy M - M + + + E, d.M.yy. - E, d.M.yy. + E, d.M.yy. - E, d.M.yy. + E, d.M.yy. - E, d.M.yy. + + + MMM-MMM y. + MMM y. - MMM y. + + + E, dd. MMM - E, dd. MMM y. + E, dd. - E, dd. MMM y. + E, dd. MMM y. - E, dd. MMM y. + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + dd. MMM - dd. MMM y. + dd.-dd. MMM y. + dd. MMM y. - dd. MMM y. + + + d.M.yy. - d.M.yy. + d.M.yy. - d.M.yy. + d.M.yy. - d.M.yy. + + + + + + ера + + + година + + + месец + + + недеља + + + дан + пре три дана + прекјуче + јуче + данас + сутра + прекосутра + за три дана + + + дан у недељи + + + пре подне/поподне + + + час + + + минут + + + секунд + + + зона + + + + + + + + Тишри + Хешван + Кислев + Тевет + Шеват + Адар I + Адар + Нисан + Ијар + Сиван + Тамуз + Ав + Елул + + + + пре подне + поподне + + + + + + Чаитра + Ваисака + Јиаиста + Асада + Сравана + Бадра + Асвина + Картика + Аргајана + Пауза + Мага + Фалгуна + + + + пре подне + поподне + + + САКА + + + + + + + + Мурахам + Сафар + Рабиʻ I + Рабиʻ II + Јумада I + Јумада II + Рађаб + Шаʻбан + Рамадан + Шавал + Дуʻл-Киʻда + Дуʻл-хиђа + + + + пре подне + поподне + + + АХ + + + + + пре подне + поподне + + + Таика + Хакучи + Хакухо + Шучо + Таихо + Кеиун + Вадо + Реики + Јоро + Јинки + Темпио + Темпио-кампо + Темпио-шохо + Темпио-хођи + Темпо-ђинго + Ђинго-кеиун + Хоки + Тен-о + Енрјаку + Даидо + Конин + Тенчо + Шова + Кајо + Нињу + Саико + Тенан + Јоган + Генкеи + Ниња + Кампјо + Шотаи + Енђи + Енчо + Шохеи + Тенгјо + Тенриаку + Тентоку + Ова + Кохо + Ана + Тенроку + Тен-ен + Јоген + Тенген + Еикан + Кана + Еи-ен + Еисо + Шорјаку + Чотоку + Чохо + Канко + Чова + Канин + Ђиан + Мању + Чоген + Чорјаку + Чокју + Кантоку + Еишо + Тенђи + Кохеи + Ђирјаку + Енкју + Шохо + Шорјаку + Еишо + Отоку + Канђи + Кахо + Еичо + Шотоку + Кова + Чођи + Кашо + Тенин + Тен-еи + Еикју + Ђен-еи + Хоан + Тенђи + Даиђи + Теншо + Чошао + Хоен + Еиђи + Кођи + Тењо + Кјуан + Нинпеи + Кјују + Хоген + Хеиђи + Еирјаку + Охо + Чокан + Еиман + Нин-ан + Као + Шоан + Анген + Ђишо + Јова + Ђуеи + Генрјуку + Бунђи + Кенкју + Шођи + Кенин + Генкју + Кен-еи + Шоген + Кенрјаку + Кенпо + Шокју + Ђу + Ђенин + Кароку + Антеи + Канки + Ђоеи + Темпуку + Бунрјаку + Катеи + Рјакунин + Ен-о + Нињи + Канген + Хођи + Кенчо + Коген + Шока + Шоген + Бун-о + Кочо + Бун-еи + Кенђи + Коан + Шу + Еинин + Шоан + Кенген + Каген + Токуђи + Енкеи + Очо + Шова + Бунпо + Ђено + Ђенкјо + Шочу + Кареки + Гентоку + Генко + Кему + Енген + Кококу + Шохеи + Кентоку + Бучу + Тењу + Корјаку + Кова + Генчу + Меитоку + Какеи + Ку + Меитоку + Оеи + Шочо + Еикјо + Какитсу + Бун-ан + Хотоку + Кјотоку + Кошо + Чороку + Каншо + Буншо + Онин + Бунмеи + Чокјо + Ентоку + Меио + Бунки + Еишо + Таиеи + Кјороку + Тенмон + Кођи + Еироку + Генки + Теншо + Бунроку + Кеичо + Генва + Кан-еи + Шохо + Кеиан + Шу + Меирјаку + Мањи + Канбун + Енпо + Тенва + Јокјо + Генроку + Хоеи + Шотоку + Кјохо + Генбун + Канпо + Енкјо + Кан-ен + Хорјаку + Меива + Ан-еи + Тенмеи + Кансеи + Кјова + Бунка + Бунсеи + Тенпо + Кока + Каеи + Ансеи + Ман-ен + Бункју + Генђи + Кеико + Меиђи + Таишо + Шова + Хаисеи + + + + + + EEEE, MMMM d, y G + + + + + MMMM d, y G + + + + + MMM d, y G + + + + + M/d/yy G + + + + + + + + + Фаравадин + Ордибехешт + Кордад + Тир + Мордад + Шахривар + Мехр + Абан + Азар + Деј + Бахман + Есфанд + + + + пре подне + поподне + + + пре подне + поподне + + + Пре РК + РК + + + + + + +HHmm;-HHmm + GMT{0} + {0} + {1} ({0}) + + Непознат или неважећи град + + + Андора + + + Дубаи + + + Кабул + + + Антигва + + + Ангвила + + + Тирана + + + Јереван + + + Кирасо + + + Луанда + + + Ротера + + + Палмер + + + Јужни пол + + + Шова + + + Мосон + + + Дејвис + + + Восток + + + Касеј + + + Димон д’Урвил + + + Макмурдо + + + Рио Гелегос + + + Мендоза + + + Сан Хуан + + + Ушуаија + + + Ла Риоја + + + Сан Луи + + + Катамарка + + + Салта + + + Жужуи + + + Тукуман + + + Кордоба + + + Буенос Аирес + + + Паго Паго + + + Беч + + + Перт + + + Иукла + + + Дарвин + + + Аделаида + + + Брокен Хил + + + Курие + + + Мелбурн + + + Хобарт + + + Линдеман + + + Сиднеј + + + Бризбејн + + + Лорд Хов + + + Аруба + + + Баку + + + Барбадос + + + Дака + + + Брисел + + + Уагадугу + + + Софија + + + Бахреин + + + Буџумбура + + + Порто Ново + + + Бермуди + + + Брунеји + + + Ла Паз + + + Еирунепе + + + Рио Бранко + + + Порто Вељо + + + Боа Виста + + + Манаус + + + Куиаба + + + Сантарем + + + Кампо Гранде + + + Белем + + + Арагвајана + + + Сао Паоло + + + Бахиа + + + Форталеза + + + Масејо + + + Ресифе + + + Нороња + + + Насау + + + Тхимпху + + + Габорон + + + Минск + + + Белизе + + + Досон + + + Вајтхорс + + + Инувик + + + Ванкувер + + + Досон Крик + + + Едмонтон + + + Свифт Курент + + + Кембриџ Беј + + + Регина + + + Винипег + + + Ресолут + + + Рејни Ривер + + + Ранкин Инлет + + + Корал Харбур + + + Тандер Беј + + + Нипигон + + + Торонто + + + Монтреал + + + Иквалуит + + + Пангниртунг + + + Монктон + + + Халифакс + + + Гус Беј + + + Глејс Беј + + + Бланк-Сејблон + + + Св. Џон + + + Кокосова острва + + + Киншаса + + + Лумумбаши + + + Бангуи + + + Бразавил + + + Цирих + + + Абиџан + + + Раротонга + + + Ускршње острво + + + Сантијаго + + + Дуала + + + Кашгар + + + Урумкви + + + Чонгкинг + + + Шангај + + + Харбин + + + Богота + + + Костарика + + + Хавана + + + Капе Верде + + + Божићно острво + + + Никозија + + + Берлин + + + Џибути + + + Копенхаген + + + Доминика + + + Санто Доминго + + + Алжир + + + Галапагос + + + Гвајакил + + + Талин + + + Каиро + + + Ел Ајун + + + Асмера + + + Канарска острва + + + Сеута + + + Мадрид + + + Адис Абеба + + + Хелсинки + + + Фиџи + + + Стенли + + + Трук + + + Понапе + + + Кошре + + + Фарска Острва + + + Париз + + + Либревил + + + Лондон + + + Гренада + + + Тбилиси + + + Кајен + + + Акра + + + Гибралтар + + + Туле + + + Нук + + + Скорезбисунд + + + Данмарксхаген + + + Банжул + + + Конакри + + + Гвадалупе + + + Малабо + + + Атина + + + Јужна Џорџија + + + Гватемала + + + Гуам + + + Бисао + + + Гуана + + + Хонг Конг + + + Порт-о-Пренс + + + Будимпешта + + + Џакарта + + + Понтианак + + + Макасар + + + Џајапура + + + Даблин + + + Чагос + + + Багдад + + + Техеран + + + Рејкјавик + + + Рим + + + Јамајка + + + Аман + + + Токио + + + Најроби + + + Бишкек + + + Пном Пен + + + Ендербери + + + Киритимати + + + Тарава + + + Коморо + + + Сент Китс + + + Пјонгјанг + + + Сеул + + + Кувајт + + + Кајманска острва + + + Актау + + + Орал + + + Акутобе + + + Кизилорда + + + Алмати + + + Вијетијан + + + Бејрут + + + Св. Луција + + + Вадуц + + + Коломбо + + + Монровија + + + Масеру + + + Виљнус + + + Луксембург + + + Рига + + + Триполи + + + Казабланка + + + Монако + + + Кишњев + + + Антананариво + + + Кваџалејин + + + Мајуро + + + Бамако + + + Рангун + + + Ховд + + + Улан Батор + + + Чојбалсан + + + Макау + + + Сајпан + + + Мартиник + + + Навакшут + + + Монтсерат + + + Малта + + + Маурицијус + + + Малдиви + + + Блантир + + + Тихуана + + + Хермосиљо + + + Мазатлан + + + Чихуахуа + + + Монтереј + + + Мексико Сити + + + Мерида + + + Канкун + + + Куала Лумпур + + + Кучинг + + + Мапуто + + + Виндхук + + + Нумеа + + + Нијамеј + + + Норфолк + + + Лагос + + + Манагва + + + Амстердам + + + Осло + + + Катманду + + + Науру + + + Ниуе + + + Катхам + + + Окланд + + + Мускат + + + Панама + + + Лима + + + Тахити + + + Маркиз + + + Гамбије + + + Порт Морзби + + + Манила + + + Карачи + + + Варшава + + + Микелон + + + Питкаирн + + + Порто Рико + + + Газа + + + Азори + + + Лисабон + + + Палау + + + Асунсион + + + Катар + + + Уједињење + + + Букурешт + + + Калининград + + + Москва + + + Волгоград + + + Самара + + + Јекатеринбург + + + Омск + + + Новосибирск + + + Краснојарск + + + Иркуцк + + + Јакутск + + + Владивосток + + + Сахалин + + + Магадан + + + Камчатка + + + Анадир + + + Кигали + + + Ријад + + + Гвадалканал + + + Махе + + + Картум + + + Стокхолм + + + Сингапур + + + Света Јелена + + + Фритаун + + + Дакар + + + Могадиш + + + Парамирбо + + + Сао Томе + + + Салвадор + + + Дамаск + + + Мбабане + + + Гранд Турк + + + Нџамена + + + Кергелен + + + Ломе + + + Банкок + + + Душанбе + + + Факаофо + + + Дили + + + Ашхабад + + + Тунис + + + Тонгатапу + + + Истанбул + + + Порт оф Спејн + + + Фанафути + + + Тајпеј + + + Дар-ес-Салам + + + Ужгород + + + Кијев + + + Симферопол + + + Запорожје + + + Кампала + + + Мидвеј + + + Џонстон + + + Вејк + + + Адак + + + Ном + + + Хонолулу + + + Енкориџ + + + Жуно + + + Лос Анђелес + + + Бојзи + + + Феникс + + + Шипрок + + + Денвер + + + Нови Салем, Северна Даткоа + + + Центар, Северна Дакота + + + Чикаго + + + Меномини + + + Винценес, Индијана + + + Петерсбург, Индијана + + + Тел Сити + + + Кнокс, Индијана + + + Винамак, Индијана + + + Маренго, Индијана + + + Индианаполис + + + Луивиле + + + Вевај, Индијана + + + Монтичело, Кентаки + + + Детроит + + + Њујорк + + + Монтевидео + + + Самарканд + + + Ташкент + + + Сент Винсент + + + Каракас + + + Тортола + + + Св. Тома + + + Ефате + + + Валис + + + Апија + + + Аден + + + Мајоте + + + Јоханесбург + + + Лусака + + + Хараре + + + + Акре време + Акре летње рачунање времена + + + ACT (Aкре) + ACST (Aкре) + + + + + Централно-афричко време + + + + + Источно-афричко време + + + + + Јужно-афричко време + Јужно-афричко стандардно време + + + + + Западно-афричко време + Западно-афричко летње рачунање времена + + + + + Актјубинск време + Актјубинск летње рачунање времена + + + + + Алмати време + Алмати летње рачунање времена + + + + + Амазон време + Амазон летње рачунање времена + + + + + Централно време + Централно стандардно време + Централно летње рачунање времена + + + + + Источно време + Источно стандардно време + Источно летње рачунање времена + + + + + Планинско време + Планинско стандардно време + Планинско летње рачунање времена + + + + + Пацифичко време + Пацифичко стандардно време + Пацифичко летње рачунање времена + + + + + Анадир време + Анадир летње рачунање времена + + + + + Акватау време + Акватау летње рачунање времена + + + AQTT (Aкватау) + AQTST (Aкватау) + + + + + Акутобе време + Акутобе летње рачунање времена + + + AQTT (Aктобе) + AQTST (Aктобе) + + + + + Арабијско време + Арабијско стандардно време + Арабијско летње рачунање времена + + + AT (Арабијско) + AST (Арабијско) + ADT (Арабијско) + + + + + Аргентина време + Аргентина летње рачунање времена + + + + + Западна Аргентина време + + + + + Арменија време + Арменија летње рачунање времена + + + AMT (Aрменија) + AMST (Aрменија) + + + + + Ашкаб±ад време + Ашкабад летње рачунање времена + + + + + Атланско време + Атланско стандардно време + Атланско лтње рачунање времена + + + + + Аустралијско централно време + Аустралијско централно стандардно време + Аустралијско централно летње рачунање времена + + + + + Аустралијско централно западно време + Аустралијско централно западно стандардно време + Аустралијско централно западно летње рачунање времена + + + + + Аустралијско источно време + Аустралијско источно стандардно време + Аустралијско источно летње рачунање времена + + + + + Аустралијско западно време + Аустралијско западно стандардно време + Аустралијско западно летње рачунање времена + + + + + Азербејџан време + Азербејџан летње рачунање времена + + + + + Азори време + Азори летње рачунање времена + + + + + Баку време + Баку летње рачунање времена + + + + + Бангладеш време + + + + + Беринг време + Беринг стандардно време + Беринг летње рачунање времена + + + BT (Беринг) + BST (Беринг) + BDT (Беринг) + + + + + Бутан време + + + + + Боливија време + + + + + Борнео време + Борнео летње рачунање времена + + + + + Бразилија време + Бразилија летње рачунање времена + + + + + Брунеј Дарусалум време + + + + + Зелениртско време + Зеленортско летње рачунање времена + + + + + Чаморо време + Чаморо стандардно време + + + + + Чангбаи време + + + + + Чатам стандардно време + Чатам летње рачунање времена + + + + + Чиле време + Чиле летње рачунање времена + + + + + Кина време + Кинеско стандардно време + Кина летње рачунање времена + + + CT (Кина) + CST (Кина) + CDT (Кина) + + + + + Чојбалсан време + Чојбалсан летње рачунање времена + + + + + Божићна острва време + + + + + Кокос (Келинг) Острва време + + + + + Колумбија време + Колумбија летње рачунање времена + + + + + Кукова острва време + Кукова острва полу-летње рачунање времена + + + + + Куба време + Куба стандардно време + Куба летње рачунање времена + + + + + Дача време + + + + + Дејвис време + + + + + Димон д’Урвил време + + + + + Душанбе време + Душанбе летње рачунање времена + + + + + Холандска Гвајана време + + + + + Источни тимор време + + + + + Ускршња острва време + Ускршња острва летње рачунање времена + + + + + Еквадор време + + + + + Средњеевропско време + Средњеевропско летње рачунање времена + + + + + Источноевропско време + Источноевропско летње рачунање времена + + + + + Западноевропско време + Западноевропско летње рачунање времена + + + + + Фолкландска Острва време + Фолкландска Острва летње рачунање времена + + + + + Фиџи време + Фиџи летње рачунање времена + + + + + Француска Гвајана време + + + + + Француско јужно и антарктичко време + + + + + Фрунзе време + Фрунзе летње рачунање времена + + + + + Гринвич средње време + + + + + Галапагос време + + + + + Гамбијер време + + + + + Грузија време + Грузија летње рачунање времена + + + + + Гилберт острва време + + + + + Централни Гренланд време + Централни Гренланд летње рачунање времена + + + + + Источни Гренланд време + Источни Гренланд летње рачунање времена + + + + + Западни Гренланд време + Западни Гренланд летње рачунање времена + + + + + Гуам стандардно време + + + GST (Гуам) + + + + + Залив време + Залив стандардно време + + + + + Гвајана време + + + + + Хавајско-алеућанско стандардно време + + + + + Хонг Конг време + Хонгконшко летње рачунање времена + + + + + Ховд време + Ховд летње рачунање времена + + + + + Индијско стандардно време + + + + + Индијско океанско време + + + + + Индокина време + + + + + Централно-индонезијско време + + + + + Источно-индонезијско време + + + + + Западно-индонезијско време + + + + + Иран стандардно време + Иран летње рачунање времена + + + + + Иркуцк време + Иркуцк летње рачунање времена + + + + + Израелско стандардно време + Израелско летње рачунање времена + + + + + Јапанско стандардно време + Јапанско летње рачунање времена + + + + + Петропавловско-камчатско време + Петропавловско-камчатско летње рачунање вемена + + + + + Карачи време + + + + + Кашгар време + + + + + Источно-казахстанско време + Источно-казахстанско стандардно време + + + + + Западно-казахстанско време + Западно-казахстанско стандардно време + + + + + Кизилорда време + Кизилорда летње рачунање времена + + + + + Кореја време + Корејско стандардно време + Корејско летње рачунање времена + + + + + Кошре време + + + + + Краснојарск време + Краснојарсклетње рачунање времена + + + + + Кујбишев време + Кујбишев летње рачунање времена + + + + + Кваџалејин време + + + + + Киргизстан време + + + + + Шри Ланка време + + + + + Лине Острва време + + + + + Лонг Шу време + + + + + Лорд Хов време + Лорд Хов стандардно време + Лорд Хов летње рачунање времена + + + + + Макао време + Макао летње рачунање вемена + + + + + Магадан време + + + + + Малаја време + + + + + Малезија време + + + + + Малдиви време + + + + + Маркиз време + + + + + Маршалска Острва време + + + + + Маурицијус време + Маурицијус летње рачунање времена + + + + + Мосон време + + + + + Улан Батор време + Улан Батор летње рачунање времена + + + + + Москва време + Москва стандардно време + Москва летње рачунање времена + + + + + Мијанмар време + + + + + Науру време + + + + + Непал време + + + + + Нова Каледонија време + Нова Каледонија летње рачунање времена + + + + + Нови Зеланд време + Нови Зеланд стандардно време + Нови Зеланд летње рачунање времена + + + + + Њуфаундленд време + Њуфаундленд стандардно време + Њуфаундленд летње рачунање времена + + + + + Ниуе време + + + + + Норфолк Острво време + + + + + Фернандо де Нороња време + Фернандо де Нороња летње рачунање времена + + + + + Северна Маријанска Острва време + + + + + Новосибирск време + Новосибирск летње рачунање времена + + + + + Омск време + Омск летње рачунање времена + + + + + Пакистан стандардно време + Пакистан летње рачунање времена + + + + + Папуа Нова Гвинеја време + + + + + Парагвај време + Парагвај летње рачунање времена + + + + + Перу време + Перу летње рачунање времена + + + + + Филипини време + Филипини летње рачунање времена + + + + + Феникс острва време + + + + + Пјер и Микелон време + Пјер и Микелон стандардно време + Пјер и Микелон летње рачунање вемена + + + + + Питкерн време + + + + + Понапе време + + + + + Кизилорда време + Кизилорда летње рачунање времена + + + + + Реинион време + + + + + Ротера време + + + + + Сахалин време + Сахалин летње рачунање времена + + + + + Самара време + Самара стандардно време + Самара летње рачунање времена + + + + + Самарканд време + Самарканд летње рачунање времена + + + + + Самоа стандардно време + + + + + Сејшели време + + + + + Шевченко време + Шевченко летње рачунање времена + + + + + Сингапур стандардно време + + + + + Соломонска Острва време + + + + + Јужна Џорџија време + + + + + Суринам време + + + + + Свердловск време + Свердловск летње рачунање времена + + + + + Шова време + + + + + Тахити време + + + + + Таџикистан време + + + + + Ташкент време + Ташкент летње рачунање времена + + + + + Тбилиси време + Тбилиси летње рачунање времена + + + + + Токелау време + + + + + Тонга време + Тонга летње рачунање времена + + + + + Трук време + + + + + Турска време + Турска летње рачунање времена + + + + + Туркменистан време + Туркменистан летње рачунање времена + + + + + Тувалу време + + + + + Уралск време + Уралск летње рачунање времена + + + + + Уругвај време + Уругвај летње рачунање времена + + + + + Урумки време + + + + + Узбекистан време + Узбекистан летње рачунање времена + + + + + Вануату време + Вануату летње рачунање времена + + + + + Венецуела време + + + + + Владивосток време + Владивосток летње рачунање времена + + + + + Волгоград време + Волгоград летње рачунање времена + + + + + Восток време + + + + + Вејк острво време + + + + + Валис и Футуна Острва време + + + + + Јакутск време + Јакутск летње рачунање времена + + + + + Јекатеринбург време + Јекатеринбург летње рачунање времена + + + + + Јереван време + Јереван летње рачунање времена + + + + + Јукон време + Јукон стандардно време + Јукон летње рачунање времена + + + + + + + . + , + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + {0} {1} + {0} {1} + + + + Андорска пезета + андорске пезете + андорских пезета + андорска пезета + андорске пезете + + + Уједињени арапски емирати дирхам + УАЕ дирама + УАЕ дирама + УАЕ дирам + УАЕ дирама + + + Авганистански авган (1927-2002) + aвганистанска авгана (AFA) + aвганистанских авгана (AFA) + авганистански авган (AFA) + авганистанских авгана (AFA) + + + Авганистански авган + авганистанска авгана + авганистанских авгана (AFN) + авганистански авган + авганистански авгани + + + Албански лек + Албанске леке + Албанских лека + албански лек + + + Јерменски драм + Јерменска драма + Јерменских драма + јерменски драм + + + Холандски антили гилдер + холандска антила + холандско-антилских гилдера + холандско-антилски гилдер + холандско-антилских гилдера + + + aнголијска кванза + анголијске кванзе + анголијских кванзи + анголијска кванза + анголијских кванзи + + + aнголијска кванза (1977-1990) + анголијске кванзе (AOK) + анголијских кванзи (AOK) + анголијска кванза (AOK) + анголијских кванзи (AOK) + + + Анголијска нова кванза (1990-2000) + анголијске нове кванзе + анголијских нових кванзи + анголијска нова кванза + анголијских нових кванзи + + + Анголска кванза реађустадо (1995-1999) + анголијске кванзе реађустадо + анголијских кванзи реађустадо + анголијска кванза реађустадо + анголијских кванзи реађустадо + + + Аргентински аустрал + аргентинска аустрала + аргентинских аустрала + аргентински аустрал + аргентинских аустрала + + + aргентински пезо (1983-1985) + аргентинска пезоса (ARP) + аргентинских пезоса (ARP) + аргентински пезо + аргентинских пезоса (ARP) + + + aргентински пезо + аргентинска пезоса + аргентинских пезоса + аргентински пезос + аргентинских пезоса + + + Аустријски шилинг + аустријска шилинга + аустријских шилинга + аустријски шилинг + аустријских шилинга + + + Аустралијски долар + Аустралијска долара + Аустралијских долара + аустралијски долар + аустралијских долара + + + Арубански флорин + арубанска флорина + арубанских флорина + арубански флорин + арубанских флорина + + + Азербејџански манат (1993-2006) + азербејџанска маната (AZM) + азербејџанских маната (AZM) + азербејџански манат (AZM) + азербејџанских маната (AZM) + + + Азербејџански манат + азербејџанска маната + азербејџанских маната + азербејџански манат (AZN) + азербејџанских маната + + + Босанско-Херцеговачки динар + босанско-херцеговачка динара + босанско-херцеговачких динара + босанско-херцеговачки динар + босанско-херцеговачких динара + + + Конвертибилна марка + босанско-херцеговачке конвертибилне марк + босанско-херцеговачких конвертабилних марака + босанско-херцеговачка конвертибилна марка + босанско-херцеговачких конвертибилних марака + + + Барбадошки долар + барбадошка долара + барбадошких долара + барбадошки долар + барбадошких долара + + + Бангладешка така + бангладешке таке + бангладешких така + бангладешка така + бангладешких така + + + Белгијски франак (конвертибилни) + белгијска франка (конвертибилна) + белгијских франака (конвертибилних) + белгијски франак (конвертибилни) + белгијских франака (конвертибилних) + + + Белгијски франак + белгијска франка + белгијских франака + белгијски франак + белгијских франака + + + Белгијски франак (финансијски) + белгијска франка (финансијска) + белгијских франака (финансијских) + белгијски франак (финансијски) + белгијских франака (финансијских) + + + Бугарски тврди лев + бугарска тврда лева + бугарских тврдих лева + бугарски тврди лев + бугарских тврдих лева + + + Бугарски лев + бугарска лева + бугарских лева + бугарски лев + бугарских лева + + + Бахреински динар + бахреинских динара + бахреинских динара + бахреинских динара + + + Бурундски франак + бурундска франка + бурундских франака + бурундски франак + бурундски франци + + + Бермудски долар + бермудска долара + бермудских долара + бермудски долар + бермудских долара + + + Брунејски долар + брунејска долара + брунејских долара + брунејски долар + брунејских долара + + + Боливијски Боливиано + боливијска боливиана + боливијских боливиана + боливијски боливиано + боливијских боливиана + + + Боливијски пезо + боливијска пезоса + боливијских пезоса + боливијски пезо + боливијских пезоса + + + Боливијски мвдол + боливијска мвдола + боливијских мвдола + боливијски мвдол + боливијских мвдола + + + Бразилски нови крузеиро (1967-1986) + бразилска нова крузеира + бразилских нових крузеира + бразилски нови крузеиро + бразилских нових крузеира + + + Бразилијски крузадо + бразилска крузадоса + бразилских крузадоса + бразилски крузадос + бразилских крузадоса + + + Бразилски крузеиро (1990-1993) + бразилска крузеира (BRE) + бразилских крузеира (BRE) + бразилски крузеиро (BRE) + бразилских крузеира (BRE) + + + Бразилски Реал + бразилска реала + бразилских реала + бразилски реал + бразилских реала + + + Бразилијски нови крузадо + бразилска нова крузада + бразилских нових крузада + бразилски нови крузадо + бразилских нових крузада + + + Бразилски крузеиро + бразилска крузеира + бразилских крузеира + бразилски крузеиро + бразилских крузеира + + + Бахамски долар + бахамска долара + бахамских долара + бахамски долар + бахамских долара + + + Бутански нгултрум + бутанска нгултрумa + бутанских нгултрумa + бутански нгултрум + бутанских нгултра + + + Бурмански кјат + бурманска кјата + бурманских кјата + бурмански кјат + бурманских кјата + + + Боцванска пула + боцванске пуле + боцванских пула + боцванска пула + боцванских пула + + + Белоруска нова рубља (1994-1999) + белоруске нове рубља + белоруских нових рубљи + белоруска нова рубља + белоруских нових рубљи + + + Белоруска рубља + белоруске рубље + белоруских рубљи + белоруска рубља + белоруске рубље + + + Белизе долар + белизеанска долара + белизеанских долара + белизеански долар + белизеанских долара + + + Канадски долар + канадска долара + Канадских долара + канадски долар + канадских долара + + + Конголски франак + конголска франка + конголских франака + конголски франак + конголских франака + + + WIR евро + WIR евра + WIR евра + WIR евро + WIR евра + + + Швајцарски франак + швајцарска франка + швајцарских франака + швајцарски франак + швајцарских франака + + + WIR франак + WIR франка + WIR франака + WIR франак + WIR франака + + + Чилеовски унидадес се фоменто + чилеанска унидадес де фомента + чилеанских унидадес де фомента + чилеански унидадес де фоменто + чилеански унидадеси де фоменто + + + Чилеански пезо + чилеанска пезоса + чилеанских пезоса + чилеански пезо + чилеански пезоси + + + Кинески јуан ренминби + кинеска јуан + кинеских јуанa + кинески јуан + кинеских јуанa + + + Колумбијски пезо + колумбијска пезоса + колумбијских пезоса + колумбијски пезо + + + Унидад де валоршки реал + нидад де валор реала + унидад де валоршких реала + унидад де валоршки реал + унидад де валоршких реала + + + Костарикански колон + костариканска колона + костариканских колона + костарикански колон + костарикански колони + + + Стари српски динар + стара српска динара + старих српских динара + стари српски динар + старих српских динара + + + Чехословачка тврда круна + чехословачке тврде круне + чехословачких тврдих круна + чехословачка тврда круна + чехословачких тврдих круна + + + Кубански пезо + кубанска пезоса + кубанских пезоса + кубански пезос + кубанских пезоса + + + Зеленортски ескудо + зеленортска ескуда + зеленортских ескуда + зеленортски ескудо + зеленортских ескуда + + + Кипарска фунта + кипарске фунте + кипарских фунти + кипарска фунта + кипарских фунти + + + Чешка круна + чешке круне + чешких крунa + чешка круна + чешких круне + Кч + + + Источно-немачка марка + источно-немачке марке + источно-немачких марака + источно-немачка марка + источно-немачких марака + + + Немачка марка + немачке марке + немачких марака + немачка марка + немачких марака + + + Џибутански франак + џибутска франка + џибутских франака + џибутски франак + џибутски франци + + + Данска круна + данске круне + данских круна + данска круна + данских круна + + + Доминикански пезо + доминиканска пезоса + доминиканских пезоса + доминикански пезо + доминиканских пезоса + + + Алжирски динар + алжирска динара + алжирских динара + алжирски динар + алжирских динара + + + Еквадорски сакр + еквадорска сакра + еквадорских сакра + еквадорски сакр + еквадорских сакра + + + Еквадорски унидад де валор константе + еквадорска унидад де валор константа + еквадорских унидад де валор константа + еквадорски унидад де валор константе + еквадорских унидад де валор константа + + + Естонска кроон + естонске круне + естонских круна + естонска круна + естонских круна + + + Египатска фунта + египатске фунте + египатских фунти + египатска фунта + ег³³ипатских фунти + + + Еритреанска накфа + еритрејске накфе + еритрејских накфи + еритрејска накфа + еритреанских накфки + + + Шпанска пезета (рачун) + шпанске пезете (А рачун) + шпанских пезета (А рачун) + шпанска пезета (А рачун) + шпанских пезета (А рачун) + + + Шпанска пезета (конвертибилнирачун) + шпанске пезете (конвертибилан рачун) + шпанских пезета (конвертибилан рачун) + шпанска пезета (конвертибилан рачун) + шпанских пезета + + + Шпанска пезета + шпанска пезета + шпанских пезета (ESP) + шпанска пезета + шпанске пезете + + + етиопијски бир + етиопијска бира + етиопијских бира + етиопијски бир + етиопијских бира + + + Евро + евра + евра + евро + евра + + + Финска марка + финске марке + финских марака + финска марка + финских марака + + + Фиџи долар + фиџи долара + фиџи долара + фиџи долар + фиџи долара + + + Фокландска острва фунта + фолкландске фунте + фолкландских фунти + фолкландска фунта + фолкландских фунти + + + Француски франак + француска франка + француских франака + француски франак + француских франака + + + Британска фунта стерлинга + британске фунте стерлинга + британских фунти стерлинга + британска фунта стерлинга + британских фунти стерлинга + + + Грузијски купон ларит + грузијска купон ларита + грузијских купон ларита + грузијски купон ларит + грузијских купон ларита + + + Грузијски лари + грузијска лариса + грузијских лариса + грузијски ларис + грузијских лариса + + + гански цеди (1979-2007) + ганска цеда (GHC) + ганских цеда (GHC) + гански цед (GHC) + ганских цеда (GHC) + + + Гански цеди + ганска цеда + ганских цеда + гански цед + ганских цеда + + + Гибралташка фунта + гибралтарске фунте + гибралтарских фунти + гибралтарска фунта + гибралтарских фунти + + + Гамбијски даласи + гамбијска даласа + гамбијских даласа + гамбијски далас + гамбијских даласа + + + Гвинејски франак + гвинејска франка + гвинејских франака + гвинејски франак + гвинејски франци + + + Гвинејски сили + гвинејска сила + гвинејских сила + гвинејски сили + гвинејских сила + + + Екваторијално-гвинејски еквеле + екваторијално-гвинејска еквела + екваторијално-гвинејских еквела + екваторијално-гвинејски еквеле + екваторијално-гвинејских еквела + + + Грчка драхма + грчке драхме + драхми + грчка драхма + грчких драхми + + + Гватемалски квецал + гватемалска квецала + гватемалских квецала + гватемалски квецал + гватемалских квецала + + + португалска гвинеја ескудо + португалско-гвинејска ескуда + португалских гвинеја ескудо + португалско-гвинејски ескудо + португалско-гвинејских ескуда + + + Гвинеја Бисао Пезо + гвинеја-бисаошка пезоса + гвинеја-бисаошких пезоса + гвинеја-бисаошки пезо + гвинеја-бисаошких пезоса + + + Гујански долар + гвајанска долара + гвајанских долара + гвајански долар + GYD + + + Хонгконшки долар + хонгконшка долара + хонгконшких долара + хонгконшки долар + хонгконшких долара + + + Хондурашка лемпира + хондурашка лемпира + хондурашких лемпира + хондурашки лемпир + хондурашких лемпира + + + Хрватски динар + хрватска динара + хрватских динара + хрватски динар + хрватских динара + + + Хрватска куна + хрватске куне + хрватских куна + хрватска куна + хрватских куна + + + Хаићански гурд + хаићанска гурда + хаићанских гурда + хаићански гурд + хаићанских гурда + + + Мађарска форинта + мађарске форинте + мађарских форинти + мађарска форинта + мађарске форинте + + + Индонезијска рупиа + индонежанске рупије + индонежанских рупија + индонежанска рупија + индонежанске рупије + + + Ирска фунта + ирске фунте + ирских фунти + ирска фунта + ирских фунти + + + Израелска фунта + израелске фунте + израелских фунти + израелска фунта + израелских фунти + + + стари израелски шекели + стари израелски шекели + стари израелски шекели + стари израелски шекели + стари израелски шекели + + + Израелски нови шекел + израелска нова шекела + израелских нових шекела + израелски нови шекел + израелских нових шекела + + + Индијски Рупи + индијске рупије + индијских рупија + индијска рупија + индијских рупија + + + Ирачки динар + ирачка динара + ирачких динара + ирачки динар + ирачки динари + + + Ирански риал + иранска ријала + иранских ријала + ирански ријал + иранијски ријали + + + стара исландска круна + стара исландска круна + стара исландска круна + стара исландска круна + стара исландска круна + + + Исландска круна + исландске круне + исландских круна + исландска круна + исландске круне + + + Италијанска лира + италијанске лире + италијанских лира + италијанска лира + италијанске лире + + + Јамајски долар + јамајска долара + јамајских долара + јамајски долар + јамајских долара + + + Јордански динар + јорданских динара + јорданских динара + јорданских динара + јорданских динара + + + Јапански јен + јапанска јена + јапанских јена + јапански јен + јапански јен + ¥ + + + Кенијски шилинг + кенијска шилинга + кенијских шилинга + кенијски шилинг + кенијских шилинга + + + Киргистански сом + киргистанска сома + киргистанских сома + киргистански сом + киргистанских сома + + + Камбоџијски риел + камбоџанска ријела + камбоџанских ријела + камбоџански ријел + камбоџанских ријела + + + Коморски франак + коморанска франка + коморанских франака + коморански франак + коморански франци + + + Севернокорејски вон + севернокорејска вона + севернокорејских вона + севернокорејски вон + севернокорејски вон + + + Јужнокорејски Вон + јужнокорејска вона + јужнокорејских вона + јужнокорејски вон + јужнокорејски вон + + + Кувајтски динар + кувајтских динара + кувајтских динара + кувајтских динара + кувајтских динара + + + Кајманска острва долар + кајманска долара + кајманских долара + кајмански долар + кајманских долара + + + Казахстански тенџ + казахстанске тенџе + казахстанских тенџи + казахстанска тенџа + казахстанских тенџи + + + Лаошки кип + лаошка кипа + лаошких кипа + лаошки кип + лаошки кипи + + + Лебанска фунта + лебанске фунте + лебанских фунти + лебанска фунта + лебанске фунте + + + Шриланкански рупи + шриланканска рупија + шриланканских рупија + шриланкански рупиј + шриланканских рупија + + + Либеријски долар + либеријска долара + либеријских долара + либеријски долар + либеријских долара + + + Лесото лоти + лесотска лотиса + лесотских лотиса + лесотски лотис + лесотских лотиса + + + Литвански литас + литванска литаса + литванских литаса + литвански литас + литванских литаса + + + Литвански талонас + литванска талонаса + литванских талонаса + литвански талонас + литванских талонаса + + + Луксембуршки конвертибилни франак + луксембуршка конвертибилна франка + луксембуршких конвертибилних франака + луксембуршки конвертибилни франак + луксембуршких конвертибилних франака + + + Луксембуршки франак + луксембуршка франка + луксембуршких франака + луксембуршки франак + луксембуршки франци + + + Луксембуршки финансијски франак + луксембуршка финансијска франка + луксембуршких финансијских франака + луксембуршки финансијски франак + луксембуршких финансијских франака + + + Латвијски лати + латвијска лата + латвијских лата + латвијски лат + латвијских лата + + + атвијска рубља + латвијске рубље + латвијских рубљи + латвијска рубља + латвијских рубљи + + + Либијски динар + либијских динара + либијских динара + либијских динара + либијских динара + + + Марокански дирхам + мароканске дирхаме + мароканских дирхама + мароканска дирхама + мароканских дирхама + + + Марокански франак + мароканска франка + мароканских франака + марокански франак + мароканских франака + + + Молдовски љу + молдовска леија + молдовских леија + молдовски леи + молдовских леија + + + Малагасијски ариари + малагашајска ариарија + малагашајских ариарија + малагашајски ариариј + малагашајски ариарији + + + Малагасијски франак + малагашајска франка + малагашајских франака + малагашајски франак + малагашајски франци + + + Македонски денар + македонска денара + македонских денара + македонски денар + македонских динара + + + Малијански франак + малијска франка + малијских франака + малијски франак + малијских франака + + + Мјанмашки кјат + мијанмашка кјата + мијанмашких кјата + мијанмашки кјат + мијанмашки кјати + + + Монголски тугрик + монголијска тугрика + монголијских тугрика + монголијски тугрик + монголијски тугрици + + + Маканишка патака + маканешке патаке + маканешких патака + маканешка патака + маканешких патака + + + Мауританијска угвија + мауританијске угвиље + мауританијских угвиља + мауританијска угвиља + мауританијске угвиље + + + Малтешка лира + малтешке лире + малтешких лира + малтешка лира + малтешких лира + + + Малтешка фунта + малтешке фунте + малтешких фунти + малтешка фунта + малтешких фунти + + + Маурицијски рупи + мауританијске рупије + мауританијских рупија + мауританијска рупија + мауританијске рупије + + + Малдивијска руфија + малдивска руфијаса + малдивских руфијаса + малдивски руфијас + малдивских руфијаса + + + Малавијска квача + малавијске кваче + малавијских квача + малавијска квача + малавијских квача + + + Мексички пезо + мексичка пезоса + мексичких пезоса + мексички пезо + мексичких пезоса + + + Мексички сребрни пезо (1861-1992) + мексичка сребрна пезоса + мексичких сребрних пезоса + мексички сребрни пезо + мексичких сребрних пезоса + + + Мексички унидад де инверсион (UDI) + мексичка унидадс де инверзиона + мексичких унидадс де инверзиона + мексички унидадс де инверзион + мексичких унидадс де инверзиона + + + Малезијски ринггит + малезијска ринггита + малезијских ринггита + малезијски ринггит + малезијских ринггита + + + Мозамбијски ескудо + мозамбијска ескуда + мозамбијских ескуда + мозамбијски ескудо + мозамбијских ескуда + + + Стари мозамбијски метикал + стара мозамбијска метикала + старих мозамбијских метикала + стари мозамбијски метикал + старих мозамбијских метикала + + + Мозамбијски метикал + мозамбијска метикала + мозамбијских метикала + мозамбијски метикал + мозамбијских метикала + + + намбијски долар + намибијска долара + намибијских долара + намибијски долар + намибијских долара + + + Нигеријска наира + нигеријске наире + нигеријских наира + нигеријска наира + нигеријских наира + + + Никарагванска кордоба + никарагванске кордобе + никарагванских кордоба + никарагванска кордоба + никарагванских кордоба + + + Никарагванска златна кордоба + никарагванске златне кордобе + никарагванских златних кордоба + никарагванска златна кордоба + никарагванских златних кордоба + + + Холандски гулден + холандска гулдена + холандских гулдена + холандски гулден + холандских гулдена + + + Норвешка круна + норвешке круне + норвешких круна + норвешка круна + норвешких круна + + + Непалски рупи + непалске рупије + непалских рупија + непалска рупија + непалских рупија + + + Новозеландски долар + новозеландска долара + новозеландских долара + новозеландски долар + новозеландских долара + + + Омански ријал + оманских ријала + оманских ријала + оманских ријала + оманских ријала + + + Панамска балбоа + панамске балбое + панамских балбоа + панамска балбоа + панамских балбоа + + + Перуански инти + перувијска интија + перувијских интија + перувијски инти + перувијских интија + + + Перуански нуево сол + перуанска нуево сола + перуанских нуево сола + перуански нуево сол + перуанских нуево сола + + + Перуански сол + перуанска сола + перуанских сола + перуански сол + перуанских сола + + + Папуа ново-гвинејшка кина + папуа ново гвинејска долара + папуа ново гвинејских долара + папуа ново гвинејски долар + папуа ново гвинејских долара + + + Филипински пезо + филипинска пезоса + филипинских пезоса + филипински пезо + филипинских пезоса + + + Пакистански рупи + пакистанске рупије + пакистанских рупија + пакистанска рупија + пакистанске рупије + + + Пољски злот + пољска злота + пољских злота + пољски злот + пољских злота + зл + + + Пољски злоти (1950-1995) + пољска злота (PLZ) + пољских злота (PLZ) + пољски злот (PLZ) + пољских злота (PLZ) + + + Португалски ескудо + португалска ескуда + португалских ескуда + португалски ескудо + португалских ескуда + + + Парагвајски гуарни + парагвајска гваранија + парагвајских гваранија + парагвајски гвараниј + парагвајски гваранији + + + Катаршки ријал + катарска ријала + катарских ријала + катарски ријал + катарских ријала + + + Родејскидолар + родежанска долара + родежанских долара + родежански долар + родежанских долара + + + Стари румунски љу + стара румунска леија + старих румунских леија + стари румунски леиј + старих румунских леија + + + Румунски леу + румунска леија + румунских леија + румунски леи + румунских леија + + + Српски динар + српска динара + српских динара + српски динар + српски динари + дин. + + + Руска рубља + руске рубље + руских рубљи + руска рубља + руских рубљи + + + Руска рубља (1991-1998) + руске рубље (1991-1998) + руских рубљи (RUR) + руска рубља (1991-1998) + руских рубљи (RUR) + + + Руандански франак + руанданска франка + руанданских франака + руандански франак + руандански франци + + + Саудијски ријал + саудијска ријала + саудијских ријала + саудијски ријал + саудијских ријала + + + Соломонско-острвски долар + соломонско-острвска долара + соломонско-острвских долара + соломонско-острвски долар + соломонско-острвских долара + + + Сејшелска рупија + сејшелске рупије + сејшелских рупија + сејшелска рупија + сејшелских рупија + + + Стари судански динар + стара суданска динара + старих суданских динара + стари судански динар + старих суданских динара + + + Суданска фунта + суданске фунте + суданских фунти + суданска фунта + суданских фунти + + + Стара суданска фунта + старе суданске фунте + старих суданских фунти + стара суданска фунта + старих суданских фунти + + + Шведска круна + шведске круне + шведских круна + шведска круна + шведских круна + + + Сингапурски долар + сингапурска долара + сингапурских долара + сингапурски долар + сингапурских долара + + + Св. јеленска фунта + св. јеленске фунте + св. јеленских фунти + св. јеленска фунта + св. јеленских фунти + + + Словеначки толар + словеначка толара + словеначких толара + словеначки толар + словеначких толара + + + Словачка круна + словачке круне + словачких круна + словачка круна + словачких круна + + + Сијера-леоншки леоне + сијералеонска леона + сијералеонских леона + сијералеонски леоне + сијералеонски леони + + + СОмалијски шилинг + сомалијска шилинга + сомалијских шилинга + сомалијски шилинг + сомалијски шилинзи + + + СУринамски долар + суринамска долара + суринамских долара + суринамски долар + суринамских долара + + + Суринамски гилдер + суринамска гилдера + суринамских гилдера + суринамски гилдер + суринамских гилдера + + + Сао Томе и Принципе добра + сао томе и принципе добра + сао томе и принципе добра + сао томе и принципе добар + сао томе и принципе добри + + + Совјетска рубља + совјетске рубље + совјетских рубљи + совјетска рубља + совјетских рубљи + + + Салвадорски колон + салвадорска колона + салвадорских колона + салвадорски колон + салвадорских колона + + + Сиријска фунта + сиријске фунте + сиријских фунти + сиријска фунта + сиријске фунте + + + Свази лилангени + свази емалангена + свази емалангена + свази емаланген + свази емалангена + + + Таи бахт + таи бахта + таи бахта + таи бахт + таи бахта + + + Таџихистанска рубља + таџихистанске рубље + таџихистанских рубљи + таџихистанска рубља + таџихистанских рубљи + + + Таљихистански сомони + таџихистанска сомона + таџихистанских сомона + таџихистански сомон + таџихистанских сомона + + + Туркменистански манат + туркменистанска маната + туркменистанских маната + туркменистански манат + туркменистански манат + + + Тунизијски долар + тунежанских динара + тунежанских динара + тунежанских динара + тунежанских динара + + + Тонгоншка Панга + тонгашке панге + тонгашких панга + тонгашка панга + тонгашких панга + + + Тиморшки ескудо + тиморшка ескуда + тиморшких ескуда + тиморшки ескудо + тиморшких ескуда + + + Стара турска лира + старе турске лире + старих турских лира + стара турска лира + стара турска лира + + + Турска лира + турске лире + турских лира + турска лира + турских лира + Тл + + + Тринидад тобагошки долар + тринидад-тобагошка долара + тринидад-тобагошких долара + тринидад-тобагошки долар + тринидад-тобагошких долара + + + Нови тајвански долар + нова тајванска долара + нових тајванских долара + нови тајвански долар + нови тајвански долари + + + Танзанијски шилинг + танзанијска шилинга + танзанијских шилинга + танзанијски шилинг + танзанијски шилинзи + + + Украјинска хривња + украјинске кривње + украјинских кривњи + украјинска кривња + украјинских кривњи + + + Украјински карбованети + украјинска карбованцива + украјинских карбованцива + украјински карбованец + украјинских карбованцива + + + Угандски шилинг (1966-1987) + угандијска шилинга (UGS) + угандијских шилинга (UGS) + угандијски шилинг (UGS) + угандијских шилинга (UGS) + + + Угандски шилинг + угандијска шилинга + угандијских шилинга + угандијски шилинг + угандијски шилинзи + + + Амерички долар + америчка долара + америчких долара + амерички долар + америчких долара + + + САД долар (следећи дан) + САД долара (следећи дан) + САД долара (следећи дан) + САД долар (следећи дан) + САД долара (следећи дан) + + + САД долар (исти дан) + САД долара (исти дан) + САД долара (исти дан) + САД долар (исти дан) + САД долара (исти дан) + + + Уругвајски пезо ен унидадес индексадас + уругвајска пезоса ен унидадес индексадеса + уругвајских пезоса ен унидадес индексадеса + уругвајски пезо ен унидадес индексадес + угвајских пезоса ен унидадес индексадеса + + + Уругвајски пезо (1975-1993) + уругвајска пезоса (UYP) + уругвајских пезоса (UYP) + уругвајски пезо (UYP) + уругвајских пезоса (UYP) + + + Уругвајски пезо + уругвајска пезоса + уругвајских пезоса + уругвајски пезо + уругвајских пезоса + + + Узбекистански сом + узбекистанска сома + узбекистанских сома + узбекистански сом + узбекистански сом + + + Венецуелански боливар + венецуеланска боливара + венецуеланских боливара + венецуелански боливар + венецуеланских боливара + + + Венецуелански боливар фуерте + венецуеланска боливара фуертес + венецуеланских боливара фуертес + венецуелански боливар фуертес + венецуеланских боливара фуертес + + + Вијетнамски донг + вијетнамска донга + вијетнамских донга + вијетнамски донг + вијетнамски донг + + + Вануатски вату + вануату ватуа + вануату ватуа + вануату вату + вануату ватуи + + + Самоанска тала + самоанске тале + самоанских тала + самоанска тала + самоанских тала + + + CFA франак BEAC + CFA франка BEAC + CFA франака BEAC + CFA франак BEAC + CFA франци BEAC + + + Сребро + сребра + сребра + сребро + сребра + + + Злато + злата + злата + злато + злата + + + Европска композитна јединица + европске композитне јединице + европских композитних јединица + европска композитна јединица + европских композитних јединица + + + Европска новчана јединица + европске новчане јединице (XBB) + европских новчаних јединица (XBB) + европска новчана јединица (XBB) + европске новчане јединице (XBB) + + + Европска јединица рачуна (XBC) + европске јединице рачуна (XBC) + европских јединица рачуна (XBC) + европска јединица рачуна (XBC) + европских јединица рачуна (XBC) + + + Европска јединица рачуна (XBD) + европске јединице рачуна (XBD) + европских јединица рачуна (XBD) + европска јединица рачуна (XBD) + европских јединица рачуна (XBD) + + + Источно-карибски долар + источно-карибска долара + источно-карибских долара + источно-карибски долар + источно-карибских долара + + + Посебна цртаћа права + посебна цртаћа права + посебних цртаћих права + посебно цртаће право + посебних цртаћих права + + + Европска валутна јединица + европске новчане јединице (XEU) + европских новчаних јединица (XEU) + европска новчана јединица (XEU) + европских новчаних јединица + + + Француски златни франак + француска златна франка + француских златних франака + француски златни франак + француских златних франака + + + Француски UIC-франак + француска UIC-франка + француских UIC-франака + француски UIC-франак + француских UIC-франака + + + CFA франак BCEAO + CFA франка BCEAO + CFA франака BCEAO + CFA франак BCEAO + CFA франци BCEAO + + + Паладијум + паладијума + паладијума + паладијум + паладијума + + + CFP франак + CFP франка + CFP франака + CFP франак + CFP франци + + + Платина + платине + платина + платина + платина + + + RINET фонд + RINET фонда + RINET фондова + RINET фонд + RINET фондова + + + Код тестиране валуте + кода тестиране валуте + кодова тестиране валуте + код тестиране валуте + кодова тестиране валуте + + + Непозната или неважећа валута + непознате или неважеће валуте + непознатих или неважећих валута + непозната или неважећа валута + непознатих или неважећих валута + + + Јеменски динар + јеменска долара + јеменских долара + јеменски долар + јеменских долара + + + Јеменски риал + јеменска ријала + јеменских ријала + јеменски ријал + јеменски ријали + + + Југословенски тврди динар + југословенска тврда динара + југословенских тврдих динара + југословенски тврди динар + југословенских тврдих динара + + + Југословенски нови динар + југословенска нова динара + југословенских нових динара + југословенски нови динар + југословенских нових динара + + + Југословенски конвертибилни динар + југословенска конвертибилна динара + југословенских конвертибилних динара + југословенски конвертибилни динар + југословенских конвертибилних динара + Дин + + + Јужно-афрички ранд (финансијски) + јужноафричка ранда (финансијска) + јужноафричких ранда (финансијских) + јужноафрички ранд (финансијски) + јужноафричких ранда (финансијских) + + + Јужно-афрички ранд + јужно-афричка ранда + јужно-афричких ранда + јужно-афрички ранд + јужно-афричких ранда + + + Замбијска квача + замбијске кваче + замбијских квача + замбијска квача + замбијске кваче + + + Заирски нови заир + заирска нова заира + заирских нових заира + заирски нови заир + заирских нових заира + + + Заирски заир + заирска заира + заирских заира + заирски заир + заирских заира + + + Зимбабвејски долар + зимбабвејска долара + зимбабвејских долара + зимбабвејски долар + зимбабвејски долари + + + + + + {0} дана + {0} дана + {0} дан + {0} дан + + + {0} сата + {0} сати + {0} сат + {0} сат + + + {0} минута + {0} минута + {0} минут + {0} минут + + + {0} месеца + {0} месеци + {0} месец + {0} месец + + + {0} секунде + {0} секунди + {0} секунда + {0} секунда + + + {0} недеље + {0} недеља + {0} недеља + {0} недеља + + + {0} године + {0} година + {0} година + {0} година + + + + + да:д + не:н + + + + diff --git a/lib/zend/Zend/Locale/Data/sr_BA.xml b/lib/zend/Zend/Locale/Data/sr_BA.xml new file mode 100644 index 0000000000..cf14a4febf --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sr_BA.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sr_CS.xml b/lib/zend/Zend/Locale/Data/sr_CS.xml new file mode 100644 index 0000000000..3b03e7f99a --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sr_CS.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sr_Cyrl.xml b/lib/zend/Zend/Locale/Data/sr_Cyrl.xml new file mode 100644 index 0000000000..2f36da8007 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sr_Cyrl.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Svet + Afrika + Severnoamerički kontinent + Južna Amerika + Okeanija + Zapadna Afrika + Centralna Amerika + Istočna Afrika + Severna Afrika + Centralna Afrika + Južna Afrika + Amerike + Severna Amerika + Karibi + Istočna Azija + Južna Azija + Jugoistočna Azija + Južna Evropa + Australija i Novi Zeland + Melanezija + Micronezija + Polinezija + Južno-centralna Azija + Azija + Centralna Azija + Zapadna Azija + Evropa + Istočna Evropa + Severna Evropa + Zapadna Evropa + Komonvelt nezavisnih država + Latinska Amerika i Karibi + Kanalska ostrva + Andora + Ujedinjeni Arapski Emirati + Avganistan + Antigva i Barbuda + Angvila + Albanija + Armenija + Holandski Antili + Angola + Antarktika + Argentina + Američka Samoa + Austrija + Australija + Aruba + Alandska ostrva + Azerbejdžan + Bosna i Hercegovina + Barbados + Bangladeš + Belgija + Burkina Faso + Bugarska + Bahrein + Burundi + Benin + Sv. Bartolomej + Bermuda + Brunej + Bolivija + Brazil + Bahami + Butan + Buve Ostrva + Bocvana + Belorusija + Belise + Kanada + Kokos (Keling) Ostrva + Demokratska Republika Kongo + Centralno Afrička Republika + Kongo + Švajcarska + Obala Slonovače + Kukova Ostrva + Čile + Kamerun + Kina + Kolumbija + Kostarika + Srbija i Crna Gora + Kuba + Kape Verde + Božićna Ostrva + Kipar + Češka + Nemačka + Džibuti + Danska + Dominika + Dominikanska Republika + Alžir + Ekvador + Estonija + Egipat + Zapadna Sahara + Eritreja + Španija + Etiopija + Finska + Fidži + Folklandska Ostrva + Mikronezija + Farska Ostrva + Francuska + Gabon + Velika Britanija + Grenada + Gruzija + Francuska Gvajana + Gurnsi + Gana + Gibraltar + Grenland + Gambija + Gvineja + Gvadelupe + Ekvatorijalna Gvineja + Grčka + Južna Džordžija i Južna Sendvič Ostrva + Gvatemala + Guam + Gvineja-Bisao + Gvajana + Hong Kong (S. A. R. Kina) + Herd i Mekdonald Ostrva + Honduras + Hrvatska + Haiti + Mađarska + Indonezija + Irska + Izrael + Ostrvo Man + Indija + Britansko Indijska Okeanska Teritorija + Irak + Iran + Island + Italija + Džersi + Jamajka + Jordan + Japan + Kenija + Kirgizstan + Kambodža + Kiribati + Komorska Ostrva + Sent Kits i Nevis + Severna Koreja + Južna Koreja + Kuvajt + Kajmanska Ostrva + Kazahstan + Laos + Liban + Sent Lucija + Lihtenštajn + Šri Lanka + Liberija + Lesoto + Litvanija + Luksemburg + Letonija + Libija + Maroko + Monako + Moldavija + Crna Gora + Sv. Martin + Madagaskar + Maršalska Ostrva + Makedonija + Mali + Mijanmar + Mongolija + Makao (S. A. R. Kina) + Severna Marijanska Ostrva + Martinik + Mauritanija + Monserat + Malta + Mauricius + Maldivi + Malavi + Meksiko + Malezija + Mozambik + Namibija + Nova Kaledonija + Niger + Norfolk Ostrvo + Nigerija + Nikaragva + Holandija + Norveška + Nepal + Nauru + Niue + Novi Zeland + Oman + Panama + Peru + Francuska Polinezija + Papua Nova Gvineja + Filipini + Pakistan + Poljska + Sen Pjer i Mikelon + Pitcairn + Porto Riko + Palestinska Teritorija + Portugal + Palau + Paragvaj + Katar + Ostala okeanija + Evropska unija + Rejunion + Rumunija + Srbija + Rusija + Ruanda + Saudijska Arabija + Solomonska Ostrva + Sejšeli + Sudan + Švedska + Singapur + Sveta Jelena + Slovenija + Svalbard i Janmajen Ostrva + Slovačka + Sijera Leone + San Marino + Senegal + Somalija + Surinam + Sao Tome i Principe + Salvador + Sirija + Svazilend + Turks i Kajkos Ostrva + Čad + Francuske Južne Teritorije + Togo + Tajland + Tadžikistan + Tokelau + Istočni Timor + Turkmenistan + Tunis + Tonga + Turska + Trinidad i Tobago + Tuvalu + Tajvan + Tanzanija + Ukrajina + Uganda + Manja Udaljena Ostrva SAD + Sjedinjene Američke Države + Urugvaj + Uzbekistan + Vatikan + Sent Vinsent i Grenadini + Venecuela + Britanska Devičanska Ostrva + S.A.D. Devičanska Ostrva + Vijetnam + Vanuatu + Valis i Futuna Ostrva + Samoa + Jemen + Majote + Južnoafrička Republika + Zambija + Zimbabve + Nepoznat ili nevažeći region + + + Tradicionalna nemačka ortografija + Standardizovana rezijanska ortografija + Nemačka ortografija 1996 + Francuski iz kasnog srednjeg veka do 1606. + Rani moderni francuski + Istočni jermenski + Zapadno-jermenski + Ujedinjeni turski latinični alfabet + San Đorđijo/Bila dijalekt + Buntling + IPA fonetika + UPA fonetika + Lipovac dijalekt rezijanski + Monotonik + Natison dijalekt + Gnjiva/Njiva dijalekt + Oseako/Osojane dijalekt + Politonik + Kompjuter + Revidirana ortigrafija + Rezijan + Saho + Škotski standardni engleski + Skauz + Stolvica/Solbica dijalekt + Taraskijevica ortografija + Valencijski + + + Kalendar + Sortiranje + Valuta + + + Tradicionalno kinesko sortiranje + Budistički kalendar + Kineski kalendar + Direktno sortiranje + Pojednostavljeno kinesko sortiranje + Gregorijanski kalendar + Hebrejski kalendar + Indijski nacionalni kalendar + Islamski kalendar + Islamski civilni kalendar + Japanski kalendar + Sortiranje kao telefonski imenik + Pinjin sortiranje + Kalendar Republike Kine + Sortiranje po broju crta + Tradicionalno sortiranje + + + SAD + Metrički + + + Jezik: {0} + Skript: {0} + Region: {0} + + + + [a-c č ć d đ {dž} e-l {lj} m n {nj} o p r s š t-v z ž] + [q w-y] + + + + + pre podne + popodne + + + pre podne + popodne + + + pre podne + popodne + + + pre podne + popodne + + + + + + jan + feb + mar + apr + maj + jun + jul + avg + sep + okt + nov + dec + + + januar + februar + mart + april + maj + jun + jul + avgust + septembar + oktobar + novembar + decembar + + + + + j + f + m + a + m + j + j + a + s + o + n + d + + + + + + + ned + pon + uto + sre + čet + pet + sub + + + nedelja + ponedeljak + utorak + sreda + četvrtak + petak + subota + + + + + n + p + u + s + č + p + s + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1. kvartal + 2. kvartal + 3. kvartal + 4. kvartal + + + + pre podne + popodne + + + Pre nove ere + Nove ere + + + p. n. e. + n. e + + + + + d EEE + E d. + H.mm + L + E, M-d + LLL + E d. MMM + E MMMM d + MMMM d. + dd. MMMM + MMM d. + dd.MMM + MM-dd + d/M + d + hh.mm.ss a + mm:ss + y. + y-M + EEE, d. M. yyyy. + y MMM + EEE, d. MMM y. + y MMMM + y Q + y QQQ + MM.yy + d. MMM yy. + dd.MM.yy + Q yy + QQQQ yy + y. + yyyy-MM + MMMM y. + + + {0} - {1} + + M-M + + + E, d.M - E, d.M + E, d.M - E, d.M + + + MMM-MMM + + + E, dd. MMM - E, dd. MMM + E, dd. - E, dd. MMM + + + LLLL-LLLL + + + dd. MMM - dd. MMM + dd.-dd. MMM + + + d.M - d.M + d.M - d.M + + + d-d + + + HH-HH + HH-HH + + + HH.mm-HH.mm + HH.mm-HH.mm + HH.mm-HH.mm + + + HH.mm-HH.mm v + HH.mm-HH.mm v + HH.mm-HH.mm v + + + HH-HH v + HH-HH v + + + y-y + + + M.yy - M.yy + M.yy - M.yy + + + E, d.M.yy. - E, d.M.yy. + E, d.M.yy. - E, d.M.yy. + E, d.M.yy. - E, d.M.yy. + + + MMM-MMM y. + MMM y. - MMM y. + + + E, dd. MMM - E, dd. MMM y. + E, dd. - E, dd. MMM y. + E, dd. MMM y. - E, dd. MMM y. + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + dd. MMM - dd. MMM y. + dd.-dd. MMM y. + dd. MMM y. - dd. MMM y. + + + d.M.yy. - d.M.yy. + d.M.yy. - d.M.yy. + d.M.yy. - d.M.yy. + + + + + + era + + + godina + + + mesec + + + nedelja + + + dan + pre tri dana + prekjuče + juče + danas + sutra + prekosutra + za tri dana + + + dan u nedelji + + + pre podne/ popodne + + + čas + + + minut + + + sekund + + + zona + + + + + pre podne + popodne + + + pre podne + popodne + + + pre podne + popodne + + + pre podne + popodne + + + pre podne + popodne + + + pre podne + popodne + + + Pre RK + RK + + + + + + +HHmm;-HHmm + GMT{0} + GMT + {0} + + Nepoznat ili nevažeći grad + + + Andora + + + Dubai + + + Kabul + + + Antigva + + + Angvila + + + Tirana + + + Jerevan + + + Kiraso + + + Luanda + + + Rotera + + + Palmer + + + Južni pol + + + Šova + + + Moson + + + Dejvis + + + Vostok + + + Kasej + + + Dimon d’Urvil + + + MakMurdo + + + Rio galegos + + + Mendoza (Argentina) + + + San Huan (Argentina) + + + Ušuaia + + + La Rioja + + + San Luis + + + Katamarka (Argentina) + + + Salta + + + Jujui + + + Tukuman + + + Kordoba (Argentina) + + + Buenos Aires + + + Pago Pago + + + Beč + + + Pert (Australija) + + + Iukla (Australija) + + + Darvin (Australija) + + + Adelaida (Australija) + + + Broken Hil (Australija) + + + Kurie (Australija) + + + Melburn (Australija) + + + Horbat (Australija) + + + Lindeman + + + Sidnej (Australija) + + + Brizbejn (Australija) + + + Lord Hov + + + Aruba + + + Baku + + + Barbados + + + Daka + + + Brisel + + + Uagadugu + + + Sofija + + + Bahrein + + + Budžumbura + + + Porto Novo + + + Bermudi + + + Bruneji + + + La Paz + + + Eirunepe (Brazil) + + + Rio Branko + + + Porto Veljo + + + Boa Vista + + + Manaus + + + Kuiaba + + + Santarem + + + Kampo Grande + + + Belem + + + Aragvajana + + + Sao Paolo + + + Bahia (Brazil) + + + Fortaleza + + + Masejo + + + Resife + + + Noronja + + + Nasau + + + Thimphu + + + Gaboron + + + Minsk + + + Belize + + + Doson (Kanada) + + + Vajthors + + + Inuvik (Kanada) + + + Vankuver (kanada) + + + Doson Krik (Kanada) + + + Jelonajf + + + Edmonton (Kanada) + + + Svift Kurent + + + Kembridž Bej (Kanada) + + + Regina + + + Vinipeg (Kanada) + + + Rezolut + + + Rejni river + + + Rankin Inlet + + + Koral Harbur (Kanada) + + + Tander Bej + + + Nipigon + + + Toronto (Kanada) + + + Montreal (kanada) + + + Ikaluit + + + Pangnirtung + + + Monkton + + + Halifaks (kanada) + + + Gus Bej (Kanada) + + + Glejs Bej (Kanada) + + + Blanc-Sejblon (kanada) + + + Sv. Džon (Kanada) + + + Kokosova ostrva + + + Kinšasa + + + Lumumbaši + + + Bangui + + + Brazavil + + + Cirih + + + Abidžan + + + Rarotonga + + + Uskršnje ostrvo + + + Santijago + + + Duala + + + Kašgar (Kina) + + + Urumki + + + Čongking (Kina) + + + Šangaj + + + Harbin (Kina) + + + Bogota + + + Kostarika + + + Havana + + + Kape Verde + + + Božićno ostrvo + + + Nikozija + + + Berlin + + + Džibuti + + + Kopenhagen + + + Dominika + + + Santo Domingo + + + Alžir + + + Galapagos + + + Gvajakil + + + Talin + + + Kairo + + + El Ajun + + + Asmera + + + Kanarska ostrva + + + Seuta + + + Madrid + + + Adis Abeba + + + Helsinki + + + Fidži + + + Stenli + + + Truk + + + Ponape + + + Košre + + + Farska Ostrva + + + Pariz + + + Librevil + + + London + + + Grenada + + + Tbilisi + + + Kajen + + + Akra + + + Gibraltar + + + Tule + + + Nuk + + + Skorezbisund + + + Danmarkšavn + + + Banžul + + + Konakri + + + Gvadalupe + + + Malabo + + + Atina + + + Južna Džordžija + + + Gvatemala + + + Guam + + + Bisao + + + Guana + + + Hong Kong + + + Port-o-Prens + + + Budimpešta + + + Džakarta + + + Pontianak + + + Makasar + + + Džajapura + + + Dablin + + + Čagos + + + Bagdad + + + Teheran + + + Rejkjavik + + + Rim + + + Jamajka + + + Aman + + + Tokio + + + Najrobi + + + Biškek + + + Pnom Pen + + + Enderberi + + + Kiritimati + + + Tarava + + + Komoro + + + Sent Kits + + + Pjongjang + + + Seul + + + Kuvajt + + + Kajmanska ostrva + + + Aktau + + + Oral (Kazakhstan) + + + Akutobe + + + Kizilorda + + + Almati (Kazahstan) + + + Vijetijan + + + Bejrut + + + Sv. Lucija + + + Vaduc + + + Kolombo + + + Monrovija + + + Maseru + + + Viljnus + + + Luksemburg + + + Riga + + + Tripoli + + + Kazablanka + + + Monako + + + Kišnjev + + + Antananarivo + + + Kvadžalejin + + + Majuro + + + Bamako + + + Rangun + + + Hovd + + + Ulan Bator + + + Čojbalsan + + + Makau + + + Sajpan + + + Martinik + + + Navakšut + + + Montserat + + + Malta + + + Mauricijus + + + Maldivi + + + Blantir + + + Tihuana (Meksiko) + + + Hermosiljo (Meksiko) + + + Mazatlan (Meksiko) + + + Čihuahua (Meksiko) + + + Montrej (Meksiko) + + + Meksiko siti (Meksiko) + + + Merida (Meksika) + + + Kankun (Meksiko) + + + Kuala Lumpur + + + Kučing + + + Maputo + + + Vindhuk + + + Numea + + + Nijamej + + + Norfolk + + + Lagos + + + Managva + + + Amsterdam + + + Oslo + + + Katmandu + + + Nauru + + + Niue + + + Katham (Novi Zeland) + + + Okland + + + Muskat + + + Panama + + + Lima + + + Tahiti + + + Markiz + + + Gambije + + + Port Morzbi + + + Manila + + + Karači + + + Varšava + + + Mikelon + + + Pitkairn + + + Porto Riko + + + Gaza + + + Azori + + + Lisabon + + + Palau + + + Asunsion + + + Katar + + + Ujedinjenje + + + Bukurešt + + + Kaliningrad + + + Moskva + + + Volgograd (Rusija) + + + Samara (Rusija) + + + Jekatepinburg (Rusija) + + + Omsk (Rusija) + + + Novosibirsk (Rusija) + + + Krasnojarsk + + + Irkuck (Rusija) + + + Jakutsk (Rusija) + + + Vladivostok (Rusija) + + + Sahalin (Rusija) + + + Magadan (Rusija) + + + Kamčatka + + + Anadir + + + Kigali + + + Rijad + + + Gvadalkanal + + + Mahe + + + Kartum + + + Stokholm + + + Singapur + + + Sveta Jelena + + + Fritaun + + + Dakar + + + Mogadiš + + + Paramirbo + + + Sao Tome + + + Salvador + + + Damask + + + Mbabane + + + Grand Turk + + + Ndžamena + + + Kergelen + + + Lome + + + Bankok + + + Dušanbe + + + Fakaofo + + + Dili + + + Ašhabad + + + Tunis + + + Tongatapu + + + Istanbul + + + Port of Spejn + + + Fanafuti + + + Tajpej + + + Dar-es-Salam + + + Užgorod + + + Kijev + + + Simferopol + + + Zaporožje + + + Kampala + + + Midvej + + + Džonston + + + Vake + + + Adak (SAD) + + + Nom + + + Honolulu (SAD) + + + Enkoridž + + + Jakuta + + + Žano + + + Los Anđeles (SAD) + + + Bojzi (SAD) + + + Feniks (SAD) + + + Šiprok (SAD) + + + Denver (SAD) + + + Novi Salem, Severna Dakota (SAD) + + + Centar, Severna Dakota (SAD) + + + Čikago (SAD) + + + Menomine + + + Vincenis, Indijana + + + Petesburg (SAD) + + + Tel Siti (SAD) + + + Konks (SAD) + + + Vinamak, Indijana + + + Marengo (SAD) + + + Indianapolis (SAD) + + + Luivil (SAD) + + + Vevej, Indijana + + + Montičelo (SAD) + + + Detroit (SAD) + + + Njujork (SAD) + + + Montevideo + + + Samarkand (Uzbekistan) + + + Taškent + + + Sent Vinsent + + + Karakas + + + Tortola + + + Sv. Toma + + + Efate + + + Valis + + + Apija + + + Aden + + + Majote + + + Johanesburg + + + Lusaka + + + Harare + + + + Acre vreme + Acre letnje računanje vremena + + + ACT (Acre) + ACST (Acre) + + + + + Avganistan vreme + + + + + Centralna Afrika vreme + + + + + Istočna Afrika vreme + + + + + Južna Afrika vreme + Južna Afrika standardno vreme + + + + + Zapadna Afrika vreme + Zapadna Afrika letnje računanje vremena + + + + + Aktjubinsk vreme + Aktjubinsk letnje računanje vremena + + + + + Aljaska vreme + Aljaska standardno vreme + Aljaska letnje računanje vremena + + + + + Aljaska-Havaji vreme + Aljaska-Havaji standardno vreme + Aljaska-Havaji letnje računanje vremena + + + + + Almatu vreme + Almatu letnje računanje vremena + + + + + Amazon vreme + Amazon letnje računanje vremena + + + + + Centralno vreme (SAD) + Centralno standardno vreme (SAD) + Centralno letnje merenje vremena (SAD) + + + CT (SAD) + CST (SAD) + CDT (SAD) + + + + + Istočno vreme (SAD) + Istočno standardno vreme (SAD) + Istočno letnje računanje vremena (SAD) + + + ET (SAD) + EST (SAD) + EDT (SAD) + + + + + Planinsko vreme (SAD) + Planinsko standardno vreme (SAD) + Planinsko letnje računanje vremena (SAD) + + + MT (SAD) + MST (SAD) + MDT (SAD) + + + + + Pacifičko vreme (SAD) + Pacifičko vreme (SAD) + Pacifičko letnje računanje vremena (SAD) + + + PT (SAD) + PST (SAD) + PDT (SAD) + + + + + Anadir vreme + Anadir letnje računanje vremena + + + + + Akvtau vreme + Akvtau letnje računanje vremena + + + AQTT (Akvtau) + AQTST (Akvtau) + + + + + Akvtobe vreme + Akvtobe letnje računanje vremena + + + AQTT (Akvtobe) + AQTST (Akvtobe) + + + + + Arabijsko vreme + Arabijsko standardno vreme + Arapsko letnje računanje vremena + + + AT (Arabija) + AST (Arabija) + ADT (Arabija) + + + + + Argentina vreme + Argentina letnje računanje vremena + + + + + Zapadna Argentina vreme + + + + + Armenija vreme + Armenija letnje računanje vremena + + + + + Aškabad vreme + Aškabad letnje računanje vremena + + + + + Atlantsko vreme + Atlantsko standardno vreme + Atlantsko letnje računanje vremena + + + + + Centralno australijsko vreme + Centralno australijsko standardno vreme + Centralno australijsko letnje računanje vremena + + + + + Australijsko centralno zapadno vreme + Australijsko centralno zapadno standardno vreme + Australijsko centralno zapadno letnje računanje vremena + + + + + Australijsko istočno vreme + Australijsko istočno standardno vreme + Australijsko istočno letnje računanje vremena + + + + + Australijsko zapadno vreme + Australijsko zapadno standardno vreme + Australijsko zapadno letnje računanje vremena + + + + + Azerbejdžan vreme + Azerbejdžan letnje računanje vremena + + + + + Azori vreme + Azori letnje računanje vremena + + + + + Baku vreme + Baku letnje računanje vremena + + + + + Bangladeš vreme + + + + + Bering vreme + Bering standardno vreme + Bering letnje računanje vremena + + + BT (Bering) + BST (Bering) + BDT (Bering) + + + + + Butan vreme + + + + + Bolivija vreme + + + + + Borneo vreme + Borneo letnje računanje vremena + + + + + Brazilija vreme + Brazilija letnje računanje vremena + + + + + Brunei Darusalam vreme + + + + + Zelenortska ostrva vreme + Zelenortska ostrva letnje računanje vermena + + + + + Čamoro vreme + Čamoro standardno vreme + + + + + Čangbai vreme + + + + + Čatam standardno vreme + Čatam letnje računanje vremena + + + + + Čile vreme + Čile letnje računanje vremena + + + + + Kina vreme + Kinesko standardno vreme + Kina letnje računanje vremena + + + CT (Kina) + CST (Kina) + CDT (Kina) + + + + + Čojbalsan vreme + Čojbalsan letnje računanje vremena + + + + + Božićna Ostrva vreme + + + + + Kokos (Keling) Ostrva vreme + + + + + Kolumbija vreme + Kolumbija letnje računanje vremena + + + + + Kukova ostrva vreme + Kukova ostrva, polu-letnje računanje vremena + + + + + Kuba vreme + Kuba standardno vreme + Kuba letnje računanje vremena + + + + + Dača vreme + + + + + Dejvis vreme + + + + + Dimon d’Urvil vreme + + + + + Dušanbe vreme + Dušanbe letnje računanje vremena + + + + + Holandska Gvijana vreme + + + + + Istočni Timor vreme + + + + + Uskršnja ostrva vreme + Uskršnja ostrva letnje računanje vremena + + + + + Ekvador vreme + + + + + Centralnoevropsko vreme + Centralnoevropsko letnje računanje vremena + + + + + Istočnoevropsko vreme + Istočnoevropsko letnje računanje vemena + + + + + Zapadna evropsko vreme + Zapadno evropsko letnje računanje vremena + + + + + Folklandska Ostrva vreme + Folklandska ostrva letnje računanje vremena + + + + + Fidži vreme + Fidži letnje računanje vremena + + + + + Francuska Gvajana vreme + + + + + Francuske Južne Teritorije vreme + + + + + Frunze vreme + Frunze letnje računanje vremena + + + + + Grinvič vreme + + + + + Galapagos vreme + + + + + Gambijer vreme + + + + + Gruzija vreme + Gruzija letnje računanje vremena + + + + + Centralni Grenland vreme + Centralni Grenland letnje računanje vremena + + + + + Istočni Grenland vreme + Istočni Grenland letnje računanje vremena + + + + + Zapadni Grenland vreme + Zapadni Grenland letnje računanje vremena + + + + + Guam standardno vreme + + + + + Zaliv vreme + Zaliv standardno vreme + + + + + Gvajana vreme + + + + + Havaǰsko-aleućansko standardno vreme + + + + + Hong Kong vreme + Hong Kong letnje računanje vremena + + + + + Hovd vreme + Hovd letnje računanje vremena + + + + + Indijsko standardno vreme + + + + + Indijski okean vreme + + + + + Indokina vreme + + + + + Centralno indonezijsko vreme + + + + + Istočno indonezijsko vreme + + + + + Zapadno indonezijsko vreme + + + + + Iran standardno vreme + Iran letnje računanje vremena + + + + + Irkuck vreme + Irkuck letnje računanje vremena + + + + + Izraelsko standardno vreme + Izraelsko letnje računanje vremena + + + + + Japansko vreme + Japansko standardno vreme + Japan letnje računanje vremena + + + + + Petropavlovsk-Kamčatski vreme + Petropavlovsk-Kamčatski letnje računanje vremena + + + + + Karači vreme + + + + + Kašgar vreme + + + + + Istočni Kazahstan vreme + Istočni Kazahstan standardno vreme + + + + + Zapadni Kazahstan vreme + Zapadni Kazahstan standardno vreme + + + + + Kizilorda vreme + Kizilorda letnje računanje vremena + + + + + Koreja vreme + Korejsko standardno vreme + Korejsko letnje računanje vremena + + + + + Košre vreme + + + + + Krasnojarsk vreme + Krasnojarsk letnje računanje vremena + + + + + Kujbišev vreme + Kujbišev letnje računanje vemena + + + + + Kvajalejnsko vreme + + + + + Kirgizstan vreme + + + + + Lanka vreme + + + + + Lajn ostrva vreme + + + + + Long Šu vreme + + + + + Lord Hov vreme + Lord Hov standardno vreme + Lord Hov letnje računanje vremena + + + + + Makao vreme + Makao letnje računanje vremena + + + + + Magadan vreme + Magadan letnje računanje vremena + + + + + Malaja vreme + + + + + Malezija vreme + + + + + Maldivi vreme + + + + + Markiz vreme + + + + + Maršalska Ostrva vreme + + + + + Mauricijus vreme + Mauricijus letnje računanje vremena + + + + + Moson vreme + + + + + Ulan Bator vreme + Ulan Bator letnje računanje vremena + + + + + Moskva vreme + Moskva standardno vreme + Moskva letnje računanje vremena + + + + + Mijanmar vreme + + + + + Nauru vreme + + + + + Nepal vreme + + + + + Nova Kaledonija vreme + Nova Kaledonija letnje računanje vremena + + + + + Novi Zeland vreme + Novi Zeland standardno vreme + Novi Zeland letnje računanje vremena + + + + + Njufaundlend vreme + Njufaundlend standardno vreme + Njufaundlend letnje računanje vremena + + + + + Niue vreme + + + + + Norfolk Ostrvo vreme + + + + + Fernando de Noronja vreme + Fernando de Noronja letnje računanje vremena + + + + + Severna Marijanska Ostrva vreme + + + + + Novosibirsk vreme + Novosibirsk letnje računanje vremena + + + + + Omsk vreme + Omsk letnje računanje vremena + + + + + Pakistan vreme + Pakistan letnje računanje vremena + + + + + Palau vreme + + + + + Papua Nova Gvineja vreme + + + + + Paragvaj vreme + Paragvaj letnje računanje vremena + + + + + Peru vreme + Peru letnje računanje vremena + + + + + Filipini vreme + Filipini letnje računanje vremena + + + + + Fenička ostrva vreme + + + + + Pjer i Mikelon vreme + Pjer i Mikelon standardno vreme + Pjer i Mikelon letnje računanje vremena + + + + + Pitkairn vreme + + + + + Ponape vreme + + + + + Kizilorda vreme + Kizilorda letnje računanje vremena + + + + + Rejunion vreme + + + + + Roter vreme + + + + + Sahalin vreme + Sahalin letnje računanje vremena + + + + + Samara vreme + Samara letnje računanje vremena + + + + + Samarkand vreme + Samarkand letnje računanje vremena + + + + + Samoa standardno vreme + + + + + Sejšeli vreme + + + + + Ševčenko vreme + Ševčenko letnje računanje vremena + + + + + Singapur standardno vreme + + + + + Solomonska Ostrva vreme + + + + + Južna Džordžija vreme + + + GST (Sv. Džordžija) + + + + + Surinam vreme + + + + + Sverdlovsk vreme + Sverdlovsk letnje računanje vremena + + + + + Šova vreme + + + + + Tahiti vreme + + + + + Tadžikistan vreme + + + + + Taškent vreme + Taškent letnje računanje vremena + + + + + Tbilisi vreme + Tbilisi letnje računanje vremena + + + + + Tokelo vreme + + + + + Tonga vreme + Tonga letnje računanje vremena + + + + + Truk vreme + + + + + Turska vreme + Turska letnje računanje vremena + + + + + Turkmenistan vreme + Turkmenistan letnje računanje vremena + + + + + Tuvalu vreme + + + + + Ural'sk vreme + Ural'sk letnje računanje vremena + + + + + Urugvaj vreme + Urugvaj letnje računanje vremena + + + + + Urumki vreme + + + + + Uzbekistan vreme + Uzbekistan letnje računanje vremena + + + + + Vanuatu vreme + Vanuatu letnje računanje vremena + + + + + Venecuela vreme + + + + + Vladivostok vreme + Vladivostok letnje računanje vremena + + + + + Volgograd vreme + Volgograd Letnje računanje vremena + + + + + Vostok vreme + + + + + Vejk vreme + + + + + Valis i Futuna Ostrva vreme + + + + + Jakutsk vreme + Jakutsk letnje računanje vremena + + + + + Jekaterinburg vreme + Jekaterinburg letnje računanje vremena + + + + + Jerevan vreme + Jerevan letnje računanje vremena + + + + + Jukon vreme + Jukon standardno vreme + Jukon letnje računanje vremena + + + + + + + + Andorska pezeta (ADP) + Andorijske pezete + Andorijskih pezeta + Andorijska pezeta + Andorijske pezete + + + Ujedinjeni arapski emirati dirham + UAE dirama + UAE dirama + UAE diram + UAE dirama + + + Avganistanski avgani (1927-2002) AFA + Avganistanska avgana (AFA) + Avganistanskih avgana (AFA) + Avganistanski avgan (AFA) + Avganistanski avgan (AFA) + + + Avganistanski avgani (AFN) + Avganistanska avgana + Avganistanski avgan + Avganistanski avgan + + + Albanski lek + Albanska leka + Albanskih leka + albanski lek + albanski lek + + + Jermenski dram + Jermenske drame + Jermenskih drama + jermenski dram + jermenski drami + + + Holandski Antili gilder (ANG) + Holandskoantilska gildera + Holandskoantilskih gildera + Holandskoantilski gilder + Holandskoantilski gildera + + + Angolijska kvanza (AOA) + Angolijske kvanze (AOA) + Angolijskih kvanzi + Angolijska kvanza + Angolijskih kvanzi + + + Angolijska kvanza (1977-1990) (AOK) + Angolijske kvanze (AOK) + Angolijskih kvanzi (AOK) + Angolijska kvanza (AOK) + Angolijskih kvanzi (AOK) + + + Angolijska nova kvanza (1990-2000) (AON) + angolijske nove kvanze (AON) + angolijskih novih kvanzi (AON) + angolijska nova kvanza (AON) + angolski novi kvanze (AON) + + + Angolijska kvanza reajustado (1995-1999) (AOR) + angalske kvanze reađustado (AOR) + angolijskih kvanzi reađustado + angolijska kvanza reađustado + angolijskih kvanzi reađustado + + + Argentinski austral (ARA) + argentinska australa (ARA) + argentinskih australa (ARA) + argentinski austral (ARA) + argentinski australs (ARA) + + + Argentinski pezo (1983-1985) (ARP) + argentinska pezosa (ARP) + argentinskih pezosa (ARP) + argentinski pezo (ARP) + argentinskih pezosa (ARP) + + + Argentinski pezo + argentinska pezosa + argentinskih pezosa + argentinski pezos + argentinskih pezosa + + + Austrijski šiling + austrijska šilinga + austrijskih šilinga + austrijski šiling + austrijskih šilinga + + + Australijski dolar + Australijska dolara + Australijskih dolara + australijski dolar + australijskih dolara + + + Arubijski florin (AWG) + arubanska florina + arubanskih florina + arubanski florin + arubanskih florina + + + Azerbejdžanski manat (AZM) + azerbejdžanska manata(AZM) + azerbejdžanskih manata (AZM) + azerbejdžanski manat (AZM) + azerbejdžanskih manata (AZM) + + + Azerbejdžanski manat (AZN) + azerbejdžanska manata + azerbejdžanskih manata + azerbejdžanski manat + azerbejdžanskih manata + + + Bosansko-Hercegovački dinar + Bosansko-Hercegovačka dinara + Bosansko-Hercegovačkih dinara + bosansko-hercegovački dinar + bosansko-hercegovačkih dinara + + + Bosansko-Hercegovačka konvertibilna marka + Bosansko-Hercegovačke konvertibilne marke + Bosansko-Hercegovačkih konvertibilnih maraka + bosansko-hercegovačka konvertibilna marka + bosansko-hercegovačkih konvertibilnih maraka + + + Barbadoski dolar (BBD) + barbadoška dolara + barbadoških dolara + barbadoški dolar + barbadoških dolara + + + Bangladeška taka (BDT) + bangladeške take + bangladeških taka + bangladeška taka + bangladeških taka + + + Belgijski frank (konvertibilni) (BEC) + belgijska franka (konvertibilna) + belgijskih franaka (BEC) (konvertibilnih) + belgijski franak (konvertibilni) + belgijskih franaka BEC (konvertibilnih) + + + Belgijski franak + belgijska franka + belgijskih franaka + belgijski franak + belgijskih franaka + + + Belgijski frank (finansijski) (BEL) + belgijska franka (BEL) (finansijska) + belgijskih franaka (BEL) (finansijskih) + belgijski franak (finansijski) + belgijskih franaka BEL (finansijskih) + + + Bugarski tvrdi lev (BGL) + bugarska tvrda leva + bugarskih tvrdih leva + bugarski tvrdi lev + bugarskih tvrdih leva + + + Bugarski lev + Bugarska leva + Bugarskih leva + bugarski lev + Bugarskih leva + + + Bahreinski dinar (BHD) + bahreinskih dinara + bahreinskih dinara + bahreinskih dinara + bahreinskih dinara + + + Burundski franak (BIF) + burundska franka + burundskih franaka + burundski franak + BIF + + + Bermudski dolar (BMD) + bermudska dolara + bermudskih dolara + bermudski dolar + bermudskih dolara + + + Brunejski dolar + brunejska dolara + brunejskih dolara + brunejski dolar + brunejskih dolara + + + Bolivijski boliviano + bolivijska boliviana + bolivijskih boliviana + bolivijski boliviano + bolivijskih boliviana + + + Bolivijski pezo (BOP) + Bolivijska pezosa + bolivijskih pezosa + bolivijski pezo + bolivijskih pezosa + + + Bolivijski mvdol (BOV) + bolivijska mvdola + bolivijskih mvdola + bolivijski mvdol + bolivijskih mvdola + + + Brazilski kruzeiro novo (1967-1986) (BRB) + brazilska nova kruzeira (BRB) + brazilskih novih kruzeira (BRB) + brazilski novi kruzeiro (BRB) + brazilskih novih kruzeira (BRB) + + + Brazilski kruzado (BRC) + brazilska kruzadosa + brazilskih kruzadosa + brazilskih kruzado + brazilskih kruzadosa + + + Brazilski kruzeiro (1990-1993) (BRE) + brazilska kruzeira (BRE + brazilskih kruzeira (BRE) + brazilski kruzeiro (BRE) + brazilskih kruzeira (BRE) + + + Brazilski real + brazilska reala + brazilskih reala + brazilski real + brazilskih reala + + + Brazilski kruzado novo (BRN) + brazilska nova kruzada + brazilskih novih kruzada + brazilski novi kruzado + brazilskih novih kruzada + + + Brazilski kruzeiro (BRR) + brazilijska kruzeira + brazilskih kruzeira + brazilski kruzeiro + brazilskih kruzeira + + + Bahamski dolar (BSD) + bahamska dolara + bahamskih dolara + bahamski dolar + bahamskih dolara + + + Butanski ngultrum (BTN) + butanska ngultruma + butanskih ngultruma + butanski ngultrum + butanski ngultruma + + + Burmanski kjat (BUK) + burmanska kjata + burmanskih kjata + burmanski kjat + burmanskih kjata + + + Botsvanska pula (BWP) + bocvanske pule + bocvanskih pula + bocvanska pula + bocvanskih pula + + + Beloruska nova rublja (1994-1999) (BYB) + beloruske nove rublje (BYB) + beloruskih novih rublji (BYB) + beloruska nova rublja (BYB) + beloruskih novih rublji (BYB) + + + Beloruska rublja (BYR) + beloruske rublje + beloruskih rublji + beloruska rublja + bjeloruske rublje + + + Belize dolar (BZD) + belizeanska dolara + belizeanskih dolara + belizeanski dolar + belizeanskih dolara + + + Kanadski dolar + Kanadska dolara + Kanadskih dolara + kanadski dolar + kanadskih dolara + + + Kongolski franak (CDF) + kongolska franka + kongoanskih franaka + kongolski franak + kongolskih franaka + + + WIR Evro (CHE) + WIR evra + WIR evra + WIR evro + WIR evra + + + Švajcarski franak + Švajcarska franka + Švajcarskih franaka + švajcarski franak + švajcarskih franaka + + + WIR franak (CHW) + WIR franka + WIR franaka + WIR franak + WIR franak + + + Čileanski unidades de fomento (CLF) + čileanska unidades de fomentos + čileanskih unidades de fomentos + čileanski unidades de fomentos + čileanski unidades de fomentos + + + Čileanski pezo + čileanska pezosa + čileanskih pezosa + čileanski pezos + čileanski pezos + + + Kineski Juan Renminbi + kineska juana + kineskih juana + kineski juan + kineskih juana + + + Kolumbijski pezo + kolumbijska pezosa + kolumbijskih pezosa + kolumbijski pezo + kolumbijski pezosi + + + Unidad de Valor real (COU) + unidad de valor reala + unidad de valor reala + unidad de valor real + unidad de valor real + + + Kostarikanski kolon (CRC) + kostarikanska kolona + kostarikanskih kolona + kostarikanski kolon + CRC + + + Stari srpski dinar + stara srpska dinara + starih srpskih dinara + stari srpski dinar + starih srpskih dinara + + + Čehoslovačka tvrda koruna (CSK) + čehoslovačke tvrde krune + čehoslovačkih tvrdih kruna + čehoslovačka tvrda kruna + čehoslovačka tvrda kruna + + + Kubanski pezo (CUP) + kubanska pezosa + kubanskih pezosa + kubanski pezos + kubanskih pezosa + + + Kejp verdanški eskudo (CVE) + zelenortska eskuda + zelenortskih eskuda + zelenortski eskudo + zelenortskih eskuda + + + Kipratska funta (CYP) + kiparske funte + kiparskih funti + kiparska funta + kiparska funta + + + Češka kruna + češke krune + čeških kruna + češka kruna + čeških kruna + + + Istočnoevropska marka (DDM) + istočnonemačke marke + istočnonemačkih maraka + istočnonemačka marka + istočnonemačkih maraka + + + Nemačka marka + Nemačke marke + Nemačkih maraka + nemačka marka + nemačkih maraka + + + Džibutanski franak (DJF) + džibutska franka + džibutskih franaka + džibutski franak + džibutski franak + + + Danska kruna + danske krune + danskih kruna + danska kruna + danskih kruna + + + DOminikanski pezo (DOP) + dominikanska pezosa + dominikanskih pezosa + dominikanski pezo + dominikanskih pezosa + + + Alžirski dinar (DZD) + alžirska dinara + alžirskih dinara + alžirski dinar + alžirskih dinara + + + Ekvadorijski sukr (ECS) + ekvadorska sakra + ekvadorskih sakra + ekvadorska sakra + ekvadorskih sakra + + + Ekvadorski unidad de valor konstantin (UVC) + ekvadorska unidad de valor constante (UVC) + ekvadorskih unidad de valor constante (UVC) + ekvadorski unidad de valor constante (UVC) + ekvadorski unidad de valor constante (UVC) + + + Estonska kruna + estonske krune + estonskih kruna + estonska kruna + estonskih kruna + + + Egipatska funta + egipatske funte + egipatskih funti + egipatska funta + egipatskih funti + + + Eritreanska nakfa (ERN) + eritrejske nakfe + eritrejskih nakfi + eritrejska nakfa + eritrejska nakfa + + + Španska pezeta (račun) ESA + španske pezete (A račun) + španskih pezeta (A račun) + španska pezeta (A račun) + španska pezeta (A račun) + + + Španska pezeta (konvertibilni račun) (ESB) + španske pezete (konvertibilan račun) + španskih pezeta (konvertibilan račun) + španska pezeta (konvertibilan račun) + španska pezeta (konvertibilan račun) + + + Španska pezeta + španska pezeta + španskih pezeta + španskа pezetа + španskе pezetе + + + Etopijski bir (ETB) + etiopijska bira + etiopijskih bira + etiopijski bir + etiopijskih bira + + + Evro + evra + evra + evro + evra + + + Finska marka + Finske marke + Finskih maraka + finska marka + finskih maraka + + + Fidži dolar + fidži dolara + fidži dolara + fidži dolar + fidži dolara + + + Foklandska ostrva funta (FKP) + folklandske funte + folklandskih funti + folklandska funta + folklandska funta + + + Francuski franak + Francuska franka + Francuskih franaka + francuski franak + francuskih franaka + + + Britanska funta sterlinga + britanske funte sterlinga + britanskih funti sterlinga + britanska funta sterlinga + britanskih funti sterlinga + + + Gruzijski kupon larit (GEK) + gruzijska kupon larita + gruzijskih kupon larita + gruzijski kupon larit + gruzijskih kupon larita + + + Džordžijski lari (GEL) + gruzijska larisa + gruzijskih larisa + gruzijski laris + gruzijskih larisa + + + Ganijski cedi (1979-2007) (GHC) + ganska ceda (GHC) + ganskih ceda (GHC) + ganski ced (GHC) + ganskih ceda (GHC) + + + Ganijski cedi (GHS) + ganska ceda + ganskih ceda + ganski cedi + ganski cedi + + + Gibraltarska funta (GIP) + gibraltarske funte + gibraltarskih funti + gibraltarska funta + gibraltarska funta + + + Gambijski dalasi (GMD) + gambijska dalasa + gambijskih dalasa + gambijski dalas + gambijskih dalasa + + + Gvinejski franak (GNF) + gvinejska franka + gvinejskih franaka + gvinejski franak + gvinejski franak + + + Gvinejski sili (GNS) + gvinejska silija + gvinejskih silija + gvinejski sili + gvinejski silij + + + Evatorijalna gvineja ekvele (GQE) + evatorijаlno-gvinejska ekvelа + evatorijаlno-gvinejskih ekvelа + evatorijаlno-gvinejski ekvele + evatorijаlno-gvinejskih ekvelа + + + Drahma + grčke drahme + grčkih drahmi + grčka drahma + grčkih drahmi + + + Gvatemalski kvetzal (GTQ) + gvatemalska kvecala + gvatemalskih kvecala + gvatemalski kvecal + gvatemalskih kvecala + + + Portugalska Gvineja eskudo (GWE) + portugalsko-gvinejska eskuda + portugalsko-gvinejskih eskuda + portugalsko-gvinejski eskudo + portugalsko-gvinejski eskudo + + + Gvineja bisao pezo (GWP) + gvinejа-bisaoška pezosa + gvinejа-bisaoških pezosa + gvinejа-bisaoški pezo + gvinejsko-bisaoski pezos + + + Guajanski dolar (GYD) + gvajanska dolara + gvajanskih dolara + gvajanski dolar + gvajanski dolari + + + Honkonški dolar + hongkonška dolara + hongkonških dolara + hongkonški dolar + hongkonških dolara + + + Honduranska lempira (HNL) + honduraškа lempirа + honduraških lempirа + honduraški lempir + honduraških lempirа + + + Hrvatski dinar + Hrvatska dinara + Hrvatskih dinara + hrvatski dinar + hrvatskih dinara + + + Hrvatska kuna + Hrvatske kune + Hrvatskih kuna + hrvatska kuna + hrvatskih kuna + + + Haitski gurd (HTG) + haićanska gourda + haićanskih gourda + haićanski gourd + haićanski gourd + + + Mađarska forinta + mađarske forinte + mađarskih forinti + mađarska forinta + mađarske forinte + + + Indonezijska rupiah + indonežanske rupije + indonežanskih rupija + indonežanska rupija + indonežanske rupije + + + Irska funta + irske funte + irskih funti + irska funta + irskih funti + + + Izraelska funta (ILP) + izraelske funte + izraelskih funti + izraelska funta + izraelska funta + + + stari izraelski šekeli + stari izraelski šekeli + stari izraelski šekeli + stari izraelski šekeli + stari izraelski šekeli + + + Izraelski šekel + nova izraelska šekela + novih izraelskih šekela + novi izraelski šekel + novih izraelskih šekela + + + Indijski rupi + indijske rupije + indijskih rupija + indijska rupija + indijskih rupija + + + Irački dinar (IQD) + iračka dinara + iračkih dinara + irački dinar + irački dinari + + + Iranijski rial (IRR) + iranska rijala + iranskih rijala + iranski rijal + iranski rijali + + + stara islandska kruna + stara islandska kruna + stara islandska kruna + stara islandska kruna + stara islandska kruna + + + Islandska kruna (ISK) + islandske krune + islandskih kruna + islandska kruna + islandska kruna + + + Italijanska lira + Italijanske lire + Italijanskih lira + italijanska lira + italijanske lire + + + Jamajski dolar (JMD) + jamajska dolara + jamajskih dolara + jamajski dolar + jamajskih dolara + + + Jordanski dinar (JOD) + jordanskih dinara + jordanskih dinara + ordanskih dinara + ordanskih dinara + + + Japanski jen + Japanska jena + Japanskih jena + japanski jen + japanski jen + + + Kenijski šiling + kenijska šilinga + kenijskih šilinga + kenijski šiling + kenijskih šilinga + + + Kirgistanski som (KGS) + kirgistanska soma + kirgistanskih soma + kirgistanski som + kirgijski som + + + Kambodžijski riel (KHR) + kambodžanska rijela + kambodžanskih rijela + kambodžanski rijal + kambodžanskih rijela + + + Komoranski franak (KMF) + komoranska franka + komoranskih franaka + komoranski franak + komoranski franci + + + Severnokorejski von (KPW) + severnokorejska vona + severnokorejskih vona + severnokorejski von + severnokorejski von + + + Južno-korejski Von + južno-korejska vona + južno-korejskih vona + južno-korejski von + južno-korejski von + + + Kuvajtski dinar + kuvajtskih dinara + kuvajtskih dinara + kuvajtskih dinara + kuvajtskih dinara + + + Kajmanska ostrva dolar (KYD) + kajmanska dolara + kajmanskih dolara + kajmanski dolar + kajmanski dolar + + + Kazahstanski tendž (JZT) + kazahstanske tendže + kazahstanskih tendži + kazahstanska tendža + kazahstanskih tendži + + + Laoški kip (LAK) + laoška kipa + laoških kipa + laoški kip + laoški kipovi + + + Lebanska funta (LBR) + lebanske funte + lebanskih funti + lebanska funta + lebanske funte + + + Šrilankanski rupi (LKR) + šrilankanske rupije + šrilankanskih ruplji + šrilankanska rupija + šrilankanska rupija + + + Liberijski dolar (LRD) + liberijska dolara + liberijskih dolara + liberijski dolar + liberijskih dolara + + + Lesotski loti (LSL) + lesotska lotisa + lesotskih lotisa + lesotski lotis + lesotskih lotisa + + + Litvanski litas + litvanske lite + litvanskih lita + litvanska lita + litvanskih lita + + + Litvanski talonas (LTT) + litvanska litasa + litvanskih litasa + litvanski litas + litvanski litas + + + Luksemburški konvertibilni franak (LUC) + luksemburška konvertibilna franka + luksemburških konvertibilnih franaka + luksemburški konvertibilni franak + luksemburški konvertibilni franak + + + Luksemburški franak + luksemburška franka + luksemburških franaka + luksemburški franak + luksemburški franci + + + Luksemburški finansijski franak (LUL) + luksemburška financijska franka + luksemburških financijskih franaka + luksemburški financijski franak + luksemburški financijski franak + + + Latvijski lats (LVL) + latvijska lata + latvijskih lata + latvijski lat + latvijski lat + + + Latvijska rublja (LVR) + latvijska rublja + latvijskih rublji + latvijska rublja + latvijska rublja + + + Libijski dinar + libijska dinara + Libijskih dinara + Libijskih dinara + libijskih dinara + + + Marokanski dirham + marokanske dirame + marokanskih dirama + marokanska dirama + marokanskih dirama + + + Marokanski franak (MAF) + marokanska franka + marokanskih franaka + marokanski franak + marokanski franak + + + Moldovski lju (MDL) + moldavska leja + moldavskih leja + moldavski lej + moldavski lej + + + Malagasijski ariari (MGA) + madagaskarska ariarija + madagaskarskih ariarija + madagaskarski ariarij + madagaskarski ariariji + + + Malagasijski franak (MGF) + madagaskarska franka + madagaskarskih franaka + madagaskarski franak + MGF + + + Makedonski denar + makedonska denara + Makedonskih denara + Makedonski denar + makedonskih dinara + + + Malijanski franak (MLF) + malijska franka + malijskih franaka + malijski franak + malijski franak + + + Mjanmaški kjat (MMK) + mjanmarska kjata + mjanmarskih kjata + mjanmarski kjat + mjanmarski kjati + + + Mongolski tugrik (MNT) + mongolska tugrika + mongolskih tugrika + mongolski tugrik + mongolski tugrici + + + Makaniška pataka (MOP) + makaneška patka + makaneških pataka + makaneški patak + makaneški patak + + + Mauritanijska ugvija + mauritanijske ouguje + mauritanijskih ouguja + mauritanijska ouguja + mauritanijske ouguje + + + Malteška lira + malteške lire + malteških lira + malteška lira + malteških lira + + + Malteška funta (MTP) + malteške funte + malteških funti + malteška funta + malteška funta + + + Mauricijska ruplja (MUR) + mauricijske rupije + mauricijskih rupija + mauricijska rupija + mauricijske rupije + + + Maldivijska rufija (MVR) + maldivijske rufije + maldivijskih rufija + maldivijska rufija + maldivijska rufija + + + Malavijska kvača (MWK) + malavijske kvače + malavijskih kvača + malavijska kvača + malavijska kvača + + + Meksički peso + meksička pezosa + meksičkih pezosa + meksički pezos + meksičkih pezosa + + + Meksijski srebrno pezo (1861-1992) (MXP) + meksička srebrna pezosa (MXP) + meksičkih srebrnih pezosa (MXP) + meksički srebrni pezos (MXP) + meksički srebrni pezos (MXP) + + + Meksijski unidad de inverzion (MXV) + meksička unidads de inversion (UDI) + meksičkih unidads de inversion (UDI) + meksički unidads de inversion (UDI) + meksički unidads de inversion (UDI) + + + Malezijski ringit + malezijska ringita + malezijskih ringita + malezijski ringit + malezijskih ringita + + + Mozambijski eskudo (MZE) + mozambijska eskuda + mozambijskih eskuda + mozambijski eskudo + mozambijski eskudo + + + Stari mozambijski metikal (MZM) + stara mozambijska metikala + starih mozambijskih metikala + stari mozambijski metikal + stari mozambijski metikal + + + Mozambijski metikal (MZN) + mozambijska metikala + mozambijskih metikala + mozambijski metikal + mozambijski metikal + + + Nambijski dolar (NAD) + namibijska dolara + namibijskih dolara + namibijski dolar + namibijski dolar + + + Nigerijska naira (NGN) + nigerijska naira + nigerijskih naira + nigerijski nair + nigerijski nair + + + Nikaragvanška kordoba (NIC) + nikaragvanske kordobe + nikaragvanskih kordoba + nikaragvanska kordoba + nikaragvanska kordoba + + + Nikaragvanška kordoba oro + nikaragvanske zlatne kordobe + nikaragvanskih zlatnih kordoba + nikaragvanska zlatna kordoba + nikaragvanska zlatna kordoba + + + Holandski gulden + holandska guldena + holandskih guldena + holandski gulden + holandskih guldena + + + Norveška kruna + Norveške kune + Norveških kuna + Norveška kuna + norveških kruna + + + Nepalska ruplja (NPR) + nepalske rupije + nepalskih rupija + nepalska rupija + nepalska rupija + + + Novozelandski dolar + novozelandska dolara + novozelandskih dolara + novozelandski dolar + novozelandskih dolara + + + Omanski rial (OMR) + omanska rijala + omanskih rijala + omanski rijal + omanski rijal + + + Panamanska balboa (PAB) + panamske balboe + panamskih balboa + panamska balboa + panamska balboa + + + Peruvijski inti (PEI) + peruanske inte + peruanskih inti + peruanska inta + peruanska inta + + + Peruanski nuevo sol + peruanska nuevo sola + peruanskih nuevo sola + peruanski nuevo sol + peruanskih nuevo sola + + + Peruvijski sol (PES) + peruanska sola + peruanskih sola + peruanski sol + peruanski sol + + + Papua Nova Gvineja kina (PGK) + kine Papue Nove Gvineje + kina Papue Nove Gvineje + kina Papue Nove Gvineje + kina Papue Nove Gvineje + + + Filipinski peso + filipinska pezosa + filipinskih pezosa + filipinski pezo + filipinskih pezosa + + + Pakistanski rupi + pakistanske rupije + pakistanskih rupija + pakistanska rupija + pakistanske rupije + + + Poljski zlot (PLN) + poljske zlote + poljskih zlota + poljski zlot + poljski zlot + + + Poljski zloti (1950-1995) (PLZ) + poljske zlote (PLZ) + poljskih zlota (PLZ) + poljski zlot (PLZ) + poljski zlot (PLZ) + + + Portugalski eskudo + portugalska eskuda + portugalskih eskuda + portugalski eskudo + portugalskih eskuda + + + Paragvajski guarni (PYG) + paragvajska gvaranija + paragvajskih gvaranija + paragvajski gvarani + paragvajski gvarani + + + Katarski rial (QAR) + katarska rijala + katarskih rijala + katarski rijal + katarski rijal + + + Rodizijski dolar (RHD) + rodezijska dolara + rodezijskih dolara + rodezijski dolar + rodezijski dolar + + + Stari romanski lju (ROL) + stara rumunjska leja + starih rumunjskih leja + stari rumunjski lej + stari rumunjski lej + + + Rumunski leu + rumunska leua + rumunskih leua + rumunski leu + rumunskih leua + + + Srpski dinar + srpska dinara + srpskih dinara + srpski dinar + srpski dinari + din. + + + Ruska rublja + ruske rublje + ruskih rublji + ruska rublja + ruskih rublji + + + Ruska rublja (1991-1998) + ruske rublje (RUR) + ruskih rublji (RUR) + ruska rublja (RUR) + ruskih rublji (RUR) + + + Ruandski franak (RWF) + ruandska franka + ruandskih franaka + ruandski franak + ruandski franci + + + Saudijski rijal (SAR) + saudijska rijala + saudijskih rijala + saudijski rijal + saudijski rijal + + + Solomonska ostrva dolar (SBD) + solomonskoostrvska dolara + solomonskoostrvskih dolara + solomonskoostrvski dolar + solomonskoostrvski dolar + + + Sejšelski rupi (SCR) + sejšelske rupije + sejšelskih rupija + sejšelska rupija + sejšelska rupija + + + STari sudanski dinar (SDD) + stara sudanska dinara + starih sudanskih dinara + stari sudanski dinar + stari sudanski dinar + + + Sudanska funta (SDG) + sudanske funte + sudanskih funti + sudanska funta + sudanska funta + + + Stara sudanska funta (SDP) + stare sudanske funte + starih sudanskih funti + stara sudanska funta + stara sudanska funta + + + Švedska kruna + švedske krune + švedskih kruna + švedska kruna + švedskih kruna + + + Singapurski dolar + singapurška dolara + singapurških dolara + singapurški dolar + singapurških dolara + + + Sv. Helenska funta (SHP) + sv. jelenske funte + sv. jelenskih funti + sv. jelenska funta + sv. jelenska funta + + + Slovenski tolar + slovenačka tolara + slovenačkih tolara + slovenački tolar + slovenačkih tolara + + + Slovačka kruna + slovačke kune + slovačkih kuna + slovačka kuna + slovačkih kuna + + + Sijeraleonski leone (SLL) + sijeraleonske leone + sijeraleonskih leona + sijeraleonska leona + sijeraleonske leone + + + Somalijski šiling (SOS) + somalijska šilinga + somalijskih šilinga + somalijski šiling + somalijski šilinzi + + + Surinamski dolar (SRD) + surinamska dolara + surinamskih dolara + surinamski dolar + surinamski dolar + + + Surinamski gilder (SRG) + surinamska guldena + surinamskih guldena + surinamski gulden + surinamski gulden + + + Sao Tome i Principe dobra (STD) + dobra Sao Toma i Principa + dobra Sao Toma i Principa + dobra Sao Toma i Principa + dobra Sao Toma i Principa + + + Sovjetska rublja (SUR) + sovjetske rublje + sovjetskih rublji + sovjetska rublja + sovjetske rublje + + + Salvadorski kolon (SVC) + salvadorska kolona + salvadorskih kolona + salvadorski kolon + salvadorski kolon + + + Sirijska funta (SYP) + sirijske funte + sirijskih funti + sirijska funta + sirijske funtie + + + Švazi lilangeni (SZL) + svazi lilangena + svazi lilangena + svazi lilangena + svazi lilangena + + + Tai baht (THB) + tajlandske bahte + tajlandskih bahta + tajlandska bahta + tajlandska bahta + + + Tadžakistanska rublja (SYR) + tadžikistanske rublje + tadžikistanskih rublji + tadžikistanska rublja + tadžikistanska rublja + + + Tadžikistanski somoni (TJS) + tadžikistanska somona + tadžikistanskih somona + tadžikistanski somon + tadžikistanski somon + + + Turkmenistanski manat (TMM) + turkmenistanska manata + turkmenistanskih manata + turkmenistanski manat + turkmenistanski manat + + + Tunizijski dinar (TND) + tunizijska dinara + tunizijskih dinara + tunizijski dinar + tunizijski dinar + + + Tongška Paʻanga (TOP) + tongaške pa'ange + tongaških pa'angi + tongaška pa'anga + tongaška pa'anga + + + Timorški eskudo (TPE) + timorska eskuda + timorskih eskuda + timorski eskudo + timorski eskudo + + + Stara turska lira (TRL) + stare turske lire + starih turskih lira + stara turska lira + stara turska lira + + + Turska lira + turske lire + turskih lira + turska lira + novih turskih lira + + + Trinidad i Tobago dolar (TTD) + trinidadtobaška dolara + trinidadtobaških dolara + trinidadtobaški dolar + trinidadtobaški dolar + + + Novi tajvanski dolar + nova tajvanska dolara + novih tajvanskih dolara + novi tajvanski dolar + novi tajvanski dolari + + + Tanzijski šiling (TZS) + tanzanijska šilinga + tanzanijskih šilinga + tanzanijski šiling + tanzanijski šilinzi + + + Ukrajinska hrivnja + ukrajinske hrivnje + ukrajinskih hrivnji + ukrajinska hrivnja + ukrajinskih hrivnji + + + Ukrajinski karbovaneti (UAK) + ukrajinska karbovantsiva + ukrajinskih karbovantsiva + ukrajinski karbovantsiv + ukrajinski karbovantsiv + + + Ugandijski šiling (1966-1987) (UGS) + ugandska šilinga (UGS) + ugandskih šilinga (UGS) + ugandski šiling (UGS) + ugandski šiling (UGS) + + + Ugandijski šiling (UGX) + ugandska šilinga + ugandskih šilinga + ugandski šiling + ugandski šilinzi + + + Američki dolar + američka dolara + američkih dolara + američki dolar + američkih dolara + + + SAD dolar (sledeći dan) (USN) + američka dolara (sledeći dan) + američkih dolara (sledeći dan) + američki dolar (sledeći dan) + američki dolar (sledeći dan) + + + SAD dolar (isti dan) (USS) + američka dolara (isti dan) + američkih dolara (isti dan) + američki dolar (isti dan) + američki dolar (isti dan) + + + Urugvajski pezo en unidades indeksades (UYI) + urugvajska pesosa en unidades indexadas + urugvajskih pesosa en unidades indexadas + urugvajski pesos en unidades indexadas + urugvajski pesos en unidades indexadas + + + Urugvajski pezo (1975-1993) (UYP) + urugvajska pezosa (UYP) + urugvajskih pezosa (UYP) + urugvajski pezos (UYP) + urugvajski pezos (UYP) + + + Urugvajski pezo (UYU) + urugvajska pezosa + urugvajskih pezosa + urugvajski pezos + urugvajski pezos + + + Uzbekistanski som (UZS) + uzbekistanska soma + uzbekistanskih soma + uzbekistanski som + uzbekistanski som + + + Venecuelanski bolivar + venecuelska bolivara + venecuelskih bolivara + venecuelski bolivar + venecuelskih bolivara + + + Venecuelanska bolivija fuerte (VEF) + venezuelanska bolivara fuertes + venezuelanskih bolivara fuertes + venezuelanski bolivar fuertes + venezuelanski bolivar fuertes + + + Vijetnamski dong + vijetnamska donga + vijetnamskih donga + vijetnamski dong + vijetnamski dong + + + Vanatuški vatu (VUV) + vanuatska vatua + vanuatskih vatua + vanuatski vatu + vanuatski vatui + + + Samoanska tala (WST) + samoanske tale + samoanskih tala + samoanska tala + samoanska tala + + + CFA franak BEAC (XAF) + CFA franka BEAC + CFA franaka BEAC + CFA franak BEAC + CFA franci BEAC + + + Srebro (CAG) + srebra + srebra + srebro + srebro + + + Zlato (XAU) + zlata + zlata + zlato + zlato + + + Evropska kompozitna jedinica (XBA) + evropske složene jedinice + evropskih složenih jedinica + evropska složena jedinica + evropska složena jedinica + + + Evropska novčana jedinica (XBB) + evropske monetarne jedinice + evropskih monetarnih jedinica + evropska monetarna jedinica + evropska monetarna jedinica + + + Evropska jedinica računa (XBC) + evropske obračunske jedinice (XBC) + evropskih obračunskih jedinica (XBC) + evropska obračunska jedinica (XBC) + evropska obračunska jedinica (XBC) + + + Evropska jedinica računa (XBD) + evropske obračunske jedinice (XBD) + evropskih obračunskih jedinica (XBD) + evropska obračunska jedinica (XBC + evropska obračunska jedinica (XBC + + + Istočnokaribijski dolar (XCD) + istočnokaripska dolara + istočnokaripskih dolara + istočnokaripski dolar + istočnokaripski dolar + + + Posebna prava (XDR) + posebna crtaća prava + posebnih crtaćih prava + posebno crtaće pravo + posebnih crtaćih prava + + + Evropska valutna jedinica (XEU) + evropske monetarne jedinice (ECU) + evropskih monetarnih jedinica (ECU) + evropska monetarna jedinica (ECU) + evropskih monetarnih jedinica (ECU) + + + Francuski zlatni frank (XFO) + francuska zlatna franka + francuskih zlatnih franaka + francuski zlatni franak + francuskih zlatnih franaka + + + Francuski UIC-frank (XFU) + francuska UIC-franka + francuskih UIC-franaka + francuski UIC-franak + francuskih UIC-franaka + + + CFA franak BCEAO (XOF) + CFA franka BCEAO + CFA franaka BCEAO + CFA franak BCEAO + CFA franci BCEAO + + + Paladijum (XPD) + paladijuma + paladijuma + paladijum + paladijuma + + + CFP franak (XPF) + CFP franaka + CFP franaka + CFP franak + CFP franci + + + Platina (XPT) + platine + platina + platina + platina + + + RINET fondovi (XRE) + RINET fonda + RINET fondova + RINET fond + RINET fondova + + + Kod testirane valute (XTS) + ispitna koda valute + ispitnih kodova valute + ispitni kod valute + ispitnih kodova valute + + + Nepoznata ili nevažeća valuta + nepoznate ili nevažeće valute + nepoznatih ili nevažećih valuta + nepoznate ili nevažeće valute + nepoznatih ili nevažećih valuta + + + Jemenski dinar (YDD) + jemenska dinara + jemenskih dinara + jemenski dinar + jemenskih dinara + + + Jemenski rial (YER) + jemenska rijala + jemenskih rijala + jemenski rijal + jemenski rijali + + + Jugoslovenski tvrdi dinar (YUD) + jugoslovenska čvrsta dinara + jugoslovenskih čvstih dinara + jugoslovenski čvrsti dinar + jugoslovenskih čvstih dinara + + + Jugoslovenski novi dinar (YUM) + jugoslovenska nova dinara + jugoslovenskih novih dinara + jugoslovenski novi dinar + jugoslovenskih novih dinara + + + Jugoslovenski konvertibilni dinar (YUN) + jugoslovenska konvertibilna dinara + jugoslovenskih konvertibilnih dinara + jugoslovenski konvertibilni dinar + jugoslovenskih konvertibilnih dinara + + + Južnoafrički rand (finansijski) ZAL + južnoafrička randa (financijska) + južnoafičkih randa (financijskih) + južnoafrički rand (financijski) + južnoafičkih randa (financijskih) + + + Južna Afrika Rand + južnoafrička randa + južnoafričkih randa + južnoafrički rand + južnoafričkih randa + + + Zambijska kvača (ZMK) + zambijske kvače + zambijskih kvača + zambijska kvača + zambijske kvače + + + Zairski novi zair (ZRN) + zairska nova zaira + zairskih novih zaira + zairski novi zair + zairskih novih zaira + + + Zairski zair (ZRZ) + zairska zaira + zairskih zaira + zairski zair + zairskih zaira + + + Zimbabvejski dolar (ZWD) + zimbabvejska dolara + zimbabvejskih dolara + zimbabvejski dolar + zimbabvejski dolari + + + + + + {0} dana + {0} dana + {0} dan + {0} dana + + + {0} sata + {0} sati + {0} sat + {0} sati + + + {0} minute + {0} minuta + {0} minut + {0} minuta + + + {0} meseca + {0} meseci + {0} mesec + {0} meseci + + + {0} sekunde + {0} sekundi + {0} sekunda + {0} sekundi + + + {0} nedelje + {0} nedelja + {0} nedelja + {0} nedelja + + + {0} godine + {0} godina + {0} godina + {0} godina + + + + + da:d + ne:n + + + + diff --git a/lib/zend/Zend/Locale/Data/sr_Latn_BA.xml b/lib/zend/Zend/Locale/Data/sr_Latn_BA.xml new file mode 100644 index 0000000000..8dd5241433 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sr_Latn_BA.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + världen + Afrika + Nordamerika + Sydamerika + Oceanien + Västafrika + Centralamerika + Östafrika + Nordafrika + Centralafrika + södra Afrika + Nord- och Sydamerika + norra Amerika + Karibien + Östasien + södra Asien + Sydostasien + Sydeuropa + Australien och Nya Zeeland + Melanesien + Mikronesiska öarna + Polynesien + södra Centralasien + Asien + Centralasien + Västasien + Europa + Östeuropa + Nordeuropa + Västeuropa + Oberoende staters samvälde + Latinamerika och Karibien + Kanalöarna + Andorra + Förenade Arabemiraten + Afghanistan + Antigua och Barbuda + Anguilla + Albanien + Armenien + Nederländska Antillerna + Angola + Antarktis + Argentina + Amerikanska Samoa + Österrike + Australien + Aruba + Åland + Azerbajdzjan + Bosnien och Hercegovina + Barbados + Bangladesh + Belgien + Burkina Faso + Bulgarien + Bahrain + Burundi + Benin + S:t Barthélemy + Bermuda + Brunei + Bolivia + Brasilien + Bahamas + Bhutan + Bouvetön + Botswana + Vitryssland + Belize + Kanada + Kokosöarna + Kongo-Kinshasa + Centralafrikanska republiken + Kongo-Brazzaville + Schweiz + Elfenbenskusten + Cooköarna + Chile + Kamerun + Kina + Colombia + Costa Rica + Serbien och Montenegro + Kuba + Kap Verde + Julön + Cypern + Tjeckien + Tyskland + Djibouti + Danmark + Dominica + Dominikanska republiken + Algeriet + Ecuador + Estland + Egypten + Västsahara + Eritrea + Spanien + Etiopien + Finland + Fiji + Falklandsöarna + Mikronesien + Färöarna + Frankrike + Gabon + Storbritannien + Grenada + Georgien + Franska Guyana + Guernsey + Ghana + Gibraltar + Grönland + Gambia + Guinea + Guadeloupe + Ekvatorialguinea + Grekland + Sydgeorgien och Södra Sandwichöarna + Guatemala + Guam + Guinea-Bissau + Guyana + Hongkong (S.A.R. Kina) + Heard- och McDonaldöarna + Honduras + Kroatien + Haiti + Ungern + Indonesien + Irland + Israel + Isle of Man + Indien + Brittiska Indiska oceanöarna + Irak + Iran + Island + Italien + Jersey + Jamaica + Jordanien + Japan + Kenya + Kirgizistan + Kambodja + Kiribati + Komorerna + S:t Kitts och Nevis + Nordkorea + Sydkorea + Kuwait + Caymanöarna + Kazakstan + Laos + Libanon + S:t Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Litauen + Luxemburg + Lettland + Libyen + Marocko + Monaco + Moldavien + Montenegro + S:t Martin + Madagaskar + Marshallöarna + Makedonien + Mali + Myanmar + Mongoliet + Macao (S.A.R. Kina) + Nordmarianerna + Martinique + Mauretanien + Montserrat + Malta + Mauritius + Maldiverna + Malawi + Mexiko + Malaysia + Moçambique + Namibia + Nya Kaledonien + Niger + Norfolkön + Nigeria + Nicaragua + Nederländerna + Norge + Nepal + Nauru + Niue + Nya Zeeland + Oman + Panama + Peru + Franska Polynesien + Papua Nya Guinea + Filippinerna + Pakistan + Polen + S:t Pierre och Miquelon + Pitcairn + Puerto Rico + Palestinska territoriet + Portugal + Palau + Paraguay + Qatar + Yttre öar i Oceanien + Europeiska unionen + Réunion + Rumänien + Serbien + Ryssland + Rwanda + Saudiarabien + Salomonöarna + Seychellerna + Sudan + Sverige + Singapore + S:t Helena + Slovenien + Svalbard och Jan Mayen + Slovakien + Sierra Leone + San Marino + Senegal + Somalia + Surinam + São Tomé och Príncipe + El Salvador + Syrien + Swaziland + Turks- och Caicosöarna + Tchad + Franska Sydterritorierna + Togo + Thailand + Tadzjikistan + Tokelau + Östtimor + Turkmenistan + Tunisien + Tonga + Turkiet + Trinidad och Tobago + Tuvalu + Taiwan + Tanzania + Ukraina + Uganda + USA:s yttre öar + USA + Uruguay + Uzbekistan + Vatikanstaten + S:t Vincent och Grenadinerna + Venezuela + Brittiska Jungfruöarna + Amerikanska Jungfruöarna + Vietnam + Vanuatu + Wallis- och Futunaöarna + Samoa + Jemen + Mayotte + Sydafrika + Zambia + Zimbabwe + okänd eller ogiltig regionkod + + + traditionell tysk stavning + 1994 års resisk stavning + 1996 års reformerad tysk stavning + 1606 års stavning + 1694 års stavning + östarmeniska + västarmeniska + 1926 års stavning + Bila-dialekt + boontling + internationell fonetisk notation - IPA + uralisk fonetisk notation + Lipovaz-dialekt + monotonisk stavning + natisonsk dialekt + Njiva-dialekt + Osojane-dialekt + polytonisk stavning + reformerad stavning + resisk dialekt + saho-dialekt + skotska + scouse + Solbica-dialekt + Taraskievika-stavning + valensisk dialekt + + + kalender + sorteringsordning + valuta + + + traditionell kinesiska i big5-ordning + buddistisk kalender + kinesisk kalender + direkt ordning + förenklad kinesiska i gb2312-ordning + gregoriansk kalender + hebreisk kalender + indisk kalender + islamisk kalender + islamisk civil kalender + japansk kalender + telefonkatalogsordning + pinyinordning + kinesiska republikens kalender + streckordning + traditionell ordning + + + engelska enheter + SI-enheter + + + språk: {0} + skrift: {0} + område: {0} + + + + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + lowercase-words + titlecase-words + lowercase-words + lowercase-words + + + [a à b-e é f-z å ä ö] + [á à â ã ā ç é ë í-ï ī ñ ó ú w ÿ ü æ ø] + [a-c č d-l ł m-z] + + + ” + ” + ’ + ’ + + + {0} till {1} + + + fm + em + + + + EEEE d MMMM y + + + + + d MMMM y G + + + + + d MMM y G + + + + + yyyy-MM-dd + + + + + + MMM -yy + + + + + + + + tout + bâbâ + hâtour + kiahk + toubah + amshîr + barmahât + barmoudah + bashans + ba’ounah + abîb + misra + al-nasi + + + + + + + + + mäskäräm + teqemt + hedar + tahesas + yäkatit + mägabit + miyazya + guenbot + säné + hamlé + nähasé + pagumén + + + + + + + + + jan + feb + mar + apr + maj + jun + jul + aug + sep + okt + nov + dec + + + januari + februari + mars + april + maj + juni + juli + augusti + september + oktober + november + december + + + + + J + F + M + A + M + J + J + A + S + O + N + D + + + + + + + sön + mån + tis + ons + tors + fre + lör + + + söndag + måndag + tisdag + onsdag + torsdag + fredag + lördag + + + + + S + M + T + O + T + F + L + + + + + + + K1 + K2 + K3 + K4 + + + 1:a kvartalet + 2:a kvartalet + 3:e kvartalet + 4:e kvartalet + + + + + 1 + 2 + 3 + 4 + + + + fm + em + + + före Kristus + efter Kristus + + + f.Kr. + e.Kr. + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + yyyy-MM-dd + + + + + + + 'kl'. HH.mm.ss zzzz + + + + + HH.mm.ss z + + + + + HH.mm.ss + + + + + HH.mm + + + + + + HH.mm + HH.mm.ss + H.mm + L + E d/M + LLL + E d MMM + EEE d MMMM + E d MMMM + d MMMM + d MMM + d/M + dd/MM + d/M + d + hh.mm a + h.mm.ss a + mm.ss + y + yyyy-MM + EEE, yyyy-MM-dd + y MMM + EEE d MMM y + y MMMM + yyyy Q + y QQQ + yy-MM + MMM -yy + Q yy + yyyy-MM + MMM y + QQQQ y + + + {0} – {1} + + M–M + + + E d/M – E d/M + E d/M – E d/M + + + MMM–MMM + + + E d MMM – E d MMM + E d – E d MMM + + + LLLL–LLLL + + + d MMM – d MMM + d–d MMM + + + d/M – d/M + d–d/M + + + d–d + + + HH–HH + HH-HH + + + HH.mm–HH.mm + HH.mm–HH.mm + HH.mm–HH.mm + + + HH.mm–HH.mm v + HH.mm–HH.mm v + HH.mm-HH.mm v + + + HH–HH v + HH–HH v + + + y–y + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + + + MMM–MMM y + MMM y – MMM y + + + E dd MMM–E dd MMM y + E dd MMM–E dd MMM y + E dd MMM y–E dd MMM y + + + yyyy-MM – MM + yyyy-MM – yyyy-MM + + + d MMM–d MMM y + d–d MMM y + d MMM y–d MMM y + + + yyyy-MM-dd – MM-dd + yyyy-MM-dd – dd + yyyy-MM-dd – yyyy-MM-dd + + + + + + era + + + år + + + månad + + + vecka + + + dag + för tre dagar sedan + i förrgår + igår + idag + imorgon + i övermorgon + om tre dagar + + + veckodag + + + fm/em + + + timme + + + minut + + + sekund + + + tidszon + + + + + + + + tishrí + heshván + kislév + tevét + shevát + adár + adár II + nisán + ijjár + siván + tammúz + ab + elúl + + + + + + + + + chaitra + vaishākh + jyaishtha + āshādha + shrāvana + bhādrapad + āshwin + kārtik + mārgashīrsha + paush + māgh + phālgun + + + + + + Saka-eran + + + SE + + + + + + + + muharram + safar + rabi’ al-awwal + rabi’ al-akhir + jumada-l-ula + jumada-l-akhira + rajab + sha’ban + ramadan + shawwal + dhu-l-ga’da + dhu-l-hijja + + + + + + + + + farvardin + ordibehesht + khordād + tir + mordād + shahrivar + mehr + ābān + āzar + dey + bahman + esfand + + + + + + + + före R.K. + R.K. + + + + + + +HH.mm;-HH.mm + GMT{0} + UTC + {0} + {1} ({0}) + + Okänd + + + Tirana + + + Jerevan + + + Curaçao + + + sydpolen + + + Dumont d’Urville + + + Ushuaïa + + + San Salvador de Jujuy + + + Córdoba + + + Pango Pango + + + Wien + + + Dacca + + + Bryssel + + + Porto Novo + + + Eirunepé + + + Cuiabá + + + Belém + + + São Paulo + + + Maceió + + + Thimpu + + + Gabonore + + + Régina + + + Montréal + + + St. Johns + + + Zürich + + + Påskön + + + Bogotá + + + Havanna + + + Kap Verde + + + Julön + + + Prag + + + Köpenhamn + + + Alger + + + Galápagos + + + Tallin + + + Kairo + + + Kanarieöarna + + + Addis Abeba + + + Helsingfors + + + Torshamn + + + Qaanaaq + + + Godthåb + + + Ittoqqortoormiit + + + Danmarkshamn + + + Malobo + + + Aten + + + Grytviken + + + Hongkong + + + Tequciqalpa + + + Port au Prince + + + Kolkata + + + Bagdad + + + Teheran + + + Rom + + + S:t Kitts + + + Söul + + + Aqtöbe + + + Alma-Ata + + + S:t Lucia + + + Vadus + + + Luxemburg + + + Chrisinau + + + Podgorika + + + Ulan Bator + + + Tjojbalsan + + + Macao + + + Maldiverna + + + Mazatlán + + + Mérida + + + Cancún + + + Kathmandu + + + Muskat + + + Manilla + + + Warszawa + + + Azorerna + + + Lissabon + + + Asunción + + + Réunion + + + Bukarest + + + Belgrad + + + Moskva + + + Jekaterinburg + + + Krasnojarsk + + + Jakutsk + + + Sachalin + + + Kamtjatka + + + Anadir + + + Ljubliana + + + São Tomé + + + San Salvador + + + Damaskus + + + Dusjanbe + + + Uzjgorod + + + Zaporizjzja + + + North Dakota + + + Tasjkent + + + Saint Vincent + + + Saint Thomas + + + Lukasa + + + + västbrasiliansk tid + västbrasiliansk normaltid + västbrasiliansk sommartid + + + + + afghanisk tid + afghanisk normalid + afghanisk sommartid + + + + + centralafrikansk tid + centralafrikansk tid + centralafrikansk sommartid + + + + + östafrikansk tid + östafrikansk normaltid + östafrikansk sommartid + + + + + västsaharisk tid + västsaharisk normaltid + västsaharisk sommartid + + + + + sydafrikansk tid + sydafrikansk normaltid + sydafrikansk sommartid + + + + + västafrikansk tid + västafrikansk normaltid + västafrikansk sommartid + + + + + Aqtöbetid + Aqtöbenormaltid + Aqtöbesommartid + + + + + alaskatid + Alaska, normaltid + Alaska, sommartid + + + + + hawaiiansk tid + hawaiisk normaltid + hawaiisk sommartid + + + + + Alma-Atatid + Alma-Atanormaltid + Alma-Atasommartid + + + + + amazonastid + Amazonasnormaltid + Amazonassommartid + + + + + centralnordamerikansk tid + Central, normaltid + Central, sommartid + + + + + östnordamerikansk tid + Eastern, normaltid + Eastern, sommartid + + + + + Klippiga Bergentid + Mountain, normaltid + Mountain, sommartid + + + + + västnordamerikansk tid + Pacific, normaltid + Pacific, sommartid + + + + + Anadirtid + Anadirnormaltid + Anadirsommartid + + + + + Aqtautid + Aqtaunormaltid + Aqtausommartid + + + + + Aqtöbetid + Aqtöbenormaltid + Aqtöbesommartid + + + + + saudiarabisk tid + saudiarabisk normaltid + saudiarabisk sommartid + + + AT (saudiarabisk) + AST (saudiarabisk) + ADT (saudiarabisk) + + + + + östargentinsk tid + östargentinsk normaltid + östargentinsk sommartid + + + + + västargentinsk tid + västargentinsk normaltid + västargentinsk sommartid + + + + + armenisk tid + armenisk normaltid + armenisk somartid + + + + + Ashkhabadtid + Ashkhabadnormaltid + Ashkhabadsommartid + + + + + nordamerikansk atlanttid + Atlantic, normaltid + Atlantic, sommartid + + + + + centralaustralisk tid + centralaustralisk normaltid + centralaustralisk sommartid + + + + + Euclatid + Euclanormaltid + Euclasommartid + + + + + östaustralisk tid + östaustralisk normaltid + östaustralisk sommartid + + + + + västaustralisk tid + västaustralisk normaltid + västaustralisk sommartid + + + + + azerbajdzjansk tid + azerbajdzjansk normaltid + azerbajdzjansk sommartid + + + + + azorisk tid + azorisk normaltid + azorisk sommartid + + + + + Bakutid + Bakunormaltid + Bakusommartid + + + + + bangladeshisk tid + bangladeshisk normaltid + bangladeshisk sommartid + + + + + beringsundstid + beringsundsnormaltid + beringsundssommartid + + + + + bhutansk tid + bhutansk normaltid + bhutansk sommartid + + + + + boliviansk tid + boliviansk normaltid + boliviansk sommartid + + + + + borneotid + Borneonormaltid + Borneosommartid + + + + + brasiliansk tid + Brasilianormaltid + Brasiliasommartid + + + + + brittisk tid + brittisk normaltid + brittisk sommartid + + + + + Bruneitid + Bruneinormaltid + Bruneisommartid + + + + + Kap Verdetid + Kap Verdenormaltid + Kap Verdesommartid + + + + + chamorrotid + Chamorronormaltid + Chamorrosommartid + + + + + changbaitid + Changbainormaltid + Changbaisommartid + + + + + Chathamtid + Chathamnormaltid + Chathamsommartid + + + + + chilensk tid + chilensk normaltid + chilensk sommartid + + + + + kinesisk tid + Kina, normaltid + Kina, sommartid + + + + + Choibalsantid + Choibalsannormaltid + Choibalsansommartid + + + + + Julöns tid + Julöns normaltid + Julöns sommartid + + + + + Keelingöarnas tid + Keelingöarnas normaltid + Keelingöarnas sommartid + + + + + colombiansk tid + colombiansk normaltid + colombiansk sommartid + + + + + Cooköarnas tid + Cooköarnas normaltid + Cooköarnas sommartid + + + + + kubansk tid + kubansk normaltid + kubansk sommartid + + + CT (Kuba) + CST (Kuba) + CDT (Kuba) + + + + + daccatid + Dhakanormaltid + Dhakasommartid + + + + + dominikansk tid + dominikansk normaltid + dominikansk sommartid + + + + + Dushanbetid + Dushanbenormaltid + Dushanbesommartid + + + + + Holländska Guianatid + Holländska Guiananormaltid + Holländska Guianasommartid + + + + + östimoransk tid + östimorisk normaltid + östimorisk sommartid + + + + + Påsköns tid + Påsköns normaltid + Påsköns sommartid + + + + + equadoriansk tid + equadoriansk normaltid + equadoriansk sommartid + + + + + centraleuropeisk tid + Centraleuropa, normaltid + Centraleuropa, sommartid + + true + + + + östeuropeisk tid + Östeuropa, normaltid + Östeuropa, sommartid + + true + + + + västeuropeisk tid + västeuropeisk normaltid + västeuropeisk sommartid + + true + + + + falklandsöarnas tid + falklandsöarnas normaltid + falklandsöarnas sommartid + + + + + Fijis tid + Fijis normaltid + Fijis sommartid + + + + + Franska Guianatid + Franska Guiananormaltid + Franska Guianasommartid + + + + + Franska Sydterritoriernas tid + Franska Sydterritoriernas normaltid + Franska Sydterritoriernassommartid + + + + + Bisjkektid + Bisjkeknormaltid + Bisjkeksommartid + + + + + Greenwichtid + Greenwichtid + Greenwichtid har per definition ingen sommartid + + true + + + + galapagostid + Galápagosnormaltid + Galápagossommartid + + + + + Gambiertid + Gambiernormaltid + Gambiersommartid + + + + + georgientid + georgisk normaltid + georgisk sommartid + + + + + Kiribatitid + Kiribatinormaltid + Kiribatisommartid + + + + + Goose Baytid + Goose Baynormaltid + Goose Baysommartid + + + + + centralgrönländsk tid + centralgrönländsk normaltid + centralgrönländsk sommartid + + + + + östgrönländsk tid + östgrönländsk normaltid + östgrönländsk sommartid + + + + + västgrönländsk tid + västgrönländsk normaltid + västgrönländsk sommartid + + + + + Guamtid + Guamnormaltid + Guamsommartid + + + + + persiska golfen-tid + persiska golfen-tid + Persiska Golfensommartid + + + + + Guyanatid + Guyananormaltid + Guyanasommartid + + + + + Honolulutid + Honolulunormaltid + Honolulusommartid + + + + + Hongkongtid + Hongkongnormaltid + Hongkongsommartid + + + + + Hovdtid + Hovdnormaltid + Hovdsommartid + + + + + indisk tid + indisk normaltid + indisk sommartid + + + + + Brittiska Indiska oceanöarnas tdi + Brittiska Indiska oceanöarnas normaltdi + Brittiska Indiska oceanöarnas sommartdi + + + + + indokinesisk tid + indokinesisk normaltid + indokinesisk sommartid + + + + + centralindonesisk tid + centralindonesisk normaltid + centralindonesisk sommartid + + + + + östindonesisk tid + östindonesisk normaltid + östindonesisk sommartid + + + + + västindonesisk tid + västindonesisk normaltid + västindonesisk sommartid + + + + + iransk tid + iransk normaltid + iransk sommartid + + + + + irländsk tid + irländsk normaltid + irländsk sommartid + + + + + Irkutsktid + Irkutsknormaltid + Irkutsksommartid + + + + + israelisk tid + Israel, normaltid + Israel, sommartid + + + IST (Israel) + + + + + japansk tid + Japan, normaltid + Japan, sommartid + + + + + Kamtjatkatid + Kamtjatkanormaltid + Kamtjatkasommartid + + + + + Karachitid + Karachinormaltid + Karachisommartid + + + + + Kashgartid + Kashgarnormaltid + Kashgarsommartid + + + + + Alma-Atatid + Alma-Atanormaltid + Alma-Atasommartid + + + + + Aktautid + Aktaunormaltid + Aktausommartid + + + + + Qyzylordatid + Qyzylordanormaltid + Qyzylordasommartid + + + + + koreansk tid + koreansk normaltid + koreansk sommartid + + + + + Kosraetid + Kosraenormaltid + Kosraesommartid + + + + + Krasnojarsktid + Krasnojarsknormaltid + Krasnojarsksommartid + + + + + Kuybyshevtid + Kuybyshevnormaltid + Kuybyshevsommartid + + + + + Marshallöarnas tid + Marshallöarnas normaltid + Marshallöarnas sommartid + + + + + kirgizisk tid + kirgizisk normaltid + kirgizisk sommartid + + + + + Sri Lankatid + Sri Lankanormaltid + Sri Lankasommartid + + + + + liberiansk tid + liberiansk normaltid + liberiansk sommartid + + + LBT + LBST + + + + + Lineöarnas tid + Lineöarnas normaltid + Lineöarnas sommartid + + + LINT + LINST + + + + + Chongqingtid + Chongqingnormaltid + Chongqingsommartid + + + + + Lord Howetid + Lord Howenormaltid + Lord Howesommartid + + + + + Macautid + Macaunormaltid + Macausommartid + + + + + Magadantid + Magadannormaltid + Magadansommartid + + + + + malaysisk tid + malaysisk normaltid + malaysisk sommartid + + + + + malaysisk tid + malaysisk normaltid + malaysisk sommartid + + + + + Maldivernas tid + Maldivernas normaltid + Maldivernas sommartid + + + + + Marquesastid + Marquesasnormaltid + Marquesassommartid + + + + + Marshallötid + Marshallönormaltid + Marshallösommartid + + + + + Mauritiustid + Mauritiustid + Mauritiussommartid + + + + + Ulan Bator-tid + Ulan Batornormaltid + Ulan Batorsommartid + + + + + Moskvatid + Moskvanormaltid + Moskvasommartid + + + + + burmesisk tid + burmesisk normaltid + burmesisk sommartid + + + + + Naurutid + Naurunormaltid + Naurusommartid + + + + + nepalesisk tid + nepalesisk normaltid + nepalesisk sommartid + + + + + Nya Kaledonientid + Nya Kaledoniennormaltid + Nya Kaledoniensommartid + + + + + nyzeeländsk tid + nyzeeländsk normaltid + nyzeeländsk sommartid + + + + + New Foundland-tid + Newfoundland, normaltid + Newfoundland, sommartid + + + + + Niuetid + Niuenormaltid + Niuesommartid + + + + + Norfolköns tid + Norfolköns normaltid + Norfolköns sommartid + + + + + Fernando de Noronhatid + Fernando de Noronhanormalid + Fernando de Noronhasommartid + + + + + Nordmarianernas tid + Nordmarianernas normaltid + Nordmarianernas sommartid + + + + + Novosibirsktid + Novosibirsknormaltid + Novosibirsksommartid + + + + + Omsktid + Omsknormaltid + Omsksommartid + + + + + Oraltid + Oralnormaltid + Oralsommartid + + + + + pakistansk tid + pakistansk normaltid + pakistansk sommartid + + + + + Palautid + Palaunormaltid + Palausommartid + + + + + Papua Nya Guineas tid + Papua Nya Guineas normaltid + Papua Nya Guineas sommartid + + + + + paraguyansk tid + paraguyansk normalid + paraguyansk sommartid + + + + + peruansk tid + peruansk normalid + peruansk sommartid + + + + + filippinsk tid + filippinsk normaltid + filippinsk sommartid + + + + + Enderburytid + Enderburynormaltid + Enderburysommartid + + + + + Pierre och Miquelontid + Pierre och Miquelonnormalid + Pierre och Miquelonsommartid + + + + + Pitcairntid + Pitcairnnormaltid + Pitcairnsommartid + + + + + Ponapetid + Ponapenormaltid + Ponapesommartid + + + + + Qyzylordatid + Qyzylordanormaltid + Qyzylordasommartid + + + + + Réuniontid + Réunionnormaltid + Réunionsommartid + + + + + Sachalintid + Sachalinnormaltid + Sachalinsommartid + + + + + Samaratid + Samaranormaltid + Samarasommartid + + + + + Samarkandtid + Samarkandnormaltid + Samarkandsommartid + + + + + samoansk tid + samoansk normaltid + samoansk sommartid + + + + + Seychellernas tid + Seychellernas normaltid + Seychellernas sommartid + + + + + Aqtautid + Aqtaunormaltid + Aqtausommartid + + + + + Singaporetid + Singaporenormaltid + Singaporesommartid + + + + + Salomonöarnas tid + Salomonöarnas normaltid + Salomonöarnas sommartid + + + + + sydgeorgisk tid + sydgeorgisk normaltid + sydgeorgisk sommartid + + + + + Surinamtid + Surinamnormaltid + Surinamsommartid + + + + + Sverdlovsktid + Sverdlovsknormaltid + Sverdlovsksommartid + + + + + Tahititid + Tahitinormaltid + Tahitisommartid + + + + + Tadzjikistantid + Tadzjikistannormaltid + Tadzjikistansommartid + + + + + uzbekisk tid + uzbekisk normaltid + uzbekisk sommartid + + + + + georgisk tid + georgisk normaltid + georgisk sommartid + + + + + Tokelautid + Tokelaunormaltid + Tokelausommartid + + + + + Tongatid + Tongatid + Tongasommmartid + + + + + Truktid + Truknormaltid + Truksommartid + + + + + turkisk tid + turkisk normaltid + turkisk sommartid + + + + + turkmenisk tid + turkmenisk normaltid + turkmenisk sommartid + + + + + Tuvalutid + Tuvalunormaltid + Tuvalusommartid + + + + + Oraltid + Oralnormaltid + Oralsommartid + + + + + uruguayansk tid + uruguayansk normaltid + uruguayansk sommartid + + + + + Urumqitid + Urumqinormaltid + Urumqisommartid + + + + + uzbeskisk tid + uzbeskisk normaltid + uzbeskisk sommartid + + + + + Vanuatutid + Vanuatunormaltid + Vanuatusommartid + + + + + venezulansk tid + venezulansk normaltid + venezulansk sommartid + + + + + Vladivostoktid + Vladivostoknormaltid + Vladivostoksommartid + + + + + Volvogradtid + Volvogradnormaltid + Volvogradsommartid + + + + + Waketid + Wakenormaltid + Wakesommartid + + + + + Wallis- och Futunaöarnas tid + Wallis- och Futunaöarnas normaltid + Wallis- och Futunaöarnas sommartid + + + + + Jakutsktid + Jakutsknormaltid + Jakutsksommartid + + + + + Jekaterinburgtid + Jekaterinburgnormaltid + Jekaterinburgsommartid + + + + + Yerevantid + Yerevannormaltid + Yerevansommartid + + + + + Yukontid + Yukonnormaltid + Yukonsommartid + + + + + + + , +   + ; + % + 0 + # + + + − + ×10^ + ‰ + ∞ + ¤¤¤ + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + + + + andorransk peseta + andorransk peseta + andorranska pesetas + + + Förenade Arabemiratens dirham + Förenade Arabemiratens dirham + Förenade Arabemiratens dirham + + + afghani (1927-2002) + afghani (1927-2002) + afghani (1927-2002) + + + afghani + afghani + afghani + AFN + + + albansk gamla lek + albansk gammal lek + albanska gamla lek + + + albansk lek + albansk lek + albanska lek + + + armenisk dram + armenisk dram + armeniska dram + + + Nederländska Antillernas gulden + Nederländska Antillernas gulden + Nederländska Antillernas gulden + + + angolansk kwanza + angolansk kwanza + angolanska kwanza + AOA + + + angolansk kwanza (1977-1990) + angolansk kwanza (1977-1990) + angolanska kwanza (1977-1990) + + + angolansk ny kwanza (1990-2000) + angolansk kwanza (1990-1995) + angolanska nya kwanza (1990-2000) + + + angolansk kwanza reajustado (1995-1999) + angolansk kwanza reajustado (1995-1999) + angolanska kwanza reajustado (1995-1999) + + + argentinsk austral + argentinsk austral + argentinska australer + ARA + + + ARL + + + ARM + + + argentinsk peso (1983-1985) + argentinsk peso (1983-1985) + argentinska pesos (1983-1985) + + + argentinsk peso + argentinsk peso + argentinska pesos + ARS + + + österrikisk schilling + österrikisk schilling + österrikiska schilling + + + australisk dollar + australisk dollar + australiska dollar + + + Aruba-gulden + Aruba-gulden + Aruba-gulden + AWG + + + azerbajdzjansk manat (1993-2006) + azerbajdzjansk manat (1993-2006) + azerbajdzjanska manat (1993-2006) + + + azerbajdzjansk manat + azerbajdzjansk manat + AZN + AZN + + + bosnisk-hercegovinsk dinar + bosnisk-hercegovinsk dinar + bosnisk-hercegovinska dinarer + BAD + + + bosnisk-hercegovinsk mark (konvertibel) + bosnisk-hercegovinsk mark (konvertibel) + bosnisk-hercegovinska mark (konvertibla) + BAM + + + Barbados-dollar + Barbados-dollar + Barbados-dollar + + + bangladeshisk taka + bangladeshisk taka + bangladeshiska taka + + + belgisk franc (konvertibel) + belgisk franc (konvertibel) + belgiska franc (konvertibla) + + + belgisk franc + belgisk franc + belgiska franc + BEF + + + belgisk franc (finansiell) + belgisk franc (finansiell) + belgiska franc (finansiella) + + + bulgarisk lev (1962–1999) + bulgarisk hård lev (1962–1999) + bulgariska lev (1962–1999) + + + bulgarisk lev (1952–1962) + bulgariska lev (1952–1962) + + + bulgarisk ny lev + bulgarisk lev + bulgariska nya lev + + + Bahrain-dinar + Bahrain-dinar + BHD + BHD + + + burundisk franc + burundisk franc + burundiska franc + BIF + + + Bermuda-dollar + Bermuda-dollar + Bermuda-dollar + BMD + + + Brunei-dollar + Brunei-dollar + Brunei-dollar + BND + + + boliviano + boliviansk boliviano + boliviano + BOB + + + boliviansk peso + boliviansk peso + bolivianska pesos + BOP + + + boliviansk mvdol + boliviansk mvdol + bolivianska mvdol + + + brasiliansk cruzeiro novo (1967-1986) + brasiliansk cruzeiro (1967-1986) + brasilianska cruzeiro novo (1967-1986) + BRB + + + brasiliansk cruzado + brasiliansk cruzado + brasilianska cruzado + BRC + + + brasiliansk cruzeiro (1990-1993) + brasiliansk cruzeiro (1990-1993) + brasilianska cruzeiro (1990-1993) + BRE + + + brasiliansk real + brasiliansk real + brasilianska real + BRL + + + brasiliansk cruzado novo + brasiliansk cruzado novo + brasilianska cruzado novo + BRN + + + brasiliansk cruzeiro + brasiliansk cruzeiro + brasilianska cruzeiros + BRR + + + BRZ + + + Bahamas-dollar + Bahamas-dollar + Bahamas-dollar + BSD + + + bhutanesisk ngultrum + bhutanesisk ngultrum + bhutanesiska ngultrum + BTN + + + burmesisk kyat + burmesisk kyat + burmesiska kyat + + + botswansk pula + botswansk pula + botswanska pula + + + vitrysk ny rubel (1994-1999) + vitrysk rubel (1994-1999) + vitryska nya rubel (1994-1999) + + + vitrysk rubel + vitrysk rubel + vitryska rubel + + + belizisk dollar + belizisk dollar + BZD + BZD + + + kanadensisk dollar + kanadensisk dollar + kanadensiska dollar + CAD + + + kongolesisk franc + kongolesisk franc + kongolesiska franc + + + euro (konvertibelt konto, WIR Bank, Schweiz) + euro (WIR Bank) + euro (konvertibelt konto, WIR Bank, Schweiz) + + + schweizisk franc + schweizisk franc + schweiziska franc + CHF + + + franc (konvertibelt konto, WIR Bank, Schweiz) + franc (WIR Bank) + franc (konvertibelt konto, WIR Bank, Schweiz) + + + CLE + + + chilensk unidad de fomento + chilensk unidad de fomento + chilenska unidad de fomento + + + chilensk peso + chilensk peso + chilenska pesos + CLP + + + kinesisk dollar + kinesisk dollar + kinesiska dollar + + + kinesisk yuan renminbi + kinesisk yuan renminbi + kinesiska yuan renminbi + CNY + + + colombiansk peso + colombiansk peso + colombianska pesos + COP + + + colombiansk unidad de valor real + colombiansk unidad de valor real + colombianska unidad de valor real + + + costarikansk colón + costarikansk colón + costarikanska colón + CRC + + + jugoslavisk dinar + gammal serbisk dinar + gamla serbiska dinarer + + + tjeckisk hård koruna + tjeckoslovakisk hård koruna + tjeckiska hårda koruna + + + CUC + + + kubansk peso + kubansk peso + kubanska pesos + CUP + + + kapverdisk escudo + kapverdisk escudo + kapverdiska escudos + CVE + + + cypriotiskt pund + cypriotiskt pund + cypriotiska pund + CYP + + + tjeckisk koruna + tjeckisk koruna + tjeckiska koruna + CZK + + + östtysk mark + östtysk mark + östtyska mark + + + tysk mark + tysk mark + tyska mark + + + djiboutisk franc + djiboutisk franc + djiboutiska franc + DJF + + + dansk krona + dansk krona + danska kronor + DKK + + + dominikansk peso + dominikansk peso + dominikanska pesos + DOP + + + algerisk dinar + algerisk dinar + algeriska dinarer + DZD + + + ecuadoriansk sucre + ecuadoriansk sucre + ecuadorianska sucre + + + ecuadoriansk unidad de valor constante + ecuadoriansk unidad de valor constante + ecuadorianska unidad de valor constante + + + estnisk krona + estnisk krona + estniska kronor + + + egyptiskt pund + egyptiskt pund + egyptiska pund + EGP + + + eritreansk nakfa + eritreansk nakfa + eritreanska nakfa + ERN + + + spansk peseta (konto) + spansk peseta (konto) + spanska pesetas (konto) + + + spansk peseta (konvertibelt konto) + spansk peseta (konvertibelt konto) + spanska pesetas (konvertibelt konto) + + + spansk peseta + spansk peseta + spanska pesetas + ESP + + + etiopisk birr + etiopisk birr + etiopiska birr + ETB + + + euro + euro + euro + + + finsk mark + finsk mark + finska mark + FIM + + + Fiji-dollar + Fiji-dollar + Fiji-dollar + FJD + + + Falklandsöarnas pund + Falklandsöarnas pund + Falklandsöarnas pund + FKP + + + fransk franc + fransk franc + franska franc + FRF + + + brittiskt pund sterling + brittiskt pund sterling + brittiska pund sterling + + + georgisk kupon larit + georgisk kupon larit + georgiska kupon larit + + + georgisk lari + georgisk lari + georgiska lari + + + ghanansk cedi (1979-2007) + ghanansk cedi (1979-2007) + ghananska cedi (1979-2007) + GHC + + + ghanansk cedi + ghanansk cedi + ghananska cedi + GHS + + + gibraltiskt pund + gibraltiskt pund + gibraltiska pund + GIP + + + gambisk dalasi + gambisk dalasi + gambiska dalasi + + + guineansk franc + guineansk franc + guineanska franc + GNF + + + guineansk syli + guineansk syli + guineanska syli + + + ekvatorialguineansk ekwele + ekvatorialguineansk ekwele + ekvatorialguineanska ekweler + + + grekisk drachma + grekisk drachma + grekiska drachmer + GRD + + + guatemalansk quetzal + guatemalansk quetzal + guatemalanska quetzal + + + Portugisiska Guinea-escudo + Portugisiska Guinea-escudo + Portugisiska Guinea-escudos + + + Guinea-Bissau-peso + Guinea-Bissau-peso + Guinea-Bissau-pesos + + + guyanansk dollar + Guyana-dollar + guyanska dollar + GYD + + + Hongkong-dollar + Hongkong-dollar + Hongkong-dollar + + + honduransk lempira + honduransk lempira + honduranska lempira + + + kroatisk dinar + kroatisk dinar + kroatiska dinarer + + + kroatisk kuna + kroatisk kuna + kroatiska kunor + HRK + + + haitisk gourde + haitisk gourde + haitiska gourder + + + ungersk forint + ungersk forint + ungerska forinter + HUF + + + indonesisk rupiah + indonesisk rupiah + indonesiska rupier + IDR + + + irländskt pund + irländskt pund + irländska pund + IEP + + + israeliskt pund + israeliskt pund + israeliska pund + ILP + + + israelisk gammal shekel + israelisk gammal shekel + israeliska gamla shekel + + + israelisk ny shekel + israelisk ny shekel + israeliska nya shekel + ILS + + + indisk rupie + indisk rupie + indiska rupier + INR + + + irakisk dinar + irakisk dinar + irakiska dinarer + + + iransk rial + iransk rial + iranska rial + + + isländsk gammal krona + isländsk gammal krona + isländska kronor (1874–1981) + + + isländsk krona + isländsk krona + isländska kronor + ISK + + + italiensk lira + italiensk lire + italienska lire + ITL + + + Jamaica-dollar + Jamaica-dollar + Jamaica-dollar + JMD + + + jordansk dinar + jordansk dinar + jordanska dinarer + JOD + + + japansk yen + japansk yen + japanska yen + + + kenyansk shilling + kenyansk shilling + kenyanska shilling + KES + + + kirgizisk som + kirgizisk som + kirgiziska somer + + + kambodjansk riel + kambodjansk riel + kambodjanska riel + + + komorisk franc + komorisk franc + komoriska franc + KMF + + + nordkoreansk won + nordkoreansk won + nordkoreanska won + KPW + + + sydkoreansk won + sydkoreansk won + sydkoreanska won + KRW + + + kuwaitisk dinar + kuwaitisk dinar + kuwaitiska dinarer + KWD + + + Cayman-dollar + Cayman-dollar + Cayman-dollar + KYD + + + kazakisk tenge + kazakisk tenge + kazakiska tenger + + + laotisk kip + laotisk kip + laotiska kiper + LAK + + + libanesiskt pund + libanesiskt pund + libanesiska pund + LBP + + + srilankesisk rupie + srilankesisk rupie + srilankesiska rupier + LKR + + + Liberia-dollar + Liberia-dollar + Liberia-dollar + LRD + + + lesothisk loti + lesothisk loti + lesothiska lotier + + + litauisk litas + litauisk litas + litauiska litas + LTL + + + litauisk talonas + litauisk talonas + litauiska talonas + + + luxemburgsk franc (konvertibel) + luxemburgsk franc (konvertibel) + luxemburgska franc (konvertibla) + + + luxemburgsk franc + luxemburgsk franc + luxemburgska franc + + + luxemburgsk franc (finansiell) + luxemburgsk franc (finansiell) + luxemburgska franc (finansiella) + + + lettisk lats + lettisk lats + lettiska lats + + + lettisk rubel + lettisk rubel + lettiska rubel + + + libysk dinar + libysk dinar + libyska dinarer + LYD + + + marockansk dirham + marockansk dirham + marockanska dirhamer + + + marockansk franc + marockansk franc + marockanska franc + + + moldavisk leu + moldavisk leu + moldaviska leu + + + madagaskisk ariary + madagaskisk ariary + madagaskiska ariary + + + madagaskisk franc + madagaskisk franc + madagaskiska franc + + + makedonisk denar + makedonisk denar + makedoniska denarer + + + malisk franc + malisk franc + maliska franc + + + myanmarisk kyat + myanmarisk kyat + myanmariska kyat + + + mongolisk tugrik + mongolisk tugrik + mongoliska tugrik + MNT + + + Macao-pataca + Macao-pataca + Macao-pataca + MOP + + + mauretansk ouguiya + mauretansk ouguiya + mauretanska ouguiya + MRO + + + maltesisk lira + maltesisk lire + maltesiska lire + MTL + + + maltesiskt pund + maltesiskt pund + maltesiska pund + MTP + + + mauritisk rupie + mauritisk rupie + mauritiska rupier + MUR + + + maldivisk rufiyaa + maldivisk rufiyaa + maldiviska rufiyer + MVR + + + malawisk kwacha + malawisk kwacha + malawiska kwacha + MWK + + + mexikansk peso + mexikansk peso + mexikanska pesos + + + mexikansk silverpeso (1861-1992) + mexikansk silverpeso (1861-1992) + mexikanska silverpesos (1861-1992) + MXP + + + mexikansk unidad de inversion + mexikansk unidad de inversion + mexikanska unidad de inversion + + + malaysisk ringgit + malaysisk ringgit + malaysiska ringgiter + MYR + + + moçambikisk escudo + moçambikisk escudo (1914–1980) + moçambikiska escudos + + + gammal moçambikisk metical + moçambikisk metical (1980-2006) + gammla moçambikiska metical + MZM + + + moçambikisk metical + moçambikisk metical + moçambikiska metical + MZN + + + Namibia-dollar + Namibia-dollar + Namibia-dollar + NAD + + + nigeriansk naira + nigeriansk naira + nigerianska naira + NGN + + + nicaraguansk córdoba + nicaraguansk córdoba + nicaraguanska córdoba + + + nicaraguansk córdoba oro + nicaraguansk córdoba oro + nicaraguanska córdoba oro + NIO + + + nederländsk gulden + nederländsk gulden + nederländska gulden + NLG + + + norsk krona + norsk krona + norska kronor + NKr + + + nepalesisk rupie + nepalesisk rupie + nepalesiska rupier + NPR + + + nyzeeländsk dollar + nyzeeländsk dollar + nyzeeländska dollar + NZD + + + omansk rial + omansk rial + omanska rial + + + panamansk balboa + panamansk balboa + panamanska balboa + PAB + + + peruansk inti + peruansk inti + peruanska intier + PEI + + + peruansk sol nuevo + peruansk sol nuevo + peruanska sol nuevo + PEN + + + peruansk sol + peruansk sol + peruanska sol + + + papuansk kina + papuansk kina + papuanska kinor + + + filippinsk peso + filippinsk peso + filippinska pesos + PHP + + + pakistansk rupie + pakistansk rupie + pakistanska rupier + PKR + + + polsk zloty + polsk zloty + polska zloty + PLN + + + polsk zloty (1950-1995) + polsk zloty (1950-1995) + polska zloty (1950-1995) + + + portugisisk escudo + portugisisk escudo + portugisiska escudos + PTE + + + paraguaysk guarani + paraguaysk guarani + paraguayska guarani + PYG + + + qatarisk rial + qatarisk rial + qatariska rial + QAR + + + rhodesisk dollar + rhodesisk dollar + rhodesiska dollar + RHD + + + gammal rumänsk leu + rumänsk leu (1952-2005) + gamla rumänska leu + + + rumänsk leu + rumänsk leu + rumänska leu + + + Serbisk dinar + serbisk dinar + serbiska dinarer + RSD + + + rysk rubel + rysk rubel + ryska rubel + + + rysk rubel (1991-1998) + rysk rubel (1991-1998) + ryska rubel (1991-1998) + + + rwandisk franc + rwandisk franc + rwandiska franc + RWF + + + saudisk riyal + saudisk riyal + saudiska riyal + SAR + + + Salomon-dollar + Salomon-dollar + Salomon-dollar + SBD + + + seychellisk rupie + seychellisk rupie + seychelliska rupier + SCR + + + sudanesisk dinar + sudansk dinar (1992-2007) + sudanska gamla dinarer + SDD + + + sudanesiskt pund + sudanskt pund + sudanska pund + + + gammalt sudanesiskt pund + sudanskt pund (1916-1992) + sudanska gamla pund + + + svensk krona + svensk krona + svenska kronor + kr + + + Singapore-dollar + Singapore-dollar + Singapore-dollar + SGD + + + S:t Helena-pund + S:t Helena-pund + S:t Helena-pund + SHP + + + slovensk tolar + slovensk tolar + slovenska tolar + + + slovakisk koruna + slovakisk koruna + slovakiska korunor + SKK + + + sierraleonsk leone + sierraleonsk leone + sierraleonska leoner + SLL + + + somalisk shilling + somalisk shilling + somaliska shilling + SOS + + + Surinam-dollar + Surinam-dollar + Surinam-dollar + SRD + + + surinamesisk gulden + Surinam-gulden + Surinam-gulden + SRG + + + São Tomé och Príncipe-dobra + São Tomé och Príncipe-dobra + São Tomé och Príncipe-dobror + STD + + + sovjetisk rubel + sovjetisk rubel + sovjetiska rubler + + + salvadoransk colón + salvadoransk colón + salvadoranska colón + SVC + + + syriskt pund + syriskt pund + syriska pund + SYP + + + swaziländsk lilangeni + swaziländsk lilangeni + swaziländska lilangeni + + + thailändsk baht + thailändsk baht + thailändska baht + + + tadzjikisk rubel + tadzjikisk rubel + tadzjikiska rubler + + + tadzjikisk somoni + tadzjikisk somoni + tadzjikiska somoni + + + turkmensk manat + turkmensk manat + turkmenska manat + + + tunisisk dinar + tunisisk dinar + tunisiska dinarer + TND + + + tongansk paʻanga + tongansk paʻanga + tonganska paʻanga + TOP + + + timoriansk escudo + östtimoresisk escudo + timorianska escudos + + + gammal turkisk lira + gammal turkisk lira + gamla turkiska lire + + + ny turkisk lira + turkisk lira + turkiska lire + TRY + + + Trinidad ochTobago-dollar + Trinidad ochTobago-dollar + Trinidad ochTobago-dollar + TTD + + + taiwanesisk ny dollar + taiwanesisk ny dollar + taiwanesiska nya dollar + TWD + + + tanzanisk shilling + tanzanisk shilling + tanzaniska shilling + TZS + + + ukrainsk hryvnia + ukrainsk hryvnia + ukrainska hryvnia + UAH + + + ukrainsk karbovanetz + ukrainsk karbovanetz + ukrainska karbovanetz + + + ugandisk shilling (1966-1987) + ugandisk shilling (1966-1987) + ugandiska shilling (1966-1987) + + + ugandisk shilling + ugandisk shilling + ugandiska shilling + UGX + + + US-dollar + US-dollar + US-dollar + + + US-dollar (nästa dag) + US-dollar (nästa dag) + US-dollar (nästa dag) + + + US-dollar (samma dag) + US-dollar (samma dag) + US-dollar (samma dag) + + + uruguayansk peso en unidades indexadas + uruguayansk peso en unidades indexadas + uruguayanska peso en unidades indexadas + + + uruguayansk peso (1975-1993) + uruguayansk peso (1975-1993) + uruguayanska pesos (1975-1993) + + + uruguayansk peso + uruguayansk peso + uruguayanska pesos + UYU + + + uzbekisk sum + uzbekisk sum + uzbekiska sum + + + venezuelansk bolivar + venezuelansk bolivar + venezuelanska bolivar + VEB + + + venezuelansk bolivar fuerte + venezuelansk bolivar fuerte + venezuelanska bolivar fuerte + VEF + + + vietnamesisk dong + vietnamesisk dong + vietnamesiska dong + VND + + + vanuatisk vatu + vanuatisk vatu + vanuatiska vatu + VUV + + + västsamoansk tala + västsamoansk tala + västsamoanska tala + WST + + + CFA Franc BEAC + centralafrikansk franc + centralafrikanska franc + XAF + + + silver + uns silver + silveruns + + + guld + uns guld + gulduns + + + europeisk kompositenhet + europeisk gammal kompositenhet + europeiska kompositenheter + + + europeisk monetär enhet + europeisk gammal monetär enhet + europeiska monetära enheter + + + europeisk kontoenhet (XBC) + europeisk gammal kontoenhet-9 + europeiska kontoenheter (XBC) + + + europeisk kontoenhet (XBD) + europeisk kontoenhet (XBD) + europeiska kontoenheter (XBD) + + + östkaribisk dollar + östkaribisk dollar + östkaribiska dollar + XCD + + + IMF särskild dragningsrätt + IMF särskild dragningsrätt + IMF särskilda dragningsrätter + + + europeisk valutaenhet + europeisk valutaenhet + europeiska valutaenheter + + + fransk guldfranc + fransk guldfranc + franska guldfranc + + + French UIC-Franc + internationella järnvägsunionens franc + internationella järnvägsunionens franc + + + CFA Franc BCEAO + västafrikansk franc + västafrikanska franc + + + palladium + uns palladium + palladium + + + CFP-franc + Stilla Havet-franc + Stilla Havet-franc + XPF + + + platina + uns platina + platina + + + RINET-fond + RINET-fond + RINET-fond + + + test-valutakod + (valutakod för teständamål) + test-valutakod + + + okänd eller ogiltig valuta + okänd/ogiltig valuta + okänd eller ogiltig valuta + + + jemenitisk dinar + jemenitisk dinar + jemenitiska dinarer + + + jemenitisk rial + jemenitisk rial + jemenitiska rial + YER + + + jugoslavisk hård dinar + jugoslavisk hård dinar + jugoslaviska hårda dinarer + + + jugoslavisk ny dinar + jugoslavisk ny dinar + jugoslaviska nya dinarer + + + jugoslavisk dinar (konvertibel) + jugoslavisk dinar (konvertibel) + jugoslaviska dinarer (konvertibla) + + + sydafrikansk rand (finansiell) + sydafrikansk rand (finansiell) + sydafrikanska rand (finansiella) + + + sydafrikansk rand + sydafrikansk rand + sydafrikanska rand + ZAR + + + zambisk kwacha + zambisk kwacha + zambiska kwacha + ZMK + + + zairisk ny zaire + zaïrisk ny zaïre + zaïriska nya zaïre + ZRN + + + zairisk zaire + zaïrisk zaïre + zaïriska zaïre + + + Zimbabwe-dollar + Zimbabwe-dollar + Zimbabwe-dollar + + + + + + {0} dag + {0} dagar + + + {0} timme + {0} timmar + + + {0} minut + {0} minuter + + + {0} månad + {0} månader + + + {0} sekund + {0} sekunder + + + {0} vecka + {0} veckor + + + {0} år + {0} år + + + + + ja:j + nej:n + + + + diff --git a/lib/zend/Zend/Locale/Data/sv_FI.xml b/lib/zend/Zend/Locale/Data/sv_FI.xml new file mode 100644 index 0000000000..9c55453dbc --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sv_FI.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + USA:s yttre öar + + + 1996 års stavning + + + kinesiska i big5-sorteringsordning + kinesiska i gb2312-sorteringsordning + telefonkatalogssorteringsordning + kinesiska i pinyin-sorteringsordning + kinesiska i strecksorteringsordning + traditionell sorteringsordning + + + imperiska enheter + + + + [a à b-e é f-v x-z å ä ö] + [à ã ç é ë í ñ ó š w ÿ ü ž] + + + + + + + dagsperiod + + + + + + +HH:mm;−HH:mm + + + + diff --git a/lib/zend/Zend/Locale/Data/sv_SE.xml b/lib/zend/Zend/Locale/Data/sv_SE.xml new file mode 100644 index 0000000000..fbc60cc466 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sv_SE.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/sw.xml b/lib/zend/Zend/Locale/Data/sw.xml new file mode 100644 index 0000000000..2cf214b793 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sw.xml @@ -0,0 +1,400 @@ + + + + + + + + + + + kiafrikans + kiamhariki + kiarabu + kubafu + kiazabaijani + kibelarusi + kibulgaria + kibihari + kibengali; kibangla + kibreton + kibosnia + kikatalan + kicheki + kiwelsh + kidenmarki + kijerumani + kigiriki + kiingereza + kiesperanto + kihispania + kiestonia + kibaski + kiajemi + kifinlandi + kitagalog + kifaroe + kifaransa + kifrisia + kiairish + kiskotlandi + kigalisia + guarani + kigujarati + kiyahudi + kihindi + kikroeshia + kihungari + muarmeni + kiinterlingua + kiindonesia + lugha ya kisayansi + kiaislandi + kiitaliano + kijapani + kijava + kijiojia + kicambodia + kikannada + kikorea + kikurdi + kugizi + kirumi + kilingala + kilaosi + kilithuania + kilatvia + kimasedonia + kimalayalam + kimongolia + kimarathi + kimalaysia + kimalta + kinepali + kiholanzi + kinorwei + kiositani + kioriya + kipunjabi + kipolandi + kipashto + kireno + kireno (brazil) + kireno (ureno) + kiromania + kirusi + kisanskriti + msindhi + kiserbia-kroeshia + kisinhali + kislovakia + kislovenia + kisomali + kialbania + kiserbia + sesotho + kinubi + kisweden + Kiswahili + kitamil + kitelugu + kithailand + kitigrinya + wataki weume + kiklingon + kituruki + kitwii + ombwa + kiukrania + kiurdu + kiuzbeki + kivietnam + kikhosa + kiyidish + kichina + kizulu + + + Muugano wa Falme za Nchi za Kiarabu + Antigua na Barbuda + Ajentina + Bosnia na Herzegowina + Ubelgiji + Brazili + Visiwa vya Bahama + Kanada + Jamhuri ya Afrika ya Kati + Kongo + Uswisi + Pwani ya Pembe + Kamerun + Uchina + Kolombia + Serbiya da Montenegro + Rasi Verde + Jamhuri ya Czech + Udachi + Jibuti + Udenmarki + Dominika + Jamhuri ya Dominikan + Ekvado + Misri + Uhispania + Uhabeshi + Ufaransa + Uingereza + Guinea ya Ikweta + Kroatia + Hungaria + Uyahudi + Uhindi + Iraki + Uajemi + Barafu + Uitaliani + Jamaika + Ujapani + Kenya + Kampuchea + Visiwa vya Komoro + Saint Kitts na Nevis + Korea ya Kaskazini + Korea ya Kusini + Luksemburg + Moroko + Monako + Visiwa vya Marshall + Meksiko + Malasya + Msumbiji + Nikaragua + Uholanzi + Unorwe + Nepali + Papua Guinea Mpya + Filipino + Ureno + Paragwai + Urusi + Arabuni Saudi + Visiwa vya Solomon + Visiwa vya Shelisheli + Uswidi + Somali + Sao Tome na Principe + Chadi + Timor ya Mashariki + Kitonga + Uturuki + Trinidad na Tobago + Tanzania + Muungano wa Nchi za Amerika + Urugwai + Vatikano + Saint Vincent na Grenadines + Yemeni + Afrika ya Kusini + + + + [a-d {dh} e-n {ng} {ng'} {ny} o p r s {sh} t {th} u-w y z] + [q x] + [a-z] + + + ‘ + ’ + “ + ” + + + + + + + + Jan + Feb + Mac + Apr + Mei + Jun + Jul + Ago + Sep + Okt + Nov + Des + + + Januari + Februari + Machi + Aprili + Mei + Juni + Julai + Agosti + Septemba + Oktoba + Novemba + Desemba + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Jpi + Jtt + Jnn + Jtn + Alh + Iju + Jmo + + + Jumapili + Jumatatu + Jumanne + Jumatano + Alhamisi + Ijumaa + Jumamosi + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + R1 + R2 + R3 + R4 + + + robo ya kwanza + robo ya pili + robo ya tatu + robo ya nne + + + + AM + PM + + + Kabla ya Kristo + Baada ya Kristo + + + KK + BK + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + Saa za Africa Mashariki + + + + + + + + + #,##0.00 ¤ + + + + + + Shilingi ya Tanzania + + + + + diff --git a/lib/zend/Zend/Locale/Data/sw_KE.xml b/lib/zend/Zend/Locale/Data/sw_KE.xml new file mode 100644 index 0000000000..f91db8d8dc --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sw_KE.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + ¤#,##0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/sw_TZ.xml b/lib/zend/Zend/Locale/Data/sw_TZ.xml new file mode 100644 index 0000000000..f52dd6483c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/sw_TZ.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/syr.xml b/lib/zend/Zend/Locale/Data/syr.xml new file mode 100644 index 0000000000..5f5e252bde --- /dev/null +++ b/lib/zend/Zend/Locale/Data/syr.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + ܣܘܪܝܝܐ + + + ܣܘܪܝܝܐ + + + + + + + [\u0711 \u0730-\u074A ܃-܉ ܁ ܂ ܀ ܊-܍ ܐ ܒ-ܔ ܖ ܕ ܗ-ܬ] + [܏\u200C \u200D ܭ-ܯ ݍ-ݏ] + + + + + + + + ܏ܟܢ ܏ܒ + ܫܒܛ + ܐܕܪ + ܢܝܣܢ + ܐܝܪ + ܚܙܝܪܢ + ܬܡܘܙ + ܐܒ + ܐܝܠܘܠ + ܏ܬܫ ܏ܐ + ܏ܬܫ ܏ܒ + ܏ܟܢ ܏ܐ + + + + + + + dd MMMM, y + + + + + dd MMMM, y + + + + + dd/MM/yyyy + + + + + dd/MM/yyyy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss + + + + + h:mm + + + + + + dd MMMM + dd/MM + mm:ss + Q yy + MM/yyyy + MMMM, y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + #,##0.###;#,##0.###- + + + + + + + ¤ #,##0.00;¤ #,##0.00- + + + + + + ل.س.‏ + + + + + diff --git a/lib/zend/Zend/Locale/Data/syr_SY.xml b/lib/zend/Zend/Locale/Data/syr_SY.xml new file mode 100644 index 0000000000..14ae96c69c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/syr_SY.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ta.xml b/lib/zend/Zend/Locale/Data/ta.xml new file mode 100644 index 0000000000..8b7d10def0 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ta.xml @@ -0,0 +1,1190 @@ + + + + + + + + + + + அஃபார் + அப்காஜியான் + ஆச்சினீஸ் + அகோலி + அதாங்மே + அதகே + அவெஸ்தான் + ஆஃப்ரிகான்ஸ் + அஃப்ரோ-ஏசியாடிக் மொழி + அஃப்ரிஹிலி + ஐனு + அகான் + அக்கேதியன் + அலூட் + அல்கான்கியன் மொழி + தெற்கு அல்தை + அம்ஹாரிக் + ஆர்கோனீஸ் + பழைய ஆங்கிலம் + அங்கிகா + அபாச்சி மொழி + அரபு + அராமைக் + அரௌகேனியன் + அரபஹோ + செயற்கையான மொழி + அராவாக் + அஸ்ஸாமி + அஸ்துரியன் + அதாபஸ்கான் மொழி + ஆஸ்த்ரேலிய மொழி + அவேரிக் + அவதி + அய்மரா + அசர்பாய்ஜானி + பாஷ்கிர் + பாண்டா + பமிலெகே மொழி + பெலுசி + பலினீஸ் + பாஸா + பால்டிக் மொழி + பைலோருஷ்ன் + பேஜா + பெம்பா + பெர்பெர் + பல்கேரியன் + பிஹாரி + போஜ்பூரி + பிஸ்லாமா + பிகோல் + பினி + சிக்சிகா + பம்பாரா + வங்காளம் + பான்டு + திபெத்து + பிரிடன் + ப்ராஜ் + போஸ்னியன் + பாடாக் + புரியாத் + புகினீஸ் + ப்லின் + காடலான் + கேடோ + மத்திய அமெரிக்கன் இன்டியன் மொழி + கரீப் + காகேஷியன் மொழி + ஆட்சம் + செசென் + செபுவானோ + கெல்டிக் மொழி + சாமோரோ + சிப்சா + ஷகதை + சூகிசே + மாரி + சினூக் ஜார்கான் + சோக்தௌ + சிபெவ்யான் + செரூக்கி + செயேனி + சாமிக் மொழி + கார்சியன் + காப்டிக் + ஆங்கில அடைப்படையிலான கிரியோல் மற்றும் பிஜின் + ஃப்ரென்ச் அடைப்படையிலான கிரியோல் மற்றும் பிஜின் + போர்சுக்கீஸ் அடைப்படையிலான கிரியோல் மற்றும் பிஜின் + க்ரீ + கிரிமியன் துர்க்கி + கிரியோல் மற்றும் பிஜின் + செக் + கஷுபியன் + சர்ச் ஸ்லாவிக் + குஷிடிக் மொழி + சுவாஷ் + வெல்ஷ் + டானிஷ் + தகோடா + தார்குவா + தயாக் + ஜெர்மன் + தெலாவேர் + ஸ்லாவ் + டோக்ரிப் + டின்கா + டோக்ரி + திராவிட மொழி + லோவர் சோர்பியன் + துவாலா + மத்திய டச்சு + திவேஹி + ட்யூலா + பூடானி + ஈஓயே + எஃபிக் + பண்டைய எகிப்தியன் + ஈகாஜுக் + கிரேக்கம் + எலமைட் + ஆங்கிலம் + மத்திய ஆங்கிலம் + எஸ்பரேன்டோ + ஸ்பேனிஷ் + எஸ்டோனியன் + பஸ்க் + எவோன்டோ + பர்ஸியன் + ஃபங்க் + ஃபான்டி + ஃபுலா + பின்னிஷ் + ஃபிலிபினோ + ஃபினோ-உக்ரைன் மொழி + ஃபிஜி + ஃபரிஸ்த் + ஃபான் + பிரெஞ்சு + மத்திய ஃப்ரென்ச் + பழைய ஃப்ரென்ச் + வடக்கு ஃப்ரிஸியான் + கிழக்கு ஃப்ரிஸியான் + ஃப்ரியூலியன் + மேற்கத்திய பிரிஷிய + ஐரிஷ் + கா + கயோ + பயா + ஸ்காட்ஸ் கேலிக் + ஜெர்மானிய மொழி + கீஜ் + கில்பெர்டீஸ் + காலிஸியன் + மத்திய ஹை ஜெர்மன் + குரானி + பழைய ஹை ஜெர்மன் + கோன்டி + கோரோன்டலோ + கோதிக் + க்ரேபோ + பண்டைய கிரேக்கம் + ஸ்விஸ் ஜெர்மன் + குஜராத்தி + மேங்க்ஸ் + குவிசின் + ஹௌஸா + ஹைடா + ஹவாய்யான் + ஹுப்ரு + இந்தி + ஹிலிகாய்னான் + ஹிமாச்சலி + ஹிட்டைட் + மாங்க் + ஹிரி மோட்டு + கரோஷியன் + அப்பர் சோர்பியான் + ஹைத்தியன் + ஹங்கேரியன் + ஹுபா + ஆர்மேனியன் + ஹெரேரோ + இன்டர்லிங்குவா + இபான் + இந்தோனேஷியன் + இன்டர்லிங் + இக்போ + சிசுவான் ஈ + இஜோ + இனுபியாக் + இலோகோ + இந்திய மொழி + இன்டோ-ஐரோப்பியன் மொழி + இங்குஷ் + இடோ + இரானியன் மொழி + இரோகோயியன் மொழி + ஐஸ்லென்டிக் + இத்தாலியன் + இனுகிடூட் + ஜப்பானீஸ் + லோஜ்பன் + ஜூதேயோ-பெர்ஷியன் + ஜூதேயோ-அராபிக் + ஜாவானீஸ் + ஜியோர்ஜியன் + காரா-கல்பாக் + கபாய்ல் + காசின் + ஜ்ஜூ + கம்பா + கரேன் + காவி + கபார்டியன் + தையாப் + கோரோ + காங்கோ + காஸி + கொய்ஸன் மொழி + கோதானீஸ் + கிகுயூ + குவான்யாமா + கசாக் + கலாலிசூட் + கெமெர் + கிம்புன்து + கன்னடம் + கொரியன் + கொங்கனி + கோஸ்ரைன் + க்பெல்லே + கனுரி + கராசே-பல்கார் + கரேலியன் + க்ரு + குருக் + காஷ்மிரி + குர்திஷ் + கும்இக் + குடேனை + கோமி + கார்னிஷ் + கிர்கிஷ் + லத்தின் + லடினோ + லஹன்டா + லம்பா + லக்க்ஷெம்பர்கிஷ் + லெஜ்ஜியன் + கான்டா + லிம்பர்கிஷ் + லிங்காலா + லோத்தியன் + மோங்கோ + லோஜி + லிதுவேனியன் + லுபா-கடாங்கா + லுபா-லுலௌ + லுய்சேனோ + லூன்டா + லுயோ + லுஷய் + லேட்வியன் + மதுரீஸ் + மகாஹி + மைதிலி + மகாசார் + மான்டிங்கோ + ஆஸ்ட்ரோனேஷியன் + மாசாய் + மோக்க்ஷா + மான்டார் + மென்டீ + மலகாஸி + மத்திய ஐரிஷ் + மார்ஷெலிஷ் + மௌரி + மிக்மாக் + மின்னாங்கபௌ + பலதரப்பட்ட மொழிகள் + மாஸிடோனியன் + மான்-க்மெர் மொழி + மலையாளம் + மங்கோலியன் + மன்சு + மனிபூரி + மனோபோ மொழி + மோல்டாவியன் + மோஹாவ்க் + மோஸ்ஸி + மராத்தி + மலாய் + மால்டிஸ் + பல மொழிகள் + முண்டா மொழி + க்ரீக் + மிரான்டீஸ் + மார்வாரி + பர்மிஸ் + மாயான் மொழி + ஏர்ஜியா + நவ்ரூ + நஹுவால் + வடக்கு அமெரிக்கன் இன்டியன் மொழி + நியோபோலிடன் + நார்வே பொக்மால் + வடக்கு தெபெலே + லோ ஜெர்மன் + நேபாளி + நெவாரி + தோங்கா + நியாஸ் + நைஜர்-கோரடோஃபனியன் மொழி + நியூவான் + டச்சு + நார்வேஜியன் நியூநார்ஸ்க் + நார்வே + நோகை + பழைய நோர்ஸ் + என்'கோ + தெற்கு தெபெலே + வடக்கு சோதோ + நியூபியன் மொழி + நவாஜோ + பாரம்பரிய நேவாரி + நயன்ஜா + நியாம்வேஜி + நியான்கோலே + நியோரோ + நிஜ்மா + ஆகிடியன் + ஓஜிபவா + ஒரோமோ + ஒரியா + ஒசெட்டிக் + ஓசேஜ் + ஒட்டோமன் துர்க்கி + ஒட்டோமன் மொழி + பஞ்சாபி + பபுவான் மொழி + பன்காசினன் + பாஹ்லவி + பம்பாங்கா + பபியேமென்டோ + பலௌவ்ன் + பழைய பெர்ஷியன் + பிலிபைன் மொழி + ஃபொனிஷியன் + பாலி + போலிஷ் + ஃபோன்பெயென் + பராக்ரித் மொழி + பழைய ப்ரோவென்சால் + பாஷ்டோ + போர்ச்சுக்கீஸ் + பிரேசிலியன் போர்ச்சுகீசியம் + ஐபேரியன் போர்ச்சுகீசியம் + கிவேசுவா + ராஜஸ்தானி + ரபனுய் + ரரோடோங்கன் + ரைட்டோ-ரோமென்ஸ் + ருண்டி + ரோமேனியன் + ரோமன்ஸ் மொழி + ரோமானி + ரூட் + ரஷியன் + அரோமானியன் + கின்யாருவான்டா + சமஸ்கிருதம் + சான்டாவே + யாகுட் + தென் அமெரிக்க இன்டியன் மொழி + சாலிஷன் மொழி + சமாரிடன் அராமைக் + சாசாக் + சான்டாலி + சாடினியன் + சிசிலியன் + ஸ்காட்ஸ் + சிந்தி + வடக்கு சாமி + செல்குப் + செமிடிக் மொழி + சாங்கோ + பழைய ஐரிஷ் + சங்கேத மொழி + செர்போ-க்ரோஷியன் + ஷான் + சிங்களம் + சிடாமோ + சியோயுவான் மொழி + சினோ-திபேத்தியன் மொழி + ஸ்லோவாக் + ஸ்லோவினேயின் + ஸ்லாவிக் மொழி + ஸாமோவான் + தெற்கு சாமி + சாமி மொழி + லுலே சாமி + இனாரி சாமி + ஸ்கோல்ட் சாமி + ஷோனா + சோனின்கே + சோமாலி + சோக்தியன் + சோங்காய் + அல்பெனியன் + சர்பியன் + ஸ்ரானன் டோங்கோ + செரெர் + ஸ்வாடீ + நிலோ-சஹாரன் மொழி + தெற்கு ஸோதோ + சுடானீஸ் + சுகுமா + சுசு + சுமேரியன் + ஷீவிடிஸ் + சுவாஹிலி + பாரம்பரிய சிரியாக் + சிரியாக் + தமிழ் + தாய் மொழி + தெலுங்கு + டிம்னே + டெரெனோ + டெடும் + தாஜிக் + தாய் + டிக்ரின்யா + டைக்ரே + டிவ் + டர்க்மென் + டோகேலௌ + டாகாலோக் + கிளிங்கன் + டிலிங்கிட் + டாமாஷேக் + ஸ்வானா + டோங்கா + நயாசா டோங்கா + டோக் பிஸின் + டர்கிஷ் + ஸோங்கா + ட்ஸிம்ஷியன் + டாடர் + டும்புகா + துபி மொழி + அல்தேய்க் மொழி + டுவாலு + ட்வி + டஹிதியான் + டுவினியன் + உட்முர்ட் + யுகுர் + உகாரிட்க் + உக்ரேனியன் + அம்பொண்டு + தெரியாத அல்லது செல்லாத பிரதேசம் + உருது + உஸ்பெக் + வை + வென்டா + வியட்நாமிஸ் + ஒலாபூக் + வோட்க் + ஒவாலூன் + வகாஷான் மொழி + வாலாமோ + வாரே + வாஷோ + சொர்பியன் மொழி + ஒலூஃப் + கல்மிக் + ஹோஷா + யாவ் + யாபேசி + ஈத்திஷ + யோருப்பா + யுபிக் மொழி + ஜுவாங் + ஜாபோடெக் + ப்லிஸ்ஸிம்பால்ஸ் + ஜெனகா + சீனம் + எளிய சீனம் + மரபு சீனம் + ஜான்டே + ஜூலூ + ஜூனி + மொழிக்கிணங்க உள்ளடக்கம் இல்லை + ஜாஜா + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + உலகம் + ஆப்ரிக்கா + வடக்கு அமெரிக்கா கண்டம் + தெற்கு அமெரிக்கா + ஓஷெனியா + மேற்கு ஆப்ரிக்கா + மத்திய அமெரிக்கா + கிழக்கு ஆப்ரிக்கா + வடக்கு ஆப்ரிக்கா + மத்திய ஆப்ரிக்கா + தென்னாப்ரிக்கா + அமெர்க்காஸ் + வடக்கு அமெரிக்கா + கரீபியன் + கிழக்கு ஆசியா + தெற்கு ஆசியா + தென்-கிழக்கு ஆசியா + தெற்கு ஐரோப்பா + ஆஸ்திரேலியா மற்றும் நியூசிலாந்து + மெலனேஷியா + மைக்ரோ நேஷியா பிரதேசம் + பாலினேஷியா + மத்திய-தெற்காசியா + ஆசியா + மத்திய ஆசியா + மேற்கு ஆசியா + ஈரோப் + கிழக்கு ஐரோப்பா + வடக்கு ஐரோப்பா + மேற்கு ஐரோப்பா + சுதந்திர மாநிலங்களின் காமன்வெல்த் + செகோஸ்லோவாக்யா + லத்தீன் அமெரிக்கா மற்றும் கரீபியன் + சேனல் தீவுகள் + அன்டோரா + ஐக்கிய அரபு கூட்டாட்சி + ஆப்கானிஸ்தான் + ஆன்டிகுவா மற்றும் பார்புடா + அங்குய்லா + அல்பேனியா + ஆர்மேனியா + நெதெர்லேண்ட் ஆண்டிலிஸ் + அங்கோலா + அன்டார்டிகா + அர்ஜெண்டினா + அமெரிக்க சமோவா + ஆஸ்திரியா + ஆஸ்திரேலியா + அரூபா + ஆலந்து தீவுகள் + அஜர்பைஜான் + போஸ்னியா மற்றும் ஹெர்ஸிகோவினா + பார்படோஸ் + பங்களாதேஷ் + பெல்ஜியம் + புர்கினா ஃபாஸோ + பல்கேரியா + பஹ்ரைன் + புருண்டி + பெனின் + செயின்ட் பார்தேலெமி + பெர்முடா + புரூனேய் + பொலிவியா + பிரேஸில் + பஹமாஸ் + பூடான் + பொவேட் தீவுகள் + போட்ஸ்வானா + பெலாரூஸ் + பெலிஸ் + கனடா + காகோஸ் தீவுகள் + காங்கோ - கின்சாசா + மத்திய ஆப்ரிக்கக் குடியரசு + காங்கோ - ப்ராஸாவில்லே + ஸ்விட்சர்லாந்து + ஐவரி கோஸ்ட் + குக் தீவுகள் + சிலி + கேமரூன் + சீனா + கொலம்பியா + கோஸ்டாரிகா + செர்பியா மற்றும் மான்டேநெக்ரோ + கியூபா + கேப் வெர்டே + கிறிஸ்துமஸ் தீவு + சைப்ரஸ் + செக் குடியரசு + ஜெர்மன் + ஜிபௌடி + டென்மார்க் + டொமினிகா + டொமினிகன் குடியரசு + அல்ஜீரியா + ஈக்வடார் + எஸ்டோனியா + எகிப்து + மேற்கு சஹாரா + எரிட்ரியா + ஸ்பெயின் + எதியோப்பியா + பின்லாந்து + ஃபிஜி + ஃபாக்லான்ட் தீவுகள் + மைக்ரோனேஷியா + ஃபெரௌ தீவுகள் + பிரான்ஸ் + கேபான் + பிரிடிஷ் கூட்டரசு + கிரனெடா + ஜார்ஜியா + ஃப்ரென்ச் கயானா + கெர்ன்சி + கானா + ஜிப்ரால்டர் + கிரீன்லாண்ட் + காம்பியா + கினி + க்வாதேலோப் + ஈக்குவாடோரியல் கினி + கிரீஸ் + தென் ஜியார்ஜியா மற்றும் தென் சான்ட்விச் தீவுகள் + குவாத்தாமாலா + குவாம் + கினி-பிஸ்ஸாவ் + கயானா + ஹாங் காங் எஸ்.ஏ.ஆர் சைனா + ஹேர்ட் மற்றும் மெக்டொனால்டு + ஹாண்டுராஸ் + குரோசியா + ஹெய்தி + ஹங்கேரி + இந்தோனேஷியா + அயர்லாந்து + இஸ்ரேல் + ஐல் ஆஃப் மேன் + இந்தியா + பிரிட்டிஷ் இந்தியப் பெருங்கடல் மாஹாணம் + இராக் + ஈரான் + ஐஸ்லாந்து + இத்தாலி + ஜெர்சி + ஜமாய்க்கா + ஜொர்டான் + ஜப்பான் + கென்யா + கிர்கிஸ்தான் + கம்போடியா + கிரிபடி + கோமரோஸ் + செயின்ட் கிட்ஸ் மற்றும் நெவிஸ் + வட கொரியா + தென் கொரியா + குவைத்து + கேமென் தீவுகள் + கஜகஸ்தான் + லாவோஸ் + லெபனான் + செயின்ட் லூசியா + லிச்செண்ஸ்டெய்ன் + இலங்கை + லைபேரியா + லெசோதோ + லிதுவேனியா + லக்ஸ்சம்பர்க் + லாட்வியா + லிப்யா + மொரோக்கோ + மொனாக்கோ + மால்டோவா + மான்டேனெக்ரோ + செயின் மார்டீன் + மடகாஸ்கர் + மார்ஷல் தீவுகள் + மசெடோணியா + மாலீ + மியான்மார் + மங்கோலியா + மெக்கௌ + வடக்கு மரியானா தீவுகள் + மார்டினிக் + மௌரிடானியா + மௌன்ட்செராட் + மால்டா + மொரிசியஸ் + மாலத்தீவு + மலாவீ + மெக்சிகோ + மலேஷியா + மொசாம்பிக் + நமீபியா + புதிய கலிடோன்யா + நைஜர் + நார்ஃபாக் தீவுகள் + நைஜீரியா + நிகாராகுவா + நெதர்லாந்து + நார்வே + நேபாளம் + நௌரு + நியூ + நியூசிலாந்து + ஓமான் + பனாமா + பெரு + ஃப்ரென்ச் பாலினேஷியா + பாப்புவா நியூ கினி + பிலிப்பைன்ஸ் + பாகிஸ்தான் + போலந்து + செயின்ட் பியர் மற்றும் மிக்வேலான் + பிட்கேன் + போர்த்த ரிக்கோ + பாலஸ்தீனியன் மாஹாணம் + போர்ச்சுக்கல் + பலவ் + பாரகுவே + காடார் + ஔட்லையிங் ஓசானியா + ஐரோப்பியன் யூனியன் + ரீயூனியன் + ருமேனியா + செர்பியா + ரஷ்யா + ருவான்டா + சவூதி அரேபியா + சாலமன் தீவுகள் + செஷெல்ஸ் + சூடான் + ஸ்வீடன் + சிங்கப்பூர் + செயின்ட் ஹெலெனா + ஸ்லோவேனியா + ஸ்வல்பார்டு மற்றும் ஜான் மேயன் + ஸ்லோவாகியா + சியேரா லியோன் + சான் மெரினோ + செனெகல் + சொமாலியா + சூரினாம் + சாவ் தோம் மற்றும் ப்ரின்சிபி + எல் சால்வடார் + சிரியா + ஸ்வாஸிலாண்ட் + டர்க்ஸ் மற்றும் கைகோஸ் தீவுகள் + சாட் + ஃப்ரென்ச் தெற்கு மாஹாணங்கள் + டோகோ + தாய்லாந்து + தாஜிகிஸ்தான் + டோகேலோ + கிழக்கு திமோர் + துர்க்மெனிஸ்தான் + டுனிசியா + டோங்கா + துருக்கி + திரினிடாட் மற்றும் தொபாகோ + துவாலூ + தைவான் + டான்சானியா + உக்ரைன் + உகாண்டா + யுனைட்டட் ஸ்டேட்ஸும் சிறிய அவுட்லைன் தீவுகளும் + ஐக்கிய அமெரிக்க குடியரசு + உருகுவே + உஸ்பெகிஸ்தான் + வாடிகன் + செயின் வின்சன்ட் மற்றும் கிரெனடைன்ஸ் + வெனஜுவேலா + பிரிட்டீஷ் கன்னித் தீவுகள் + யூ.எஸ் கன்னித் தீவுகள் + வியட்நாம் + வனுவாட்டு + வாலிஸ் மற்றும் ஃப்யூசுனா + சமோவா + யேமன் + மயோத் + தென் ஆப்ரிக்கா + சாம்பியா + ஜிம்பாப்வே + தெரியாத அல்லது செல்லாத பிரதேசம் + + + + [ஃ அ-ஊ எ-ஐ ஒ-க ங ச ஜ ஞ ட ண த ந-ப ம-வ ஷ-ஹ ா-ூ ெ-ை ொ-்] + [a g i m t] + [a-z] + + + “ + ” + ‘ + ’ + + + + + + + + ஜன. + பிப். + மார். + ஏப். + மே + ஜூன் + ஜூலை + ஆக. + செப். + அக். + நவ. + டிச. + + + ஜனவரி + பிப்ரவரி + மார்ச் + ஏப்ரல் + மே + ஜூன் + ஜூலை + ஆகஸ்ட் + செப்டம்பர் + அக்டோபர் + நவம்பர் + டிசம்பர் + + + + + ஜ + பி + மா + ஏ + மே + ஜூ + ஜூ + ஆ + செ + அ + ந + டி + + + + + + + ஞா + தி + செ + பு + வி + வெ + ச + + + ஞாயிறு + திங்கள் + செவ்வாய் + புதன் + வியாழன் + வெள்ளி + சனி + + + + + ஞா + தி + செ + பு + வி + வெ + ச + + + + + + + Q1 + Q2 + Q3 + Q4 + + + 1ஆம் காலாண்டு + 2ஆம் காலாண்டு + 3ஆம் காலாண்டு + 4ஆம் காலாண்டு + + + + am + pm + + + கிறிஸ்துவுக்கு முன் + அனோ டோமினி + + + கிமு + கிபி + + + + + + EEEE, d MMMM, y + + + + + d MMMM, y + + + + + d MMM, y + + + + + d-M-yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} நேரம் + {1} ({0}) + + பிரிஸ்பேன் + + + கேம்போ கிராண்டே + + + கேம்பிரிட்ஜ் பே + + + ஈஸ்டர் + + + ஜகார்த்தா + + + ஜெயபூரா + + + லாஸ் ஏஞ்சல்ஸ் + + + ஃபோனிக்ஸ் + + + தேன்வர் + + + மையம், வடக்கு டகோடா + + + சிகாகோ + + + இந்தியானாபோலிஸ் + + + நியூயார்க் + + + + இந்திய நேரப்படி + + true + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + ரூ + + + + + + ஆம்:ஆ + இல்லை:இ + + + diff --git a/lib/zend/Zend/Locale/Data/ta_IN.xml b/lib/zend/Zend/Locale/Data/ta_IN.xml new file mode 100644 index 0000000000..7b0075966b --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ta_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/te.xml b/lib/zend/Zend/Locale/Data/te.xml new file mode 100644 index 0000000000..083070587f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/te.xml @@ -0,0 +1,1154 @@ + + + + + + + + + + + అఫార్ + అబ్ఖాజియన్ + ఆఖినీస్ + అకోలి + అడాంగ్మే + అడిగాబ్జే + అవేస్టాన్ + ఆఫ్రికాన్స్ + ఆఫ్రో-ఆశియా భాష + అఫ్రిహిలి + ఐను + అకాన్ + అక్కాడియాన్ + అలియుట్ + ఆల్గొంక్వియన్ భాష + దక్షిణ ఆల్టై + అమ్హారిక్ + అరగోనిస్ + ప్రాచీన ఆగ్లం + ఆంగిక + అప్పాచి భాష + అరబిక్ + అరామేక్ + అరౌకేనియన్ + అరాపాహో + కృత్రిమ భాష + అరావాక్ + అస్సామీస్ + అస్టురియాన్ + ఆతాపాస్కన్ భాష + ఆస్ట్రేలియన్ భాష + అవారిక్ + అవధి + ఐమారా + అజర్బైజాని + బష్కిర్ + బాండా + బమిలేకే భాష + బాలుచి + బాలినీస్ + బసా + బాల్టిక్ భాష + బెలరుశియన్ + బేజా + బెంబా + బెర్బెర్ + బల్గేరియన్ + బిహారి + భోజ్ పూరి + బిస్లామా + బికోల్ + బిని + సిక్ సికా + బంబారా + బెంగాలి + బంటు + టిబెటన్ + బ్రెటన్ + బ్రాజ్ + బాస్నియన్ + బటక్ + బురియట్ + బ్యుగినిస్ + బ్లిన్ + కెటలాన్ + కేడ్డో + మధ్య అమెరికెన్ ఇండియన్ భాష + కేరిబ్ + కోకేషియన్ భాష + అట్సామ్ + చెచెన్ + సేబుఆనో + సెల్టిక్ భాష + చమర్రో + చిబ్చా + చాగటై + చూకిస్ + మారి + చినూక్ జార్గన్ + చొచ్కతావ్ + చిపెవ్యాన్ + చిరోకి + చేయేన్ + చామిక్ భాష + కార్సికన్ + కోప్టిక్ + ఆంగ్లం ఆధారిత క్రియోల్ లేదా పిగ్డిన్ + ప్రెంచ్ -ఆధారిత క్రియోల్ లేదా పిగ్డిన్ + పోర్చుగీస్ -ఆధారిత క్రియోల్ లేదా పిగ్డిన్ + క్రి + క్రిమియన్ టర్కిష్ + క్రియోల్ లేదా పిగ్డిన్ + చెక్ + కషుబియన్ + చర్చ స్లావిక్ + కుషిటిక్ భాష + చువాష్ + వెల్ష్ + డేనిష్ + డకోటా + డార్గ్వా + దయక్ + ఙర్మన్ + డెలావేర్ + స్లేవ్ + డోగ్రిబ్ + డింకా + డోగ్రి + ద్రవిడియన్ భాష + లోవర్ సోర్బియన్ + దుఆలా + మధ్యమ డచ్ + దివేహి + డ్యులా + జొన్ఖా + ఇవే + ఎఫిక్ + ప్రాచీన ఇజిప్షియన్ + ఏకాజక్ + గ్రీక్ + ఎలామైట్ + ఆంగ్లం + మధ్యమ ఆంగ్లం + ఎస్పరెన్టొ + స్పానిష్ + ఈస్టొనియన్ + బాస్క్ + ఎవోండొ + పర్షియన్ + ఫాంగ్ + ఫాంటి + ఫ్యుల + ఫిన్నిష్ + ఫిలిపినో + ఫిన్నో- యుగ్రియన్ భాష + ఫిజియన్ + ఫారొఈస్ + ఫాన్ + ఫ్రెంచ్ + మధ్యమ ప్రెంచ్ + ప్రాచీన ప్రెంచ్ + ఉత్తర ఫ్రిసియన్ + తూర్పు ఫ్రిసియన్ + ఫ్రియులియన్ + పశ్చిమ ఫ్రిసియన్ + ఐరిష్ + గా + గాయో + గ్బాయా + స్కాటిష్ గేలిక్ + జర్మేనిక్ భాష + జీజ్ + గిల్బర్టీస్ + గెలిషియన్ + మధ్యమ హై జర్మన్ + గురాని + ప్రాచీన హై జర్మన్ + గోండి + గోరోంటలా + గోథిక్ + గ్రేబో + ప్రాచీన గ్రీక్ + స్విస్ జర్మన్ + గుజరాతి + మంకస్ + గ్విచిన్ + హౌసా + హైడా + హవాయియన్ + హీబ్రు + హిందీ + హిలి గేయినోన్ + హిమాచలి + హిట్టిటే + మోంగ్ + హిరి మోటు + క్రొయెషియన్ + అప్పర్ సోర్బియన్ + హైయేతియన్ + హన్గేరియన్ + హుపా + ఆర్మేనియన్ + హిరేరో + ఇంటర్లింగువా + ఐబాన్ + ఇండోనిషియ + ఇంటర్ లింగ్ + ఇగ్బో + శిషువన్ ఈ + ఐజో + ఇనూపైఏక్ + ఐయోకో + భారతీయ భాష + ఇండో-ఐరోపియన్ భాష + ఇంగుష్ + ఈడౌ + ఇరానియన్ భాష + ఇరోక్వియన్ భాష + ఐస్లాండిక్ + ఇటాలియన్ + ఇనుక్టిటుట్ + జాపనీస్ + లోజ్బాన్ + జ్యుడియో-పర్షియన్ + జ్యుడియో-అరబిక్ + జావనీస్ + జార్జియన్ + కారా-కల్పాక్ + కాబిల్ + కాచిన్ + జ్యూ + కంబా + కరెన్ + కావి + కబార్డియన్ + ట్యాప్ + కోరో + కాంగో + ఖాసి + ఖోఇసన్ భాష + ఖటోనీస్ + కికుయు + క్వాన్యామ + కాజాక్ + కలాల్లిసూట్ + ఖమ్ర్ + కిమ్బుండు + కన్నడ + కొరియన్ + కొంకణి + కోస్రేయన్ + పెల్లే + కానురి + కరచే-బల్కార్ + కరేలియన్ + కృ + కూరుఖ్ + కాశ్మీరి + కర్డిష్ + కుమ్యిక్ + కుటేనై + కోమి + కోర్నిష్ + కిర్గిజ్ + లాటిన్ + లాడినో + లాహండా + లాంబా + లుక్సంబర్గిష్ + లేజ్ఘియన్ + గాండా + లిమ్బర్గిష్ + లింగాల + లాఓ + మొంగో + లోజి + లిథుయేనియన్ + లూబ-కటాంగ + లూబా- లులుయా + లుఇసేనో + లుండా + లువో + లుషై + లాట్వియన్ + మాదురీస్ + మగాహి + మైథిలి + మకాసార్ + మండింగో + ఆస్ట్రోనిశియన్ + మాసాయి + మొక్షా + మండార్ + మెండే + మాలాగసి + మధ్యమ ఐరిష్ + మార్షలీస్ + మయోరి + మికమాక్ + మినాంగ్కాబో + మిశ్రమ భాష + మసడోనియన్ + మోన్-ఖ్మేర్ భాష + మలయాళం + మంగోలియన్ + మంచు + మణిపూరి + మనోబో భాష + మొల్డావియన్ + మోహుక్ + మోస్సి + మరాటి + మలేయ్ + మాల్టీస్ + బహుళ భాషలు + ముండ భాష + క్రీక్ + మిరాండిస్ + మార్వాడి + బర్మీస్ + మాయన్ భాష + ఎర్జియా + నౌరు + నాహుఅటిల్ + ఉత్తర అమెరికా ఇండియన్ భాష + నియాపోలిటన్ + నార్వీజియన్ బొక్మాల్ + ఉత్తర దెబెలె + లో జర్మన్ + నేపాలి + నెవారి + దోంగా + నియాస్ + నైజర్- కోర్దోఫియన్ భాష + నియూఇయాన్ + డచ్ + నార్విజియాన్ న్యోర్స్క్ + నార్విజియాన్ + నోగై + ప్రాచిన నోర్స్ + న్కో + దక్షిణ దెబెలె + ఉత్తర సోతో + నూబియన్ భాష + నవాహో + సాంప్రదాయ న్యుఆరి + న్యంవేజి + న్యాన్కోలె + నిఓరో + జీమా + ఆక్సిటాన్ + చేవా + ఒరోమో + ఒరియా + ఒసేటిక్ + ఒసాజ్ + ఒట్టోమన్ టర్కిష్ + ఒటోమియన్ భాష + పంజాబీ + పాపుఅన్ భాష + పంగా సినాన్ + పహ్లావి + పంపగ్న + పపియమేంటో + పాలుఆన్ + ప్రాచీన పర్షియన్ + ఫిలిప్పీన్ భాష + ఫోనికన్ + పాలీ + పోలిష్ + పోహ్న్పెయన్ + ప్రాక్రిత్ భాష + ప్రాచీన ప్రోవెంసాల్ + పాష్టో + పోర్చుగీస్ + కెషుయా + రాజస్తాని + రాపన్యుయి + రారోటొంగాన్ + ర్హెతో-రోమాన్స్ + రండి + రోమానియన్ + రోమాన్స్ భాష + రోమానీ + రూట్ + రష్యన్ + ఆరోమేనియన్ + కిన్యర్వాండా + సంసృతం + సండావి + యాకుట్ + దక్షిణ అమెరికా ఇండియన్ భాష + సాలిషాన్ భాష + సమారిటన్ అరమేక్ + ససక్ + సంటాలి + సార్డీనియన్ + సిసిలియన్ + స్కాట్స్ + సింధీ + ఉత్తర సామి + సేల్కప్ + సెమిటిక్ భాష + సాంగో + ప్రాచీన ఐరిష్ + సంజ్ఞ భాష + సేర్బో-క్రొయేషియన్ + షాన్ + సింహాల + సిడామో + షిఒయన్ భాష + సైనో- టిబిటన్ భాష + స్లోవాక్ + స్లోవేనియాన్ + స్లావిక్ భాష + సమోవన్ + దక్షిణ సామి + సామి భాష + లులే సామి + ఇనారి సామి + స్కోల్ట్ సామి + షోన + సోనింకి + సోమాలి + సోగ్డియన్ + సొంఘై + అల్బేనియన్ + సెర్బియన్ + స్రానన్ టోనగో + సెరేర్ + స్వాతి + నీలో సహారా భాష + దక్షిణ సోతో + సుడానీస్ + సుకుమా + సుసు + సుమేరియాన్ + స్వీడిష్ + స్వాహిలి + సాంప్రదాయ సిరియాక్ + సిరియాక్ + తమిళము + టై భాష + తెలుగు + టింనే + టెరెనో + టేటం + తాజిక్ + థాయ్ + తిగ్రిన్యా + టీగ్రె + టివ్ + తుర్కమెన్ + టోకెలావ్ + తగలోగ్ + క్లింగన్ + లింగిట్ + టామషేక్ + సెటస్వానా + టోంగా + న్యాసా టోన్గా + టోక్ పిసిన్ + టర్కిష్ + సోంగా + శింషీయన్ + టాటర్ + టంబుక + టుపి భాష + ఆల్టియాక్ భాష + టువాలు + ట్వి + తహితియన్ + టువినియన్ + ఉడ్ముర్ట్ + ఉయ్ఘుర్ + ఉగారిటిక్ + యుక్రేనియాన్ + ఉమ్బుండు + తెలియని లేదా చెల్లని భాష + ఉర్దూ + ఉజ్బెక్ + వాయి + వెండా + వియత్నామీస్ + వోలాపుక్ + వోటిక్ + వాలూన్ + వాక్షన్ భాష + వాలామో + వారే + వాషో + సోర్బియన్ భాష + వొలాఫ్ + కల్మిక్ + షోసా + యాఒ + యాపిస్ + యిడ్డిష్ + యోరుబా + యుపిక్ భాష + జువాన్ + జపోటెక్ + బ్లిసింబల్స్ + జెనాగా + చైనీస్ + జండే + జూలూ + జుని + ఈ లిపి లేదు + జాజా + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ప్రపంచం + ఆఫ్రికా + ఉత్తర అమెరికా ఖండము + దక్షిణ అమెరికా + ఒషేనియ + పడమటి ఆఫ్రికా + మధ్యమ అమెరికా + తూర్పు ఆఫ్రికా + ఉత్తర ఆఫ్రికా + మధ్యమ ఆఫ్రికా + దక్షిణ ఆఫ్రికా + అమెరికాలు + ఉత్తర అమెరికా + కరిబ్బియన్ + తూర్పు ఆశియా + దక్షిణ ఆశియా + నైరుతి ఆశియా + దక్షిణ ఐరోపా + ఆస్ట్రేలియా మరియు న్యూజిలాండ్ + మెలనేశియ + మైక్రోనేశియ ప్రాంతం + పాలినేషియా + దక్షిణ మధ్యమ ఆశియా + ఆశియా + మధ్యమ ఆశియా + పడమటి ఆశియా + ఐరోపా + తూర్పు ఐరోపా + ఉత్తర ఐరోపా + పడమటి ఐరోపా + స్వతంత్ర రాష్ట్రాల కామన్ వెల్త్ + చెకస్లొవేకియ + లాటిన్ అమెరికా మరియు కేరబ్బియన్ + చానెల్ దీవులు + అన్డోరా + యునైటెడ్ ఆరబ్ ఎమిరేట్స్ + ఆఫ్ఘానిస్తాన్ + ఆంటిగ్వా మరియు బార్బుడా + ఆంగవిల్లా + అల్బేనియా + ఆర్మేనియా + నేదేర్లేండ్స్ అంటిల్లిస్ + అంగోలా + అంటార్కటికా + ఆర్జెంటినా + అమెరికన్ సమోవా + ఆస్ట్రియా + ఆస్ట్రేలియా + అరుబా + ఆలేండ్ దీవులు + అజర్బైజాన్ + బాస్నియా మరియు హీర్జిగోవినా + బార్బడోస్ + బాంగ్లాదేష్ + బెల్జియం + బుర్కినా ఫాసో + బల్గేరియా + బహరేన్ + బురుండి + బెనిన్ + సెంట్ బర్తేలెమీ + బర్మయుడా + బ్రునై + బొలీవియా + బ్రజిల్ + బహామాస్ + భూటాన్ + బొవెట్ దీవి + బోట్స్వానా + బెలారస్ + బెలీజ్ + కెనడా + కోకోస్ దీవులు + కాంగో- కిన్షాసా + మధ్యమ ఆఫ్రికా రిపబ్లిక్ + కాంగో- బ్రాజావిల్లి + స్విట్జర్లేండ్ + ఐవరీ కోస్ట్ + కుక్ దీవులు + చిలి + కెమరూన్ + చైనా + కొలంబియా + కోస్టారికా + సర్బియా మరియు మంటెనీగ్రో + క్యూబా + కేప్ వెర్డే + క్రిస్మస్ దీవి + సైప్రస్ + చెక్ గణరాజ్యం + ఙర్మని + జిబౌటి + డెన్మార్క్ + డోమెనిక + డొమినికన్ గణ రాజ్యం + అల్జీరియా + ఈక్వడోర్ + ఎస్టోనియా + ఈజిప్ట్ + పడమటి సహారా + ఎరిట్రియా + స్పేన్ + ఇథియోపియా + ఫిన్లాండ్ + ఫిజి + ఫాక్ లేండ్ దీవులు + మైక్రోనేశియ + ఫారో దీవులు + ఫ్రాన్స్‌ + గేబన్ + బ్రిటన్ + గ్రెనెడా + జార్జియా + ఫ్రెంచ్ గియానా + గ్వేర్నసే + ఘానా + జిబ్రాల్టార్ + గ్రీన్లేండ్ + గాంబియా + గినియా + గ్వాడేలోప్ + ఎక్వేటోరియాల్ గినియా + గ్రీస్ + దక్షిణ జార్జియా మరియు దక్షిణ సాండ్విచ్ దీవులు + గ్వాటిమాల + గ్వామ్ + గినియా-బిస్సావ్ + గయానా + చైనా యొక్క హాంగ్కాంగ్ + హెర్డ్ దీవి మరియు మాక్ డోనాల్డ్ దీవులు + హోండోరాస్ + క్రోయేషియా + హైటి + హన్గేరి + ఇండోనేషియా + ఐర్ లాండ్ + ఇస్రాయేల్ + ఐల్ ఆఫ్ మాన్ + భారత దేశం + బ్రిటిష్ భారతీయ ఓషన్ ప్రాంతం + ఇరాక్ + ఇరాన్ + ఐస్లాండ్ + ఇటలి + జర్సి + జమైకా + జార్డాన్ + జపాన్ + కెన్యా + కిర్జిస్తాన్ + కంబోడియా + కిరిబాటి + కొమొరోస్ + సెంట్ కిట్ట్స్ మరియు నెవిస్ + ఉత్తర కొరియా + దక్షిణ కొరియా + కువైట్ + కేమాన్ దీవులు + కజాఖస్తాన్ + లావోస్ + లెబనాన్ + సెంట్ లూసియా + లిక్టెస్టేన్ + శ్రీలంక + లైబీరియా + లెసోతో + లిథుయేనియా + లక్సంబర్గ్ + లాట్వియ + లిబియా + మొరాక్కో + మొనాకో + మోల్ డోవ + మోంటేనేగ్రో + సెంట్ మార్టిన్ + మాడ్గాస్కార్ + మార్షల్ దీవులు + మేసెడోనియా + మాలి + మ్యాన్మార్ + మంగోలియా + మాకావ్ SAR చైనా + ఉత్తర మరియానా దీవులు + మార్టినిక్ + మౌరిటేనియా + మోంట్సేర్రాట్ + మాల్టా + మారిషస్ + మాల్దీవులు + మాలావి + మెక్సికో + మలేషియా + మొజాంబిక్ + నమీబియా + క్రొత్త కాలెడోనియా + నైజర్ + నార్ఫాక్ దీవి + నైజీరియా + నికరాగువా + నేదర్లాండ్స్ + నారవే + నేపాల్ + నౌరు + నియు + న్యుజిలేండ్ + ఒమాన్ + పనామా + పెరూ + ఫ్రెంచ్ పోలినిషియా + పాపువా న్యు గినియా + ఫిలి పైన్స్ + పాకిస్తాన్ + పోలాండ్ + సెంట్ పియెర్ మరియు మికెలాన్ + పిట్కెర్న్ + పోటోరికో + పాలిస్తినియాన్ ప్రాంతం + పోర్చుగల్ + పలావు + పెరగువే + కతర్ + ఒషేనియా బయటున్నవి + యురోపియన్ యునియన్ + రియూనియన్ + రోమానియా + సెర్బియా + రష్య + ర్వాండా + సౌదీ అరేబియా + సోలోమన్ దీవులు + సీషెల్స్ + సుడాన్ + స్వీడన్ + సింగపూర్ + సెంట్ హెలినా + స్లోవేనియా + స్వాల్బార్డ్ మరియు యాన్ మాయేన్ + స్లోవేకియా + సియెర్రా లియాన్ + సాన్ మారినో + సెనెగల్ + సోమాలియా + సురినామ్ + సావోటోమ్ మరియు ప్రిన్సిపే + ఎల్ సాల్వడోర్ + సిరియా + స్వాజీలేండ్ + తుర్క్ మరియు కాలికోస్ దీవులు + చాద్ + ఫ్రెంచ్ దక్షిణ ప్రాంతాలు + టోగో + థాయ్ లాండ్ + టాజీకిస్తాన్ + టోకేలావ్ + తూర్పు టిమోర్ + తుర్కమెస్తాన్ + ట్యునీషియా + టోంగా + టర్కీ + ట్రినిడేడ్ మరియు టొబాగో + టువాలు + టైవాన్ + టాంజానియా + యుక్రెన్ + యుగాండా + సంయుక్త రాజ్య అమెరికా యునైటెడ్ స్టేట్స్ మైనర్ బయట ఉన్న దీవులు + సంయుక్త రాజ్య అమెరికా + ఉరుగువే + ఉజ్బెకిస్తాన్ + వేటికెన్ + సెంట్ విన్సెంట్ మరియు గ్రెనడీన్స్ + వెనుజువేలా + బ్రిటిష్ వర్జిన్ దీవులు + యు.ఎస్. వర్జిన్ దీవులు + వియట్నాం + వనౌటు + వాలిస్ మరియు ఫ్యుత్యునా + సమోవా + యెమెన్ + మాయొట్టి + దక్షిణ ఆఫ్రికా రాజ్యం + జాంబియా + జింబాబ్వే + తెలియని లేదా చెల్లని ప్రాంతం + + + ప్రాచీన ఙర్మన వర్ణక్రమం + 1996 ఙర్మన వర్ణక్రమం + సవరించబడిన వర్ణక్రమం + + + + [అ-ఋ ౠ ఌ ౡ ఎ-ఐ ఒ-న ప-ళ వ-హ ఁ-ః ్ ా-ౄ ె-ై ొ-ౌ ౕ ౖ] + [\u200C \u200D ౦-౯ b c e g m q t] + + + ' + ' + " + " + + + + + + + + జనవరి + ఫిబ్రవరి + మార్చి + ఏప్రిల్ + మే + జూన్ + జూలై + ఆగస్టు + సెప్టెంబర్ + అక్టోబర్ + నవంబర్ + డిసెంబర్ + + + + + జ + ఫి + మ + ఎ + మె + జు + జు + ఆ + సె + అ + న + డి + + + + + + + ఆది + సోమ + మంగళ + బుధ + గురు + శుక్ర + శని + + + ఆదివారం + సోమవారం + మంగళవారం + బుధవారం + గురువారం + శుక్రవారం + శనివారం + + + + + ఆ + సో + మ + భు + గు + శు + శ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + ఒకటి 1 + రెండు 2 + మూడు 3 + నాలుగు 4 + + + + am + pm + + + ఈసాపూర్వ. + సన్. + + + BCE + CE + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + dd-MM-yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + d MMMM + dd-MM + Q yy + MM-yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + + ఆఫ్ఘాన్ ఆఫ్ఘాని + + + బ్రజిల్ దేశ రియాల్ + + + చైనా దేశ యువాన్ రెన్‌మిన్‌బి + + + యురొ + + + బ్ిటిష్ పౌన్డ స్టెర్లిగ్ + + + రూపాయి + రూ. + + + జపాను దేశ యెస్ + + + రష్య దేశ రూబల్ + + + ఐక్య రాష్ట్ర అమెరిక డాలర్ + + + + + + అవను + కాదు + + + diff --git a/lib/zend/Zend/Locale/Data/te_IN.xml b/lib/zend/Zend/Locale/Data/te_IN.xml new file mode 100644 index 0000000000..03165e2cef --- /dev/null +++ b/lib/zend/Zend/Locale/Data/te_IN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/telephoneCodeData.xml b/lib/zend/Zend/Locale/Data/telephoneCodeData.xml new file mode 100644 index 0000000000..a0d221c2d4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/telephoneCodeData.xml @@ -0,0 +1,747 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/tg.xml b/lib/zend/Zend/Locale/Data/tg.xml new file mode 100644 index 0000000000..ce851f9646 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tg.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + Белорусӣ + Булғорӣ + Биҳарӣ + Бенгалӣ + Бретонӣ + Босниягӣ + Каталанӣ + Чехӣ + Даниягӣ + Немисӣ + Юнонӣ + Англисӣ + Эсперанто + Испанӣ + Эстонӣ + Баскӣ + Форсӣ + Финнӣ + Филиппинӣ + Фарозӣ + Фаронсавӣ + Фрисианӣ + Ирландӣ + Шотландӣ-Галикӣ + Галисианӣ + Горанӣ + Гуҷаратӣ + Яҳудӣ + Ҳиндӣ + Маҷорӣ + Байни забонӣ + Индонезӣ + Исландӣ + Ҷопонӣ + Ҷаванизӣ + Гурҷӣ + Қирғизӣ + Лотинӣ + Лаосӣ + Литвонӣ + Латвиягӣ + Ҳолландӣ + Норвегӣ + Урисоӣ + Лаҳистонӣ + Португалӣ + Португалӣ (Бразилия) + Руминӣ + Русӣ + Шведӣ + Ӯйғурӣ + Украинӣ + Урду + Ӯзбекӣ + Яҳудии Аврупои шарқӣ + Чинӣ + Зулу + + + + + + Афғонистан + Тонга + + + + [а-г ғ д е ё ж-и ӣ й к қ л-у ӯ ф х ҳ ч ҷ ш ъ э-я] + [ц щ ы ь] + + + « + » + « + „ + + + + + + + + Янв + Фев + Мар + Апр + Май + Июн + Июл + Авг + Сен + Окт + Ноя + Дек + + + Январ + Феврал + Март + Апрел + Май + Июн + Июл + Август + Сентябр + Октябр + Ноябр + Декабр + + + + + + + Яшб + Дшб + Сшб + Чшб + Пшб + Ҷмъ + Шнб + + + Якшанбе + Душанбе + Сешанбе + Чоршанбе + Панҷшанбе + Ҷумъа + Шанбе + + + + пе. чо. + па. чо. + + + Пеш аз милод + ПаМ + + + ПеМ + ПаМ + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + Сомонӣ + сом + + + + diff --git a/lib/zend/Zend/Locale/Data/tg_Cyrl.xml b/lib/zend/Zend/Locale/Data/tg_Cyrl.xml new file mode 100644 index 0000000000..c8040f0d36 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tg_Cyrl.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + โลก + แอฟริกา + อเมริกาเหนือ + อเมริกาใต้ + โอเชียเนีย + แอฟริกาตะวันตก + อเมริกากลาง + แอฟริกาตะวันออก + แอฟริกาเหนือ + แอฟริกากลาง + แอฟริกาใต้ [018] + อเมริกา + อเมริกาตอนเหนือ + แคริบเบียน + เอเชียตะวันออก + เอเชียใต้ + เอเชียตะวันออกเฉียงใต้ + ยุโรปใต้ + ออสเตรเลียและนิวซีแลนด์ + เมลานีเซีย + เขตไมโครนีเซีย + โปลินีเซีย + เอเชียกลางตอนใต้ + เอเชีย + เอเชียกลาง + เอเชียตะวันตก + ยุโรป + ยุโรปตะวันออก + ยุโรปเหนือ + ยุโรปตะวันตก + เครือรัฐอิสระ + ละตินอเมริกาและแคริบเบียน + หมู่เกาะแชนเนล + อันดอร์รา + สหรัฐอาหรับเอมิเรตส์ + อัฟกานิสถาน + แอนติกาและบาร์บูดา + แองกวิลลา + แอลเบเนีย + อาร์เมเนีย + เนเธอร์แลนด์แอนทิลลิส + แองโกลา + แอนตาร์กติกา + อาร์เจนตินา + อเมริกันซามัว + ออสเตรีย + ออสเตรเลีย + อารูบา + หมู่เกาะโอลันด์ + อาเซอร์ไบจาน + บอสเนียและเฮอร์เซโกวีนา + บาร์เบโดส + บังกลาเทศ + เบลเยียม + บูร์กินาฟาโซ + บัลแกเรีย + บาห์เรน + บุรุนดี + เบนิน + เซนต์บาร์เธเลมี + เบอร์มิวดา + บรูไน + โบลิเวีย + บราซิล + บาฮามาส + ภูฏาน + เกาะบูเวต + บอตสวานา + เบลารุส + เบลีซ + แคนาดา + หมู่เกาะโคโคส + คองโก-กินชาซา + สาธารณรัฐแอฟริกากลาง + คองโก-บราซซาวิล + สวิตเซอร์แลนด์ + ไอวอรี่โคสต์ + หมู่เกาะคุก + ชิลี + แคเมอรูน + จีน + โคลอมเบีย + คอสตาริกา + เซอร์เบียและมอนเตเนโกร + คิวบา + เคปเวิร์ด + เกาะคริสต์มาส + ไซปรัส + สาธารณรัฐเช็ก + เยอรมนี + จิบูตี + เดนมาร์ก + โดมินิกา + สาธารณรัฐโดมินิกัน + แอลจีเรีย + เอกวาดอร์ + เอสโตเนีย + อียิปต์ + ซาฮาราตะวันตก + เอริเทรีย + สเปน + เอธิโอเปีย + ฟินแลนด์ + ฟิจิ + หมู่เกาะฟอล์กแลนด์ + ไมโครนีเซีย + หมู่เกาะแฟโร + ฝรั่งเศส + กาบอง + สหราชอาณาจักร + เกรเนดา + จอร์เจีย + เฟรนช์เกียนา + เกิร์นซีย์ + กานา + ยิบรอลตาร์ + กรีนแลนด์ + แกมเบีย + กินี + กวาเดอลูป + อิเควทอเรียลกินี + กรีซ + เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช + กัวเตมาลา + กวม + กินี-บิสเซา + กายอานา + ฮ่องกง เขตปกครองพิเศษประเทศจีน + เกาะเฮิร์ดและหมู่เกาะแมกดอนัลด์ + ฮอนดูรัส + โครเอเชีย + เฮติ + ฮังการี + อินโดนีเซีย + ไอร์แลนด์ + อิสราเอล + เกาะแมน + อินเดีย + บริติชอินเดียนโอเชียนเทร์ริทอรี + อิรัก + อิหร่าน + ไอซ์แลนด์ + อิตาลี + เจอร์ซีย์ + จาเมกา + จอร์แดน + ญี่ปุ่น + เคนยา + คีร์กีซสถาน + กัมพูชา + คิริบาส + คอโมโรส + เซนต์คิตส์และเนวิส + เกาหลีเหนือ + เกาหลีใต้ + คูเวต + หมู่เกาะเคย์แมน + คาซัคสถาน + ลาว + เลบานอน + เซนต์ลูเซีย + ลิกเตนสไตน์ + ศรีลังกา + ไลบีเรีย + เลโซโท + ลิทัวเนีย + ลักเซมเบิร์ก + ลัตเวีย + ลิเบีย + โมร็อกโก + โมนาโก + มอลโดวา + มอนเตเนโกร + เซนต์มาติน + มาดากัสการ์ + หมู่เกาะมาร์แชลล์ + มาซิโดเนีย + มาลี + พม่า + มองโกเลีย + มาเก๊า เขตปกครองพิเศษประเทศจีน + หมู่เกาะนอร์เทิร์นมาเรียนา + มาร์ตินีก + มอริเตเนีย + มอนต์เซอร์รัต + มอลตา + มอริเชียส + มัลดีฟส์ + มาลาวี + เม็กซิโก + มาเลเซีย + โมซัมบิก + นามิเบีย + นิวแคลิโดเนีย + ไนเจอร์ + เกาะนอร์ฟอล์ก + ไนจีเรีย + นิการากัว + เนเธอร์แลนด์ + นอร์เวย์ + เนปาล + นาอูรู + นีอูเอ + นิวซีแลนด์ + โอมาน + ปานามา + เปรู + เฟรนช์โปลินีเซีย + ปาปัวนิวกินี + ฟิลิปปินส์ + ปากีสถาน + โปแลนด์ + แซงปีแยร์และมีเกอลง + พิตแคร์น + เปอร์โตริโก + ปาเลสไตน์ + โปรตุเกส + ปาเลา + ปารากวัย + กาตาร์ + เอาต์ไลอิงโอเชียเนีย + สหภาพยุโรป + เรอูนียง + โรมาเนีย + เซอร์เบีย + รัสเซีย + รวันดา + ซาอุดีอาระเบีย + หมู่เกาะโซโลมอน + เซเชลส์ + ซูดาน + สวีเดน + สิงคโปร์ + เซนต์เฮเลนา + สโลวีเนีย + สฟาลบาร์และยานไมเอน + สโลวะเกีย + เซียร์ราลีโอน + ซานมารีโน + เซเนกัล + โซมาเลีย + ซูรินาเม + เซาตูเมและปรินซิปี + เอลซัลวาดอร์ + ซีเรีย + สวาซิแลนด์ + หมู่เกาะเติกส์และหมู่เกาะเคคอส + ชาด + เฟรนช์เซาเทิร์นเทร์ริทอรีส์ + โตโก + ไทย + ทาจิกิสถาน + โตเกเลา + ติมอร์ตะวันออก + เติร์กเมนิสถาน + ตูนิเซีย + ตองกา + ตุรกี + ตรินิแดดและโตเบโก + ตูวาลู + ไต้หวัน + แทนซาเนีย + ยูเครน + ยูกันดา + หมู่เกาะสหรัฐไมเนอร์เอาต์ไลอิง + สหรัฐอเมริกา + อุรุกวัย + อุซเบกิสถาน + วาติกัน + เซนต์วินเซนต์และเกรนาดีนส์ + เวเนซุเอลา + หมู่เกาะบริติชเวอร์จิน + หมู่เกาะยูเอสเวอร์จิน + เวียดนาม + วานูอาตู + วาลลิสและฟุตูนา + ซามัว + เยเมน + มายอต + แอฟริกาใต้ + แซมเบีย + ซิมบับเว + ไม่ทราบ + + + เยอรมันออร์โธกราฟีดั้งเดิม + เยอรมันออร์โธกราฟีปี 1996 + อาร์เมเนียตะวันออก + อาร์เมเนียตะวันตก + สัทอักษรสากล + ภาษาพื้นเมืองนาทิโซเน + โพลีโทนิก + คอมพิวเตอร์ + ออร์โธกราฟิปรับปรุง + เรเซียน + ซาโฮ + + + ปฏิทิน + การเรียงลำดับ + เงินตรา + + + เรียงตามอักษรจีนดั้งเดิม + ปฏิทินพุทธ + ปฏิทินจีน + เรียงตามลำดับโดยตรง + เรียงตามอักษรจีนประยุกต์ + ปฏิทินเกรกอเรียน + ปฏิทินฮิบรู + ปฏิทินแห่งชาติอินเดีย + ปฏิทินอิสลาม + ปฏิทินอิสลามซีวิล + ปฏิทินญี่ปุ่น + เรียงตามสมุดโทรศัพท์ + เรียงตามการถอดเสียงภาษาจีน + ปฏิทินไต้หวัน + เรียงตามการลากเส้น + เรียงตามแบบดั้งเดิม + + + อเมริกัน + เมตริก + + + {0} + {0} + {0} + + + + [ฯ ๆ \u0E4E \u0E47-\u0E4D ก-ฮ ะ-\u0E3A เ-ๅ] + [\u200B a e g m n p q t] + [a-z] + + + “ + ” + ‘ + ’ + + + + + + ก่อนเที่ยง + หลังเที่ยง + + + พุทธศักราช + + + พ.ศ. + + + + + + EEEEที่ d MMMM G y + + + + + d MMMM y + + + + + d MMM y + + + + + d/M/yyyy + + + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + EEEท d + Eท d/M + EEEท d MMM + Eท d MMM + E d MMMM + d MMMM + d MMM + d/M + EEE d/M/y + MMM yyyy + EEE d MMM y + MMMM y + M/yyyy + MMM y + + + + + ก่อนเที่ยง + หลังเที่ยง + + + ก่อนเที่ยง + หลังเที่ยง + + + + + + ม.ค. + ก.พ. + มี.ค. + เม.ย. + พ.ค. + มิ.ย. + ก.ค. + ส.ค. + ก.ย. + ต.ค. + พ.ย. + ธ.ค. + + + มกราคม + กุมภาพันธ์ + มีนาคม + เมษายน + พฤษภาคม + มิถุนายน + กรกฎาคม + สิงหาคม + กันยายน + ตุลาคม + พฤศจิกายน + ธันวาคม + + + + + ม.ค. + ก.พ. + มี.ค. + เม.ย. + พ.ค. + มิ.ย. + ก.ค. + ส.ค. + ก.ย. + ต.ค. + พ.ย. + ธ.ค. + + + + + + + อา. + จ. + อ. + พ. + พฤ. + ศ. + ส. + + + วันอาทิตย์ + วันจันทร์ + วันอังคาร + วันพุธ + วันพฤหัสบดี + วันศุกร์ + วันเสาร์ + + + + + อ + จ + อ + พ + พ + ศ + ส + + + + + + + Q1 + Q2 + Q3 + Q4 + + + ไตรมาส 1 + ไตรมาส 2 + ไตรมาส 3 + ไตรมาส 4 + + + + + 1 + 2 + 3 + 4 + + + + ก่อนเที่ยง + หลังเที่ยง + + + ปีก่อนคริสต์ศักราช + คริสต์ศักราช + + + ปีก่อน ค.ศ. + ค.ศ. + + + ก่อน ค.ศ. + + + + + + EEEEที่ d MMMM G y + + + + + d MMMM y + + + + + d MMM y + + + + + d/M/yyyy + + + + + + + H นาฬิกา m นาที ss วินาที zzzz + + + + + H นาฬิกา m นาที ss วินาที z + + + + + H:mm:ss + + + + + H:mm + + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + EEE d + HH:mm + HH:mm:ss + H:mm + L + E, d/M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + d/M + d + mm:ss + mm:ss + y + M/yyyy + EEE d/M/yyyy + MMM y + EEE d MMM y + MMMM y + Q yyyy + QQQ y + Q yy + M/yyyy + MMMM y + + + {0} - {1} + + M-M + + + E d – E d/M + E d – E d/M + + + LLL-LLL + + + E d MMM – E d MMM + E d – E d MMM + + + LLLL-LLLL + + + d MMM – d MMM + d – d MMM + + + d/M - d/M + d/M - d/M + + + d-d + + + H-H + H-H + + + H:mm-H:mm + H:mm-H:mm + H:mm-H:mm + + + H:mm-H:mm v + H:mm-H:mm v + H:mm-H:mm v + + + H-H v + H-H v + + + y-y + + + M/yy – M/yy + M/yy – M/yy + + + E d/M/yy – E d/M/yy + E d – E d/M/yy + E d/M/yy – E d/M/yy + + + MMM-MMM y + MMM y - MMM y + + + E d MMM – E d MMM y + E d – E d MMM y + E d MMM y – E d MMM y + + + M–M/yyyy + M/yyyy – M/yyyy + + + d MMM – d MMM y + d–d MMM y + d MMM y – d MMM y + + + d/M/yy – d/M/yy + d-d/M/yy + d/M/yy – d/M/yy + + + + + + สมัย + + + ปี + + + เดือน + + + สัปดาห์ + + + วัน + สามวันก่อน + เมื่อวานซืน + เมื่อวาน + วันนี้ + พรุ่งนี้ + มะรืนนี้ + สามวันต่อจากนี้ + + + วันในสัปดาห์ + + + ช่วงวัน + + + ชั่วโมง + + + นาที + + + วินาที + + + เขต + + + + + + + + เฮวาน + กีสเลฟ + เตเวต + เชวัต + อาดาร์ I + อาดาร์ + นิสซาน + อิยาร์ + สีวัน + ตามูซ + อัฟ + เอลอุล + + + + ก่อนเที่ยง + หลังเที่ยง + + + ย.ศ. + + + + + + + + มุฮะร์รอม + ซอฟาร์ + รอบี I + รอบี II + จุมาดา I + จุมาดา II + รอจับ + ชะอะบาน + รอมะดอน + เชาวัล + ดฮุุอัลกิดะห์ + ดฮุอัลฮิจจะห์ + + + + ก่อนเที่ยง + หลังเที่ยง + + + ฮิจเราะห์ศักราช + + + ฮ.ศ. + + + + + ก่อนเที่ยง + หลังเที่ยง + + + ทะอิกะ + ฮะกุชิ + ฮากุโฮ + ชุโช + ทะอิโฮ + เคอุง + วะโด + เรกิ + โยโร + จิงกิ + เท็มเพียว + เท็มเพียว-คัมโป + เท็มเพียว-โชโฮ + เท็มเพียว-โฮจิ + เท็มเพียว-จิงโงะ + จิงโงะ-เคอุง + โฮกิ + เท็นโอ + เอ็นเรียะกุ + ดะอิโด + โคนิง + เท็นโช + โชวะ + คะโจ + นินจุ + ซะอิโกะ + เท็นนัง + โจงัง + เก็งเก + นินนะ + คัมเพียว + โชตะอิ + เอ็งงิ + เอ็นโช + โชเฮ + เท็งเงียว + เท็นเรียะกุ + เท็นโตะกุ + โอวะ + โคโฮ + อันนะ + เท็นโระกุ + เท็นเอ็ง + โจเง็ง + เท็งเง็ง + เอกัง + คันนะ + เอเอ็ง + เอโซ + โชเรียะกุ + โชโตะกุ + โชโฮ + คันโก + โชวะ + คันนิง + จิอัง + มันจุ + โชเง็ง + โชเรียะกุ + โชคีว + คันโตะกุ + เอโช + เท็งงิ + โคเฮ + จิเรียะกุ + เอ็งคีว + โชโฮ + โชเรียะกุ + เอโฮะ + โอโตะกุ + คันจิ + คะโฮะ + เอโช + โชโตะกุ + โควะ + โชจิ + คะโช + เท็นนิง + เท็นเอ + เอกีว + เก็นเอ + โฮะอัง + เท็นจิ + ดะอิจิ + เท็นโช + โชโช + โฮะเอ็ง + เอจิ + โคจิ + เท็นโย + คีวอัง + นิมเป + คีวจุ + โฮะเง็ง + เฮจิ + เอเรียะกุ + โอโฮ + โชกัง + เอมัง + นินอัง + คะโอ + โชอัง + อังเง็ง + จิโช + โยวะ + จุเอ + เก็นเรียะกุ + บุนจิ + เค็งกีว + โชจิ + เค็นนิง + เก็งกีว + เค็นเอ + โชเก็ง + เค็นเรียะกุ + เค็มโป + โชกีว + โจโอ + เก็นนิง + คะโระกุ + อันเต + คังกิ + โจเอ + เท็มปุกุ + บุนเรียะกุ + คะเต + เรียะกุนิง + เอ็นโอ + นินจิ + คังเง็ง + โฮจิ + เค็นโช + โคเง็ง + โชกะ + โชเง็ง + บุนโอ + โคโช + บุนเอ + เค็นจิ + โคอัง + โชโอ + เอนิง + โชอัง + เค็งเง็ง + คะเง็ง + โทะกุจิ + เอ็งเก + โอโช + โชวะ + บุมโป + เก็นโอ + เก็งเกียว + โชชู + คะเระกิ + เก็นโตะกุ + เก็งโก + เค็มมุ + เอ็งเง็ง + โคโกะกุ + โชเฮ + เค็นโตะกุ + บุนชู + เท็นจุ + โคเรียะกุ + โควะ + เก็นชู + เมโตะกุ + คะเค + โคโอ + เมโตะกุ + โอเอ + โชโช + เอเกียว + คะกิสึ + บุนอัง + โฮโตะกุ + เคียวโตะกุ + โคโช + โชโระกุ + คันโช + บุนโช + โอนิง + บุมเม + โชเกียว + เอ็นโตะกุ + เมโอ + บุงกิ + เอโช + ทะอิเอ + เคียวโระกุ + เท็มมน + โคจิ + เอโระกุ + เก็งกิ + เท็นโช + บุนโระกุ + เคโช + เก็งวะ + คันเอ + โชโฮ + เคอัง + โชโอ + เมเรียะกุ + มันจิ + คัมบุง + เอ็มโป + เท็นวะ + โจเกียว + เก็นโระกุ + โฮเอ + โชโตะกุ + เคียวโฮ + เก็มบุง + คัมโป + เอ็งเกียว + คันเอ็ง + โฮเรียะกุ + เมวะ + อันเอ + เท็มเม + คันเซ + เคียววะ + บุงกะ + บุนเซ + เท็มโป + โคกะ + คะเอ + อันเซ + มันเอ็ง + บุงกีว + เก็นจิ + เคโอ + เมจิ + ทะอิโช + โชวะ + เฮเซ + + + ทะอิกะ + ฮะกุชิ + ฮากุโฮ + ชุโช + ทะอิโฮ + เคอุง + วะโด + เรกิ + โยโร + จิงกิ + เท็มเพียว + เท็มเพียว-คัมโป + เท็มเพียว-โชโฮ + เท็มเพียว-โฮจิ + เท็มเพียว-จิงโงะ + จิงโงะ-เคอุง + โฮกิ + เท็นโอ + เอ็นเรียะกุ + ดะอิโด + โคนิง + เท็นโช + โชวะ + คะโจ + นินจุ + ซะอิโกะ + เท็นนัง + โจงัง + เก็งเก + นินนะ + คัมเพียว + โชตะอิ + เอ็งงิ + เอ็นโช + โชเฮ + เท็งเงียว + เท็นเรียะกุ + เท็นโตะกุ + โอวะ + โคโฮ + อันนะ + เท็นโระกุ + เท็นเอ็ง + โจเง็ง + เท็งเง็ง + เอกัง + คันนะ + เอเอ็ง + เอโซ + โชเรียะกุ + โชโตะกุ + โชโฮ + คันโก + โชวะ + คันนิง + จิอัง + มันจุ + โชเง็ง + โชเรียะกุ + โชคีว + คันโตะกุ + เอโช + เท็งงิ + โคเฮ + จิเรียะกุ + เอ็งคีว + โชโฮ + โชเรียะกุ + เอโฮะ + โอโตะกุ + คันจิ + คะโฮะ + เอโช + โชโตะกุ + โควะ + โชจิ + คะโช + เท็นนิง + เท็นเอ + เอกีว + เก็นเอ + โฮะอัง + เท็นจิ + ดะอิจิ + เท็นโช + โชโช + โฮะเอ็ง + เอจิ + โคจิ + เท็นโย + คีวอัง + นิมเป + คีวจุ + โฮะเง็ง + เฮจิ + เอเรียะกุ + โอโฮ + โชกัง + เอมัง + นินอัง + คะโอ + โชอัง + อังเง็ง + จิโช + โยวะ + จุเอ + เก็นเรียะกุ + บุนจิ + เค็งกีว + โชจิ + เค็นนิง + เก็งกีว + เค็นเอ + โชเก็ง + เค็นเรียะกุ + เค็มโป + โชกีว + โจโอ + เก็นนิง + คะโระกุ + อันเต + คังกิ + โจเอ + เท็มปุกุ + บุนเรียะกุ + คะเต + เรียะกุนิง + เอ็นโอ + นินจิ + คังเง็ง + โฮจิ + เค็นโช + โคเง็ง + โชกะ + โชเง็ง + บุนโอ + โคโช + บุนเอ + เค็นจิ + โคอัง + โชโอ + เอนิง + โชอัง + เค็งเง็ง + คะเง็ง + โทะกุจิ + เอ็งเก + โอโช + โชวะ + บุมโป + เก็นโอ + เก็งเกียว + โชชู + คะเระกิ + เก็นโตะกุ + เก็งโก + เค็มมุ + เอ็งเง็ง + โคโกะกุ + โชเฮ + เค็นโตะกุ + บุนชู + เท็นจุ + โคเรียะกุ + โควะ + เก็นชู + เมโตะกุ + คะเค + โคโอ + เมโตะกุ + โอเอ + โชโช + เอเกียว + คะกิสึ + บุนอัง + โฮโตะกุ + เคียวโตะกุ + โคโช + โชโระกุ + คันโช + บุนโช + โอนิง + บุมเม + โชเกียว + เอ็นโตะกุ + เมโอ + บุงกิ + เอโช + ทะอิเอ + เคียวโระกุ + เท็มมน + โคจิ + เอโระกุ + เก็งกิ + เท็นโช + บุนโระกุ + เคโช + เก็งวะ + คันเอ + โชโฮ + เคอัง + โชโอ + เมเรียะกุ + มันจิ + คัมบุง + เอ็มโป + เท็นวะ + โจเกียว + เก็นโระกุ + โฮเอ + โชโตะกุ + เคียวโฮ + เก็มบุง + คัมโป + เอ็งเกียว + คันเอ็ง + โฮเรียะกุ + เมวะ + อันเอ + เท็มเม + คันเซ + เคียววะ + บุงกะ + บุนเซ + เท็มโป + โคกะ + คะเอ + อันเซ + มันเอ็ง + บุงกีว + เก็นจิ + เคโอ + เมจิ + ทะอิโช + โชวะ + เฮเซ + + + ม + ท + ช + ฮ + + + + + + EEEEที่ d MMMM ปีGที่ y + + + + + d MMMM ปีG y + + + + + d MMM G y + + + + + d/M/yy + + + + + + GGG yy + M/GGGGG yy + MMM GGGGG yy + Q GGGGG yy + + + + + ก่อนเที่ยง + หลังเที่ยง + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + ไม่ทราบ + + + อันดอร์รา + + + ดูใบ + + + คาบูล + + + แอนติกา + + + แองกิลลา + + + ติรานา + + + เยเรวาน + + + ลูอันดา + + + โรเทรา + + + พาล์เมอร์ + + + ขั้วโลกใต้ + + + เซียวา + + + มาว์ซัน + + + ดาวีส์ + + + วอสต็อค + + + เคซีย์ + + + ดูมอนต์ดียูร์วิลล์ + + + แมคมัวโด + + + ริโอกาลเลกอส + + + เมนดูซา + + + ซานฮวน + + + อูชูเอีย + + + ลาริโอจา + + + ซันลูอิส + + + กาตามาร์กา + + + จูจิว + + + ทูคูแมน + + + คอร์โดบา + + + บัวโนสไอเรส + + + ปาโก ปาโก + + + เวียนนา + + + เพิิร์ท + + + ยูคลา + + + ดาร์วิน + + + แอดิเลด + + + โบรกเคนฮิลล์ + + + คูร์รี + + + เมลเบิร์น + + + โฮบาร์ต + + + ลินดีแมน + + + ซิดนีย์ + + + บริสเบน + + + ลอร์ดโฮวี + + + อารูบา + + + บากู + + + บาร์เบโดส + + + ดากา + + + บรัสเซลส์ + + + วากาดูกู + + + โซเฟีย + + + บาห์เรน + + + บูจุมบูรา + + + ปอร์โต-โนโว + + + เบอร์มิวดา + + + บรูไนดารุสซาลาม + + + ลาปาซ + + + เอรูเนเป + + + รีโอบรังโก + + + ปอร์ตูเวลโย + + + บัววีชตา + + + มาเนาส์ + + + กุยาบา + + + ซันตาเรม + + + กัมปูกรันดี + + + เบเลง + + + อารากัวนา + + + เซาเปาลู + + + บาเยีย + + + ฟอร์ตาเลซา + + + มาเซโอ + + + เรซีเฟ + + + โนรอนฮา + + + แนสซอ + + + ทิมพู + + + กาโบโรเน + + + เบลีซ + + + ดอว์สัน + + + ไวต์ฮอร์ส + + + อินูวิก + + + แวนคูเวอร์ + + + ดอว์สัน ครีก + + + เยลโลว์ไนฟ์ + + + เอดมันตัน + + + สวิฟต์เคอร์เรนต์ + + + อ่าวแคมบริดจ์ + + + ริไจนา + + + วินนิเพก + + + เรโซลูท + + + เรนนี่ริเวอร์ + + + แรงกินอินเล็ต + + + คอรัลฮาร์เบอร์ + + + ทันเดอร์เบย์ + + + นิปิกอน + + + โทรอนโต + + + มอนทรีอัล + + + อีกวาลิต + + + พางนีทัง + + + มองตัน + + + แฮลิแฟกซ์ + + + กูสเบย์ + + + แกลซเบย์ + + + บลังค์-ซาบลอน + + + เซนต์จอนส์ + + + โคโคส + + + กินชาซา + + + ลูบัมบาชิ + + + บังกี + + + บราซซาวิล + + + ซูริค + + + อีสเตอร์ + + + ซันติอาโก + + + กัชการ์ + + + อุรุมชี + + + ฉงชิ่ง + + + เซี่ยงไฮ้ + + + ฮาร์บิน + + + โบโกตา + + + คอสตาริกา + + + ฮาวานา + + + เคปเวิร์ด + + + คริสต์มาส + + + นิโคเซีย + + + เบอร์ลิน + + + จิบูตี + + + โคเปนเฮเกน + + + โดมินิกา + + + ซานโต โดมิงโก + + + แอลเจียร์ + + + กาลาปาโกส + + + กัวยากิล + + + ไคโร + + + เอลไอย์อุง + + + แอสมารา + + + คะเนรี + + + เซวตา + + + มาดริด + + + แอดดิสอาบาบา + + + เฮลซิงกิ + + + ฟิจิ + + + สแตนลีย์ + + + ทรัก + + + โปนาเป + + + คอสแร + + + ปารีส + + + ลีเบรอวิล + + + ลอนดอน + + + เกรนาดา + + + ทบิลิซิ + + + กาแยน + + + อักกรา + + + ยิบรอลตาร์ + + + ทูเล + + + กอดแธบ + + + สกอเรสไบซันด์ + + + ดานมาร์กสฮาวน์ + + + บันจูล + + + โกนากรี + + + กวาเดอลูป + + + มาลาโบ + + + เอเธนส์ + + + เซาท์ จอร์เจีย + + + กัวเตมาลา + + + กวม + + + บิสเซา + + + กายอานา + + + ฮ่องกง + + + บูดาเปส + + + จาการ์ตา + + + พอนเทียนัก + + + มากัสซาร์ + + + จายาปุระ + + + ดับบลิน + + + เยรูซาเร็ม + + + แบกแดด + + + เตหะราน + + + เรคยาวิก + + + โรม + + + จาเมกา + + + อัมมาน + + + โตเกียว + + + ไนโรเบีย + + + บิชเคก + + + พนมเปญ + + + เอนเดอร์เบอร์รี + + + คิริทิมาตี + + + ตาระวา + + + โคโมโร + + + เปียงยาง + + + โซล + + + คูเวต + + + เคย์แมน + + + อัคตาอู + + + ออรัล + + + อัคโทบี + + + ไคซีลอร์ดา + + + อัลมาตี + + + เวียงจันทน์ + + + เบรุต + + + เซนต์ลูเซีย + + + วาดุซ + + + โคลัมโบ + + + มันโรเวีย + + + มา¹€ซรู + + + วิลนีอุส + + + ลักเซมเบิร์ก + + + ตรีโปลี + + + คาสซาบลางก้า + + + โมนาโก + + + อันตานานาริโว + + + ควาจาเลน + + + มาจูโร + + + บามาโก + + + ย่างกุ้ง + + + ฮอฟด์ + + + อูลานบาตอร์ + + + ชอยบาลซาน + + + มาเก๊า + + + ไซปัน + + + มาร์ตินีก + + + นูแอกชอต + + + มอนเซอร์รัต + + + มอลตา + + + มอริเชียส + + + มัลดีฟส์ + + + ทิฮัวนา + + + เอร์โมซีโย + + + มาซาทลาน + + + ชีวาวา + + + มอนเตร์เรย์ + + + เม็กซิโกซิตี + + + เมรีดา + + + แคนคุน + + + กัวลาลัมเปอร์ + + + กูชิง + + + มาปูโต + + + วินด์ฮุก + + + นูเมอา + + + นีอาเมย์ + + + ลากอส + + + อัมสเตอดัม + + + ออสโล + + + กาตมันดุ + + + นาอูรู + + + นีอูเอ + + + แชแทม + + + โอคแลนด์ + + + มัสกัต + + + ปานามา + + + ลิมา + + + ทาฮิติ + + + มาร์เควซัส + + + แกมเบียร์ + + + พอร์ตมอร์สบี + + + มะนิลา + + + การาจี + + + วอร์ซอ + + + มีเกอลง + + + พิตแคร์น + + + เปอโตริโก + + + กาซา + + + อาซอเรส + + + มาเดรา + + + ลิสบอน + + + ปาเลา + + + อะซุนซิออง + + + กาตาร์ + + + เรอูนียง + + + บูคาเรส + + + คาลินิงกราด + + + มอสโก + + + วอลโกกราด + + + ซามารา + + + ยีคาเตอรินเบิร์ก + + + โอมสก์ + + + โนโวซิบิร์สก์ + + + ครัสโนยาร์สก์ + + + อีร์คุตสค์ + + + ยาคุตสค์ + + + วลาดิโวสต็อก + + + ซาคาลิน + + + มากาดาน + + + คามชัตกา + + + อานาดีร์ + + + คิกาลี + + + ริยาร์ด + + + กัวดัลคานัล + + + คาร์ทูม + + + สตอกโฮล์ม + + + สิงคโปร์ + + + เซนต์เฮเลนา + + + ลองเยียร์เบียน + + + ฟรีทาวน์ + + + ดาการ์ + + + โมกาดิชู + + + ปารามาริโบ + + + ซาโอโตเมะ + + + เอลซัลวาดอร์ + + + ดามัสกัส + + + อัมบาบาเน + + + โลเม + + + กรุงเทพ + + + ดูชานเบ + + + ฟาเคาโฟ + + + ดิลี + + + อาชกาบัต + + + ตูนิส + + + ตองกาตาปู + + + อิสตันบูล + + + พอร์ทออฟสเปน + + + ฟูนะฟูตี + + + ไทเป + + + อัซโกร็อด + + + เคียฟ + + + ซิมเฟอโรโปล + + + ซาโปโรซี + + + คัมพาลา + + + มิดเวย์ + + + จอห์นสตัน + + + เวก + + + เอดัก + + + นอม + + + โฮโนลูลู + + + แองเคอเรจ + + + ยากูทัต + + + จูโน + + + ลอสแองเจลิส + + + บอยซี + + + ฟีนิกซ์ + + + ชิปร็อก + + + เดนเวอร์ + + + นิวเซเลม, นอร์ทดาโคตา + + + เซนเตอร์, นอร์ทดาโคตา + + + ชิคาโก + + + เมโนมินี + + + วินเซนเนส, อินดีแอนา + + + ปีเตอร์สเบิร์ก, อินดีแอนา + + + เทลล์ซิตี, อินดีแอนา + + + นอกซ์, อินดีแอนา + + + วินาแมค, อินดีแอนา + + + มาเรงโก, อินดีแอนา + + + อินเดียแนโพลิส + + + ลูส์วิลล์ + + + วีเวย์, อินดีแอนา + + + มอนติเซลโล + + + ดีทรอยต์ + + + นิวยอร์ก + + + มอนเตวิเดโอ + + + ซามาร์กานด์ + + + ทาชเคนต์ + + + เซนต์วินเซนต์ + + + คาราคัส + + + เซนต์โธมัส + + + ไซง่อน + + + วาลลิส + + + อาปีอา + + + เอเดน + + + มาโยเต + + + โจฮันเนสเบอร์ก + + + ลูซากา + + + ฮาราเร + + + + เวลาอาเกร + เวลาฤดูร้อนอาเกร + + + + + เวลาแอฟริกากลาง + + + + + เวลาแอฟริกาตะวันออก + + + + + เวลามาตรฐานแอฟริกาใต้ + + + + + เวลาแอฟริกาตะวันตก + เวลาฤดูร้อนแอฟริกาตะวันตก + + + + + เวลาอะแลสกา + เวลามาตรฐานอะแลสกา + + + + + เวลามาตรฐานอะแลสกา-ฮาวาย + + + + + เวลาอะเมซอน + เวลาฤดูร้อนอะเมซอน + + + + + เวลากลาง + เวลามาตรฐานกลาง + + + + + เวลาตะวันออก + เวลามาตรฐานตะวันออก + + + + + เวลาแปซิฟิค + เวลามาตรฐานแปซิฟิค + + + + + เวลาอัคตาอู + เวลาฤดูร้อนอัคตาอู + + + AQTT (อัคตาอู) + AQTST (อัคตาอู) + + + + + เวลาอาระเบีย + เวลามาตรฐานอาระเบีย + + + AST (อาระเบีย) + ADT (อาระเบีย) + + + + + เวลาอาร์เจนตินา + เวลาฤดูร้อนอาร์เจนตินา + + + + + เวลาอาร์เจนตินาตะวันตก + + + + + เวลาอาร์เมเนีย + เวลาฤดูร้อนอาร์เมเนีย + + + AMT (อาร์เมเนีย) + AMST (อาร์เมเนีย) + + + + + เวลาแอตแลนติก + เวลามาตรฐานแอตแลนติก + + + + + เวลาออสเตรเลียกลาง + เวลามาตรฐานออสเตรเลียกลาง + + + + + เวลาออสเตรเลียตะวันออก + เวลามาตรฐานออสเตรเลียตะวันออก + + + + + เวลาออสเตรเลียตะวันตก + เวลามาตรฐานออสเตรเลียตะวันตก + + + + + เวลาฤดูร้อนอาโซเรช + เวลาฤดูร้อนอาโซเรช + + + + + เวลาบากู + เวลาฤดูร้อนบากู + + + + + เวลาบังกลาเทศ + + + + + เวลาเบริง + เวลามาตรฐานเบริง + + + BST (เบริง) + BDT (เบริง) + + + + + เวลาภูฏาน + + + + + เวลาบอร์เนียว + เวลาฤดูร้อนบอร์เนียว + + + + + เวลาบราซิเลีย + เวลาฤดูร้อนบราซิเลีย + + + + + เวลามาตรฐานชามอร์โร + + + + + เวลาชิลี + เวลาฤดูร้อนชิลี + + + + + เวลามาตรฐานจีน + + + CST (จีน) + CDT (จีน) + + + + + เวลาดูชานเบ + เวลาฤดูร้อนดูชานเบ + + + + + เวลาติมอร์ตะวันออก + + + + + เวลาเอกวาดอร์ + + + + + เวลายุโรปกลาง + เวลาฤดูร้อนยุโรปกลาง + + + + + เวลายุโรปตะวันออก + เวลาฤดูร้อนยุโรปตะวันออก + + + + + เวลายุโรปตะวันตก + เวลาฤดูร้อนยุโรปตะวันตก + + + + + เวลามาตรฐานกรีนิช + + + + + เวลากาลาปาโกส + + + + + เวลาจอร์เจีย + เวลาฤดูร้อนจอร์เจีย + + + + + เวลากรีนแลนด์กลาง + เวลาฤดูร้อนกรีนแลนด์กลาง + + + + + เวลากรีนแลนด์ตะวันออก + เวลาฤดูร้อนกรีนแลนด์ตะวันออก + + + + + เวลากรีนแลนด์ตะวันตก + เวลาฤดูร้อนกรีนแลนด์ตะวันตก + + + + + เวลามาตรฐานกวม + + + GST (กวม) + + + + + เวลามาตรฐานอินเดีย + + + + + เวลาอินโดนีเซียกลาง + + + + + เวลาอินโดนีเซียตะวันออก + + + + + เวลาอินโดนีเซียตะวันตก + + + + + เวลามาตรฐานอิสราเอล + + + IST (อิสราเอล) + + + + + เวลามาตรฐานคาซัคสถานตะวันออก + + + + + เวลามาตรฐานคาซัคสถาน + + + + + เวลาเกาหลี + เวลามาตรฐานเกาหลี + + + + + เวลาควาจาเลน + + + + + เวลามาเก๊า + เวลาฤดูร้อนมาเก๊า + + + + + เวลามาลายา + + + + + เวลามาเลเซีย + + + + + เวลาหมู่เกาะมาร์แชลล์ + + + + + เวลาอูลานบาตอร์ + เวลาฤดูร้อนอูลานบาตอร์ + + + + + เวลานิวซีแลนด์ + เวลามาตรฐานนิวซีแลนด์ + + + + + เวลานิวฟันด์แลนด์ + เวลามาตรฐานนิวฟันด์แลนด์ + + + + + เวลาหมู่เกาะมาเรียนาเหนือ + + + + + เวลาปากีสถาน + เวลาฤดูร้อนปากีสถาน + + + + + ปีแยร์และมีเกอลง + เวลามาตรฐานปีแยร์และมีเกอลง + + + + + เวลาคืยซิลออร์ดา + เวลาฤดูร้อนคืยซิลออร์ดา + + + + + เวลาซามารา + เวลาฤดูร้อนซามารา + + + + + เวลาซามาร์คันด์ + เวลาฤดูร้อนซามาร์คันด์ + + + SAMT (ซามาร์คันด์) + SAMST (ซามาร์คันด์) + + + + + เวลามาตรฐานซามัว + + + + + เวลาซูรินาเม + + + + + เวลาสเวียร์ดลอฟสค์ + เวลาฤดูร้อนสเวียร์ดลอฟสค์ + + + + + เวลาทาจิกิสถาน + + + + + เวลาฤดูร้อนทาชเคนต์ + + + + + เวลาทบิลิซิ + เวลาฤดูร้อนทบิลิซิ + + + + + เวลาตุรกี + เวลาฤดูร้อนตุรกี + + + + + เวลาเติร์กเมนิสถาน + เวลาฤดูร้อนเติร์กเมนิสถาน + + + + + เวลาอุซเบกิสถาน + เวลาฤดูร้อนอุซเบกิสถาน + + + + + เวลาเยคาเตรินบูร์ก + เวลาฤดูร้อนเยคาเตรินบูร์ก + + + + + เวลาเยเรวาน + เวลาฤดูร้อนเยเรวาน + + + + + เวลายูคอน + เวลามาตรฐานยูคอน + + + + + + + . + , + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00;¤-#,##0.00 + + + {0} {1} + + + + เปเซตาอันดอร์รา + + + เดอร์แฮมสหรัฐอาหรับเอมิเรตส์ + + + อัฟกานีอัฟกานิสถาน (1927-2002) + + + อัฟกานีอัฟกานิสถาน + + + เลกแอลเบเนีย + + + แดรมอาร์เมเนีย + + + กิลเดอร์เนเธอร์แลนด์แอนทิลลิส + + + กวานซาแองโกลา + + + กวานซาแองโกลา (1977-1990) + + + นิวกวานซาแองโกลา (1990-2000) + + + กวานซารีจัสทาโดแองโกลา (1995-1999) + + + ออสตรัลอาร์เจนตินา + + + เปโซอาร์เจนตินา (1983-1985) + + + เปโซอาร์เจนตินา + + + ชิลลิงออสเตรีย + + + ดอลลาร์ออสเตรเลีย + + + ฟลอรินอารูบา + + + มานัตอาเซอร์ไบจาน (1993-2006) + + + มานัตอาเซอร์ไบจาน + + + ดีนาร์บอสเนีย-เฮอร์เซโกวีนา + + + มาร​์กบอสเนีย-เฮอร์เซโกวีนา + + + ดอลลาร์บาร์เบโดส + + + ตากาบังกลาเทศ + + + ฟรังก์เบลเยียม (เปลี่ยนแปลงได้) + + + ฟรังก์เบลเยียม + + + ฟรังก์เบลเยียม (การเงิน) + + + ฮาร์ดเลฟบัลแกเรีย + + + เลฟบัลแกเรีย + + + ดีนาร์บาห์เรน + + + ฟรังก์บุรุนดี + + + ดอลลาร์เบอร์มิวดา + + + ดอลลาร์บรูไน + + + โบลิเวียโนโบลิเวีย + + + เปโซโบลิเวีย + + + มฟดอลโบลิเวีย + + + ครูเซโรโนโวบราซิล (1967-1986) + + + ครูซาโดบราซิล + + + ครูเซโรบราซิล (1990-1993) + + + เรียลบราซิล + + + ครูซาโดโนโวบราซิล + + + ครูเซโรบราซิล + + + ดอลลาร์บาฮามาส + + + เอ็งกุลตรัมภูฏาน + + + จ๊าดพม่า + + + ปูลาบอตสวานา + + + นิวรูเบิลเบลารุส (1994-1999) + + + รูเบิลเบลารุส + + + ดอลลาร์เบลีซ + + + ดอลลาร์แคนาดา + + + ฟรังก์คองโก + + + ยูโรดับเบิลยูไออาร์ + + + ฟรังก์สวิส + + + ฟรังก์ดับเบิลยูไออาร์ + + + ฟูเมนโตชิลี + + + เปโซชิลี + + + หยวนเหรินหมินปี้ (สาธารณรัฐประชาชนจีน) + + + เปโซโคลอมเบีย + + + วาเลอร์เรียลโคลอมเบีย + + + โกลองคอสตาริกา + + + ดีนาร์เซอร์เบียเก่า + + + ฮาร์ดโครูนาเช็กโกสโลวัก + + + เปโซคิวบา + + + เอสคูโดเคปเวิร์ด + + + ปอนด์ไซปรัส + + + โครูนาสาธารณรัฐเช็ก + + + มาร์กเยอรมันตะวันออก + + + มาร์กเยอรมัน + + + ฟรังก์จิบูตี + + + โครนเดนมาร์ก + + + เปโซโดมินิกัน + + + ดีนาร์แอลจีเรีย + + + ซูเกรเอกวาดอร์ + + + วาเลอร์คอนสแตนต์เอกวาดอร์ + + + ครูนเอสโตเนีย + + + ปอนด์อียิปต์ + + + แนกฟาเอริเทรีย + + + เปเซตาสเปน (บัญชีเอ) + + + เปเซตาสเปน (บัญชีที่เปลี่ยนแปลงได้) + + + เปเซตาสเปน + + + เบอรร์เอธิโอเปีย + + + ยูโร + + + มาร์กกาฟินแลนด์ + + + ดอลลาร์ฟิจิ + + + ปอนด์หมู่เกาะฟอล์กแลนด์ + + + ฟรังก์ฝรั่งเศส + + + ปอนด์สเตอร์ลิง (สหราชอาณาจักร) + + + คูปอนลาริตจอร์เจีย + + + ลารีจอร์เจีย + + + เซดีกานา (1979-2007) + + + เซดีกานา + + + ปอนด์ยิบรอลตาร์ + + + ดาลาซีแกมเบีย + + + ฟรังก์กินี + + + ไซลีกินี + + + เอ็กเวเลอิเควทอเรียลกินี + + + ดรัชมากรีก + + + เควตซัลกัวเตมาลา + + + เอสคูโดกินีโปรตุเกส + + + เปโซกินี-บิสเซา + + + ดอลลาร์กายอานา + + + ดอลลาร์ฮ่องกง + + + เลมปิราฮอดูรัส + + + ดีนาร์โครเอเชีย + + + คูนาโครเอเชีย + + + กูร์ดเฮติ + + + ฟอรินต์ฮังการี + + + รูเปียห์อินโดนีเซีย + + + ปอนด์ไอริช + + + ปอนด์อิสราเอล + + + นิวเชเกลอิสราเอล + + + รูปีอินเดีย + + + ดีนาร์อิรัก + + + เรียลอิหร่าน + + + โครนาไอซ์แลนด์ + + + ลีราอิตาลี + + + ดอลลาร์จาเมกา + + + ดีนาร์จอร์แดน + + + เยนญี่ปุ่น + ¥ + + + ชิลลิ่งเคนยา + + + ซอมคีร์กีซสถาน + + + เรียลกัมพูชา + + + ฟรังก์คอโมโรส + + + วอนเกาหลีเหนือ + + + วอนเกาหลีใต้ + + + ดีนาร์คูเวต + + + ดอลลาร์หมู่เกาะเคย์แมน + + + เทงเจคาซัคสถาน + + + กีบลาว + + + ปอนด์เลบานอน + + + รูปีศรีลังกา + + + ดอลลาร์ไลบีเรีย + + + โลตีเลโซโท + + + ลีตัสลิทัวเนีย + + + ทาโลนัสลิทัวเนีย + + + คอนเวอร์ทิเบิลฟรังก์ลักเซมเบิร์ก + + + ฟรังก์ลักเซมเบิร์ก + + + ไฟแนลเชียลฟรังก์ลักเซมเบิร์ก + + + ลัตส์ลัตเวีย + + + รูเบิลลัตเวีย + + + ดีนาร์ลิเบีย + + + ดีแรห์มโมร็อกโก + + + ฟรังก์โมร็อกโก + + + ลิวมอลโดวา + + + อาเรียรีมาดากัสการ์ + + + ฟรังก์มาดากัสการ์ + + + ดีนาร์มาซิโดเนีย + + + ฟรังก์มาลี + + + จัคพม่า + + + ทูกริกมองโกเลีย + + + ปาตากามาเก๊า + + + ออกิวยามอริเตเนีย + + + ลีรามอลตา + + + ปอนด์มอลตา + + + รูปีมอริเชียส + + + รูฟิยามัลดีฟส์ + + + ควาชามาลาวี + + + เปโซเม็กซิโก + + + เงินเปโซเม็กซิโก (1861-1992) + + + ยูนิแดด ดี อินเวอร์ชั่น เม็กซิโก + + + ริงกิตมาเลเซีย + + + เอสคูโดโมซัมบิก + + + เมติคัลโมซัมบิกเก่า + + + เมติคัลโมซัมบิก + + + ดอลลาร์นามิเบีย + + + ไนราไนจีเรีย + + + คอร์โดบานิการากัว + + + คอร์โดบาโอโรนิการากัว + + + กิลเดอร์เนเธอร์แลนด์ + + + โครนนอร์เวย์ + + + รูปีเนปาล + + + ดอลลาร์นิวซีแลนด์ + + + เรียลโอมาน + + + บัลบัวปานามา + + + อินตีเปรู + + + นูโวซอลเปรู + + + ซอลเปรู + + + กีนาปาปัวนิวกีนี + + + เปโซฟิลิปปินส์ + + + รูปีปากีสถาน + + + ซลอตีโปแลนด์ + + + ซลอตีโปแลนด์ (1950-1995) + + + เอสคูโดโปรตุเกส + + + กวารานีปารากวัย + + + เรียลกาตาร์ + + + ดอลลาร์โรดีเซีย + + + ลิวโรมาเนียเก่า + + + ลิวโรมาเนีย + + + ดีนาร์เซอร์เบีย + + + รูเบิลรัสเซีย + + + รูเบิลรัสเซีย (1991-1998) + + + ฟรังก์รวันดา + + + ริยัลซาอุดีอาระเบีย + + + ดอลลาร์หมู่เกาะโซโลมอน + + + รูปีเซเชลส์ + + + ดีนาร์ซูดานเก่า + + + ปอนด์ซูดาน + + + ปอนด์ซูดานเก่า + + + โครนาสวีเดน + + + ดอลลาร์สิงคโปร์ + + + ปอนด์เซนต์เฮเลนา + + + ทอลาร์สโลวีเนีย + + + โครูนาสโลวัก + + + ลีโอนเซียร์ราลีโอน + + + ชิลลิงโซมาเลีย + + + ดอลลาร์ซูรินาเม + + + กิลเดอร์ซูรินาเม + + + ดอบราเซาตูเมและปรินซิปี + + + รูเบิลโซเวียต + + + โคลอนเอลซัลวาดอร์ + + + ปอนด์ซีเรีย + + + ลิลันกีนีสวาซิแลนด์ + + + บาทไทย + + + รูเบิลทาจิกิสถาน + + + โซโมนีทาจิกิสถาน + + + มานัตเติร์กเมนิสถาน + + + ดีนาร์ตูนิเซีย + + + พาแองกาตองกา + + + เอสคูโดติมอร์ + + + ลีราตุรกีเก่า + + + ลีราตุรกี + + + ดอลลาร์ตรินิแดดและโตเบโก + + + ดอลลาร์ไต้หวันใหม่ + + + ชิลลิงแทนซาเนีย + + + ฮรีฟเนียยูเครน + + + คาร์โบวาเนตซ์ยูเครน + + + ชิลลิงยูกันดา (1966-1987) + + + ชิลลิงยูกันดา + + + ดอลลาร์สหรัฐ + + + ดอลลาร์สหรัฐ (วันถัดไป) + + + ดอลลาร์สหรัฐ (วันเดียวกัน) + + + เปโซเอนยูนิแดดเซสอินเด็กซาแดสอุรุกวัย + + + เปโซอุรุกวัย (1975-1993) + + + เปโซอุรุกวัย + + + ซอมอุซเบกิสถาน + + + โบลิวาร์เวเนซุเอลา + + + โบลิวาร์ฟูร์เตเวเนซุเอลา + + + ดองเวียดนาม + + + วาตูวานูอาตู + + + ทาลาซามัว + + + ฟรังก์เซฟาธนาคารรัฐแอฟริกากลาง + + + เงิน + + + ทอง + + + หน่วยคอมโพสิตยุโรป + + + หน่วยโมเนทารียุโรป + + + หน่วยบัญชียุโรป [XBC] + + + หน่วยบัญชียุโรป [XBD] + + + ดอลลาร์แคริบเบีµยนตะวันออก + + + สิทธิถอนเงินพิเศษ + + + หน่วยสกุลเงินยุโรป + + + ฟรังก์ทองฝรั่งเศส + + + ฟรังก์ยูไอซีฝรั่งเศส + + + ฟรังก์เซฟาธนาคารกลางรัฐแอฟริกาตะวันตก + + + พัลเลเดียม + + + ฟรังก์ซีเอฟพี + + + แพลตินัม + + + กองทุนไรเน็ต + + + รหัสทดสอบสกุลเงิน + + + ไม่มีหน่วยสกุลเงิน + + + ดีนาร์เยเมน + + + เรียลเยเมน + + + ฮาร์ดดีนาร์ยูโกสลาเวีย + + + โนวิย์ดีนาร์ยูโกสลาเวีย + + + คอนเวอร์ทิเบิลดีนาร์ยูโกสลาเวีย + + + แรนด์แอฟริกาใต้ (การเงิน) + + + แรนด์แอฟริกาใต้ + + + ควาชาแซมเบีย + + + นิวแซร์คองโก + + + แซร์คองโก + + + ดอลลาร์ซิมบับเว + + + + + + {0} วัน + + + {0} ชั่วโมง + + + {0} นาที + + + {0} เดือน + + + {0} วินาที + + + {0} สัปดาห์ + + + {0} ปี + + + + + ใช่ + ไม่ใช่ + + + + diff --git a/lib/zend/Zend/Locale/Data/th_TH.xml b/lib/zend/Zend/Locale/Data/th_TH.xml new file mode 100644 index 0000000000..ffbd3957cf --- /dev/null +++ b/lib/zend/Zend/Locale/Data/th_TH.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ti.xml b/lib/zend/Zend/Locale/Data/ti.xml new file mode 100644 index 0000000000..2e0e4ae650 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ti.xml @@ -0,0 +1,326 @@ + + + + + + + + + + + አፍሪቃንሰኛ + አምሐረኛ + ዓረበኛ + አዜርባይጃንኛ + ቤላራሻኛ + ቡልጋሪኛ + ቢሃሪ + በንጋሊኛ + ብሬቶን + ቦስኒያን + ካታላን + ቼክኛ + ወልሽ + ዴኒሽ + ጀርመን + ግሪከኛ + እንግሊዝኛ + ኤስፐራንቶ + ስፓኒሽ + ኤስቶኒአን + ባስክኛ + ፐርሲያኛ + ፊኒሽ + ታጋሎገኛ + ፋሮኛ + ፈረንሳይኛ + ፍሪሰኛ + አይሪሽ + እስኮትስ ጌልክኛ + ጋለቪኛ + ጓራኒ + ጉጃራቲኛ + ዕብራስጥ + ሕንደኛ + ክሮሽያንኛ + ሀንጋሪኛ + ኢንቴር ቋንቋ + እንዶኑሲኛ + አይስላንደኛ + ጣሊያንኛ + ጃፓንኛ + ጃቫንኛ + ጊዮርጊያኛ + ካማደኛ + ኮሪያኛ + ኩርድሽ + ኪሩጋዚ + ላቲንኛ + ሊቱአኒየን + ላቲቪያን + ማክዶኒኛ + ማላያላምኛ + ማራቲኛ + ማላይኛ + ማልቲስኛ + ኔፖሊኛ + ደች + ኖርዌይኛ (ናይ ኝኖርስክ) + ኖርዌጂያን + ኦኪታንኛ + ኦሪያ + ፑንጃቢኛ + ፖሊሽ + ፓሽቶ + ፖርቱጋሊኛ + ፖርቱጋልኛ (ናይ ብራዚል) + ፖርቱጋልኛ (ናይ ፖርቱጋል) + ሮማኒያን + ራሽኛ + ሰርቦ- ክሮዊታን + ስንሃልኛ + ስሎቨክኛ + ስቁቪኛ + አልቤኒኛ + ሰርቢኛ + ሰሴቶ + ሱዳንኛ + ስዊድንኛ + ሰዋሂሊኛ + ታሚልኛ + ተሉጉኛ + ታይኛ + ትግርኛ + ናይ ቱርኪ ሰብዓይ (ቱርካዊ) + ክሊንግኦንኛ + ቱርከኛ + ትዊ + ዩክረኒኛ + ኡርዱኛ + ኡዝበክኛ + ቪትናምኛ + ዞሳኛ + ዪዲሽ + ዙሉኛ + + + + + + + + + + + [\u135F ሀ-ሆ ለ-ቆ ቈ ቊ-ቍ ቐ-ቖ ቘ ቚ-ቝ በ-ኆ ኈ ኊ-ኍ ነ-ኮ ኰ ኲ-ኵ ኸ-ኾ ዀ ዂ-ዅ ወ-ዎ ዐ-ዖ ዘ-ዮ ደ-ዷ ጀ-ጎ ጐ ጒ-ጕ ጠ-ፗ] + [᎐-᎙ ሇ ⶀ ᎀ-ᎃ ⶁ-ⶄ ቇ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዏ ⶋ ዯ ⶌ ዸ-ዿ ⶍ ⶎ ጏ ጘ-ጟ ⶓ-ⶖ ⶏ-ⶑ ፇ ᎈ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ጃንዩ + ፌብሩ + ማርች + ኤፕረ + ሜይ + ጁን + ጁላይ + ኦገስ + ሴፕቴ + ኦክተ + ኖቬም + ዲሴም + + + ጃንዩወሪ + ፌብሩወሪ + ማርች + ኤፕረል + ሜይ + ጁን + ጁላይ + ኦገስት + ሴፕቴምበር + ኦክተውበር + ኖቬምበር + ዲሴምበር + + + + + ጃ + ፌ + ማ + ኤ + ሜ + ጁ + ጁ + ኦ + ሴ + ኦ + ኖ + ዲ + + + + + + + ሰንበ + ሰኑይ + ሠሉስ + ረቡዕ + ኃሙስ + ዓርቢ + ቀዳም + + + ሰንበት + ሰኑይ + ሠሉስ + ረቡዕ + ኃሙስ + ዓርቢ + ቀዳም + + + + + ሰ + ሰ + ሠ + ረ + ኃ + ዓ + ቀ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ንጉሆ ሰዓተ + ድሕር ሰዓት + + + ዓ/ዓ + ዓ/ም + + + + + + EEEE፣ dd MMMM መዓልቲ y G + + + + + dd MMMM y + + + + + dd-MMM-y + + + + + dd/MM/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + + + የኢትዮጵያ ብር + + + አውሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + + + + + diff --git a/lib/zend/Zend/Locale/Data/ti_ER.xml b/lib/zend/Zend/Locale/Data/ti_ER.xml new file mode 100644 index 0000000000..f569882daa --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ti_ER.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + [\u135F ፡ ፣-፧ ። ፠ ፨ ፲-፼ ፩-፱ ሀ-ሆ ለ-ሟ ረ-ቆ ቈ ቊ-ቍ ቐ-ቖ ቘ ቚ-ቝ በ-ኆ ኈ ኊ-ኍ ነ-ኮ ኰ ኲ-ኵ ኸ-ኾ ዀ ዂ-ዅ ወ-ዎ ዐ-ዖ ዘ-ዮ ደ-ዷ ጀ-ጎ ጐ ጒ-ጕ ጠ-ጯ ጸ-ጿ ፈ-ፗ] + [᎐-᎙ ሇ ⶀ ᎀ-ᎃ ⶁ ሠ-ሧ ⶂ-ⶄ ቇ ᎄ-ᎇ ⶅ-ⶇ ኇ ⶈ-ⶊ ኯ ዏ ⶋ ዯ ⶌ ዸ-ዿ ⶍ ⶎ ጏ ጘ-ጟ ⶓ-ⶖ ⶏ-ⶑ ፀ-ፇ ᎈ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ጥሪ + ለካቲ + መጋቢ + ሚያዝ + ግንቦ + ሰነ + ሓምለ + ነሓሰ + መስከ + ጥቅም + ሕዳር + ታሕሳ + + + ጥሪ + ለካቲት + መጋቢት + ሚያዝያ + ግንቦት + ሰነ + ሓምለ + ነሓሰ + መስከረም + ጥቅምቲ + ሕዳር + ታሕሳስ + + + + + + + ሰሉስ + ሓሙስ + + + ሰሉስ + ሓሙስ + + + + + + + EEEE፡ dd MMMM መዓልቲ y G + + + + + + {0} - {1} + + E፡ MM-dd - E፡ MM-dd + E፡ MM-dd - E፡ MM-dd + + + MMM-MMM + + + E፡ MMM d - E፡ MMM d + E፡ MMM d - E፡ MMM d + + + MMM d - MMM d + MMM d-d + + + MM-dd - MM-dd + MM-dd - MM-dd + + + yyyy-MM - yyyy-MM + yyyy-MM - yyyy-MM + + + E፡ yyyy-MM-dd - E፡ yyyy-MM-dd + E፡ yyyy-MM-dd - E፡ yyyy-MM-dd + E፡ yyyy-MM-dd - E፡ yyyy-MM-dd + + + y MMM-MMM + y MMM - y MMM + + + E፡ dd MMM መዓልቲ y G - E፡ dd MMM መዓልቲ y G + E፡ dd MMM መዓልቲ y G - E፡ dd MMM መዓልቲ y G + E፡ dd MMM መዓልቲ y G - E፡ dd MMM መዓልቲ y G + + + y MMM d - MMM d + y MMM d-d + y MMM d - y MMM d + + + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + yyyy-MM-dd - yyyy-MM-dd + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ti_ET.xml b/lib/zend/Zend/Locale/Data/ti_ET.xml new file mode 100644 index 0000000000..61ea31c784 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ti_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/tig.xml b/lib/zend/Zend/Locale/Data/tig.xml new file mode 100644 index 0000000000..3948a11e24 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tig.xml @@ -0,0 +1,501 @@ + + + + + + + + + + + አፋርኛ + አብሐዚኛ + አፍሪቃንስኛ + አምሐረኛ + ዐርቢኛ + አሳሜዛዊ + አያማርኛ + አዜርባይጃንኛ + ባስኪርኛ + ቤላራሻኛ + ቡልጋሪኛ + ቢሃሪ + ቢስላምኛ + በንጋሊኛ + ትበትንኛ + ብሬቶንኛ + ብሊን + ካታላንኛ + ኮርሲካኛ + ቼክኛ + ወልሽ + ዴኒሽ + ጀርመን + ድዞንግኻኛ + ግሪክኛ + እንግሊዝኛ + ኤስፐራንቶ + ስፓኒሽ + ኤስቶኒአን + ባስክኛ + ፐርሲያኛ + ፊኒሽ + ፊጂኛ + ፋሮኛ + ፈረንሳይኛ + ፍሪስኛ + አይሪሽ + እስኮትስ ጌልክኛ + ግዕዝኛ + ጋለጋኛ + ጓራኒኛ + ጉጃርቲኛ + ሃውሳኛ + ዕብራስጥ + ሐንድኛ + ክሮሽያንኛ + ሀንጋሪኛ + አርመናዊ + ኢንቴርሊንጓ + እንዶኒሲኛ + እንተርሊንግወ + እኑፒያቅኛ + አይስላንድኛ + ጣሊያንኛ + እኑክቲቱትኛ + ጃፓንኛ + ጃቫንኛ + ጊዮርጊያን + ካዛክኛ + ካላሊሱትኛ + ክመርኛ + ካናዳኛ + ኮሪያኛ + ካሽሚርኛ + ኩርድሽኛ + ኪርጊዝኛ + ላቲንኛ + ሊንጋላኛ + ላውስኛ + ሊቱአኒያን + ላትቪያን + ማላጋስኛ + ማዮሪኛ + ማከዶኒኛ + ማላያላምኛ + ሞንጎላዊኛ + ሞልዳቫዊና + ማራዚኛ + ማላይኛ + ማልቲስኛ + ቡርማኛ + ናኡሩ + ኔፓሊኛ + ደች + ኖርዌጂያን + ኦኪታንኛ + ኦሮምኛ + ኦሪያኛ + ፓንጃቢኛ + ፖሊሽ + ፑሽቶኛ + ፖርቱጋሊኛ + ኵቿኛ + ሮማንስ + ሩንዲኛ + ሮማኒያን + ራሽኛ + ኪንያርዋንድኛ + ሳንስክሪትኛ + ሲንድሂኛ + ሳንጎኛ + ስንሃልኛ + ሲዳምኛ + ስሎቫክኛ + ስሎቪኛ + ሳሞአኛ + ሾናኛ + ሱማልኛ + ልቤኒኛ + ሰርቢኛ + ስዋቲኛ + ሶዞኛ + ሱዳንኛ + ስዊድንኛ + ስዋሂሊኛ + ታሚልኛ + ተሉጉኛ + ታጂኪኛ + ታይኛ + ትግርኛ + ትግረ + ቱርክመንኛ + ታጋሎገኛ + ጽዋናዊኛ + ቶንጋ + ቱርክኛ + ጾንጋኛ + ታታርኛ + ትዊኛ + ኡዊግሁርኛ + ዩክረኒኛ + ኡርዱኛ + ኡዝበክኛ + ቪትናምኛ + ቮላፑክኛ + ዎሎፍኛ + ዞሳኛ + ይዲሻዊኛ + ዮሩባዊኛ + ዡዋንግኛ + ቻይንኛ + ዙሉኛ + + + + + + አንዶራ + የተባበሩት አረብ ኤምሬትስ + አልባኒያ + አርሜኒያ + ኔዘርላንድስ አንቲልስ + አርጀንቲና + ኦስትሪያ + አውስትሬሊያ + አዘርባጃን + ቦስኒያ እና ሄርዞጎቪኒያ + ባርቤዶስ + ቤልጄም + ቡልጌሪያ + ባህሬን + ቤርሙዳ + ቦሊቪያ + ብራዚል + ቡህታን + ቤላሩስ + ቤሊዘ + ኮንጎ + የመካከለኛው አፍሪካ ሪፐብሊክ + ስዊዘርላንድ + ቺሊ + ካሜሩን + ቻይና + ኮሎምቢያ + ሰርቢያ + ኬፕ ቬርዴ + ሳይፕረስ + ቼክ ሪፑብሊክ + ጀርመን + ዴንማርክ + ዶሚኒካ + ዶሚኒክ ሪፑብሊክ + አልጄሪያ + ኢኳዶር + ኤስቶኒያ + ግብጽ + ምዕራባዊ ሳህራ + ኤርትራ + ስፔን + ኢትዮጵያ + ፊንላንድ + ፊጂ + ሚክሮኔዢያ + ፈረንሳይ + እንግሊዝ + ጆርጂያ + የፈረንሳይ ጉዊአና + ጋምቢያ + ጊኒ + ኢኳቶሪያል ጊኒ + ግሪክ + ቢሳዎ + ጉያና + ሆንግ ኮንግ + ክሮኤሽያ + ሀይቲ + ሀንጋሪ + ኢንዶኔዢያ + አየርላንድ + እስራኤል + ህንድ + ኢራቅ + አይስላንድ + ጣሊያን + ጃማይካ + ጆርዳን + ጃፓን + ካምቦዲያ + ኮሞሮስ + ደቡብ ኮሪያ + ሰሜን ኮሪያ + ክዌት + ሊባኖስ + ሊቱዌኒያ + ላትቪያ + ሊቢያ + ሞሮኮ + ሞልዶቫ + ማከዶኒያ + ሞንጎሊያ + ማካዎ + ሞሪቴኒያ + ማልታ + ማሩሸስ + ሜክሲኮ + ማሌዢያ + ናሚቢያ + ኒው ካሌዶኒያ + ናይጄሪያ + ኔዘርላንድ + ኖርዌ + ኔፓል + ኒው ዚላንድ + ፔሩ + የፈረንሳይ ፖሊኔዢያ + ፓፑዋ ኒው ጊኒ + ፖላንድ + ፖርታ ሪኮ + ሮሜኒያ + ራሺያ + ሳውድአረቢያ + ሱዳን + ስዊድን + ሲንጋፖር + ስሎቬኒያ + ስሎቫኪያ + ሴኔጋል + ሱማሌ + ሲሪያ + ቻድ + የፈረንሳይ ደቡባዊ ግዛቶች + ታይላንድ + ታጃኪስታን + ምስራቅ ቲሞር + ቱኒዚያ + ቱርክ + ትሪኒዳድ እና ቶባጎ + ታንዛኒያ + ዩጋንዳ + አሜሪካ + ዩዝበኪስታን + ቬንዙዌላ + የእንግሊዝ ድንግል ደሴቶች + የአሜሪካ ቨርጂን ደሴቶች + የመን + ደቡብ አፍሪካ + ዛምቢያ + + + + [\u135F ፡ ፣-፧ ። ፠ ፨ ᎐-᎙ ፲-፼ ፩-፱ ሀ-ሏ ⶀ ሐ-ሟ ᎀ-ᎃ ⶁ ሠ-ሯ ⶂ ሰ-ሷ ⶃ ሸ-ሿ ⶄ ቀ-ቈ ቊ-ቍ ቐ-ቖ ቘ ቚ-ቝ በ-ቧ ᎄ-ᎇ ⶅ ቨ-ቷ ⶆ ቸ-ቿ ⶇ ኀ-ኈ ኊ-ኍ ነ-ኗ ⶈ ኘ-ኟ ⶉ አ-ኧ ⶊ ከ-ኰ ኲ-ኵ ኸ-ኾ ዀ ዂ-ዅ ወ-ዖ ዘ-ዟ ⶋ ዠ-ዷ ⶌ ዸ-ዿ ⶍ ጀ-ጇ ⶎ ገ-ጐ ጒ-ጕ ጘ-ጟ ⶓ-ⶖ ጠ-ጧ ⶏ ጨ-ጯ ⶐ ጰ-ጷ ⶑ ጸ-ፏ ᎈ-ᎋ ፐ-ፗ ᎌ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ጃንዩ + ፌብሩ + ማርች + ኤፕረ + ሜይ + ጁን + ጁላይ + ኦገስ + ሴፕቴ + ኦክተ + ኖቬም + ዲሴም + + + ጃንዩወሪ + ፌብሩወሪ + ማርች + ኤፕረል + ሜይ + ጁን + ጁላይ + ኦገስት + ሴፕቴምበር + ኦክተውበር + ኖቬምበር + ዲሴምበር + + + + + ጃ + ፌ + ማ + ኤ + ሜ + ጁ + ጁ + ኦ + ሴ + ኦ + ኖ + ዲ + + + + + + + ሰ/ዓ + ሰኖ + ታላሸ + ኣረር + ከሚሽ + ጅምዓ + ሰ/ን + + + ሰንበት ዓባይ + ሰኖ + ታላሸኖ + ኣረርባዓ + ከሚሽ + ጅምዓት + ሰንበት ንኢሽ + + + + + ሰ + ሰ + ታ + ኣ + ከ + ጅ + ሰ + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + ቀደም ሰርምዕል + ሓቆ ስርምዕል + + + ዓ/ዓ + ዓ/ም + + + + + + EEEE፡ dd MMMM ዮም y G + + + + + dd MMMM y + + + + + dd-MMM-y + + + + + dd/MM/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + + + ¤#,##0.00 + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + + + የኢትዮጵያ ብር + + + አውሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + + + + + diff --git a/lib/zend/Zend/Locale/Data/tig_ER.xml b/lib/zend/Zend/Locale/Data/tig_ER.xml new file mode 100644 index 0000000000..1f496c2835 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tig_ER.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/tl.xml b/lib/zend/Zend/Locale/Data/tl.xml new file mode 100644 index 0000000000..2deb47710d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tl.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/tn.xml b/lib/zend/Zend/Locale/Data/tn.xml new file mode 100644 index 0000000000..2512a55f15 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tn.xml @@ -0,0 +1,308 @@ + + + + + + + + + + + Seburu + Amhariki + Arabic + Azerbaijani + Belarusian + Bulgarian + Bihari + Bengali + SeBosnia + Catalan + Se Czeck + Welsh + Danish + German + SeGerika + Sekgoa + Esperanto + Spanish + Estonian + Basque + Mo/SePerishia + Se-Finland + Tagalog + Faroese + Se Fora + Frisian + Irish + Scots Gaelic + Galician + Gujarati + Se heberu + Hindi + Croatian + Hungarian + Interlingua + Indonesian + Icelandic + Se Italiano + Se Japan + Javanese + Mo/SeJojia + Kannada + Se Korea + Latin + Lithuanian + Latvian + Macedonian + Malayalam + Marathi + Malay + Maltese + Nepali + Se Dutch + Puo ya kwa Norway + Occitan + Punjabi + Se Poland + Se Potoketsi + Se Roma + Russian + Slovak + Slovenian + Albanian + Serbian + Mo/SeSundane + Swedish + Swahili + Tamil + Telugu + Thai + Tigrinya + Klingon + Setswana + Turkish + Ukrainian + Urdu + Uzbek + Vietnamese + IsiXhosa + IsiZulu + + + + [a b d e ê f-o ô p r-u w y] + [c q v x z] + [a-z] + + + ‘ + ’ + “ + ” + + + + + + + + Fer + Tlh + Mop + Mor + Mot + See + Phu + Pha + Lwe + Dip + Ngw + Sed + + + Ferikgong + Tlhakole + Mopitlo + Moranang + Motsheganang + Seetebosigo + Phukwi + Phatwe + Lwetse + Diphalane + Ngwanatsele + Sedimonthole + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + + + + + Tsh + Mos + Bed + Rar + Ne + Tla + Mat + + + Tshipi + Mosopulogo + Labobedi + Laboraro + Labone + Labotlhano + Matlhatso + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + Q1 + Q2 + Q3 + Q4 + + + Q1 + Q2 + Q3 + Q4 + + + + AM + PM + + + BC + AD + + + BC + AD + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + diff --git a/lib/zend/Zend/Locale/Data/tn_ZA.xml b/lib/zend/Zend/Locale/Data/tn_ZA.xml new file mode 100644 index 0000000000..b1fb8aec95 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tn_ZA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/to.xml b/lib/zend/Zend/Locale/Data/to.xml new file mode 100644 index 0000000000..995fc532d8 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/to.xml @@ -0,0 +1,611 @@ + + + + + + + + + + + {0} ({1}) + , + + + lea fakaʻalepea + lea faʻu pē kehe + lea fakasiamane + lea fakakalisi + lea fakapilitānia + lea fakasepeni + lea fakapēsia + lea fakafinilani + lea fakafisi + lea fakafalanisē + lea fakaʻaealani + lea fakakilipasi + lea fakakalisimuʻa + lea fakahauaiʻi + lea fakahepelū + lea fakaʻītali + lea fakasiapani + lea fakakōlea + lea fakalatina + lea fakamāsolo + lea fakamauli + lea kehekehe + lea fakamalei + lea fakapema + lea fakanaulu + lea fakaniuē + lea fakaholani + lea fakanoauē + lea fakapotukali + lea fakapotukali-palāsili + lea fakalapanui + lea fakalalotonga + lea fakalusia + lea fakasikotilani + lea fakaʻilonga + lea fakahaʻamoa + lea fakasueteni + lea fakatokelau + lea fakatonga + lea fakatoake + lea fakatūvalu + lea fakatahisi + lea taʻeʻiloa + lea fakasiaina + lea fakasiaina fakangofua + lea fakasiaina tukufakaholo + ʻikai ha lea + + + + + + + + + + + + + + + + + + + Māmani + ʻAfelika + ʻAmelika tokelau + ʻAmelika tonga + ʻOseania + ʻAfelika hihifo + ʻAmelika lotoloto + ʻAfelika hahake + ʻAfelika tokelau + ʻAfelika lotoloto + ʻAfelika fakatonga + Ongo ʻAmelika + ʻAmelika tonga ange + Kalipea + ʻĒsia hahake + ʻĒsia tonga + ʻĒsia tongahahake + ʻEulope tonga + ʻAositelēlia mo Nuʻusila + Melanisia + Potu fonua Mikolonisia + Polinisia + ʻĒsia tongalotoloto + ʻĒsia + ʻĒsia lotoloto + ʻĒsia hihifo + ʻEulope + ʻEulope hahake + ʻEulope tokelau + ʻEulope hihifo + Komoniueli + ʻAmelika fakalatina mo Kalipea + Anitikua mo Palaputa + Anikuila + ʻAnetātika + Haʻamoa fakaʻamelika + ʻAositelēlia + Pelesiume + Palāsili + Pahama + Motu Puveti + Potisiuana + Pelise + Kānata + Suisilani + ʻOtumotu Kuki + Siaina + Motu Kilisimasi + Siamane + Tominika + ʻIsipite + Sepeni + Finilani + Fisi + Mikolonisia + Falanisē + Pilitānia + Kelenatā + Kuenisī + Kana + Sipalālitā + Kamipia + Kalisi + ʻOtumotu Siosia-tonga mo Saniuisi-tonga + Kuami + Kuiana + Hongi Kongi SAR Siaina + ʻOtumotu Heati mo Makitonali + Honitulasi + ʻAealani + ʻIsileli + Motu Mani + ʻInitia + Potu fonua moana ʻInitia fakapilitānia + ʻĪtali + Selusī + Siapani + Kenia + Kilipasi + Kōloa tokelau + Kōlea tonga + Sīloni + Laipelia + Lesoto + ʻOtumotu Māsolo + ʻOtumotu Maliana tokelau + Moʻungaselati + Malita + Maulitiusi + Malaui + Mekesikō + Namipia + Niu Kaletonia + Motu Nōfoliki + Naisilia + Holani + Noauē + Naulu + Niuē + Nuʻusila + Panamā + Polinisia fakafalanisē + Papuaniukini + Pakisitani + Pitikeni + Potukali + Palau + ʻEulope fakataha + Lūsia + Luanitā + ʻOtumotu Solomone + ʻOtumotu Seiseli + Suēteni + Singapula + Potu fonua tonga fakafalanisē + Tokelau + Tonga + Toake + Tilinitati mo Topako + Tūvalu + ʻOtumotu siʻi ʻo ʻAmelika + Puleʻanga fakataha ʻAmelika + Vatikani + ʻOtumotu Vilikini fakapilitānia + ʻOtumotu Vilikini fakaʻamelika + Vanuatu + ʻUvea mo Futuna + Haʻamoa + ʻAfelika tonga + Simipapue + Potu fonua taʻeʻiloa pe hala + + + tohi māhina + tohi hokohoko + paʻanga + + + fakaputa + fakasiaina + hangatonu + fakakelekolia + fakahepelū + fakaʻinitia + fakamohameti + fakamohameti-sivile + fakasiapani + + + fakaʻamelika + fakamita + + + + [a á ā e é ē f h ʻ i í ī k-n {ng} o ó ō p s-u ú ū v] + [à ă â å ä æ b c ç d è ĕ ê ë g ì ĭ î ï j ñ ò ŏ ô ö ø œ q r ß ù ŭ û ü w-y ÿ z] + [a-z] + + + “ + ” + « + » + + + + + + + + Sān + Fēp + Maʻa + ʻEpe + Mē + Sun + Siu + ʻAok + Sēp + ʻOka + Nōv + Tis + + + Sānuali + Fēpueli + Maʻasi + ʻEpeleli + Mē + Sune + Siulai + ʻAokosi + Sēpitema + ʻOkatopa + Nōvema + Tisema + + + + + S + F + M + E + M + S + S + A + S + O + N + T + + + + + + + Sāp + Mōn + Tus + Pul + Tuʻa + Fal + Tok + + + Sāpate + Mōnite + Tusite + Pulelulu + Tuʻapulelulu + Falaite + Tokonaki + + + + + S + M + T + P + T + F + T + + + + + + + K1 + K2 + K3 + K4 + + + kuata ʻuluaki + kuata ua + kuata tolu + kuata fā + + + + + 1 + 2 + 3 + 4 + + + kuata 1 + kuata 2 + kuata 3 + kuata 4 + + + + HH + EA + + + ki muʻa + taʻu ʻo Sīsū + + + KM + TS + + + KāMā + TāSā + + + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + dd-MM-yyyy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + H:mm + L + E d-M + LLL + E d MMM + E d MMMM + d MMMM + d MMM + d-M + d + mm:ss + y + M-yyyy + EEE d-M-yyyy + MMM y + EEE d MMM y + MMMM y + yyyy Q + y QQQ + MM-yy + MMM yy + Q yy + + + + + kuonga + + + taʻu + + + māhina + + + uike + + + ʻaho + ʻaneheafi + ʻaneafi + ʻahó ni + ʻapongipongi + ʻahepongipongi + + + ʻaho ʻo e uike + + + HH/EA + + + houa + + + miniti + + + sekoni + + + vahetaimi + + + + + + +HH:mm;-HH:mm + GMT{0} + Houa {0} + + + houa fakafisi + houa fakafisi fakamaama + + + + + houa fakahauaʻi + + + + + houa fakanuʻusila + houa fakanuʻusila fakasīpinga + houa fakanuʻusila fakamaama + + + + + houa fakaniuē + + + + + houa fakahaʻamoa + + + + + houa fakatahisi + + + + + houa fakatokelau + + + + + houa fakatonga + houa fakatonga lotohē + + + + + houa fakatūvalu + + + + + houa fakaʻuvea mo futuna + + + + + + + . + , + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + {0} {1} + + + + + {0} ʻa + + + {0} m + + + {0} u + + + {0} t + + + + + ʻio + ʻikai + + + diff --git a/lib/zend/Zend/Locale/Data/to_TO.xml b/lib/zend/Zend/Locale/Data/to_TO.xml new file mode 100644 index 0000000000..1ada95da17 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/to_TO.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/tr.xml b/lib/zend/Zend/Locale/Data/tr.xml new file mode 100644 index 0000000000..a2333b431c --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tr.xml @@ -0,0 +1,3775 @@ + + + + + + + + + + + {0} ({1}) + , + + + Afar + Abazca + Achinese + Acoli + Adangme + Çerkezce + Avestçe + Afrikaan Dili + Afro-Asyatik Diller + Afrihili + Ayni Dili + Akan + Akad Dili + Aleut + Algonkin Dili + Güney Altayca + Amharca + Aragonca + Eski İngilizce + Angika + Apaçi Dilleri + Arapça + Aramice + Araukanya Dili + Arapaho Dili + Yapay Diller + Arawak Dili + Assamca + Asturyasca + Atabaşkan Dilleri + Avustralya Dilleri + Avar Dili + Awadhi + Aymara + Azerice + Başkırtça + Banda Dili + Bamileke Dilleri + Baluchi + Bali Dili + Basa Dili + Baltık Dilleri + Beyaz Rusça + Beja Dili + Bemba + Berberi + Bulgarca + Bihari + Arayanice + Bislama + Bikol + Bini + Siksika + Bambara + Bengalce + Bantu Dili + Tibetçe + Bretonca + Braj + Boşnakça + Batak + Buryat + Bugis + Blin + Katalanca + Caddo + Orta Amerika Yerli Dilleri + Carib + Kafkas Dilleri + Atsam + Çeçence + Cebuano + Kelt Dilleri + Chamorro + Chibcha + Çağatay Dili + Chuukese + Mari + Chinook Jargon + Choctaw + Chipewyan + Çeroki + Şayen Dili + Chamic Dilleri + Korsikaca + Kiptice + İngilizce tabanlı Creole ve Pidgin Dilleri + Fransızca tabanlı Creole ve Pidgin Dilleri + Portekizce tabanlı Creole ve Pidgin Dilleri + Cree + Kırım Türkçesi + Creole ve Pidgin Dilleri + Çekçe + Kashubian + Kilise Slavcası + Kuşitik Diller + Çuvaşça + Galce + Danca + Dakota + Dargince + Dayak + Almanca + Avusturya Almancası + İsviçre Yüksek Almancası + Delaware + Slavey + Dogrib + Dinka + Dogri + Dravid Dilleri + Aşağı Sorbça + Duala + Ortaçağ Felemenkçesi + Divehi + Dyula + Butan Dili + Ewe + Efik + Eski Mısır Dili + Ekajuk + Yunanca + Elam + İngilizce + Avustralya İngilizcesi + Kanada İngilizcesi + İngiliz İngilizcesi + Amerikan İngilizcesi + Ortaçağ İngilizcesi + Esperanto + İspanyolca + Latin Amerika İspanyolcası + İber İspanyolcası + Estonya Dili + Baskça + Ewondo + Farsça + Fang + Fanti + Fulah + Fince + Filipino + Finno - Ugrik Diller + Fiji Dili + Faroe Dili + Fon + Fransızca + Kanada Fransızcası + İsviçre Fransızcası + Ortaçağ Fransızcası + Eski Fransızca + Kuzey Frizce + Doğu Frizcesi + Friulian + Batı Frizcesi + İrlanda Dili + Ga + Gayo + Gbaya + İskoç Gal Dili + Cermen Dilleri + Geez + Kiribati Dili + Galiçyaca + Ortaçağ Yüksek Almancası + Guarani + Eski Yüksek Almanca + Gondi + Gorontalo + Gotça + Grebo + Antik Yunanca + İsviçre Almancası + Gujarati + Manks + Gwichʼin + Hausa + Haida + Hawaii Dili + İbranice + Hintçe + Hiligaynon + Himachali + Hititçe + Hmong + Hiri Motu + Hırvatça + Yukarı Sorbça + Haiti Dili + Macarca + Hupa + Ermenice + Herero + Interlingua + Iban + Endonezce + Interlingue + İbo Dili + Sichuan Yi + Ijo + Inupiak + Iloko + Hint Dilleri + Hint-Avrupa Dilleri + İnguş Dili + Ido + İran Dilleri + İroqu Dili + İzlandaca + İtalyanca + Inuktitut + Japonca + Lojban + Yahudi Farsçası + Yahudi Arapçası + Cava Dili + Gürcüce + Karakalpakça + Kabile + Kaçin + Jju + Kamba + Karen + Kawi + Kabardeyce + Tyap + Koro + Kongo + Khasi + Hoisan Dilleri + Hotanca + Kikuyu + Kuanyama + Kazakça + Grönland Dili + Kamboçya Dili + Kimbundu + Kannada + Korece + Konkani + Kosraean + Kpelle + Kanuri + Karaçay-Balkarça + Karelyaca + Kru + Kurukh + Keşmirce + Kürtçe + Kumukça + Kutenai + Komi + Kernevekçe + Kırgızca + Latince + Ladino + Lahnda + Lamba + Lüksemburgca + Lezgice + Ganda + Limburgca + Lingala + Laos Dili + Mongo + Lozi + Litvanyaca + Luba-Katanga + Luba-Lulua + Luiseno + Lunda + Luo + Lushai + Letonca + Madura Dili + Magahi + Maithili + Makasar + Mandingo + Avustronezya Dili + Masai + Mokşa Dili + Mandar + Mende + Malagasi + Ortaçağ İrlandacası + Marshall Adaları Dili + Maori + Micmac + Minangkabau + Çeşitli Diller + Makedonca + Mon-Khmer Dilleri + Malayalam + Moğolca + Mançurya Dili + Manipuri + Manobo Dilleri + Moldovaca + Mohawk + Mossi + Marathi + Malay + Malta Dili + Birden Fazla Dil + Munda Dilleri + Creek + Miranda Dili + Marwari + Birmanya Dili + Maya Dilleri + Erzya + Nauru Dili + Nahuatl + Kuzey Amerika Yerli Dilleri + Napolice + Norveççe Bokmål + Kuzey Ndebele + Aşağı Almanca + Nepalce + Newari + Ndonga + Nias + Nijer-Kordofan Dilleri + Niuean + Hollanda Dili + Felemenkçe + Norveççe Nynorsk + Norveççe + Nogayca + Eski Norse + N’Ko + Güney Ndebele + Kuzey Sotho + Nubian Dilleri + Navaho Dili + Klasik Nevari + Nyanja + Nyamwezi + Nyankole + Nyoro + Nzima + Oksitanca + Ojibva Dili + Oromo + Oriya + Osetçe + Osage + Osmanlı Türkçesi + Otomi Dilleri + Pencap Dili + Papua Dilleri + Pangasinan + Pehlevi Dili + Pampanga + Papiamento + Palau Dili + Eski Farsça + Filipinler Dilleri + Fenike Dili + Pali + Lehçe + Pohnpeian + Prakrit Dilleri + Eski Provensal + Peştuca + Portekizce + Brezilya Portekizcesi + İber Portekizcesi + Quechua + Rajasthani + Rapanui + Rarotongan + Rhaeto-Roman Dili + Kirundi + Romence + Roman Dilleri + Romanca + Köken + Rusça + Ulahça + Kinyarwanda + Sanskritçe + Sandawe + Yakutça + Güney Amerika Yerli Dilleri + Salishan Dilleri + Samarit Aramcası + Sasak + Santali + Sardunya Dili + Sicilyaca + Scots + Sindhi + Kuzey Sami + Selkup + Semitik Diller + Sangho + Eski İrlandaca + İşaret Dilleri + Sırp-Hırvat Dili + Shan Dili + Seylanca + Sidamo + Siu Dilleri + Sino-Tibet Dilleri + Slovakça + Slovence + Slav Dilleri + Samoa Dili + Güney Sami + Sami Dilleri + Lule Sami + Inari Sami + Skolt Sami + Shona + Soninke + Somali Dili + Sogdiana Dili + Songhai + Arnavutça + Sırpça + Sranan Tongo + Serer + Siswati + Nil-Sahara Dilleri + Güney Sotho + Sunda Dili + Sukuma + Susu + Sümerce + İsveççe + Swahili + Klasik Süryanice + Süryanice + Tamilce + Tai Dili + Telugu + Timne + Tereno + Tetum + Tacikçe + Tayca + Tigrinya + Tigre + Tiv + Türkmence + Tokelau + Takalotça + Klingon + Tlingit + Tamaşek + Setswana + Tonga + Nyasa Tonga + Tok Pisin + Türkçe + Tsonga + Tsimshian + Tatarca + Tumbuka + Tupi Dilleri + Altay Dilleri + Tuvalu + Twi + Tahiti Dili + Tuvaca + Udmurtça + Uygurca + Ugarit Dili + Ukraynaca + Umbundu + Bilinmeyen veya Geçersiz Dil + Urduca + Özbekçe + Vai + Venda + Vietnamca + Volapük + Votic + Valonca + Wakashan Dilleri + Walamo + Waray + Washo + Sorb Dilleri + Volofca + Kalmıkça + Xhosa + Yao + Yapça + Yidiş + Yoruba + Yupik Dili + Zhuang + Zapotek Dili + Blis Sembolleri + Zenaga + Çince + Basitleştirilmiş Çince + Geleneksel Çince + Zande + Zulu + Zuni + Dilbilim içeriği yok + Zazaca + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dünya + Afrika + Kuzey Amerika + Güney Amerika + Okyanusya + Batı Afrika + Orta Amerika + Doğu Afrika + Kuzey Afrika + Orta Afrika + Afrika'nın Güneyi + Amerika + Amerika'nın Kuzeyi + Karayipler + Doğu Asya + Güney Asya + Güney Doğu Asya + Güney Avrupa + Avustralya ve Yeni Zelanda + Melanezya + Mikronezya + Polinezya + Güney Orta Asya + Asya + Orta Asya + Batı Asya + Avrupa + Doğu Avrupa + Kuzey Avrupa + Batı Avrupa + Bağımsız Devletler Topluluğu + Latin Amerika ve Karayipler + Kanal Adaları + Andorra + Birleşik Arap Emirlikleri + Afganistan + Antigua ve Barbuda + Anguilla + Arnavutluk + Ermenistan + Hollanda Antilleri + Angola + Antarktika + Arjantin + Amerikan Samoası + Avusturya + Avustralya + Aruba + Aland Adaları + Azerbaycan + Bosna Hersek + Barbados + Bangladeş + Belçika + Burkina Faso + Bulgaristan + Bahreyn + Burundi + Benin + Saint Barthelemy + Bermuda + Brunei + Bolivya + Brezilya + Bahamalar + Bhutan + Bouvet Adası + Botsvana + Beyaz Rusya + Belize + Kanada + Cocos Adaları + Kongo - Kinşasa + Orta Afrika Cumhuriyeti + Kongo - Brazavil + İsviçre + Fildişi Sahili + Cook Adaları + Şili + Kamerun + Çin + Kolombiya + Kosta Rika + Sırbistan-Karadağ + Küba + Cape Verde + Christmas Adası + Güney Kıbrıs Rum Kesimi + Çek Cumhuriyeti + Almanya + Cibuti + Danimarka + Dominika + Dominik Cumhuriyeti + Cezayir + Ekvador + Estonya + Mısır + Batı Sahara + Eritre + İspanya + Etiyopya + Finlandiya + Fiji + Falkland Adaları + Mikronezya Federal Eyaletleri + Faroe Adaları + Fransa + Gabon + Birleşik Krallık + Grenada + Gürcistan + Fransız Guyanası + Guernsey + Gana + Cebelitarık + Grönland + Gambiya + Gine + Guadeloupe + Ekvator Ginesi + Yunanistan + Güney Georgia ve Güney Sandwich Adaları + Guatemala + Guam + Gine-Bissau + Guyana + Hong Kong SAR - Çin + Heard Adası ve McDonald Adaları + Honduras + Hırvatistan + Haiti + Macaristan + Endonezya + İrlanda + İsrail + Man Adası + Hindistan + Hint Okyanusu İngiliz Bölgesi + Irak + İran + İzlanda + İtalya + Jersey + Jamaika + Ürdün + Japonya + Kenya + Kırgızistan + Kamboçya + Kiribati + Komorlar + Saint Kitts ve Nevis + Kuzey Kore + Güney Kore + Kuveyt + Cayman Adaları + Kazakistan + Laos + Lübnan + Saint Lucia + Liechtenstein + Sri Lanka + Liberya + Lesotho + Litvanya + Lüksemburg + Letonya + Libya + Fas + Monako + Moldova + Karadağ + Saint Martin + Madagaskar + Marshall Adaları + Makedonya + Mali + Myanmar + Moğolistan + Makao S.A.R. Çin + Kuzey Mariana Adaları + Martinik + Moritanya + Montserrat + Malta + Mauritius + Maldivler + Malavi + Meksika + Malezya + Mozambik + Namibya + Yeni Kaledonya + Nijer + Norfolk Adası + Nijerya + Nikaragua + Hollanda + Norveç + Nepal + Nauru + Niue + Yeni Zelanda + Umman + Panama + Peru + Fransız Polinezyası + Papua Yeni Gine + Filipinler + Pakistan + Polonya + Saint Pierre ve Miquelon + Pitcairn + Porto Riko + Filistin Bölgesi + Portekiz + Palau + Paraguay + Katar + Uzak Okyanusya + Avrupa Birliği + Reunion + Romanya + Sırbistan + Rusya Federasyonu + Ruanda + Suudi Arabistan + Solomon Adaları + Seyşel Adaları + Sudan + İsveç + Singapur + Saint Helena + Slovenya + Svalbard ve Jan Mayen + Slovakya + Sierra Leone + San Marino + Senegal + Somali + Surinam + Sao Tome ve Principe + El Salvador + Suriye + Svaziland + Turks ve Caicos Adaları + Çad + Fransız Güney Bölgeleri + Togo + Tayland + Tacikistan + Tokelau + Doğu Timor + Türkmenistan + Tunus + Tonga + Türkiye + Trinidad ve Tobago + Tuvalu + Tayvan + Tanzanya + Ukrayna + Uganda + Amerika Birleşik Devletleri Küçük Dış Adaları + Amerika Birleşik Devletleri + Uruguay + Özbekistan + Vatikan + Saint Vincent ve Grenadinler + Venezuela + İngiliz Virgin Adaları + ABD Virgin Adaları + Vietnam + Vanuatu + Wallis ve Futuna + Samoa + Yemen + Mayotte + Güney Afrika + Zambiya + Zimbabve + Bilinmeyen veya Geçersiz Bölge + + + Geleneksel Almanca Yazım Kuralları + Standart Resia Yazım Kuralları + 1996 Almanca Yazım Kuralları + 1606'ya Dek Geç Ortaçağ Fransızcası + Erken Modern Fransızca + Doğu Ermenicesi + Batı Ermenicesi + Birleştirilmiş Yeni Türk Alfabesi + San Giorgio/Bila Lehçesi + Boontling + IPA Ses Bilimi + UPA Ses Bilimi + Resia Lipovaz Lehçesi + Monotonik + Natisone Lehçesi + Gniva/Njiva Lehçesi + Oseacco/Osojane Lehçesi + Politonik + Bilgisayar + Gözden Geçirilmiş Yazım Kuralları + Resia Lehçesi + Saho + İskoç Standart İngilizcesi + Scouse + Stolvizza/Solbica Lehçesi + Taraskievica Yazım Kuralları + Valensiyaca + + + Takvim + Sıralama + Para Birimi + + + Geleneksel Çince Sıralaması - Big5 + Budist Takvimi + Çin Takvimi + Düz Sıralama + Basitleştirilmiş Çince Sıralaması - GB2312 + Miladi Takvim + Yahudi Takvimi + Ulusal Hint Takvimi + Hicri Takvim + Arap Takvimi + Japon Takvimi + Telefon Defteri Sıralaması + Pinyin Sıralaması + Çin Cumhuriyeti Takvimi + Stroke Sıralaması + Geleneksel Sıralama + + + ABD + Metrik + + + Dil: {0} + Betik: {0} + Bölge: {0} + + + + [a-c ç d-g ğ h ı i İ {i\u0307} j-o ö p r s ş t u ü v y z] + [á à ă â å ä ā æ é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ø ō œ q ß ú ù ŭ û ū w x ÿ] + [a-c č d-l ł m-z] + + + “ + ” + ‘ + ’ + + + + + + + yy MMM + + + + + + + + Tût + Bâbe + Hatur + Keyhek + Tûbe + Imşir + Bermuhat + Bermude + Peyştes + Bune + Ebip + Mısrî + Nesî + + + + + + + + + Meskerem + Tikimt + Hidar + Tahsas + Tir + Yakatit + Magabit + Miyazya + Ginbot + Sene + Hamle + Nehasa + Pagumiene + + + + + + + + + Oca + Şub + Mar + Nis + May + Haz + Tem + Ağu + Eyl + Eki + Kas + Ara + + + Ocak + Şubat + Mart + Nisan + Mayıs + Haziran + Temmuz + Ağustos + Eylül + Ekim + Kasım + Aralık + + + + + O + Ş + M + N + M + H + T + A + E + E + K + A + + + + + + + Paz + Pzt + Sal + Çar + Per + Cum + Cmt + + + Pazar + Pazartesi + Salı + Çarşamba + Perşembe + Cuma + Cumartesi + + + + + P + P + S + Ç + P + C + C + + + + + + + Ç1 + Ç2 + Ç3 + Ç4 + + + 1. çeyrek + 2. çeyrek + 3. çeyrek + 4. çeyrek + + + + + 1 + 2 + 3 + 4 + + + + AM + PM + + + Milattan Önce + Milattan Sonra + + + MÖ + MS + + + + + + dd MMMM y EEEE + + + + + dd MMMM y + + + + + dd MMM y + + + + + dd.MM.yyyy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + d EEE + d E + H + HH:mm + HH:mm:ss + HH:mm + L + dd/MM E + LLL + dd MMM E + dd MMMM E + dd MMMM + dd MMM + dd/MM + d + hh:mm a + hh:mm:ss a + mm:ss + mm:ss + y + M/yyyy + dd.MM.yyyy EEE + MMM y + dd MMM y EEE + MMMM y + Q yyyy + QQQ y + MM/yy + MMM yy + Q yy + QQQQ yy + y + + + {0} - {1} + + M-M + + + dd.MM E - dd.MM E + dd.MM E - dd.MM E + + + MMM-MMM + + + dd MMM E - dd MMM E + dd MMM E - dd MMM E + + + LLLL-LLLL + + + dd MMM - dd MMM + dd-dd MMM + + + dd.MM - dd.MM + dd.MM - dd.MM + + + d-d + + + HH-HH + HH-HH + + + HH:mm-HH:mm + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH-HH v + HH-HH v + + + y-y + + + MM.yyyy - MM.yyyy + MM.yyyy - MM.yyyy + + + dd.MM.yyyy E - dd.MM.yyyy E + dd.MM.yyyy E - dd.MM.yyyy E + dd.MM.yyyy E - dd.MM.yyyy E + + + MMM-MMM y + MMM y - MMM y + + + dd MMM y E - dd MMM y E + dd MMM y E - dd MMM y E + dd MMM y E - dd MMM y E + + + MM – MM yyyy + MM-yyyy – MM-yyyy + + + dd MMM - dd MMM y + dd-dd MMM y + dd MMM y - dd MMM y + + + dd.MM.yyyy - dd.MM.yyyy + dd.MM.yyyy - dd.MM.yyyy + dd.MM.yyyy - dd.MM.yyyy + + + + + + Miladi Dönem + + + Yıl + + + Ay + + + Hafta + + + Gün + Üç gün önce + Evvelsi gün + Dün + Bugün + Yarın + Yarından sonraki gün + Üç gün sonra + + + Haftanın Günü + + + AM/PM + + + Saat + + + Dakika + + + Saniye + + + Saat Dilimi + + + + + + + + Tişri + Heşvan + Şevat + Veadar + İyar + + + + + + + + + Muharrem + Safer + Rebiülevvel + Rebiülahir + Cemaziyelevvel + Cemaziyelahir + Recep + Şaban + Ramazan + Şevval + Zilkade + Zilhicce + + + + + + + + + Ferverdin + Ordibeheşt + Hordad + Şehriver + Azer + Behmen + Esfend + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} Saati + {1} ({0}) + + Bilinmeyen + + + Kabil + + + Tiran + + + Güney Kutbu + + + Dumont D'Urville + + + Viyana + + + Sidney + + + Bakü + + + Brüksel + + + Sofya + + + Bahreyn + + + Kinşasa + + + Zürih + + + Kaşgar + + + Urumçi + + + Çunking + + + Şangay + + + Kosta Rika + + + Noel + + + Lefkoşa + + + Cibuti + + + Kopenhag + + + Dominik + + + Cezayir + + + Kahire + + + El Ayun + + + Kanarya Adaları + + + Septe + + + Londra + + + Tiflis + + + Cebelitarık + + + Atina + + + Güney Gürcistan + + + Budapeşte + + + Cakarta + + + Kudüs + + + Bağdat + + + Tahran + + + Roma + + + Jameika + + + Bişkek + + + St. Kitts + + + Seul + + + Kuveyt + + + Kayman + + + Aktav + + + Uralsk + + + Aktöbe + + + Kızılorda + + + Almatı + + + Beyrut + + + St. Lucia + + + Kolombo + + + Lüksemburg + + + Trablus + + + Kazablanka + + + Monako + + + Kobdo + + + Ulan Batur + + + Çoybalsan + + + Makau + + + Martinik + + + Moritus + + + Maldivler + + + Meksiko City + + + Kuçing + + + Nauru Adası + + + Markiz Adaları + + + Karaçi + + + Varşova + + + Pitcairn Adaları + + + Porto Riko + + + Gazze + + + Azor Adaları + + + Lizbon + + + Katar + + + Reunion Adası + + + Bükreş + + + Moskova + + + İrkutsk + + + Sahalin + + + Kamçatka + + + Anadır + + + Riyad + + + Kartum + + + Stokholm + + + Singapur + + + Salvador + + + Şam + + + Duşanbe + + + Aşkabat + + + Tunus + + + İstanbul + + + İspanya Limanı + + + Ujgorod + + + Akmescit + + + Zaporojye + + + New Salem, Kuzey Dakota + + + Merkez, Kuzey Dakota + + + Knox + + + Marengo + + + Semerkand + + + Taşkent + + + St. Vincent + + + St. Thomas + + + Saygon + + + Mayote + + + + Acre Saati + Acre Yaz Saati + + + + + Afganistan Saati + + + + + Orta Afrika Saati + + + + + Doğu Afrika Saati + + + + + Güney Afrika Saati + Güney Afrika Standart Saati + + + + + Batı Afrika Saati + Batı Afrika Yaz Saati + + + + + Aktyubinsk Saati + Aktyubinsk Yaz Saati + + + + + Alaska Saati + Alaska Standart Saati + Alaska Yaz Saati + + + AKT + + + + + Alaska-Hawaii Saati + Alaska-Hawaii Standart Saati + Alaska-Hawaii Yaz Saati + + + AHT + + + + + Almatı Saati + Almatı Yaz Saati + + + + + Amazon Saati + Amazon Yaz Saati + + + + + Merkezi Saat + Merkezi Standart Saati + Merkezi Yaz Saati + + + CT + + + + + Doğu Saati + Doğu Standart Saati + Doğu Yaz Saati + + + ET + + + + + ABD Sıradağlar Saati + ABD Sıradağlar Standart Saati + ABD Sıradağlar Yaz Saati + + + MT + + + + + Pasifik Saati + Pasifik Standart Saati + Pasifik Yaz Saati + + + PT + + + + + Anadır Saati + Anadır Yaz Saati + + + + + Aktav Saati + Aktav Yaz Saati + + + AQTT (Aktav) + AQTST (Aktav) + + + + + Aktöbe Saati + Aktöbe Yaz Saati + + + AQTT (Aktöbe) + AQTST (Aktöbe) + + + + + Arabistan Saati + Arabistan Standart Saati + Arabistan Yaz Saati + + + AT (Arabistan) + AST (Arabistan) + ADT (Arabistan) + + + + + Arjantin Saati + Arjantin Yaz Saati + + + + + Batı Arjantin Saati + + + + + Ermenistan Saati + Ermenistan Yaz Saati + + + AMT (Ermenistan) + AMST (Ermenistan) + + + + + Aşkabat Saati + Aşkabat Yaz Saati + + + + + Atlantik Saati + Atlantik Standart Saati + Atlantik Yaz Saati + + + AT + + + + + Orta Avustralya Saati + Orta Avustralya Standart Saati + Orta Avustralya Yaz Saati + + + ACT + + + + + Batı Merkezi Avustralya Saati + Batı Merkezi Avustralya Standart Saati + Batı Merkezi Avustralya Yaz Saati + + + ACWT + + + + + Doğu Avustralya Saati + Doğu Avustralya Standart Saati + Doğu Avustralya Yaz Saati + + + AET + + + + + Batı Avustralya Saati + Batı Avustralya Standart Saati + Batı Avustralya Yaz Saati + + + AWT + + + + + Azerbaycan Saati + Azerbaycan Yaz Saati + + + + + Azor Adaları Saati + Azor Adaları Yaz Saati + + + + + Bakü Saati + Bakü Yaz Saati + + + + + Bangladeş Saati + + + + + Bering Saati + Bering Standart Saati + Bering Yaz Saati + + + BT (Bering) + + + + + Bhutan Saati + + + + + Bolivya Saati + + + + + Borneo Saati + Borneo Yaz Saati + + + + + Brasilia Saati + Brasilia Yaz Saati + + + + + Brunei Saati + + + + + Cape Verde Saati + Cape Verde Yaz Saati + + + + + Chamorro Saati + Chamorro Standart Saati + + + ChT + + + + + Changbai Saati + + + + + Chatham Standart Saati + Chatham Yaz Saati + + + + + Şili Saati + Şili Yaz Saati + + + + + Çin Saati + Çin Standart Saati + Çin Yaz Saati + + + CT (Çin) + CST (Çin) + CDT (Çin) + + + + + Çoybalsan Saati + Çoybalsan Yaz Saati + + + + + Christmas Adası Saati + + + + + Cocos Adaları Saati + + + + + Kolombiya Saati + Kolombiya Yaz Saati + + + + + Cook Adaları Saati + Cook Adaları Yarı Yaz Saati + + + + + Küba Saati + Küba Standart Saati + Küba Yaz Saati + + + CST (Küba) + CDT (Küba) + + + + + Dakka Saati + + + + + Davis Saati + + + + + Dumont-d'Urville Saati + + + + + Duşanbe Saati + Duşanbe Yaz Saati + + + + + Hollanda Guyanası Saati + + + + + Doğu Timor Saati + + + + + Easter Adası Saati + Easter Adası Yaz Saati + + + + + Ekvador Saati + + + + + Orta Avrupa Saati + Orta Avrupa Yaz Saati + + + + + Doğu Avrupa Saati + Doğu Avrupa Yaz Saati + + + + + Batı Avrupa Saati + Batı Avrupa Yaz Saati + + + + + Falkland Adaları Saati + Falkland Adaları Yaz Saati + + + + + Fiji Saati + Fiji Yaz Saati + + + + + Fransız Guyanası Saati + + + + + Fransız Güney ve Antarktika Saati + + + + + Bişkek Saati + Bişkek Yaz Saati + + + + + Greenwich Merkez Saati + + + + + Galapagos Saati + + + + + Gambier Saati + + + + + Gürcistan Saati + Gürcistan Yaz Saati + + + + + Gilbert Adaları Saati + + + + + Orta Grönland Saati + Orta Grönland Yaz Saati + + + + + Doğu Grönland Saati + Doğu Grönland Yaz Saati + + + + + Batı Grönland Saati + Batı Grönland Yaz Saati + + + + + Guam Standart Saati + + + GST (Guam) + + + + + Körfez Saati + Körfez Standart Saati + + + GT + + + + + Guyana Saati + + + + + Hawaii-Aleutian Standart Saati + + + + + Hong Kong Saati + Hong Kong Yaz Saati + + + + + Kobdo Saati + Kobdo Yaz Saati + + + + + Hindistan Standart Saati + + + + + Hint Okyanusu Saati + + + + + Çinhindi Saati + + + + + Orta Endonezya Saati + + + + + Doğu Endonezya Saati + + + + + Batı Endonezya Saati + + + + + İran Standart Saati + İran Yaz Saati + + + + + İrkutsk Saati + İrkutsk Yaz Saati + + + + + İsrail Saati + İsrail Standart Saati + İsrail Yaz Saati + + + IST (İsrail) + + + + + Japonya Saati + Japonya Standart Saati + Japonya Yaz Saati + + + JT + + + + + Petropavlovsk-Kamçatski Saati + Petropavlovsk-Kamçatski Yaz Saati + + + + + Karaçi Saati + + + + + Kaşgar Saati + + + + + Doğu Kazakistan Saati + Doğu Kazakistan Standart Saati + + + + + Batı Kazakistan Saati + Batı Kazakistan Standart Saati + + + + + Kızılorda Saati + Kızılorda Yaz Saati + + + + + Kore Saati + Kore Standart Saati + Kore Yaz Saati + + + KT + + + + + Kosrae Saati + + + + + Krasnoyarsk Saati + Krasnoyarsk Yaz Saati + + + + + Kuybişev Saati + Kuybişev Yaz Saati + + + + + Kwajalein Saati + + + + + Kırgızistan Saati + + + + + Lanka Saati + + + + + Line Adaları Saati + + + + + Long-Shu Saati + + + + + Lord Howe Saati + Lord Howe Standart Saati + Lord Howe Yaz Saati + + + LHT + + + + + Makao Saati + Makao Yaz Saati + + + + + Magadan Saati + Magadan Yaz Saati + + + + + Malaya Saati + + + + + Malezya Saati + + + + + Maldivler Saati + + + + + Markiz Adaları Saati + + + + + Marshall Adaları Saati + + + + + Mauritius Saati + Mauritius Yaz Saati + + + + + Mawson Saati + + + + + Ulan Batur Saati + Ulan Batur Yaz Saati + + + + + Moskova Saati + Moskova Standart Saati + Moskova Yaz Saati + + + + + Myanmar Saati + + + + + Nauru Saati + + + + + Nepal Saati + + + + + Yeni Kaledonya Saati + Yeni Kaledonya Yaz Saati + + + + + Yeni Zelanda Saati + Yeni Zelanda Standart Saati + Yeni Zelanda Yaz Saati + + + NZT + + + + + Newfoundland Saati + Newfoundland Standart Saati + Newfoundland Yaz Saati + + + NT + + + + + Niue Saati + + + + + Norfolk Adası Saati + + + + + Fernando de Noronha Saati + Fernando de Noronha Yaz Saati + + + + + Kuzey Mariana Adaları Saati + + + + + Novosibirsk Saati + Novosibirsk Yaz Saati + + + + + Omsk Saati + Omsk Yaz Saati + + + + + Pakistan Saati + Pakistan Yaz Saati + + + + + Palau Saati + + + + + Papua Yeni Gine Saati + + + + + Paraguay Saati + Paraguay Yaz Saati + + + + + Peru Saati + Peru Yaz Saati + + + + + Filipinler Saati + Filipinler Yaz Saati + + + + + Phoenix Adaları Saati + + + + + Pierre ve Miquelon Saati + Pierre ve Miquelon Standart Saati + Pierre ve Miquelon Yaz Saati + + + PMT + + + + + Pitcairn Saati + + + + + Ponape Saati + + + + + Kızılorda Saati + Kızılorda Yaz Saati + + + + + Reunion Saati + + + + + Rothera Saati + + + + + Sakhalin Saati + Sakhalin Yaz Saati + + + + + Samara Saati + Samara Yaz Saati + + + + + Semerkand Saati + Semerkand Yaz Saati + + + SAMT (Semerkand) + SAMST (Semerkand) + + + + + Samoa Standart Saati + + + + + Seyşel Adaları Saati + + + + + Şevçenko Saati + Şevçenko Yaz Saati + + + + + Singapur Standart Saati + + + + + Solomon Adaları Saati + + + + + Güney Georgia Saati + + + GST (Güney Georgia) + + + + + Surinam Saati + + + + + Sverdlovsk Saati + Sverdlovsk Yaz Saati + + + + + Showa Saati + + + + + Tahiti Saati + + + + + Tacikistan Saati + + + + + Taşkent Saati + Taşkent Yaz Saati + + + + + Tiflis Saati + Tiflis Yaz Saati + + + + + Tokelau Saati + + + + + Tonga Saati + Tonga Yaz Saati + + + + + Truk Saati + + + + + Türkiye Saati + Türkiye Yaz Saati + + + + + Türkmenistan Saati + Türkmenistan Yaz Saati + + + + + Tuvalu Saati + + + + + Oral Saati + Oral Yaz Saati + + + + + Uruguay Saati + Uruguay Yaz Saati + + + + + Urumçi Saati + + + + + Özbekistan Saati + Özbekistan Yaz Saati + + + + + Vanuatu Saati + Vanuatu Yaz Saati + + + + + Venezuela Saati + + + + + Vladivostok Saati + Vladivostok Yaz Saati + + + + + Volgograd Saati + Volgograd Yaz Saati + + + + + Vostok Saati + + + + + Wake Adası Saati + + + + + Wallis ve Futuna Saati + + + + + Yakutsk Saati + Yakutsk Yaz Saati + + + + + Yekaterinburg Saati + Yekaterinburg Yaz Saati + + + + + Erivan Saati + Erivan Yaz Saati + + + + + Yukon Saati + Yukon Standart Saati + Yukon Yaz Saati + + + YT + + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + % #,##0 + + + + + + + #,##0.00 ¤ + + + {0} {1} + + + + Andorra Pezetası + + + Birleşik Arap Emirlikleri Dirhemi + + + Afganistan Afganisi (1927-2002) + + + Afganistan Afganisi + + + Arnavutluk Leki + + + Ermenistan Dramı + + + Hollanda Antilleri Guldeni + + + Angola Kvanzası + + + Angola Kvanzası (1977-1990) + + + Yeni Angola Kvanzası (1990-2000) + + + Angola Kvanzası Reajustado (1995-1999) + + + Arjantin Australi + + + Arjantin Pezosu (1983-1985) + + + Arjantin Pezosu + + + Avusturya Şilini + + + Avustralya Doları + + + Aruba Florini + + + Azerbaycan Manatı (1993-2006) + + + Azerbaycan Manatı + + + Bosna Hersek Dinarı + + + Konvertibl Bosna Hersek Markı + + + Barbados Doları + + + Bangladeş Takası + + + Belçika Frangı (konvertibl) + + + Belçika Frangı + + + Belçika Frangı (finansal) + + + Bulgar Levası (Hard) + + + Yeni Bulgar Levası + + + Bahreyn Dinarı + + + Burundi Frangı + + + Bermuda Doları + + + Brunei Doları + + + Bolivya Bolivyanosu + + + Bolivya Pezosu + + + Bolivya Mvdolu + + + Yeni Brezilya Kruzeirosu (1967-1986) + + + Brezilya Kruzadosu + + + Brezilya Kruzeirosu (1990-1993) + + + Brezilya Reali + + + Yeni Brezilya Kruzadosu + + + Brezilya Kruzeirosu + + + Bahama Doları + + + Bhutan Ngultrumu + + + Burma Kyatı + + + Botsvana Pulası + + + Yeni Beyaz Rusya Rublesi (1994-1999) + + + Beyaz Rusya Rublesi + + + Belize Doları + + + Kanada Doları + + + Kongo Frangı + + + WIR Avrosu + + + İsviçre Frangı + + + WIR Frangı + + + Şili Unidades de Fomento + + + Şili Pezosu + + + Çin Yuanı Renminbi + + + Kolombiya Pezosu + + + Unidad de Valor Real + + + Kosta Rika Kolonu + + + Eski Sırbistan Dinarı + + + Çekoslavak Korunası (Hard) + + + Küba Pezosu + + + Cape Verde Esküdosu + + + Güney Kıbrıs Lirası + + + Çek Cumhuriyeti Korunası + + + Doğu Alman Markı + + + Alman Markı + + + Cibuti Frangı + + + Danimarka Kronu + + + Dominik Pezosu + + + Cezayir Dinarı + + + Ekvador Sukresi + + + Ekvador Unidad de Valor Constante (UVC) + + + Estonya Krunu + + + Mısır Lirası + + + Eritre Nakfası + + + İspanyol Pezetası (A hesabı) + + + İspanyol Pezetası (konvertibl hesap) + + + İspanyol Pezetası + + + Etiyopya Birri + + + Euro + + + Fin Markkası + + + Fiji Doları + + + Falkland Adaları Lirası + + + Fransız Frangı + + + İngiliz Sterlini + + + Gürcistan Kupon Larisi + + + Gürcistan Larisi + + + Gana Sedisi (1979-2007) + + + Gana Sedisi + + + Cebelitarık Lirası + + + Gambiya Dalasisi + + + Gine Frangı + + + Gine Sylisi + + + Ekvator Ginesi Ekuelesi + + + Yunan Drahmisi + + + Guatemala Ketzali + + + Portekiz Ginesi Esküdosu + + + Gine-Bissau Pezosu + + + Guyana Doları + + + Hong Kong Doları + + + Honduras Lempirası + + + Hırvatistan Dinarı + + + Hırvatistan Kunası + + + Haiti Gurdu + + + Macar Forinti + + + Endonezya Rupiahı + + + İrlanda Lirası + + + İsrail Lirası + + + Yeni İsrail Şekeli + + + Hindistan Rupisi + + + Irak Dinarı + + + İran Riyali + + + İzlanda Kronu + + + İtalyan Lireti + + + Jamaika Doları + + + Ürdün Dinarı + + + Japon Yeni + ¥ + + + Kenya Şilini + + + Kırgız Somu + + + Kamboçya Rieli + + + Komorlar Frangı + + + Kuzey Kore Wonu + + + Güney Kore Wonu + + + Kuveyt Dinarı + + + Cayman Adaları Doları + + + Kazakistan Tengesi + + + Laos Kipi + + + Lübnan Lirası + + + Sri Lanka Rupisi + + + Liberya Doları + + + Lesotho Lotisi + + + Litvanya Litası + + + Litvanya Talonu + + + Konvertibl Lüksemburg Frangı + + + Lüksemburg Frangı + + + Finansal Lüksemburg Frangı + + + Letonya Latı + + + Letonya Rublesi + + + Libya Dinarı + + + Fas Dirhemi + + + Fas Frangı + + + Moldova Leyi + + + Madagaskar Ariarisi + + + Madagaskar Frangı + + + Makedonya Dinarı + + + Mali Frangı + + + Myanmar Kyatı + + + Moğol Tugriki + + + Makao Patacası + + + Moritanya Ouguiyası + + + Malta Lirası + + + Malta Sterlini + + + Mauritius Rupisi + + + Maldiv Adaları Rufiyaa + + + Malavi Kvaçası + + + Meksika Pezosu + + + Gümüş Meksika Pezosu (1861-1992) + + + Meksika Unidad de Inversion (UDI) + + + Malezya Ringiti + + + Mozambik Esküdosu + + + Eski Mozambik Metikali + + + Mozambik Metikali + + + Namibya Doları + + + Nijerya Nairası + + + Nikaragua Kordobası + + + Nikaragua Kordobası (Oro) + + + Hollanda Florini + + + Norveç Kronu + + + Nepal Rupisi + + + Yeni Zelanda Doları + + + Umman Riyali + + + Panama Balboası + + + Peru İnti + + + Yeni Peru Solu + + + Peru Solu + + + Papua Yeni Gine Kinası + + + Filipinler Pezosu + + + Pakistan Rupisi + + + Polonya Zlotisi + + + Polonya Zlotisi (1950-1995) + + + Portekiz Esküdosu + + + Paraguay Guaranisi + + + Katar Riyali + + + Rodezya Doları + + + Eski Romen Leyi + + + Romen Leyi + + + Sırp Dinarı + + + Rus Rublesi + + + Rus Rublesi (1991-1998) + + + Ruanda Frangı + + + Suudi Arabistan Riyali + + + Solomon Adaları Doları + + + Seyşel Rupisi + + + Eski Sudan Dinarı + + + Sudan Lirası + + + Eski Sudan Lirası + + + İsveç Kronu + + + Singapur Doları + + + Saint Helena Lirası + + + Slovenya Toları + + + Slovak Korunası + + + Sierra Leone Leonesi + + + Somali Şilini + + + Surinam Doları + + + Surinam Guldeni + + + Sao Tome ve Principe Dobrası + + + Sovyet Rublesi + + + El Salvador Kolonu + + + Suriye Lirası + + + Svaziland Lilangenisi + + + Tayland Bahtı + + + Tacikistan Rublesi + + + Tacikistan Somonisi + + + Türkmenistan Manatı + + + Tunus Dinarı + + + Tonga Paʻangası + + + Timor Esküdosu + + + Eski Türk Lirası + + + Türk Lirası + + + Trinidad ve Tobago Doları + + + Yeni Tayvan Doları + + + Tanzanya Şilini + + + Ukrayna Grivnası + + + Ukrayna Karbovanetz + + + Uganda Şilini (1966-1987) + + + Uganda Şilini + + + ABD Doları + $ + + + ABD Doları (Ertesi gün) + + + ABD Doları (Aynı gün) + + + Uruguay Peso en Unidades Indexadas + + + Uruguay Pezosu (1975-1993) + + + Uruguay Pezosu (Uruguayo) + + + Özbekistan Somu + + + Venezuela Bolivarı + + + Güçlü Venezuela Bolivarı + + + Vietnam Dongu + + + Vanuatu Vatusu + + + Batı Samoa Talası + + + CFA Frangı BEAC + + + Gümüş + + + Altın + + + Birleşik Avrupa Birimi + + + Avrupa Para Birimi (EMU) + + + Avrupa Hesap Birimi (XBC) + + + Avrupa Hesap Birimi (XBD) + + + Doğu Karayip Doları + + + Özel Çekme Hakkı (SDR) + + + Avrupa Para Birimi + + + Fransız Altın Frangı + + + Fransız UIC-Frangı + + + CFA Frangı BCEAO + + + Paladyum + + + CFP Frangı + + + Platin + + + RINET Fonları + + + Test Para Birimi Kodu + + + Bilinmeyen veya Geçersiz Para Birimi + + + Yemen Dinarı + + + Yemen Riyali + + + Yugoslav Dinarı (Hard) + + + Yeni Yugoslav Dinarı + + + Konvertibl Yugoslav Dinarı + + + Güney Afrika Randı (finansal) + + + Güney Afrika Randı + + + Zambiya Kvaçası + + + Yeni Zaire Zairesi + + + Zaire Zairesi + + + Zimbabve Doları + + + + + + {0} gün + + + {0} saat + + + {0} dakika + + + {0} ay + + + {0} saniye + + + {0} hafta + + + {0} yıl + + + + + evet:e + hayır:hayir:h + + + + diff --git a/lib/zend/Zend/Locale/Data/tr_TR.xml b/lib/zend/Zend/Locale/Data/tr_TR.xml new file mode 100644 index 0000000000..6f878c7d4e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tr_TR.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/trv.xml b/lib/zend/Zend/Locale/Data/trv.xml new file mode 100644 index 0000000000..ed9e198f5e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/trv.xml @@ -0,0 +1,561 @@ + + + + + + + + + + + patas Monchiara + patas Towjih + patas Ingrisi + patas Espanniu + patas Bosey + patas Heyti + patas Itariya + patas Nihong + patas Bowdu + patas Pajey + patas Ruski + patas Srpian + Ini klayna patas ni + patas Yurtu + patas Ipaw + Qantan Ipaw patas + Baday Ipaw patas + + + + + + + + + + + + alang Nanci + alang Posniya + alang Pajey + alang Puwei + alang Switjrrant + alang Ipaw + alang Towjih + alang Posey + alang Inglis + alang Nanjiouya ni Nansanminji + alang Htee ni Mayktan + alang Krowtia + alang Intu + alang Inglis niq Intu + alang Itariya + alang Nihong + alang Mondineygrw + alang Srbia + alang Ruski + alang Snmarinow + alang Posey niq Nan + alang Amarika + ini klayi na alang ni + + + Jiyax Yisu Thulang + + + Snyunaydi + Snamrika + + + Kari: {0} + Patas: {0} + Alang: {0} + + + + [a-e g-n {ng} o-u w-y] + [ḏ f ɨ ḻ ṟ ṯ ʉ v z ʼ] + [a-z] + + + “ + ” + ‘ + ’ + + + + + + + + Kii + Dhi + Tri + Spi + Rii + Mti + Emi + Mai + Mni + Mxi + Mxk + Mxd + + + Kingal idas + Dha idas + Tru idas + Spat idas + Rima idas + Mataru idas + Empitu idas + Maspat idas + Mngari idas + Maxal idas + Maxal kingal idas + Maxal dha idas + + + + + K + D + T + S + R + M + E + P + A + M + K + D + + + + + + + Emp + Kin + Dha + Tru + Spa + Rim + Mat + + + Jiyax sngayan + tgKingal jiyax iyax sngayan + tgDha jiyax iyax sngayan + tgTru jiyax iyax sngayan + tgSpac jiyax iyax sngayan + tgRima jiyax iyax sngayan + tgMataru jiyax iyax sngayan + + + + + E + K + D + T + S + R + M + + + + + + + mn1 + mn2 + mn3 + mn4 + + + mnprxan + mndha + mntru + mnspat + + + + + 1 + 2 + 3 + 4 + + + + Brax kndaax + Baubau kndaax + + + Brah jikan Yisu Thulang + Bukuy jikan Yisu Thulang + + + BRY + BUY + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yyyy-MM-dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + H:mm + L + E, M-d + LLL + E MMM d + E MMMM d + MMMM d + MMM d + M-d + d + mm:ss + y + yyyy-M + EEE, yyyy-M-d + y MMM + EEE, y MMM d + y MMMM + yyyy Q + y QQQ + + + + + Hngkawas + + + hngkawas + + + Idas + + + Jiyax iyax sngayan + + + Jiyax + Shiga + Jiyax sayang + Saman + + + Jiyax quri jiyax iyax sngayan + + + Jikan + + + Tuki + + + Spngan + + + Seykn + + + Alang + + + + + + +HH:mm;-HH:mm + JQG{0} + Jikan {0} + + Ini klayi ka Jikan hini + + + Jikan alang Purank + + + Jikan alang Grad + + + Jikan alang Snpaurow + + + Jikan alang Honoruru + + + Jikan alang Ankriji + + + Jikan alang Rosanci + + + Jikan alang Bonhuan + + + Jikan alang Tanbo + + + Jikan alang Jiciak + + + Jikan alang Intiannaporis + + + Jikan alang Niuyue + + + + Jikan Con-Amarika + Snegun Jikan Con-Amarika + Jikan Con-Amarika o Karat Rbagan + + + JCA + SJCA + JCAKR + + + + + Jikan Ton-Amarika + Snegun Jikan Ton-Amarika + Jikan Ton-Amarika o Karat Rbagan + + + JTA + SJTA + JTAKR + + + + + Jikan Yama-Amarika + Snegun Jikan Yama-Amarika + Jikan Hidaw niq Yama-Amarika + + + JYA + SJYA + JHYA + + + + + Jikan Daybinyan + Snegun Jikan Amarika-Daybinyan + Jikan Amarika-Daybinyan o Karat Rbagan + + + JD + SJAD + JADKR + + + + + Jikan Yayun Tasiyan + Snegun Jikan Yayun Tasiyan + Jikan Yayun Tasiyan o Karat Rbagan + + + JYT + SJYT + JYTKR + + + + + Jikan Conow + Jikan Conow o Karat Rbagan + + + JC + JCKR + + + + + Jikan Tonow + Jikan Tonow o Karat Rbagan + + + JT + JTKR + + + + + Jikan Siow + Jikan Siow o Karat Rbagan + + + JS + JSKR + + + + + Jikan Quri Grinweyji + + + JQG + + + + + + + . + , + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤ #,##0.00 + + + + + + pila Autaria + + + pila Pajey + + + pila Ipaw + + + pila Irow + + + pila Inglis + + + pila Hong Kong + + + pila Intia + + + pila Nihong + + + pila Macao + + + pila Nowey + + + pila Ruski + + + pila Taiwan + + + pila America + + + ini klayi pila ni + + + + + + {0} Jiyax + + + {0} Tuki + + + {0} spngan + + + {0} Idas + + + {0} Seykn + + + {0} Jiyax iyax sngayan + + + {0} Hnkawas + + + + + yiru:y + mnan:m + + + diff --git a/lib/zend/Zend/Locale/Data/trv_TW.xml b/lib/zend/Zend/Locale/Data/trv_TW.xml new file mode 100644 index 0000000000..7836d78a52 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/trv_TW.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ts.xml b/lib/zend/Zend/Locale/Data/ts.xml new file mode 100644 index 0000000000..1d48935e02 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ts.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + Xi Czech + Xi Danish + Xi Jarimani + Xi Giriki + Xi Nghezi + Xi spain + hi xi Estonia + Xi Finnish + Xi Furwa + XiHeberu + hi xi Hungary + hi xi Iceland + Xi Ithali + Xi Japani + Xikorea + hi xi Lithuania + hi xi Latvia + Xi bunu + Xi Norway + Xi Polixi + Putukezi + hi xi Romania + Xi Rhaxiya + Xi Swiden + Xitsonga + + + + [a-z] + + + ‘ + ’ + “ + ” + + + + + + + + Sun + Yan + Kul + Dzi + Mud + Kho + Maw + Mha + Ndz + Nhl + Huk + N'w + + + Sunguti + Nyenyenyani + Nyenyankulu + Dzivamisoko + Mudyaxihi + Khotavuxika + Mawuwani + Mhawuri + Ndzhati + Nhlangula + Hukuri + N'wendzamhala + + + + + + + Son + Mus + Bir + Har + Ne + Tlh + Mug + + + Sonto + Musumbhunuku + Ravumbirhi + Ravunharhu + Ravumune + Ravuntlhanu + Mugqivela + + + + + + + K1 + K2 + K3 + K4 + + + Kotara yo sungula + Kotara ya vumbirhi + Kotara ya vunharhu + Kotara ya vumune + + + + + + BC + AD + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/ts_ZA.xml b/lib/zend/Zend/Locale/Data/ts_ZA.xml new file mode 100644 index 0000000000..6eb5fe0464 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ts_ZA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/tt.xml b/lib/zend/Zend/Locale/Data/tt.xml new file mode 100644 index 0000000000..2dea27b5f4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tt.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + Татар + + + Россия + + + + [а ә б-е ё ж җ з-о ө п-у ү ф х һ ц-я] + + + + + + + + d MMMM y + + + + + d MMMM y + + + + + dd.MM.yyyy + + + + + dd.MM.yyyy + + + + + + + h:mm:ss a zzzz + + + + + H:mm:ss z + + + + + H:mm:ss + + + + + H:mm + + + + + + H:mm + d MMMM + dd.MM + mm:ss + Q yy + MM.yyyy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + , +   + + + + + #,##0.00¤ + + + + + + р. + + + + diff --git a/lib/zend/Zend/Locale/Data/tt_RU.xml b/lib/zend/Zend/Locale/Data/tt_RU.xml new file mode 100644 index 0000000000..d4b9f529c4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/tt_RU.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ug.xml b/lib/zend/Zend/Locale/Data/ug.xml new file mode 100644 index 0000000000..1ce574773d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ug.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + Uyghur + + + + + + + [ئ-ب پ ت ج چ خ د ر ز ژ س ش غ ف-ك ڭ گ ل-ه ە و ۆ-ۈ ۋ ى ي ې] + + + + + + + Q yy + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + diff --git a/lib/zend/Zend/Locale/Data/ug_Arab.xml b/lib/zend/Zend/Locale/Data/ug_Arab.xml new file mode 100644 index 0000000000..04da313687 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ug_Arab.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Світ + Африка + Північноамериканський континент + Південна Америка + Океанія + Західна Африка + Центральна Америка + Східна Африка + Північна Африка + Центральна Африка + Південна Африка + Америки + Північна Америка + Карибський басейн + Східна Азія + Південна Азія + Південно-Східна Азія + Південна Європа + Австралія та Нова Зеландія + Меланезія + Мікронезійський регіон + Полінезія + Південно-Центральна Азія + Азія + Центральна Азія + Західна Азія + Європа + Східна Європа + Північна Європа + Західна Європа + Співдружність Незалежних Держав + Латинська Америка і Карибський басейн + Нормандські острови + Андорра + Обʼєднані Арабські Емірати + Афганістан + Антигуа і Барбуда + Ангілья + Албанія + Вірменія + Нідерландські Антильські Острови + Ангола + Антарктида + Аргентина + Американське Самоа + Австрія + Австралія + Аруба + Аландські острови + Азербайджан + Боснія і Герцоговина + Барбадос + Бангладеш + Бельгія + Буркіна-Фасо + Болгарія + Бахрейн + Бурунді + Бенін + Острів Святого Бартоломея + Бермуди + Бруней + Болівія + Бразилія + Багами + Бутан + Острів Буве + Ботсвана + Білорусь + Беліз + Канада + Кокосові острови + Демократична Республіка Конґо + Центральноафриканська Республіка + Конґо - Браззавіль + Швейцарія + Кот д’Івуар + Острови Кука + Чилі + Камерун + Китай + Колумбія + Коста-Рика + Сербія та Чорногорія + Куба + Кабо-Верде + Острів Різдва + Кіпр + Чеська республіка + Німеччина + Джібуті + Данія + Домінік + Домініканська Республіка + Алжир + Еквадор + Естонія + Єгипет + Західна Сахара + Еритрея + Іспанія + Ефіопія + Фінляндія + Фіджі + Фолклендські острови + Мікронезія + Фарерські острови + Франція + Габон + Великобританія + Гренада + Грузія + Французька Гвіана + Гернсі + Гана + Гібралтар + Гренландія + Гамбія + Гвінея + Гваделупа + Екваторіальна Гвінея + Греція + Південна Джорджія та Південні Сандвічеві Острови + Гватемала + Гуам + Гвінея-Біссау + Гайана + Гонконґ О.А.Р. Китаю + Острови Херд і Мак-Дональд + Гондурас + Хорватія + Гаїті + Угорщина + Індонезія + Ірландія + Ізраїль + Острів Мен + Індія + Британські території Індійського океану + Ірак + Іран + Ісландія + Італія + Джерсі + Ямайка + Йорданія + Японія + Кенія + Киргизстан + Камбоджа + Кірибаті + Коморські Острови + Сент-Кітс і Невіс + Північна Корея + Південна Корея + Кувейт + Кайманові острови + Казахстан + Лаос + Ліван + Сент-Люсія + Ліхтенштейн + Шрі-Ланка + Ліберія + Лесото + Литва + Люксембург + Латвія + Лівія + Марокко + Монако + Молдова + Чорногорія + Острів Святого Мартіна + Мадагаскар + Маршаллові Острови + Македонія + Малі + Мʼянма + Монголія + Макао О.А.Р. Китаю + Північні Маріанські Острови + Мартиніка + Мавританія + Монсеррат + Мальта + Маврикій + Мальдіви + Малаві + Мексика + Малайзія + Мозамбік + Намібія + Нова Каледонія + Нігер + Острів Норфолк + Нігерія + Нікарагуа + Нідерланди + Норвегія + Непал + Науру + Нія + Нова Зеландія + Оман + Панама + Перу + Французька Полінезія + Папуа Нова Гвінея + Філіппіни + Пакистан + Польща + Сен-Пʼєр і Мікелон + Піткерн + Пуерто-Ріко + Палестина + Португалія + Палау + Парагвай + Катар + Інша Океанія + Європейський Союз + Реюньйон + Румунія + Сербія + Росія + Руанда + Саудівська Аравія + Соломонові Острови + Сейшели + Судан + Швеція + Сінгапур + Острів Святої Єлени + Словенія + Острови Свальбард та Ян-Маєн + Словакія + Сьєрра-Леоне + Сан-Марино + Сенегал + Сомалі + Суринам + Сан-Томе і Прінсіпі + Сальвадор + Сирія + Свазіленд + Теркс і Кайкос + Чад + Французькі Південні Території + Того + Таїланд + Таджикистан + Токелау + Східний Тимор + Туркменистан + Туніс + Тонга + Туреччина + Тринідад і Тобаго + Тувалу + Тайвань + Танзанія + Україна + Уганда + Віддалені Острови США + США + Уругвай + Узбекистан + Ватикан + Сент-Вінсент і Гренадини + Венесуела + Віргінські острови Британії + Віргінські острови США + Вʼєтнам + Вануату + Уолліс і Футуна + Самоа + Ємен + Майот + ПАР + Замбія + Зімбабве + Невідомий або неправильний регіон + + + Традиційна німецька орфографія + Стандартизована резьянська орфографія + Нова німецька орфографія з 1996 р. + Пізньосередньофранцузська до 1606 + Східновірменський + Західновірменський + Уніфікований турецький латинський алфавіт + Діалект Сан-Джорджіо/Біла + Бунтлінг + Міжнародний фонетичний алфавіт + Уральський фонетичний алфавіт + Ліповазський діалект резьянської мови + Монотонічний + Натісонський діалект + Діалект Нджіва + Осоянський діалект + Політонічний + Комп'ютерний + Нова орфографія + Резьянський + Сахо + Шотландська англійська + Ліверпульський діалект + Діалект Столвіца/Солбіка + Орфографія Тараскевича + Валенсійська + + + Календар + Сортування + Валюта + + + Китайський традиційний + Буддійський календар + Китайський календар + Прямий порядок + Китайський спрощений + Григоріанський календар + Єврейський календар + Індійський світський календар + Мусульманський календар + Мусульманський світський календар + Японський календар + Телефонна книга + Порядок піньїн + Китайський григоріанський + Порядок натискання клавіш + Традиційний + + + США + Метрична + + + Мова з кодом {0} + Скрипт із кодом {0} + Територія з кодом {0} + + + + titlecase-firstword + lowercase-words + titlecase-firstword + lowercase-words + lowercase-words + lowercase-words + titlecase-firstword + + + [ʼ а-г ґ д е є ж-и і ї й-щ ь ю я] + [i v x] + [a-z] + + + « + » + „ + “ + + + + + + + + Тот + Бабе + Хатур + Кіхак + Тобе + Амшир + Барамхат + Бармуда + Башнас + Бауна + Абіб + Мисра + Насі + + + + + + + + + січ. + лют. + бер. + квіт. + трав. + черв. + лип. + серп. + вер. + жовт. + лист. + груд. + + + січня + лютого + березня + квітня + травня + червня + липня + серпня + вересня + жовтня + листопада + грудня + + + + + Січ + Лют + Бер + Кві + Тра + Чер + Лип + Сер + Вер + Жов + Лис + Гру + + + С + Л + Б + К + Т + Ч + Л + С + В + Ж + Л + Г + + + Січень + Лютий + Березень + Квітень + Травень + Червень + Липень + Серпень + Вересень + Жовтень + Листопад + Грудень + + + + + + + Нд + Пн + Вт + Ср + Чт + Пт + Сб + + + Неділя + Понеділок + Вівторок + Середа + Четвер + Пʼятниця + Субота + + + + + Н + П + В + С + Ч + П + С + + + + + + + I кв. + II кв. + III кв. + IV кв. + + + I квартал + II квартал + III квартал + IV квартал + + + + + 1 + 2 + 3 + 4 + + + + дп + пп + + + до нашої ери + нашої ери + + + до н.е. + н.е. + + + + + + EEEE, d MMMM y 'р'. + + + + + d MMMM y 'р'. + + + + + d MMM y + + + + + dd.MM.yy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + HH:mm + HH:mm:ss + H:mm + LLL + E, d MMM + E, d MMMM + d MMMM + d MMM + dd.MM + d + mm:ss + mm:ss + y + LLL y + EEE, d MMM y + LLLL y + MM.yy + LLL yy + Q yy + LLLL y + QQQQ y 'р'. + + + {0} – {1} + + M–M + + + E, dd.MM – E, dd.MM + E, dd.MM – E, dd.MM + + + LLL–LLL + + + E, d MMM – E, d MMM + E, d – E, d MMM + + + d MMM – d MMM + d–d MMM + + + dd.MM – dd.MM + dd.MM – dd.MM + + + d–d + + + HH–HH + + + HH:mm–HH:mm + HH:mm–HH:mm + + + HH:mm–HH:mm v + HH:mm–HH:mm v + + + HH–HH v + + + y–y + + + MM.yy – MM.yy + MM.yy – MM.yy + + + E, dd.MM.yy – E, dd.MM.yy + E, dd.MM.yy – E, dd.MM.yy + E, dd.MM.yy – E, dd.MM.yy + + + LLL–LLL y + LLL y – LLL y + + + E, d MMM – E, d MMM y + E, d – E, d MMM y + E, d MMM y – E, d MMM y + + + d MMM – d MMM y + d–d MMM y + d MMM y – d MMM y + + + dd.MM.yy – dd.MM.yy + dd.MM.yy – dd.MM.yy + dd.MM.yy – dd.MM.yy + + + + + + Ера + + + Рік + + + Місяць + + + Тиждень + + + День + Три дні тому + Позавчора + Вчора + Сьогодні + Завтра + Післязавтра + Через три дні з цього моменту + + + День тижня + + + Частина доби + + + Година + + + Хвилина + + + Секунда + + + Зона + + + + + + + + Тішри + Марчешван + Числьов + Тебет + Шеват + Адар Ⅰ + Адар + Нісан + Іар + Сиван + Таммуз + Аб + Елул + + + + + Адар I + + + + + + + + + Мухаррам + Сафар + Рабі I + Рабі II + Джумада I + Джумада II + Раджаб + Шаабан + Рамадан + Даввал + Зу-ль-каада + Зу-ль-хіджа + + + + + + + + + Фарвардін + Ордібехешт + Хордад + Тір + Мордад + Шахрівер + Мехр + Абан + Азер + Дей + Бахман + Есфанд + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Невідомо + + + Андора + + + Дубаї + + + Кабул + + + Антигуа + + + Анґілья + + + Тірана + + + Єреван + + + Кюрасао + + + Луанда + + + Ротера + + + Палмер + + + Південний полюс + + + Сьова + + + Моусон + + + Девіс + + + Восток + + + Кейсі + + + Дюмон-д'Юрвіль + + + Мак-Мердо + + + Ріо-Ґалеґос + + + Мендоса + + + Сан-Хуан + + + Ушуая + + + Ла-Ріоха + + + Сан-Луїс + + + Катамарка + + + Сальта + + + Жужуй + + + Тукуман + + + Кордоба + + + Буенос-Айрес + + + Паго Паго + + + Відень + + + Перт + + + Евкла + + + Дарвін + + + Аделаїда + + + Брокен-Гіл + + + Каррі + + + Мельбурн + + + Хобарт + + + Ліндеман + + + Сідней + + + Брисбен + + + Лорд-Хау + + + Аруба + + + Аландські острови + + + Баку + + + Сараєво + + + Барбадос + + + Дака + + + Брюссель + + + Уагадугу + + + Софія + + + Бахрейн + + + Бужумбура + + + Порто-Ново + + + Бермуди + + + Бруней + + + Ла-Пас + + + Ейрунепе + + + Ріо-Бранко + + + Порто-Велью + + + Боа-Віста + + + Манаус + + + Куяба + + + Сантарен + + + Кампу-Гранді + + + Белен + + + Арагуайна + + + Сан-Паулу + + + Байя + + + Форталеза + + + Масейо + + + Ресіфі + + + Норонья + + + Насау + + + Тхімпху + + + Габороне + + + Мінськ + + + Беліз + + + Доусон + + + Вайтгорс + + + Інувік + + + Ванкувер + + + Доусон-Крік + + + Єллоунайф + + + Едмонтон + + + Свіфт-Каррент + + + Кембридж-Бей + + + Реджайна + + + Вінніпеґ + + + Резолют + + + Рейні-Рівер + + + Ренкін-Інлет + + + Корал-Харбор + + + Тандер-Бей + + + Ніпігон + + + Торонто + + + Монреаль + + + Ікалуіт + + + Панґніртунґ + + + Монктон + + + Галіфакс + + + Гуз-Бей + + + Глейс-Бей + + + Бланк-Саблон + + + Сент-Джонс + + + Кокосові острови + + + Кіншаса + + + Лубумбаші + + + Бангі + + + Браззавіль + + + Цюріх + + + Абіджан + + + Раротонга + + + Острів Пасхи + + + Сантьяго + + + Дуала + + + Кашгар + + + Урумчі + + + Чунцин + + + Шанхай + + + Харбін + + + Богота + + + Коста Ріка + + + Гавана + + + Кабо-Верде + + + Острів Різдва + + + Нікосія + + + Прага + + + Берлін + + + Джибуті + + + Копенгаген + + + Домініка + + + Санто-Домінго + + + Алжир + + + Галапагоські острови (Еквадор) + + + Гуаякіль + + + Таллін + + + Каїр + + + Ель-Аюн + + + Асмера + + + Канари + + + Сеута + + + Мадрид + + + Аддис-Абеба + + + Гельсінкі + + + Фіджи + + + Стенлі + + + Трук + + + Понапе + + + Косрае + + + Фарерські острови + + + Париж + + + Лібревіль + + + Лондон + + + Гренада + + + Тбілісі + + + Кайенна + + + Ґернсі + + + Аккра + + + Гібралтар + + + Туле + + + Готхоб + + + Скорсбисун + + + Денмарксхавн + + + Банжул + + + Конакрі + + + Ґваделупа + + + Малабо + + + Афіни + + + Південна Джорджія + + + Гватемала + + + Гуам + + + Бісау + + + Ґайана + + + Гонконг + + + Тегусігальпа + + + Загреб + + + Порт-о-Пренс + + + Будапешт + + + Джакарта + + + Понтіанак + + + Макасар + + + Джайпур + + + Дублін + + + Єрусалим + + + Острів Мен + + + Калькутта + + + Чагос + + + Багдад + + + Тегеран + + + Рейк'явік + + + Рим + + + Джерсі + + + Ямайка + + + Амман + + + Токіо + + + Найробі + + + Бішкек + + + Пномпень + + + Ендербері + + + Кірітіматі + + + Тарава + + + Комори + + + Сент-Кітс і Невіс + + + Пхеньян + + + Сеул + + + Кувейт + + + Кайманові острови + + + Актау + + + Орал + + + Актобе + + + Кзил-Орда + + + Алмати + + + В’єнтьян + + + Бейрут + + + Сент-Лусія + + + Вадуц + + + Коломбо + + + Монровія + + + Масеру + + + Вільнюс + + + Люксембург + + + Рига + + + Тріполі + + + Касабланка + + + Монако + + + Кишинів + + + Подгориця + + + Антананаріву + + + Кваджалейн + + + Маджуро + + + Скоп'є + + + Бамако + + + Рангун + + + Говд + + + Улан-Батор + + + Чойбалсан + + + Макао + + + Сайпан + + + Мартініка + + + Нуакшот + + + Монсерат + + + Мальта + + + Маврикій + + + Мальдіви + + + Блантир + + + Тіхуана + + + Ермосільйо + + + Масатлан + + + Чіуауа + + + Монтерей + + + Мехіко + + + Меріда + + + Канкун + + + Куала-Лумпур + + + Кучінґ + + + Мапуту + + + Віндхук + + + Нумеа + + + Ніамей + + + Норфолк + + + Лагос + + + Манагуа + + + Амстердам + + + Осло + + + Катманду + + + Науру + + + Ніуе + + + Чатем + + + Окленд + + + Маскат + + + Панама + + + Ліма + + + Таїті + + + Маркизькі о-ви + + + Гамбер + + + Порт-Морсбі + + + Маніла + + + Карачі + + + Варшава + + + Мікелон + + + Піткерн + + + Пуерто Ріко + + + Газа + + + Азорські острови + + + Мадейра + + + Лісабон + + + Палау + + + Асунсьйон + + + Катар + + + Реюньйон + + + Бухарест + + + Белград + + + Калінінград + + + Москва + + + Волгоград + + + Самара + + + Єкатеринбург + + + Омськ + + + Новосибірськ + + + Красноярськ + + + Іркутськ + + + Якутськ + + + Владивосток + + + Сахалін + + + Магадан + + + Камчатка + + + Анадир + + + Кігалі + + + Ер-Ріяд + + + Гвадалканал + + + Махе + + + Хартум + + + Стокгольм + + + Сингапур + + + Острів Святої Єлени + + + Любляна + + + Лонгербюйн + + + Братислава + + + Фрітаун + + + Сан-Маріно + + + Дакар + + + Могадішо + + + Парамарібо + + + Сан-Томе і Принсіпі + + + Сальвадор + + + Дамаск + + + Мбабане + + + Гранд-Терк + + + Нджамена + + + Острів Кергелен + + + Ломе + + + Бангкок + + + Душанбе + + + Факаофо + + + Ділі + + + Ашгабат + + + Туніс + + + Тонгатапу + + + Стамбул + + + Порт-оф-Спейн + + + Фунафуті + + + Тайпей + + + Дар-ес-Салаам + + + Ужгород + + + Київ + + + Сімферополь + + + Запоріжжя + + + Кампала + + + Мідуей + + + Джонстон + + + Вейк + + + Адак + + + Ном + + + Гонолулу + + + Анкоридж + + + Якутат + + + Джуно + + + Лос-Анджелес + + + Бойсе + + + Фінікс + + + Шипрок + + + Денвер + + + Нью-Салем + + + Центр + + + Чикаго + + + Меноміні + + + Вінсенс + + + Петербург + + + Телл-сіті + + + Нокс + + + Вінамак + + + Маренго + + + Індіанаполіс + + + Луїсвілль + + + Вівей + + + Монтичелло + + + Детройт + + + Нью-Йорк + + + Монтевідео + + + Самарканд + + + Ташкент + + + Ватикан + + + Сент-Вінсент + + + Каракас + + + Тортола + + + Сент-Томас + + + Сайгон + + + Ефате + + + Уолліс + + + Апіа + + + Аден + + + Майорка + + + Йоганнесбург + + + Лусака + + + Хараре + + + + за центральноафриканським часом + + + + + за східноафриканським часом + + + + + за південноафриканським часом + за південноафриканським стандартним часом + + + + + за західноафриканським часом + за західноафриканським літнім часом + + + + + за північноамериканським центральним часом + за північноамериканським центральним стандартним часом + за північноамериканським центральним літнім часом + + true + + + + за північноамериканським східним часом + за північноамериканським східним стандартним часом + за північноамериканським східним літнім часом + + true + + + + за північноамериканським гірним часом + за північноамериканським гірним стандартним часом + за північноамериканським гірним літнім часом + + true + + + + за північноамериканським тихоокеанським часом + за північноамериканським тихоокеанським стандартним часом + за північноамериканським тихоокеанським літнім часом + + true + + + + за вірменським часом + за вірменським літнім часом + + + + + за атлантичним часом + за атлантичним стандартним часом + за атлантичним літнім часом + + + + + за центральноєвропейським часом + за центральноєвропейським літнім часом + + + + + за східноєвропейським часом + за східноєвропейським літнім часом + + + + + за західноєвропейським часом + за західноєвропейським літнім часом + + + + + за Грінвічем + + true + + + + за іранським стандартним часом + за іранським літнім часом + + + + + за іркутським часом + за іркутським літнім часом + + true + + + + за ізраїльським часом + + + + + за японським часом + за японським літнім часом + + + + + за камчатським часом + за камчатським літнім часом + + true + + + + за красноярським часом + за красноярським літнім часом + + true + + + + за куйбишевським часом + за куйбишевським літнім часом + + + + + за магаданським часом + за магаданським літнім часом + + true + + + + за московським часом + за московським стандартним часом + за московським літнім часом + + true + + + + за новосибірським часом + за новосибірським літнім часом + + + + + за омським часом + за омським літнім часом + + true + + + + за самарським часом + з·а самарським літнім часом + + + + + за турецьким часом + за турецьким літнім часом + + + + + за владивостоцьким часом + за владивостоцьким літнім часом + + true + + + + за волгоградським часом + за волгоградським літнім часом + + + + + за якутським часом + за якутським літнім часом + + true + + + + за єкатеринбурзьким часом + за єкатеринбурзьким літнім часом + + true + + + + + + , +   + ; + % + 0 + # + + + - + ‰ + ∞ + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + {0} {1} + {0} {1} + + + + Андоррська песета + Андоррські песети + Андоррських песет + Андоррських песет + + + Дирхем ОАЕ + + + Афгані (1927-2002) + + + Афгані + Афгані + + + Албанський лек + Албанські леки + Албанських леків + албанських леків + + + Вірменський драм + вірменські драми + Вірменських драмів + Вірменських драмів + + + Гульден Нідерландських Антіл + + + Ангольська кванза + ангольські кванзи + ангольських кванз + ангольської кванзи + + + Ангольська кванза (1977-1990) + Ангольські кванзи (1977-1990) + Ангольських кванз (1977-1990) + Ангольської кванзи (1977-1990) + + + Ангольська нова кванза (1990-2000) + Ангольські нові кванзи (1990-2000) + ангольських нових кванз (1990-2000) + Ангольської нової кванзи (1990-2000) + + + Ангольська кванза реаджастадо (1995-1999) + ангольські кванзи реаджастадо (1995-1999) + ангольських кванз реаджастадо (1995-1999) + ангольська кванза реаджастадо (1995-1999) + ангольської кванзи реаджастадо (1995-1999) + + + Аргентинський австрал + Аргентинські австрали + Аргентинських австралів + + + Аргентинський песо (1983-1985) + + + Аргентинський песо + + + Австрійський шилінг + + + Австралійський долар + + + Арубський гульден + + + Азербайджанський манат (1993-2006) + + + Азербайджанський манат + + + Динар (Боснія і Герцеговина) + + + Конвертована марка Боснії і Герцоговини + + + Барбадоський долар + + + Бангладеська така + + + Бельгійський франк (конвертований) + + + Бельгійський франк + + + Бельгійський франк (фінансовий) + + + Болгарський твердий лев + + + Б‘‘олгарський новий лев + + + Бахрейнський динар + + + Бурундійський франк + + + Бермудський долар + + + Брунейський долар + + + Болівіано + + + Болівійське песо + + + Болівійський мвдол + + + Бразильське нове крузейро (1967-1986) + + + Бразильське крузадо + + + Бразильське крузейро (1990-1993) + + + Бразильський реал + + + Бразильське нове крузадо + + + Бразильське крузейро + + + Багамський долар + + + Бутанський нгултрум + + + Бірманський кіат + + + Ботсванська пула + + + Білоруський новий рубль (1994-1999) + білоруські нові рублі (1994-1999) + білоруських нових рублів (1994-1999) + + + Білоруський рубль + білоруські рублі + білоруських рублів + + + Белізький долар + + + Канадський долар + + + Конголезький франк + + + Євро WIR + + + Швейцарський франк + + + Франк WIR + + + Чилійський юнідадес де фоменто + + + Чілійський песо + + + Китайський юань + + + Колумбійський песо + + + Одиниця реальної вартості + + + Костариканський колон + + + Старий сербський динар + + + Чехословацька тверда крона + + + Кубинський песо + + + Ескудо Кабо-Верде + + + Кіпрський фунт + + + Чеська крона + + + Марка НДР + + + Німецька марка + + + Джибутійський франк + + + Датська крона + + + Домініканський песо + + + Алжирський динар + + + Еквадорський сукре + + + Еквадорський юнідад де валор константе + + + Естонська крона + + + Єгипетський фунт + + + Еритрейська накфа + + + Іспанська песета ("А" рахунок) + + + Іспанська песета (конвертовані рахунки) + + + Іспанська песета + + + Ефіопський бір + + + Євро + євро + євро + євро + + + Фінляндська марка + + + Долар Фіджі + + + Фолклендський фунт + + + Французький франк + + + Англійський фунт стерлінгів + + + Грузинський купон + грузинські купони + грузинських купонів + + + Грузинський ларі + + + Ганський седі (1979-2007) + + + Ганський седі + + + Гібралтарський фунт + + + Гамбійська даласі + + + Гвійнейський франк + + + Гвінейське сілі + + + Еквеле (Екваторіальна Ґвінея) + + + Грецька драхма + + + Гватемальський кетсаль + + + Ескудо Португальської Гвінеї + + + Песо Гвінеї-Бісау + + + Гайянський долар + + + Гонконгівський долар + + + Гондураська лемпіра + + + Хорватський динар + + + Хорватська куна + + + Гаїтянський гурд + + + Угорський форинт + + + Індонезійська рупія + + + Ірландський фунт + + + Ізраїльський фунт + + + Ізраїльський новий шекель + + + Індійська рупія + + + Іракський динар + + + Іранський ріал + + + Ісландська крона + + + Італійська ліра + + + Ямайський долар + + + Йорданський динар + + + Японська єна + ¥ + + + Кенійський шилінг + + + Киргизький сом + + + Камбоджійський рієль + + + Коморський франк + + + Вона Північної Кореї + + + Вона Південної Кореї + + + Кувейтський динар + + + Долар Кайманових островів + + + Казахстанський тенге + + + Лаоський кіп + + + Ліванський фунт + + + Шрі-ланкійська рупія + + + Ліберійський долар + + + Лесотський лоті + + + Литовський літ + + + Литовський талон + + + Люксембурґський франк (Конвертований) + + + Люксембурзький франк + + + Люксембурґський франк (Фінансовий) + + + Латвійський лат + + + Латвійський рубль + + + Лівійський динар + + + Марокканський дирхем + + + Марокканський франк + + + Молдовський лей + + + Мадагаскарський аріарі + + + Мадагаскарський франк + + + Македонський динар + + + Малійський франк + + + Кʼят Мʼянми + + + Монгольський тугрик + + + Макао патака + + + Мавританська угія + + + Мальтійська ліра + + + Мальтійський фунт + + + Маврикійська рупія + + + Мальдівська руфія + + + Квача (Малаві) + + + Мексиканське песо + + + Мексиканське срібне песо (1861-1992) + + + Мексиканський юнідад де інверсіон + + + Малайзійський рингіт + + + Мозамбіцький ескудо + + + Старий мозамбіцький метикал + + + Мозамбіцький метикал + + + Намібійський долар + + + Нігерійська найра + + + Нікарагуанська кордоба + + + Нікарагуанська кордоба оро + + + Нідерландський гульден + + + Норвезька крона + + + Непальська рупія + + + Новозеландський долар + + + Оманський ріал + + + Панамська бальбоа + + + Перуанський інті + + + Перуанський новий сол + + + Перуанський сол + + + Кіна Папуа Нової Гвінеї + + + Філіппінське песо + + + Пакистанська рупія + + + Польський злотий + + + Польський злотий (1950-1995) + + + Португальський ескудо + + + Парагвайський гуарані + + + Катарський ріал + + + Родезійський долар + + + Старий румунський лей + + + Румунський лей + + + Сербський динар + + + Російський рубль + російські рублі + російських рублів + Російський рубль + руб. + + + Російський рубль (1991-1998) + російські рублі (RUR) + російських рублів (RUR) + російський рубль (RUR) + + + Руандійський франк + + + Саудівський ріал + + + Долар Соломонових Островів + + + Сейшельська рупія + + + Суданський динар + + + Суданський фунт + + + Старий суданський фунт + + + Шведська крона + + + Сінгапурський долар + + + Фунт Святої Єлени + + + Словенський толар + + + Словацька крона + + + Леоне Сьєрра-Леоне + + + Сомалійський шилінг + + + Суринамський долар + + + Суринамський гульден + + + Добра Сан-Томе і Прінсіпі + + + Радянський рубль + радянські рублі + радянських рублів + радянський рубль + + + Сальвадорський колон + + + Сирійський фунт + + + Свазілендські лілангені + + + Таїландський бат + + + Таджицький рубль + + + Таджицький сомоні + + + Туркменський манат + + + Туніський динар + + + Паанга Тонго + + + Тіморський ескудо + + + Стара турецька ліра + старі турецькі ліри + старих турецьких лір + стара турецька ліра + + + Турецька ліра + турецькі ліри + турецьких лір + турецька ліра + + + Долар Тринідаду і Тобаго + + + Новий тайванський долар + + + Танзанійський шилінг + + + Українська гривня + гривні + гривень + гривня + гривні + + + Український карбованець + українські карбованці + українських карбованців + український карбованець + українського карбованця + крб. + + + Угандійський шилінг (1966-1987) + + + Угандійський шилінг + + + Долар США + $ + + + Долар США (наступного дня) + + + Долар США (цього дня) + + + Уругвайський песо в індексованих одиницях + + + Уругвайське песо (1975-1993) + + + Уругвайське песо + + + Узбецький сум + + + Венесуельський болівар + + + Венесуельський болівар фуерте + + + Вʼєтнамський донг + + + Вануатська вату + + + Тала Західного Самоа + + + Франк Центральноафриканського фінансового товариства + + + Срібло + + + Золото + + + Європейська складена валютна одиниця + + + Одиниця Європейського валютного фонду + + + Європейська розрахункова одиниця XBC + + + Європейська розрахункова одиниця XBD + + + Східнокарибський долар + + + Спеціальні права запозичення + + + Європейська валютна одиниця + + + Французький золотий франк + + + Французький франк UIC + + + Франк Західноафриканського фінансового товариства + + + Паладій + + + Французький тихоокеанський франк + + + Платина + + + Фонди RINET + + + Код тестування валюти + + + Невідома грошова одиниця + невідомі грошові одиниці + невідомих грошових одиниць + невідома грошова одиниця + + + Єменський динар + + + Єменський ріал + + + Югославський твердий динар + + + Югославський новий динар + + + Югославський конвертований динар + + + Південноафриканський фінансовий ранд + + + Південноафриканський ранд + + + Квача (Замбія) + + + Заїрський новий заїр + + + Заїрський заїр + + + Зімбабвійський долар + + + + + + {0} дні + {0} днів + {0} день + {0} дня + + + {0} години + {0} годин + {0} година + {0} години + + + {0} хвилини + {0} хвилин + {0} хвилина + {0} хвилини + + + {0} місяці + {0} місяців + {0} місяць + {0} місяця + + + {0} секунди + {0} секунд + {0} секунда + {0} секунди + + + {0} тижні + {0} тижнів + {0} тиждень + {0} тижня + + + {0} роки + {0} років + {0} рік + {0} року + + + + + так:т + ні:н + + + + diff --git a/lib/zend/Zend/Locale/Data/uk_UA.xml b/lib/zend/Zend/Locale/Data/uk_UA.xml new file mode 100644 index 0000000000..71b534bd0f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/uk_UA.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/ur.xml b/lib/zend/Zend/Locale/Data/ur.xml new file mode 100644 index 0000000000..93acfb30b4 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ur.xml @@ -0,0 +1,1020 @@ + + + + + + + + + + + ايفريکانز + امہاری + عربی + آسامی + آزربائیجانی + بيلاروسی + بلغاری + بِہاری + بنگالی + برِیٹن + بوسنی + کاٹالانين + چيک + ويلش + ڈينش + جرمن + يونانی + انگريزی + برطانوی انگریزی + امریکہ کی انگریزی + ايسپرانٹو + ہسپانوی + اسٹونين + باسکی + فارسی + فنّنِش + ٹيگالاگی + فیروئیز + فرانسيسی + فريژين + آئيرِش + سکاٹ گيلِک + گاليشيائی + گُارانی + گجراتی + عبرانی + ہندی + کراتی + ہنگیرین + ارمینی + انٹرلنگوی + انڈونيثيائی + برفستانی + اطالوی + جاپانی + جاوی + جارجی + کمبوڈیَن + کنّاڈا + کورين + كردش + کرغیزی + لاطينی + لِنگَلا + لاؤشِیَن + لتھُواینین + ليٹوين + مقدونيائی + مالايالم + منگؤلی + مراٹهی + مالائی + مالٹی + نيپالی + ڈچ + نورویجینی (نینورسک) + نارويجين + آکيٹانی + اورِیا + پنجابی + پولستانی + پشتو + پُرتگالی + پرتگالی (ﺑﺮﺍﺯﻳﻞ) + پرتگالی (پرتگال) + رومنی + روسی + سَنسکرِت + سندھی + سربو-کروئیشین + سنہالی + سلاواکی + سلوينی + سومالی + البانی + صربی + سیسوتھو + سُوڈانی + سويڈش + سواہیلی + تامِل + تيلوگو + تهائی + تگرینی + ترکمانی + ٹیگا لوگ + کلنگان + ترکی + توی + اُئِیگُور + يُوکرينی + اردو + ازبک + ويتنامی + خوسہ + يادش + چینی (آسان کردہ) + چینی (روایتی) + زُولُو + + + + + + + + متحدہ عرب امارات + افغانستان + انٹیگوا اور باربودا + البانیا + آر مینیا + نیدرلینڈز انٹیلیز + انگولا + انٹار ٹکا + ارجنٹینا + امریکی ساموا + آسٹریا + آسٹریلیا + آذر بائجان + بوسنیا ہرزگوینا + بنگلا دیش + بیلجئیم + برکینا فاسو + بلغاریہ + برنڈی + بینن + بولیویا + برازیل + باھا ماس + بھوٹان + جزیرہ بووٹ + بوٹسوانا + بیلا رس + کینیڈا + جزائر کوکوز + کانگو، جمہوری ریاست + جمہوریہ وسطی افریقہ + کانگو + سوئزر لینڈ + جزائر کُک + چلی + کیمرون + چین + کولمبیا + سربیا اور مانٹینیگرو + کیوبا + جزیرہ کرسمس + قبرص + جمہوریہ چیک + جرمنی + ڈنمارک + ڈومینیکن ریپبلک + الجیریا + ایکواڈور + ایسٹونیا + مصر + مغربی صحارا + اریٹیریا + سپین + ایتھوپیا + فن لینڈ + جزائر فاک لینڈ + مائکرونیزیا + جزائرفارو + فرانس + غیبون + برطانیہ + جارجیا + فرانسیسی گی آنا + گرنزی + گھانا + گرین لینڈ + گیمبیا + گنی + استوائی گنی + یونان + جنوبی جارجیا اور جزائر جنوبی سینڈوچ + گنی بسائو + جزیرہ ہرڈ اور جزائر مکڈونلڈ + ہونڈوراس + کروشیا + ہائٹی + ہنگری + انڈونیشیا + آئر لینڈ + اسرائیل + بھارت + بحرھند کا برٹش علاقہ + عراق + ایران + آئس لینڈ + اٹلی + جرسی + اردن + جاپان + کینیا + کرغستان + کمبوڈیا + کِرباتی + کوموروس + سینٹ کٹس اور نیوس + شمالی کوریا + جنوبی کوریا + جزائر کیمن + قزاقستان + لاؤس + لبنان + سینٹ لوسیا + لکٹنسٹائن + سری لنکا + لائبیریا + لیسوتھو + لتھوانیا + لٹوِیا + لیبیا + مراکش + مالدووا + مڈغاسکر + جزائر مارشل + مقدونیہ + مالی + میانمر + منگولیا + ماکاؤ + شمالی ماریاناجزائر + موریطانیہ + ملاوی + میکسیکو + ملائیشیا + موزنبیق + نمیبیا + نیو کیلیڈونیا + نائیجر + جزیرہ نارفولک + نائیجیریا + نکاراگوا + نیدرلینڈ + ناروے + نیپال + نیوزی لینڈ + عمان + پیرو + فرانسیسی پولینیسیا + پاپوا نیو گنی + فلپائن + پاکستان + پولینڈ + سینٹ پائرے اور میکویلون + فلسطین + پرتگال + پیراگوئے + رومانیہ + روس + روانڈا + سعودی عرب + جزائرسولمون + سے شلز + سوڈان + سویڈن + سینٹ ھیلینا + سلوانیہ + سلوواکیہ + سیرالیون + سان میرینو + سینیگال + صوپالیہ + سورینام + سیریا + سوازی لینڈ + جزائر کیکس اور ترکیّہ + چاڈ + جنوبی فرانسیسی علاقہ جات + ٹوگو + تھائی لینڈ + تاجکستان + ٹوکیلاؤ + مشرقی تیمور + ترکمانستان + تیونس + تونگا + ترکی + ٹرینیڈاڈ اور ٹوباگو + ٹوالو + تائیوان + تنزانیہ + یوکرائن + یوگنڈا + ریاست ہائے متحدہ اور بیرونی جزائر + ریاست ہائے متحدہ امریکا + ہوراگوئے + ازبکستان + ویٹیکن سٹی + سینٹ کیرن اور گریناڈائنز + وینزولا + جزائر ورجن، برٹش + جزائر ورجن، امریکہ + ویت نام + وانواٹو + والس اور فتونہ + ساموا + یمن + جنوبی افریقہ + زیمبیا + زمبابوے + Unknown or Invalid Region + + + کیلنڈر + موازنہ + کرنسی + + + روایتی چینی چھانٹ ترتیب-Big5 + بدھ کیلنڈر + روایتی چینی کیلنڈر + بلاواسطہ چھانٹ ترتیب + سادہ چینی چھانٹ ترتیب-GB2312 + گریگوری کیلنڈر + عبرانی کیلنڈر + ہندی کیلنڈر + اسلامی کیلنڈر + ہجری کیلنڈر + جاپانی کیلنڈر + فون نامہ چھانٹ ترتیب + پن ین چھانٹ ترتیب + سادہ چینی کیلنڈر + لکیری چھانٹ ترتیب + روایتی چھانٹ ترتیب + + + امریکی + اعشاری + + + زبان:{0} + رسم الخط:{0} + خطہ:{0} + + + + + + + [أ ؤ ا آ ب پ ت ٹ ث ج چ ح-د ڈ ذ ر ڑ ز ژ س-غ ف ق ک گ ل-ن ں و ہ ی ء ئ ے ٻ ة ٺ ټ ٽ ه ھ ي] + [\u0610 \u0611 \u0613 \u0614 \u064E \u0650 \u064F \u0670 \u064B \u0651] + + + + + + + + جنوری + فروری + مار چ + اپريل + مئ + جون + جولائ + اگست + ستمبر + اکتوبر + نومبر + دسمبر + + + + + ج + ف + م + ا + م + ج + ج + ا + س + ا + ن + د + + + + + + + ا + پ + م + ب + ج + ج + ہ + + + اتوار + پير + منگل + بده + جمعرات + جمعہ + ہفتہ + + + + + + + 1سہ ماہی + 2سہ ماہی + 3سہ ماہی + 4سہ ماہی + + + پہلی سہ ماہی + دوسری سہ ماہی + تيسری سہ ماہی + چوتهی سہ ماہی + + + + قبل دوپہر + بعد دوپہر + + + قبل مسيح + عيسوی سن + + + ق م + عيسوی سن + + + + + + EEEE, d, MMMM y + + + + + d, MMMM y + + + + + d, MMM y + + + + + d/M/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + HH:mm + LL + E, M-d + LLL + E MMM d + E MMMM d + MMMM d + MMM d + M-d + د + mm:ss + y + yyyy-M + EEE, yyyy-d-M + y MMM + EEE, y MMM d + y MMMM + Q yyyy + y QQQ + yy Q + + + {0} – {1} + + M تا M + + + E, MM-dd تا E, MM-dd + E, MMM dd – E, MMM dd + + + LLL-LLL + + + E, MMM d – E, MMM d + E, MMM d – E, MMM d + + + LLLL-LLLL + + + MMM d تا MMM d + MMM d تا d + + + MM-dd تا MM-dd + M/d تا d + + + d-d + + + h a تا h a + h–h a + + + h:mm a تا h:mm a + h:mm تا h:mm a + h:mm تا h:mm a + + + h:mm a – h:mm a v + h:mm تا h:mm a v + h:mm تا h:mm a v + + + h a – h a v + h تا h a v + + + y تا y + + + yyyy-MM تا MM + yyyy-MM تا yyyy-MM + + + E, yyyy-MM-dd – E, yyyy-MM-dd + E, yyyy-MM-dd تا E, yyyy-MM-dd + E, yyyy-MM-dd – E, yyyy-MM-dd + + + MMM–MMM y + MMM–MMM y + + + E, MMM d – E, MMM d, y + E, MMM d – E, MMM d, y + E, MMM d, y تا E, MMM d, y + + + yyyy-MM تا MM + yyyy-MM تا yyyy-MM + + + MMM d تا MMM d, y + MMM d–d, y + MMM d, y تا MMM d, y + + + yyyy-MM-dd تا MM-dd + yyyy-MM-dd تا dd + MM-dd-yyyy تا MM-dd-yyyy + + + + + + دور + + + سال + + + مہینہ + + + ہفتہ + + + دن + ترسوں + پرسوں + کل + آج + کل + پرسوں + ترسوں + + + ہفتے کا دن + + + رات/صبح + + + گھنٹہ + + + منٹ + + + سیکنڈ + + + زون + + + + + + + + محرم + صفر + ر بيع الاول + ر بيع الثانی + جمادی الاول + جمادی الثانی + رجب + شعبان + رمضان + شوال + + + + + + عيسوی سن + + + ق م + CE + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + Unknown + + + انڈورا + + + انگویلا + + + اروبا + + + بار باڈوس + + + بحرین + + + برمودہ + + + برونائی + + + بیلیز + + + کوسٹا ریکا + + + کیپ ورڈ + + + جبوتی + + + ڈومینیکا + + + فجی + + + غرناطہ + + + جبرالٹر + + + گواڈیلوپ + + + گوئٹے مالا + + + گوام + + + گیانا + + + ہانگ کانگ + + + جمائیکا + + + کویت + + + لیگزمبرگ + + + موناکو + + + مکائو + + + مارٹنیک + + + مونٹ سراٹ + + + مالٹا + + + ماریشس + + + مالدیپ + + + نورو + + + نیوئے + + + پانامہ + + + پٹ کیرن + + + پورٹو ریکو + + + پالائو + + + قطر + + + ری یونین + + + سنگاپور + + + ایلسلواڈور + + + مایوٹ + + + + + + . + , + ; + % + 0 + # + + + - + ق + ‰ + ∞ + یہ عدد نہیں + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + ‏{0} {1} ‏ + + + + متحدہ عرب اماراتی درہم + + + ارجنٹائن پیسہ + + + آسٹریلین ڈالر + + + بلغارین لیو + + + بولیوین بولیویانو + + + برازیلی ریئل + + + کنیڈین ڈالر + + + سوئس فرانکس + + + چلّین پیسہ + + + یوآن رینمنبی + + + کولمبین پیسہ + + + چیک کرونا + + + ڈچ مارکس + + + ڈنمارک کرونر + + + ایسٹونین کرون + + + مصری پائونڈ + + + یورو + + + فرانسیسی فرانک + + + انگلستانی پاونڈ سٹرلنگ + + + ھانگ کانگ ڈالر + + + کروشین کونا + + + ہنگرین فورنٹ + + + انڈونیشین روپیہ + + + اسرائیلی شیکل + + + انڈین روپیہ + + + جاپانی ین + + + جنوبی کوریائی جیتا۔ + + + لیتھوانی لیٹاس + + + مراکشی درہم + + + میکسیکی پیسہ + + + ملائیشین رنگٹ + + + ناروے کرونر + + + نیوزی لینڈ ڈالر + + + پیروین نیووسول + + + فلپائینی پیسہ + + + پاکستانی روپیہ + روپے + + + پولش نیو زلوٹی + + + نیا رومانیائی لیو + + + سربین دینار + + + روسی روبل + + + سعودی ریال + + + سویڈن کرونر + + + سنگا پور ڈالر + + + سلوانین ٹولر + + + سلووک کرونا + + + تھائی باہت + + + ترکی لیرا + + + نیا ترکی لیرا + + + نیو تائیوان ڈالر + + + امریکی ڈالر + ڈالر + + + وینزویلا بولیور + + + جنوبی افریقی رانڈ + + + + + + yes:y + no:n + + + diff --git a/lib/zend/Zend/Locale/Data/ur_IN.xml b/lib/zend/Zend/Locale/Data/ur_IN.xml new file mode 100644 index 0000000000..2786573a79 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ur_IN.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + #,##,##0.### + + + + + + + #,##,##0% + + + + + + + ¤ #,##,##0.00 + + + + + diff --git a/lib/zend/Zend/Locale/Data/ur_PK.xml b/lib/zend/Zend/Locale/Data/ur_PK.xml new file mode 100644 index 0000000000..e829a66a1e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/ur_PK.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/uz.xml b/lib/zend/Zend/Locale/Data/uz.xml new file mode 100644 index 0000000000..4cd49ec5ab --- /dev/null +++ b/lib/zend/Zend/Locale/Data/uz.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + Арабча + Олмонча + Инглизча + Испанча + Французча + Ҳиндча + Италянча + Японча + Португалча + Русча + Ўзбек + Хитойча + + + + + + + + Афғонистон + Бразилия + Хитой + Олмония + Франция + Бирлашган Қироллик + Ҳиндистон + Италия + Япония + Россия + Қўшма Штатлар + Ўзбекистон + + + + [а-г ғ д е ё ж-к қ л-у ў ф х ҳ ч ш ъ э-я] + [ц щ ы ь] + + + + + + + + Янв + Фев + Мар + Апр + Май + Июн + Июл + Авг + Сен + Окт + Ноя + Дек + + + Муҳаррам + Сафар + Рабиул-аввал + Рабиул-охир + Жумодиул-уло + Жумодиул-ухро + Ражаб + Шаъбон + Рамазон + Шаввол + Зил-қаъда + Зил-ҳижжа + + + + + Я + Ф + М + А + М + И + И + А + С + О + Н + Д + + + + + + + Якш + Душ + Сеш + Чор + Пай + Жум + Шан + + + якшанба + душанба + сешанба + чоршанба + пайшанба + жума + шанба + + + + + Я + Д + С + Ч + П + Ж + Ш + + + + + + + EEEE, y MMMM dd + + + + + y MMMM d + + + + + y MMM d + + + + + yy/MM/dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + Q yy + yyyy/M + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + کابل + + + + افغانستان وقتی + + + + + + + , +   + + + + Бразил реали + + + Хитой юани + + + Евро + + + Инглиз фунт стерлинги + + + Ҳинд рупияси + + + Япон йенаси + + + Рус рубли + + + АҚШ доллари + + + Ўзбекистон сўм + сўм + + + + diff --git a/lib/zend/Zend/Locale/Data/uz_AF.xml b/lib/zend/Zend/Locale/Data/uz_AF.xml new file mode 100644 index 0000000000..fd38cc0d20 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/uz_AF.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/uz_Arab.xml b/lib/zend/Zend/Locale/Data/uz_Arab.xml new file mode 100644 index 0000000000..b4c5b55957 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/uz_Arab.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + Afgʿoniston + Braziliya + Xitoy + Olmoniya + Fransiya + Birlashgan Qirollik + Hindiston + Italiya + Yaponiya + Rossiya + Qo'shma Shtatlar + Oʿzbekiston + + + + [a-v x-z ʿ] + + + + + + + + Yanv + Fev + Mar + Apr + May + Iyun + Iyul + Avg + Sen + Okt + Noya + Dek + + + + + Y + F + M + A + M + I + I + A + S + O + N + D + + + + + + + Yaksh + Dush + Sesh + Chor + Pay + Jum + Shan + + + yakshanba + dushanba + seshanba + chorshanba + payshanba + juma + shanba + + + + + Y + D + S + C + P + J + S + + + + + + + + + Muharram + Safar + Rabiul-avval + Rabiul-oxir + Jumodiul-ulo + Jumodiul-uxro + Rajab + Shaʿbon + Ramazon + Shavvol + Zil-qaʿda + Zil-hijja + + + + + + + + + + Brazil reali + + + Xitoy yuani + + + Evro + + + Ingliz funt sterlingi + + + Hind rupiyasi + + + Yapon yenasi + + + Rus rubli + + + AQSH dollari + + + Oʿzbekiston soʿm + soʿm + + + + diff --git a/lib/zend/Zend/Locale/Data/uz_Latn_UZ.xml b/lib/zend/Zend/Locale/Data/uz_Latn_UZ.xml new file mode 100644 index 0000000000..e2d8094a82 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/uz_Latn_UZ.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + + Thế giới + Châu Phi + Bắc Mỹ + Nam Mỹ + Châu Đại Dương + Tây Phi + Trung Mỹ + Đông Phí + Bắc Phi + Trung Phi + Miền Nam Châu Phi + Châu Mỹ + Miền Bắc Châu Mỹ + Ca-ri-bê + Đông Á + Nam Á + Đông Nam Á + Nam Âu + Úc và New Zealand + Melanesia + Vùng Micronesian + Polynesia + Trung Nam Á + Châu Á + Trung Á + Tây Á + Âu Châu + Đông Âu + Miền Bắc Châu Âu + Tây Âu + Châu Mỹ La-tinh và Ca-ri-be + Andorra + Các Tiểu Vương quốc A-rập Thống nhất + Áp-ga-ni-xtan + An-ti-gu-a và Ba-bu-đa + An-ba-ni + Ác-mê-ni-a + Tây Ấn Hà Lan + Ăng-gô-la + Nam Cực + Ác-hen-ti-na + Đảo Somoa thuộc Mỹ + Áo + Úc + Quần đảo Aland + Ai-déc-bai-gian + Bô-xni-a Héc-xê-gô-vi-na + Bác-ba-đốt + Băng-la-đét + Bỉ + Buốc-ki-na Pha-xô + Bun-ga-ri + Ba-ren + Bu-run-đi + Bê-nanh + BL + Bru-nây + Bô-li-vi-a + Bra-xin + Ba-ha-ma + Bu-tan (Bhutan) + Đảo Bouvet (Na Uy) + Bốt-xoa-na + Bê-la-rút + Bê-li-xê + Ca-na-đa + Quần đảo Cocos + Cộng hoà dân chủ Côngô + Cộng hòa Trung Phi + Công-gô + Thụy Sĩ + Bờ Biển Ngà + Quần Đảo Cook + Chi-lê + Ca-mơ-run + Trung Quốc + Cô-lôm-bi-a + Cốt-xta Ri-ca + Séc-bia + Cu Ba + Cáp-ve + Đảo Giáng Sinh + Síp + Cộng hòa Séc + Đức + Gi-bu-ti + Đan Mạch + Cộng hoà Đô-mi-ni-ca + An-giê-ri + Ê-cu-a-đo + E-xtô-ni-a + Ai Cập + Tây Sahara + Ê-ri-tơ-rê-a + Tây Ban Nha + Ê-ti-ô-pi-a + Phần Lan + Phi-gi + Quần Đảo Falkland + Mi-crô-nê-xi-a + Quần Đảo Faroe + Pháp + Ga-bông + Vương quốc Anh + Grê-na-đa + Gru-di-a + Quiana thuộc Pháp + Guernsey + Gha-na + Băng Đảo + Găm-bi-a + Ghi-nê + Ghi-nê Xích-đạo + Hy Lạp + Quần đảo Nam Georgia và Nam Sandwich + Goa-tê-ma-la + Đảo Gu-am + Ghi-nê Bít-xao + Guy-a-na + Đặc khu hành chính Hồng Kông thuộc CHND Trung Hoa + Đảo Heard và Quần đảo McDonald + Hôn-đu-rát + Crô-a-ti-a + Ha-i-ti + Hung-ga-ri + Nam Dương + Ai-len + I-xra-en + Đảo Man + Ấn Độ + Thuộc địa Anh tại Ấn Độ Dương + I-rắc + I-ran + Ai-xơ-len + Ý + Jersey + Ha-mai-ca + Gióc-đa-ni + Nhật Bản + Kê-ni-a + Cư-rơ-gư-xtan + Campuchia + Ki-ri-ba-ti + Cô-mô + Xan-kít và Nê-vi + Bắc Triều Tiên + Hàn Quốc + Cô-oét + Quần Đảo Cayman + Ka-dắc-xtan + Lào + Li-băng + Xan Lu-xi + Lich-ten-xtên + Xri Lan-ca + Li-bê-ri-a + Lê-xô-thô + Li-tu-a-ni-a + Lúc-xăm-bua + Lát-vi-a + Li-bi + Ma-rốc + Mô-na-cô + Môn-đô-va + Montenegro + MF + Ma-đa-gát-xca + Quần đảo Mác-san + Ma-xê-đô-ni-a + Ma-li + Mi-an-ma + Mông Cổ + Đặc khu hành chính Macao thuộc CHND Trung Hoa + Quần Đảo Bắc Mariana + MQ + Mô-ri-ta-ni + Man-ta + Mô-ri-xơ + Man-đi-vơ + Ma-la-uy + Mê-hi-cô + Ma-lay-xi-a + Mô-dăm-bích + Nam-mi-bi-a + New Caledonia + Ni-giê + Đảo Norfolk + Ni-giê-ri-a + Ni-ca-ra-goa + Hà Lan + Na Uy + Nê-pan + Niu Di-lân + Ô-man + Pa-na-ma + Pê-ru + Polynesia thuộc Pháp + Pa-pu-a Niu Ghi-nê + Phi-lip-pin + Pa-ki-xtan + Ba Lan + Saint Pierre và Miquelon + Lãnh thổ Palestine + Bồ Đào Nha + Pa-ra-goay + Ca-ta + Vùng xa xôi thuộc Châu Đại Dương + Liên Minh Châu Âu + RE + Ru-ma-ni + Xéc-bi + Nga + Ru-an-đa + A-rập Xê-út + Quần đảo Xô-lô-mông + Xây-sen + Xu-đăng + Thụy Điển + Xin-ga-po + Saint Helena + Xlô-ven-ni-a + Svalbard và Jan Mayen + Xlô-va-ki-a + Xi-ê-ra Lê-ôn + Xan Ma-ri-nô + Xê-nê-gan + Xô-ma-li + Xu-ri-nam + Xao Tô-mê và Prin-xi-pê + En-san-va-đo + Xi-ri + Xoa-di-len + Quần Đảo Turk và Caicos + Sát + Thuộc Địa Nam của Pháp + Tô-gô + Thái Lan + Tát-gi-ki-xtan + Tokelau + Đông Ti-mo + Tuốc-mê-ni-xtan + Tuy-ni-di + Tông-ga + Thổ Nhĩ Kỳ + Tri-ni-đát và Tô-ba-gô + Tu-va-lu + Đài Loan + Tan-da-ni-a + U-crai-na + U-gan-đa + Các đảo nhỏ xa trung tâm thuộc Mỹ + Hoa Kỳ + U-ru-goay + U-dơ-bê-ki-xtan + Va-ti-căng + Xan Vin-xen và Grê-na-din + Vê-nê-zu-ê-la + Đảo Virgin, thuộc Anh + Quần đảo Virgin, Mỹ + Việt Nam + Va-nu-a-tu + Wallis và Futuna + Xa-moa + Y-ê-men + YT + Nam Phi + Dăm-bi-a + Dim-ba-bu-ê + Vùng Chưa biết hoặc không Hợp lệ + + + gregorian + + + Ngôn ngữ: {0} + Chữ viết: {0} + Vùng: {0} + + + + [a à ả ã á ạ ă ằ ẳ ẵ ắ ặ â ầ ẩ ẫ ấ ậ b-d đ e è ẻ ẽ é ẹ ê ề ể ễ ế ệ f-i ì ỉ ĩ í ị j-o ò ỏ õ ó ọ ô ồ ổ ỗ ố ộ ơ ờ ở ỡ ớ ợ p-u ù ủ ũ ú ụ ư ừ ử ữ ứ ự v-y ỳ ỷ ỹ ý ỵ z] + [f j w z] + [a-d đ e-z] + + + “ + ” + ‘ + ’ + + + + + + + + thg 1 + thg 2 + thg 3 + thg 4 + thg 5 + thg 6 + thg 7 + thg 8 + thg 9 + thg 10 + thg 11 + thg 12 + + + tháng một + tháng hai + tháng ba + tháng tư + tháng năm + tháng sáu + tháng bảy + tháng tám + tháng chín + tháng mười + tháng mười một + tháng mười hai + + + + + + + CN + Th 2 + Th 3 + Th 4 + Th 5 + Th 6 + Th 7 + + + Chủ nhật + Thứ hai + Thứ ba + Thứ tư + Thứ năm + Thứ sáu + Thứ bảy + + + + SA + CH + + + tr. CN + sau CN + + + + + + EEEE, 'ngày' dd MMMM 'năm' y + + + + + 'Ngày' dd 'tháng' M 'năm' y + + + + + dd-MM-yyyy + + + + + dd/MM/yyyy + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {0} {1} + + + + + {0} {1} + + + + + {0} {1} + + + + + {0} {1} + + + + H + HH:mm + HH:mm:ss + E, d-M + E d MMM + E d MMMM + d MMMM + d MMM + dd-MM + d-M + mm:ss + EEE, d-M-yyyy + MMM y + EEE, d MMM y + MMMM y + Q yyyy + QQQ y + Q yy + y + MM-yyyy + + + {0} - {1} + + 'Tháng' M - 'Tháng' M + + + EEEE, dd/MM - EEEE, dd/MM + EEEE, dd/MM - EEEE, dd/MM + + + MMM-MMM + + + EEEE, 'ngày' dd 'tháng' M - EEEE, 'ngày' dd 'tháng' M + EEEE, 'ngày' dd - EEEE, 'ngày' dd 'tháng' M + + + 'Ngày' dd 'tháng' M - 'Ngày' dd 'tháng' M + 'Ngày' dd 'tháng' M - 'Ngày' dd 'tháng' M + + + dd/MM - dd/MM + dd/MM - dd/MM + + + 'Ngày' d-d + + + HH'h' - HH'h' + HH'h' - HH'h' + + + HH:mm-HH:mm + HH:mm-HH:mm + + + HH:mm-HH:mm v + HH:mm-HH:mm v + + + HH'h'-HH'h' v + HH'h'-HH'h' v + + + y-y + + + MM/yyyy - MM/yyyy + MM/yyyy - MM/yyyy + + + EEEE, dd/MM/yyyy - EEEE, dd/MM/yyyy + EEEE, dd/MM/yyyy - EEEE, dd/MM/yyyy + EEEE, dd/MM/yyyy - EEEE, dd/MM/yyyy + + + 'Tháng' M - 'Tháng' M 'năm' y + 'Tháng' M 'năm' y - 'Tháng' M 'năm' y + + + EEEE, 'ngày' dd MMM - EEEE, 'ngày' dd MMM 'năm' y + EEEE, 'ngày' dd MMM - EEEE, 'ngày' dd MMM 'năm' y + EEEE, 'ngày' dd MMM 'năm' y - EEEE, 'ngày' dd MMM 'năm' y + + + 'Ngày' dd 'tháng' M - 'Ngày' dd 'tháng' M 'năm' y + 'Ngày' dd 'tháng' M - 'Ngày' dd 'tháng' M 'năm' y + 'Ngày' dd 'tháng' M 'năm' y - 'Ngày' dd 'tháng' M 'năm' y + + + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + dd/MM/yyyy - dd/MM/yyyy + + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + {1} ({0}) + + Không rõ + + + Andorra Time + + + Dumont D'Urville + + + Barbados Time + + + Bahrain Time + + + Belize Time + + + Costa Rica Time + + + Cape Verde Time + + + Djibouti Time + + + Dominica Time + + + Quần Đảo Canary + + + Fiji Time + + + Grenada Time + + + South Georgia and the South Sandwich Islands Time + + + Guatemala Time + + + Guyana Time + + + Hong Kong SAR China Time + + + Jamaica Time + + + Saint Kitts and Nevis Time + + + Kuwait Time + + + Laos Time + + + Saint Lucia Time + + + Luxembourg Time + + + Monaco Time + + + Malta Time + + + Mauritius Time + + + Maldives Time + + + Nauru Time + + + Panama Time + + + Palau Time + + + Qatar Time + + + Singapore Time + + + El Salvador Time + + + Taiwan Time + + + Saint Vincent and the Grenadines Time + + + U.S. Virgin Islands Time + + + Giờ Việt Nam + + + + + + , + . + ; + % + 0 + # + + + - + E + ‰ + ∞ + NaN + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + #,##0.00 ¤ + + + {0} {1} + + + + Điram UAE + + + Lép Bungari + + + BRL + + + Franc Thụy sĩ + + + CNY + + + Crun Extônia + + + Euro + + + Đô-la Fi-ji + + + Franc Pháp + + + Bảng Anh + + + Lari Georgia + + + Cedi Ghana (1979-2007) + + + Cedi Ghana + + + Pao Gibraltar + + + Franc Guinea + + + Syli Guinea + + + Drachma Hy Lạp + + + Quetzal Guatemala + + + Peso Guinea-Bissau + + + Đô-la Guyana + + + Đô-la Hồng Kông + + + Honduras Lempira + + + Gourde Haiti + + + Phôrin Hungari + + + Rupia Inđônêxia + + + Pao Ai-len + + + Pao Ixraen + + + Sêken Ixraen + + + Rupi Ấn Độ + + + Dinar I-rắc + + + Rial I-ran + + + Lia Ý + + + Đô la Jamaica + + + Dinar Jordan + + + Yên Nhật + + + Si-ling Kê-ny-a + + + Won Hàn Quốc + + + Kazakhstan Tenge + + + Litat Lituani + + + Điaham Marốc + + + Lia xứ Man-tơ + + + Peso Mêhicô + + + Rinhgit Malaixia + + + Curon Na Uy + + + Đô-la New Zealand + + + Nuevo Sol Pêru + + + Peso Philíppin + + + Rupi Pakistan + + + Zloty Ba Lan + + + Lây Rumani + + + Đina Xéc-bi + + + Rúp Nga + + + Rian Ả rập Xêút + + + Cua-ron Thuỵ Điển + + + Đô-la Singapore + + + Tôla Xlôvênia + + + Cuaron Xlôvác + + + Bạt Thái Lan + + + Lia Thổ Nhĩ Kỳ + + + Lia Thổ Nhĩ Kỳ Mới + + + Đô-la Đài Loan + + + Rúp U-crai-na + + + Đô-la Mỹ + + + Bôliva Vênêduêla + + + đồng + + + Vàng + + + Tiền tệ chưa biết hoặc không hợp lệ + + + Ran Nam Phi + + + + + + {0} ngày + + + {0} giờ + + + {0} phút + + + {0} tháng + + + {0} giây + + + {0} tuần + + + {0} năm + + + + + yes:y + no:n + + + + diff --git a/lib/zend/Zend/Locale/Data/vi_VN.xml b/lib/zend/Zend/Locale/Data/vi_VN.xml new file mode 100644 index 0000000000..7e18c6dea7 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/vi_VN.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/wal.xml b/lib/zend/Zend/Locale/Data/wal.xml new file mode 100644 index 0000000000..3257471402 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/wal.xml @@ -0,0 +1,349 @@ + + + + + + + + + + + ዐርቢኛ + ጀርመን + እንግሊዝኛ + ስፓኒሽ + ፈረንሳይኛ + ሐንድኛ + ጣሊያንኛ + ጃፓንኛ + ፖርቱጋሊኛ + ራሽኛ + ወላይታቱ + ቻይንኛ + + + + + + አንዶራ + የተባበሩት አረብ ኤምሬትስ + አልባኒያ + አርሜኒያ + ኔዘርላንድስ አንቲልስ + አርጀንቲና + ኦስትሪያ + አውስትሬሊያ + አዘርባጃን + ቦስኒያ እና ሄርዞጎቪኒያ + ባርቤዶስ + ቤልጄም + ቡልጌሪያ + ባህሬን + ቤርሙዳ + ቦሊቪያ + ብራዚል + ቡህታን + ቤላሩስ + ቤሊዘ + ኮንጎ + የመካከለኛው አፍሪካ ሪፐብሊክ + ስዊዘርላንድ + ቺሊ + ካሜሩን + ቻይና + ኮሎምቢያ + ሰርቢያ + ኬፕ ቬርዴ + ሳይፕረስ + ቼክ ሪፑብሊክ + ጀርመን + ዴንማርክ + ዶሚኒካ + ዶሚኒክ ሪፑብሊክ + አልጄሪያ + ኢኳዶር + ኤስቶኒያ + ግብጽ + ምዕራባዊ ሳህራ + ኤርትራ + ስፔን + ኢትዮጵያ + ፊንላንድ + ፊጂ + ሚክሮኔዢያ + ፈረንሳይ + እንግሊዝ + ጆርጂያ + የፈረንሳይ ጉዊአና + ጋምቢያ + ጊኒ + ኢኳቶሪያል ጊኒ + ግሪክ + ቢሳዎ + ጉያና + ሆንግ ኮንግ + ክሮኤሽያ + ሀይቲ + ሀንጋሪ + ኢንዶኔዢያ + አየርላንድ + እስራኤል + ህንድ + ኢራቅ + አይስላንድ + ጣሊያን + ጃማይካ + ጆርዳን + ጃፓን + ካምቦዲያ + ኮሞሮስ + ደቡብ ኮሪያ + ሰሜን ኮሪያ + ክዌት + ሊባኖስ + ሊቱዌኒያ + ላትቪያ + ሊቢያ + ሞሮኮ + ሞልዶቫ + ማከዶኒያ + ሞንጎሊያ + ማካዎ + ሞሪቴኒያ + ማልታ + ማሩሸስ + ሜክሲኮ + ማሌዢያ + ናሚቢያ + ኒው ካሌዶኒያ + ናይጄሪያ + ኔዘርላንድ + ኖርዌ + ኔፓል + ኒው ዚላንድ + ፔሩ + የፈረንሳይ ፖሊኔዢያ + ፓፑዋ ኒው ጊኒ + ፖላንድ + ፖርታ ሪኮ + ሮሜኒያ + ራሺያ + ሳውድአረቢያ + ሱዳን + ስዊድን + ሲንጋፖር + ስሎቬኒያ + ስሎቫኪያ + ሴኔጋል + ሱማሌ + ሲሪያ + ቻድ + የፈረንሳይ ደቡባዊ ግዛቶች + ታይላንድ + ታጃኪስታን + ምስራቅ ቲሞር + ቱኒዚያ + ቱርክ + ትሪኒዳድ እና ቶባጎ + ታንዛኒያ + ዩጋንዳ + አሜሪካ + ዩዝበኪስታን + ቬንዙዌላ + የእንግሊዝ ድንግል ደሴቶች + የአሜሪካ ቨርጂን ደሴቶች + የመን + ደቡብ አፍሪካ + ዛምቢያ + + + + [\u135F ᎐-᎙ ሀ-ሏ ⶀ ሐ-ሟ ᎀ-ᎃ ⶁ ሠ-ሯ ⶂ ሰ-ሷ ⶃ ሸ-ሿ ⶄ ቀ-ቈ ቊ-ቍ ቐ-ቖ ቘ ቚ-ቝ በ-ቧ ᎄ-ᎇ ⶅ ቨ-ቷ ⶆ ቸ-ቿ ⶇ ኀ-ኈ ኊ-ኍ ነ-ኗ ⶈ ኘ-ኟ ⶉ አ-ኧ ⶊ ከ-ኰ ኲ-ኵ ኸ-ኾ ዀ ዂ-ዅ ወ-ዖ ዘ-ዟ ⶋ ዠ-ዷ ⶌ ዸ-ዿ ⶍ ጀ-ጇ ⶎ ገ-ጐ ጒ-ጕ ጘ-ጟ ⶓ-ⶖ ጠ-ጧ ⶏ ጨ-ጯ ⶐ ጰ-ጷ ⶑ ጸ-ፏ ᎈ-ᎋ ፐ-ፗ ᎌ-ᎏ ⶒ ፘ-ፚ ⶠ-ⶦ ⶨ-ⶮ ⶰ-ⶶ ⶸ-ⶾ ⷀ-ⷆ ⷈ-ⷎ ⷐ-ⷖ ⷘ-ⷞ] + + + + + + + + ጃንዩ + ፌብሩ + ማርች + ኤፕረ + ሜይ + ጁን + ጁላይ + ኦገስ + ሴፕቴ + ኦክተ + ኖቬም + ዲሴም + + + ጃንዩወሪ + ፌብሩወሪ + ማርች + ኤፕረል + ሜይ + ጁን + ጁላይ + ኦገስት + ሴፕቴምበር + ኦክተውበር + ኖቬምበር + ዲሴምበር + + + + + ጃ + ፌ + ማ + ኤ + ሜ + ጁ + ጁ + ኦ + ሴ + ኦ + ኖ + ዲ + + + + + + + ወጋ + ሳይኖ + ማቆሳኛ + አሩዋ + ሃሙሳ + አርባ + ቄራ + + + + + ወ + ሳ + ማ + አ + ሃ + አ + ቄ + + + + ማለዶ + ቃማ + + + አዳ ዎዴ + ግሮተታ ላይታ + + + + + + EEEE፥ dd MMMM ጋላሳ y G + + + + + dd MMMM y + + + + + dd-MMM-y + + + + + dd/MM/yy + + + + + + + h:mm:ss a zzzz + + + + + h:mm:ss a z + + + + + h:mm:ss a + + + + + h:mm a + + + + + + dd MMMM + dd/MM + MM/yy + Q yy + MMMM y + + + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + + + ወ + + + + + ¤#,##0.00 + + + + + + የብራዚል ሪል + + + የቻይና ዩአን ረንሚንቢ + + + የኢትዮጵያ ብር + + + አውሮ + + + የእንግሊዝ ፓውንድ ስተርሊንግ + + + የሕንድ ሩፒ + + + የጃፓን የን + + + የራሻ ሩብል + + + የአሜሪካን ዶላር + + + + + diff --git a/lib/zend/Zend/Locale/Data/wal_ET.xml b/lib/zend/Zend/Locale/Data/wal_ET.xml new file mode 100644 index 0000000000..c6108bec1f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/wal_ET.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/wo.xml b/lib/zend/Zend/Locale/Data/wo.xml new file mode 100644 index 0000000000..c623afde6f --- /dev/null +++ b/lib/zend/Zend/Locale/Data/wo.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + Danwaa + Almaa + Angale + Españool + Finlaande + Fraañse + Itaaliee + Jappone + Olaande + Norweejiee + Portugees + Suweedwaa + + + + [a à b-e é ë f g i-n ñ ŋ o ó p-u w-y] + [ã h v z] + [a-z] + + + + +HH:mm;-HH:mm + GMT{0} + {0} + + + diff --git a/lib/zend/Zend/Locale/Data/wo_Latn.xml b/lib/zend/Zend/Locale/Data/wo_Latn.xml new file mode 100644 index 0000000000..ab64f24cbc --- /dev/null +++ b/lib/zend/Zend/Locale/Data/wo_Latn.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 世界 + 非洲 + 北美洲 + 南美洲 + 大洋洲 + 西非 + 中美洲 + 东非 + 北非 + 中非 + 南部非洲 + 美洲 + 美洲北部 + 加勒比海 + 东亚 + 南亚 + 东南亚 + 南欧 + 澳大利亚和新西兰 + 美拉尼西亚 + 密克罗尼西亚 + 玻利尼西亚 + 中南亚 + 亚洲 + 中亚 + 西亚 + 欧洲 + 东欧 + 北欧 + 西欧 + 独联体 + 拉丁美洲和加勒比海 + 海峡群岛 + 安道尔 + 阿拉伯联合酋长国 + 阿富汗 + 安提瓜和巴布达 + 安圭拉 + 阿尔巴尼亚 + 亚美尼亚 + 荷属安的列斯群岛 + 安哥拉 + 南极洲 + 阿根廷 + 美属萨摩亚 + 奥地利 + 澳大利亚 + 阿鲁巴 + 奥兰群岛 + 阿塞拜疆 + 波斯尼亚和黑塞哥维那 + 巴巴多斯 + 孟加拉国 + 比利时 + 布基纳法索 + 保加利亚 + 巴林 + 布隆迪 + 贝宁 + 圣巴泰勒米 + 百慕大 + 文莱 + 玻利维亚 + 巴西 + 巴哈马 + 不丹 + 布维特岛 + 博茨瓦纳 + 白俄罗斯 + 伯利兹 + 加拿大 + 科科斯群岛 + 刚果(金) + 中非共和国 + 刚果(布) + 瑞士 + 象牙海岸 + 库克群岛 + 智利 + 喀麦隆 + 中国 + 哥伦比亚 + 哥斯达黎加 + 塞尔维亚和黑山 + 古巴 + 佛得角 + 圣诞岛 + 塞浦路斯 + 捷克共和国 + 德国 + 吉布提 + 丹麦 + 多米尼加 + 多米尼加共和国 + 阿尔及利亚 + 厄瓜多尔 + 爱沙尼亚 + 埃及 + 西撒哈拉 + 厄立特里亚 + 西班牙 + 埃塞俄比亚 + 芬兰 + 斐济 + 福克兰群岛 + 密克罗尼西亚联邦 + 法罗群岛 + 法国 + 加蓬 + 英国 + 格林纳达 + 格鲁吉亚 + 法属圭亚那 + 格恩西岛 + 加纳 + 直布罗陀 + 格陵兰 + 冈比亚 + 几内亚 + 瓜德罗普岛 + 赤道几内亚 + 希腊 + 南乔治亚岛和南桑威齐群岛 + 危地马拉 + 关岛 + 几内亚比绍 + 圭亚那 + 中国香港特别行政区 + 赫德与麦克唐纳群岛 + 洪都拉斯 + 克罗地亚 + 海地 + 匈牙利 + 印度尼西亚 + 爱尔兰 + 以色列 + 曼岛 + 印度 + 英属印度洋领地 + 伊拉克 + 伊朗 + 冰岛 + 意大利 + 泽西岛 + 牙买加 + 约旦 + 日本 + 肯尼亚 + 吉尔吉斯斯坦 + 柬埔寨 + 基里巴斯 + 科摩罗 + 圣基茨和尼维斯 + 朝鲜 + 韩国 + 科威特 + 开曼群岛 + 哈萨克斯坦 + 老挝人民民主共和国 + 黎巴嫩 + 圣卢西亚 + 列支敦士登 + 斯里兰卡 + 利比里亚 + 莱索托 + 立陶宛 + 卢森堡 + 拉脱维亚 + 利比亚 + 摩洛哥 + 摩纳哥 + 摩尔多瓦 + 黑山共和国 + 圣马丁 + 马达加斯加 + 马绍尔群岛 + 马其顿 + 马里 + 缅甸 + 蒙古 + 中国澳门特别行政区 + 北马里亚纳群岛 + 马提尼克群岛 + 毛里塔尼亚 + 蒙塞拉特群岛 + 马耳他 + 毛里求斯 + 马尔代夫 + 马拉维 + 墨西哥 + 马来西亚 + 莫桑比克 + 纳米比亚 + 新喀里多尼亚 + 尼日尔 + 诺福克岛 + 尼日利亚 + 尼加拉瓜 + 荷兰 + 挪威 + 尼泊尔 + 瑙鲁 + 纽埃 + 新西兰 + 阿曼 + 巴拿马 + 秘鲁 + 法属波利尼西亚 + 巴布亚新几内亚 + 菲律宾 + 巴基斯坦 + 波兰 + 圣皮埃尔和密克隆 + 皮特凯恩 + 波多黎各 + 巴勒斯坦领土 + 葡萄牙 + 帕劳 + 巴拉圭 + 卡塔尔 + 大洋洲边远群岛 + 欧盟 + 留尼汪 + 罗马尼亚 + 塞尔维亚 + 俄罗斯 + 卢旺达 + 沙特阿拉伯 + 所罗门群岛 + 塞舌尔群岛 + 苏丹 + 瑞典 + 新加坡 + 圣赫勒拿 + 斯洛文尼亚 + 斯瓦尔巴特和扬马延 + 斯洛伐克 + 塞拉利昂 + 圣马力诺 + 塞内加尔 + 索马里 + 苏里南 + 圣多美和普林西比 + 萨尔瓦多 + 叙利亚 + 斯威士兰 + 特克斯和凯科斯群岛 + 乍得 + 法属南部领土 + 多哥 + 泰国 + 塔吉克斯坦 + 托克劳 + 东帝汶 + 土库曼斯坦 + 突尼斯 + 汤加 + 土耳其 + 特立尼达和多巴哥 + 图瓦卢 + 台湾 + 坦桑尼亚 + 乌克兰 + 乌干达 + 美国边远小岛 + 美国 + 乌拉圭 + 乌兹别克斯坦 + 梵蒂冈 + 圣文森特和格林纳丁斯 + 委内瑞拉 + 英属维京群岛 + 美属维京群岛 + 越南 + 瓦努阿图 + 瓦利斯和富图纳 + 萨摩亚 + 也门 + 马约特 + 南非 + 赞比亚 + 津巴布韦 + 未知或无效地区 + + + 传统德语拼字学 + 1996 年的德语拼字学 + 东亚美尼亚语 + 西亚美尼亚语 + 国际音标 + 多音 + 电脑 + 已修订的拼字学 + 萨霍 + + + 日历 + 对照 + 货币 + + + 繁体中文(Big5) + 佛教日历 + 农历 + 顺序 + 简体中文(GB2312) + 公历 + 希伯来日历 + 印度国家日历 + 伊斯兰日历 + 伊斯兰希吉来历 + 日本日历 + 电话簿顺序 + 拼音顺序 + 中华民国日历 + 笔划顺序 + 传统历法 + + + 美制 + 公制 + + + 语言:{0} + 脚本:{0} + 区域:{0} + + + + [一 丁 七 丈-与 专 且 世 丘-业 东 丝 丢 两 严 丧 个 中 丰 串 临 丸-主 丽 举 乃 久 么 义 之-乐 乔 乖 乘 乙 九 也-乡 书 买 乱 乾 了 予 争 事 二 于 亏 云 互 五 井 亚 些 亡 交 亦 亨 享 京 亮 亲 人 亿-仁 仅 仇 今 介 仍 从 仔 他 付 仙 代-以 仪 们 仰 仲 件 任 份 仿 企 伊 伍 伏-休 众 伙 会 伟 传 伤 伦 伯 估 伴 伸 似 伽 但 位-佑 体 何 余 佛 作 你 佤 佩 佳 使 例 供 依 侠 侦-侨 侬 侯 侵 便 促 俄 俊 俗 保 信 俩 修 俱 俾 倍 倒 候 倚 借 倦 值 倾 假 偌 偏 做 停 健 偶 偷 储 催 傲 傻 像 僧 儒 允 元-充 先 光 克 免 兑 兔 入 全 八-兮 兰 共 关-兹 养-兽 内 冈 再 冒 写 军 农 冠 冬 冰 冲 冷 准 凌 凝 几 凡 凤 凭 凯 凰 出 击 函 刀 分 切 刊 刑 划 列-创 初 判 利 别 到 制-券 刺 刻 剂 前 剑 剧 剩 剪 副 割 力 劝-务 劣 动-劫 励-劳 势 勇 勉 勋 勒 勤 勾 勿 包 匆 匈 化 北 匙 匹-医 十 千 升 午 半 华 协 卒 卓 单-南 博 占-卢 卫 印 危 即 卷 厄-历 厉 压-厍 厚 原 去 县 参 又-反 发 叔 取-叙 口-另 叫-叭 可 台 史 右 叶-叹 吃 各 合-吊 同-后 吐 向 吓 吗 君 吝 吟 否 吧 含 吵 吸 吹 吻 吾 呀 呆 呈 告 呐 员 呜 呢 呦 周 味 呵 呼 命 和 咖 咦 咧 咪 咬 咯 咱 哀 品 哇-哉 响 哎 哟 哥 哦 哩 哪 哭 哲 唉 唐 唤 唬 售 唯 唱 唷 商 啊 啡 啥 啦 啪 喀 喂 善 喇 喊 喏 喔 喜 喝 喵 喷 喻 嗒 嗨 嗯 嘉 嘛 嘴 嘻 嘿 器 四 回 因 团 园 困 围 固 国 图 圆 圈 土 圣 在 圭 地 场 圾 址 均 坎 坐 坑 块 坚-坜 坡 坤 坦 坪 垂 垃 型 垒 埃 埋 城 埔 域 培 基 堂 堆 堕 堡 堪 塑 塔 塞 填 境 增 墨 壁 士 壮 声 处 备 复 夏 夕 外 多 夜 夥 大 天-夫 央 失 头 夷-夺 奇-奉 奋 奏 契 奔 套 奥 女 奴 奶 她 好 如 妇 妈 妖 妙 妥 妨 妮 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娄 娘 娜 娟 婆 婚 媒 嫁 嫌 嫩 子 孔 孕 字-孙 孜 孝 孟 季 孤 学 孩 宁 它 宇-安 宋 完 宏 宗-实 审-室 宪 害 家 容 宽-宿 寂 寄 密 寇 富 寒 寝-察 寡 寨 寸 对 寻 导 寿 封 射 将 尊 小 少 尔 尖 尘 尚 尝 尤 就 尺 尼-尾 局-层 居 屋 屏 展 属 屠 山 岁 岂 岗 岘 岚 岛 岳 岸 峡 峰 崇 崩 川 州 巡 工-巨 巫 差 己 已 巴 巷 币-布 帅 师 希 帐 帕 帝 带 席 帮 常 帽 幅 幕 干-年 幸 幻-幽 广 庆 床 序 库-底 店 庙 府 庞 废 度 座 庭 康 庸 廉 廖 延 廷 建 开 弃 弄 弊 式 引 弗 弘 弟 张 弥 弦 弯 弱 弹 归 当 彝 形 彩 彬 彭 彰 影 彷 役 彻 彼 往 征 径 待 很 律 後 徐 徒 得 循 微 徵 德 心 必 忆 忌 忍 志-忙 忠 忧 快 念 忽 怀 态 怎 怒 怕 怖 思 怡 急 性 怨 怪 总 恋 恐 恢 恨 恩 恭 息 恰 恶 恼 悄 悉 悔 悟 悠 患 您 悲 情 惑 惜 惠 惧 惨 惯 想 惹 愁 愈 愉 意 愚 感 愧 慈 慎 慕 慢 慧 慰 憾 懂 懒 戈 戏-戒 或 战 截 戴 房-扁 扇 手 才 扎 扑 打 托 扣 执 扩 扫-扯 批 找-技 抄 把 抑 抓 投 抗 折 抢 护 报 披 抬 抱 抵 抹 抽 担 拆 拉 拍 拒 拔 拖 拘 招 拜 拟 拥 拦 拨 择 括 拳 拷 拼 拾 拿 持 指 按 挑 挖 挝 挡 挤 挥 挪 振 挺 捉 捐 捕 损 捡 换 捷 授 掉 掌 排 探 接 控-措 掸 描 提 插 握 援 搜 搞 搬 搭 摄 摆 摊 摔 摘 摩 摸 撒 撞 播 操 擎 擦 支 收 改 攻 放 政 故 效 敌 敏 救 教 敝 敢 散 敦 敬 数 敲 整 文 斋 斐 斗 料 斜 斥 断 斯 新 方 於 施 旁 旅 旋 族 旗 无 既 日-早 旭 时 旺 昂 昆 昌 明 昏 易 星 映 春 昨 昭 是 显 晃 晋 晒 晓 晚 晨 普 景 晴 晶 智 暂 暑 暖 暗 暮 暴 曰 曲 更 曹 曼 曾-最 月 有 朋 服 朗 望 朝 期 木 未-札 术 朱 朵 杀 杂 权 杉 李 材 村 杜 束 条 来 杨 杯 杰 松 板 极 析 林 果 枝 枢 枪 枫 架 柏 某 染 柔 查 柬 柯 柳 柴 标 栋 栏 树 校 样-根 格 桃 框 案 桌 桑 档 桥 梁 梅 梦 梯 械 梵 检 棉 棋 棒 棚 森 椅 植 椰 楚 楼 概 榜 模 樱 檀 欠-欣 欧 欲 欺 款 歉 歌 止-武 歪 死 殊 残 段 毅 母 每 毒 比 毕 毛 毫 氏 民 氛 水 永 求 汉 汗 汝 江-污 汤 汪 汶 汽 沃 沈 沉 沙 沟 沧 河 油 治 沿 泉 泊 法 泛 泡-泣 泥 注 泰 泳 泽 洋 洗 洛 洞 津 洪 洲 活 洽 派 流 浅 测 济 浑 浓 浦 浩 浪 浮 浴 海 涅 消 涉 涛 涨 涯 液 涵 淋 淑 淘 淡 深 混 添 清 渐 渡 渣 温 港 渴 游 湖 湾 源 溜 溪 滋 滑 满 滥 滨 滴 漂 漏 演 漠 漫 潘 潜 潮 澎 澳 激 灌 火 灭 灯 灰 灵 灿 炉 炎 炮 炸 点 烂 烈 烤 烦 烧 热 焦 然 煌 煞 照 煮 熊 熟 燃 燕 爆 爪 爬 爱 爵-爸 爽 片 版 牌 牙 牛 牡 牢 牧 物 牲 牵 特 牺 犯 状 犹 狂 狐 狗 狠 独 狮 狱 狼 猛 猜 献 玄 率 玉 王 玛 玩 玫 环 现 玲 玻 珊 珍 珠 班 球 理 琊 琪 琳 琴 瑙 瑜 瑞 瑟 瑰 瑶 璃 瓜 瓦 瓶 甘 甚 甜 生 用 田-申 电 男 甸 画 畅 界 留 略 番 疆 疏 疑 疗 疯 疲 疼 疾 病 痕 痛 痴 登 白 百 的 皆 皇 皮 盈 益 监 盒 盖 盘 盛 盟 目 直 相 盼 盾 省 眉 看 真 眠 眼 睛 睡 督 瞧 矛 矣 知 短 石 矶 码 砂 砍 研 破 础 硕 硬 碍 碎 碗 碟 碧 碰 磁 磅 磨 示 礼 社 祖 祝 神 祥 票 祸 禁 禅 福 秀 私 秋 种 科 秒 秘 租 秤 秦 秩 积 称 移 稀 程 稍 稣 稳 稿 穆 究 穷 穹 空 穿 突 窗 窝 立 站 竞-章 童 端 竹 笑 笔 笛 符 笨 第 等 筋 答 策 筹 签 简 算 管 箭 箱 篇 篮 簿 籍 米 类 粉 粒 粗 粹 精 糊 糕 糖 糟 系 素 索 紧 紫 累 繁 红 约 级 纪 纯 纲 纳 纵 纷 纸 纽 练 组 细-终 绍 经 结 绕 绘 给 络 统 继 绩 绪 续 维 绵 综 缅 缓 编 缘 缠 缩 缴 缶 缸 缺 罐 罕 罗 罚 罢 罪 置 署 羊 美 羞 群 羯 羽 翁 翅 翔 翘 翠 翰 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 职 联 聚 聪 肉 肚 股 肤 肥 肩 肯 育 胁 胆 背 胎 胖 胞 胡 胶 胸 能 脆 脑 脱 脸 腊 腐 腓 腰 腹 腾 腿 臂 臣 自 臭 至 致 舌 舍 舒 舞 舟 航 般 舰 船 良 色 艺 艾 节 芒 芝 芦 芬 芭 花 芳 苍 苏 苗 若 苦 英 茂 茨 茫 茶 草 荒 荣 药 荷 莉 莎 莪 莫 莱 莲 获 菜 菩 菲 萄 萍 萤 营 萧 萨 落 著 葛 葡 蒂 蒋 蒙 蓉 蓝 蓬 蔑 蔡 薄 薪 藉 藏 藤 虎 虑 虫 虹 虽 虾 蚁 蛇 蛋 蛙 蛮 蜂 蜜 蝶 融 蟹 蠢 血 行 街 衡 衣 补 表 袋 被 袭 裁 裂 装 裕 裤 西 要 覆 见 观 规 视 览 觉 角 解 言 誉 誓 警 计 订 认 讨 让 训-记 讲 许 论 设 访 证 评 识 诉 词 译 试 诗 诚 话 诞 询 该 详 语 误 说 请 诸 诺 读 课 谁 调 谅 谈 谊 谋 谓 谜 谢 谨 谱 谷 豆 象 豪 貌 贝-负 贡-败 货-贪 购 贯 贱 贴 贵 费 贺 贼 贾 资 赋 赌 赏 赐 赔 赖 赚 赛 赞 赠 赢 赤 赫 走 赵 起 趁 超 越 趋 趣 足 跃 跌 跑 距 跟 路 跳 踏 踢 踩 身 躲 车 轨 轩 转 轮-轰 轻 载 较 辅 辆 辈 辉 辑 输 辛 辞 辨 辩 辱 边 达 迁 迅 过 迈 迎 运 近 返 还 这 进-迟 迦 迪 迫 述 迷 追 退 送 逃 逆 选 逊 透 逐 递 途 通 逛 逝 速 造 逢 逸 逻 逼 遇 遍 道 遗 遭 遮 遵 避 邀 邓 那 邦 邪 邮 邱 邻 郎 郑 部 郭 都 鄂 酋 配 酒 酷 酸 醉 醒 采 释 里-量 金 针 钓 钟 钢 钦 钱 钻 铁 铃 铢 铭 银 销 锁 锅 锋 错 锡 锦 键 锺 镇 镜 镭 长 门 闪 闭 问 间 闷 闹 闻 阁 阐 阔 队 阮 防-阶 阻 阿 陀 附-陆 陈 降 限 院 除 险 陪 陵-陷 隆 随 隐 隔 障 难 雄-集 雨 雪 雯 雳 零 雷 雾 需 震 霍 霖 露 霸 霹 青 靖 静 非 靠 面 革 靼 鞋 鞑 韦 韩 音 页 顶 项-须 顽-顿 预 领 颇 频 颗 题 额 风 飘 飙 飞 食 餐 饭 饮 饰 饱 饼 馆 首 香 馨 马 驱 驶 驻 驾 验 骑 骗 骚 骤 骨 高 鬼 魂 魅 魔 鱼 鲁 鲜 鸟 鸣 鸭 鸿 鹅 鹤 鹰 鹿 麦 麻 黄 黎 黑 默 鼓 鼠 鼻 齐 齿 龄 龙 龟] + [侣 傣 卑 厘 吕 堤 奎 巽 录 户 撤 楔 楠 滕 瑚 甫 盲 禄 粟 线 脚 钯 铂 锑 镑 魁] + [a-z] + + + “ + ” + ‘ + ’ + + + + + + + yyyy/M + + + + + + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + + + + + + 周日 + 周一 + 周二 + 周三 + 周四 + 周五 + 周六 + + + 星期日 + 星期一 + 星期二 + 星期三 + 星期四 + 星期五 + 星期六 + + + + + 日 + 一 + 二 + 三 + 四 + 五 + 六 + + + + + + + 1季 + 2季 + 3季 + 4季 + + + 第1季度 + 第2季度 + 第3季度 + 第4季度 + + + + + 1 + 2 + 3 + 4 + + + + 上午 + 下午 + + + 公元前 + 公元 + + + 公元前 + 公元 + + + + + + y年M月d日EEEE + + + + + y年M月d日 + + + + + yyyy-M-d + + + + + yy-M-d + + + + + + + zzzzah时mm分ss秒 + + + + + zah时mm分ss秒 + + + + + ahh:mm:ss + + + + + ah:mm + + + + + + + {1}{0} + + + + + {1}{0} + + + + + {1} {0} + + + + + {1} {0} + + + + d日E + H时 + HH:mm:ss + H:mm + L + M-dE + LLL + MMMd日E + MMMMd日E + MMMMd日 + MMMMdd日 + MMMd日 + MM-dd + M-d + d日 + ah:mm + ah:mm:ss + mm:ss + y年 + yyyy-M + y年M月d日,E + y年MMM + y年MMMd日EEE + y年MMMM + y年MMMd日 + y年QQQ + y年QQQ + yy-MM + yy年MMM + yy年第Q季度 + y年 + y年M月 + y年MMMM + + + {0}–{1} + + L至L + + + M-dE至M-dE + M-dE至M-dE + + + LLLL至LLLL + + + M月d日E至M月d日E + M月d日E至d日E + + + M月d日至M月d日 + M月d日至d日 + + + M-d至M-d + M-d至M-d + + + d日至d日 + + + ah至ah时 + ah至h时 + + + ah:mm至ah:mm + ah:mm至h:mm + ah:mm至h:mm + + + vah:mm至ah:mm + vah:mm至h:mm + vah:mm至h:mm + + + vah至ah时 + vah至h时 + + + y至y + + + yy-M至yy-M + yy-M至yy-M + + + yy-M-dE至yy-M-dE + yy-M-dE至yy-M-dE + yy-M-dE至yy-M-dE + + + y年M月至M月 + y年M月至y年M月 + + + y年M月d日E至M月d日E + y年M月d日E至d日E + y年M月d日E至y年M月d日E + + + y年M月d日至M月d日 + y年M月d日至d日 + y年M月d日至y年M月d日 + + + yy-M-d至yy-M-d + yy-M-d至yy-M-d + yy-M-d至yy-M-d + + + + + + 时期 + + + 年 + + + 月 + + + 周 + + + 日 + 前天 + 昨天 + 今天 + 明天 + 后天 + + + 周天 + + + 上午/下午 + + + 小时 + + + 分钟 + + + 秒钟 + + + 区域 + + + + + + + 民国前 + 民国 + + + + + + Gy年M月d日EEEE + + + + + Gy年M月d日 + + + + + Gy-M-d + + + + + Gy-M-d + + + + + + ah:mm + ah:mm:ss + Gy/M + Gy/M/d(EEE) + Gy/MM + Gy年MMM + Gy年M月d日 + Gy/M/d + Gy年第Q季度 + + + + y/M至y/M + y/M至y/M + + + y/M/dE至y/M/dE + y/M/dE至y/M/dE + y/M/dE至y/M/dE + + + y/M/d至y/M/d + y/M/d至y/M/d + y/M/d至y/M/d + + + + + + + +HHmm;-HHmm + 格林尼治标准时间{0} + 格林尼治标准时间 + {0}时间 + + 未知 + + + 安道尔 + + + 迪拜 + + + 喀布尔 + + + 安提瓜 + + + 安圭拉 + + + 地拉那 + + + 埃里温 + + + 库拉卡 + + + 罗安达 + + + 罗瑟拉 + + + 帕默尔 + + + 南极 + + + 斯尤瓦 + + + 莫森 + + + 戴维斯 + + + 沃斯托克 + + + 卡塞 + + + 杜蒙杜威勒 + + + 马克默多 + + + 里奥加耶戈斯 + + + 门多萨 + + + 圣胡安 + + + 乌斯怀亚 + + + 拉里奥哈 + + + 卡塔马卡 + + + 胡胡伊 + + + 图库曼 + + + 科尔多瓦 + + + 布宜诺斯艾利斯 + + + 帕果-帕果 + + + 维也纳 + + + 佩思 + + + 尤克拉 + + + 达尔文 + + + 阿德莱德 + + + 布罗肯希尔 + + + 库利 + + + 墨尔本 + + + 霍巴特 + + + 林德曼 + + + 悉尼 + + + 布里斯班 + + + 豪勋爵 + + + 阿鲁巴 + + + 玛丽港 + + + 巴库 + + + 萨拉热窝 + + + 巴巴多斯 + + + 达卡 + + + 布鲁塞尔 + + + 瓦加杜古 + + + 索非亚 + + + 巴林 + + + 布琼布拉 + + + 波多诺伏 + + + 百慕大 + + + 文莱 + + + 拉巴斯 + + + 依伦尼贝 + + + 里奥布郎库 + + + 波多韦柳 + + + 博阿维斯塔 + + + 马瑙斯 + + + 库亚巴 + + + 大坎普 + + + 贝伦 + + + 阿拉瓜伊纳 + + + 圣保罗 + + + 巴伊亚 + + + 福塔雷萨 + + + 马塞约 + + + 累西腓 + + + 洛罗尼亚 + + + 拿骚 + + + 廷布 + + + 哈博罗内 + + + 明斯克 + + + 伯利兹 + + + 道森 + + + 怀特霍斯 + + + 伊努维克 + + + 温哥华 + + + 道森克里克 + + + 耶洛奈夫 + + + 埃德蒙顿 + + + 斯威夫特卡伦特 + + + 坎布里季贝 + + + 里贾纳 + + + 温尼伯 + + + 雨河 + + + 雷今海口 + + + 珊瑚港 + + + 桑德贝 + + + 尼皮贡 + + + 多伦多 + + + 蒙特利尔 + + + 伊魁鲁伊特 + + + 旁涅唐 + + + 蒙克顿 + + + 哈利法克斯 + + + 古斯湾 + + + 格莱斯贝 + + + 圣约翰 + + + 可可斯 + + + 金沙萨 + + + 卢本巴希 + + + 班吉 + + + 布拉扎维 + + + 苏黎世 + + + 阿比让 + + + 拉罗汤加 + + + 复活节岛 + + + 圣地亚哥 + + + 杜阿拉 + + + 喀什葛尔 + + + 乌鲁木齐 + + + 重庆 + + + 上海 + + + 哈尔滨 + + + 波哥大 + + + 哥斯达黎加 + + + 哈瓦那 + + + 佛得角 + + + 圣诞岛 + + + 尼科西亚 + + + 布拉格 + + + 柏林 + + + 吉布提 + + + 哥本哈根 + + + 多米尼加 + + + 圣多明各 + + + 阿尔及尔 + + + 加拉帕哥斯 + + + 瓜亚基尔 + + + 塔林 + + + 开罗 + + + 阿尤恩 + + + 阿斯马拉 + + + 加那利 + + + 休达 + + + 马德里 + + + 亚的斯亚贝巴 + + + 赫尔辛基 + + + 斐济 + + + 史丹利 + + + 特鲁克群岛 + + + 波纳佩岛 + + + 库赛埃 + + + 法罗 + + + 巴黎 + + + 利伯维尔 + + + + BST + + 伦敦 + + + 格林纳达 + + + 第比利斯 + + + 卡宴 + + + 根西岛 + + + 阿克拉 + + + 直布罗陀 + + + 图勒 + + + 戈特霍布 + + + 斯科列斯比桑德 + + + Danmarkshavn(格陵兰东北城市) + + + 班珠尔 + + + 科纳克里 + + + 瓜德罗普 + + + 马拉博 + + + 雅典 + + + 南乔治亚 + + + 危地马拉 + + + 关岛 + + + 比绍 + + + 圭亚那 + + + 香港 + + + 特古西加尔巴 + + + 萨格勒布 + + + 太子港 + + + 布达佩斯 + + + 雅加达 + + + 坤甸 + + + 望加锡 + + + 查亚普拉 + + + 都柏林 + + + 耶路撒冷 + + + 马恩岛 + + + 加尔各答 + + + 查戈斯 + + + 巴格达 + + + 德黑兰 + + + 雷克雅未克 + + + 罗马 + + + 泽西岛 + + + 牙买加 + + + 安曼 + + + 东京 + + + 内罗毕 + + + 比什凯克 + + + 金边 + + + 恩德贝里 + + + 基里地马地岛 + + + 塔拉瓦 + + + 科摩罗 + + + 圣基茨 + + + 平壤 + + + 首尔 + + + 科威特 + + + 开曼 + + + 阿克图 + + + 乌拉尔 + + + 阿克托别 + + + 克孜勒奥尔达 + + + 阿拉木图 + + + 万象 + + + 贝鲁特 + + + 圣卢西亚 + + + 瓦杜兹 + + + 科伦坡 + + + 蒙罗维亚 + + + 马塞卢 + + + 维尔纽斯 + + + 卢森堡 + + + 里加 + + + 的黎波里 + + + 卡萨布兰卡 + + + 摩纳哥 + + + 基希讷乌 + + + 波德戈里察 + + + 安塔那利佛 + + + 夸贾林 + + + 马朱罗 + + + 斯科普里 + + + 巴马科 + + + 仰光 + + + 科布多 + + + 乌兰巴托 + + + 卓巴尔塞 + + + 澳门 + + + 塞班 + + + 马提尼克 + + + 努瓦克肖特 + + + 蒙特塞拉特 + + + 马耳他 + + + 毛里求斯 + + + 马尔代夫 + + + 布兰太尔 + + + 提华纳 + + + 埃莫西约 + + + 马萨特兰 + + + 奇瓦瓦 + + + 蒙特雷 + + + 墨西哥城 + + + 梅里达 + + + 坎昆 + + + 吉隆坡 + + + 古晋 + + + 马普托 + + + 温得和克 + + + 努美阿 + + + 尼亚美 + + + 诺福克 + + + 拉各斯 + + + 马那瓜 + + + 阿姆斯特丹 + + + 奥斯陆 + + + 加德满都 + + + 瑙鲁 + + + 纽埃 + + + 查塔姆 + + + 奥克兰 + + + 马斯喀特 + + + 巴拿马 + + + 利马 + + + 塔希提 + + + 马克萨斯 + + + 甘比尔 + + + 莫尔兹比港 + + + 马尼拉 + + + 卡拉奇 + + + 华沙 + + + 密克隆 + + + 皮特凯恩 + + + 波多黎各 + + + 加沙 + + + 亚述尔群岛 + + + 马德拉 + + + 里斯本 + + + 帕劳 + + + 亚松森 + + + 卡塔尔 + + + 留尼旺 + + + 布加勒斯特 + + + 贝尔格莱德 + + + 加里宁格勒 + + + 莫斯科 + + + 伏尔加格勒 + + + 萨马拉 + + + 叶卡捷林堡 + + + 鄂木斯克 + + + 诺沃西比尔斯克 + + + 克拉斯诺亚尔斯克 + + + 伊尔库茨克 + + + 雅库茨克 + + + 符拉迪沃斯托克 + + + 萨哈林 + + + 马加丹 + + + 堪察加 + + + 阿纳德尔 + + + 基加利 + + + 利雅得 + + + 瓜达尔卡纳尔 + + + 马埃 + + + 哈土穆 + + + 斯德哥尔摩 + + + 新加坡 + + + 圣赫勒拿 + + + 卢布尔维 + + + 朗伊尔城 + + + 布拉迪斯拉发 + + + 弗里敦 + + + 圣马力诺 + + + 达喀尔 + + + 摩加迪沙 + + + 帕拉马利玻 + + + 圣多美 + + + 萨尔瓦多 + + + 大马士革 + + + 姆巴巴纳 + + + 大土耳其 + + + 恩贾梅纳 + + + 凯尔盖朗 + + + 洛美 + + + 曼谷 + + + 杜尚别 + + + 法考福 + + + 帝力 + + + 阿什哈巴德 + + + 突尼斯 + + + 东加塔布 + + + 伊斯坦布尔 + + + 西班牙港 + + + 富纳富提 + + + 台北 + + + 达累斯萨拉姆 + + + 乌日戈罗德 + + + 基辅 + + + 辛菲罗波尔 + + + 扎波罗热 + + + 坎帕拉 + + + 中途岛 + + + 约翰斯顿 + + + 威克 + + + 艾德克 + + + 诺姆 + + + 檀香山 + + + 安克雷奇 + + + 亚库塔特 + + + 朱诺 + + + 洛杉矶 + + + 博伊西 + + + 凤凰城 + + + 舰石城 + + + 丹佛 + + + 北达科他 + + + 芝加哥 + + + 密诺米尼 + + + 温森斯 + + + 彼得斯堡 + + + 诺克斯 + + + 马伦戈 + + + 印地安纳波利斯 + + + 路易斯维尔 + + + 维维市(印第安纳州) + + + 蒙蒂塞洛 + + + 底特律 + + + 纽约 + + + 蒙得维的亚 + + + 撒马尔罕 + + + 塔什干 + + + 梵蒂冈 + + + 圣文森特 + + + 加拉加斯 + + + 托尔托拉 + + + 圣托马斯 + + + 胡志明市 + + + 埃法特 + + + 瓦利斯 + + + 阿皮亚 + + + 亚丁 + + + 马约特 + + + 约翰内斯堡 + + + 卢萨卡 + + + 哈拉雷 + + + + Acre 时间 + 阿克里标准时间 + 阿克里夏令时间 + + + + + 阿富汗时间 + + + + + 非洲中部时间 + 中部非洲标准时间 + + + 中部非洲时间 + + + + + 非洲东部时间 + 东部非洲标准时间 + + + 东部非洲时间 + + + + + 非洲南部时间 + 南部非洲标准时间 + + + 南部非洲时间 + 南部非洲标准时间 + + + + + 西部非洲时间 + 西部非洲标准时间 + 西部非洲夏令时间 + + + 西部非洲时间 + 西部非洲标准时间 + + + + + 阿尔卑斯时间 + 阿尔卑斯标准时间 + 阿尔卑斯夏令时间 + + + + + 阿拉斯加时间 + 阿拉斯加标准时间 + 阿拉斯加夏令时间 + + + 阿拉斯加标准时间 + 阿拉斯加夏令时间 + + + + + 阿拉斯加-夏威夷时间 + 阿拉斯加-夏威夷标准时间 + 阿拉斯加-夏威夷夏令时间 + + + + + Almaty 时间 + Almaty 标准时间 + 阿拉木图夏令时间 + + + + + 亚马逊时间 + 亚马逊标准时间 + 亚马逊夏令时间 + + + + + 美国中部时间 + 中部标准时间 + 中部夏令时间 + + + + + 美国东部时间 + 东部标准时间 + 东部夏令时间 + + + + + 美国山区时间 + 山区标准时间 + 山区夏令时间 + + + + + 美国太平洋时间 + 太平洋标准时间 + 太平洋夏令时间 + + + + + 下午1:25阿纳德尔夏令时间 + 阿纳德尔夏令时间 + + + + + 阿克图时间 + 阿克图标准时间 + 阿克图夏令时间 + + + + + 阿克托别时间 + 阿克托别标准时间 + 阿克托别夏令时间 + + + + + 阿拉伯时间 + 阿拉伯标准时间 + 阿拉伯夏令时间 + + + + + 阿根廷时间 + 阿根廷标准时间 + 阿根廷夏令时间 + + + + + 阿根廷西部时间 + 阿根廷西部标准时间 + 阿根廷西部夏令时间 + + + + + 亚美尼亚时间 + 亚美尼亚标准时间 + 亚美尼亚夏令时间 + + + AMT (Armenia) + 亚美尼亚时间 + 亚美尼亚白昼时间 + + + + + 阿什哈巴德时间 + 阿什哈巴德标准时间 + 阿什哈巴德夏令时间 + + + + + 大西洋时间 + 大西洋标准时间 + 大西洋夏令时间 + + + + + 澳大利亚中部时间 + 澳大利亚中部标准时间 + 澳大利亚中部夏令时间 + + + 澳大利亚中部时间 + 澳大利亚中部标准时间 + 澳大利亚中部夏令时间 + + + + + 澳大利亚中西部标准时间 + 澳大利亚中西部夏令时间 + + + 澳大利亚中西部标准时间 + 澳大利亚中西部夏令时间 + + + + + 澳大利亚东部时间 + 澳大利亚东部标准时间 + 澳大利亚东部夏令时间 + + + 澳大利亚东部时间 + 澳大利亚东部标准时间 + 澳大利亚东部夏令时间 + + + + + 澳大利亚西部时间 + 澳大利亚西部标准时间 + 澳大利亚西部夏令时间 + + + 澳大利亚西部时间 + 澳大利亚西部标准时间 + 澳大利亚西部夏令时间 + + + + + 阿塞拜疆时间 + 阿塞拜疆标准时间 + 阿塞拜疆夏令时间 + + + + + 亚述尔群岛时间 + 亚述尔群岛时间 + 亚述尔群岛夏令时间 + + + 亚述尔时间 + 亚述尔群岛时间 + 亚述尔群岛夏令时间 + + + + + 巴库时间 + 巴库标准时间 + 巴库夏令时间 + + + 巴库时间 + 巴库标准时间 + + + + + 孟加拉时间 + 孟加拉标准时间 + 孟加拉夏令时间 + + + 孟加拉夏令时间 + BDT + + + + + 白令时间 + 白令标准时间 + 白令夏令时间 + + + + + 不丹时间 + 不丹标准时间 + 不丹夏令时间 + + + 孟加拉标准时间 + + + + + 玻利维亚时间 + + + + + 婆罗洲时间 + 婆罗洲标准时间 + 婆罗洲夏令时间 + + + + + 巴西利亚时间 + 巴西利亚标准时间 + 巴西利亚夏令时间 + + + + + 汶萊時間 + + + + + 查莫罗标准时区 + + + 查莫罗标准时区 + + + + + 长白山时间 + + + + + 智利时间 + 智利标准时间 + 智利夏令时间 + + + + + 中国时间 + 中国标准时间 + 中国夏令时间 + + + CT(中国) + CST(中国) + CDT(中国) + + + + + 乔巴山时间 + 乔巴山标准时间 + 乔巴山夏令时间 + + + + + 哥伦比亚时间 + 哥伦比亚夏令时间 + + + + + 古巴时间 + 古巴标准时间 + 古巴夏令时间 + + + + + 达卡时间 + 达卡标准时间 + 达卡夏令时间 + + + + + 杜尚别时间 + 杜尚别标准时间 + 杜尚别夏令时间 + + + + + 荷属圭亚那时间 + 荷属圭亚那标准时间 + 荷属圭亚那夏令时间 + + + + + 东帝汶时间 + 东帝汶标准时间 + 东帝汶夏令时间 + + + + + 厄瓜多尔标准时间 + + + + + 中欧时间 + 中欧标准时间 + 中欧夏令时间 + + + + + 东欧时间 + 东欧标准时间 + 东欧夏令时间 + + + + + 西欧时间 + 欧洲西部时间 + 欧洲西部夏令时间 + + + 西欧时间 + 欧洲西部时间 + 欧洲西部夏令时间 + + + + + 法属圭亚那时间 + + + + + 伏龙芝时间 + 伏龙芝标准时间 + 伏龙芝夏令时间 + + + + + 格林尼治标准时间 + + true + + + + 加拉帕戈斯时间 + 加拉帕戈斯时间 + 加拉帕戈斯夏令时间 + + + 加拉帕哥斯时间 + 加拉帕戈斯时间 + 加拉帕哥斯夏令时间 + + + + + 格鲁吉亚时间 + 格鲁吉亚标准时间 + 格鲁吉亚夏令时间 + + + + + 格林兰中部时间 + 格林兰中部标准时间 + 格林兰中部夏令时间 + + + + + 格林兰东部时间 + 格林兰东部标准时间 + 格林兰东部夏令时间 + + + + + 格林兰西部时间 + 格林兰西部标准时间 + 格林兰西部夏令时间 + + + + + 关岛时间 + 关岛标准时间 + 关岛夏令时间 + + + 关岛时间 + 关岛标准时间 + 关岛夏令时间 + + + + + 海湾标准时间 + + + + + 盖亚那时间 + + + + + 夏威夷—阿留申标准时间 + + + 夏威夷—阿留申标准时间 + + + + + 香港时间 + 香港夏令时间 + + + + + 科布多时间 + 科布多夏令时间 + + + + + 印度标准时间 + + + + + 印度尼西亚中部标准时间 + + + + + 印度尼西亚东部标准时间 + + + + + 印度尼西亚西部标准时间 + + + + + 伊朗标准时间 + 伊朗夏令时间 + + + + + 伊尔库茨克时间 + 伊尔库茨克夏令时间 + + + + + 以色列时间 + 以色列标准时间 + 以色列夏令时间 + + + IST (Israel) + + + + + 日本時間 + 日本标准时间 + 日本夏令时间 + + + + + 卡拉奇时间 + 卡拉奇标准时间 + 卡拉奇夏令时间 + + + + + 喀什标准时间 + + + + + 哈萨克斯坦东部时间 + 哈萨克斯坦东部标准时间 + + + + + 哈萨克斯坦西部时间 + 哈萨克斯坦西部标准时间 + + + + + Kizilorda 时间 + Kizilorda 标准时间 + Kizilorda 夏令时间 + + + + + 韩国时间 + 韩国标准时间 + 韩国夏令时间 + + + + + 古比雪夫时间 + 古比雪夫时间 + 古比雪夫夏令时间 + + + 古比雪夫时间 + 古比雪夫夏令时间 + + + + + 夸贾林时间 + 夸贾林时间 + 夸贾林夏令时间 + + + 夸贾林时间 + + + + + Kyrgystan 时间 + Kyrgystan 标准时间 + Kyrgystan 夏令时间 + + + + + Lanka 时间 + Lanka 标准时间 + Lanka 夏令时间 + + + + + Long-Shu 时间 + Long-Shu 标准时间 + Long-Shu 夏令时间 + + + + + 罗德毫岛时间 + 罗德毫岛标准时间 + 罗德毫岛夏令时间 + + + 罗德毫岛标准时间 + + + + + 澳门时间 + 澳门标准时间 + 澳门夏令时间 + + + + + 马加丹时间 + 马加丹夏令时间 + + + + + 马来亚时间 + 马来亚标准时间 + 马来亚夏令时间 + + + + + 马来西亚时间 + 马来西亚标准时间 + 马来西亚夏令时间 + + + + + 马绍尔群岛时间 + 马绍尔群岛时间 + 马绍尔群岛夏令时间 + + + 马绍尔群岛时间 + + + + + 乌兰巴托时间 + 乌兰巴托标准时间 + 乌兰巴托夏令时间 + + + + + 莫斯科时间 + 莫斯科标准时间 + 莫斯科夏令时间 + + + + + 缅甸时间 + + + + + 尼泊尔时间 + + + + + 新西兰时间 + 新西兰标准时间 + 新西兰夏令时间 + + + 新西兰时间 + 新西兰标准时间 + 新西兰夏令时间 + + + + + 纽芬兰时间 + 纽芬兰标准时间 + 纽芬兰夏令时间 + + + 纽芬兰标准时间 + 纽芬兰夏令时间 + + + + + 费尔南多-迪诺罗尼亚岛时间 + 费尔南多-迪诺罗尼亚岛夏令时间 + + + + + 北马里亚纳群岛时间 + 北马里亚纳群岛时间 + 北马里亚纳群岛夏令时间 + + + + + 新西伯利亚时间 + 新西伯利亚夏令时间 + + + + + 鄂木斯克时间 + 鄂木斯克夏令时间 + + + + + 巴基斯坦时间 + 巴基斯坦标准时间 + 巴基斯坦夏令时间 + + + + + 巴拉圭时间 + 巴拉圭夏令时间 + + + + + 秘鲁时间 + 秘鲁夏令时间 + + + + + 菲律宾时间 + 菲律宾夏令时间 + + + + + 彼得岛和米克隆岛时间 + 彼得岛和米克隆岛标准时间 + 彼得岛和米克隆岛夏令时间 + + + + + 克孜勒奥尔达时间 + 克孜勒奥尔达标准时间 + 克孜勒奥尔达夏令时间 + + + + + 库页岛时间 + 库页岛夏令时间 + + + + + 萨马拉时间 + 萨马拉时间 + 萨马拉夏令时间 + + + 萨马拉时间 + 萨马拉夏令时间 + + + + + 撒马尔罕时间 + 撒马尔罕标准时间 + 撒马尔罕夏令时间 + + + + + 萨摩亚时间 + 萨摩亚标准时间 + 萨摩亚夏令时间 + + + 瑞典夏令时间 + + + + + 舍甫琴科时间 + 舍甫琴科夏令时间 + + + + + 新加坡标准时间 + + + + + 苏里南夏令时间 + 苏里南标准时间 + + + 苏里南夏令时间 + + + + + 斯维尔德洛夫斯克时间 + 斯维尔德洛夫斯克标准时间 + 斯维尔德洛夫斯克夏令时间 + + + + + 塔吉克斯坦时间 + 塔吉克斯坦标准时间 + 塔吉克斯坦夏令时间 + + + + + 塔什干时间 + 塔什干标准时间 + 塔什干夏令时间 + + + + + 第比利斯时间 + 第比利斯标准时间 + 第比利斯夏令时间 + + + + + 土耳其时间 + 土耳其时间 + 土耳其夏令时间 + + + 土耳其时间 + 土耳其夏令时间 + + + + + 土库曼斯坦时间 + 土库曼斯坦标准时间 + 土库曼斯坦夏令时间 + + + + + 乌拉尔斯克时间 + 乌拉尔斯克标准时间 + 乌拉尔斯克夏令时间 + + + + + 乌拉圭时间 + 乌拉圭夏令时间 + + + + + 乌鲁木齐时间 + 乌鲁木齐标准时间 + 乌鲁木齐夏令时间 + + + + + 乌兹别克斯坦时间 + 乌兹别克斯坦标准时间 + 乌兹别克斯坦夏令时间 + + + + + 委内瑞拉时间 + + + + + 海参崴时间 + 海参崴夏令时间 + + + + + 雅库茨克时间 + 雅库茨克夏令时间 + + + + + 叶卡捷琳堡时间 + 叶卡捷琳堡标准时间 + 叶卡捷琳堡夏令时间 + + + + + 埃里温时间 + 埃里温标准时间 + 埃里温夏令时间 + + + + + 育空时间 + 育空标准时间 + 育空夏令时间 + + + + + + + . + , + + + + + #,##0.### + + + + + + + #E0 + + + + + + + #,##0% + + + + + + + ¤#,##0.00 + + + + + + 安道尔比塞塔 + + + 阿联酋迪拉姆 + + + 阿富汗尼 (1927-2002) + + + 阿富汗尼 + + + 阿尔巴尼亚列克 + + + 亚美尼亚德拉姆 + + + 荷兰安替兰盾 + + + 安哥拉宽扎 + + + 安哥拉宽扎 (1977-1990) + + + 安哥拉新宽扎 (1990-2000) + + + 安哥拉宽扎 Reajustado (1995-1999) + + + 阿根廷奥斯特 + + + 阿根廷比索 (1983-1985) + + + 阿根廷比索 + + + 奥地利先令 + + + 澳大利亚元 + + + 阿鲁巴基尔德元 + + + 阿塞拜疆马纳特 (1993-2006) + + + 阿塞拜疆马纳特 + + + 波士尼亚-赫塞哥维纳第纳尔 + + + 波士尼亚-赫塞哥维纳兑换券 + + + 巴巴多斯元 + + + 孟加拉塔卡 + + + 比利时法郎兑换券 + + + 比利时法郎 + + + 比利时法郎(金融) + + + 保加利亚硬列弗 + + + 保加利亚新列弗 + + + 巴林第纳尔 + + + 布隆迪法郎 + + + 百慕大元 + + + 文莱元 + + + 玻利维亚诺 + + + 玻利维亚比索 + + + 玻利维亚 Mvdol(资金) + + + 巴西克鲁赛罗 Novo (1967-1986) + + + 巴西克鲁扎多 + + + 巴西克鲁塞罗 (1990-1993) + + + 巴西雷亚尔 + + + 巴西克鲁扎多 Novo + + + 巴西克鲁塞罗 + + + 巴哈马元 + + + 不丹努扎姆 + + + 缅元 + + + 博茨瓦纳普拉 + + + 白俄罗斯新卢布 (1994-1999) + + + 白俄罗斯卢布 + + + 伯利兹元 + + + 加拿大元 + + + 刚果法郎 + + + 瑞士法郎 + + + 智利 Unidades de Fomento(资金) + + + 智利比索 + + + 人民币 + ¥ + + + 哥伦比亚比索 + + + 哥斯达黎加科朗 + + + 旧塞尔维亚第纳尔 + + + 捷克硬克郎 + + + 古巴比索 + + + 佛得角埃斯库多 + + + 塞浦路斯镑 + + + 捷克克郎 + + + 东德奥斯特马克 + + + 德国马克 + + + 吉布提法郎 + + + 丹麦克朗 + + + 多米尼加比索 + + + 阿尔及利亚第纳尔 + + + 厄瓜多尔苏克雷 + + + 厄瓜多尔 Unidad de Valor Constante (UVC) + + + 爱沙尼亚克朗 + + + 埃及镑 + + + 厄立特里亚纳克法 + + + 西班牙比塞塔(帐户 A) + + + 西班牙比塞塔(兑换帐户) + + + 西班牙比塞塔 + + + 埃塞俄比亚比尔 + + + 欧元 + + + 芬兰马克 + + + 斐济元 + + + 福克兰镑 + + + 法国法郎 + + + 英镑 + + + 乔治亚库蓬拉瑞特 + + + 乔治亚拉瑞 + + + 加纳塞第 + + + 加纳塞地 + + + 直布罗陀镑 + + + 冈比亚达拉西 + + + 几内亚法郎 + + + 几内亚西里 + + + 赤道几内亚埃奎勒 + + + 希腊德拉克马 + + + 危地马拉格查尔 + + + 葡萄牙几内亚埃斯库多 + + + 几内亚比绍比索 + + + 圭亚那元 + + + 港元 + + + 洪都拉斯拉伦皮拉 + + + 克罗地亚第纳尔 + + + 克罗地亚库纳 + + + 海地古德 + + + 匈牙利福林 + + + 印度尼西亚盾 + + + 爱尔兰镑 + + + 以色列镑 + + + 以色列新谢克尔 + + + 印度卢比 + + + 伊拉克第纳尔 + + + 伊朗里亚尔 + + + 冰岛克朗 + + + 意大利里拉 + + + 牙买加元 + + + 约旦第纳尔 + + + 日元 + + + 肯尼亚先令 + + + 吉尔吉斯斯坦索姆 + + + 柬埔寨瑞尔 + + + 科摩罗法郎 + + + 朝鲜圆 + + + 韩圆 + ₩ + + + 科威特第纳尔 + + + 开曼元 + + + 哈萨克斯坦坚戈 + + + 老挝基普 + + + 黎巴嫩镑 + + + 斯里兰卡卢比 + + + 利比亚元 + + + 莱索托洛蒂 + + + 立陶宛立特 + + + 立陶宛塔咯呐司 + + + 卢森堡可兑换法郎 + + + 卢森堡法郎 + + + 卢森堡金融法郎 + + + 拉脱维亚拉特 + + + 拉脱维亚卢布 + + + 利比亚第纳尔 + + + 摩洛哥迪拉姆 + + + 摩洛哥法郎 + + + 摩尔多瓦列伊 + + + 马达加斯加阿里亚里 + + + 马达加斯加法郎 + + + 马其顿戴代纳尔 + + + 马里法郎 + + + 缅甸开亚特 + + + 蒙古图格里克 + + + 澳门元 + + + 毛里塔尼亚乌吉亚 + + + 马耳他里拉 + + + 马耳他镑 + + + 毛里求斯卢比 + + + 马尔代夫拉菲亚 + + + 马拉维克瓦查 + + + 墨西哥比索 + + + 墨西哥银比索 (1861-1992) + + + 墨西哥 Unidad de Inversion (UDI)(资金) + + + 马来西亚林吉特 + + + 莫桑比克埃斯库多 + + + 旧莫桑比克美提卡 + + + 莫桑比克美提卡 + + + 纳米比亚元 + + + 尼日利亚奈拉 + + + 尼加拉瓜科多巴 + + + 尼加拉瓜金科多巴 + + + 荷兰盾 + + + 挪威克朗 + + + 尼泊尔卢比 + + + 新西兰元 + + + 阿曼里亚尔 + + + 巴拿马巴波亚 + + + 秘鲁印第 + + + 秘鲁新索尔 + + + 秘鲁索尔 + + + 巴布亚新几内亚基那 + + + 菲律宾比索 + + + 巴基斯坦卢比 + + + 波兰兹罗提 + + + 波兰兹罗提 (1950-1995) + + + 葡萄牙埃斯库多 + + + 巴拉圭瓜拉尼 + + + 卡塔尔里亚尔 + + + 罗得西亚元 + + + 旧罗马尼亚列伊 + + + 罗马尼亚列伊 + + + 塞尔维亚第纳尔 + + + 俄国卢布 + + + 俄国卢布 (1991-1998) + + + 卢旺达法郎 + + + 沙特里亚尔 + + + 所罗门群岛元 + + + 塞舌尔卢比 + + + 苏丹第纳尔 + + + 苏丹镑 + + + 旧苏丹镑 + + + 瑞典克朗 + + + 新加坡元 + + + 圣赫勒拿群岛磅 + + + 斯洛文尼亚托拉尔 + + + 斯洛伐克克朗 + + + 塞拉利昂利昂 + + + 索马里先令 + + + 苏里南元 + + + 苏里南盾 + + + 圣多美和普林西比多布拉 + + + 苏联卢布 + + + 萨尔瓦多科朗 + + + 叙利亚镑 + + + 斯威士兰里兰吉尼 + + + 泰铢 + + + 塔吉克斯坦卢布 + + + 塔吉克斯坦索莫尼 + + + 土库曼斯坦马纳特 + + + 突尼斯第纳尔 + + + 汤加潘加 + + + 帝汶埃斯库多 + + + 土耳其里拉 + + + 新土耳其里拉 + + + 特立尼达和多巴哥元 + + + 新台币 + + + 坦桑尼亚先令 + + + 乌克兰格里夫尼亚 + + + 乌克兰币 + + + 乌干达先令 (1966-1987) + + + 乌干达先令 + + + 美元 + + + 美元(次日) + + + 美元(当日) + + + 乌拉圭新比索 (1975-1993) + + + 乌拉圭比索 + + + 乌兹别克斯苏姆 + + + 委内瑞拉博利瓦 + + + 委内瑞拉强势玻利瓦 + + + 越南盾 + + + 瓦努阿图瓦图 + + + 西萨摩亚塔拉 + + + 中非金融合作法郎 + + + 银 + + + 黄金 + + + 欧洲复合单位 + + + 欧洲货币联盟 + + + 欧洲计算单位 (XBC) + + + 欧洲计算单位 (XBD) + + + 东加勒比元 + + + 特别提款权 + + + 欧洲货币单位 + + + 法国金法郎 + + + 法国 UIC 法郎 + + + 非洲金融共同体法郎 + + + 钯 + + + 太平洋法郎 + + + 铂 + + + RINET 基金 + + + 为测试保留的代码 + + + 货币未知或无效 + + + 也门第纳尔 + + + 也门里亚尔 + + + 南斯拉夫硬第纳尔 + + + 南斯拉夫偌威第纳尔 + + + 南斯拉夫可兑换第纳尔 + + + 南非兰特 (金融) + + + 南非兰特 + + + 赞比亚克瓦查 + + + 新扎伊尔 + + + 扎伊尔 + + + 津巴布韦元 + + + + + + {0}日 + + + {0}小时 + + + {0}分 + + + {0}月 + + + {0}秒 + + + {0}周 + + + {0}年 + + + + + 是:确定 + 否:否定 + + + + diff --git a/lib/zend/Zend/Locale/Data/zh_CN.xml b/lib/zend/Zend/Locale/Data/zh_CN.xml new file mode 100644 index 0000000000..c6eb9e26c9 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/zh_CN.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/zh_HK.xml b/lib/zend/Zend/Locale/Data/zh_HK.xml new file mode 100644 index 0000000000..e2b555924e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/zh_HK.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/zend/Zend/Locale/Data/zh_Hans.xml b/lib/zend/Zend/Locale/Data/zh_Hans.xml new file mode 100644 index 0000000000..160a73d04d --- /dev/null +++ b/lib/zend/Zend/Locale/Data/zh_Hans.xml @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 東非 + 非洲南部 + 東亞 + 南亞 + 東南亞 + 南歐 + 澳洲與紐西蘭 + 美拉尼西亞 + 密克羅尼西亞 + 玻里尼西亞 + 中南亞 + 亞洲 + 中亞 + 西亞 + 歐洲 + 東歐 + 北歐 + 西歐 + 獨立國協 + 海峽群島 + 安道爾 + 阿拉伯聯合大公國 + 安地卡及巴布達 + 安圭拉島 + 阿爾巴尼亞 + 亞美尼亞 + 荷屬安地列斯 + 南極洲 + 美屬薩摩亞群島 + 奧地利 + 澳洲 + 阿路巴 + 亞蘭群島 + 亞塞拜然 + 波士尼亞與赫塞格維納 + 巴貝多 + 孟加拉 + 比利時 + 布吉納法索 + 保加利亞 + 蒲隆地 + 貝南 + 聖巴瑟米 + 百慕達 + 汶萊 + 玻利維亞 + 巴哈馬 + 布威島 + 波札那 + 白俄羅斯 + 貝里斯 + 可可斯群島 + 剛果民主共和國 + 中非共和國 + 剛果 + 科特迪瓦 + 庫克群島 + 喀麥隆 + 中華人民共和國 + 哥倫比亞 + 哥斯大黎加 + 塞爾維亞和蒙特尼哥羅 + 維德角 + 聖誕島 + 賽普勒斯 + 捷克共和國 + 德國 + 吉布地 + 丹麥 + 多明尼加 + 多明尼加共和國 + 阿爾及利亞 + 厄瓜多 + 愛沙尼亞 + 厄利垂亞 + 衣索比亞 + 芬蘭 + 斐濟 + 福克蘭群島 + 密克羅尼西亞群島 + 法羅群島 + 法國 + 加彭 + 英國 + 格瑞納達 + 喬治亞共和國 + 法屬圭亞那 + 根西島 + 迦納 + 直布羅陀 + 格陵蘭 + 甘比亞 + 幾內亞 + 哥德普洛 + 赤道幾內亞 + 希臘 + 南喬治亞與南三明治群島 + 瓜地馬拉 + 關島 + 幾內亞比索 + 蓋亞納 + 中華人民共和國香港特別行政區 + 赫德與麥克當諾群島 + 宏都拉斯 + 克羅埃西亞 + 印尼 + 愛爾蘭 + 曼島 + 英屬印度洋領土 + 冰島 + 義大利 + 澤西島 + 牙買加 + 約旦 + 肯亞 + 吉爾吉斯 + 吉里巴斯 + 科摩羅群島 + 聖克里斯多福及尼維斯 + 北韓 + 南韓 + 開曼群島 + 哈薩克 + 寮國 + 聖露西亞 + 列支敦斯登 + 斯里蘭卡 + 賴比瑞亞 + 賴索扥 + 盧森堡 + 拉脫維亞 + 利比亞 + 摩納哥 + 摩爾多瓦 + 蒙特內哥羅 + 聖馬丁 + 馬達加斯加 + 馬紹爾群島 + 馬其頓 + 馬利 + 緬甸 + 中華人民共和國澳門特別行政區 + 北馬里亞納群島 + 馬丁尼克島 + 茅利塔尼亞 + 蒙特色拉特島 + 馬爾他 + 模里西斯 + 馬爾地夫 + 馬拉威 + 馬來西亞 + 莫三比克 + 納米比亞 + 新喀里多尼亞群島 + 尼日 + 諾福克島 + 奈及利亞 + 荷蘭 + 尼泊爾 + 諾魯 + 紐威島 + 紐西蘭 + 阿曼王國 + 巴拿馬 + 秘魯 + 法屬玻里尼西亞 + 巴布亞紐幾內亞 + 菲律賓 + 波蘭 + 聖彼德與密啟崙 + 皮特康 + 巴勒斯坦 + 帛琉 + 卡達 + 大洋洲邊疆群島 + 歐盟 + 留尼旺 + 羅馬尼亞 + 塞爾維亞 + 俄羅斯 + 盧安達 + 沙烏地阿拉伯 + 索羅門群島 + 塞席爾 + 蘇丹 + 聖赫勒拿島 + 斯洛維尼亞 + 冷岸及央麥恩群島 + 獅子山 + 聖馬利諾 + 塞內加爾 + 索馬利亞 + 蘇利南 + 聖多美及普林西比 + 薩爾瓦多 + 敘利亞 + 史瓦濟蘭 + 土克斯及開科斯群島 + 查德 + 法屬南方屬地 + 多哥共和國 + 泰國 + 塔吉克 + 托克勞群島 + 東帝汶 + 土庫曼 + 突尼西亞 + 東加 + 千里達及托巴哥 + 吐瓦魯 + 台灣 + 坦尚尼亞 + 烏克蘭 + 烏干達 + 美屬邊疆群島 + 美國 + 烏拉圭 + 烏茲別克 + 梵蒂岡 + 聖文森及格瑞那丁 + 委內瑞拉 + 英屬維京群島 + 美屬維京群島 + 萬那杜 + 瓦利斯和福杜納群島 + 薩摩亞群島 + 葉門 + 馬約特 + 尚比亞 + 辛巴威 + 未確定的區域 + + + 傳統德語拼字學 + 1996 年的德語拼字學 + 亞美尼亞東部 + 亞美尼亞西部 + IPA 拼音 + UPA 拼音 + 單音 + Natisone 方言 + 電腦 + 已修訂的拼字學 + SAAHO + + + 日曆 + 校對 + 貨幣 + + + 繁體中文排序 - Big5 + 佛教曆法 + 農曆 + 直接排序 + 簡體中文排序 - GB2312 + 公曆 + 希伯來曆法 + 印度國家曆法 + 伊斯蘭曆法 + 伊斯蘭城市曆法 + 日本曆法 + 電話簿排序 + 拼音排序 + 中華民國曆 + 筆劃排序 + 傳統排序 + + + 語言:{0} + 文字:{0} + 地區:{0} + + + + [一 丁 七 丈-不 且 世 丘 丙 丟 並 中 串 丸 丹 主 乃 久 么 之 乎 乏 乖 乘 乙 九 也 乾 亂 了 予 事 二 于 云 互 五 井 些 亞 亡 交 亦 亨 享 京 亮 人 什 仁 仇 今 介 仍 仔 他 付 仙 代-以 仰 仲 件 任 份 企 伊 伍 伐 休 伙 伯 估 伴 伸 似 伽 但 佈 位-住 佔 何 余 佛 作 你 佩 佳 使 來 例 供 依 侯 侵 便 係-俄 俊 俗 保 俠 信 修 俱 俾 個 倍 們 倒 候 倚 借 倫 值 假 偉 偏 做 停 健 側-偷 傑 備 傢 傲 傳 傷 傻 傾 僅 像 僑 僧 價 儀 億 儒 儘 優 允 元-充 兇-光 克 免 兒 兔 入 內-兩 八-兮 共 兵-典 兼 冊 再 冒 冠 冬 冰 冷 准 凌 凝 凡 凰 凱 出 函 刀 分 切 刊 列 初 判 別 利 刪 到 制 刷 刺 刻 則 前 剛 剩 剪 副 割 創 劃 劇 劉 劍 力 功 加 助-劫 勁 勇 勉 勒 動 務 勝 勞 勢 勤 勵 勸 勿 包 匈 化 北 匹 區 十 千 升 午 半 卒-協 南 博 卡 印 危 即 卷 卻 厄 厘 厚 原 厭 厲 去 參 又 及 友 反 叔 取 受 口-另 叫-叭 可 台 史 右 司 吃 各 合-吊 同-后 吐 向 君 吝-吟 否 吧 含 吳 吵 吸 吹 吾 呀 呂 呆 告 呢 周 味 呵 呼 命 和 咖 咦 咧 咪 咬 咱 哀 品 哇-哉 哎 員 哥 哦 哩 哪 哭 哲 唉 唐 唬 售 唯 唱 唷 唸 商 啊 問 啟 啡 啥 啦 啪 喀 喂 善 喇 喊 喔 喜 喝 喬 單 喵 嗎 嗚 嗨 嗯 嘆 嘉 嘗 嘛 嘴 嘻 嘿 器 噴 嚇 嚴 囉 四 回 因 困 固 圈 國 圍 園 圓 圖 團 圜 土 在 圭 地 圾 址 均 坎 坐 坡 坤 坦 坪 垂 垃 型 埃 城 埔 域 執 培 基 堂 堅 堆 堡 堪 報 場 塊 塔 塗 塞 填 塵 境 增 墨 墮 壁 壓 壘 壞 壢 士 壯 壽 夏 夕 外 多 夜 夠 夢 夥 大 天-夫 央 失 夷 夸 夾 奇-奉 奎 奏 契 奔 套 奧 奪 奮 女 奴 奶 她 好 如 妙 妥 妨 妮 妳 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娘 婁 婆 婚 婦 媒 媽 嫌 嫩 子 孔 字 存 孝 孟 季 孤 孩 孫 學 它 宅 宇-安 宋 完 宏 宗-宜 客-室 宮 害 家 容 宿 寂 寄 密 富 寒 寞 察 寢 實-審 寫 寬 寮 寶 封 射 將 專 尊 尋 對-小 少 尖 尚 尤 就 尺 尼 尾 局 屁 居 屆 屋 屏 展 屠 層 屬 山 岡 岩 岸 峰 島 峽 崇 崙 崴 嵐 嶺 川 州 巡 工-巨 巫 差 己 已 巴 巷 市 布 希 帕 帛 帝 帥 師 席 帳 帶 常 帽 幅 幕 幣 幫 干-年 幸 幹 幻-幾 床 序 底 店 府 度 座 庫 庭 康 庸 廉 廖 廠 廢 廣 廳 延 廷 建 弄 式 引 弗 弘 弟 弦 弱 張 強 彈 彊 彌 彎 彞 形 彥 彩 彬 彭 彰 影 役 彼 往 征 待 很 律 後 徐-徒 得 從 復 微 徵 德 徹 心 必 忌 忍 志-忙 忠 快 念 忽 怎 怒 怕 怖 思 怡 急 性 怨 怪 恆 恐 恢 恥 恨 恩 恭 息 恰 悅 悉 悔 悟 悠 您 悲 悶 情 惑 惜 惠 惡 惱 想 惹 愁 愈 愉 意 愚 愛 感 慈 態 慕 慘 慢 慣 慧 慮 慰 慶 慾 憂 憐 憑 憲 憶 憾 懂 應 懶 懷 懼 戀 戈 成-戒 或 截 戰 戲 戴 戶 房-扁 扇 手 才 扎 打 托 扣 扥 扭 扯 批 找-技 抄 把 抓 投 抗 折 披 抬 抱 抵 抹 抽 拆 拉 拋 拍 拒 拔 拖 招 拜 括 拳 拼 拾 拿 持 指 按 挑 挖 挪 振 挺 捐 捕 捨 捲 捷 掃 授 掉 掌 排 掛 採 探 接 控 推 措 描 提 插 揚 換 握 揮 援 損 搖 搞 搬 搭 搶 摘 摩 摸 撐 撒 撞 撣 撥 播 撾 撿 擁 擇 擊 擋 操 擎 擔 據 擠 擦 擬 擴 擺 擾 攝 支 收 改 攻 放 政 故 效 敍 敏 救 敗-教 敝 敢 散 敦 敬 整 敵 數 文 斐 斗 料 斯 新 斷 方 於 施 旁 旅 旋 族 旗 既 日 旦 早 旭 旺 昂 昆 昇 昌 明 昏 易 星 映 春 昨 昭 是 時 晉 晒 晚 晨 普 景 晴 晶 智 暑 暖 暗 暫 暴 曆 曉 曰 曲 更 書 曼 曾-最 會 月 有 朋 服 朗 望 朝 期 木 未-札 朱 朵 杉 李 材 村 杜 束 杯-東 松 板 析 林 果 枝 架 柏 某 染 柔 查 柬 柳 柴 校 核 根 格 桃 案 桌 桑 梁 梅 條 梨 梯 械 梵 棄 棉 棋 棒 棚 森 椅 植 椰 楊 楓 楚 業 極 概 榜 榮 構 槍 樂 樓 標 樞 模 樣 樹 橋 機 橫 檀 檔 檢 欄 權 次 欣 欲 欺 欽 款 歉 歌 歐 歡-武 歲 歷 歸 死 殊 殘 段 殺 殼 毀 毅 母 每 毒 比 毛 毫 氏 民 氣 水 永 求 汗 汝 江-污 汪 汶 決 汽 沃 沈 沉 沒 沖 沙 河 油 治 沿 況 泉 泊 法 泡 波 泥 注 泰 泳 洋 洗 洛 洞 洩 洪 洲 活 洽 派 流 浦 浩 浪 浮 海 涇-涉 涯 液 涵 涼 淑 淚 淡 淨 深 混 淺 清 減 渡 測 港 游 湖 湯 源 準 溝 溪 溫 滄 滅 滋 滑 滴 滾 滿 漂 漏 演 漠 漢 漫 漲 漸 潔 潘 潛 潮 澤 澳 激 濃 濟 濤 濫 濱 灌 灣 火 灰 災 炎 炮 炸 為 烈 烏 烤 無 焦 然 煙 煞 照 煩 熊 熟 熱 燃 燈 燒 營 爆 爐 爛 爪 爬 爭 爵 父 爸 爺 爽 爾 牆-版 牌 牙 牛 牠 牧 物 牲 特 牽 犧 犯 狀 狂 狐 狗 狠 狼 猛 猜 猶 獄 獅 獎 獨 獲 獸 獻 玄 率 玉 王 玩 玫 玲 玻 珊 珍 珠 班 現 球 理 琉 琪 琴 瑙 瑜 瑞 瑟 瑤 瑪 瑰 環 瓜 瓦 瓶 甘 甚 甜 生 產 用 田-申 男 甸 界 留 畢 略 番 畫 異 當 疆 疏 疑 疼 病 痕 痛 痴 瘋 療 癡 登-百 的 皆 皇 皮 盃 益 盛 盜 盟 盡 監 盤 盧 目 盲 直 相 盼 盾 省 眉 看 真 眠 眼 眾 睛 睡 督 瞧 瞭 矛 矣 知 短 石 砂 砍 研 砲 破 硬 碎 碗 碟 碧 碩 碰 確 碼 磁 磨 磯 礎 礙 示 社 祕 祖 祝 神 祥 票 禁 禍 福 禪 禮 秀 私 秋 科 秒 秘 租 秤 秦 移 稅 程 稍 種 稱 稿 穆 穌 積 穩 究 穹 空 穿 突 窗 窩 窮 立 站 竟 章 童 端 競 竹 笑 笛 符 笨 第 筆 等 筋 答 策 简 算 管 箭 箱 節 範 篇 築 簡 簫 簽 簿 籃 籌 籍 米 粉 粗 精 糊 糕 糟 系 糾 紀 約 紅 納 紐 純 紙-紛 素 索 紫 累 細 紹 終 組 結 絕 絡 給 統 絲 經 綜 綠 維 綱 網 緊 緒 線 緣 編 緩 緬 緯 練 縣 縮 縱 總 績 繁 織 繞 繪 繳 繼 續 缸 缺 罕 罪 置 罰 署 罵 罷 羅 羊 美 羞 群 義 羽 翁 習 翔 翰 翹 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 聖 聚 聞 聯 聰 聲 職 聽 肉 肚 股 肥 肩 肯 育 背 胎 胖 胞 胡 胸 能 脆 脫 腓 腔 腦 腰 腳 腿 膽 臉 臘 臣 臥 臨 自 臭 至 致 臺 與-舊 舌 舍 舒 舞 舟 航 般 船 艦 良 色 艾 芝 芬 花 芳 若 苦 英 茅 茫 茲 茶 草 荒 荷 莉 莊 莎 莫 菜 菩 華 菲 萄 萊 萬 落 葉 著 葛 葡 蒂 蒙 蒲 蒼 蓋 蓮 蔕 蔡 蔣 蕭 薄 薦 薩 薪 藉 藍 藏 藝 藤 藥 蘆 蘇 蘭 虎 處 虛 號 虧 蛋 蛙 蜂 蜜 蝶 融 螢 蟲 蟹 蠍 蠻 血 行 術 街 衛 衝 衡 衣 表 袋 被 裁 裂 裕 補 裝 裡 製 複 褲 西 要 覆 見 規 視 親 覺 覽 觀 角 解 觸 言 訂 計 訊 討 訓 託 記 訪 設 許 訴 註 証 評 詞 詢 試 詩 話-詳 誇 誌 認 誓 誕 語 誠 誤 說 誰 課 誼 調 談 請 諒 論 諸 諺 諾 謀 謂 講 謝 證 識 譜 警 譯 議 護 譽 讀 變 讓 讚 谷 豆 豈 豐 象 豪 豬 貌 貓 貝 貞 負-貢 貨 貪-責 貴 買 費 貼 賀 資 賈 賓 賜 賞 賢-賤 賦 質 賭 賴 賺 購 賽 贈 贊 贏 赤 赫 走 起 超 越 趕 趙 趣 趨 足 跌 跎 跑 距 跟 跡 路 跳 踏 踢 蹟 蹤 躍 身 躲 車 軌 軍 軒 軟 較 載 輔 輕 輛 輝 輩 輪 輯 輸 轉 轟 辛 辦 辨 辭 辯 辱 農 迅 迎 近 迦 迪 迫 述 迴 迷 追 退 送 逃 逆 透 逐 途 這-逛 逝 速 造 逢 連 週 進 逸 逼 遇 遊 運 遍 過 道-違 遙 遜 遠 適 遭 遮 遲 遷 選 遺 避-邁 還 邊 邏 那 邦 邪 邱 郎 部 郭 郵 都 鄂 鄉 鄭 鄰 配 酒 酷 酸 醉 醒 醜 醫 采 釋-量 金 針 釣 鈴 銀 銖 銘 銳 銷 鋒 鋼 錄 錢 錦 錫 錯 鍋 鍵 鍾 鎊 鎖 鎮 鏡 鐘 鐵 鑑 長 門 閃 閉 開 閒 間 閣 閱 闆 闊 闐 關 闡 防 阻 阿 陀 附 降 限 院-除 陪 陰 陳 陵-陸 陽 隆 隊 階 隔 際 障 隨 險 隱 隻 雄-集 雖 雙 雜 雞 離 難 雨 雪 雲 零 雷 電 需 震 霍 霧 露 霸 霹 靂 靈 青 靖 靜 非 靠 面 革 靼 鞋 韃 韋 韓 音 韻 響 頁 頂 項 順 須 預 頑 頓 頗 領 頭 頻 顆 題 額 顏 願 類 顧 顯 風 飄 飛 食 飯 飲 飽 飾 餅 養 餐 餘 館 首 香 馬 駐 駕 駛 騎 騙 騷 驅 驗 驚 骨 體 高 髮 鬆 鬥 鬧 鬱 鬼 魁 魂 魅 魔 魚 魯 鮮 鳥 鳳 鳴 鴻 鵝 鷹 鹿 麗 麥 麵 麻 麼 黃 黎 黑 默 點 黨 鼓 鼠 鼻 齊 齋 齒 齡 龍 龜] + [伏 侶 兌 兹 别 勳 卑 占 叶 堤 墎 奥 孜 峇 巽 彝 彞 敍 楔 渾 燦 狄 琳 瑚 甫 礁 简 芒 苗 茨 蚩 蜀 隴] + + + 「 + 」 + 『 + 』 + + + + + 上午 + 下午 + + + + EEEEy'x'G-Ml-d + + + + + + + + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + + + + + + 週日 + 週一 + 週二 + 週三 + 週四 + 週五 + 週六 + + + 星期日 + 星期一 + 星期二 + 星期三 + 星期四 + 星期五 + 星期六 + + + + + 日 + 一 + 二 + 三 + 四 + 五 + 六 + + + + + + + 第1季 + 第2季 + 第3季 + 第4季 + + + + + + 西元前 + 西元 + + + + + + yyyy/M/d + + + + + yy/M/d + + + + + + + zzzzah時mm分ss秒 + + + + + zah時mm分ss秒 + + + + + ah:mm:ss + + + + + + d日(E) + H時 + H:mm + H:mm:ss + M-d(E) + MMMMd日(E) + MM/dd + M/d + yyyy/M + yyyy/M/d(EEE) + y年M月 + y年M月d日EEE + y年M月 + yyyy/MM + + + {0}至{1} + + M月至M月 + + + M/dE至M/dE + M/dE至M/dE + + + LLLL至LLLL + + + M/d至M/d + M/d至M/d + + + ah時至ah時 + ah時至h時 + + + vah時至ah時 + vah時至h時 + + + yyyy/M至yyyy/M + yyyy/M至yyyy/M + + + yyyy/M/dE至yyyy/M/dE + yyyy/M/dE至yyyy/M/dE + yyyy/M/dE至yyyy/M/dE + + + y年M月至M月 + y/M至y/M + + + yyyy/M/d至yyyy/M/d + yyyy/M/d至yyyy/M/d + yyyy/M/d至yyyy/M/d + + + + + + 年代 + + + 週 + + + 大前天 + 前天 + 昨天 + 今天 + 明天 + 後天 + 大後天 + + + 週天 + + + 上午/下午 + + + 小時 + + + 分鐘 + + + 秒 + + + 區域 + + + + + 上午 + 下午 + + + 民國前 + 民國 + + + + + + Gy/M/d + + + + + Gy/M/d + + + + + + M月d日EEE + M月d日 + Gy + y/M + y/M/d(EEE) + y/MM + Gy年M月 + Gy年M月d日EEE + y年第Q季度 + Gy QQQ + + + + + + +HH:mm;-HH:mm + GMT{0} + GMT + {0}時間 + {1}({0}) + + 未知地區 + + + 安道爾 + + + 杜拜 + + + 阿富汗 + + + 安地卡及巴布達 + + + 安吉拉 + + + 阿爾巴尼亞 + + + 亞美尼亞 + + + 荷屬安地列斯 + + + 安哥拉 + + + 羅瑟拉 + + + 帕麥 + + + 南極 + + + 昭和 + + + 戴維斯 + + + 莫斯托克 + + + 凱西 + + + 杜蒙杜爾維爾 + + + 麥克馬多 + + + 加拉哥斯 + + + 門多薩 + + + 聖胡安 + + + 烏斯懷亞 + + + 拉略哈 + + + 聖路易 + + + 卡塔馬卡 + + + 胡韋 + + + 吐庫曼 + + + 哥多華 + + + 布宜諾斯艾利斯 + + + 派哥派哥 + + + 奧地利 + + + 伯斯 + + + 達爾文 + + + 阿得雷德 + + + 斷丘市 + + + 克黎 + + + 墨爾本 + + + 荷巴特 + + + 雪梨 + + + 布利斯班 + + + 羅豪島 + + + 阿魯巴 + + + 奧蘭群島 + + + 亞塞拜然 + + + 沙拉耶佛 + + + 巴貝多 + + + 孟加拉 + + + 布魯塞爾 + + + 布吉納法索 + + + 保加利亞 + + + 蒲隆地 + + + 貝南 + + + 百慕達 + + + 汶萊 + + + 玻利維亞 + + + 艾魯內佩 + + + 布蘭科 + + + 維留港 + + + 保維斯塔 + + + 瑪瑙斯 + + + 古雅巴 + + + 格蘭場 + + + 貝倫 + + + 阿拉圭那 + + + 聖保羅 + + + 巴伊阿 + + + 福塔力莎 + + + 馬瑟歐 + + + 雷西非 + + + 諾倫哈 + + + 巴哈馬 + + + 不丹 + + + 波札那 + + + 白俄羅斯 + + + 貝里斯 + + + 道生河 + + + 懷特霍斯 + + + 伊奴維克 + + + 溫哥華 + + + 道生灣 + + + 耐羅耐佛 + + + 艾德蒙吞 + + + 瑞夫卡倫特 + + + 劍橋灣 + + + 利宅那 + + + 溫尼伯 + + + 羅斯魯特 + + + 雨河鎮 + + + 蘭今灣 + + + 珊德灣 + + + 尼皮岡 + + + 多倫多 + + + 蒙特婁 + + + 伊魁特 + + + 潘尼爾東 + + + 蒙克頓 + + + 哈里法克斯 + + + 鵝灣 + + + 格雷斯貝 + + + 白朗薩布隆 + + + 聖約翰 + + + 科科斯群島 + + + 金夏沙 + + + 蘆佈巴西 + + + 中非共和國 + + + 剛果共和國 + + + 瑞士 + + + 象牙海岸 + + + 拉洛東加島 + + + 復活島 + + + 聖地牙哥 + + + 喀麥隆 + + + 喀什米爾 + + + 烏魯木齊 + + + 重慶 + + + 哈爾濱 + + + 哥倫比亞 + + + 哥斯大黎加 + + + 古巴 + + + 維德角 + + + 聖誕島 + + + 塞浦勒斯 + + + 捷克 + + + 德國 + + + 吉布地 + + + 丹麥 + + + 多明尼加 + + + 多明尼加共和國 + + + 阿爾及利亞 + + + 加拉巴哥群島 + + + 瓜亞基爾 + + + 愛沙尼亞 + + + 埃及 + + + 西撒哈拉 + + + 厄利垂亞 + + + 加納利 + + + 休達 + + + 馬德里 + + + 衣索比亞 + + + 芬蘭 + + + 斐濟 + + + 史坦萊 + + + 土魯克群島 + + + 波納佩 + + + 科斯里 + + + 法羅群島 + + + 加彭 + + + 倫敦 + + + 格瑞納達 + + + 喬治亞 + + + 法屬蓋亞那 + + + 根息 + + + 迦納 + + + 直布羅陀 + + + 杜里 + + + 高特哈市 + + + 斯可比海峽 + + + 丹馬沙文 + + + 斑竹 + + + 幾內亞 + + + 瓜德羅普 + + + 赤道幾內亞 + + + 希臘 + + + 南喬治亞與南三明治島 + + + 瓜地馬拉 + + + 關島 + + + 幾內亞比索 + + + 圭亞那 + + + 中華人民共和國香港特別行政區 + + + 德古斯加巴 + + + 克羅埃西亞 + + + 海地 + + + 匈牙利 + + + 雅加達 + + + 馬卡沙爾 + + + 加亞布拉 + + + 愛爾蘭 + + + 印度 + + + 英屬印度洋領地 + + + 伊拉克 + + + 伊朗 + + + 冰島 + + + 羅馬 + + + 牙買加 + + + 約旦 + + + 東京 + + + 奈洛比 + + + 吉爾吉斯 + + + 柬埔寨 + + + 恩得伯理島 + + + 吉里巴斯 + + + 科摩羅群島 + + + 聖啟斯與尼維斯 + + + 北韓 + + + 首爾 + + + 開曼 + + + 艾克陶 + + + 奧拉爾 + + + 阿克糾賓 + + + 奎茲羅答 + + + 阿拉木圖 + + + 寮國 + + + 貝鲁特特 + + + 聖露西亞 + + + 列支敦斯登 + + + 可倫坡 + + + 蒙羅維亞 + + + 賴索托 + + + 立陶宛 + + + 盧森堡 + + + 拉脫維亞 + + + 利比亞 + + + 卡薩布蘭卡 + + + 摩納哥 + + + 奇西瑙 + + + 波多里察 + + + 馬達加斯加 + + + 瓜加林島 + + + 馬朱諾 + + + 斯科普耶 + + + 巴馬科 + + + 緬甸 + + + 烏蘭巴托 + + + 卓巴爾塞 + + + 中華人民共和國澳門特別行政區 + + + 北馬里亞納群島 + + + 馬丁尼克 + + + 茅利塔尼亞 + + + 蒙賽拉特 + + + 馬爾他 + + + 模里西斯 + + + 馬爾地夫 + + + 馬拉威 + + + 提華納 + + + 厄莫休 + + + 馬薩特蘭 + + + 奇華華 + + + 蒙特瑞 + + + 墨西哥市 + + + 美里達 + + + 康庫 + + + 古晉 + + + 莫三比克 + + + 溫荷克 + + + 新喀里多尼亞 + + + 尼日 + + + 諾福克群島 + + + 奈及利亞 + + + 尼加拉瓜 + + + 荷蘭 + + + 奧斯陸 + + + 尼泊爾 + + + 諾魯 + + + 紐埃 + + + 查坦 + + + 奧克蘭 + + + 阿曼 + + + 巴拿馬 + + + 秘魯 + + + 大溪地 + + + 馬可薩斯島 + + + 岡必爾群島 + + + 巴布亞新幾內亞 + + + 菲律賓 + + + 喀拉蚩 + + + 波蘭 + + + 聖皮里及米圭隆 + + + 匹特開恩群島 + + + 加薩 + + + 亞速爾群島 + + + 馬得拉群島 + + + 帛琉 + + + 巴拉圭 + + + 卡達 + + + 留尼旺島 + + + 塞爾維亞 + + + 加里寧格勒 + + + 伏爾加格勒 + + + 沙馬拉 + + + 葉卡捷林堡 + + + 新西伯利亞 + + + 克拉斯諾雅斯克 + + + 伊爾庫次克 + + + 雅庫次克 + + + 海參崴 + + + 庫頁島 + + + 馬加丹 + + + 堪查加 + + + 阿那底河 + + + 盧安達 + + + 利雅德 + + + 瓜達卡納 + + + 塞席爾 + + + 卡土穆 + + + 斯德哥爾摩 + + + 聖赫勒拿島 + + + 斯洛維尼亞 + + + 隆意耳拜恩 + + + 布拉提拉瓦 + + + 獅子山 + + + 聖馬利諾 + + + 塞內加爾 + + + 摩加迪休 + + + 巴拉馬利波 + + + 聖多美普林西比 + + + 薩爾瓦多 + + + 敘利亞 + + + 史瓦濟蘭 + + + 土克斯和開卡斯群島 + + + 恩加納美 + + + 克格連群島 + + + 多哥 + + + 泰國 + + + 塔吉克 + + + 托克勞 + + + 東帝汶 + + + 土庫曼 + + + 坦尚尼亞 + + + 東加 + + + 伊斯坦堡 + + + 千里達 + + + 吐瓦魯 + + + 台灣 + + + 尚尼亞 + + + 烏茲哥洛 + + + 基輔 + + + 辛非洛浦 + + + 札波羅結 + + + 康培拉 + + + 中途島 + + + 強斯頓 + + + 艾達克 + + + 諾姆 + + + 安克里治 + + + 雅庫塔 + + + 朱諾 + + + 洛杉磯 + + + 波伊斯 + + + 鳳凰城 + + + 船岩峰 + + + 紐沙倫,北達科他州 + + + 申特城 + + + 美諾米克 + + + 溫森斯 + + + 彼得堡,印第安那州 + + + 泰爾城 + + + 諾克斯 + + + 威納麥克,印第安那州 + + + 馬倫哥 + + + 印第安那波里斯 + + + 路易斯維爾 + + + 維威 + + + 蒙提瑟洛 + + + 紐約 + + + 烏拉圭 + + + 撒馬爾罕 + + + 梵蒂岡 + + + 聖文森 + + + 卡拉卡斯 + + + 托托拉島 + + + 美屬維京群島 + + + 越南 + + + 愛發提 + + + 瓦利斯與富圖納群島 + + + 亞庇 + + + 葉門 + + + 馬約特島 + + + 南非 + + + 尚比亞 + + + 辛巴威 + + + + 艾克時間 + 艾克夏令時間 + + + ACT(艾克) + ACST(艾克) + + + + + 中非時間 + + + + + 東非時間 + + + + + 南非標準時間 + + + + + 西非時間 + 西非夏令時間 + + + + + 阿克秋賓斯克時間 + 阿克秋賓斯克夏令時間 + + + + + 阿拉斯加時間 + 阿拉斯加標準時間 + 阿拉斯加夏令時間 + + + AKST + AKDT + + + + + 阿拉斯加-夏威夷時間 + 阿拉斯加-夏威夷標準時間 + 阿拉斯加-夏威夷夏令時間 + + + + + 阿拉木圖時間 + 阿拉木圖夏令時間 + + + + + 亞馬遜時間 + 亞馬遜夏令時間 + + + + + 中部時間 + 中部標準時間 + 中部夏令時間 + + + + + 東部時間 + 東部標準時間 + 東部夏令時間 + + + + + 山區時間 + 山區標準時間 + 山區日光節約時間 + + + + + 太平洋時間 + 太平洋標準時間 + 太平洋夏令時間 + + + + + 阿克陶時間 + 阿克陶夏令時間 + + + AQTT (阿克陶) + AQTST (阿克陶) + + + + + 阿克托比時間 + 阿克托比夏令時間 + + + AQTT (阿克托比) + AQTST (阿克托比) + + + + + 阿拉伯時間 + 阿拉伯標準時間 + 阿拉伯夏令時間 + + + AT(阿拉伯) + AST(阿拉伯) + ADT (阿拉伯) + + + + + 阿根廷時間 + 阿根廷夏令時間 + + + + + 阿根廷西部時間 + 阿根廷西部時間 + 阿根廷西部夏令時間 + + + + + 亞美尼亞時間 + 亞美尼亞夏令時間 + + + AMT(亞美尼亞) + AMST(亞美尼亞) + + + + + 阿什哈巴德時間 + 阿什哈巴德夏令時間 + + + + + 大西洋時間 + 大西洋標準時間 + 大西洋夏令時間 + + + + + 澳洲中部時間 + 澳洲中部標準時間 + 澳洲中部夏令時間 + + + + + 澳洲東部時間 + 澳洲東部標準時間 + 澳洲東部夏令時間 + + + + + 澳洲西部時間 + 澳洲西部標準時間 + 澳洲西部夏令時間 + + + + + 亞塞拜然時間 + 亞塞拜然夏令時間 + + + + + 亞速爾群島時間 + 亞速爾群島夏令時間 + + + + + 巴庫時間 + 巴庫夏令時間 + + + BAKT + BAKST + + + + + 孟加拉時間 + + + BDT + + + + + 白令時間 + 白令標準時間 + 白令夏令時間 + + + BT(白令) + BST(白令) + BDT(白令) + + + + + 不丹時間 + + + BTT + + + + + 婆羅洲時間 + 婆羅洲夏令時間 + + + + + 巴西利亞時間 + 巴西利亞時間 + 巴西利亞夏令時間 + + + + + 長白山時間 + + + + + 智利時間 + 智利時間 + 智利夏令時間 + + + + + 中國時間 + 中國標準時間 + 中國夏令時間 + + + CT(中國) + CST(中國) + CDT(中國) + + + + + 喬巴山時間 + 喬巴山夏令時間 + + + + + CST(古巴) + CDT(古巴) + + + + + 達卡時間 + + + + + 杜尚別時間 + 杜尚別夏令時間 + + + + + 荷屬圭亞那時間 + 荷屬圭亞那時間 + 荷屬圭亞那夏令時間 + + + + + 東帝汶時間 + + + + + 厄瓜多時間 + + + + + 中歐標準時間 + 中歐夏令時間 + + + + + 東歐標準時間 + 東歐夏令時間 + + + + + 西歐時間 + 西歐夏令時間 + + + + + 伏龍芝時間 + 伏龍芝夏令時間 + + + + + 格林威治標準時間 + + + + + 加拉帕戈群島時間 + + + + + 喬治亞時間 + 喬治亞夏令時間 + + + + + 格陵蘭中部時間 + 格陵蘭中部夏令時間 + + + + + 格陵蘭東部時間 + 格陵蘭東部時間 + 格陵蘭東部夏令時間 + + + + + 格陵蘭西部時間 + 格陵蘭西部時間 + 格陵蘭西部夏令時間 + + + + + 關島標準時間 + + + GST (關島) + + + + + GT + + + + + 夏威夷-阿留申標準時間 + + + + + 印度標準時間 + + + + + 印尼中部時間 + + + + + 印尼東部時間 + + + + + 印尼西部時間 + + + + + 以色列時間 + 以色列標準時間 + 以色列夏令時間 + + + IST(以色列) + + + + + 日本標準時間 + 日本夏令時間 + + + JT + + + + + 喀拉蚩時間 + + + + + 喀什時間 + + + + + 東哈薩克時間 + 東哈薩克標準時間 + + + + + 西哈薩克時間 + 西哈薩克標準時間 + + + + + 吉力羅達時間 + 吉力羅達夏令時間 + + + + + 韓國時間 + 韓國標準時間 + 韓國夏令時間 + + + KT + + + + + 古比雪夫時間 + 古比雪夫夏令時間 + + + + + 瓜加林環礁時間 + + + + + 吉爾吉斯時間 + + + + + 蘭卡時間 + + + + + 隴蜀時間 + + + + + 豪勳爵島時間 + 豪勳爵島標準時間 + 豪勳爵島夏令時間 + + + + + 澳門時間 + 澳門夏令時間 + + + + + 馬來亞時間 + + + + + 馬來西亞時間 + + + + + 馬紹爾群島時間 + + + + + 烏蘭巴托時間 + 烏蘭巴托夏令時間 + + + + + 紐西蘭時間 + 紐西蘭標準時間 + 紐西蘭夏令時間 + + + + + 紐芬蘭時間 + 紐芬蘭標準時間 + 紐芬蘭夏令時間 + + + + + 北馬里亞納群島時間 + + + + + 巴基斯坦時間 + 巴基斯坦夏令時間 + + + + + 聖彼德與密啟崙時間 + 聖彼德與密啟崙標準時間 + 聖彼德與密啟崙夏令時間 + + + + + 克孜勒奧爾達時間 + 克孜勒奧爾達夏令時間 + + + + + 薩馬拉時間 + 薩馬拉夏令時間 + + + + + 撒馬爾罕時間 + 撒馬爾罕夏令時間 + + + SAMT(撒馬爾罕) + SAMST(撒馬爾罕) + + + + + 薩摩亞標準時間 + + + + + 舍甫琴科時間 + + + + + 蘇利南時間 + 蘇利南時間 + + + + + 斯維爾德洛夫斯克時間 + 斯維爾德洛夫斯克夏令時間 + + + + + 塔吉克時間 + + + + + 塔什干時間 + 塔什干夏令時間 + + + + + 第比利斯時間 + 第比利斯夏令時間 + + + + + 土耳其時間 + 土耳其夏令時間 + + + + + 土庫曼時間 + 土庫曼夏令時間 + + + + + 烏拉斯克時間 + 烏拉斯克夏令時間 + + + + + 烏魯木齊時間 + + + + + 烏茲別克時間 + 烏茲別克夏令時間 + + + + + 凱薩琳堡時間 + 凱薩琳堡夏令時間 + + + + + 葉里溫時間 + 葉里溫夏令時間 + + + + + 育空時間 + 育空標準時間 + 育空夏令時間 + + + + + + + + 安道爾陪士特 + + + 阿拉伯聯合大公國迪爾汗 + + + 阿爾巴尼亞列克 + + + 亞美尼亞德拉姆 + + + 荷屬安地列斯盾 + + + 安哥拉寬扎 + + + 安哥拉寬扎 (1977-1990) + + + 安哥拉新寬扎 (1990-2000) + + + 安哥拉新寬扎 Reajustado (1995-1999) + + + 阿根廷奧斯特納爾 + + + 阿根廷披索 (1983-1985) + + + 阿根廷披索 + + + 奧地利先令 + + + 澳幣 + + + 阿魯巴盾 + + + 亞塞拜然馬納特 (1993-2006) + + + 亞塞拜然馬納特 + + + 波士尼亞-黑塞哥維那第納爾 + + + 波士尼亞-黑塞哥維那可轉換馬克 + + + 巴貝多元 + + + 孟加拉塔卡 + + + 比利時法郎(可轉換) + + + 比利時法郎 + + + 比利時法郎(金融) + + + 保加利亞硬列弗 + + + 保加利亞新列弗 + + + 巴林第納爾 + + + 蒲隆地法郎 + + + 百慕達幣 + + + 汶萊元 + + + 玻利維亞貨幣單位 + + + 玻利維亞披索 + + + 玻利維亞幕多 + + + 巴西克魯薩多農瓦(1967-1986) + + + 巴西克魯賽羅 (1986-1989) + + + 巴西克魯賽羅 (1990-1993) + + + 巴西里拉 + + + 巴西克如爾達農瓦 + + + 巴西克魯賽羅 + + + 巴哈馬元 + + + 不丹那特倫 + + + 緬甸基雅特 + + + 波札那普拉 + + + 白俄羅斯新盧布 (1994-1999) + + + 白俄羅斯盧布 + + + 貝里斯元 + + + 加幣 + + + 剛果法郎 + + + WIR 歐元 + + + WIR 法郎 + + + 卡林油達佛曼跎 + + + 智利披索 + + + 人民幣 + + + 哥倫比亞披索 + + + 哥斯大黎加科郎 + + + 舊塞爾維亞第納爾 + + + 捷克斯洛伐克硬克朗 + + + 古巴披索 + + + 維德角埃斯庫多 + + + 賽普勒斯鎊 + + + 捷克克朗 + + + 東德奧斯特馬克 + + + 德國馬克 + + + 吉布地法郎 + + + 丹麥克羅納 + + + 多明尼加披索 + + + 阿爾及利亞第納爾 + + + 厄瓜多蘇克雷 + + + 厄瓜多爾由里達瓦康斯坦 (UVC) + + + 愛沙尼亞克朗 + + + 埃及鎊 + + + 厄立特里亞納克法 + + + 西班牙比塞塔(會計單位) + + + 西班牙比塞塔(可轉換會計單位) + + + 西班牙陪士特 + + + 衣索比亞比爾 + + + 歐元 + + + 芬蘭馬克 + + + 斐濟元 + + + 福克蘭群島鎊 + + + 法國法郎 + + + 英鎊 + + + 喬治庫旁拉里 + + + 喬治拉里 + + + 迦納仙蔕 + + + 直布羅陀鎊 + + + 甘比亞達拉西 + + + 幾內亞法郎 + + + 幾內亞西里 + + + 赤道幾內亞埃奎勒 + + + 希臘德拉克馬 + + + 瓜地馬拉格查爾 + + + 葡屬幾內亞埃斯庫多 + + + 幾內亞比索披索 + + + 圭亞那元 + + + 港幣 + + + 洪都拉斯倫皮拉 + + + 克羅地亞第納爾 + + + 克羅地亞庫納 + + + 匈牙利福林 + + + 印尼盾 + + + 愛爾蘭鎊 + + + 以色列鎊 + + + 以色列新謝克爾 + + + 印度盧比 + + + 伊拉克第納爾 + + + 伊朗里亞爾 + + + 冰島克朗 + + + 義大利里拉 + + + 牙買加元 + + + 約旦第納爾 + + + 日圓 + + + 肯尼亞先令 + + + 吉爾吉斯索馬 + + + 柬埔寨瑞爾 + + + 科摩羅法郎 + + + 北韓圜 + + + 韓圜 + + + 科威特第納爾 + + + 開曼群島美元 + + + 卡扎克斯坦坦吉 + + + 寮國基普 + + + 黎巴嫩鎊 + + + 斯里蘭卡盧布 + + + 賴比瑞亞元 + + + 賴索托羅蒂 + + + 立陶宛里塔 + + + 立陶宛特羅 + + + 盧森堡可兌換法郎 + + + 盧森堡法郎 + + + 盧森堡金融法郎 + + + 拉脫維亞拉特銀幣 + + + 拉脫維亞盧布 + + + 利比亞第納爾 + + + 摩杜雲列伊 + + + 馬達加斯加艾瑞爾 + + + 馬達加斯加法郎 + + + 馬其頓第納爾 + + + 馬里法郎 + + + 緬甸元 + + + 蒙古圖格里克 + + + 澳門元 + + + 茅利塔尼亞烏吉亞 + + + 馬爾他里拉 + + + 馬爾他鎊 + + + 模里西斯盧布 + + + 馬爾地夫海島盧非亞 + + + 馬拉維克瓦查 + + + 墨西哥披索 + + + 墨西哥銀披索 (1861-1992) + + + 墨西哥轉換單位(UDI) + + + 馬來西亞令吉 + + + 莫三比克埃斯庫多 + + + 莫三比克梅蒂卡爾 + + + 莫三比克美提卡 + + + 納米比亞元 + + + 奈及利亞奈拉 + + + 尼加拉瓜金科多巴 + + + 荷蘭盾 + + + 挪威克羅納 + + + 尼泊爾盧布 + + + 紐西蘭幣 + + + 阿曼里奧 + + + 巴拿馬巴波亞 + + + 祕魯因蒂 + + + 秘魯新太陽幣 + + + 秘魯太陽幣 + + + 巴布亞紐幾內亞基那 + + + 菲律賓披索 + + + 巴基斯坦盧布 + + + 波蘭茲羅提 + + + 波蘭茲羅提 (1950-1995) + + + 葡萄牙埃斯庫多 + + + 巴拉圭瓜拉尼 + + + 卡達爾里亞爾 + + + 羅德西亞元 + + + 舊羅馬尼亞列伊 + + + 羅馬尼亞列伊 + + + 塞爾維亞戴納 + + + 俄羅斯盧布 + + + 俄羅斯盧布 (1991-1998) + + + 盧安達法郎 + + + 沙烏地里雅 + + + 索羅門群島元 + + + 塞席爾盧比 + + + 蘇丹第納爾 + + + 蘇丹鎊 + + + 舊蘇丹鎊 + + + 瑞典克羅納 + + + 新加坡幣 + + + 聖赫勒拿鎊 + + + 斯洛維尼亞托勒 + + + 斯洛伐克克朗 + + + 獅子山利昂 + + + 索馬利亞先令 + + + 蘇利南元 + + + 蘇利南基爾 + + + 聖多美島和普林西比島多布拉 + + + 蘇聯盧布 + + + 薩爾瓦多科郎 + + + 敘利亞鎊 + + + 史瓦濟蘭里朗吉尼 + + + 泰銖 + + + 塔吉克盧布 + + + 塔吉克索莫尼 + + + 土庫曼馬納特 + + + 突尼西亞第納爾 + + + 東加潘加 + + + 帝汶埃斯庫多 + + + 千里達及托巴哥元 + + + 新臺幣 + + + 坦尚尼亞先令 + + + 烏克蘭格里夫那 + + + 烏克蘭卡本瓦那茲 + + + 烏干達先令 (1966-1987) + + + 烏干達先令 + + + $ + + + 美元 (第二天) + + + 美元 (同一天) + + + 烏拉圭披索 (1975-1993) + + + 烏拉圭披索 + + + 烏茲別克索姆 + + + 委內瑞拉玻利瓦 + + + 委內瑞拉強勢玻利瓦 + + + 萬那杜萬杜 + + + 西薩摩亞塔拉 + + + 西非法郎 BEAC + + + XAG + + + 黃金 + + + 歐洲綜合單位 + + + 歐洲貨幣單位 XBB + + + 歐洲會計單位 (XBC) + + + 歐洲會計單位 (XBD) + + + 格瑞那達元 + + + 特殊提款權 + + + 歐洲貨幣單位 XEU + + + 法國金法郎 + + + 法國 UIC 法郎 + + + 西非法郎 BCEAO + + + 帕拉狄昂 + + + CFP 法郎 + + + 白金 + + + XTS + + + XXX + + + 葉門第納爾 + + + 葉門里雅 + + + 南斯拉夫第納爾硬幣 + + + 南斯拉夫挪威亞第納爾 + + + 南斯拉夫 可轉換第納爾 + + + 南非蘭特 (金融) + + + 南非蘭特 + + + 尚比亞克瓦查 + + + 薩伊新扎伊爾 + + + 薩伊扎伊爾 + + + 辛巴威元 + + + + + + {0}小時 + + + {0} 週 + + + + + 是:確定 + + + + diff --git a/lib/zend/Zend/Locale/Data/zh_Hant_HK.xml b/lib/zend/Zend/Locale/Data/zh_Hant_HK.xml new file mode 100644 index 0000000000..32b783c42e --- /dev/null +++ b/lib/zend/Zend/Locale/Data/zh_Hant_HK.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + 傳統德國拼字法 + 1996 德國拼字法 + San Giorgio/Bila 方言 + Gniva/Njiva 方言 + Oseacco/Osojane 方言 + 已修訂拼字法 + 蘇格蘭標準英語 + Stolvizza/Solbica 方言 + + + 繁體中文順序 - Big5 + 簡體中文順序 - GB2312 + + + 十進制 + + + + + + + + M月d日E + y年M月d日,E + + + + + + + + y年M月d日EEEE + + + + + y年M月d日 + + + + + y年M月d日 + + + + + yy年M月d日 + + + + + + + ahh:mm:ss + + + + + + + {1}{0} + + + + + {1}{0} + + + + yyyy/M + + + + M月d日E至M月d日E + M月d日E至d日E + + + M月d日至M月d日 + M月d日至d日 + + + ah至h時 + + + ah:mm至ah:mmv + ah:mm至h:mmv + ah:mm至h:mmv + + + ah時至ah時v + ah至h時v + + + yy年M月至M月 + yy年M月至yy年M月 + + + yy年M月d日E至M月d日E + yy年M月d日E至d日E + yy年M月d日E至yy年M月d日E + + + yy年M月d日至M月d日 + yy年M月d日至d日 + yy年M月d日至yy年M月d日 + + + + + + + + + + + ¤#,##0.00;(¤#,##0.00) + + + + + + 澳元 + + + 波斯尼亞-黑塞哥維那第納爾 + + + 波斯尼亞-黑塞哥維那可轉換馬克 + + + 加元 + + + 港元 + $ + + + 意大利里拉 + + + 紐西蘭元 + + + 塞爾維亞第納爾 + + + 新加坡元 + + + 新台幣 + + + US$ + + + + + + {0}時 + + + {0}星期 + + + + + 是 + 否 + + + + diff --git a/lib/zend/Zend/Locale/Data/zh_Hant_MO.xml b/lib/zend/Zend/Locale/Data/zh_Hant_MO.xml new file mode 100644 index 0000000000..98707b4314 --- /dev/null +++ b/lib/zend/Zend/Locale/Data/zh_Hant_MO.xml @@ -0,0 +1,117 @@ + + + + + + + + '; + + // Output the data + $this->_outputData($data); + } + + /** + * Defined by Zend_ProgressBar_Adapter_Interface + * + * @return void + */ + public function finish() + { + if ($this->_finishMethodName === null) { + return; + } + + $data = ''; + + $this->_outputData($data); + } + + /** + * Outputs given data the user agent. + * + * This split-off is required for unit-testing. + * + * @param string $data + * @return void + */ + protected function _outputData($data) + { + // 1024 padding is required for Safari, while 256 padding is required + // for Internet Explorer. The
      is required so Safari actually + // executes the +SCRIPT; + } + + $return = $reCaptchaOptions; + $return .= << + +HTML; + $return .= << + {$htmlBreak} + + +HTML; + + return $return; + } + + /** + * Post a solution to the verify server + * + * @param string $challengeField + * @param string $responseField + * @return Zend_Http_Response + * @throws Zend_Service_ReCaptcha_Exception + */ + protected function _post($challengeField, $responseField) + { + if ($this->_privateKey === null) { + /** @see Zend_Service_ReCaptcha_Exception */ + require_once 'Zend/Service/ReCaptcha/Exception.php'; + + throw new Zend_Service_ReCaptcha_Exception('Missing private key'); + } + + if ($this->_ip === null) { + /** @see Zend_Service_ReCaptcha_Exception */ + require_once 'Zend/Service/ReCaptcha/Exception.php'; + + throw new Zend_Service_ReCaptcha_Exception('Missing ip address'); + } + + if (empty($challengeField)) { + /** @see Zend_Service_ReCaptcha_Exception */ + require_once 'Zend/Service/ReCaptcha/Exception.php'; + throw new Zend_Service_ReCaptcha_Exception('Missing challenge field'); + } + + if (empty($responseField)) { + /** @see Zend_Service_ReCaptcha_Exception */ + require_once 'Zend/Service/ReCaptcha/Exception.php'; + + throw new Zend_Service_ReCaptcha_Exception('Missing response field'); + } + + /* Fetch an instance of the http client */ + $httpClient = self::getHttpClient(); + + $postParams = array('privatekey' => $this->_privateKey, + 'remoteip' => $this->_ip, + 'challenge' => $challengeField, + 'response' => $responseField); + + /* Make the POST and return the response */ + return $httpClient->setUri(self::VERIFY_SERVER) + ->setParameterPost($postParams) + ->request(Zend_Http_Client::POST); + } + + /** + * Verify the user input + * + * This method calls up the post method and returns a + * Zend_Service_ReCaptcha_Response object. + * + * @param string $challengeField + * @param string $responseField + * @return Zend_Service_ReCaptcha_Response + */ + public function verify($challengeField, $responseField) + { + $response = $this->_post($challengeField, $responseField); + + return new Zend_Service_ReCaptcha_Response(null, null, $response); + } +} diff --git a/lib/zend/Zend/Service/ReCaptcha/Exception.php b/lib/zend/Zend/Service/ReCaptcha/Exception.php new file mode 100644 index 0000000000..18666e329d --- /dev/null +++ b/lib/zend/Zend/Service/ReCaptcha/Exception.php @@ -0,0 +1,36 @@ +_requireMcrypt(); + + /* If options is a Zend_Config object we want to convert it to an array so we can merge it with the default options */ + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + + /* Merge if needed */ + if (is_array($options)) { + $options = array_merge($this->getDefaultOptions(), $options); + } else { + $options = $this->getDefaultOptions(); + } + + parent::__construct($publicKey, $privateKey, null, $options); + + if ($email !== null) { + $this->setEmail($email); + } + } + + /** + * See if the mcrypt extension is available + * + * @throws Zend_Service_ReCaptcha_MailHide_Exception + */ + protected function _requireMcrypt() + { + if (!extension_loaded('mcrypt')) { + /** @see Zend_Service_ReCaptcha_MailHide_Exception */ + require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; + + throw new Zend_Service_ReCaptcha_MailHide_Exception('Use of the Zend_Service_ReCaptcha_MailHide component requires the mcrypt extension to be enabled in PHP'); + } + } + + /** + * Serialize as string + * + * When the instance is used as a string it will display the email address. Since we can't + * throw exceptions within this method we will trigger a user warning instead. + * + * @return string + */ + public function __toString() + { + try { + $return = $this->getHtml(); + } catch (Exception $e) { + $return = ''; + trigger_error($e->getMessage(), E_USER_WARNING); + } + + return $return; + } + + /** + * Get the default set of parameters + * + * @return array + */ + public function getDefaultOptions() + { + return array( + 'linkTitle' => 'Reveal this e-mail address', + 'linkHiddenText' => '...', + 'popupWidth' => 500, + 'popupHeight' => 300, + ); + } + + /** + * Override the setPrivateKey method + * + * Override the parent method to store a binary representation of the private key as well. + * + * @param string $privateKey + * @return Zend_Service_ReCaptcha_MailHide + */ + public function setPrivateKey($privateKey) + { + parent::setPrivateKey($privateKey); + + /* Pack the private key into a binary string */ + $this->_privateKeyPacked = pack('H*', $this->_privateKey); + + return $this; + } + + /** + * Set the email property + * + * This method will set the email property along with the local and domain parts + * + * @param string $email + * @return Zend_Service_ReCaptcha_MailHide + */ + public function setEmail($email) + { + $this->_email = $email; + + $emailParts = explode('@', $email, 2); + + /* Decide on how much of the local part we want to reveal */ + if (strlen($emailParts[0]) <= 4) { + $emailParts[0] = substr($emailParts[0], 0, 1); + } else if (strlen($emailParts[0]) <= 6) { + $emailParts[0] = substr($emailParts[0], 0, 3); + } else { + $emailParts[0] = substr($emailParts[0], 0, 4); + } + + $this->_emailLocalPart = $emailParts[0]; + $this->_emailDomainPart = $emailParts[1]; + + return $this; + } + + /** + * Get the email property + * + * @return string + */ + public function getEmail() + { + return $this->_email; + } + + /** + * Get the local part of the email address + * + * @return string + */ + public function getEmailLocalPart() + { + return $this->_emailLocalPart; + } + + /** + * Get the domain part of the email address + * + * @return string + */ + public function getEmailDomainPart() + { + return $this->_emailDomainPart; + } + + /** + * Get the HTML code needed for the mail hide + * + * @param string $email + * @return string + * @throws Zend_Service_ReCaptcha_MailHide_Exception + */ + public function getHtml($email = null) + { + if ($email !== null) { + $this->setEmail($email); + } else if ($this->_email === null) { + /** @see Zend_Service_ReCaptcha_MailHide_Exception */ + require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; + + throw new Zend_Service_ReCaptcha_MailHide_Exception('Missing email address'); + } + + if ($this->_publicKey === null) { + /** @see Zend_Service_ReCaptcha_MailHide_Exception */ + require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; + + throw new Zend_Service_ReCaptcha_MailHide_Exception('Missing public key'); + } + + if ($this->_privateKey === null) { + /** @see Zend_Service_ReCaptcha_MailHide_Exception */ + require_once 'Zend/Service/ReCaptcha/MailHide/Exception.php'; + + throw new Zend_Service_ReCaptcha_MailHide_Exception('Missing private key'); + } + + /* Generate the url */ + $url = $this->_getUrl(); + + /* Genrate the HTML used to represent the email address */ + $html = htmlentities($this->_emailLocalPart) . '' . $this->_options['linkHiddenText'] . '@' . htmlentities($this->_emailDomainPart); + + return $html; + } + + /** + * Get the url used on the "hidden" part of the email address + * + * @return string + */ + protected function _getUrl() + { + /* Figure out how much we need to pad the email */ + $numPad = self::ENCRYPTION_BLOCK_SIZE - (strlen($this->_email) % self::ENCRYPTION_BLOCK_SIZE); + + /* Pad the email */ + $emailPadded = str_pad($this->_email, strlen($this->_email) + $numPad, chr($numPad)); + + /* Encrypt the email */ + $emailEncrypted = mcrypt_encrypt(self::ENCRYPTION_CIPHER, $this->_privateKeyPacked, $emailPadded, self::ENCRYPTION_MODE, self::ENCRYPTION_IV); + + /* Return the url */ + return self::MAILHIDE_SERVER . '?k=' . $this->_publicKey . '&c=' . strtr(base64_encode($emailEncrypted), '+/', '-_'); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Service/ReCaptcha/MailHide/Exception.php b/lib/zend/Zend/Service/ReCaptcha/MailHide/Exception.php new file mode 100644 index 0000000000..19532062ef --- /dev/null +++ b/lib/zend/Zend/Service/ReCaptcha/MailHide/Exception.php @@ -0,0 +1,36 @@ +setStatus($status); + } + + if ($errorCode !== null) { + $this->setErrorCode($errorCode); + } + + if ($httpResponse !== null) { + $this->setFromHttpResponse($httpResponse); + } + } + + /** + * Set the status + * + * @param string $status + * @return Zend_Service_ReCaptcha_Response + */ + public function setStatus($status) + { + if ($status === 'true') { + $this->_status = true; + } else { + $this->_status = false; + } + + return $this; + } + + /** + * Get the status + * + * @return boolean + */ + public function getStatus() + { + return $this->_status; + } + + /** + * Alias for getStatus() + * + * @return boolean + */ + public function isValid() + { + return $this->getStatus(); + } + + /** + * Set the error code + * + * @param string $errorCode + * @return Zend_Service_ReCaptcha_Response + */ + public function setErrorCode($errorCode) + { + $this->_errorCode = $errorCode; + + return $this; + } + + /** + * Get the error code + * + * @return string + */ + public function getErrorCode() + { + return $this->_errorCode; + } + + /** + * Populate this instance based on a Zend_Http_Response object + * + * @param Zend_Http_Response $response + * @return Zend_Service_ReCaptcha_Response + */ + public function setFromHttpResponse(Zend_Http_Response $response) + { + $body = $response->getBody(); + + $parts = explode("\n", $body, 2); + + if (count($parts) !== 2) { + $status = 'false'; + $errorCode = ''; + } else { + list($status, $errorCode) = $parts; + } + + $this->setStatus($status); + $this->setErrorCode($errorCode); + + return $this; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Service/Simpy.php b/lib/zend/Zend/Service/Simpy.php new file mode 100644 index 0000000000..1e49fdcd5a --- /dev/null +++ b/lib/zend/Zend/Service/Simpy.php @@ -0,0 +1,435 @@ +_http = new Zend_Http_Client; + $this->_http->setAuth($username, $password); + } + + /** + * Returns the HTTP client currently in use by this class for REST API + * calls, intended mainly for testing. + * + * @return Zend_Http_Client + */ + public function getHttpClient() + { + return $this->_http; + } + + /** + * Sends a request to the REST API service and does initial processing + * on the response. + * + * @param string $op Name of the operation for the request + * @param array $query Query data for the request (optional) + * @throws Zend_Service_Exception + * @return DOMDocument Parsed XML response + */ + protected function _makeRequest($op, $query = null) + { + if ($query != null) { + $query = array_diff($query, array_filter($query, 'is_null')); + $query = '?' . http_build_query($query); + } + + $this->_http->setUri($this->_baseUri . $op . '.do' . $query); + $response = $this->_http->request('GET'); + + if ($response->isSuccessful()) { + $doc = new DOMDocument(); + $doc->loadXML($response->getBody()); + $xpath = new DOMXPath($doc); + $list = $xpath->query('/status/code'); + + if ($list->length > 0) { + $code = $list->item(0)->nodeValue; + + if ($code != 0) { + $list = $xpath->query('/status/message'); + $message = $list->item(0)->nodeValue; + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception($message, $code); + } + } + + return $doc; + } + + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception($response->getMessage(), $response->getStatus()); + } + + /** + * Returns a list of all tags and their counts, ordered by count in + * decreasing order + * + * @param int $limit Limits the number of tags returned (optional) + * @link http://www.simpy.com/doc/api/rest/GetTags + * @throws Zend_Service_Exception + * @return Zend_Service_Simpy_TagSet + */ + public function getTags($limit = null) + { + $query = array( + 'limit' => $limit + ); + + $doc = $this->_makeRequest('GetTags', $query); + + /** + * @see Zend_Service_Simpy_TagSet + */ + require_once 'Zend/Service/Simpy/TagSet.php'; + return new Zend_Service_Simpy_TagSet($doc); + } + + /** + * Removes a tag. + * + * @param string $tag Tag to be removed + * @link http://www.simpy.com/doc/api/rest/RemoveTag + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function removeTag($tag) + { + $query = array( + 'tag' => $tag + ); + + $this->_makeRequest('RemoveTag', $query); + + return $this; + } + + /** + * Renames a tag. + * + * @param string $fromTag Tag to be renamed + * @param string $toTag New tag name + * @link http://www.simpy.com/doc/api/rest/RenameTag + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function renameTag($fromTag, $toTag) + { + $query = array( + 'fromTag' => $fromTag, + 'toTag' => $toTag + ); + + $this->_makeRequest('RenameTag', $query); + + return $this; + } + + /** + * Merges two tags into a new tag. + * + * @param string $fromTag1 First tag to merge. + * @param string $fromTag2 Second tag to merge. + * @param string $toTag Tag to merge the two tags into. + * @link http://www.simpy.com/doc/api/rest/MergeTags + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function mergeTags($fromTag1, $fromTag2, $toTag) + { + $query = array( + 'fromTag1' => $fromTag1, + 'fromTag2' => $fromTag2, + 'toTag' => $toTag + ); + + $this->_makeRequest('MergeTags', $query); + + return $this; + } + + /** + * Splits a single tag into two separate tags. + * + * @param string $tag Tag to split + * @param string $toTag1 First tag to split into + * @param string $toTag2 Second tag to split into + * @link http://www.simpy.com/doc/api/rest/SplitTag + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function splitTag($tag, $toTag1, $toTag2) + { + $query = array( + 'tag' => $tag, + 'toTag1' => $toTag1, + 'toTag2' => $toTag2 + ); + + $this->_makeRequest('SplitTag', $query); + + return $this; + } + + /** + * Performs a query on existing links and returns the results or returns all + * links if no particular query is specified (which should be used sparingly + * to prevent overloading Simpy servers) + * + * @param Zend_Service_Simpy_LinkQuery $q Query object to use (optional) + * @return Zend_Service_Simpy_LinkSet + */ + public function getLinks(Zend_Service_Simpy_LinkQuery $q = null) + { + if ($q != null) { + $query = array( + 'q' => $q->getQueryString(), + 'limit' => $q->getLimit(), + 'date' => $q->getDate(), + 'afterDate' => $q->getAfterDate(), + 'beforeDate' => $q->getBeforeDate() + ); + + $doc = $this->_makeRequest('GetLinks', $query); + } else { + $doc = $this->_makeRequest('GetLinks'); + } + + /** + * @see Zend_Service_Simpy_LinkSet + */ + require_once 'Zend/Service/Simpy/LinkSet.php'; + return new Zend_Service_Simpy_LinkSet($doc); + } + + /** + * Saves a given link. + * + * @param string $title Title of the page to save + * @param string $href URL of the page to save + * @param int $accessType ACCESSTYPE_PUBLIC or ACCESSTYPE_PRIVATE + * @param mixed $tags String containing a comma-separated list of + * tags or array of strings containing tags + * (optional) + * @param string $urlNickname Alternative custom title (optional) + * @param string $note Free text note (optional) + * @link Zend_Service_Simpy::ACCESSTYPE_PUBLIC + * @link Zend_Service_Simpy::ACCESSTYPE_PRIVATE + * @link http://www.simpy.com/doc/api/rest/SaveLink + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function saveLink($title, $href, $accessType, $tags = null, $urlNickname = null, $note = null) + { + if (is_array($tags)) { + $tags = implode(',', $tags); + } + + $query = array( + 'title' => $title, + 'href' => $href, + 'accessType' => $accessType, + 'tags' => $tags, + 'urlNickname' => $urlNickname, + 'note' => $note + ); + + $this->_makeRequest('SaveLink', $query); + + return $this; + } + + /** + * Deletes a given link. + * + * @param string $href URL of the bookmark to delete + * @link http://www.simpy.com/doc/api/rest/DeleteLink + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function deleteLink($href) + { + $query = array( + 'href' => $href + ); + + $this->_makeRequest('DeleteLink', $query); + + return $this; + } + + /** + * Return a list of watchlists and their meta-data, including the number + * of new links added to each watchlist since last login. + * + * @link http://www.simpy.com/doc/api/rest/GetWatchlists + * @return Zend_Service_Simpy_WatchlistSet + */ + public function getWatchlists() + { + $doc = $this->_makeRequest('GetWatchlists'); + + /** + * @see Zend_Service_Simpy_WatchlistSet + */ + require_once 'Zend/Service/Simpy/WatchlistSet.php'; + return new Zend_Service_Simpy_WatchlistSet($doc); + } + + /** + * Returns the meta-data for a given watchlist. + * + * @param int $watchlistId ID of the watchlist to retrieve + * @link http://www.simpy.com/doc/api/rest/GetWatchlist + * @return Zend_Service_Simpy_Watchlist + */ + public function getWatchlist($watchlistId) + { + $query = array( + 'watchlistId' => $watchlistId + ); + + $doc = $this->_makeRequest('GetWatchlist', $query); + + /** + * @see Zend_Service_Simpy_Watchlist + */ + require_once 'Zend/Service/Simpy/Watchlist.php'; + return new Zend_Service_Simpy_Watchlist($doc->documentElement); + } + + /** + * Returns all notes in reverse chronological order by add date or by + * rank. + * + * @param string $q Query string formatted using Simpy search syntax + * and search fields (optional) + * @param int $limit Limits the number notes returned (optional) + * @link http://www.simpy.com/doc/api/rest/GetNotes + * @link http://www.simpy.com/simpy/FAQ.do#searchSyntax + * @link http://www.simpy.com/simpy/FAQ.do#searchFieldsLinks + * @return Zend_Service_Simpy_NoteSet + */ + public function getNotes($q = null, $limit = null) + { + $query = array( + 'q' => $q, + 'limit' => $limit + ); + + $doc = $this->_makeRequest('GetNotes', $query); + + /** + * @see Zend_Service_Simpy_NoteSet + */ + require_once 'Zend/Service/Simpy/NoteSet.php'; + return new Zend_Service_Simpy_NoteSet($doc); + } + + /** + * Saves a note. + * + * @param string $title Title of the note + * @param mixed $tags String containing a comma-separated list of + * tags or array of strings containing tags + * (optional) + * @param string $description Free-text note (optional) + * @param int $noteId Unique identifier for an existing note to + * update (optional) + * @link http://www.simpy.com/doc/api/rest/SaveNote + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function saveNote($title, $tags = null, $description = null, $noteId = null) + { + if (is_array($tags)) { + $tags = implode(',', $tags); + } + + $query = array( + 'title' => $title, + 'tags' => $tags, + 'description' => $description, + 'noteId' => $noteId + ); + + $this->_makeRequest('SaveNote', $query); + + return $this; + } + + /** + * Deletes a given note. + * + * @param int $noteId ID of the note to delete + * @link http://www.simpy.com/doc/api/rest/DeleteNote + * @return Zend_Service_Simpy Provides a fluent interface + */ + public function deleteNote($noteId) + { + $query = array( + 'noteId' => $noteId + ); + + $this->_makeRequest('DeleteNote', $query); + + return $this; + } +} diff --git a/lib/zend/Zend/Service/Simpy/Link.php b/lib/zend/Zend/Service/Simpy/Link.php new file mode 100644 index 0000000000..7b36cc9bf2 --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/Link.php @@ -0,0 +1,215 @@ + node from a parsed response from + * a GetLinks operation + * @return void + */ + public function __construct($node) + { + $this->_accessType = $node->attributes->getNamedItem('accessType')->nodeValue; + + $doc = new DOMDocument(); + $doc->appendChild($doc->importNode($node, true)); + $xpath = new DOMXPath($doc); + + $this->_url = $xpath->evaluate('/link/url')->item(0)->nodeValue; + $this->_modDate = $xpath->evaluate('/link/modDate')->item(0)->nodeValue; + $this->_addDate = $xpath->evaluate('/link/addDate')->item(0)->nodeValue; + $this->_title = $xpath->evaluate('/link/title')->item(0)->nodeValue; + $this->_nickname = $xpath->evaluate('/link/nickname')->item(0)->nodeValue; + $this->_note = $xpath->evaluate('/link/note')->item(0)->nodeValue; + + $list = $xpath->query('/link/tags/tag'); + $this->_tags = array(); + + for ($x = 0; $x < $list->length; $x++) { + $this->_tags[$x] = $list->item($x)->nodeValue; + } + } + + /** + * Returns the access type assigned to the link + * + * @see ACCESSTYPE_PRIVATE + * @see ACCESSTYPE_PUBLIC + * @return string + */ + public function getAccessType() + { + return $this->_accessType; + } + + /** + * Returns the URL of the link + * + * @return string + */ + public function getUrl() + { + return $this->_url; + } + + /** + * Returns the date of the last modification made to the link + * + * @return string + */ + public function getModDate() + { + return $this->_modDate; + } + + /** + * Returns the date the link was added + * + * @return string + */ + public function getAddDate() + { + return $this->_addDate; + } + + /** + * Returns the title assigned to the link + * + * @return string + */ + public function getTitle() + { + return $this->_title; + } + + /** + * Returns the nickname assigned to the link + * + * @return string + */ + public function getNickname() + { + return $this->_nickname; + } + + /** + * Returns the tags assigned to the link + * + * @return array + */ + public function getTags() + { + return $this->_tags; + } + + /** + * Returns the note assigned to the link + * + * @return string + */ + public function getNote() + { + return $this->_note; + } +} diff --git a/lib/zend/Zend/Service/Simpy/LinkQuery.php b/lib/zend/Zend/Service/Simpy/LinkQuery.php new file mode 100644 index 0000000000..0faa2eba3f --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/LinkQuery.php @@ -0,0 +1,200 @@ +_query = $query; + + return $this; + } + + /** + * Returns the query string set for this query + * + * @return string + */ + public function getQueryString() + { + return $this->_query; + } + + /** + * Sets the maximum number of search results to return + * + * @param int $limit + * @return Zend_Service_Simpy_LinkQuery Provides a fluent interface + */ + public function setLimit($limit) + { + $this->_limit = intval($limit); + + if ($this->_limit == 0) { + $this->_limit = null; + } + + return $this; + } + + /** + * Returns the maximum number of search results to return + * + * @return int + */ + public function getLimit() + { + return $this->_limit; + } + + /** + * Sets the date on which search results must have been added, which will + * override any existing values set using setAfterDate() and setBeforeDate() + * + * @param string $date + * @see setAfterDate() + * @see setBeforeDate() + * @return Zend_Service_Simpy_LinkQuery Provides a fluent interface + */ + public function setDate($date) + { + $this->_date = $date; + $this->_afterDate = null; + $this->_beforeDate = null; + + return $this; + } + + /** + * Returns the date on which search results must have been added + * + * @return string + */ + public function getDate() + { + return $this->_date; + } + + /** + * Sets the date after which search results must have been added, which will + * override any existing values set using setDate() + * + * @param string $date + * @see setDate() + * @return Zend_Service_Simpy_LinkQuery Provides a fluent interface + */ + public function setAfterDate($date) + { + $this->_afterDate = $date; + $this->_date = null; + + return $this; + } + + /** + * Returns the date after which search results must have been added + * + * @return string + */ + public function getAfterDate() + { + return $this->_afterDate; + } + + /** + * Sets the date before which search results must have been added, which + * will override any existing values set using setDate() + * + * @param string $date + * @see setDate() + * @return Zend_Service_Simpy_LinkQuery Provides a fluent interface + */ + public function setBeforeDate($date) + { + $this->_beforeDate = $date; + $this->_date = null; + + return $this; + } + + /** + * Returns the date before which search results must have been added + * + * @return string + */ + public function getBeforeDate() + { + return $this->_beforeDate; + } +} diff --git a/lib/zend/Zend/Service/Simpy/LinkSet.php b/lib/zend/Zend/Service/Simpy/LinkSet.php new file mode 100644 index 0000000000..c4584acd4a --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/LinkSet.php @@ -0,0 +1,83 @@ +query('//links/link'); + $this->_links = array(); + + for ($x = 0; $x < $list->length; $x++) { + $this->_links[$x] = new Zend_Service_Simpy_Link($list->item($x)); + } + } + + /** + * Returns an iterator for the link set + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_links); + } + + /** + * Returns the number of links in the set + * + * @return int + */ + public function getLength() + { + return count($this->_links); + } +} diff --git a/lib/zend/Zend/Service/Simpy/Note.php b/lib/zend/Zend/Service/Simpy/Note.php new file mode 100644 index 0000000000..ea32d82880 --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/Note.php @@ -0,0 +1,215 @@ + node from a parsed response from + * a GetLinks operation + * @return void + */ + public function __construct($node) + { + $this->_accessType = $node->attributes->getNamedItem('accessType')->nodeValue; + + $doc = new DOMDocument(); + $doc->appendChild($doc->importNode($node, true)); + $xpath = new DOMXPath($doc); + + $this->_uri = $xpath->evaluate('/note/uri')->item(0)->nodeValue; + $this->_id = substr($this->_uri, strrpos($this->_uri, '=') + 1); + $this->_modDate = trim($xpath->evaluate('/note/modDate')->item(0)->nodeValue); + $this->_addDate = trim($xpath->evaluate('/note/addDate')->item(0)->nodeValue); + $this->_title = $xpath->evaluate('/note/title')->item(0)->nodeValue; + $this->_description = $xpath->evaluate('/note/description')->item(0)->nodeValue; + + $list = $xpath->query('/note/tags/tag'); + $this->_tags = array(); + + for ($x = 0; $x < $list->length; $x++) { + $this->_tags[$x] = $list->item($x)->nodeValue; + } + } + + /** + * Returns the access type assigned to the note + * + * @see ACCESSTYPE_PRIVATE + * @see ACCESSTYPE_PUBLIC + * @return string + */ + public function getAccessType() + { + return $this->_accessType; + } + + /** + * Returns the ID of the note + * + * @return int + */ + public function getId() + { + return $this->_id; + } + + /** + * Returns the URI of the note + * + * @return string + */ + public function getUri() + { + return $this->_uri; + } + + /** + * Returns the date of the last modification made to the note + * + * @return string + */ + public function getModDate() + { + return $this->_modDate; + } + + /** + * Returns the date the note was added + * + * @return string + */ + public function getAddDate() + { + return $this->_addDate; + } + + /** + * Returns the title assigned to the note + * + * @return string + */ + public function getTitle() + { + return $this->_title; + } + + /** + * Returns the tags assigned to the note + * + * @return array + */ + public function getTags() + { + return $this->_tags; + } + + /** + * Returns the description assigned to the note + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } +} diff --git a/lib/zend/Zend/Service/Simpy/NoteSet.php b/lib/zend/Zend/Service/Simpy/NoteSet.php new file mode 100644 index 0000000000..3030836428 --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/NoteSet.php @@ -0,0 +1,83 @@ +query('//notes/note'); + $this->_notes = array(); + + for ($x = 0; $x < $list->length; $x++) { + $this->_notes[$x] = new Zend_Service_Simpy_Note($list->item($x)); + } + } + + /** + * Returns an iterator for the note set + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_notes); + } + + /** + * Returns the number of notes in the set + * + * @return int + */ + public function getLength() + { + return count($this->_notes); + } +} diff --git a/lib/zend/Zend/Service/Simpy/Tag.php b/lib/zend/Zend/Service/Simpy/Tag.php new file mode 100644 index 0000000000..218d931934 --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/Tag.php @@ -0,0 +1,81 @@ + node from a parsed response from + * a GetTags operation + * @return void + */ + public function __construct($node) + { + $map =& $node->attributes; + $this->_tag = $map->getNamedItem('name')->nodeValue; + $this->_count = $map->getNamedItem('count')->nodeValue; + } + + /** + * Returns the name of the tag + * + * @return string + */ + public function getTag() + { + return $this->_tag; + } + + /** + * Returns the number of links with the tag + * + * @return int + */ + public function getCount() + { + return $this->_count; + } +} diff --git a/lib/zend/Zend/Service/Simpy/TagSet.php b/lib/zend/Zend/Service/Simpy/TagSet.php new file mode 100644 index 0000000000..ae21411b89 --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/TagSet.php @@ -0,0 +1,83 @@ +query('//tags/tag'); + $this->_tags = array(); + + for ($x = 0; $x < $list->length; $x++) { + $this->_tags[$x] = new Zend_Service_Simpy_Tag($list->item($x)); + } + } + + /** + * Returns an iterator for the tag set + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_tags); + } + + /** + * Returns the number of tags in the set + * + * @return int + */ + public function getLength() + { + return count($this->_tags); + } +} diff --git a/lib/zend/Zend/Service/Simpy/Watchlist.php b/lib/zend/Zend/Service/Simpy/Watchlist.php new file mode 100644 index 0000000000..e7a76b95b6 --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/Watchlist.php @@ -0,0 +1,191 @@ + node from a parsed + * response from a GetWatchlists or GetWatchlist + * operation + * @return void + */ + public function __construct($node) + { + $map =& $node->attributes; + + $this->_id = $map->getNamedItem('id')->nodeValue; + $this->_name = $map->getNamedItem('name')->nodeValue; + $this->_description = $map->getNamedItem('description')->nodeValue; + $this->_addDate = $map->getNamedItem('addDate')->nodeValue; + $this->_newLinks = $map->getNamedItem('newLinks')->nodeValue; + + $this->_users = array(); + $this->_filters = new Zend_Service_Simpy_WatchlistFilterSet(); + + $childNode = $node->firstChild; + while ($childNode !== null) { + if ($childNode->nodeName == 'user') { + $this->_users[] = $childNode->attributes->getNamedItem('username')->nodeValue; + } elseif ($childNode->nodeName == 'filter') { + $filter = new Zend_Service_Simpy_WatchlistFilter($childNode); + $this->_filters->add($filter); + } + $childNode = $childNode->nextSibling; + } + } + + /** + * Returns the identifier for the watchlist + * + * @return int + */ + public function getId() + { + return $this->_id; + } + + /** + * Returns the name of the watchlist + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Returns the description of the watchlist + * + * @return string + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Returns a timestamp for when the watchlist was added + * + * @return string + */ + public function getAddDate() + { + return $this->_addDate; + } + + /** + * Returns the number of new links in the watchlist + * + * @return int + */ + public function getNewLinks() + { + return $this->_newLinks; + } + + /** + * Returns a list of usernames for users included in the watchlist + * + * @return array + */ + public function getUsers() + { + return $this->_users; + } + + /** + * Returns a list of filters included in the watchlist + * + * @return Zend_Service_Simpy_WatchlistFilterSet + */ + public function getFilters() + { + return $this->_filters; + } +} diff --git a/lib/zend/Zend/Service/Simpy/WatchlistFilter.php b/lib/zend/Zend/Service/Simpy/WatchlistFilter.php new file mode 100644 index 0000000000..143e31f223 --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/WatchlistFilter.php @@ -0,0 +1,81 @@ + node from a parsed response from + * a GetWatchlists or GetWatchlist operation + * @return void + */ + public function __construct($node) + { + $map =& $node->attributes; + $this->_name = $map->getNamedItem('name')->nodeValue; + $this->_query = $map->getNamedItem('query')->nodeValue; + } + + /** + * Returns the name of the filter + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Returns the query for the filter + * + * @return string + */ + public function getQuery() + { + return $this->_query; + } +} diff --git a/lib/zend/Zend/Service/Simpy/WatchlistFilterSet.php b/lib/zend/Zend/Service/Simpy/WatchlistFilterSet.php new file mode 100644 index 0000000000..ae24598ae5 --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/WatchlistFilterSet.php @@ -0,0 +1,77 @@ +_filters[] = $filter; + } + + /** + * Returns an iterator for the watchlist filter set + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_filters); + } + + /** + * Returns the number of filters in the set + * + * @return int + */ + public function getLength() + { + return count($this->_filters); + } +} diff --git a/lib/zend/Zend/Service/Simpy/WatchlistSet.php b/lib/zend/Zend/Service/Simpy/WatchlistSet.php new file mode 100644 index 0000000000..13ae9d29c1 --- /dev/null +++ b/lib/zend/Zend/Service/Simpy/WatchlistSet.php @@ -0,0 +1,82 @@ +query('//watchlists/watchlist'); + + for ($x = 0; $x < $list->length; $x++) { + $this->_watchlists[$x] = new Zend_Service_Simpy_Watchlist($list->item($x)); + } + } + + /** + * Returns an iterator for the watchlist set + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_watchlists); + } + + /** + * Returns the number of watchlists in the set + * + * @return int + */ + public function getLength() + { + return count($this->_watchlists); + } +} diff --git a/lib/zend/Zend/Service/SlideShare.php b/lib/zend/Zend/Service/SlideShare.php new file mode 100644 index 0000000000..e98a4095aa --- /dev/null +++ b/lib/zend/Zend/Service/SlideShare.php @@ -0,0 +1,619 @@ +_httpclient = $client; + return $this; + } + + /** + * Returns the instance of the Zend_Http_Client which will be used. Creates an instance + * of Zend_Http_Client if no previous client was set. + * + * @return Zend_Http_Client The HTTP client which will be used + */ + public function getHttpClient() + { + + if(!($this->_httpclient instanceof Zend_Http_Client)) { + $client = new Zend_Http_Client(); + $client->setConfig(array('maxredirects' => 2, + 'timeout' => 5)); + + $this->setHttpClient($client); + } + + $this->_httpclient->resetParameters(); + return $this->_httpclient; + } + + /** + * Sets the Zend_Cache object to use to cache the results of API queries + * + * @param Zend_Cache_Core $cacheobject The Zend_Cache object used + * @return Zend_Service_SlideShare + */ + public function setCacheObject(Zend_Cache_Core $cacheobject) + { + $this->_cacheobject = $cacheobject; + return $this; + } + + /** + * Gets the Zend_Cache object which will be used to cache API queries. If no cache object + * was previously set the the default will be used (Filesystem caching in /tmp with a life + * time of 43200 seconds) + * + * @return Zend_Cache_Core The object used in caching + */ + public function getCacheObject() + { + + if(!($this->_cacheobject instanceof Zend_Cache_Core)) { + $cache = Zend_Cache::factory('Core', 'File', array('lifetime' => 43200, + 'automatic_serialization' => true), + array('cache_dir' => '/tmp')); + + $this->setCacheObject($cache); + } + + return $this->_cacheobject; + } + + /** + * Returns the user name used for API calls + * + * @return string The username + */ + public function getUserName() + { + return $this->_username; + } + + /** + * Sets the user name to use for API calls + * + * @param string $un The username to use + * @return Zend_Service_SlideShare + */ + public function setUserName($un) + { + $this->_username = $un; + return $this; + } + + /** + * Gets the password to use in API calls + * + * @return string the password to use in API calls + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Sets the password to use in API calls + * + * @param string $pw The password to use + * @return Zend_Service_SlideShare + */ + public function setPassword($pw) + { + $this->_password = (string)$pw; + return $this; + } + + /** + * Gets the API key to be used in making API calls + * + * @return string the API Key + */ + public function getApiKey() + { + return $this->_apiKey; + } + + /** + * Sets the API key to be used in making API calls + * + * @param string $key The API key to use + * @return Zend_Service_SlideShare + */ + public function setApiKey($key) + { + $this->_apiKey = (string)$key; + return $this; + } + + /** + * Gets the shared secret used in making API calls + * + * @return string the Shared secret + */ + public function getSharedSecret() + { + return $this->_sharedSecret; + } + + /** + * Sets the shared secret used in making API calls + * + * @param string $secret the shared secret + * @return Zend_Service_SlideShare + */ + public function setSharedSecret($secret) + { + $this->_sharedSecret = (string)$secret; + return $this; + } + + /** + * The Constructor + * + * @param string $apikey The API key + * @param string $sharedSecret The shared secret + * @param string $username The username + * @param string $password The password + */ + public function __construct($apikey, $sharedSecret, $username = null, $password = null) + { + $this->setApiKey($apikey) + ->setSharedSecret($sharedSecret) + ->setUserName($username) + ->setPassword($password); + + $this->_httpclient = new Zend_Http_Client(); + } + + /** + * Uploads the specified Slide show the the server + * + * @param Zend_Service_SlideShare_SlideShow $ss The slide show object representing the slide show to upload + * @param boolean $make_src_public Determines if the the slide show's source file is public or not upon upload + * @return Zend_Service_SlideShare_SlideShow The passed Slide show object, with the new assigned ID provided + */ + public function uploadSlideShow(Zend_Service_SlideShare_SlideShow $ss, $make_src_public = true) + { + + $timestamp = time(); + + $params = array('api_key' => $this->getApiKey(), + 'ts' => $timestamp, + 'hash' => sha1($this->getSharedSecret().$timestamp), + 'username' => $this->getUserName(), + 'password' => $this->getPassword(), + 'slideshow_title' => $ss->getTitle()); + + $description = $ss->getDescription(); + $tags = $ss->getTags(); + + $filename = $ss->getFilename(); + + if(!file_exists($filename) || !is_readable($filename)) { + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception("Specified Slideshow for upload not found or unreadable"); + } + + if(!empty($description)) { + $params['slideshow_description'] = $description; + } else { + $params['slideshow_description'] = ""; + } + + if(!empty($tags)) { + $tmp = array(); + foreach($tags as $tag) { + $tmp[] = "\"$tag\""; + } + $params['slideshow_tags'] = implode(' ', $tmp); + } else { + $params['slideshow_tags'] = ""; + } + + + $client = $this->getHttpClient(); + $client->setUri(self::SERVICE_UPLOAD_URI); + $client->setParameterPost($params); + $client->setFileUpload($filename, "slideshow_srcfile"); + + require_once 'Zend/Http/Client/Exception.php'; + try { + $response = $client->request('POST'); + } catch(Zend_Http_Client_Exception $e) { + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception("Service Request Failed: {$e->getMessage()}"); + } + + $sxe = simplexml_load_string($response->getBody()); + + if($sxe->getName() == "SlideShareServiceError") { + $message = (string)$sxe->Message[0]; + list($code, $error_str) = explode(':', $message); + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception(trim($error_str), $code); + } + + if(!$sxe->getName() == "SlideShowUploaded") { + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception("Unknown XML Respons Received"); + } + + $ss->setId((int)(string)$sxe->SlideShowID); + + return $ss; + } + + /** + * Retrieves a slide show's information based on slide show ID + * + * @param int $ss_id The slide show ID + * @return Zend_Service_SlideShare_SlideShow the Slideshow object + */ + public function getSlideShow($ss_id) + { + $timestamp = time(); + + $params = array('api_key' => $this->getApiKey(), + 'ts' => $timestamp, + 'hash' => sha1($this->getSharedSecret().$timestamp), + 'slideshow_id' => $ss_id); + + $cache = $this->getCacheObject(); + + $cache_key = md5("__zendslideshare_cache_$ss_id"); + + if(!$retval = $cache->load($cache_key)) { + $client = $this->getHttpClient(); + + $client->setUri(self::SERVICE_GET_SHOW_URI); + $client->setParameterPost($params); + + require_once 'Zend/Http/Client/Exception.php'; + try { + $response = $client->request('POST'); + } catch(Zend_Http_Client_Exception $e) { + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception("Service Request Failed: {$e->getMessage()}"); + } + + $sxe = simplexml_load_string($response->getBody()); + + if($sxe->getName() == "SlideShareServiceError") { + $message = (string)$sxe->Message[0]; + list($code, $error_str) = explode(':', $message); + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception(trim($error_str), $code); + } + + if(!$sxe->getName() == 'Slideshows') { + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception('Unknown XML Repsonse Received'); + } + + $retval = $this->_slideShowNodeToObject(clone $sxe->Slideshow[0]); + + $cache->save($retval, $cache_key); + } + + return $retval; + } + + /** + * Retrieves an array of slide shows for a given username + * + * @param string $username The username to retrieve slide shows from + * @param int $offset The offset of the list to start retrieving from + * @param int $limit The maximum number of slide shows to retrieve + * @return array An array of Zend_Service_SlideShare_SlideShow objects + */ + public function getSlideShowsByUsername($username, $offset = null, $limit = null) + { + return $this->_getSlideShowsByType('username_for', $username, $offset, $limit); + } + + /** + * Retrieves an array of slide shows based on tag + * + * @param string $tag The tag to retrieve slide shows with + * @param int $offset The offset of the list to start retrieving from + * @param int $limit The maximum number of slide shows to retrieve + * @return array An array of Zend_Service_SlideShare_SlideShow objects + */ + public function getSlideShowsByTag($tag, $offset = null, $limit = null) + { + + if(is_array($tag)) { + $tmp = array(); + foreach($tag as $t) { + $tmp[] = "\"$t\""; + } + + $tag = implode(" ", $tmp); + } + + return $this->_getSlideShowsByType('tag', $tag, $offset, $limit); + } + + /** + * Retrieves an array of slide shows based on group name + * + * @param string $group The group name to retrieve slide shows for + * @param int $offset The offset of the list to start retrieving from + * @param int $limit The maximum number of slide shows to retrieve + * @return array An array of Zend_Service_SlideShare_SlideShow objects + */ + public function getSlideShowsByGroup($group, $offset = null, $limit = null) + { + return $this->_getSlideShowsByType('group_name', $group, $offset, $limit); + } + + /** + * Retrieves Zend_Service_SlideShare_SlideShow object arrays based on the type of + * list desired + * + * @param string $key The type of slide show object to retrieve + * @param string $value The specific search query for the slide show type to look up + * @param int $offset The offset of the list to start retrieving from + * @param int $limit The maximum number of slide shows to retrieve + * @return array An array of Zend_Service_SlideShare_SlideShow objects + */ + protected function _getSlideShowsByType($key, $value, $offset = null, $limit = null) + { + + $key = strtolower($key); + + switch($key) { + case 'username_for': + $responseTag = 'User'; + $queryUri = self::SERVICE_GET_SHOW_BY_USER_URI; + break; + case 'group_name': + $responseTag = 'Group'; + $queryUri = self::SERVICE_GET_SHOW_BY_GROUP_URI; + break; + case 'tag': + $responseTag = 'Tag'; + $queryUri = self::SERVICE_GET_SHOW_BY_TAG_URI; + break; + default: + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception("Invalid SlideShare Query"); + } + + $timestamp = time(); + + $params = array('api_key' => $this->getApiKey(), + 'ts' => $timestamp, + 'hash' => sha1($this->getSharedSecret().$timestamp), + $key => $value); + + if($offset !== null) { + $params['offset'] = (int)$offset; + } + + if($limit !== null) { + $params['limit'] = (int)$limit; + } + + $cache = $this->getCacheObject(); + + $cache_key = md5($key.$value.$offset.$limit); + + if(!$retval = $cache->load($cache_key)) { + + $client = $this->getHttpClient(); + + $client->setUri($queryUri); + $client->setParameterPost($params); + + require_once 'Zend/Http/Client/Exception.php'; + try { + $response = $client->request('POST'); + } catch(Zend_Http_Client_Exception $e) { + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception("Service Request Failed: {$e->getMessage()}"); + } + + $sxe = simplexml_load_string($response->getBody()); + + if($sxe->getName() == "SlideShareServiceError") { + $message = (string)$sxe->Message[0]; + list($code, $error_str) = explode(':', $message); + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception(trim($error_str), $code); + } + + if(!$sxe->getName() == $responseTag) { + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception('Unknown or Invalid XML Repsonse Received'); + } + + $retval = array(); + + foreach($sxe->children() as $node) { + if($node->getName() == 'Slideshow') { + $retval[] = $this->_slideShowNodeToObject($node); + } + } + + $cache->save($retval, $cache_key); + } + + return $retval; + } + + /** + * Converts a SimpleXMLElement object representing a response from the service + * into a Zend_Service_SlideShare_SlideShow object + * + * @param SimpleXMLElement $node The input XML from the slideshare.net service + * @return Zend_Service_SlideShare_SlideShow The resulting object + */ + protected function _slideShowNodeToObject(SimpleXMLElement $node) + { + + if($node->getName() == 'Slideshow') { + + $ss = new Zend_Service_SlideShare_SlideShow(); + + $ss->setId((string)$node->ID); + $ss->setDescription((string)$node->Description); + $ss->setEmbedCode((string)$node->EmbedCode); + $ss->setNumViews((string)$node->Views); + $ss->setPermaLink((string)$node->Permalink); + $ss->setStatus((string)$node->Status); + $ss->setStatusDescription((string)$node->StatusDescription); + + foreach(explode(",", (string)$node->Tags) as $tag) { + + if(!in_array($tag, $ss->getTags())) { + $ss->addTag($tag); + } + } + + $ss->setThumbnailUrl((string)$node->Thumbnail); + $ss->setTitle((string)$node->Title); + $ss->setLocation((string)$node->Location); + $ss->setTranscript((string)$node->Transcript); + + return $ss; + + } + + require_once 'Zend/Service/SlideShare/Exception.php'; + throw new Zend_Service_SlideShare_Exception("Was not provided the expected XML Node for processing"); + } +} diff --git a/lib/zend/Zend/Service/SlideShare/Exception.php b/lib/zend/Zend/Service/SlideShare/Exception.php new file mode 100644 index 0000000000..b1a8e13536 --- /dev/null +++ b/lib/zend/Zend/Service/SlideShare/Exception.php @@ -0,0 +1,38 @@ +_location; + } + + /** + * Sets the location of the slide show + * + * @param string $loc The location to use + * @return Zend_Service_SlideShare_SlideShow + */ + public function setLocation($loc) + { + $this->_location = (string)$loc; + return $this; + } + + /** + * Gets the transcript for this slide show + * + * @return string the Transcript + */ + public function getTranscript() + { + return $this->_transcript; + } + + /** + * Sets the transcript for this slide show + * + * @param string $t The transcript + * @return Zend_Service_SlideShare_SlideShow + */ + public function setTranscript($t) + { + $this->_transcript = (string)$t; + return $this; + } + + /** + * Adds a tag to the slide show + * + * @param string $tag The tag to add + * @return Zend_Service_SlideShare_SlideShow + */ + public function addTag($tag) + { + $this->_tags[] = (string)$tag; + return $this; + } + + /** + * Sets the tags for the slide show + * + * @param array $tags An array of tags to set + * @return Zend_Service_SlideShare_SlideShow + */ + public function setTags(Array $tags) + { + $this->_tags = $tags; + return $this; + } + + /** + * Gets all of the tags associated with the slide show + * + * @return array An array of tags for the slide show + */ + public function getTags() + { + return $this->_tags; + } + + /** + * Sets the filename on the local filesystem of the slide show + * (for uploading a new slide show) + * + * @param string $file The full path & filename to the slide show + * @return Zend_Service_SlideShare_SlideShow + */ + public function setFilename($file) + { + $this->_slideShowFilename = (string)$file; + return $this; + } + + /** + * Retrieves the filename on the local filesystem of the slide show + * which will be uploaded + * + * @return string The full path & filename to the slide show + */ + public function getFilename() + { + return $this->_slideShowFilename; + } + + /** + * Sets the ID for the slide show + * + * @param int $id The slide show ID + * @return Zend_Service_SlideShare_SlideShow + */ + public function setId($id) + { + $this->_slideShowId = (string)$id; + return $this; + } + + /** + * Gets the ID for the slide show + * + * @return int The slide show ID + */ + public function getId() + { + return $this->_slideShowId; + } + + /** + * Sets the HTML embed code for the slide show + * + * @param string $code The HTML embed code + * @return Zend_Service_SlideShare_SlideShow + */ + public function setEmbedCode($code) + { + $this->_embedCode = (string)$code; + return $this; + } + + /** + * Retrieves the HTML embed code for the slide show + * + * @return string the HTML embed code + */ + public function getEmbedCode() + { + return $this->_embedCode; + } + + /** + * Sets the Thumbnail URI for the slide show + * + * @param string $url The URI for the thumbnail image + * @return Zend_Service_SlideShare_SlideShow + */ + public function setThumbnailUrl($url) + { + $this->_thumbnailUrl = (string) $url; + return $this; + } + + /** + * Retrieves the Thumbnail URi for the slide show + * + * @return string The URI for the thumbnail image + */ + public function getThumbnailUrl() + { + return $this->_thumbnailUrl; + } + + /** + * Sets the title for the Slide show + * + * @param string $title The slide show title + * @return Zend_Service_SlideShare_SlideShow + */ + public function setTitle($title) + { + $this->_title = (string)$title; + return $this; + } + + /** + * Retrieves the Slide show title + * + * @return string the Slide show title + */ + public function getTitle() + { + return $this->_title; + } + + /** + * Sets the description for the Slide show + * + * @param strign $desc The description of the slide show + * @return Zend_Service_SlideShare_SlideShow + */ + public function setDescription($desc) + { + $this->_description = (string)$desc; + return $this; + } + + /** + * Gets the description of the slide show + * + * @return string The slide show description + */ + public function getDescription() + { + return $this->_description; + } + + /** + * Sets the numeric status of the slide show on the server + * + * @param int $status The numeric status on the server + * @return Zend_Service_SlideShare_SlideShow + */ + public function setStatus($status) + { + $this->_status = (int)$status; + return $this; + } + + /** + * Gets the numeric status of the slide show on the server + * + * @return int A Zend_Service_SlideShare_SlideShow Status constant + */ + public function getStatus() + { + return $this->_status; + } + + /** + * Sets the textual description of the status of the slide show on the server + * + * @param string $desc The textual description of the status of the slide show + * @return Zend_Service_SlideShare_SlideShow + */ + public function setStatusDescription($desc) + { + $this->_statusDescription = (string)$desc; + return $this; + } + + /** + * Gets the textual description of the status of the slide show on the server + * + * @return string the textual description of the service + */ + public function getStatusDescription() + { + return $this->_statusDescription; + } + + /** + * Sets the permanent link of the slide show + * + * @param string $url The permanent URL for the slide show + * @return Zend_Service_SlideShare_SlideShow + */ + public function setPermaLink($url) + { + $this->_permalink = (string)$url; + return $this; + } + + /** + * Gets the permanent link of the slide show + * + * @return string the permanent URL for the slide show + */ + public function getPermaLink() + { + return $this->_permalink; + } + + /** + * Sets the number of views the slide show has received + * + * @param int $views The number of views + * @return Zend_Service_SlideShare_SlideShow + */ + public function setNumViews($views) + { + $this->_numViews = (int)$views; + return $this; + } + + /** + * Gets the number of views the slide show has received + * + * @return int The number of views + */ + public function getNumViews() + { + return $this->_numViews; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Service/StrikeIron.php b/lib/zend/Zend/Service/StrikeIron.php new file mode 100644 index 0000000000..c1781e9706 --- /dev/null +++ b/lib/zend/Zend/Service/StrikeIron.php @@ -0,0 +1,92 @@ +_options = $options; + } + + /** + * Factory method to return a preconfigured Zend_Service_StrikeIron_* + * instance. + * + * @param null|string $options Service options + * @return object Zend_Service_StrikeIron_* instance + * @throws Zend_Service_StrikeIron_Exception + */ + public function getService($options = array()) + { + $class = isset($options['class']) ? $options['class'] : 'Base'; + unset($options['class']); + + if (strpos($class, '_') === false) { + $class = "Zend_Service_StrikeIron_{$class}"; + } + + try { + if (!class_exists($class)) { + require_once 'Zend/Loader.php'; + @Zend_Loader::loadClass($class); + } + if (!class_exists($class, false)) { + throw new Exception('Class file not found'); + } + } catch (Exception $e) { + $msg = "Service '$class' could not be loaded: " . $e->getMessage(); + /** + * @see Zend_Service_StrikeIron_Exception + */ + require_once 'Zend/Service/StrikeIron/Exception.php'; + throw new Zend_Service_StrikeIron_Exception($msg, $e->getCode()); + } + + // instantiate and return the service + $service = new $class(array_merge($this->_options, $options)); + return $service; + } + +} diff --git a/lib/zend/Zend/Service/StrikeIron/Base.php b/lib/zend/Zend/Service/StrikeIron/Base.php new file mode 100644 index 0000000000..476a3dfec3 --- /dev/null +++ b/lib/zend/Zend/Service/StrikeIron/Base.php @@ -0,0 +1,274 @@ + null, + 'password' => null, + 'client' => null, + 'options' => null, + 'headers' => null, + 'wsdl' => null); + + /** + * Output headers returned by the last call to SOAPClient->__soapCall() + * @param array + */ + protected $_outputHeaders = array(); + + /** + * Class constructor + * + * @param array $options Key/value pair options + * @throws Zend_Service_StrikeIron_Exception + */ + public function __construct($options = array()) + { + if (!extension_loaded('soap')) { + /** + * @see Zend_Service_StrikeIron_Exception + */ + require_once 'Zend/Service/StrikeIron/Exception.php'; + throw new Zend_Service_StrikeIron_Exception('SOAP extension is not enabled'); + } + + $this->_options = array_merge($this->_options, $options); + + $this->_initSoapHeaders(); + $this->_initSoapClient(); + } + + /** + * Proxy method calls to the SOAPClient instance, transforming method + * calls and responses for convenience. + * + * @param string $method Method name + * @param array $params Parameters for method + * @return mixed Result + * @throws Zend_Service_StrikeIron_Exception + */ + public function __call($method, $params) + { + // prepare method name and parameters for soap call + list($method, $params) = $this->_transformCall($method, $params); + $params = isset($params[0]) ? array($params[0]) : array(); + + // make soap call, capturing the result and output headers + try { + $result = $this->_options['client']->__soapCall($method, + $params, + $this->_options['options'], + $this->_options['headers'], + $this->_outputHeaders); + } catch (Exception $e) { + $message = get_class($e) . ': ' . $e->getMessage(); + /** + * @see Zend_Service_StrikeIron_Exception + */ + require_once 'Zend/Service/StrikeIron/Exception.php'; + throw new Zend_Service_StrikeIron_Exception($message, $e->getCode()); + } + + // transform/decorate the result and return it + $result = $this->_transformResult($result, $method, $params); + return $result; + } + + /** + * Initialize the SOAPClient instance + * + * @return void + */ + protected function _initSoapClient() + { + if (! isset($this->_options['options'])) { + $this->_options['options'] = array(); + } + + if (! isset($this->_options['client'])) { + $this->_options['client'] = new SoapClient($this->_options['wsdl'], + $this->_options['options']); + } + } + + /** + * Initialize the headers to pass to SOAPClient->__soapCall() + * + * @return void + * @throws Zend_Service_StrikeIron_Exception + */ + protected function _initSoapHeaders() + { + // validate headers and check if LicenseInfo was given + $foundLicenseInfo = false; + if (isset($this->_options['headers'])) { + if (! is_array($this->_options['headers'])) { + $this->_options['headers'] = array($this->_options['headers']); + } + + foreach ($this->_options['headers'] as $header) { + if (! $header instanceof SoapHeader) { + /** + * @see Zend_Service_StrikeIron_Exception + */ + require_once 'Zend/Service/StrikeIron/Exception.php'; + throw new Zend_Service_StrikeIron_Exception('Header must be instance of SoapHeader'); + } else if ($header->name == 'LicenseInfo') { + $foundLicenseInfo = true; + break; + } + } + } else { + $this->_options['headers'] = array(); + } + + // add default LicenseInfo header if a custom one was not supplied + if (! $foundLicenseInfo) { + $this->_options['headers'][] = new SoapHeader('http://ws.strikeiron.com', + 'LicenseInfo', + array('RegisteredUser' => array('UserID' => $this->_options['username'], + 'Password' => $this->_options['password']))); + } + } + + /** + * Transform a method name or method parameters before sending them + * to the remote service. This can be useful for inflection or other + * transforms to give the method call a more PHP-like interface. + * + * @see __call() + * @param string $method Method name called from PHP + * @param mixed $param Parameters passed from PHP + * @return array [$method, $params] for SOAPClient->__soapCall() + */ + protected function _transformCall($method, $params) + { + return array(ucfirst($method), $params); + } + + /** + * Transform the result returned from a method before returning + * it to the PHP caller. This can be useful for transforming + * the SOAPClient returned result to be more PHP-like. + * + * The $method name and $params passed to the method are provided to + * allow decisions to be made about how to transform the result based + * on what was originally called. + * + * @see __call() + * @param $result Raw result returned from SOAPClient_>__soapCall() + * @param $method Method name that was passed to SOAPClient->__soapCall() + * @param $params Method parameters that were passed to SOAPClient->__soapCall() + * @return mixed Transformed result + */ + protected function _transformResult($result, $method, $params) + { + $resultObjectName = "{$method}Result"; + if (isset($result->$resultObjectName)) { + $result = $result->$resultObjectName; + } + if (is_object($result)) { + $result = new Zend_Service_StrikeIron_Decorator($result, $resultObjectName); + } + return $result; + } + + /** + * Get the WSDL URL for this service. + * + * @return string + */ + public function getWsdl() + { + return $this->_options['wsdl']; + } + + /** + * Get the SOAP Client instance for this service. + */ + public function getSoapClient() + { + return $this->_options['client']; + } + + /** + * Get the StrikeIron output headers returned with the last method response. + * + * @return array + */ + public function getLastOutputHeaders() + { + return $this->_outputHeaders; + } + + /** + * Get the StrikeIron subscription information for this service. + * If any service method was recently called, the subscription info + * should have been returned in the SOAP headers so it is cached + * and returned from the cache. Otherwise, the getRemainingHits() + * method is called as a dummy to get the subscription info headers. + * + * @param boolean $now Force a call to getRemainingHits instead of cache? + * @param string $queryMethod Method that will cause SubscriptionInfo header to be sent + * @return Zend_Service_StrikeIron_Decorator Decorated subscription info + * @throws Zend_Service_StrikeIron_Exception + */ + public function getSubscriptionInfo($now = false, $queryMethod = 'GetRemainingHits') + { + if ($now || empty($this->_outputHeaders['SubscriptionInfo'])) { + $this->$queryMethod(); + } + + // capture subscription info if returned in output headers + if (isset($this->_outputHeaders['SubscriptionInfo'])) { + $info = (object)$this->_outputHeaders['SubscriptionInfo']; + $subscriptionInfo = new Zend_Service_StrikeIron_Decorator($info, 'SubscriptionInfo'); + } else { + $msg = 'No SubscriptionInfo header found in last output headers'; + /** + * @see Zend_Service_StrikeIron_Exception + */ + require_once 'Zend/Service/StrikeIron/Exception.php'; + throw new Zend_Service_StrikeIron_Exception($msg); + } + + return $subscriptionInfo; + } +} diff --git a/lib/zend/Zend/Service/StrikeIron/Decorator.php b/lib/zend/Zend/Service/StrikeIron/Decorator.php new file mode 100644 index 0000000000..042231df47 --- /dev/null +++ b/lib/zend/Zend/Service/StrikeIron/Decorator.php @@ -0,0 +1,143 @@ +_object = $object; + $this->_name = $name; + } + + /** + * Proxy property access to the decorated object, inflecting + * the property name and decorating any child objects returned. + * If the property is not found in the decorated object, return + * NULL as a convenience feature to avoid notices. + * + * @param string $property Property name to retrieve + * @return mixed Value of property or NULL + */ + public function __get($property) + { + $result = null; + + if (! isset($this->_object->$property)) { + $property = $this->_inflect($property); + } + + if (isset($this->_object->$property)) { + $result = $this->_object->$property; + $result = $this->_decorate($result); + } + return $result; + } + + /** + * Proxy method calls to the decorated object. This will only + * be used when the SOAPClient returns a custom PHP object via + * its classmap option so no inflection is done. + * + * @param string $method Name of method called + * @param array $args Arguments for method + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->_object, $method), $args); + } + + /** + * Inflect a property name from PHP-style to the result object's + * style. The default implementation here only inflects the case + * of the first letter, e.g. from "fooBar" to "FooBar". + * + * @param string $property Property name to inflect + * @return string Inflected property name + */ + protected function _inflect($property) + { + return ucfirst($property); + } + + /** + * Decorate a value returned by the result object. The default + * implementation here only decorates child objects. + * + * @param mixed $result Value to decorate + * @return mixed Decorated result + */ + protected function _decorate($result) + { + if (is_object($result)) { + $result = new self($result); + } + return $result; + } + + /** + * Return the object being decorated + * + * @return object + */ + public function getDecoratedObject() + { + return $this->_object; + } + + /** + * Return the name of the object being decorated + * + * @return null|string + */ + public function getDecoratedObjectName() + { + return $this->_name; + } +} diff --git a/lib/zend/Zend/Service/StrikeIron/Exception.php b/lib/zend/Zend/Service/StrikeIron/Exception.php new file mode 100644 index 0000000000..ae9acbf9ce --- /dev/null +++ b/lib/zend/Zend/Service/StrikeIron/Exception.php @@ -0,0 +1,36 @@ + null, + 'password' => null, + 'client' => null, + 'options' => null, + 'headers' => null, + 'wsdl' => 'http://ws.strikeiron.com/zf1.StrikeIron/taxdatabasic4?WSDL'); +} diff --git a/lib/zend/Zend/Service/StrikeIron/USAddressVerification.php b/lib/zend/Zend/Service/StrikeIron/USAddressVerification.php new file mode 100644 index 0000000000..179383231b --- /dev/null +++ b/lib/zend/Zend/Service/StrikeIron/USAddressVerification.php @@ -0,0 +1,45 @@ + null, + 'password' => null, + 'client' => null, + 'options' => null, + 'headers' => null, + 'wsdl' => 'http://ws.strikeiron.com/zf1.StrikeIron/USAddressVerification4_0?WSDL'); +} diff --git a/lib/zend/Zend/Service/StrikeIron/ZipCodeInfo.php b/lib/zend/Zend/Service/StrikeIron/ZipCodeInfo.php new file mode 100644 index 0000000000..795c603960 --- /dev/null +++ b/lib/zend/Zend/Service/StrikeIron/ZipCodeInfo.php @@ -0,0 +1,45 @@ + null, + 'password' => null, + 'client' => null, + 'options' => null, + 'headers' => null, + 'wsdl' => 'http://sdpws.strikeiron.com/zf1.StrikeIron/sdpZIPCodeInfo?WSDL'); +} diff --git a/lib/zend/Zend/Service/Technorati.php b/lib/zend/Zend/Service/Technorati.php new file mode 100644 index 0000000000..9d4bebea22 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati.php @@ -0,0 +1,1028 @@ +_apiKey = $apiKey; + } + + + /** + * Cosmos query lets you see what blogs are linking to a given URL. + * + * On the Technorati site, you can enter a URL in the searchbox and + * it will return a list of blogs linking to it. + * The API version allows more features and gives you a way + * to use the cosmos on your own site. + * + * Query options include: + * + * 'type' => (link|weblog) + * optional - A value of link returns the freshest links referencing your target URL. + * A value of weblog returns the last set of unique weblogs referencing your target URL. + * 'limit' => (int) + * optional - adjust the size of your result from the default value of 20 + * to between 1 and 100 results. + * 'start' => (int) + * optional - adjust the range of your result set. + * Set this number to larger than zero and you will receive + * the portion of Technorati's total result set ranging from start to start+limit. + * The default start value is 1. + * 'current' => (true|false) + * optional - the default setting of true + * Technorati returns links that are currently on a weblog's homepage. + * Set this parameter to false if you would like to receive all links + * to the given URL regardless of their current placement on the source blog. + * Internally the value is converted in (yes|no). + * 'claim' => (true|false) + * optional - the default setting of FALSE returns no user information + * about each weblog included in the result set when available. + * Set this parameter to FALSE to include Technorati member data + * in the result set when a weblog in your result set + * has been successfully claimed by a member of Technorati. + * Internally the value is converted in (int). + * 'highlight' => (true|false) + * optional - the default setting of TRUE + * highlights the citation of the given URL within the weblog excerpt. + * Set this parameter to FALSE to apply no special markup to the blog excerpt. + * Internally the value is converted in (int). + * + * @param string $url the URL you are searching for. Prefixes http:// and www. are optional. + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_CosmosResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/cosmos.html Technorati API: Cosmos Query reference + */ + public function cosmos($url, $options = null) + { + static $defaultOptions = array( 'type' => 'link', + 'start' => 1, + 'limit' => 20, + 'current' => 'yes', + 'format' => 'xml', + 'claim' => 0, + 'highlight' => 1, + ); + + $options['url'] = $url; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateCosmos($options); + $response = $this->_makeRequest(self::API_PATH_COSMOS, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_CosmosResultSet + */ + require_once 'Zend/Service/Technorati/CosmosResultSet.php'; + return new Zend_Service_Technorati_CosmosResultSet($dom, $options); + } + + /** + * Search lets you see what blogs contain a given search string. + * + * Query options include: + * + * 'language' => (string) + * optional - a ISO 639-1 two character language code + * to retrieve results specific to that language. + * This feature is currently beta and may not work for all languages. + * 'authority' => (n|a1|a4|a7) + * optional - filter results to those from blogs with at least + * the Technorati Authority specified. + * Technorati calculates a blog's authority by how many people link to it. + * Filtering by authority is a good way to refine your search results. + * There are four settings: + * - n => Any authority: All results. + * - a1 => A little authority: Results from blogs with at least one link. + * - a4 => Some authority: Results from blogs with a handful of links. + * - a7 => A lot of authority: Results from blogs with hundreds of links. + * 'limit' => (int) + * optional - adjust the size of your result from the default value of 20 + * to between 1 and 100 results. + * 'start' => (int) + * optional - adjust the range of your result set. + * Set this number to larger than zero and you will receive + * the portion of Technorati's total result set ranging from start to start+limit. + * The default start value is 1. + * 'claim' => (true|false) + * optional - the default setting of FALSE returns no user information + * about each weblog included in the result set when available. + * Set this parameter to FALSE to include Technorati member data + * in the result set when a weblog in your result set + * has been successfully claimed by a member of Technorati. + * Internally the value is converted in (int). + * + * @param string $query the words you are searching for. + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_SearchResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/search.html Technorati API: Search Query reference + */ + public function search($query, $options = null) + { + static $defaultOptions = array( 'start' => 1, + 'limit' => 20, + 'format' => 'xml', + 'claim' => 0); + + $options['query'] = $query; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateSearch($options); + $response = $this->_makeRequest(self::API_PATH_SEARCH, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_SearchResultSet + */ + require_once 'Zend/Service/Technorati/SearchResultSet.php'; + return new Zend_Service_Technorati_SearchResultSet($dom, $options); + } + + /** + * Tag lets you see what posts are associated with a given tag. + * + * Query options include: + * + * 'limit' => (int) + * optional - adjust the size of your result from the default value of 20 + * to between 1 and 100 results. + * 'start' => (int) + * optional - adjust the range of your result set. + * Set this number to larger than zero and you will receive + * the portion of Technorati's total result set ranging from start to start+limit. + * The default start value is 1. + * 'excerptsize' => (int) + * optional - number of word characters to include in the post excerpts. + * By default 100 word characters are returned. + * 'topexcerptsize' => (int) + * optional - number of word characters to include in the first post excerpt. + * By default 150 word characters are returned. + * + * @param string $tag the tag term you are searching posts for. + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_TagResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/tag.html Technorati API: Tag Query reference + */ + public function tag($tag, $options = null) + { + static $defaultOptions = array( 'start' => 1, + 'limit' => 20, + 'format' => 'xml', + 'excerptsize' => 100, + 'topexcerptsize' => 150); + + $options['tag'] = $tag; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateTag($options); + $response = $this->_makeRequest(self::API_PATH_TAG, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_TagResultSet + */ + require_once 'Zend/Service/Technorati/TagResultSet.php'; + return new Zend_Service_Technorati_TagResultSet($dom, $options); + } + + /** + * TopTags provides daily counts of posts containing the queried keyword. + * + * Query options include: + * + * 'days' => (int) + * optional - Used to specify the number of days in the past + * to request daily count data for. + * Can be any integer between 1 and 180, default is 180 + * + * @param string $q the keyword query + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_DailyCountsResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/dailycounts.html Technorati API: DailyCounts Query reference + */ + public function dailyCounts($query, $options = null) + { + static $defaultOptions = array( 'days' => 180, + 'format' => 'xml' + ); + + $options['q'] = $query; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateDailyCounts($options); + $response = $this->_makeRequest(self::API_PATH_DAILYCOUNTS, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_DailyCountsResultSet + */ + require_once 'Zend/Service/Technorati/DailyCountsResultSet.php'; + return new Zend_Service_Technorati_DailyCountsResultSet($dom); + } + + /** + * TopTags provides information on top tags indexed by Technorati. + * + * Query options include: + * + * 'limit' => (int) + * optional - adjust the size of your result from the default value of 20 + * to between 1 and 100 results. + * 'start' => (int) + * optional - adjust the range of your result set. + * Set this number to larger than zero and you will receive + * the portion of Technorati's total result set ranging from start to start+limit. + * The default start value is 1. + * + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_TagsResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/toptags.html Technorati API: TopTags Query reference + */ + public function topTags($options = null) + { + static $defaultOptions = array( 'start' => 1, + 'limit' => 20, + 'format' => 'xml' + ); + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateTopTags($options); + $response = $this->_makeRequest(self::API_PATH_TOPTAGS, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_TagsResultSet + */ + require_once 'Zend/Service/Technorati/TagsResultSet.php'; + return new Zend_Service_Technorati_TagsResultSet($dom); + } + + /** + * BlogInfo provides information on what blog, if any, is associated with a given URL. + * + * @param string $url the URL you are searching for. Prefixes http:// and www. are optional. + * The URL must be recognized by Technorati as a blog. + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_BlogInfoResult + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/bloginfo.html Technorati API: BlogInfo Query reference + */ + public function blogInfo($url, $options = null) + { + static $defaultOptions = array( 'format' => 'xml' + ); + + $options['url'] = $url; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateBlogInfo($options); + $response = $this->_makeRequest(self::API_PATH_BLOGINFO, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_BlogInfoResult + */ + require_once 'Zend/Service/Technorati/BlogInfoResult.php'; + return new Zend_Service_Technorati_BlogInfoResult($dom); + } + + /** + * BlogPostTags provides information on the top tags used by a specific blog. + * + * Query options include: + * + * 'limit' => (int) + * optional - adjust the size of your result from the default value of 20 + * to between 1 and 100 results. + * 'start' => (int) + * optional - adjust the range of your result set. + * Set this number to larger than zero and you will receive + * the portion of Technorati's total result set ranging from start to start+limit. + * The default start value is 1. + * Note. This property is not documented. + * + * @param string $url the URL you are searching for. Prefixes http:// and www. are optional. + * The URL must be recognized by Technorati as a blog. + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_TagsResultSet + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/blogposttags.html Technorati API: BlogPostTags Query reference + */ + public function blogPostTags($url, $options = null) + { + static $defaultOptions = array( 'start' => 1, + 'limit' => 20, + 'format' => 'xml' + ); + + $options['url'] = $url; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateBlogPostTags($options); + $response = $this->_makeRequest(self::API_PATH_BLOGPOSTTAGS, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_TagsResultSet + */ + require_once 'Zend/Service/Technorati/TagsResultSet.php'; + return new Zend_Service_Technorati_TagsResultSet($dom); + } + + /** + * GetInfo query tells you things that Technorati knows about a member. + * + * The returned info is broken up into two sections: + * The first part describes some information that the user wants + * to allow people to know about him- or herself. + * The second part of the document is a listing of the weblogs + * that the user has successfully claimed and the information + * that Technorati knows about these weblogs. + * + * @param string $username the Technorati user name you are searching for + * @param array $options additional parameters to refine your query + * @return Zend_Service_Technorati_GetInfoResult + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/getinfo.html Technorati API: GetInfo reference + */ + public function getInfo($username, $options = null) + { + static $defaultOptions = array('format' => 'xml'); + + $options['username'] = $username; + + $options = $this->_prepareOptions($options, $defaultOptions); + $this->_validateGetInfo($options); + $response = $this->_makeRequest(self::API_PATH_GETINFO, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_GetInfoResult + */ + require_once 'Zend/Service/Technorati/GetInfoResult.php'; + return new Zend_Service_Technorati_GetInfoResult($dom); + } + + /** + * KeyInfo query provides information on daily usage of an API key. + * Key Info Queries do not count against a key's daily query limit. + * + * A day is defined as 00:00-23:59 Pacific time. + * + * @return Zend_Service_Technorati_KeyInfoResult + * @throws Zend_Service_Technorati_Exception + * @link http://developers.technorati.com/wiki/KeyInfo Technorati API: Key Info reference + */ + public function keyInfo() + { + static $defaultOptions = array(); + + $options = $this->_prepareOptions(array(), $defaultOptions); + // you don't need to validate this request + // because key is the only mandatory element + // and it's already set in #_prepareOptions + $response = $this->_makeRequest(self::API_PATH_KEYINFO, $options); + $dom = $this->_convertResponseAndCheckContent($response); + + /** + * @see Zend_Service_Technorati_KeyInfoResult + */ + require_once 'Zend/Service/Technorati/KeyInfoResult.php'; + return new Zend_Service_Technorati_KeyInfoResult($dom, $this->_apiKey); + } + + + /** + * Returns Technorati API key. + * + * @return string Technorati API key + */ + public function getApiKey() + { + return $this->_apiKey; + } + + /** + * Returns a reference to the REST client object in use. + * + * If the reference hasn't being inizialized yet, + * then a new Zend_Rest_Client instance is created. + * + * @return Zend_Rest_Client + */ + public function getRestClient() + { + if ($this->_restClient === null) { + /** + * @see Zend_Rest_Client + */ + require_once 'Zend/Rest/Client.php'; + $this->_restClient = new Zend_Rest_Client(self::API_URI_BASE); + } + + return $this->_restClient; + } + + /** + * Sets Technorati API key. + * + * Be aware that this function doesn't validate the key. + * The key is validated as soon as the first API request is sent. + * If the key is invalid, the API request method will throw + * a Zend_Service_Technorati_Exception exception with Invalid Key message. + * + * @param string $key Technorati API Key + * @return void + * @link http://technorati.com/developers/apikey.html How to get your Technorati API Key + */ + public function setApiKey($key) + { + $this->_apiKey = $key; + return $this; + } + + + /** + * Validates Cosmos query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateCosmos(array $options) + { + static $validOptions = array('key', 'url', + 'type', 'limit', 'start', 'current', 'claim', 'highlight', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate url (required) + $this->_validateOptionUrl($options); + // Validate limit (optional) + $this->_validateOptionLimit($options); + // Validate start (optional) + $this->_validateOptionStart($options); + // Validate format (optional) + $this->_validateOptionFormat($options); + // Validate type (optional) + $this->_validateInArrayOption('type', $options, array('link', 'weblog')); + // Validate claim (optional) + $this->_validateOptionClaim($options); + // Validate highlight (optional) + $this->_validateIntegerOption('highlight', $options); + // Validate current (optional) + if (isset($options['current'])) { + $tmp = (int) $options['current']; + $options['current'] = $tmp ? 'yes' : 'no'; + } + + } + + /** + * Validates Search query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateSearch(array $options) + { + static $validOptions = array('key', 'query', + 'language', 'authority', 'limit', 'start', 'claim', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate query (required) + $this->_validateMandatoryOption('query', $options); + // Validate authority (optional) + $this->_validateInArrayOption('authority', $options, array('n', 'a1', 'a4', 'a7')); + // Validate limit (optional) + $this->_validateOptionLimit($options); + // Validate start (optional) + $this->_validateOptionStart($options); + // Validate claim (optional) + $this->_validateOptionClaim($options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + /** + * Validates Tag query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateTag(array $options) + { + static $validOptions = array('key', 'tag', + 'limit', 'start', 'excerptsize', 'topexcerptsize', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate query (required) + $this->_validateMandatoryOption('tag', $options); + // Validate limit (optional) + $this->_validateOptionLimit($options); + // Validate start (optional) + $this->_validateOptionStart($options); + // Validate excerptsize (optional) + $this->_validateIntegerOption('excerptsize', $options); + // Validate excerptsize (optional) + $this->_validateIntegerOption('topexcerptsize', $options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + + /** + * Validates DailyCounts query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateDailyCounts(array $options) + { + static $validOptions = array('key', 'q', + 'days', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate q (required) + $this->_validateMandatoryOption('q', $options); + // Validate format (optional) + $this->_validateOptionFormat($options); + // Validate days (optional) + if (isset($options['days'])) { + $options['days'] = (int) $options['days']; + if ($options['days'] < self::PARAM_DAYS_MIN_VALUE || + $options['days'] > self::PARAM_DAYS_MAX_VALUE) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid value '" . $options['days'] . "' for 'days' option"); + } + } + } + + /** + * Validates GetInfo query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateGetInfo(array $options) + { + static $validOptions = array('key', 'username', + 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate username (required) + $this->_validateMandatoryOption('username', $options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + /** + * Validates TopTags query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateTopTags(array $options) + { + static $validOptions = array('key', + 'limit', 'start', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate limit (optional) + $this->_validateOptionLimit($options); + // Validate start (optional) + $this->_validateOptionStart($options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + /** + * Validates BlogInfo query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateBlogInfo(array $options) + { + static $validOptions = array('key', 'url', + 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate url (required) + $this->_validateOptionUrl($options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + /** + * Validates TopTags query options. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateBlogPostTags(array $options) + { + static $validOptions = array('key', 'url', + 'limit', 'start', 'format'); + + // Validate keys in the $options array + $this->_compareOptions($options, $validOptions); + // Validate url (required) + $this->_validateOptionUrl($options); + // Validate limit (optional) + $this->_validateOptionLimit($options); + // Validate start (optional) + $this->_validateOptionStart($options); + // Validate format (optional) + $this->_validateOptionFormat($options); + } + + /** + * Checks whether an option is in a given array. + * + * @param string $name option name + * @param array $options + * @param array $array array of valid options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateInArrayOption($name, $options, array $array) + { + if (isset($options[$name]) && !in_array($options[$name], $array)) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid value '{$options[$name]}' for '$name' option"); + } + } + + /** + * Checks whether mandatory $name option exists and it's valid. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _validateMandatoryOption($name, $options) + { + if (!isset($options[$name]) || !trim($options[$name])) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Empty value for '$name' option"); + } + } + + /** + * Checks whether $name option is a valid integer and casts it. + * + * @param array $options + * @return void + * @access protected + */ + protected function _validateIntegerOption($name, $options) + { + if (isset($options[$name])) { + $options[$name] = (int) $options[$name]; + } + } + + /** + * Makes and HTTP GET request to given $path with $options. + * HTTP Response is first validated, then returned. + * + * @param string $path + * @param array $options + * @return Zend_Http_Response + * @throws Zend_Service_Technorati_Exception on failure + * @access protected + */ + protected function _makeRequest($path, $options = array()) + { + $restClient = $this->getRestClient(); + $restClient->getHttpClient()->resetParameters(); + $response = $restClient->restGet($path, $options); + self::_checkResponse($response); + return $response; + } + + /** + * Checks whether 'claim' option value is valid. + * + * @param array $options + * @return void + * @access protected + */ + protected function _validateOptionClaim(array $options) + { + $this->_validateIntegerOption('claim', $options); + } + + /** + * Checks whether 'format' option value is valid. + * Be aware that Zend_Service_Technorati supports only XML as format value. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception if 'format' value != XML + * @access protected + */ + protected function _validateOptionFormat(array $options) + { + if (isset($options['format']) && $options['format'] != 'xml') { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid value '" . $options['format'] . "' for 'format' option. " . + "Zend_Service_Technorati supports only 'xml'"); + } + } + + /** + * Checks whether 'limit' option value is valid. + * Value must be an integer greater than PARAM_LIMIT_MIN_VALUE + * and lower than PARAM_LIMIT_MAX_VALUE. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception if 'limit' value is invalid + * @access protected + */ + protected function _validateOptionLimit(array $options) + { + if (!isset($options['limit'])) return; + + $options['limit'] = (int) $options['limit']; + if ($options['limit'] < self::PARAM_LIMIT_MIN_VALUE || + $options['limit'] > self::PARAM_LIMIT_MAX_VALUE) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid value '" . $options['limit'] . "' for 'limit' option"); + } + } + + /** + * Checks whether 'start' option value is valid. + * Value must be an integer greater than 0. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception if 'start' value is invalid + * @access protected + */ + protected function _validateOptionStart(array $options) + { + if (!isset($options['start'])) return; + + $options['start'] = (int) $options['start']; + if ($options['start'] < self::PARAM_START_MIN_VALUE) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid value '" . $options['start'] . "' for 'start' option"); + } + } + + /** + * Checks whether 'url' option value exists and is valid. + * 'url' must be a valid HTTP(s) URL. + * + * @param array $options + * @return void + * @throws Zend_Service_Technorati_Exception if 'url' value is invalid + * @access protected + * @todo support for Zend_Uri_Http + */ + protected function _validateOptionUrl(array $options) + { + $this->_validateMandatoryOption('url', $options); + } + + /** + * Checks XML response content for errors. + * + * @param DomDocument $dom the XML response as a DOM document + * @return void + * @throws Zend_Service_Technorati_Exception + * @link http://technorati.com/developers/api/error.html Technorati API: Error response + * @access protected + */ + protected static function _checkErrors(DomDocument $dom) + { + $xpath = new DOMXPath($dom); + + $result = $xpath->query("/tapi/document/result/error"); + if ($result->length >= 1) { + $error = $result->item(0)->nodeValue; + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception($error); + } + } + + /** + * Converts $response body to a DOM object and checks it. + * + * @param Zend_Http_Response $response + * @return DOMDocument + * @throws Zend_Service_Technorati_Exception if response content contains an error message + * @access protected + */ + protected function _convertResponseAndCheckContent(Zend_Http_Response $response) + { + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + self::_checkErrors($dom); + return $dom; + } + + /** + * Checks ReST response for errors. + * + * @param Zend_Http_Response $response the ReST response + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected static function _checkResponse(Zend_Http_Response $response) + { + if ($response->isError()) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception(sprintf( + 'Invalid response status code (HTTP/%s %s %s)', + $response->getVersion(), $response->getStatus(), $response->getMessage())); + } + } + + /** + * Checks whether user given options are valid. + * + * @param array $options user options + * @param array $validOptions valid options + * @return void + * @throws Zend_Service_Technorati_Exception + * @access protected + */ + protected function _compareOptions(array $options, array $validOptions) + { + $difference = array_diff(array_keys($options), $validOptions); + if ($difference) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "The following parameters are invalid: '" . + implode("', '", $difference) . "'"); + } + } + + /** + * Prepares options for the request + * + * @param array $options user options + * @param array $defaultOptions default options + * @return array Merged array of user and default/required options. + * @access protected + */ + protected function _prepareOptions($options, array $defaultOptions) + { + $options = (array) $options; // force cast to convert null to array() + $options['key'] = $this->_apiKey; + $options = array_merge($defaultOptions, $options); + return $options; + } +} diff --git a/lib/zend/Zend/Service/Technorati/Author.php b/lib/zend/Zend/Service/Technorati/Author.php new file mode 100644 index 0000000000..4bb833ed2f --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/Author.php @@ -0,0 +1,242 @@ +ownerDocument); + + $result = $xpath->query('./firstname/text()', $dom); + if ($result->length == 1) $this->setFirstName($result->item(0)->data); + + $result = $xpath->query('./lastname/text()', $dom); + if ($result->length == 1) $this->setLastName($result->item(0)->data); + + $result = $xpath->query('./username/text()', $dom); + if ($result->length == 1) $this->setUsername($result->item(0)->data); + + $result = $xpath->query('./description/text()', $dom); + if ($result->length == 1) $this->setDescription($result->item(0)->data); + + $result = $xpath->query('./bio/text()', $dom); + if ($result->length == 1) $this->setBio($result->item(0)->data); + + $result = $xpath->query('./thumbnailpicture/text()', $dom); + if ($result->length == 1) $this->setThumbnailPicture($result->item(0)->data); + } + + + /** + * Returns Author first name. + * + * @return string Author first name + */ + public function getFirstName() { + return $this->_firstName; + } + + /** + * Returns Author last name. + * + * @return string Author last name + */ + public function getLastName() { + return $this->_lastName; + } + + /** + * Returns Technorati account username. + * + * @return string Technorati account username + */ + public function getUsername() { + return $this->_username; + } + + /** + * Returns Technorati account description. + * + * @return string Technorati account description + */ + public function getDescription() { + return $this->_description; + } + + /** + * Returns Technorati account biography. + * + * @return string Technorati account biography + */ + public function getBio() { + return $this->_bio; + } + + /** + * Returns Technorati account thumbnail picture. + * + * @return null|Zend_Uri_Http Technorati account thumbnail picture + */ + public function getThumbnailPicture() { + return $this->_thumbnailPicture; + } + + + /** + * Sets author first name. + * + * @param string $input first Name input value + * @return Zend_Service_Technorati_Author $this instance + */ + public function setFirstName($input) { + $this->_firstName = (string) $input; + return $this; + } + + /** + * Sets author last name. + * + * @param string $input last Name input value + * @return Zend_Service_Technorati_Author $this instance + */ + public function setLastName($input) { + $this->_lastName = (string) $input; + return $this; + } + + /** + * Sets Technorati account username. + * + * @param string $input username input value + * @return Zend_Service_Technorati_Author $this instance + */ + public function setUsername($input) { + $this->_username = (string) $input; + return $this; + } + + /** + * Sets Technorati account biography. + * + * @param string $input biography input value + * @return Zend_Service_Technorati_Author $this instance + */ + public function setBio($input) { + $this->_bio = (string) $input; + return $this; + } + + /** + * Sets Technorati account description. + * + * @param string $input description input value + * @return Zend_Service_Technorati_Author $this instance + */ + public function setDescription($input) { + $this->_description = (string) $input; + return $this; + } + + /** + * Sets Technorati account thumbnail picture. + * + * @param string|Zend_Uri_Http $input thumbnail picture URI + * @return Zend_Service_Technorati_Author $this instance + * @throws Zend_Service_Technorati_Exception if $input is an invalid URI + * (via Zend_Service_Technorati_Utils::normalizeUriHttp) + */ + public function setThumbnailPicture($input) { + $this->_thumbnailPicture = Zend_Service_Technorati_Utils::normalizeUriHttp($input); + return $this; + } + +} diff --git a/lib/zend/Zend/Service/Technorati/BlogInfoResult.php b/lib/zend/Zend/Service/Technorati/BlogInfoResult.php new file mode 100644 index 0000000000..f9d0718cff --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/BlogInfoResult.php @@ -0,0 +1,161 @@ +query('//result/weblog'); + if ($result->length == 1) { + $this->_weblog = new Zend_Service_Technorati_Weblog($result->item(0)); + } else { + // follow the same behavior of blogPostTags + // and raise an Exception if the URL is not a valid weblog + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Your URL is not a recognized Technorati weblog"); + } + + $result = $xpath->query('//result/url/text()'); + if ($result->length == 1) { + try { + // fetched URL often doens't include schema + // and this issue causes the following line to fail + $this->_url = Zend_Service_Technorati_Utils::normalizeUriHttp($result->item(0)->data); + } catch(Zend_Service_Technorati_Exception $e) { + if ($this->getWeblog() instanceof Zend_Service_Technorati_Weblog) { + $this->_url = $this->getWeblog()->getUrl(); + } + } + } + + $result = $xpath->query('//result/inboundblogs/text()'); + if ($result->length == 1) $this->_inboundBlogs = (int) $result->item(0)->data; + + $result = $xpath->query('//result/inboundlinks/text()'); + if ($result->length == 1) $this->_inboundLinks = (int) $result->item(0)->data; + + } + + + /** + * Returns the weblog URL. + * + * @return Zend_Uri_Http + */ + public function getUrl() { + return $this->_url; + } + + /** + * Returns the weblog. + * + * @return Zend_Service_Technorati_Weblog + */ + public function getWeblog() { + return $this->_weblog; + } + + /** + * Returns number of unique blogs linking this blog. + * + * @return integer the number of inbound blogs + */ + public function getInboundBlogs() + { + return (int) $this->_inboundBlogs; + } + + /** + * Returns number of incoming links to this blog. + * + * @return integer the number of inbound links + */ + public function getInboundLinks() + { + return (int) $this->_inboundLinks; + } + +} diff --git a/lib/zend/Zend/Service/Technorati/CosmosResult.php b/lib/zend/Zend/Service/Technorati/CosmosResult.php new file mode 100644 index 0000000000..c3767178c3 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/CosmosResult.php @@ -0,0 +1,152 @@ +_fields = array( '_nearestPermalink' => 'nearestpermalink', + '_excerpt' => 'excerpt', + '_linkCreated' => 'linkcreated', + '_linkUrl' => 'linkurl'); + parent::__construct($dom); + + // weblog object field + $this->_parseWeblog(); + + // filter fields + $this->_nearestPermalink = Zend_Service_Technorati_Utils::normalizeUriHttp($this->_nearestPermalink); + $this->_linkUrl = Zend_Service_Technorati_Utils::normalizeUriHttp($this->_linkUrl); + $this->_linkCreated = Zend_Service_Technorati_Utils::normalizeDate($this->_linkCreated); + } + + /** + * Returns the weblog object that links queried URL. + * + * @return Zend_Service_Technorati_Weblog + */ + public function getWeblog() { + return $this->_weblog; + } + + /** + * Returns the nearest permalink tracked for queried URL. + * + * @return Zend_Uri_Http + */ + public function getNearestPermalink() { + return $this->_nearestPermalink; + } + + /** + * Returns the excerpt of the blog/page linking queried URL. + * + * @return string + */ + public function getExcerpt() { + return $this->_excerpt; + } + + /** + * Returns the datetime the link was created. + * + * @return Zend_Date + */ + public function getLinkCreated() { + return $this->_linkCreated; + } + + /** + * If queried URL is a valid blog, + * returns the URL of the specific link target page. + * + * @return Zend_Uri_Http + */ + public function getLinkUrl() { + return $this->_linkUrl; + } + +} diff --git a/lib/zend/Zend/Service/Technorati/CosmosResultSet.php b/lib/zend/Zend/Service/Technorati/CosmosResultSet.php new file mode 100644 index 0000000000..09f75ab5e1 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/CosmosResultSet.php @@ -0,0 +1,176 @@ +_xpath->query('/tapi/document/result/inboundlinks/text()'); + if ($result->length == 1) $this->_inboundLinks = (int) $result->item(0)->data; + + $result = $this->_xpath->query('/tapi/document/result/inboundblogs/text()'); + if ($result->length == 1) $this->_inboundBlogs = (int) $result->item(0)->data; + + $result = $this->_xpath->query('/tapi/document/result/weblog'); + if ($result->length == 1) { + /** + * @see Zend_Service_Technorati_Weblog + */ + require_once 'Zend/Service/Technorati/Weblog.php'; + $this->_weblog = new Zend_Service_Technorati_Weblog($result->item(0)); + } + + $result = $this->_xpath->query('/tapi/document/result/url/text()'); + if ($result->length == 1) { + try { + // fetched URL often doens't include schema + // and this issue causes the following line to fail + $this->_url = Zend_Service_Technorati_Utils::normalizeUriHttp($result->item(0)->data); + } catch(Zend_Service_Technorati_Exception $e) { + if ($this->getWeblog() instanceof Zend_Service_Technorati_Weblog) { + $this->_url = $this->getWeblog()->getUrl(); + } + } + } + + $this->_totalResultsReturned = (int) $this->_xpath->evaluate("count(/tapi/document/item)"); + + // total number of results depends on query type + // for now check only getInboundLinks() and getInboundBlogs() value + if ((int) $this->getInboundLinks() > 0) { + $this->_totalResultsAvailable = $this->getInboundLinks(); + } elseif ((int) $this->getInboundBlogs() > 0) { + $this->_totalResultsAvailable = $this->getInboundBlogs(); + } else { + $this->_totalResultsAvailable = 0; + } + } + + + /** + * Returns the weblog URL. + * + * @return Zend_Uri_Http + */ + public function getUrl() { + return $this->_url; + } + + /** + * Returns the weblog. + * + * @return Zend_Service_Technorati_Weblog + */ + public function getWeblog() { + return $this->_weblog; + } + + /** + * Returns number of unique blogs linking this blog. + * + * @return integer the number of inbound blogs + */ + public function getInboundBlogs() + { + return $this->_inboundBlogs; + } + + /** + * Returns number of incoming links to this blog. + * + * @return integer the number of inbound links + */ + public function getInboundLinks() + { + return $this->_inboundLinks; + } + + /** + * Implements Zend_Service_Technorati_ResultSet::current(). + * + * @return Zend_Service_Technorati_CosmosResult current result + */ + public function current() + { + /** + * @see Zend_Service_Technorati_CosmosResult + */ + require_once 'Zend/Service/Technorati/CosmosResult.php'; + return new Zend_Service_Technorati_CosmosResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Technorati/DailyCountsResult.php b/lib/zend/Zend/Service/Technorati/DailyCountsResult.php new file mode 100644 index 0000000000..2d6790fb8e --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/DailyCountsResult.php @@ -0,0 +1,93 @@ +_fields = array( '_date' => 'date', + '_count' => 'count'); + parent::__construct($dom); + + // filter fields + $this->_date = new Zend_Date(strtotime($this->_date)); + $this->_count = (int) $this->_count; + } + + /** + * Returns the date of count. + * + * @return Zend_Date + */ + public function getDate() { + return $this->_date; + } + + /** + * Returns the number of posts containing query on given date. + * + * @return int + */ + public function getCount() { + return $this->_count; + } +} diff --git a/lib/zend/Zend/Service/Technorati/DailyCountsResultSet.php b/lib/zend/Zend/Service/Technorati/DailyCountsResultSet.php new file mode 100644 index 0000000000..c5b6585be3 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/DailyCountsResultSet.php @@ -0,0 +1,125 @@ +_xpath->query('/tapi/document/result/days/text()'); + if ($result->length == 1) $this->_days = (int) $result->item(0)->data; + + $result = $this->_xpath->query('/tapi/document/result/searchurl/text()'); + if ($result->length == 1) { + $this->_searchUrl = Zend_Service_Technorati_Utils::normalizeUriHttp($result->item(0)->data); + } + + $this->_totalResultsReturned = (int) $this->_xpath->evaluate("count(/tapi/document/items/item)"); + $this->_totalResultsAvailable = (int) $this->getDays(); + } + + + /** + * Returns the search URL for given query. + * + * @return Zend_Uri_Http + */ + public function getSearchUrl() { + return $this->_searchUrl; + } + + /** + * Returns the number of days for which counts provided. + * + * @return int + */ + public function getDays() { + return $this->_days; + } + + /** + * Implements Zend_Service_Technorati_ResultSet::current(). + * + * @return Zend_Service_Technorati_DailyCountsResult current result + */ + public function current() + { + /** + * @see Zend_Service_Technorati_DailyCountsResult + */ + require_once 'Zend/Service/Technorati/DailyCountsResult.php'; + return new Zend_Service_Technorati_DailyCountsResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Technorati/Exception.php b/lib/zend/Zend/Service/Technorati/Exception.php new file mode 100644 index 0000000000..e29c07fe75 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/Exception.php @@ -0,0 +1,39 @@ +query('//result'); + if ($result->length == 1) { + $this->_author = new Zend_Service_Technorati_Author($result->item(0)); + } + + /** + * @see Zend_Service_Technorati_Weblog + */ + require_once 'Zend/Service/Technorati/Weblog.php'; + + $result = $xpath->query('//item/weblog'); + if ($result->length >= 1) { + foreach ($result as $weblog) { + $this->_weblogs[] = new Zend_Service_Technorati_Weblog($weblog); + } + } + } + + + /** + * Returns the author associated with queried username. + * + * @return Zend_Service_Technorati_Author + */ + public function getAuthor() { + return $this->_author; + } + + /** + * Returns the collection of weblogs authored by queried username. + * + * @return array of Zend_Service_Technorati_Weblog + */ + public function getWeblogs() { + return $this->_weblogs; + } + +} diff --git a/lib/zend/Zend/Service/Technorati/KeyInfoResult.php b/lib/zend/Zend/Service/Technorati/KeyInfoResult.php new file mode 100644 index 0000000000..f469b71a21 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/KeyInfoResult.php @@ -0,0 +1,118 @@ +_dom = $dom; + // $this->_xpath = new DOMXPath($dom); + $xpath = new DOMXPath($dom); + + $this->_apiQueries = (int) $xpath->query('/tapi/document/result/apiqueries/text()')->item(0)->data; + $this->_maxQueries = (int) $xpath->query('/tapi/document/result/maxqueries/text()')->item(0)->data; + $this->setApiKey($apiKey); + } + + + /** + * Returns API Key string. + * + * @return string API Key string + */ + public function getApiKey() { + return $this->_apiKey; + } + + /** + * Returns the number of queries sent today. + * + * @return int number of queries sent today + */ + public function getApiQueries() { + return $this->_apiQueries; + } + + /** + * Returns Key's daily query limit. + * + * @return int maximum number of available queries per day + */ + public function getMaxQueries() { + return $this->_maxQueries; + } + + + /** + * Sets API Key string. + * + * @param string $apiKey the API Key + * @return Zend_Service_Technorati_KeyInfoResult $this instance + */ + public function setApiKey($apiKey) { + $this->_apiKey = $apiKey; + return $this; + } +} diff --git a/lib/zend/Zend/Service/Technorati/Result.php b/lib/zend/Zend/Service/Technorati/Result.php new file mode 100644 index 0000000000..d8f42f53c2 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/Result.php @@ -0,0 +1,121 @@ + 'xmlfieldtag' + * + * @var array + * @access protected + */ + protected $_fields; + + /** + * The ReST fragment for this result object + * + * @var DomElement + * @access protected + */ + protected $_dom; + + /** + * Object for $this->_dom + * + * @var DOMXpath + * @access protected + */ + protected $_xpath; + + + /** + * Constructs a new object from DOM Element. + * Properties are automatically fetched from XML + * according to array of $_fields to be read. + * + * @param DomElement $result the ReST fragment for this object + */ + public function __construct(DomElement $dom) + { + $this->_xpath = new DOMXPath($dom->ownerDocument); + $this->_dom = $dom; + + // default fields for all search results + $fields = array(); + + // merge with child's object fields + $this->_fields = array_merge($this->_fields, $fields); + + // add results to appropriate fields + foreach($this->_fields as $phpName => $xmlName) { + $query = "./$xmlName/text()"; + $node = $this->_xpath->query($query, $this->_dom); + if ($node->length == 1) { + $this->{$phpName} = (string) $node->item(0)->data; + } + } + } + + /** + * Parses weblog node and sets weblog object. + * + * @return void + */ + protected function _parseWeblog() + { + // weblog object field + $result = $this->_xpath->query('./weblog', $this->_dom); + if ($result->length == 1) { + /** + * @see Zend_Service_Technorati_Weblog + */ + require_once 'Zend/Service/Technorati/Weblog.php'; + $this->_weblog = new Zend_Service_Technorati_Weblog($result->item(0)); + } else { + $this->_weblog = null; + } + } + + /** + * Returns the document fragment for this object as XML string. + * + * @return string the document fragment for this object + * converted into XML format + */ + public function getXml() + { + return $this->_dom->ownerDocument->saveXML($this->_dom); + } +} diff --git a/lib/zend/Zend/Service/Technorati/ResultSet.php b/lib/zend/Zend/Service/Technorati/ResultSet.php new file mode 100644 index 0000000000..1e53d7d6d1 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/ResultSet.php @@ -0,0 +1,290 @@ +_dom + * + * @var DOMXpath + * @access protected + */ + protected $_xpath; + + /** + * XML string representation for $this->_dom + * + * @var string + * @access protected + */ + protected $_xml; + + /** + * Current Item + * + * @var int + * @access protected + */ + protected $_currentIndex = 0; + + + /** + * Parses the search response and retrieves the results for iteration. + * + * @param DomDocument $dom the ReST fragment for this object + * @param array $options query options as associative array + */ + public function __construct(DomDocument $dom, $options = array()) + { + $this->_init($dom, $options); + + // Technorati loves to make developer's life really hard + // I must read query options in order to normalize a single way + // to display start and limit. + // The value is printed out in XML using many different tag names, + // too hard to get it from XML + + // Additionally, the following tags should be always available + // according to API documentation but... this is not the truth! + // - querytime + // - limit + // - start (sometimes rankingstart) + + // query tag is only available for some requests, the same for url. + // For now ignore them. + + //$start = isset($options['start']) ? $options['start'] : 1; + //$limit = isset($options['limit']) ? $options['limit'] : 20; + //$this->_firstResultPosition = $start; + } + + /** + * Initializes this object from a DomDocument response. + * + * Because __construct and __wakeup shares some common executions, + * it's useful to group them in a single initialization method. + * This method is called once each time a new instance is created + * or a serialized object is unserialized. + * + * @param DomDocument $dom the ReST fragment for this object + * @param array $options query options as associative array + * * @return void + */ + protected function _init(DomDocument $dom, $options = array()) + { + $this->_dom = $dom; + $this->_xpath = new DOMXPath($dom); + + $this->_results = $this->_xpath->query("//item"); + } + + /** + * Number of results returned. + * + * @return int total number of results returned + */ + public function totalResults() + { + return (int) $this->_totalResultsReturned; + } + + + /** + * Number of available results. + * + * @return int total number of available results + */ + public function totalResultsAvailable() + { + return (int) $this->_totalResultsAvailable; + } + + /** + * Implements SeekableIterator::current(). + * + * @return void + * @throws Zend_Service_Exception + * @abstract + */ + // abstract public function current(); + + /** + * Implements SeekableIterator::key(). + * + * @return int + */ + public function key() + { + return $this->_currentIndex; + } + + /** + * Implements SeekableIterator::next(). + * + * @return void + */ + public function next() + { + $this->_currentIndex += 1; + } + + /** + * Implements SeekableIterator::rewind(). + * + * @return bool + */ + public function rewind() + { + $this->_currentIndex = 0; + return true; + } + + /** + * Implement SeekableIterator::seek(). + * + * @param int $index + * @return void + * @throws OutOfBoundsException + */ + public function seek($index) + { + $indexInt = (int) $index; + if ($indexInt >= 0 && $indexInt < $this->_results->length) { + $this->_currentIndex = $indexInt; + } else { + throw new OutOfBoundsException("Illegal index '$index'"); + } + } + + /** + * Implement SeekableIterator::valid(). + * + * @return boolean + */ + public function valid() + { + return null !== $this->_results && $this->_currentIndex < $this->_results->length; + } + + /** + * Returns the response document as XML string. + * + * @return string the response document converted into XML format + */ + public function getXml() + { + return $this->_dom->saveXML(); + } + + /** + * Overwrites standard __sleep method to make this object serializable. + * + * DomDocument and DOMXpath objects cannot be serialized. + * This method converts them back to an XML string. + * + * @return void + */ + public function __sleep() { + $this->_xml = $this->getXml(); + $vars = array_keys(get_object_vars($this)); + return array_diff($vars, array('_dom', '_xpath')); + } + + /** + * Overwrites standard __wakeup method to make this object unserializable. + * + * Restores object status before serialization. + * Converts XML string into a DomDocument object and creates a valid + * DOMXpath instance for given DocDocument. + * + * @return void + */ + public function __wakeup() { + $dom = new DOMDocument(); + $dom->loadXml($this->_xml); + $this->_init($dom); + $this->_xml = null; // reset XML content + } +} diff --git a/lib/zend/Zend/Service/Technorati/SearchResult.php b/lib/zend/Zend/Service/Technorati/SearchResult.php new file mode 100644 index 0000000000..23510f854b --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/SearchResult.php @@ -0,0 +1,150 @@ +_fields = array( '_permalink' => 'permalink', + '_excerpt' => 'excerpt', + '_created' => 'created', + '_title' => 'title'); + parent::__construct($dom); + + // weblog object field + $this->_parseWeblog(); + + // filter fields + $this->_permalink = Zend_Service_Technorati_Utils::normalizeUriHttp($this->_permalink); + $this->_created = Zend_Service_Technorati_Utils::normalizeDate($this->_created); + } + + /** + * Returns the weblog object that links queried URL. + * + * @return Zend_Service_Technorati_Weblog + */ + public function getWeblog() { + return $this->_weblog; + } + + /** + * Returns the title of the entry. + * + * @return string + */ + public function getTitle() { + return $this->_title; + } + + /** + * Returns the blurb from entry with search term highlighted. + * + * @return string + */ + public function getExcerpt() { + return $this->_excerpt; + } + + /** + * Returns the datetime the entry was created. + * + * @return Zend_Date + */ + public function getCreated() { + return $this->_created; + } + + /** + * Returns the permalink of the blog entry. + * + * @return Zend_Uri_Http + */ + public function getPermalink() { + return $this->_permalink; + } + +} diff --git a/lib/zend/Zend/Service/Technorati/SearchResultSet.php b/lib/zend/Zend/Service/Technorati/SearchResultSet.php new file mode 100644 index 0000000000..b3c97b8e26 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/SearchResultSet.php @@ -0,0 +1,79 @@ +_xpath->query('/tapi/document/result/querycount/text()'); + if ($result->length == 1) $this->_queryCount = (int) $result->item(0)->data; + + $this->_totalResultsReturned = (int) $this->_xpath->evaluate("count(/tapi/document/item)"); + $this->_totalResultsAvailable = (int) $this->_queryCount; + } + + /** + * Implements Zend_Service_Technorati_ResultSet::current(). + * + * @return Zend_Service_Technorati_SearchResult current result + */ + public function current() + { + /** + * @see Zend_Service_Technorati_SearchResult + */ + require_once 'Zend/Service/Technorati/SearchResult.php'; + return new Zend_Service_Technorati_SearchResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Technorati/TagResult.php b/lib/zend/Zend/Service/Technorati/TagResult.php new file mode 100644 index 0000000000..35c7236a46 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/TagResult.php @@ -0,0 +1,171 @@ +_fields = array( '_permalink' => 'permalink', + '_excerpt' => 'excerpt', + '_created' => 'created', + '_updated' => 'postupdate', + '_title' => 'title'); + parent::__construct($dom); + + // weblog object field + $this->_parseWeblog(); + + // filter fields + $this->_permalink = Zend_Service_Technorati_Utils::normalizeUriHttp($this->_permalink); + $this->_created = Zend_Service_Technorati_Utils::normalizeDate($this->_created); + $this->_updated = Zend_Service_Technorati_Utils::normalizeDate($this->_updated); + } + + /** + * Returns the weblog object that links queried URL. + * + * @return Zend_Service_Technorati_Weblog + */ + public function getWeblog() { + return $this->_weblog; + } + + /** + * Returns the title of the entry. + * + * @return string + */ + public function getTitle() { + return $this->_title; + } + + /** + * Returns the blurb from entry with search term highlighted. + * + * @return string + */ + public function getExcerpt() { + return $this->_excerpt; + } + + /** + * Returns the datetime the entry was created. + * + * @return Zend_Date + */ + public function getCreated() { + return $this->_created; + } + + /** + * Returns the datetime the entry was updated. + * + * @return Zend_Date + */ + public function getUpdated() { + return $this->_updated; + } + + /** + * Returns the permalink of the blog entry. + * + * @return Zend_Uri_Http + */ + public function getPermalink() { + return $this->_permalink; + } + +} diff --git a/lib/zend/Zend/Service/Technorati/TagResultSet.php b/lib/zend/Zend/Service/Technorati/TagResultSet.php new file mode 100644 index 0000000000..797d7f0f25 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/TagResultSet.php @@ -0,0 +1,110 @@ +_xpath->query('/tapi/document/result/postsmatched/text()'); + if ($result->length == 1) $this->_postsMatched = (int) $result->item(0)->data; + + $result = $this->_xpath->query('/tapi/document/result/blogsmatched/text()'); + if ($result->length == 1) $this->_blogsMatched = (int) $result->item(0)->data; + + $this->_totalResultsReturned = (int) $this->_xpath->evaluate("count(/tapi/document/item)"); + /** @todo Validate the following assertion */ + $this->_totalResultsAvailable = (int) $this->getPostsMatched(); + } + + + /** + * Returns the number of posts that match the tag. + * + * @return int + */ + public function getPostsMatched() { + return $this->_postsMatched; + } + + /** + * Returns the number of blogs that match the tag. + * + * @return int + */ + public function getBlogsMatched() { + return $this->_blogsMatched; + } + + /** + * Implements Zend_Service_Technorati_ResultSet::current(). + * + * @return Zend_Service_Technorati_TagResult current result + */ + public function current() + { + /** + * @see Zend_Service_Technorati_TagResult + */ + require_once 'Zend/Service/Technorati/TagResult.php'; + return new Zend_Service_Technorati_TagResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Technorati/TagsResult.php b/lib/zend/Zend/Service/Technorati/TagsResult.php new file mode 100644 index 0000000000..82860bad21 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/TagsResult.php @@ -0,0 +1,93 @@ +_fields = array( '_tag' => 'tag', + '_posts' => 'posts'); + parent::__construct($dom); + + // filter fields + $this->_tag = (string) $this->_tag; + $this->_posts = (int) $this->_posts; + } + + /** + * Returns the tag name. + * + * @return string + */ + public function getTag() { + return $this->_tag; + } + + /** + * Returns the number of posts. + * + * @return int + */ + public function getPosts() { + return $this->_posts; + } +} diff --git a/lib/zend/Zend/Service/Technorati/TagsResultSet.php b/lib/zend/Zend/Service/Technorati/TagsResultSet.php new file mode 100644 index 0000000000..62c0a7e994 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/TagsResultSet.php @@ -0,0 +1,67 @@ +_totalResultsReturned = (int) $this->_xpath->evaluate("count(/tapi/document/item)"); + $this->_totalResultsAvailable = (int) $this->_totalResultsReturned; + } + + /** + * Implements Zend_Service_Technorati_ResultSet::current(). + * + * @return Zend_Service_Technorati_TagsResult current result + */ + public function current() + { + /** + * @see Zend_Service_Technorati_TagsResult + */ + require_once 'Zend/Service/Technorati/TagsResult.php'; + return new Zend_Service_Technorati_TagsResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Technorati/Utils.php b/lib/zend/Zend/Service/Technorati/Utils.php new file mode 100644 index 0000000000..a71a28a518 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/Utils.php @@ -0,0 +1,136 @@ +getMessage()); + } + } + + // allow inly Zend_Uri_Http objects or child classes + if (!($uri instanceof Zend_Uri_Http)) { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception( + "Invalid URL $uri, only HTTP(S) protocols can be used"); + } + + return $uri; + } + /** + * Parses, validates and returns a valid Zend_Date object + * from given $input. + * + * $input can be either a string, an integer or a Zend_Date object. + * If $input is string or int, it will be provided to Zend_Date as it is. + * If $input is a Zend_Date object, the object instance will be returned. + * + * @param mixed|Zend_Date $input + * @return null|Zend_Date + * @throws Zend_Service_Technorati_Exception + * @static + */ + public static function normalizeDate($input) + { + /** + * @see Zend_Date + */ + require_once 'Zend/Date.php'; + /** + * @see Zend_Locale + */ + require_once 'Zend/Locale.php'; + + // allow null as value and return valid Zend_Date objects + if (($input === null) || ($input instanceof Zend_Date)) { + return $input; + } + + // due to a BC break as of ZF 1.5 it's not safe to use Zend_Date::isDate() here + // see ZF-2524, ZF-2334 + if (@strtotime($input) !== FALSE) { + return new Zend_Date($input); + } else { + /** + * @see Zend_Service_Technorati_Exception + */ + require_once 'Zend/Service/Technorati/Exception.php'; + throw new Zend_Service_Technorati_Exception("'$input' is not a valid Date/Time"); + } + } + + /** + * @todo public static function xpathQueryAndSet() {} + */ + + /** + * @todo public static function xpathQueryAndSetIf() {} + */ + + /** + * @todo public static function xpathQueryAndSetUnless() {} + */ +} diff --git a/lib/zend/Zend/Service/Technorati/Weblog.php b/lib/zend/Zend/Service/Technorati/Weblog.php new file mode 100644 index 0000000000..ddace44957 --- /dev/null +++ b/lib/zend/Zend/Service/Technorati/Weblog.php @@ -0,0 +1,486 @@ +ownerDocument); + + $result = $xpath->query('./name/text()', $dom); + if ($result->length == 1) $this->setName($result->item(0)->data); + + $result = $xpath->query('./url/text()', $dom); + if ($result->length == 1) $this->setUrl($result->item(0)->data); + + $result = $xpath->query('./inboundblogs/text()', $dom); + if ($result->length == 1) $this->setInboundBlogs($result->item(0)->data); + + $result = $xpath->query('./inboundlinks/text()', $dom); + if ($result->length == 1) $this->setInboundLinks($result->item(0)->data); + + $result = $xpath->query('./lastupdate/text()', $dom); + if ($result->length == 1) $this->setLastUpdate($result->item(0)->data); + + /* The following elements need more attention */ + + $result = $xpath->query('./rssurl/text()', $dom); + if ($result->length == 1) $this->setRssUrl($result->item(0)->data); + + $result = $xpath->query('./atomurl/text()', $dom); + if ($result->length == 1) $this->setAtomUrl($result->item(0)->data); + + $result = $xpath->query('./author', $dom); + if ($result->length >= 1) { + foreach ($result as $author) { + $this->_authors[] = new Zend_Service_Technorati_Author($author); + } + } + + /** + * The following are optional elements + * + * I can't find any official documentation about the following properties + * however they are included in response DTD and/or test responses. + */ + + $result = $xpath->query('./rank/text()', $dom); + if ($result->length == 1) $this->setRank($result->item(0)->data); + + $result = $xpath->query('./lat/text()', $dom); + if ($result->length == 1) $this->setLat($result->item(0)->data); + + $result = $xpath->query('./lon/text()', $dom); + if ($result->length == 1) $this->setLon($result->item(0)->data); + + $result = $xpath->query('./hasphoto/text()', $dom); + if ($result->length == 1) $this->setHasPhoto($result->item(0)->data); + } + + + /** + * Returns weblog name. + * + * @return string Weblog name + */ + public function getName() + { + return $this->_name; + } + + /** + * Returns weblog URL. + * + * @return null|Zend_Uri_Http object representing weblog base URL + */ + public function getUrl() + { + return $this->_url; + } + + /** + * Returns number of unique blogs linking this blog. + * + * @return integer the number of inbound blogs + */ + public function getInboundBlogs() + { + return $this->_inboundBlogs; + } + + /** + * Returns number of incoming links to this blog. + * + * @return integer the number of inbound links + */ + public function getInboundLinks() + { + return $this->_inboundLinks; + } + + /** + * Returns weblog Rss URL. + * + * @return null|Zend_Uri_Http object representing the URL + * of the RSS feed for given blog + */ + public function getRssUrl() + { + return $this->_rssUrl; + } + + /** + * Returns weblog Atom URL. + * + * @return null|Zend_Uri_Http object representing the URL + * of the Atom feed for given blog + */ + public function getAtomUrl() + { + return $this->_atomUrl; + } + + /** + * Returns UNIX timestamp of the last weblog update. + * + * @return integer UNIX timestamp of the last weblog update + */ + public function getLastUpdate() + { + return $this->_lastUpdate; + } + + /** + * Returns weblog rank value. + * + * Note. This property is not documented. + * + * @return integer weblog rank value + */ + public function getRank() + { + return $this->_rank; + } + + /** + * Returns weblog latitude coordinate. + * + * Note. This property is not documented. + * + * @return float weblog latitude coordinate + */ + public function getLat() { + return $this->_lat; + } + + /** + * Returns weblog longitude coordinate. + * + * Note. This property is not documented. + * + * @return float weblog longitude coordinate + */ + public function getLon() + { + return $this->_lon; + } + + /** + * Returns whether the author who claimed this weblog has a photo. + * + * Note. This property is not documented. + * + * @return bool TRUE if the author who claimed this weblog has a photo, + * FALSE otherwise. + */ + public function hasPhoto() + { + return (bool) $this->_hasPhoto; + } + + /** + * Returns the array of weblog authors. + * + * @return array of Zend_Service_Technorati_Author authors + */ + public function getAuthors() + { + return (array) $this->_authors; + } + + + /** + * Sets weblog name. + * + * @param string $name + * @return Zend_Service_Technorati_Weblog $this instance + */ + public function setName($name) + { + $this->_name = (string) $name; + return $this; + } + + /** + * Sets weblog URL. + * + * @param string|Zend_Uri_Http $url + * @return void + * @throws Zend_Service_Technorati_Exception if $input is an invalid URI + * (via Zend_Service_Technorati_Utils::normalizeUriHttp) + */ + public function setUrl($url) + { + $this->_url = Zend_Service_Technorati_Utils::normalizeUriHttp($url); + return $this; + } + + /** + * Sets number of inbound blogs. + * + * @param integer $number + * @return Zend_Service_Technorati_Weblog $this instance + */ + public function setInboundBlogs($number) + { + $this->_inboundBlogs = (int) $number; + return $this; + } + + /** + * Sets number of Iinbound links. + * + * @param integer $number + * @return Zend_Service_Technorati_Weblog $this instance + */ + public function setInboundLinks($number) + { + $this->_inboundLinks = (int) $number; + return $this; + } + + /** + * Sets weblog Rss URL. + * + * @param string|Zend_Uri_Http $url + * @return Zend_Service_Technorati_Weblog $this instance + * @throws Zend_Service_Technorati_Exception if $input is an invalid URI + * (via Zend_Service_Technorati_Utils::normalizeUriHttp) + */ + public function setRssUrl($url) + { + $this->_rssUrl = Zend_Service_Technorati_Utils::normalizeUriHttp($url); + return $this; + } + + /** + * Sets weblog Atom URL. + * + * @param string|Zend_Uri_Http $url + * @return Zend_Service_Technorati_Weblog $this instance + * @throws Zend_Service_Technorati_Exception if $input is an invalid URI + * (via Zend_Service_Technorati_Utils::normalizeUriHttp) + */ + public function setAtomUrl($url) + { + $this->_atomUrl = Zend_Service_Technorati_Utils::normalizeUriHttp($url); + return $this; + } + + /** + * Sets weblog Last Update timestamp. + * + * $datetime can be any value supported by + * Zend_Service_Technorati_Utils::normalizeDate(). + * + * @param mixed $datetime A string representing the last update date time + * in a valid date time format + * @return Zend_Service_Technorati_Weblog $this instance + * @throws Zend_Service_Technorati_Exception + */ + public function setLastUpdate($datetime) + { + $this->_lastUpdate = Zend_Service_Technorati_Utils::normalizeDate($datetime); + return $this; + } + + /** + * Sets weblog Rank. + * + * @param integer $rank + * @return Zend_Service_Technorati_Weblog $this instance + */ + public function setRank($rank) + { + $this->_rank = (int) $rank; + return $this; + } + + /** + * Sets weblog latitude coordinate. + * + * @param float $coordinate + * @return Zend_Service_Technorati_Weblog $this instance + */ + public function setLat($coordinate) + { + $this->_lat = (float) $coordinate; + return $this; + } + + /** + * Sets weblog longitude coordinate. + * + * @param float $coordinate + * @return Zend_Service_Technorati_Weblog $this instance + */ + public function setLon($coordinate) + { + $this->_lon = (float) $coordinate; + return $this; + } + + /** + * Sets hasPhoto property. + * + * @param bool $hasPhoto + * @return Zend_Service_Technorati_Weblog $this instance + */ + public function setHasPhoto($hasPhoto) + { + $this->_hasPhoto = (bool) $hasPhoto; + return $this; + } + +} diff --git a/lib/zend/Zend/Service/Twitter.php b/lib/zend/Zend/Service/Twitter.php new file mode 100755 index 0000000000..e536f44255 --- /dev/null +++ b/lib/zend/Zend/Service/Twitter.php @@ -0,0 +1,979 @@ +setLocalHttpClient(clone self::getHttpClient()); + if (is_array($username) && is_null($password)) { + if (isset($username['username']) && isset($username['password'])) { + $this->setUsername($username['username']); + $this->setPassword($username['password']); + } elseif (isset($username[0]) && isset($username[1])) { + $this->setUsername($username[0]); + $this->setPassword($username[1]); + } + } else { + $this->setUsername($username); + $this->setPassword($password); + } + $this->setUri('http://twitter.com'); + $this->_localHttpClient->setHeaders('Accept-Charset', 'ISO-8859-1,utf-8'); + } + + /** + * Set local HTTP client as distinct from the static HTTP client + * as inherited from Zend_Rest_Client. + * + * @param Zend_Http_Client $client + * @return self + */ + public function setLocalHttpClient(Zend_Http_Client $client) + { + $this->_localHttpClient = $client; + return $this; + } + + public function getLocalHttpClient() + { + return $this->_localHttpClient; + } + + /** + * Retrieve username + * + * @return string + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Set username + * + * @param string $value + * @return Zend_Service_Twitter + */ + public function setUsername($value) + { + $this->_username = $value; + $this->_authInitialized = false; + return $this; + } + + /** + * Retrieve password + * + * @return string + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Set password + * + * @param string $value + * @return Zend_Service_Twitter + */ + public function setPassword($value) + { + $this->_password = $value; + $this->_authInitialized = false; + return $this; + } + + /** + * Proxy service methods + * + * @param string $type + * @return Zend_Service_Twitter + * @throws Zend_Service_Twitter_Exception if method is not in method types list + */ + public function __get($type) + { + if (!in_array($type, $this->_methodTypes)) { + include_once 'Zend/Service/Twitter/Exception.php'; + throw new Zend_Service_Twitter_Exception('Invalid method type "' . $type . '"'); + } + $this->_methodType = $type; + return $this; + } + + /** + * Method overloading + * + * @param string $method + * @param array $params + * @return mixed + * @throws Zend_Service_Twitter_Exception if unable to find method + */ + public function __call($method, $params) + { + if (empty($this->_methodType)) { + include_once 'Zend/Service/Twitter/Exception.php'; + throw new Zend_Service_Twitter_Exception('Invalid method "' . $method . '"'); + } + $test = $this->_methodType . ucfirst($method); + if (!method_exists($this, $test)) { + include_once 'Zend/Service/Twitter/Exception.php'; + throw new Zend_Service_Twitter_Exception('Invalid method "' . $test . '"'); + } + + return call_user_func_array(array($this, $test), $params); + } + + /** + * Initialize HTTP authentication + * + * @return void + */ + protected function _init() + { + $client = $this->_localHttpClient; + $client->resetParameters(); + if (null == $this->_cookieJar) { + $client->setCookieJar(); + $this->_cookieJar = $client->getCookieJar(); + } else { + $client->setCookieJar($this->_cookieJar); + } + if (!$this->_authInitialized) { + $client->setAuth($this->getUsername(), $this->getPassword()); + $this->_authInitialized = true; + } + } + + /** + * Set date header + * + * @param int|string $value + * @deprecated Not supported by Twitter since April 08, 2009 + * @return void + */ + protected function _setDate($value) + { + if (is_int($value)) { + $date = date($this->_dateFormat, $value); + } else { + $date = date($this->_dateFormat, strtotime($value)); + } + $this->_localHttpClient->setHeaders('If-Modified-Since', $date); + } + + /** + * Public Timeline status + * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function statusPublicTimeline() + { + $this->_init(); + $path = '/statuses/public_timeline.xml'; + $response = $this->_get($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Friend Timeline Status + * + * $params may include one or more of the following keys + * - id: ID of a friend whose timeline you wish to receive + * - count: how many statuses to return + * - since_id: return results only after the specific tweet + * - page: return page X of results + * + * @param array $params + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return void + */ + public function statusFriendsTimeline(array $params = array()) + { + $this->_init(); + $path = '/statuses/friends_timeline'; + $_params = array(); + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'count': + $count = (int) $value; + if (0 >= $count) { + $count = 1; + } elseif (200 < $count) { + $count = 200; + } + $_params['count'] = (int) $count; + break; + case 'since_id': + $_params['since_id'] = $this->_validInteger($value); + break; + case 'page': + $_params['page'] = (int) $value; + break; + default: + break; + } + } + $path .= '.xml'; + $response = $this->_get($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * User Timeline status + * + * $params may include one or more of the following keys + * - id: ID of a friend whose timeline you wish to receive + * - since_id: return results only after the tweet id specified + * - page: return page X of results + * - count: how many statuses to return + * - max_id: returns only statuses with an ID less than or equal to the specified ID + * - user_id: specfies the ID of the user for whom to return the user_timeline + * - screen_name: specfies the screen name of the user for whom to return the user_timeline + * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function statusUserTimeline(array $params = array()) + { + $this->_init(); + $path = '/statuses/user_timeline'; + $_params = array(); + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'id': + $path .= '/' . $value; + break; + case 'page': + $_params['page'] = (int) $value; + break; + case 'count': + $count = (int) $value; + if (0 >= $count) { + $count = 1; + } elseif (200 < $count) { + $count = 200; + } + $_params['count'] = $count; + break; + case 'user_id': + $_params['user_id'] = $this->_validInteger($value); + break; + case 'screen_name': + $_params['screen_name'] = $this->_validateScreenName($value); + break; + case 'since_id': + $_params['since_id'] = $this->_validInteger($value); + break; + case 'max_id': + $_params['max_id'] = $this->_validInteger($value); + break; + default: + break; + } + } + $path .= '.xml'; + $response = $this->_get($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Show a single status + * + * @param int $id Id of status to show + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function statusShow($id) + { + $this->_init(); + $path = '/statuses/show/' . $this->_validInteger($id) . '.xml'; + $response = $this->_get($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Update user's current status + * + * @param string $status + * @param int $in_reply_to_status_id + * @return Zend_Rest_Client_Result + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @throws Zend_Service_Twitter_Exception if message is too short or too long + */ + public function statusUpdate($status, $in_reply_to_status_id = null) + { + $this->_init(); + $path = '/statuses/update.xml'; + $len = iconv_strlen(htmlspecialchars($status, ENT_QUOTES, 'UTF-8'), 'UTF-8'); + if ($len > self::STATUS_MAX_CHARACTERS) { + include_once 'Zend/Service/Twitter/Exception.php'; + throw new Zend_Service_Twitter_Exception('Status must be no more than ' . self::STATUS_MAX_CHARACTERS . ' characters in length'); + } elseif (0 == $len) { + include_once 'Zend/Service/Twitter/Exception.php'; + throw new Zend_Service_Twitter_Exception('Status must contain at least one character'); + } + $data = array('status' => $status); + if (is_numeric($in_reply_to_status_id) && !empty($in_reply_to_status_id)) { + $data['in_reply_to_status_id'] = $in_reply_to_status_id; + } + //$this->status = $status; + $response = $this->_post($path, $data); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Get status replies + * + * $params may include one or more of the following keys + * - since_id: return results only after the specified tweet id + * - page: return page X of results + * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function statusReplies(array $params = array()) + { + $this->_init(); + $path = '/statuses/replies.xml'; + $_params = array(); + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'since_id': + $_params['since_id'] = $this->_validInteger($value); + break; + case 'page': + $_params['page'] = (int) $value; + break; + default: + break; + } + } + $response = $this->_get($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Destroy a status message + * + * @param int $id ID of status to destroy + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function statusDestroy($id) + { + $this->_init(); + $path = '/statuses/destroy/' . $this->_validInteger($id) . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * User friends + * + * @param int|string $id Id or username of user for whom to fetch friends + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function userFriends(array $params = array()) + { + $this->_init(); + $path = '/statuses/friends'; + $_params = array(); + + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'id': + $path .= '/' . $value; + break; + case 'page': + $_params['page'] = (int) $value; + break; + default: + break; + } + } + $path .= '.xml'; + + $response = $this->_get($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * User Followers + * + * @param bool $lite If true, prevents inline inclusion of current status for followers; defaults to false + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function userFollowers($lite = false) + { + $this->_init(); + $path = '/statuses/followers.xml'; + if ($lite) { + $this->lite = 'true'; + } + $response = $this->_get($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Get featured users + * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function userFeatured() + { + $this->_init(); + $path = '/statuses/featured.xml'; + $response = $this->_get($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Show extended information on a user + * + * @param int|string $id User ID or name + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function userShow($id) + { + $this->_init(); + $path = '/users/show/' . $id . '.xml'; + $response = $this->_get($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Retrieve direct messages for the current user + * + * $params may include one or more of the following keys + * - since_id: return statuses only greater than the one specified + * - page: return page X of results + * + * @param array $params + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function directMessageMessages(array $params = array()) + { + $this->_init(); + $path = '/direct_messages.xml'; + $_params = array(); + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'since_id': + $_params['since_id'] = $this->_validInteger($value); + break; + case 'page': + $_params['page'] = (int) $value; + break; + default: + break; + } + } + $response = $this->_get($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Retrieve list of direct messages sent by current user + * + * $params may include one or more of the following keys + * - since_id: return statuses only greater than the one specified + * - page: return page X of results + * + * @param array $params + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function directMessageSent(array $params = array()) + { + $this->_init(); + $path = '/direct_messages/sent.xml'; + $_params = array(); + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'since_id': + $_params['since_id'] = $this->_validInteger($value); + break; + case 'page': + $_params['page'] = (int) $value; + break; + default: + break; + } + } + $response = $this->_get($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Send a direct message to a user + * + * @param int|string $user User to whom to send message + * @param string $text Message to send to user + * @return Zend_Rest_Client_Result + * @throws Zend_Service_Twitter_Exception if message is too short or too long + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + */ + public function directMessageNew($user, $text) + { + $this->_init(); + $path = '/direct_messages/new.xml'; + $len = iconv_strlen($text, 'UTF-8'); + if (0 == $len) { + throw new Zend_Service_Twitter_Exception('Direct message must contain at least one character'); + } elseif (140 < $len) { + throw new Zend_Service_Twitter_Exception('Direct message must contain no more than 140 characters'); + } + $data = array('user' => $user, 'text' => $text); + $response = $this->_post($path, $data); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Destroy a direct message + * + * @param int $id ID of message to destroy + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function directMessageDestroy($id) + { + $this->_init(); + $path = '/direct_messages/destroy/' . $this->_validInteger($id) . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Create friendship + * + * @param int|string $id User ID or name of new friend + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function friendshipCreate($id) + { + $this->_init(); + $path = '/friendships/create/' . $id . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Destroy friendship + * + * @param int|string $id User ID or name of friend to remove + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function friendshipDestroy($id) + { + $this->_init(); + $path = '/friendships/destroy/' . $id . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Friendship exists + * + * @param int|string $id User ID or name of friend to see if they are your friend + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_result + */ + public function friendshipExists($id) + { + $this->_init(); + $path = '/friendships/exists.xml'; + $data = array('user_a' => $this->getUsername(), 'user_b' => $id); + $response = $this->_get($path, $data); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Verify Account Credentials + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * + * @return Zend_Rest_Client_Result + */ + public function accountVerifyCredentials() + { + $this->_init(); + $response = $this->_get('/account/verify_credentials.xml'); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * End current session + * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return true + */ + public function accountEndSession() + { + $this->_init(); + $this->_get('/account/end_session'); + return true; + } + + /** + * Returns the number of api requests you have left per hour. + * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function accountRateLimitStatus() + { + $this->_init(); + $response = $this->_get('/account/rate_limit_status.xml'); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Fetch favorites + * + * $params may contain one or more of the following: + * - 'id': Id of a user for whom to fetch favorites + * - 'page': Retrieve a different page of resuls + * + * @param array $params + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function favoriteFavorites(array $params = array()) + { + $this->_init(); + $path = '/favorites'; + $_params = array(); + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'id': + $path .= '/' . $this->_validInteger($value); + break; + case 'page': + $_params['page'] = (int) $value; + break; + default: + break; + } + } + $path .= '.xml'; + $response = $this->_get($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Mark a status as a favorite + * + * @param int $id Status ID you want to mark as a favorite + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function favoriteCreate($id) + { + $this->_init(); + $path = '/favorites/create/' . $this->_validInteger($id) . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Remove a favorite + * + * @param int $id Status ID you want to de-list as a favorite + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function favoriteDestroy($id) + { + $this->_init(); + $path = '/favorites/destroy/' . $this->_validInteger($id) . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Blocks the user specified in the ID parameter as the authenticating user. + * Destroys a friendship to the blocked user if it exists. + * + * @param integer|string $id The ID or screen name of a user to block. + * @return Zend_Rest_Client_Result + */ + public function blockCreate($id) + { + $this->_init(); + $path = '/blocks/create/' . $id . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Un-blocks the user specified in the ID parameter for the authenticating user + * + * @param integer|string $id The ID or screen_name of the user to un-block. + * @return Zend_Rest_Client_Result + */ + public function blockDestroy($id) + { + $this->_init(); + $path = '/blocks/destroy/' . $id . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Returns if the authenticating user is blocking a target user. + * + * @param string|integer $id The ID or screen_name of the potentially blocked user. + * @param boolean $returnResult Instead of returning a boolean return the rest response from twitter + * @return Boolean|Zend_Rest_Client_Result + */ + public function blockExists($id, $returnResult = false) + { + $this->_init(); + $path = '/blocks/exists/' . $id . '.xml'; + $response = $this->_get($path); + + $cr = new Zend_Rest_Client_Result($response->getBody()); + + if ($returnResult === true) + return $cr; + + if (!empty($cr->request)) { + return false; + } + + return true; + } + + /** + * Returns an array of user objects that the authenticating user is blocking + * + * @param integer $page Optional. Specifies the page number of the results beginning at 1. A single page contains 20 ids. + * @param boolean $returnUserIds Optional. Returns only the userid's instead of the whole user object + * @return Zend_Rest_Client_Result + */ + public function blockBlocking($page = 1, $returnUserIds = false) + { + $this->_init(); + $path = '/blocks/blocking'; + if ($returnUserIds === true) { + $path .= '/ids'; + } + $path .= '.xml'; + $response = $this->_get($path, array('page' => $page)); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Protected function to validate that the integer is valid or return a 0 + * @param $int + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return integer + */ + protected function _validInteger($int) + { + if (preg_match("/(\d+)/", $int)) { + return $int; + } + return 0; + } + + /** + * Validate a screen name using Twitter rules + * + * @param string $name + * @throws Zend_Service_Twitter_Exception + * @return string + */ + protected function _validateScreenName($name) + { + if (!preg_match('/^[a-zA-Z0-9_]{0,20}$/', $name)) { + require_once 'Zend/Service/Twitter/Exception.php'; + throw new Zend_Service_Twitter_Exception('Screen name, "' . $name . '" should only contain alphanumeric characters and' . ' underscores, and not exceed 15 characters.'); + } + return $name; + } + + /** + * Call a remote REST web service URI and return the Zend_Http_Response object + * + * @param string $path The path to append to the URI + * @throws Zend_Rest_Client_Exception + * @return void + */ + protected function _prepare($path) + { + // Get the URI object and configure it + if (!$this->_uri instanceof Zend_Uri_Http) { + require_once 'Zend/Rest/Client/Exception.php'; + throw new Zend_Rest_Client_Exception('URI object must be set before performing call'); + } + + $uri = $this->_uri->getUri(); + + if ($path[0] != '/' && $uri[strlen($uri) - 1] != '/') { + $path = '/' . $path; + } + + $this->_uri->setPath($path); + + /** + * Get the HTTP client and configure it for the endpoint URI. Do this each time + * because the Zend_Http_Client instance is shared among all Zend_Service_Abstract subclasses. + */ + $this->_localHttpClient->resetParameters()->setUri($this->_uri); + } + + /** + * Performs an HTTP GET request to the $path. + * + * @param string $path + * @param array $query Array of GET parameters + * @throws Zend_Http_Client_Exception + * @return Zend_Http_Response + */ + protected function _get($path, array $query = null) + { + $this->_prepare($path); + $this->_localHttpClient->setParameterGet($query); + return $this->_localHttpClient->request('GET'); + } + + /** + * Performs an HTTP POST request to $path. + * + * @param string $path + * @param mixed $data Raw data to send + * @throws Zend_Http_Client_Exception + * @return Zend_Http_Response + */ + protected function _post($path, $data = null) + { + $this->_prepare($path); + return $this->_performPost('POST', $data); + } + + /** + * Perform a POST or PUT + * + * Performs a POST or PUT request. Any data provided is set in the HTTP + * client. String data is pushed in as raw POST data; array or object data + * is pushed in as POST parameters. + * + * @param mixed $method + * @param mixed $data + * @return Zend_Http_Response + */ + protected function _performPost($method, $data = null) + { + $client = $this->_localHttpClient; + if (is_string($data)) { + $client->setRawData($data); + } elseif (is_array($data) || is_object($data)) { + $client->setParameterPost((array) $data); + } + return $client->request($method); + } + +} diff --git a/lib/zend/Zend/Service/Twitter/Exception.php b/lib/zend/Zend/Service/Twitter/Exception.php new file mode 100755 index 0000000000..5f0faa698f --- /dev/null +++ b/lib/zend/Zend/Service/Twitter/Exception.php @@ -0,0 +1,37 @@ +setResponseType($responseType); + $this->_uri = Zend_Uri_Http::fromString("http://search.twitter.com"); + + $this->setHeaders('Accept-Charset', 'ISO-8859-1,utf-8'); + } + + /** + * set responseType + * + * @param string $responseType + * @throws Zend_Service_Twitter_Exception + * @return Zend_Service_Twitter_Search + */ + public function setResponseType($responseType = 'json') + { + if(!in_array($responseType, $this->_responseTypes, TRUE)) { + require_once 'Zend/Service/Twitter/Exception.php'; + throw new Zend_Service_Twitter_Exception('Invalid Response Type'); + } + $this->_responseType = $responseType; + return $this; + } + + /** + * Retrieve responseType + * + * @return string + */ + public function getResponseType() + { + return $this->_responseType; + } + + /** + * Get the current twitter trends. Currnetly only supports json as the return. + * + * @throws Zend_Http_Client_Exception + * @return array + */ + public function trends() + { + $this->_uri->setPath('/trends.json'); + $this->setUri($this->_uri); + $response = $this->request(); + + return Zend_Json::decode($response->getBody()); + } + + /** + * Performs a Twitter search query. + * + * @throws Zend_Http_Client_Exception + */ + public function search($query, array $params = array()) + { + + $this->_uri->setPath('/search.' . $this->_responseType); + $this->_uri->setQuery(null); + + $_query = array(); + + $_query['q'] = $query; + + foreach($params as $key=>$param) { + switch($key) { + case 'geocode': + case 'lang': + case 'since_id': + $_query[$key] = $param; + break; + case 'rpp': + $_query[$key] = (intval($param) > 100) ? 100 : intval($param); + break; + case 'page': + $_query[$key] = intval($param); + break; + case 'show_user': + $_query[$key] = 'true'; + } + } + + $this->_uri->setQuery($_query); + + $this->setUri($this->_uri); + $response = $this->request(); + + switch($this->_responseType) { + case 'json': + return Zend_Json::decode($response->getBody()); + break; + case 'atom': + return Zend_Feed::importString($response->getBody()); + break; + } + + return ; + } +} diff --git a/lib/zend/Zend/Service/Yahoo.php b/lib/zend/Zend/Service/Yahoo.php new file mode 100644 index 0000000000..54f690b538 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo.php @@ -0,0 +1,954 @@ +appId = (string) $appId; + /** + * @see Zend_Rest_Client + */ + require_once 'Zend/Rest/Client.php'; + $this->_rest = new Zend_Rest_Client('http://search.yahooapis.com'); + } + + + /** + * Retrieve Inlink Data from siteexplorer.yahoo.com. A basic query + * consists simply of a URL. Additional options that can be + * specified consist of: + * 'results' => int How many results to return, max is 100 + * 'start' => int The start offset for search results + * 'entire_site' => bool Data for the whole site or a single page + * 'omit_inlinks' => (none|domain|subdomain) Filter inlinks from these sources + * + * @param string $query the query being run + * @param array $options any optional parameters + * @return Zend_Service_Yahoo_ResultSet The return set + * @throws Zend_Service_Exception + */ + public function inlinkDataSearch($query, array $options = array()) + { + static $defaultOptions = array('results' => '50', + 'start' => 1); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + $this->_validateInlinkDataSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/SiteExplorerService/V1/inlinkData', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_Yahoo_InlinkDataResultSet + */ + require_once 'Zend/Service/Yahoo/InlinkDataResultSet.php'; + return new Zend_Service_Yahoo_InlinkDataResultSet($dom); + } + + + /** + * Perform a search of images. The most basic query consists simply + * of a plain text search, but you can also specify the type of + * image, the format, color, etc. + * + * The specific options are: + * 'type' => (all|any|phrase) How to parse the query terms + * 'results' => int How many results to return, max is 50 + * 'start' => int The start offset for search results + * 'format' => (any|bmp|gif|jpeg|png) The type of images to search for + * 'coloration' => (any|color|bw) The coloration of images to search for + * 'adult_ok' => bool Flag to allow 'adult' images. + * + * @param string $query the query to be run + * @param array $options an optional array of query options + * @return Zend_Service_Yahoo_ImageResultSet the search results + * @throws Zend_Service_Exception + */ + public function imageSearch($query, array $options = array()) + { + static $defaultOptions = array('type' => 'all', + 'results' => 10, + 'start' => 1, + 'format' => 'any', + 'coloration' => 'any'); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + + $this->_validateImageSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/ImageSearchService/V1/imageSearch', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_YahooImageResultSet + */ + require_once 'Zend/Service/Yahoo/ImageResultSet.php'; + return new Zend_Service_Yahoo_ImageResultSet($dom); + } + + + /** + * Perform a search on local.yahoo.com. The basic search + * consists of a query and some fragment of location information; + * for example zipcode, latitude/longitude, or street address. + * + * Query options include: + * 'results' => int How many results to return, max is 50 + * 'start' => int The start offset for search results + * 'sort' => (relevance|title|distance|rating) How to order your results + * + * 'radius' => float The radius (in miles) in which to search + * + * 'longitude' => float The longitude of the location to search around + * 'latitude' => float The latitude of the location to search around + * + * 'zip' => string The zipcode to search around + * + * 'street' => string The street address to search around + * 'city' => string The city for address search + * 'state' => string The state for address search + * 'location' => string An adhoc location string to search around + * + * @param string $query The query string you want to run + * @param array $options The search options, including location + * @return Zend_Service_Yahoo_LocalResultSet The results + * @throws Zend_Service_Exception + */ + public function localSearch($query, array $options = array()) + { + static $defaultOptions = array('results' => 10, + 'start' => 1, + 'sort' => 'distance', + 'radius' => 5); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + + $this->_validateLocalSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://local.yahooapis.com'); + $response = $this->_rest->restGet('/LocalSearchService/V1/localSearch', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_Yahoo_LocalResultSet + */ + require_once 'Zend/Service/Yahoo/LocalResultSet.php'; + return new Zend_Service_Yahoo_LocalResultSet($dom); + } + + + /** + * Execute a search on news.yahoo.com. This method minimally takes a + * text query to search on. + * + * Query options coonsist of: + * + * 'results' => int How many results to return, max is 50 + * 'start' => int The start offset for search results + * 'sort' => (rank|date) How to order your results + * 'language' => lang The target document language to match + * 'type' => (all|any|phrase) How the query should be parsed + * 'site' => string A site to which your search should be restricted + * + * @param string $query The query to run + * @param array $options The array of optional parameters + * @return Zend_Service_Yahoo_NewsResultSet The query return set + * @throws Zend_Service_Exception + */ + public function newsSearch($query, array $options = array()) + { + static $defaultOptions = array('type' => 'all', + 'start' => 1, + 'sort' => 'rank'); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + + $this->_validateNewsSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/NewsSearchService/V1/newsSearch', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_Yahoo_NewsResultSet + */ + require_once 'Zend/Service/Yahoo/NewsResultSet.php'; + return new Zend_Service_Yahoo_NewsResultSet($dom); + } + + + /** + * Retrieve Page Data from siteexplorer.yahoo.com. A basic query + * consists simply of a URL. Additional options that can be + * specified consist of: + * 'results' => int How many results to return, max is 100 + * 'start' => int The start offset for search results + * 'domain_only' => bool Data for just the given domain or all sub-domains also + * + * @param string $query the query being run + * @param array $options any optional parameters + * @return Zend_Service_Yahoo_ResultSet The return set + * @throws Zend_Service_Exception + */ + public function pageDataSearch($query, array $options = array()) + { + static $defaultOptions = array('results' => '50', + 'start' => 1); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + $this->_validatePageDataSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/SiteExplorerService/V1/pageData', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_Yahoo_PageDataResultSet + */ + require_once 'Zend/Service/Yahoo/PageDataResultSet.php'; + return new Zend_Service_Yahoo_PageDataResultSet($dom); + } + + + /** + * Perform a search of videos. The most basic query consists simply + * of a plain text search, but you can also specify the format of + * video. + * + * The specific options are: + * 'type' => (all|any|phrase) How to parse the query terms + * 'results' => int How many results to return, max is 50 + * 'start' => int The start offset for search results + * 'format' => (any|avi|flash|mpeg|msmedia|quicktime|realmedia) The type of videos to search for + * 'adult_ok' => bool Flag to allow 'adult' videos. + * + * @param string $query the query to be run + * @param array $options an optional array of query options + * @return Zend_Service_Yahoo_VideoResultSet the search results + * @throws Zend_Service_Exception + */ + public function videoSearch($query, array $options = array()) + { + static $defaultOptions = array('type' => 'all', + 'results' => 10, + 'start' => 1, + 'format' => 'any'); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + + $this->_validateVideoSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/VideoSearchService/V1/videoSearch', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_YahooVideoResultSet + */ + require_once 'Zend/Service/Yahoo/VideoResultSet.php'; + return new Zend_Service_Yahoo_VideoResultSet($dom); + } + + + /** + * Perform a web content search on search.yahoo.com. A basic query + * consists simply of a text query. Additional options that can be + * specified consist of: + * 'results' => int How many results to return, max is 50 + * 'start' => int The start offset for search results + * 'language' => lang The target document language to match + * 'type' => (all|any|phrase) How the query should be parsed + * 'site' => string A site to which your search should be restricted + * 'format' => (any|html|msword|pdf|ppt|rss|txt|xls) + * 'adult_ok' => bool permit 'adult' content in the search results + * 'similar_ok' => bool permit similar results in the result set + * 'country' => string The country code for the content searched + * 'license' => (any|cc_any|cc_commercial|cc_modifiable) The license of content being searched + * 'region' => The regional search engine on which the service performs the search. default us. + * + * @param string $query the query being run + * @param array $options any optional parameters + * @return Zend_Service_Yahoo_WebResultSet The return set + * @throws Zend_Service_Exception + */ + public function webSearch($query, array $options = array()) + { + static $defaultOptions = array('type' => 'all', + 'start' => 1, + 'license' => 'any', + 'results' => 10, + 'format' => 'any'); + + $options = $this->_prepareOptions($query, $options, $defaultOptions); + $this->_validateWebSearch($options); + + $this->_rest->getHttpClient()->resetParameters(); + $this->_rest->setUri('http://search.yahooapis.com'); + $response = $this->_rest->restGet('/WebSearchService/V1/webSearch', $options); + + if ($response->isError()) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . + $response->getStatus()); + } + + $dom = new DOMDocument(); + $dom->loadXML($response->getBody()); + + self::_checkErrors($dom); + + /** + * @see Zend_Service_Yahoo_WebResultSet + */ + require_once 'Zend/Service/Yahoo/WebResultSet.php'; + return new Zend_Service_Yahoo_WebResultSet($dom); + } + + + /** + * Returns a reference to the REST client + * + * @return Zend_Rest_Client + */ + public function getRestClient() + { + return $this->_rest; + } + + + /** + * Validate Inlink Data Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateInlinkDataSearch(array $options) + { + $validOptions = array('appid', 'query', 'results', 'start', 'entire_site', 'omit_inlinks'); + + $this->_compareOptions($options, $validOptions); + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 100, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(100)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['omit_inlinks'])) { + $this->_validateInArray('omit_inlinks', $options['omit_inlinks'], array('none', 'domain', 'subdomain')); + } + } + + + /** + * Validate Image Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateImageSearch(array $options) + { + $validOptions = array('appid', 'query', 'type', 'results', 'start', 'format', 'coloration', 'adult_ok'); + + $this->_compareOptions($options, $validOptions); + + if (isset($options['type'])) { + switch($options['type']) { + case 'all': + case 'any': + case 'phrase': + break; + default: + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'type': '{$options['type']}'"); + } + } + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 50, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(50)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['format'])) { + switch ($options['format']) { + case 'any': + case 'bmp': + case 'gif': + case 'jpeg': + case 'png': + break; + default: + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'format': {$options['format']}"); + } + } + + if (isset($options['coloration'])) { + switch ($options['coloration']) { + case 'any': + case 'color': + case 'bw': + break; + default: + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'coloration': " + . "{$options['coloration']}"); + } + } + } + + + /** + * Validate Local Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateLocalSearch(array $options) + { + $validOptions = array('appid', 'query', 'results', 'start', 'sort', 'radius', 'street', + 'city', 'state', 'zip', 'location', 'latitude', 'longitude'); + + $this->_compareOptions($options, $validOptions); + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 20, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(20)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['longitude']) && !$between->setMin(-90)->setMax(90)->isValid($options['longitude'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'longitude': {$options['longitude']}"); + } + + if (isset($options['latitude']) && !$between->setMin(-180)->setMax(180)->isValid($options['latitude'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'latitude': {$options['latitude']}"); + } + + if (isset($options['zip']) && !preg_match('/(^\d{5}$)|(^\d{5}-\d{4}$)/', $options['zip'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'zip': {$options['zip']}"); + } + + $hasLocation = false; + $locationFields = array('street', 'city', 'state', 'zip', 'location'); + foreach ($locationFields as $field) { + if (isset($options[$field]) && $options[$field] != '') { + $hasLocation = true; + break; + } + } + + if (!$hasLocation && (!isset($options['latitude']) || !isset($options['longitude']))) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('Location data are required but missing'); + } + + if (!in_array($options['sort'], array('relevance', 'title', 'distance', 'rating'))) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'sort': {$options['sort']}"); + } + } + + + /** + * Validate News Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateNewsSearch(array $options) + { + $validOptions = array('appid', 'query', 'results', 'start', 'sort', 'language', 'type', 'site'); + + $this->_compareOptions($options, $validOptions); + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 50, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(50)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['language'])) { + $this->_validateLanguage($options['language']); + } + + $this->_validateInArray('sort', $options['sort'], array('rank', 'date')); + $this->_validateInArray('type', $options['type'], array('all', 'any', 'phrase')); + } + + + /** + * Validate Page Data Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validatePageDataSearch(array $options) + { + $validOptions = array('appid', 'query', 'results', 'start', 'domain_only'); + + $this->_compareOptions($options, $validOptions); + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 100, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(100)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + } + + + /** + * Validate Video Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateVideoSearch(array $options) + { + $validOptions = array('appid', 'query', 'type', 'results', 'start', 'format', 'adult_ok'); + + $this->_compareOptions($options, $validOptions); + + if (isset($options['type'])) { + $this->_validateInArray('type', $options['type'], array('all', 'any', 'phrase')); + } + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 50, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(50)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['format'])) { + $this->_validateInArray('format', $options['format'], array('any', 'avi', 'flash', 'mpeg', 'msmedia', 'quicktime', 'realmedia')); + } + } + + + /** + * Validate Web Search Options + * + * @param array $options + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateWebSearch(array $options) + { + $validOptions = array('appid', 'query', 'results', 'start', 'language', 'type', 'format', 'adult_ok', + 'similar_ok', 'country', 'site', 'subscription', 'license', 'region'); + + $this->_compareOptions($options, $validOptions); + + /** + * @see Zend_Validate_Between + */ + require_once 'Zend/Validate/Between.php'; + $between = new Zend_Validate_Between(1, 100, true); + + if (isset($options['results']) && !$between->setMin(1)->setMax(100)->isValid($options['results'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'results': {$options['results']}"); + } + + if (isset($options['start']) && !$between->setMin(1)->setMax(1000)->isValid($options['start'])) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option 'start': {$options['start']}"); + } + + if (isset($options['language'])) { + $this->_validateLanguage($options['language']); + } + + $this->_validateInArray('type', $options['type'], array('all', 'any', 'phrase')); + $this->_validateInArray('format', $options['format'], array('any', 'html', 'msword', 'pdf', 'ppt', 'rss', + 'txt', 'xls')); + $this->_validateInArray('license', $options['license'], array('any', 'cc_any', 'cc_commercial', + 'cc_modifiable')); + if (isset($options['region'])){ + $this->_validateInArray('region', $options['region'], array('ar', 'au', 'at', 'br', 'ca', 'ct', 'dk', 'fi', + 'fr', 'de', 'in', 'id', 'it', 'my', 'mx', + 'nl', 'no', 'ph', 'ru', 'sg', 'es', 'se', + 'ch', 'th', 'uk', 'us')); + } + } + + + /** + * Prepare options for sending to Yahoo! + * + * @param string $query Search Query + * @param array $options User specified options + * @param array $defaultOptions Required/Default options + * @return array + */ + protected function _prepareOptions($query, array $options, array $defaultOptions = array()) + { + $options['appid'] = $this->appId; + $options['query'] = (string) $query; + + return array_merge($defaultOptions, $options); + } + + + /** + * Throws an exception if the chosen language is not supported + * + * @param string $lang Language code + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateLanguage($lang) + { + $languages = array('ar', 'bg', 'ca', 'szh', 'tzh', 'hr', 'cs', 'da', 'nl', 'en', 'et', 'fi', 'fr', 'de', 'el', + 'he', 'hu', 'is', 'id', 'it', 'ja', 'ko', 'lv', 'lt', 'no', 'fa', 'pl', 'pt', 'ro', 'ru', 'sk', 'sr', 'sl', + 'es', 'sv', 'th', 'tr' + ); + if (!in_array($lang, $languages)) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("The selected language '$lang' is not supported"); + } + } + + + /** + * Utility function to check for a difference between two arrays. + * + * @param array $options User specified options + * @param array $validOptions Valid options + * @return void + * @throws Zend_Service_Exception if difference is found (e.g., unsupported query option) + */ + protected function _compareOptions(array $options, array $validOptions) + { + $difference = array_diff(array_keys($options), $validOptions); + if ($difference) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('The following parameters are invalid: ' . join(', ', $difference)); + } + } + + + /** + * Check that a named value is in the given array + * + * @param string $name Name associated with the value + * @param mixed $value Value + * @param array $array Array in which to check for the value + * @return void + * @throws Zend_Service_Exception + */ + protected function _validateInArray($name, $value, array $array) + { + if (!in_array($value, $array)) { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception("Invalid value for option '$name': $value"); + } + } + + + /** + * Check if response is an error + * + * @param DOMDocument $dom DOM Object representing the result XML + * @return void + * @throws Zend_Service_Exception Thrown when the result from Yahoo! is an error + */ + protected static function _checkErrors(DOMDocument $dom) + { + $xpath = new DOMXPath($dom); + $xpath->registerNamespace('yapi', 'urn:yahoo:api'); + + if ($xpath->query('//yapi:Error')->length >= 1) { + $message = $xpath->query('//yapi:Error/yapi:Message/text()')->item(0)->data; + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception($message); + } + } +} diff --git a/lib/zend/Zend/Service/Yahoo/Image.php b/lib/zend/Zend/Service/Yahoo/Image.php new file mode 100644 index 0000000000..60dd78d4c8 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/Image.php @@ -0,0 +1,71 @@ +ownerDocument); + $xpath->registerNamespace('yh', $namespace); + $this->Url = Zend_Uri::factory($xpath->query('./yh:Url/text()', $dom)->item(0)->data); + $this->Height = (int) $xpath->query('./yh:Height/text()', $dom)->item(0)->data; + $this->Width = (int) $xpath->query('./yh:Width/text()', $dom)->item(0)->data; + } +} diff --git a/lib/zend/Zend/Service/Yahoo/ImageResult.php b/lib/zend/Zend/Service/Yahoo/ImageResult.php new file mode 100644 index 0000000000..75def06a07 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/ImageResult.php @@ -0,0 +1,111 @@ +_fields = array('Summary', 'RefererUrl', 'FileSize', 'FileFormat', 'Height', 'Width', 'Thumbnail'); + + parent::__construct($result); + + $this->_setThumbnail(); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/ImageResultSet.php b/lib/zend/Zend/Service/Yahoo/ImageResultSet.php new file mode 100644 index 0000000000..65e23f34c4 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/ImageResultSet.php @@ -0,0 +1,63 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/InlinkDataResult.php b/lib/zend/Zend/Service/Yahoo/InlinkDataResult.php new file mode 100644 index 0000000000..59a3706b8a --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/InlinkDataResult.php @@ -0,0 +1,58 @@ +_fields = array(); + parent::__construct($result); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/InlinkDataResultSet.php b/lib/zend/Zend/Service/Yahoo/InlinkDataResultSet.php new file mode 100644 index 0000000000..259d31b442 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/InlinkDataResultSet.php @@ -0,0 +1,62 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/LocalResult.php b/lib/zend/Zend/Service/Yahoo/LocalResult.php new file mode 100644 index 0000000000..82ecfcad5d --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/LocalResult.php @@ -0,0 +1,124 @@ +_fields = array('Address','City', 'City', 'State', 'Phone', 'Rating', 'Distance', 'MapUrl', + 'BusinessUrl', 'BusinessClickUrl'); + + parent::__construct($result); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/LocalResultSet.php b/lib/zend/Zend/Service/Yahoo/LocalResultSet.php new file mode 100644 index 0000000000..21700dea3d --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/LocalResultSet.php @@ -0,0 +1,84 @@ +resultSetMapURL = $this->_xpath->query('//yh:ResultSetMapUrl/text()')->item(0)->data; + } + + + /** + * Overrides Zend_Service_Yahoo_ResultSet::current() + * + * @return Zend_Service_Yahoo_LocalResult + */ + public function current() + { + return new Zend_Service_Yahoo_LocalResult($this->_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/NewsResult.php b/lib/zend/Zend/Service/Yahoo/NewsResult.php new file mode 100644 index 0000000000..3c30b83c75 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/NewsResult.php @@ -0,0 +1,112 @@ +_fields = array('Summary', 'NewsSource', 'NewsSourceUrl', 'Language', 'PublishDate', + 'ModificationDate', 'Thumbnail'); + + parent::__construct($result); + + $this->_setThumbnail(); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/NewsResultSet.php b/lib/zend/Zend/Service/Yahoo/NewsResultSet.php new file mode 100644 index 0000000000..5deafd3e64 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/NewsResultSet.php @@ -0,0 +1,63 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/PageDataResult.php b/lib/zend/Zend/Service/Yahoo/PageDataResult.php new file mode 100644 index 0000000000..1412383bb2 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/PageDataResult.php @@ -0,0 +1,58 @@ +_fields = array(); + parent::__construct($result); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/PageDataResultSet.php b/lib/zend/Zend/Service/Yahoo/PageDataResultSet.php new file mode 100644 index 0000000000..d03523c33d --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/PageDataResultSet.php @@ -0,0 +1,62 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/Result.php b/lib/zend/Zend/Service/Yahoo/Result.php new file mode 100644 index 0000000000..5aa0e35c4a --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/Result.php @@ -0,0 +1,126 @@ +_fields = array_merge($this->_fields, $fields); + + $this->_xpath = new DOMXPath($result->ownerDocument); + $this->_xpath->registerNamespace('yh', $this->_namespace); + + // add search results to appropriate fields + + foreach ($this->_fields as $f) { + $query = "./yh:$f/text()"; + $node = $this->_xpath->query($query, $result); + if ($node->length == 1) { + $this->{$f} = $node->item(0)->data; + } + } + + $this->_result = $result; + } + + + /** + * Sets the Thumbnail property + * + * @return void + */ + protected function _setThumbnail() + { + $node = $this->_xpath->query('./yh:Thumbnail', $this->_result); + if ($node->length == 1) { + /** + * @see Zend_Service_Yahoo_Image + */ + require_once 'Zend/Service/Yahoo/Image.php'; + $this->Thumbnail = new Zend_Service_Yahoo_Image($node->item(0), $this->_namespace); + } else { + $this->Thumbnail = null; + } + } +} diff --git a/lib/zend/Zend/Service/Yahoo/ResultSet.php b/lib/zend/Zend/Service/Yahoo/ResultSet.php new file mode 100644 index 0000000000..cd710402c2 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/ResultSet.php @@ -0,0 +1,195 @@ +_dom + * + * @var DOMXPath + */ + protected $_xpath; + + /** + * Current Index for SeekableIterator + * + * @var int + */ + protected $_currentIndex = 0; + + + /** + * Parse the search response and retrieve the results for iteration + * + * @param DOMDocument $dom the REST fragment for this object + * @return void + */ + public function __construct(DOMDocument $dom) + { + $this->totalResultsAvailable = (int) $dom->documentElement->getAttribute('totalResultsAvailable'); + $this->totalResultsReturned = (int) $dom->documentElement->getAttribute('totalResultsReturned'); + $this->firstResultPosition = (int) $dom->documentElement->getAttribute('firstResultPosition'); + + $this->_dom = $dom; + $this->_xpath = new DOMXPath($dom); + + $this->_xpath->registerNamespace('yh', $this->_namespace); + + $this->_results = $this->_xpath->query('//yh:Result'); + } + + + /** + * Total Number of results returned + * + * @return int Total number of results returned + */ + public function totalResults() + { + return $this->totalResultsReturned; + } + + + /** + * Implement SeekableIterator::current() + * + * Must be implemented by child classes + * + * @throws Zend_Service_Exception + * @return Zend_Service_Yahoo_Result + */ + public function current() + { + /** + * @see Zend_Service_Exception + */ + require_once 'Zend/Service/Exception.php'; + throw new Zend_Service_Exception('Zend_Service_Yahoo_ResultSet::current() must be implemented by child ' + . 'classes'); + } + + + /** + * Implement SeekableIterator::key() + * + * @return int + */ + public function key() + { + return $this->_currentIndex; + } + + + /** + * Implement SeekableIterator::next() + * + * @return void + */ + public function next() + { + $this->_currentIndex += 1; + } + + + /** + * Implement SeekableIterator::rewind() + * + * @return void + */ + public function rewind() + { + $this->_currentIndex = 0; + } + + + /** + * Implement SeekableIterator::seek() + * + * @param int $index + * @return void + * @throws OutOfBoundsException + */ + public function seek($index) + { + $indexInt = (int) $index; + if ($indexInt >= 0 && $indexInt < $this->_results->length) { + $this->_currentIndex = $indexInt; + } else { + throw new OutOfBoundsException("Illegal index '$index'"); + } + } + + + /** + * Implement SeekableIterator::valid() + * + * @return boolean + */ + public function valid() + { + return $this->_currentIndex < $this->_results->length; + } +} diff --git a/lib/zend/Zend/Service/Yahoo/VideoResult.php b/lib/zend/Zend/Service/Yahoo/VideoResult.php new file mode 100644 index 0000000000..7e08df3d02 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/VideoResult.php @@ -0,0 +1,132 @@ +_fields = array('Summary', 'RefererUrl', 'FileSize', 'FileFormat', 'Height', 'Width', 'Duration', 'Channels', 'Streaming', 'Thumbnail'); + + parent::__construct($result); + + $this->_setThumbnail(); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/VideoResultSet.php b/lib/zend/Zend/Service/Yahoo/VideoResultSet.php new file mode 100644 index 0000000000..15363f821b --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/VideoResultSet.php @@ -0,0 +1,63 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Service/Yahoo/WebResult.php b/lib/zend/Zend/Service/Yahoo/WebResult.php new file mode 100644 index 0000000000..e58d934916 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/WebResult.php @@ -0,0 +1,109 @@ +_fields = array('Summary', 'MimeType', 'ModificationDate'); + parent::__construct($result); + + $this->_xpath = new DOMXPath($result->ownerDocument); + $this->_xpath->registerNamespace('yh', $this->_namespace); + + // check if the cache section exists + $cacheUrl = $this->_xpath->query('./yh:Cache/yh:Url/text()', $result)->item(0); + if ($cacheUrl instanceof DOMNode) + { + $this->CacheUrl = $cacheUrl->data; + } + $cacheSize = $this->_xpath->query('./yh:Cache/yh:Size/text()', $result)->item(0); + if ($cacheSize instanceof DOMNode) + { + $this->CacheSize = (int) $cacheSize->data; + } + } +} diff --git a/lib/zend/Zend/Service/Yahoo/WebResultSet.php b/lib/zend/Zend/Service/Yahoo/WebResultSet.php new file mode 100644 index 0000000000..0ca5117c44 --- /dev/null +++ b/lib/zend/Zend/Service/Yahoo/WebResultSet.php @@ -0,0 +1,63 @@ +_results->item($this->_currentIndex)); + } +} diff --git a/lib/zend/Zend/Session/Abstract.php b/lib/zend/Zend/Session/Abstract.php new file mode 100644 index 0000000000..6bc0266ddc --- /dev/null +++ b/lib/zend/Zend/Session/Abstract.php @@ -0,0 +1,185 @@ +_namespace = $namespace; + + // Process metadata specific only to this namespace. + Zend_Session::start(true); // attempt auto-start (throws exception if strict option set) + + if (self::$_readable === false) { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception(self::_THROW_NOT_READABLE_MSG); + } + + if (!isset($_SESSION['__ZF'])) { + return; // no further processing needed + } + + // do not allow write access to namespaces, after stop() or writeClose() + if (parent::$_writable === true) { + if (isset($_SESSION['__ZF'][$namespace])) { + + // Expire Namespace by Namespace Hop (ENNH) + if (isset($_SESSION['__ZF'][$namespace]['ENNH'])) { + $_SESSION['__ZF'][$namespace]['ENNH']--; + + if ($_SESSION['__ZF'][$namespace]['ENNH'] === 0) { + if (isset($_SESSION[$namespace])) { + self::$_expiringData[$namespace] = $_SESSION[$namespace]; + unset($_SESSION[$namespace]); + } + unset($_SESSION['__ZF'][$namespace]['ENNH']); + } + } + + // Expire Namespace Variables by Namespace Hop (ENVNH) + if (isset($_SESSION['__ZF'][$namespace]['ENVNH'])) { + foreach ($_SESSION['__ZF'][$namespace]['ENVNH'] as $variable => $hops) { + $_SESSION['__ZF'][$namespace]['ENVNH'][$variable]--; + + if ($_SESSION['__ZF'][$namespace]['ENVNH'][$variable] === 0) { + if (isset($_SESSION[$namespace][$variable])) { + self::$_expiringData[$namespace][$variable] = $_SESSION[$namespace][$variable]; + unset($_SESSION[$namespace][$variable]); + } + unset($_SESSION['__ZF'][$namespace]['ENVNH'][$variable]); + } + } + } + } + + if (empty($_SESSION['__ZF'][$namespace])) { + unset($_SESSION['__ZF'][$namespace]); + } + + if (empty($_SESSION['__ZF'])) { + unset($_SESSION['__ZF']); + } + } + } + + + /** + * getIterator() - return an iteratable object for use in foreach and the like, + * this completes the IteratorAggregate interface + * + * @return ArrayObject - iteratable container of the namespace contents + */ + public function getIterator() + { + return new ArrayObject(parent::_namespaceGetAll($this->_namespace)); + } + + + /** + * lock() - mark a session/namespace as readonly + * + * @return void + */ + public function lock() + { + self::$_namespaceLocks[$this->_namespace] = true; + } + + + /** + * unlock() - unmark a session/namespace to enable read & write + * + * @return void + */ + public function unlock() + { + unset(self::$_namespaceLocks[$this->_namespace]); + } + + + /** + * unlockAll() - unmark all session/namespaces to enable read & write + * + * @return void + */ + public static function unlockAll() + { + self::$_namespaceLocks = array(); + } + + + /** + * isLocked() - return lock status, true if, and only if, read-only + * + * @return bool + */ + public function isLocked() + { + return isset(self::$_namespaceLocks[$this->_namespace]); + } + + + /** + * unsetAll() - unset all variables in this namespace + * + * @return true + */ + public function unsetAll() + { + return parent::_namespaceUnset($this->_namespace); + } + + + /** + * __get() - method to get a variable in this object's current namespace + * + * @param string $name - programmatic name of a key, in a pair in the current namespace + * @return mixed + */ + public function & __get($name) + { + if ($name === '') { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception("The '$name' key must be a non-empty string"); + } + + return parent::_namespaceGet($this->_namespace, $name); + } + + + /** + * __set() - method to set a variable/value in this object's namespace + * + * @param string $name - programmatic name of a key, in a pair in the current namespace + * @param mixed $value - value in the pair to assign to the $name key + * @throws Zend_Session_Exception + * @return true + */ + public function __set($name, $value) + { + if (isset(self::$_namespaceLocks[$this->_namespace])) { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception('This session/namespace has been marked as read-only.'); + } + + if ($name === '') { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception("The '$name' key must be a non-empty string"); + } + + if (parent::$_writable === false) { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception(parent::_THROW_NOT_WRITABLE_MSG); + } + + $name = (string) $name; + + $_SESSION[$this->_namespace][$name] = $value; + } + + + /** + * apply() - enables applying user-selected function, such as array_merge() to the namespace + * Parameters following the $callback argument are passed to the callback function. + * Caveat: ignores members expiring now. + * + * Example: + * $namespace->apply('array_merge', array('tree' => 'apple', 'fruit' => 'peach'), array('flower' => 'rose')); + * $namespace->apply('count'); + * + * @param string|array $callback - callback function + */ + public function apply($callback) + { + $arg_list = func_get_args(); + $arg_list[0] = $_SESSION[$this->_namespace]; + return call_user_func_array($callback, $arg_list); + } + + + /** + * applySet() - enables applying user-selected function, and sets entire namespace to the result + * Result of $callback must be an array. + * Parameters following the $callback argument are passed to the callback function. + * Caveat: ignores members expiring now. + * + * Example: + * $namespace->applySet('array_merge', array('tree' => 'apple', 'fruit' => 'peach'), array('flower' => 'rose')); + * + * @param string|array $callback - callback function + */ + public function applySet($callback) + { + $arg_list = func_get_args(); + $arg_list[0] = $_SESSION[$this->_namespace]; + $result = call_user_func_array($callback, $arg_list); + if (!is_array($result)) { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception('Result must be an array. Got: ' . gettype($result)); + } + $_SESSION[$this->_namespace] = $result; + return $result; + } + + + /** + * __isset() - determine if a variable in this object's namespace is set + * + * @param string $name - programmatic name of a key, in a pair in the current namespace + * @return bool + */ + public function __isset($name) + { + if ($name === '') { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception("The '$name' key must be a non-empty string"); + } + + return parent::_namespaceIsset($this->_namespace, $name); + } + + + /** + * __unset() - unset a variable in this object's namespace. + * + * @param string $name - programmatic name of a key, in a pair in the current namespace + * @return true + */ + public function __unset($name) + { + if ($name === '') { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception("The '$name' key must be a non-empty string"); + } + + return parent::_namespaceUnset($this->_namespace, $name); + } + + + /** + * setExpirationSeconds() - expire the namespace, or specific variables after a specified + * number of seconds + * + * @param int $seconds - expires in this many seconds + * @param mixed $variables - OPTIONAL list of variables to expire (defaults to all) + * @throws Zend_Session_Exception + * @return void + */ + public function setExpirationSeconds($seconds, $variables = null) + { + if (parent::$_writable === false) { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception(parent::_THROW_NOT_WRITABLE_MSG); + } + + if ($seconds <= 0) { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception('Seconds must be positive.'); + } + + if ($variables === null) { + + // apply expiration to entire namespace + $_SESSION['__ZF'][$this->_namespace]['ENT'] = time() + $seconds; + + } else { + + if (is_string($variables)) { + $variables = array($variables); + } + + foreach ($variables as $variable) { + if (!empty($variable)) { + $_SESSION['__ZF'][$this->_namespace]['ENVT'][$variable] = time() + $seconds; + } + } + } + } + + + /** + * setExpirationHops() - expire the namespace, or specific variables after a specified + * number of page hops + * + * @param int $hops - how many "hops" (number of subsequent requests) before expiring + * @param mixed $variables - OPTIONAL list of variables to expire (defaults to all) + * @param boolean $hopCountOnUsageOnly - OPTIONAL if set, only count a hop/request if this namespace is used + * @throws Zend_Session_Exception + * @return void + */ + public function setExpirationHops($hops, $variables = null, $hopCountOnUsageOnly = false) + { + if (parent::$_writable === false) { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception(parent::_THROW_NOT_WRITABLE_MSG); + } + + if ($hops <= 0) { + /** + * @see Zend_Session_Exception + */ + require_once 'Zend/Session/Exception.php'; + throw new Zend_Session_Exception('Hops must be positive number.'); + } + + if ($variables === null) { + + // apply expiration to entire namespace + if ($hopCountOnUsageOnly === false) { + $_SESSION['__ZF'][$this->_namespace]['ENGH'] = $hops; + } else { + $_SESSION['__ZF'][$this->_namespace]['ENNH'] = $hops; + } + + } else { + + if (is_string($variables)) { + $variables = array($variables); + } + + foreach ($variables as $variable) { + if (!empty($variable)) { + if ($hopCountOnUsageOnly === false) { + $_SESSION['__ZF'][$this->_namespace]['ENVGH'][$variable] = $hops; + } else { + $_SESSION['__ZF'][$this->_namespace]['ENVNH'][$variable] = $hops; + } + } + } + } + } + +} diff --git a/lib/zend/Zend/Session/SaveHandler/DbTable.php b/lib/zend/Zend/Session/SaveHandler/DbTable.php new file mode 100644 index 0000000000..c166d69acc --- /dev/null +++ b/lib/zend/Zend/Session/SaveHandler/DbTable.php @@ -0,0 +1,591 @@ + (string|array) Session table primary key value assignment + * (optional; default: 1 => sessionId) You have to assign a value to each primary key of your session table. + * The value of this configuration option is either a string if you have only one primary key or an array if + * you have multiple primary keys. The array consists of numeric keys starting at 1 and string values. There + * are some values which will be replaced by session information: + * + * sessionId => The id of the current session + * sessionName => The name of the current session + * sessionSavePath => The save path of the current session + * + * NOTE: One of your assignments MUST contain 'sessionId' as value! + * + * modifiedColumn => (string) Session table last modification time column + * + * lifetimeColumn => (string) Session table lifetime column + * + * dataColumn => (string) Session table data column + * + * lifetime => (integer) Session lifetime (optional; default: ini_get('session.gc_maxlifetime')) + * + * overrideLifetime => (boolean) Whether or not the lifetime of an existing session should be overridden + * (optional; default: false) + * + * @param Zend_Config|array $config User-provided configuration + * @return void + * @throws Zend_Session_SaveHandler_Exception + */ + public function __construct($config) + { + if ($config instanceof Zend_Config) { + $config = $config->toArray(); + } else if (!is_array($config)) { + /** + * @see Zend_Session_SaveHandler_Exception + */ + require_once 'Zend/Session/SaveHandler/Exception.php'; + + throw new Zend_Session_SaveHandler_Exception( + '$config must be an instance of Zend_Config or array of key/value pairs containing ' + . 'configuration options for Zend_Session_SaveHandler_DbTable and Zend_Db_Table_Abstract.'); + } + + foreach ($config as $key => $value) { + do { + switch ($key) { + case self::PRIMARY_ASSIGNMENT: + $this->_primaryAssignment = $value; + break; + case self::MODIFIED_COLUMN: + $this->_modifiedColumn = (string) $value; + break; + case self::LIFETIME_COLUMN: + $this->_lifetimeColumn = (string) $value; + break; + case self::DATA_COLUMN: + $this->_dataColumn = (string) $value; + break; + case self::LIFETIME: + $this->setLifetime($value); + break; + case self::OVERRIDE_LIFETIME: + $this->setOverrideLifetime($value); + break; + default: + // unrecognized options passed to parent::__construct() + break 2; + } + unset($config[$key]); + } while (false); + } + + parent::__construct($config); + } + + /** + * Destructor + * + * @return void + */ + public function __destruct() + { + Zend_Session::writeClose(); + } + + /** + * Set session lifetime and optional whether or not the lifetime of an existing session should be overridden + * + * $lifetime === false resets lifetime to session.gc_maxlifetime + * + * @param int $lifetime + * @param boolean $overrideLifetime (optional) + * @return Zend_Session_SaveHandler_DbTable + */ + public function setLifetime($lifetime, $overrideLifetime = null) + { + if ($lifetime < 0) { + /** + * @see Zend_Session_SaveHandler_Exception + */ + require_once 'Zend/Session/SaveHandler/Exception.php'; + throw new Zend_Session_SaveHandler_Exception(); + } else if (empty($lifetime)) { + $this->_lifetime = (int) ini_get('session.gc_maxlifetime'); + } else { + $this->_lifetime = (int) $lifetime; + } + + if ($overrideLifetime != null) { + $this->setOverrideLifetime($overrideLifetime); + } + + return $this; + } + + /** + * Retrieve session lifetime + * + * @return int + */ + public function getLifetime() + { + return $this->_lifetime; + } + + /** + * Set whether or not the lifetime of an existing session should be overridden + * + * @param boolean $overrideLifetime + * @return Zend_Session_SaveHandler_DbTable + */ + public function setOverrideLifetime($overrideLifetime) + { + $this->_overrideLifetime = (boolean) $overrideLifetime; + + return $this; + } + + /** + * Retrieve whether or not the lifetime of an existing session should be overridden + * + * @return boolean + */ + public function getOverrideLifetime() + { + return $this->_overrideLifetime; + } + + /** + * Open Session + * + * @param string $save_path + * @param string $name + * @return boolean + */ + public function open($save_path, $name) + { + $this->_sessionSavePath = $save_path; + $this->_sessionName = $name; + + return true; + } + + /** + * Close session + * + * @return boolean + */ + public function close() + { + return true; + } + + /** + * Read session data + * + * @param string $id + * @return string + */ + public function read($id) + { + $return = ''; + + $rows = call_user_func_array(array(&$this, 'find'), $this->_getPrimary($id)); + + if (count($rows)) { + if ($this->_getExpirationTime($row = $rows->current()) > time()) { + $return = $row->{$this->_dataColumn}; + } else { + $this->destroy($id); + } + } + + return $return; + } + + /** + * Write session data + * + * @param string $id + * @param string $data + * @return boolean + */ + public function write($id, $data) + { + $return = false; + + $data = array($this->_modifiedColumn => time(), + $this->_dataColumn => (string) $data); + + $rows = call_user_func_array(array(&$this, 'find'), $this->_getPrimary($id)); + + if (count($rows)) { + $data[$this->_lifetimeColumn] = $this->_getLifetime($rows->current()); + + if ($this->update($data, $this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE))) { + $return = true; + } + } else { + $data[$this->_lifetimeColumn] = $this->_lifetime; + + if ($this->insert(array_merge($this->_getPrimary($id, self::PRIMARY_TYPE_ASSOC), $data))) { + $return = true; + } + } + + return $return; + } + + /** + * Destroy session + * + * @param string $id + * @return boolean + */ + public function destroy($id) + { + $return = false; + + if ($this->delete($this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE))) { + $return = true; + } + + return $return; + } + + /** + * Garbage Collection + * + * @param int $maxlifetime + * @return true + */ + public function gc($maxlifetime) + { + $this->delete($this->getAdapter()->quoteIdentifier($this->_modifiedColumn) . ' + ' + . $this->getAdapter()->quoteIdentifier($this->_lifetimeColumn) . ' < ' + . $this->getAdapter()->quote(time())); + + return true; + } + + /** + * Calls other protected methods for individual setup tasks and requirement checks + * + * @return void + */ + protected function _setup() + { + parent::_setup(); + + $this->_setupPrimaryAssignment(); + $this->setLifetime($this->_lifetime); + + $this->_checkRequiredColumns(); + } + + /** + * Initialize table and schema names + * + * @return void + * @throws Zend_Session_SaveHandler_Exception + */ + protected function _setupTableName() + { + if (empty($this->_name) && basename(($this->_name = session_save_path())) != $this->_name) { + /** + * @see Zend_Session_SaveHandler_Exception + */ + require_once 'Zend/Session/SaveHandler/Exception.php'; + + throw new Zend_Session_SaveHandler_Exception('session.save_path is a path and not a table name.'); + } + + if (strpos($this->_name, '.')) { + list($this->_schema, $this->_name) = explode('.', $this->_name); + } + } + + /** + * Initialize session table primary key value assignment + * + * @return void + * @throws Zend_Session_SaveHandler_Exception + */ + protected function _setupPrimaryAssignment() + { + if ($this->_primaryAssignment === null) { + $this->_primaryAssignment = array(1 => self::PRIMARY_ASSIGNMENT_SESSION_ID); + } else if (!is_array($this->_primaryAssignment)) { + $this->_primaryAssignment = array(1 => (string) $this->_primaryAssignment); + } else if (isset($this->_primaryAssignment[0])) { + array_unshift($this->_primaryAssignment, null); + + unset($this->_primaryAssignment[0]); + } + + if (count($this->_primaryAssignment) !== count($this->_primary)) { + /** + * @see Zend_Session_SaveHandler_Exception + */ + require_once 'Zend/Session/SaveHandler/Exception.php'; + + throw new Zend_Session_SaveHandler_Exception( + "Value for configuration option '" . self::PRIMARY_ASSIGNMENT . "' must have an assignment " + . "for each session table primary key."); + } else if (!in_array(self::PRIMARY_ASSIGNMENT_SESSION_ID, $this->_primaryAssignment)) { + /** + * @see Zend_Session_SaveHandler_Exception + */ + require_once 'Zend/Session/SaveHandler/Exception.php'; + + throw new Zend_Session_SaveHandler_Exception( + "Value for configuration option '" . self::PRIMARY_ASSIGNMENT . "' must have an assignment " + . "for the session id ('" . self::PRIMARY_ASSIGNMENT_SESSION_ID . "')."); + } + } + + /** + * Check for required session table columns + * + * @return void + * @throws Zend_Session_SaveHandler_Exception + */ + protected function _checkRequiredColumns() + { + if ($this->_modifiedColumn === null) { + /** + * @see Zend_Session_SaveHandler_Exception + */ + require_once 'Zend/Session/SaveHandler/Exception.php'; + + throw new Zend_Session_SaveHandler_Exception( + "Configuration must define '" . self::MODIFIED_COLUMN . "' which names the " + . "session table last modification time column."); + } else if ($this->_lifetimeColumn === null) { + /** + * @see Zend_Session_SaveHandler_Exception + */ + require_once 'Zend/Session/SaveHandler/Exception.php'; + + throw new Zend_Session_SaveHandler_Exception( + "Configuration must define '" . self::LIFETIME_COLUMN . "' which names the " + . "session table lifetime column."); + } else if ($this->_dataColumn === null) { + /** + * @see Zend_Session_SaveHandler_Exception + */ + require_once 'Zend/Session/SaveHandler/Exception.php'; + + throw new Zend_Session_SaveHandler_Exception( + "Configuration must define '" . self::DATA_COLUMN . "' which names the " + . "session table data column."); + } + } + + /** + * Retrieve session table primary key values + * + * @param string $id + * @param string $type (optional; default: self::PRIMARY_TYPE_NUM) + * @return array + */ + protected function _getPrimary($id, $type = null) + { + $this->_setupPrimaryKey(); + + if ($type === null) { + $type = self::PRIMARY_TYPE_NUM; + } + + $primaryArray = array(); + + foreach ($this->_primary as $index => $primary) { + switch ($this->_primaryAssignment[$index]) { + case self::PRIMARY_ASSIGNMENT_SESSION_SAVE_PATH: + $value = $this->_sessionSavePath; + break; + case self::PRIMARY_ASSIGNMENT_SESSION_NAME: + $value = $this->_sessionName; + break; + case self::PRIMARY_ASSIGNMENT_SESSION_ID: + $value = (string) $id; + break; + default: + $value = (string) $this->_primaryAssignment[$index]; + break; + } + + switch ((string) $type) { + case self::PRIMARY_TYPE_PRIMARYNUM: + $primaryArray[$index] = $value; + break; + case self::PRIMARY_TYPE_ASSOC: + $primaryArray[$primary] = $value; + break; + case self::PRIMARY_TYPE_WHERECLAUSE: + $primaryArray[] = $this->getAdapter()->quoteIdentifier($primary) . ' = ' + . $this->getAdapter()->quote($value); + break; + case self::PRIMARY_TYPE_NUM: + default: + $primaryArray[] = $value; + break; + } + } + + return $primaryArray; + } + + /** + * Retrieve session lifetime considering Zend_Session_SaveHandler_DbTable::OVERRIDE_LIFETIME + * + * @param Zend_Db_Table_Row_Abstract $row + * @return int + */ + protected function _getLifetime(Zend_Db_Table_Row_Abstract $row) + { + $return = $this->_lifetime; + + if (!$this->_overrideLifetime) { + $return = (int) $row->{$this->_lifetimeColumn}; + } + + return $return; + } + + /** + * Retrieve session expiration time + * + * @param Zend_Db_Table_Row_Abstract $row + * @return int + */ + protected function _getExpirationTime(Zend_Db_Table_Row_Abstract $row) + { + return (int) $row->{$this->_modifiedColumn} + $this->_getLifetime($row); + } +} diff --git a/lib/zend/Zend/Session/SaveHandler/Exception.php b/lib/zend/Zend/Session/SaveHandler/Exception.php new file mode 100644 index 0000000000..5fd2587eff --- /dev/null +++ b/lib/zend/Zend/Session/SaveHandler/Exception.php @@ -0,0 +1,37 @@ +setValidData( (isset($_SERVER['HTTP_USER_AGENT']) + ? $_SERVER['HTTP_USER_AGENT'] : null) ); + } + + /** + * Validate() - this method will determine if the current user agent matches the + * user agent we stored when we initialized this variable. + * + * @return bool + */ + public function validate() + { + $currentBrowser = (isset($_SERVER['HTTP_USER_AGENT']) + ? $_SERVER['HTTP_USER_AGENT'] : null); + + return $currentBrowser === $this->getValidData(); + } + +} diff --git a/lib/zend/Zend/Session/Validator/Interface.php b/lib/zend/Zend/Session/Validator/Interface.php new file mode 100644 index 0000000000..06a5f69231 --- /dev/null +++ b/lib/zend/Zend/Session/Validator/Interface.php @@ -0,0 +1,52 @@ + 'encoded', 'encodingStyle' => "http://schemas.xmlsoap.org/soap/encoding/"); + + /** + * soap:operation style + * + * @var array + */ + protected $_bindingStyle = array('style' => 'rpc', 'transport' => 'http://schemas.xmlsoap.org/soap/http'); + /** * Constructor * @@ -86,9 +101,7 @@ class Zend_Soap_AutoDiscover implements Zend_Server_Interface { */ public function setUri($uri) { - if(is_string($uri)) { - $uri = Zend_Uri::factory($uri); - } else if(!($uri instanceof Zend_Uri)) { + if(!is_string($uri) && !($uri instanceof Zend_Uri)) { require_once "Zend/Soap/AutoDiscover/Exception.php"; throw new Zend_Soap_AutoDiscover_Exception("No uri given to Zend_Soap_AutoDiscover::setUri as string or Zend_Uri instance."); } @@ -109,7 +122,7 @@ class Zend_Soap_AutoDiscover implements Zend_Server_Interface { */ public function getUri() { - if($this->_uri instanceof Zend_Uri) { + if($this->_uri !== null) { $uri = $this->_uri; } else { $schema = $this->getSchema(); @@ -121,6 +134,45 @@ class Zend_Soap_AutoDiscover implements Zend_Server_Interface { return $uri; } + /** + * Set options for all the binding operations soap:body elements. + * + * By default the options are set to 'use' => 'encoded' and + * 'encodingStyle' => "http://schemas.xmlsoap.org/soap/encoding/". + * + * @see Zend_Soap_AutoDiscover_Exception + * @param array $operationStyle + * @return Zend_Soap_AutoDiscover + */ + public function setOperationBodyStyle(array $operationStyle=array()) + { + if(!isset($operationStyle['use'])) { + require_once "Zend/Soap/AutoDiscover/Exception.php"; + throw new Zend_Soap_AutoDiscover_Exception("Key 'use' is required in Operation soap:body style."); + } + $this->_operationBodyStyle = $operationStyle; + return $this; + } + + /** + * Set Binding soap:binding style. + * + * By default 'style' is 'rpc' and 'transport' is 'http://schemas.xmlsoap.org/soap/http'. + * + * @param array $bindingStyle + * @return Zend_Soap_AutoDiscover + */ + public function setBindingStyle(array $bindingStyle=array()) + { + if(isset($bindingStyle['style'])) { + $this->_bindingStyle['style'] = $bindingStyle['style']; + } + if(isset($bindingStyle['transport'])) { + $this->_bindingStyle['transport'] = $bindingStyle['transport']; + } + return $this; + } + /** * Detect and returns the current HTTP/HTTPS Schema * @@ -199,54 +251,19 @@ class Zend_Soap_AutoDiscover implements Zend_Server_Interface { public function setClass($class, $namespace = '', $argv = null) { $uri = $this->getUri(); + $wsdl = new Zend_Soap_Wsdl($class, $uri, $this->_strategy); + + // The wsdl:types element must precede all other elements (WS-I Basic Profile 1.1 R2023) + $wsdl->addSchemaTypeSection(); + $port = $wsdl->addPortType($class . 'Port'); $binding = $wsdl->addBinding($class . 'Binding', 'tns:' .$class. 'Port'); - $wsdl->addSoapBinding($binding, 'rpc'); + $wsdl->addSoapBinding($binding, $this->_bindingStyle['style'], $this->_bindingStyle['transport']); $wsdl->addService($class . 'Service', $class . 'Port', 'tns:' . $class . 'Binding', $uri); - foreach ($this->_reflection->reflectClass($class)->getMethods() as $method) { - /* 's */ - $portOperation = $wsdl->addPortOperation($port, $method->getName(), 'tns:' .$method->getName(). 'Request', 'tns:' .$method->getName(). 'Response'); - $desc = $method->getDescription(); - if (strlen($desc) > 0) { - /** @todo check, what should be done for portoperation documentation */ - //$wsdl->addDocumentation($portOperation, $desc); - } - /* 's */ - - $this->_functions[] = $method->getName(); - - $selectedPrototype = null; - $maxNumArgumentsOfPrototype = -1; - foreach ($method->getPrototypes() as $prototype) { - $numParams = count($prototype->getParameters()); - if($numParams > $maxNumArgumentsOfPrototype) { - $maxNumArgumentsOfPrototype = $numParams; - $selectedPrototype = $prototype; - } - } - - if($selectedPrototype != null) { - $prototype = $selectedPrototype; - $args = array(); - foreach($prototype->getParameters() as $param) { - $args[$param->getName()] = $wsdl->getType($param->getType()); - } - $message = $wsdl->addMessage($method->getName() . 'Request', $args); - if (strlen($desc) > 0) { - //$wsdl->addDocumentation($message, $desc); - } - if ($prototype->getReturnType() != "void") { - $message = $wsdl->addMessage($method->getName() . 'Response', array($method->getName() . 'Return' => $wsdl->getType($prototype->getReturnType()))); - } - - /* 's */ - $operation = $wsdl->addBindingOperation($binding, $method->getName(), array('use' => 'encoded', 'encodingStyle' => "http://schemas.xmlsoap.org/soap/encoding/"), array('use' => 'encoded', 'encodingStyle' => "http://schemas.xmlsoap.org/soap/encoding/")); - $wsdl->addSoapOperation($operation, $uri->getUri() . '#' .$method->getName()); - /* 's */ - } + $this->_addFunctionToWsdl($method, $wsdl, $port, $binding); } $this->_wsdl = $wsdl; } @@ -274,10 +291,13 @@ class Zend_Soap_AutoDiscover implements Zend_Server_Interface { $name = $parts[0]; $wsdl = new Zend_Soap_Wsdl($name, $uri, $this->_strategy); + // The wsdl:types element must precede all other elements (WS-I Basic Profile 1.1 R2023) + $wsdl->addSchemaTypeSection(); + $port = $wsdl->addPortType($name . 'Port'); $binding = $wsdl->addBinding($name . 'Binding', 'tns:' .$name. 'Port'); - $wsdl->addSoapBinding($binding, 'rpc'); + $wsdl->addSoapBinding($binding, $this->_bindingStyle['style'], $this->_bindingStyle['transport']); $wsdl->addService($name . 'Service', $name . 'Port', 'tns:' . $name . 'Binding', $uri); } else { $wsdl = $this->_wsdl; @@ -285,38 +305,120 @@ class Zend_Soap_AutoDiscover implements Zend_Server_Interface { foreach ($function as $func) { $method = $this->_reflection->reflectFunction($func); - foreach ($method->getPrototypes() as $prototype) { - $args = array(); - foreach ($prototype->getParameters() as $param) { - $args[$param->getName()] = $wsdl->getType($param->getType()); - } - $message = $wsdl->addMessage($method->getName() . 'Request', $args); - $desc = $method->getDescription(); - if (strlen($desc) > 0) { - //$wsdl->addDocumentation($message, $desc); + $this->_addFunctionToWsdl($method, $wsdl, $port, $binding); + } + $this->_wsdl = $wsdl; + } + + /** + * Add a function to the WSDL document. + * + * @param $function Zend_Server_Reflection_Function_Abstract function to add + * @param $wsdl Zend_Soap_Wsdl WSDL document + * @param $port object wsdl:portType + * @param $binding object wsdl:binding + * @return void + */ + protected function _addFunctionToWsdl($function, $wsdl, $port, $binding) + { + $uri = $this->getUri(); + + // We only support one prototype: the one with the maximum number of arguments + $prototype = null; + $maxNumArgumentsOfPrototype = -1; + foreach ($function->getPrototypes() as $tmpPrototype) { + $numParams = count($tmpPrototype->getParameters()); + if ($numParams > $maxNumArgumentsOfPrototype) { + $maxNumArgumentsOfPrototype = $numParams; + $prototype = $tmpPrototype; + } + } + if ($prototype === null) { + require_once "Zend/Soap/AutoDiscover/Exception.php"; + throw new Zend_Soap_AutoDiscover_Exception("No prototypes could be found for the '" . $function->getName() . "' function"); + } + + // Add the input message (parameters) + $args = array(); + if ($this->_bindingStyle['style'] == 'document') { + // Document style: wrap all parameters in a sequence element + $sequence = array(); + foreach ($prototype->getParameters() as $param) { + $sequenceElement = array( + 'name' => $param->getName(), + 'type' => $wsdl->getType($param->getType()) + ); + if ($param->isOptional()) { + $sequenceElement['nillable'] = 'true'; } + $sequence[] = $sequenceElement; + } + $element = array( + 'name' => $function->getName(), + 'sequence' => $sequence + ); + // Add the wrapper element part, which must be named 'parameters' + $args['parameters'] = array('element' => $wsdl->addElement($element)); + } else { + // RPC style: add each parameter as a typed part + foreach ($prototype->getParameters() as $param) { + $args[$param->getName()] = array('type' => $wsdl->getType($param->getType())); + } + } + $wsdl->addMessage($function->getName() . 'In', $args); + + $isOneWayMessage = false; + if($prototype->getReturnType() == "void") { + $isOneWayMessage = true; + } + + if($isOneWayMessage == false) { + // Add the output message (return value) + $args = array(); + if ($this->_bindingStyle['style'] == 'document') { + // Document style: wrap the return value in a sequence element + $sequence = array(); if ($prototype->getReturnType() != "void") { - $message = $wsdl->addMessage($method->getName() . 'Response', array($method->getName() . 'Return' => $wsdl->getType($prototype->getReturnType()))); - } - /* 's */ - $portOperation = $wsdl->addPortOperation($port, $method->getName(), 'tns:' .$method->getName(). 'Request', 'tns:' .$method->getName(). 'Response'); - if (strlen($desc) > 0) { - //$wsdl->addDocumentation($portOperation, $desc); + $sequence[] = array( + 'name' => $function->getName() . 'Result', + 'type' => $wsdl->getType($prototype->getReturnType()) + ); } - /* 's */ - - /* 's */ - $operation = $wsdl->addBindingOperation($binding, $method->getName(), array('use' => 'encoded', 'encodingStyle' => "http://schemas.xmlsoap.org/soap/encoding/"), array('use' => 'encoded', 'encodingStyle' => "http://schemas.xmlsoap.org/soap/encoding/")); - $wsdl->addSoapOperation($operation, $uri->getUri() . '#' .$method->getName()); - /* 's */ + $element = array( + 'name' => $function->getName() . 'Response', + 'sequence' => $sequence + ); + // Add the wrapper element part, which must be named 'parameters' + $args['parameters'] = array('element' => $wsdl->addElement($element)); + } else if ($prototype->getReturnType() != "void") { + // RPC style: add the return value as a typed part + $args['return'] = array('type' => $wsdl->getType($prototype->getReturnType())); + } + $wsdl->addMessage($function->getName() . 'Out', $args); + } - $this->_functions[] = $method->getName(); + // Add the portType operation + if($isOneWayMessage == false) { + $portOperation = $wsdl->addPortOperation($port, $function->getName(), 'tns:' . $function->getName() . 'In', 'tns:' . $function->getName() . 'Out'); + } else { + $portOperation = $wsdl->addPortOperation($port, $function->getName(), 'tns:' . $function->getName() . 'In', false); + } + $desc = $function->getDescription(); + if (strlen($desc) > 0) { + $wsdl->addDocumentation($portOperation, $desc); + } - // We will only add one prototype - break; - } + // When using the RPC style, make sure the operation style includes a 'namespace' attribute (WS-I Basic Profile 1.1 R2717) + if ($this->_bindingStyle['style'] == 'rpc' && !isset($this->_operationBodyStyle['namespace'])) { + $this->_operationBodyStyle['namespace'] = ''.$uri; } - $this->_wsdl = $wsdl; + + // Add the binding operation + $operation = $wsdl->addBindingOperation($binding, $function->getName(), $this->_operationBodyStyle, $this->_operationBodyStyle); + $wsdl->addSoapOperation($operation, $uri . '#' .$function->getName()); + + // Add the function name to the list + $this->_functions[] = $function->getName(); } /** @@ -344,6 +446,40 @@ class Zend_Soap_AutoDiscover implements Zend_Server_Interface { $this->_wsdl->dump(); } + /** + * Proxy to WSDL dump function + * + * @param string $filename + */ + public function dump($filename) + { + if($this->_wsdl !== null) { + return $this->_wsdl->dump($filename); + } else { + /** + * @see Zend_Soap_AutoDiscover_Exception + */ + require_once "Zend/Soap/AutoDiscover/Exception.php"; + throw new Zend_Soap_AutoDiscover_Exception("Cannot dump autodiscovered contents, WSDL file has not been generated yet."); + } + } + + /** + * Proxy to WSDL toXml() function + */ + public function toXml() + { + if($this->_wsdl !== null) { + return $this->_wsdl->toXml(); + } else { + /** + * @see Zend_Soap_AutoDiscover_Exception + */ + require_once "Zend/Soap/AutoDiscover/Exception.php"; + throw new Zend_Soap_AutoDiscover_Exception("Cannot return autodiscovered contents, WSDL file has not been generated yet."); + } + } + /** * Return an array of functions in the WSDL * @@ -394,4 +530,3 @@ class Zend_Soap_AutoDiscover implements Zend_Server_Interface { } } } - diff --git a/lib/zend/Zend/Soap/AutoDiscover/Exception.php b/lib/zend/Zend/Soap/AutoDiscover/Exception.php index 5c7966a394..010c4a3ec5 100644 --- a/lib/zend/Zend/Soap/AutoDiscover/Exception.php +++ b/lib/zend/Zend/Soap/AutoDiscover/Exception.php @@ -14,10 +14,18 @@ * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage AutoDiscover + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ require_once "Zend/Exception.php"; -class Zend_Soap_AutoDiscover_Exception extends Zend_Exception {} \ No newline at end of file +/** + * @package Zend_Soap + * @subpackage AutoDiscover + */ +class Zend_Soap_AutoDiscover_Exception extends Zend_Exception +{ +} diff --git a/lib/zend/Zend/Soap/Client.php b/lib/zend/Zend/Soap/Client.php index 31d5637d12..c717d8f857 100644 --- a/lib/zend/Zend/Soap/Client.php +++ b/lib/zend/Zend/Soap/Client.php @@ -14,13 +14,12 @@ * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Client + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ -/** Zend_Soap_Client_Exception */ -require_once 'Zend/Soap/Client/Exception.php'; - /** Zend_Soap_Server */ require_once 'Zend/Soap/Server.php'; @@ -30,13 +29,13 @@ require_once 'Zend/Soap/Client/Local.php'; /** Zend_Soap_Client_Common */ require_once 'Zend/Soap/Client/Common.php'; - /** * Zend_Soap_Client * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Client + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Soap_Client @@ -80,6 +79,9 @@ class Zend_Soap_Client protected $_passphrase = null; protected $_compression = null; protected $_connection_timeout = null; + protected $_stream_context = null; + protected $_features = null; + protected $_cache_wsdl = null; /** * WSDL used to access server @@ -103,6 +105,33 @@ class Zend_Soap_Client */ protected $_lastMethod = ''; + /** + * SOAP request headers. + * + * Array of SoapHeader objects + * + * @var array + */ + protected $_soapInputHeaders = array(); + + /** + * Permanent SOAP request headers (shared between requests). + * + * Array of SoapHeader objects + * + * @var array + */ + protected $_permanentSoapInputHeaders = array(); + + /** + * Output SOAP headers. + * + * Array of SoapHeader objects + * + * @var array + */ + protected $_soapOutputHeaders = array(); + /** * Constructor * @@ -112,6 +141,7 @@ class Zend_Soap_Client public function __construct($wsdl = null, $options = null) { if (!extension_loaded('soap')) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('SOAP extension is not loaded.'); } @@ -152,12 +182,16 @@ class Zend_Soap_Client * * Allows setting options as an associative array of option => value pairs. * - * @param array $options + * @param array|Zend_Config $options * @return Zend_Soap_Client * @throws Zend_SoapClient_Exception */ - public function setOptions(array $options) + public function setOptions($options) { + if($options instanceof Zend_Config) { + $options = $options->toArray(); + } + foreach ($options as $key => $value) { switch ($key) { case 'classmap': @@ -213,6 +247,15 @@ class Zend_Soap_Client case 'compression': $this->setCompressionOptions($value); break; + case 'stream_context': + $this->setStreamContext($value); + break; + case 'features': + $this->setSoapFeatures($value); + break; + case 'cache_wsdl': + $this->setWsdlCache($value); + break; // Not used now // case 'connection_timeout': @@ -220,6 +263,7 @@ class Zend_Soap_Client // break; default: + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('Unknown SOAP client option'); break; } @@ -254,7 +298,10 @@ class Zend_Soap_Client $options['local_cert'] = $this->getHttpsCertificate(); $options['passphrase'] = $this->getHttpsCertPassphrase(); $options['compression'] = $this->getCompressionOptions(); -// $options['connection_timeout'] = $this->_connection_timeout; + //$options['connection_timeout'] = $this->_connection_timeout; + $options['stream_context'] = $this->getStreamContext(); + $options['cache_wsdl'] = $this->getWsdlCache(); + $options['features'] = $this->getSoapFeatures(); foreach ($options as $key => $value) { if ($value == null) { @@ -275,6 +322,7 @@ class Zend_Soap_Client public function setSoapVersion($version) { if (!in_array($version, array(SOAP_1_1, SOAP_1_2))) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('Invalid soap version specified. Use SOAP_1_1 or SOAP_1_2 constants.'); } $this->_soapVersion = $version; @@ -305,6 +353,7 @@ class Zend_Soap_Client { foreach ($classmap as $type => $class) { if (!class_exists($class)) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('Invalid class in class map'); } } @@ -336,6 +385,7 @@ class Zend_Soap_Client public function setEncoding($encoding) { if (!is_string($encoding)) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('Invalid encoding specified'); } @@ -370,6 +420,7 @@ class Zend_Soap_Client return true; } + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('Invalid URN'); } @@ -441,6 +492,7 @@ class Zend_Soap_Client public function setStyle($style) { if (!in_array($style, array(SOAP_RPC, SOAP_DOCUMENT))) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('Invalid request style specified. Use SOAP_RPC or SOAP_DOCUMENT constants.'); } @@ -471,6 +523,7 @@ class Zend_Soap_Client public function setEncodingMethod($use) { if (!in_array($use, array(SOAP_ENCODED, SOAP_LITERAL))) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('Invalid message encoding method. Use SOAP_ENCODED or SOAP_LITERAL constants.'); } @@ -641,6 +694,7 @@ class Zend_Soap_Client public function setHttpsCertificate($localCert) { if (!is_readable($localCert)) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('Invalid HTTPS client certificate path.'); } @@ -721,6 +775,81 @@ class Zend_Soap_Client return $this->_proxy_password; } + /** + * Set Stream Context + * + * @return Zend_Soap_Client + */ + public function setStreamContext($context) + { + if(!is_resource($context) || get_resource_type($context) !== "stream-context") { + /** + * @see Zend_Soap_Client_Exception + */ + require_once "Zend/Soap/Client/Exception.php"; + throw new Zend_Soap_Client_Exception( + "Invalid stream context resource given." + ); + } + + $this->_stream_context = $context; + return $this; + } + + /** + * Get Stream Context + * + * @return resource + */ + public function getStreamContext() + { + return $this->_stream_context; + } + + /** + * Set the SOAP Feature options. + * + * @param string|int $feature + * @return Zend_Soap_Client + */ + public function setSoapFeatures($feature) + { + $this->_features = $feature; + + $this->_soapClient = null; + return $this; + } + + /** + * Return current SOAP Features options + * + * @return int + */ + public function getSoapFeatures() + { + return $this->_features; + } + + /** + * Set the SOAP Wsdl Caching Options + * + * @param string|int|boolean $caching + * @return Zend_Soap_Client + */ + public function setWsdlCache($options) + { + $this->_cache_wsdl = $options; + return $this; + } + + /** + * Get current SOAP Wsdl Caching option + */ + public function getWsdlCache() + { + return $this->_cache_wsdl; + } + /** * Retrieve request XML * @@ -764,7 +893,7 @@ class Zend_Soap_Client } /** - * Retrieve response headers + * Retrieve response headers (as string) * * @return string */ @@ -821,19 +950,22 @@ class Zend_Soap_Client $wsdl = $this->getWsdl(); $options = array_merge($this->getOptions(), array('trace' => true)); - if ($wsdl == null) { if (!isset($options['location'])) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('\'location\' parameter is required in non-WSDL mode.'); } if (!isset($options['uri'])) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('\'uri\' parameter is required in non-WSDL mode.'); } } else { if (isset($options['use'])) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('\'use\' parameter only works in non-WSDL mode.'); } if (isset($options['style'])) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('\'style\' parameter only works in non-WSDL mode.'); } } @@ -869,6 +1001,47 @@ class Zend_Soap_Client return $result; } + /** + * Add SOAP input header + * + * @param SoapHeader $header + * @param boolean $permanent + * @return Zend_Soap_Client + */ + public function addSoapInputHeader(SoapHeader $header, $permanent = false) + { + if ($permanent) { + $this->_permanentSoapInputHeaders[] = $header; + } else { + $this->_soapInputHeaders[] = $header; + } + + return $this; + } + + /** + * Reset SOAP input headers + * + * @return Zend_Soap_Client + */ + public function resetSoapInputHeaders() + { + $this->_permanentSoapInputHeaders = array(); + $this->_soapInputHeaders = array(); + + return $this; + } + + /** + * Get last SOAP output headers + * + * @return array + */ + public function getLastSoapOutputHeaderObjects() + { + return $this->_soapOutputHeaders; + } + /** * Perform a SOAP call * @@ -878,13 +1051,19 @@ class Zend_Soap_Client */ public function __call($name, $arguments) { - if ($this->_soapClient == null) { - $this->_initSoapClientObject(); - } + $soapClient = $this->getSoapClient(); + + $this->_lastMethod = $name; - $this->_lastMethod = $name; - - $result = call_user_func_array(array($this->_soapClient, $name), $this->_preProcessArguments($arguments)); + $soapHeaders = array_merge($this->_permanentSoapInputHeaders, $this->_soapInputHeaders); + $result = $soapClient->__soapCall($name, + $this->_preProcessArguments($arguments), + null, /* Options are already set to the SOAP client object */ + (count($soapHeaders) > 0)? $soapHeaders : null, + $this->_soapOutputHeaders); + + // Reset non-permanent input headers + $this->_soapInputHeaders = array(); return $this->_preProcessResult($result); } @@ -899,14 +1078,12 @@ class Zend_Soap_Client public function getFunctions() { if ($this->getWsdl() == null) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('\'getFunctions\' method is available only in WSDL mode.'); } - if ($this->_soapClient == null) { - $this->_initSoapClientObject(); - } - - return $this->_soapClient->__getFunctions(); + $soapClient = $this->getSoapClient(); + return $soapClient->__getFunctions(); } @@ -925,13 +1102,45 @@ class Zend_Soap_Client public function getTypes() { if ($this->getWsdl() == null) { + require_once 'Zend/Soap/Client/Exception.php'; throw new Zend_Soap_Client_Exception('\'getTypes\' method is available only in WSDL mode.'); } + $soapClient = $this->getSoapClient(); + + return $soapClient->__getTypes(); + } + + /** + * @param SoapClient $soapClient + * @return Zend_Soap_Client + */ + public function setSoapClient(SoapClient $soapClient) + { + $this->_soapClient = $soapClient; + return $this; + } + + /** + * @return SoapClient + */ + public function getSoapClient() + { if ($this->_soapClient == null) { $this->_initSoapClientObject(); } + return $this->_soapClient; + } - return $this->_soapClient->__getTypes(); + /** + * @param string $name + * @param string $value + * @return Zend_Soap_Client + */ + public function setCookie($cookieName, $cookieValue=null) + { + $soapClient = $this->getSoapClient(); + $soapClient->__setCookie($cookieName, $cookieValue); + return $this; } } diff --git a/lib/zend/Zend/Soap/Client/Common.php b/lib/zend/Zend/Soap/Client/Common.php index 7a057a829a..b4eb28e834 100644 --- a/lib/zend/Zend/Soap/Client/Common.php +++ b/lib/zend/Zend/Soap/Client/Common.php @@ -14,8 +14,10 @@ * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Client + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ @@ -24,6 +26,7 @@ if (extension_loaded('soap')) { /** * @category Zend * @package Zend_Soap + * @subpackage Client */ class Zend_Soap_Client_Common extends SoapClient { diff --git a/lib/zend/Zend/Soap/Client/DotNet.php b/lib/zend/Zend/Soap/Client/DotNet.php index d00a39de14..bd646d234b 100644 --- a/lib/zend/Zend/Soap/Client/DotNet.php +++ b/lib/zend/Zend/Soap/Client/DotNet.php @@ -14,30 +14,29 @@ * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Client + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ -/** Zend_Soap_Client_Exception */ -require_once 'Zend/Soap/Client/Exception.php'; - /** Zend_Soap_Client */ require_once 'Zend/Soap/Client.php'; - if (extension_loaded('soap')) { /** * Zend_Soap_Client_Local - * + * * Class is intended to be used with .Net Web Services. - * + * * Important! Class is at experimental stage now. * Please leave your notes, compatiblity issues reports or * suggestions in fw-webservices@lists.zend.com or fw-general@lists.com * * @category Zend * @package Zend_Soap + * @subpackage Client */ class Zend_Soap_Client_DotNet extends Zend_Soap_Client { @@ -62,11 +61,19 @@ class Zend_Soap_Client_DotNet extends Zend_Soap_Client * My be overridden in descendant classes * * @param array $arguments + * @throws Zend_Soap_Client_Exception */ protected function _preProcessArguments($arguments) { + if (count($arguments) > 1 || + (count($arguments) == 1 && !is_array(reset($arguments))) + ) { + require_once 'Zend/Soap/Client/Exception.php'; + throw new Zend_Soap_Client_Exception('.Net webservice arguments have to be grouped into array: array(\'a\' => $a, \'b\' => $b, ...).'); + } + // Do nothing - return array($arguments); + return $arguments; } /** diff --git a/lib/zend/Zend/Soap/Client/Exception.php b/lib/zend/Zend/Soap/Client/Exception.php index 84e302faac..f29a4f53d7 100644 --- a/lib/zend/Zend/Soap/Client/Exception.php +++ b/lib/zend/Zend/Soap/Client/Exception.php @@ -14,7 +14,8 @@ * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Client + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -24,7 +25,8 @@ require_once 'Zend/Exception.php'; /** * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Client + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ diff --git a/lib/zend/Zend/Soap/Client/Local.php b/lib/zend/Zend/Soap/Client/Local.php index 433a4f7d21..685c92ea07 100644 --- a/lib/zend/Zend/Soap/Client/Local.php +++ b/lib/zend/Zend/Soap/Client/Local.php @@ -14,21 +14,18 @@ * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Client + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ -/** Zend_Soap_Client_Exception */ -require_once 'Zend/Soap/Server/Exception.php'; - - /** Zend_Soap_Server */ require_once 'Zend/Soap/Server.php'; /** Zend_Soap_Client */ require_once 'Zend/Soap/Client.php'; - if (extension_loaded('soap')) { /** @@ -41,6 +38,7 @@ if (extension_loaded('soap')) { * * @category Zend * @package Zend_Soap + * @subpackage Client */ class Zend_Soap_Client_Local extends Zend_Soap_Client { diff --git a/lib/zend/Zend/Soap/Server.php b/lib/zend/Zend/Soap/Server.php index 2a7b2fb541..9a1f2abd85 100644 --- a/lib/zend/Zend/Soap/Server.php +++ b/lib/zend/Zend/Soap/Server.php @@ -14,7 +14,8 @@ * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Server + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -23,16 +24,14 @@ */ require_once 'Zend/Server/Interface.php'; -/** Zend_Soap_Server_Exception */ -require_once 'Zend/Soap/Server/Exception.php'; - /** * Zend_Soap_Server * * @category Zend * @package Zend_Soap + * @subpackage Server * @uses Zend_Server_Interface - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -73,6 +72,21 @@ class Zend_Soap_Server implements Zend_Server_Interface */ protected $_encoding; + /** + * SOAP Server Features + * + * @var int + */ + protected $_features; + + /** + * WSDL Caching Options of SOAP Server + * + * @var + */ + protected $_wsdlCache; + + /** * Registered fault exceptions * @var array @@ -146,6 +160,7 @@ class Zend_Soap_Server implements Zend_Server_Interface public function __construct($wsdl = null, array $options = null) { if (!extension_loaded('soap')) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('SOAP extension is not loaded.'); } @@ -163,11 +178,15 @@ class Zend_Soap_Server implements Zend_Server_Interface * * Allows setting options as an associative array of option => value pairs. * - * @param array $options + * @param array|Zend_Config $options * @return Zend_Soap_Server */ - public function setOptions(array $options) + public function setOptions($options) { + if($options instanceof Zend_Config) { + $options = $options->toArray(); + } + foreach ($options as $key => $value) { switch ($key) { case 'actor': @@ -190,6 +209,12 @@ class Zend_Soap_Server implements Zend_Server_Interface case 'wsdl': $this->setWsdl($value); break; + case 'featues': + $this->setSoapFeatures($value); + break; + case 'cache_wsdl': + $this->setWsdlCache($value); + break; default: break; } @@ -226,6 +251,14 @@ class Zend_Soap_Server implements Zend_Server_Interface $options['uri'] = $this->_uri; } + if(null !== $this->_features) { + $options['features'] = $this->_features; + } + + if(null !== $this->_wsdlCache) { + $options['cache_wsdl'] = $this->_wsdlCache; + } + return $options; } @@ -239,6 +272,7 @@ class Zend_Soap_Server implements Zend_Server_Interface public function setEncoding($encoding) { if (!is_string($encoding)) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('Invalid encoding specified'); } @@ -266,6 +300,7 @@ class Zend_Soap_Server implements Zend_Server_Interface public function setSoapVersion($version) { if (!in_array($version, array(SOAP_1_1, SOAP_1_2))) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('Invalid soap version specified'); } @@ -297,6 +332,7 @@ class Zend_Soap_Server implements Zend_Server_Interface return true; } + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('Invalid URN'); } @@ -413,6 +449,48 @@ class Zend_Soap_Server implements Zend_Server_Interface return $this->_wsdl; } + /** + * Set the SOAP Feature options. + * + * @param string|int $feature + * @return Zend_Soap_Server + */ + public function setSoapFeatures($feature) + { + $this->_features = $feature; + return $this; + } + + /** + * Return current SOAP Features options + * + * @return int + */ + public function getSoapFeatures() + { + return $this->_features; + } + + /** + * Set the SOAP Wsdl Caching Options + * + * @param string|int|boolean $caching + * @return Zend_Soap_Server + */ + public function setWsdlCache($options) + { + $this->_wsdlCache = $options; + return $this; + } + + /** + * Get current SOAP Wsdl Caching option + */ + public function getWsdlCache() + { + return $this->_wsdlCache; + } + /** * Attach a function as a server method * @@ -434,6 +512,7 @@ class Zend_Soap_Server implements Zend_Server_Interface if (is_string($func) && function_exists($func)) { $this->_functions[] = $func; } else { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('One or more invalid functions specified in array'); } } @@ -443,6 +522,7 @@ class Zend_Soap_Server implements Zend_Server_Interface } elseif ($function == SOAP_FUNCTIONS_ALL) { $this->_functions = SOAP_FUNCTIONS_ALL; } else { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('Invalid function specified'); } @@ -471,14 +551,17 @@ class Zend_Soap_Server implements Zend_Server_Interface public function setClass($class, $arg1 = null, $arg2 = null) { if (isset($this->_class)) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('A class has already been registered with this soap server instance'); } if (!is_string($class)) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('Invalid class argument (' . gettype($class) . ')'); } if (!class_exists($class)) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('Class "' . $class . '" does not exist'); } @@ -503,10 +586,12 @@ class Zend_Soap_Server implements Zend_Server_Interface public function setObject($object) { if(!is_object($object)) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('Invalid object argument ('.gettype($object).')'); } if(isset($this->_object)) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('An object has already been registered with this soap server instance'); } @@ -546,6 +631,7 @@ class Zend_Soap_Server implements Zend_Server_Interface */ public function loadFunctions($definition) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('Unimplemented'); } @@ -558,6 +644,7 @@ class Zend_Soap_Server implements Zend_Server_Interface public function setPersistence($mode) { if (!in_array($mode, array(SOAP_PERSISTENCE_SESSION, SOAP_PERSISTENCE_REQUEST))) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('Invalid persistence mode specified'); } @@ -605,6 +692,7 @@ class Zend_Soap_Server implements Zend_Server_Interface $dom = new DOMDocument(); if(strlen($xml) == 0 || !$dom->loadXML($xml)) { + require_once 'Zend/Soap/Server/Exception.php'; throw new Zend_Soap_Server_Exception('Invalid XML'); } } @@ -720,9 +808,7 @@ class Zend_Soap_Server implements Zend_Server_Interface } // Set Zend_Soap_Server error handler - $displayErrorsOriginalState = ini_get('display_errors'); - ini_set('display_errors', false); - set_error_handler(array($this, 'handlePhpErrors'), E_USER_ERROR); + $displayErrorsOriginalState = $this->_initializeSoapErrorContext(); $setRequestException = null; /** @@ -763,6 +849,19 @@ class Zend_Soap_Server implements Zend_Server_Interface return $this->_response; } + /** + * Method initalizes the error context that the SOAPServer enviroment will run in. + * + * @return boolean display_errors original value + */ + protected function _initializeSoapErrorContext() + { + $displayErrorsOriginalState = ini_get('display_errors'); + ini_set('display_errors', false); + set_error_handler(array($this, 'handlePhpErrors'), E_USER_ERROR); + return $displayErrorsOriginalState; + } + /** * Register a valid fault exception * diff --git a/lib/zend/Zend/Soap/Server/Exception.php b/lib/zend/Zend/Soap/Server/Exception.php index d1a2050b35..86bffddd44 100644 --- a/lib/zend/Zend/Soap/Server/Exception.php +++ b/lib/zend/Zend/Soap/Server/Exception.php @@ -14,7 +14,8 @@ * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Server + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -26,7 +27,8 @@ require_once 'Zend/Exception.php'; /** * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @subpackage Server + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ diff --git a/lib/zend/Zend/Soap/Wsdl.php b/lib/zend/Zend/Soap/Wsdl.php index cf030f01c8..014c04704b 100644 --- a/lib/zend/Zend/Soap/Wsdl.php +++ b/lib/zend/Zend/Soap/Wsdl.php @@ -14,13 +14,11 @@ * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ -require_once 'Zend/Server/Exception.php'; - require_once "Zend/Soap/Wsdl/Strategy/Interface.php"; require_once "Zend/Soap/Wsdl/Strategy/Abstract.php"; @@ -78,12 +76,7 @@ class Zend_Soap_Wsdl $uri = $uri->getUri(); } $this->_uri = $uri; - /* - if( ($pos = strpos($uri, "?")) !== false) { - $uri = substr($uri, 0, $pos); - } - * - */ + /** * @todo change DomDocument object creation from cparsing to construxting using API * It also should authomatically escape $name and $uri values if necessary @@ -98,6 +91,7 @@ class Zend_Soap_Wsdl xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'>"; $this->_dom = new DOMDocument(); if (!$this->_dom->loadXML($wsdl)) { + require_once 'Zend/Server/Exception.php'; throw new Zend_Server_Exception('Unable to create DomDocument'); } else { $this->_wsdl = $this->_dom->documentElement; @@ -181,6 +175,8 @@ class Zend_Soap_Wsdl * @param string $name Name for the {@link http://www.w3.org/TR/wsdl#_messages message} * @param array $parts An array of {@link http://www.w3.org/TR/wsdl#_message parts} * The array is constructed like: 'name of part' => 'part xml schema data type' + * or 'name of part' => array('type' => 'part xml schema type') + * or 'name of part' => array('element' => 'part xml element name') * @return object The new message's XML_Tree_Node for use in {@link function addDocumentation} */ public function addMessage($name, $parts) @@ -193,7 +189,13 @@ class Zend_Soap_Wsdl foreach ($parts as $name => $type) { $part = $this->_dom->createElement('part'); $part->setAttribute('name', $name); - $part->setAttribute('type', $type); + if (is_array($type)) { + foreach ($type as $key => $value) { + $part->setAttribute($key, $value); + } + } else { + $part->setAttribute('type', $type); + } $message->appendChild($part); } } @@ -396,11 +398,15 @@ class Zend_Soap_Wsdl } /** - * Add a {@link http://www.w3.org/TR/wsdl#_documentation document} element to any element in the WSDL + * Add a documentation element to any element in the WSDL. * - * @param object $input_node An XML_Tree_Node returned by another method to add the document to - * @param string $document Human readable documentation for the node - * @return boolean + * Note that the WSDL {@link http://www.w3.org/TR/wsdl#_documentation specification} uses 'document', + * but the WSDL {@link http://schemas.xmlsoap.org/wsdl/ schema} uses 'documentation' instead. + * The {@link http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html#WSDL_documentation_Element WS-I Basic Profile 1.1} recommends using 'documentation'. + * + * @param object $input_node An XML_Tree_Node returned by another method to add the documentation to + * @param string $documentation Human readable documentation for the node + * @return DOMElement The documentation element */ public function addDocumentation($input_node, $documentation) { @@ -410,11 +416,15 @@ class Zend_Soap_Wsdl $node = $input_node; } - /** @todo Check if 'documentation' is a correct name for the element (WSDL spec uses 'document') */ $doc = $this->_dom->createElement('documentation'); $doc_cdata = $this->_dom->createTextNode($documentation); $doc->appendChild($doc_cdata); - $node->appendChild($doc); + + if($node->hasChildNodes()) { + $node->insertBefore($doc, $node->firstChild); + } else { + $node->appendChild($doc); + } return $doc; } @@ -466,6 +476,10 @@ class Zend_Soap_Wsdl */ public function getSchema() { + if($this->_schema == null) { + $this->addSchemaTypeSection(); + } + return $this->_schema; } @@ -581,4 +595,65 @@ class Zend_Soap_Wsdl // delegates the detection of a complex type to the current strategy return $strategy->addComplexType($type); } + + /** + * Parse an xsd:element represented as an array into a DOMElement. + * + * @param array $element an xsd:element represented as an array + * @return DOMElement parsed element + */ + private function _parseElement($element) + { + if (!is_array($element)) { + require_once "Zend/Soap/Wsdl/Exception.php"; + throw new Zend_Soap_Wsdl_Exception("The 'element' parameter needs to be an associative array."); + } + + $elementXml = $this->_dom->createElement('xsd:element'); + foreach ($element as $key => $value) { + if (in_array($key, array('sequence', 'all', 'choice'))) { + if (is_array($value)) { + $complexType = $this->_dom->createElement('xsd:complexType'); + if (count($value) > 0) { + $container = $this->_dom->createElement('xsd:' . $key); + foreach ($value as $subelement) { + $subelementXml = $this->_parseElement($subelement); + $container->appendChild($subelementXml); + } + $complexType->appendChild($container); + } + $elementXml->appendChild($complexType); + } + } else { + $elementXml->setAttribute($key, $value); + } + } + return $elementXml; + } + + /** + * Add an xsd:element represented as an array to the schema. + * + * Array keys represent attribute names and values their respective value. + * The 'sequence', 'all' and 'choice' keys must have an array of elements as their value, + * to add them to a nested complexType. + * + * Example: array( 'name' => 'MyElement', + * 'sequence' => array( array('name' => 'myString', 'type' => 'string'), + * array('name' => 'myInteger', 'type' => 'int') ) ); + * Resulting XML: + * + * + * + * + * @param array $element an xsd:element represented as an array + * @return string xsd:element for the given element array + */ + public function addElement($element) + { + $schema = $this->getSchema(); + $elementXml = $this->_parseElement($element); + $schema->appendChild($elementXml); + return 'tns:' . $element['name']; + } } diff --git a/lib/zend/Zend/Soap/Wsdl/CodeGenerator.php b/lib/zend/Zend/Soap/Wsdl/CodeGenerator.php deleted file mode 100644 index 5d22e6755e..0000000000 --- a/lib/zend/Zend/Soap/Wsdl/CodeGenerator.php +++ /dev/null @@ -1,127 +0,0 @@ -documentation)) { - $docs = self::$wsdl->documentation; - $docs = explode("\n", $docs); - $php_code .= "/**\n"; - foreach ($docs as $line) { - $php_code .= ' * ' .trim($line). PHP_EOL; - } - $php_code .= " */\n\n"; - } - if (!isset(self::$wsdl->name)) { - $classname = 'SoapService'; - } else { - $classname = self::$wsdl->name; - } - - $php_code .= "class {$classname} {\n"; - - foreach (self::$wsdl->operations as $name => $io) { - if (isset($io['documentation'])) { - $php_code .= "\n\t/**\n"; - $docs = $io['documentation']; - $docs = explode("\n", $docs); - foreach ($docs as $line) { - $php_code .= "\t * " .trim($line). PHP_EOL; - } - $php_code .= "\t */\n"; - } - $php_code .= "\n\tpublic function {$name} ("; - if (isset($io['input'])) { - $arg_names = array(); - foreach ($io['input'] as $arg) { - $arg_names[] = $arg['name']; - } - $php_code .= '$' .implode(', $', $arg_names); - } - $php_code .= ')'; - $php_code .= "\n\t{"; - $php_code .= "\n\t\t\n"; - if (isset($io['output'])) { - $php_code .= "\t\treturn \${$io['output']['name']};\n"; - } - $php_code .= "\t}\n"; - } - - $php_code .= "\n}"; - - $php_code .= PHP_EOL. "\$server = new SoapServer;" .PHP_EOL; - $php_code .= "\$server->setClass($classname);"; - $php_code .= "\n?>"; - return $php_code; - } -} - diff --git a/lib/zend/Zend/Soap/Wsdl/Exception.php b/lib/zend/Zend/Soap/Wsdl/Exception.php index a0dbe211d8..804dd5b51b 100644 --- a/lib/zend/Zend/Soap/Wsdl/Exception.php +++ b/lib/zend/Zend/Soap/Wsdl/Exception.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_Soap * @subpackage Wsdl - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ diff --git a/lib/zend/Zend/Soap/Wsdl/Parser.php b/lib/zend/Zend/Soap/Wsdl/Parser.php deleted file mode 100644 index 290b25031f..0000000000 --- a/lib/zend/Zend/Soap/Wsdl/Parser.php +++ /dev/null @@ -1,173 +0,0 @@ -asXML()); - - if (isset(self::$xml->documentation)) { - $wsdl_result->documentation = trim(self::$xml->documentation); - } - if (!isset(self::$xml['name'])) { - $wsdl_result->name = null; - } else { - $wsdl_result->name = (string) self::$xml['name']; - } - - foreach (self::$xml->binding->operation as $operation) { - $name = (string) $operation['name']; - $wsdl_result->operations[$name] = array(); - $wsdl_result->operations[$name]['input'] = self::getOperationInputs($name); - $wsdl_result->operations[$name]['output'] = self::getOperationOutput($name); - $wsdl_result->operations[$name]['documentation'] = self::getDocs($name); - } - - $wsdl_result->portType = (string) self::$xml->portType['name']; - $wsdl_result->binding = (string) self::$xml->binding['name']; - $wsdl_result->service['name'] = (string) self::$xml->service['name']; - $wsdl_result->service['address'] = (string) self::$xml->service->port->children('http://schemas.xmlsoap.org/wsdl/soap/')->attributes(); - $wsdl_result->targetNamespace = (string) self::$xml['targetNamespace']; - - return $wsdl_result; - } - - /** - * Get Function arguments - * - * @param string $operation_name Name of the element to find - * @return string - */ - private static function getOperationInputs($operation_name) - { - $operation = self::$xml->xpath('/zfwsdl:definitions[1]/zfwsdl:portType/zfwsdl:operation[@name="' .$operation_name. '"]'); - - if ($operation == null) { - return ''; - } - - if (isset($operation[0]->input)) { - $input_message_name = $operation[0]->input['message']; - $input_message_name = explode(':', $input_message_name); - $input_message_name = $input_message_name[1]; - $input_message = self::$xml->xpath('/zfwsdl:definitions[1]/zfwsdl:message[@name="' .$input_message_name. '"]'); - } - - if ($input_message != null) { - foreach ($input_message[0]->part as $part) { - $args[] = array( - 'name' => (string) $part['name'], - 'type' => (string) $part['type'], - ); - } - - if (isset($args) && is_array($args)) { - return $args; - } else { - return null; - } - } else { - return null; - } - } - - /** - * Get Function return variable - * - * @param string $operation_name Name of the element to find - * @return string|false Returns variable name if found, or false - */ - private static function getOperationOutput($operation_name) - { - $operation = self::$xml->xpath('/zfwsdl:definitions[1]/zfwsdl:portType/zfwsdl:operation[@name="' .$operation_name. '"]'); - - - if (isset($operation[0]->output)) { - $output_message_name = $operation[0]->output['message']; - $output_message_name = explode(':', $output_message_name); - $output_message_name = $output_message_name[1]; - $output_message = self::$xml->xpath('/zfwsdl:definitions[1]/zfwsdl:message[@name="' .$output_message_name. '"]'); - } - - if ($output_message != null) { - return array( - 'name' => (string) $output_message[0]->part['name'], - 'type' => (string) $output_message[0]->part['type'] - ); - } else { - return null; - } - } - - /** - * Get Function Documentation - * - * @param string $operation_name Name of the element to find - * @return string - */ - private static function getDocs($operation_name) - { - - $portType = self::$xml->xpath('//zfwsdl:operation[@name="' .$operation_name. '"]/zfwsdl:documentation'); - if (isset($portType) && is_array($portType) && (sizeof($portType) >= 1)) { - return trim((string) $portType[0]); - } else { - return null; - } - } -} - - diff --git a/lib/zend/Zend/Soap/Wsdl/Strategy/Abstract.php b/lib/zend/Zend/Soap/Wsdl/Strategy/Abstract.php index 3aaaff9721..d2e05feb58 100644 --- a/lib/zend/Zend/Soap/Wsdl/Strategy/Abstract.php +++ b/lib/zend/Zend/Soap/Wsdl/Strategy/Abstract.php @@ -1,7 +1,43 @@ _inProcess)) { + require_once "Zend/Soap/Wsdl/Exception.php"; + throw new Zend_Soap_Wsdl_Exception("Infinite recursion, cannot nest '".$type."' into itsself."); + } + $this->_inProcess[$type] = $type; + $nestingLevel = $this->_getNestedCount($type); if($nestingLevel > 1) { @@ -64,6 +72,7 @@ class Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex extends Zend_Soap_Wsdl_Strategy parent::addComplexType($singularType); } + unset($this->_inProcess[$type]); return "tns:".$xsdComplexTypeName; } diff --git a/lib/zend/Zend/Soap/Wsdl/Strategy/ArrayOfTypeSequence.php b/lib/zend/Zend/Soap/Wsdl/Strategy/ArrayOfTypeSequence.php index e05e3b9bdb..4cf581d631 100644 --- a/lib/zend/Zend/Soap/Wsdl/Strategy/ArrayOfTypeSequence.php +++ b/lib/zend/Zend/Soap/Wsdl/Strategy/ArrayOfTypeSequence.php @@ -14,12 +14,14 @@ * * @category Zend * @package Zend_Soap - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ -class Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence extends Zend_Soap_Wsdl_Strategy_Abstract +require_once "Zend/Soap/Wsdl/Strategy/DefaultComplexType.php"; + +class Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence extends Zend_Soap_Wsdl_Strategy_DefaultComplexType { /** * Add an unbounded ArrayOfType based on the xsd:sequence syntax if type[] is detected in return value doc comment. @@ -35,7 +37,7 @@ class Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence extends Zend_Soap_Wsdl_Strateg $singularType = $this->_getSingularType($type); for($i = 1; $i <= $nestedCounter; $i++) { - $complexTypeName = $this->_getTypeNameBasedOnNestingLevel($singularType, $i); + $complexTypeName = substr($this->_getTypeNameBasedOnNestingLevel($singularType, $i), 4); $childTypeName = $this->_getTypeNameBasedOnNestingLevel($singularType, $i-1); $this->_addElementFromWsdlAndChildTypes($complexTypeName, $childTypeName); @@ -44,11 +46,12 @@ class Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence extends Zend_Soap_Wsdl_Strateg $this->getContext()->addType($complexTypeName); return "tns:$complexTypeName"; + } else if (!in_array($type, $this->getContext()->getTypes())) { + // New singular complex type + return parent::addComplexType($type); } else { - require_once "Zend/Soap/Wsdl/Exception.php"; - throw new Zend_Soap_Wsdl_Exception(sprintf( - 'ArrayOfTypeSequence Strategy does not allow for complex types that are not in @return type[] syntax. "%s" type was specified.', $type - )); + // Existing complex type + return $this->getContext()->getType($type); } } @@ -68,7 +71,7 @@ class Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence extends Zend_Soap_Wsdl_Strateg $prefix = str_repeat("ArrayOf", $level); $xsdType = $this->_getStrippedXsdType($singularType); $arrayType = $prefix.$xsdType; - return $arrayType; + return "tns:$arrayType"; } } @@ -93,14 +96,6 @@ class Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence extends Zend_Soap_Wsdl_Strateg protected function _getSingularType($type) { $singulartype = $this->getContext()->getType(str_replace("[]", "", $type)); - - if(substr($singulartype, 0, 4) != "xsd:") { - require_once "Zend/Soap/Wsdl/Exception.php"; - throw new Zend_Soap_Wsdl_Exception(sprintf( - 'ArrayOfTypeSequence Strategy works only with arrays of simple types like int, string, boolean, not with "%s".'. - 'You may use Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex for more complex types.', $type - )); - } return $singulartype; } @@ -145,4 +140,4 @@ class Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence extends Zend_Soap_Wsdl_Strateg $this->getContext()->addType($arrayType); } } -} \ No newline at end of file +} diff --git a/lib/zend/Zend/Soap/Wsdl/Strategy/Composite.php b/lib/zend/Zend/Soap/Wsdl/Strategy/Composite.php new file mode 100644 index 0000000000..6e3f9a3b80 --- /dev/null +++ b/lib/zend/Zend/Soap/Wsdl/Strategy/Composite.php @@ -0,0 +1,176 @@ + Strategy pairs. + * + * @var array + */ + protected $_typeMap = array(); + + /** + * Default Strategy of this composite + * + * @var string|Zend_Soap_Wsdl_Strategy_Interface + */ + protected $_defaultStrategy; + + /** + * Context WSDL file that this composite serves + * + * @var Zend_Soap_Wsdl|null + */ + protected $_context; + + /** + * Construct Composite WSDL Strategy. + * + * @throws Zend_Soap_Wsdl_Exception + * @param array $typeMap + * @param string|Zend_Soap_Wsdl_Strategy_Interface $defaultStrategy + */ + public function __construct(array $typeMap=array(), $defaultStrategy="Zend_Soap_Wsdl_Strategy_DefaultComplexType") + { + foreach($typeMap AS $type => $strategy) { + $this->connectTypeToStrategy($type, $strategy); + } + $this->_defaultStrategy = $defaultStrategy; + } + + /** + * Connect a complex type to a given strategy. + * + * @throws Zend_Soap_Wsdl_Exception + * @param string $type + * @param string|Zend_Soap_Wsdl_Strategy_Interface $strategy + * @return Zend_Soap_Wsdl_Strategy_Composite + */ + public function connectTypeToStrategy($type, $strategy) + { + if(!is_string($type)) { + /** + * @see Zend_Soap_Wsdl_Exception + */ + require_once "Zend/Soap/Wsdl/Exception.php"; + throw new Zend_Soap_Wsdl_Exception("Invalid type given to Composite Type Map."); + } + $this->_typeMap[$type] = $strategy; + return $this; + } + + /** + * Return default strategy of this composite + * + * @throws Zend_Soap_Wsdl_Exception + * @param string $type + * @return Zend_Soap_Wsdl_Strategy_Interface + */ + public function getDefaultStrategy() + { + $strategy = $this->_defaultStrategy; + if(is_string($strategy) && class_exists($strategy)) { + $strategy = new $strategy; + } + if( !($strategy instanceof Zend_Soap_Wsdl_Strategy_Interface) ) { + /** + * @see Zend_Soap_Wsdl_Exception + */ + require_once "Zend/Soap/Wsdl/Exception.php"; + throw new Zend_Soap_Wsdl_Exception( + "Default Strategy for Complex Types is not a valid strategy object." + ); + } + $this->_defaultStrategy = $strategy; + return $strategy; + } + + /** + * Return specific strategy or the default strategy of this type. + * + * @throws Zend_Soap_Wsdl_Exception + * @param string $type + * @return Zend_Soap_Wsdl_Strategy_Interface + */ + public function getStrategyOfType($type) + { + if(isset($this->_typeMap[$type])) { + $strategy = $this->_typeMap[$type]; + + if(is_string($strategy) && class_exists($strategy)) { + $strategy = new $strategy(); + } + + if( !($strategy instanceof Zend_Soap_Wsdl_Strategy_Interface) ) { + /** + * @see Zend_Soap_Wsdl_Exception + */ + require_once "Zend/Soap/Wsdl/Exception.php"; + throw new Zend_Soap_Wsdl_Exception( + "Strategy for Complex Type '".$type."' is not a valid strategy object." + ); + } + $this->_typeMap[$type] = $strategy; + } else { + $strategy = $this->getDefaultStrategy(); + } + return $strategy; + } + + /** + * Method accepts the current WSDL context file. + * + * @param Zend_Soap_Wsdl $context + */ + public function setContext(Zend_Soap_Wsdl $context) + { + $this->_context = $context; + return $this; + } + + /** + * Create a complex type based on a strategy + * + * @throws Zend_Soap_Wsdl_Exception + * @param string $type + * @return string XSD type + */ + public function addComplexType($type) + { + if(!($this->_context instanceof Zend_Soap_Wsdl) ) { + /** + * @see Zend_Soap_Wsdl_Exception + */ + require_once "Zend/Soap/Wsdl/Exception.php"; + throw new Zend_Soap_Wsdl_Exception( + "Cannot add complex type '".$type."', no context is set for this composite strategy." + ); + } + + $strategy = $this->getStrategyOfType($type); + $strategy->setContext($this->_context); + return $strategy->addComplexType($type); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Soap/Wsdl/Strategy/DefaultComplexType.php b/lib/zend/Zend/Soap/Wsdl/Strategy/DefaultComplexType.php index 3bf086c68a..b7c9196b21 100644 --- a/lib/zend/Zend/Soap/Wsdl/Strategy/DefaultComplexType.php +++ b/lib/zend/Zend/Soap/Wsdl/Strategy/DefaultComplexType.php @@ -15,11 +15,13 @@ * @category Zend * @package Zend_Soap * @subpackage Wsdl - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ +require_once "Zend/Soap/Wsdl/Strategy/Abstract.php"; + class Zend_Soap_Wsdl_Strategy_DefaultComplexType extends Zend_Soap_Wsdl_Strategy_Abstract { /** @@ -47,7 +49,7 @@ class Zend_Soap_Wsdl_Strategy_DefaultComplexType extends Zend_Soap_Wsdl_Strategy $all = $dom->createElement('xsd:all'); foreach ($class->getProperties() as $property) { - if (preg_match_all('/@var\s+([^\s]+)/m', $property->getDocComment(), $matches)) { + if ($property->isPublic() && preg_match_all('/@var\s+([^\s]+)/m', $property->getDocComment(), $matches)) { /** * @todo check if 'xsd:element' must be used here (it may not be compatible with using 'complexType' diff --git a/lib/zend/Zend/Soap/Wsdl/Strategy/Interface.php b/lib/zend/Zend/Soap/Wsdl/Strategy/Interface.php index d2bf917bb4..7175f1697d 100644 --- a/lib/zend/Zend/Soap/Wsdl/Strategy/Interface.php +++ b/lib/zend/Zend/Soap/Wsdl/Strategy/Interface.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_Soap * @subpackage Wsdl - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -23,6 +23,11 @@ interface Zend_Soap_Wsdl_Strategy_Interface { + /** + * Method accepts the current WSDL context file. + * + * @param $context + */ public function setContext(Zend_Soap_Wsdl $context); /** diff --git a/lib/zend/Zend/Tag/Cloud.php b/lib/zend/Zend/Tag/Cloud.php new file mode 100644 index 0000000000..9fea1db846 --- /dev/null +++ b/lib/zend/Zend/Tag/Cloud.php @@ -0,0 +1,410 @@ +setConfig($options); + } + + if (is_array($options)) { + $this->setOptions($options); + } + } + + /** + * Set options from Zend_Config + * + * @param Zend_Config $config + * @return Zend_Tag_Cloud + */ + public function setConfig(Zend_Config $config) + { + $this->setOptions($config->toArray()); + + return $this; + } + + /** + * Set options from array + * + * @param array $options Configuration for Zend_Tag_Cloud + * @return Zend_Tag_Cloud + */ + public function setOptions(array $options) + { + if (isset($options['prefixPath'])) { + $this->addPrefixPaths($options['prefixPath']); + unset($options['prefixPath']); + } + + foreach ($options as $key => $value) { + if (in_array(strtolower($key), $this->_skipOptions)) { + continue; + } + + $method = 'set' . ucfirst($key); + if (method_exists($this, $method)) { + $this->$method($value); + } + } + + return $this; + } + + /** + * Set the tags for the tag cloud. + * + * $tags should be an array containing single tags as array. Each tag + * array should at least contain the keys 'title' and 'weight'. Optionally + * you may supply the key 'url', to which the tag links to. Any additional + * parameter in the array is silently ignored and can be used by custom + * decorators. + * + * @param array $tags + * @return Zend_Tag_Cloud + */ + public function setTags(array $tags) + { + // Validate and cleanup the tags + $itemList = $this->getItemList(); + + foreach ($tags as $tag) { + if ($tag instanceof Zend_Tag_Taggable) { + $itemList[] = $tag; + } else if (is_array($tag)) { + $itemList[] = new Zend_Tag_Item($tag); + } else { + require_once 'Zend/Tag/Cloud/Exception.php'; + throw new Zend_Tag_Cloud_Exception('Tag must be an instance of Zend_Tag_Taggable or an array'); + } + } + + return $this; + } + + /** + * Append a single tag to the cloud + * + * @param Zend_Tag_Taggable|array $tag + * @return Zend_Tag_Cloud + */ + public function appendTag($tag) + { + $tags = $this->getItemList(); + if ($tag instanceof Zend_Tag_Taggable) { + $tags[] = $tag; + } else if (is_array($tag)) { + $tags[] = new Zend_Tag_Item($tag); + } else { + require_once 'Zend/Tag/Cloud/Exception.php'; + throw new Zend_Tag_Cloud_Exception('Tag must be an instance of Zend_Tag_Taggable or an array'); + } + + return $this; + } + + /** + * Set the item list + * + * @param Zend_Tag_ItemList $itemList + * @return Zend_Tag_Cloud + */ + public function setItemList(Zend_Tag_ItemList $itemList) + { + $this->_tags = $itemList; + return $this; + } + + /** + * Retrieve the item list + * + * If item list is undefined, creates one. + * + * @return Zend_Tag_ItemList + */ + public function getItemList() + { + if (null === $this->_tags) { + require_once 'Zend/Tag/ItemList.php'; + $this->setItemList(new Zend_Tag_ItemList()); + } + return $this->_tags; + } + + /** + * Set the decorator for the cloud + * + * @param mixed $decorator + * @return Zend_Tag_Cloud + */ + public function setCloudDecorator($decorator) + { + $options = null; + + if (is_array($decorator)) { + if (isset($decorator['options'])) { + $options = $decorator['options']; + } + + if (isset($decorator['decorator'])) { + $decorator = $decorator['decorator']; + } + } + + if (is_string($decorator)) { + $classname = $this->getPluginLoader()->load($decorator); + $decorator = new $classname($options); + } + + if (!($decorator instanceof Zend_Tag_Cloud_Decorator_Cloud)) { + require_once 'Zend/Tag/Cloud/Exception.php'; + throw new Zend_Tag_Cloud_Exception('Decorator is no instance of Zend_Tag_Cloud_Decorator_Cloud'); + } + + $this->_cloudDecorator = $decorator; + + return $this; + } + + /** + * Get the decorator for the cloud + * + * @return Zend_Tag_Cloud_Decorator_Cloud + */ + public function getCloudDecorator() + { + if (null === $this->_cloudDecorator) { + $this->setCloudDecorator('htmlCloud'); + } + return $this->_cloudDecorator; + } + + /** + * Set the decorator for the tags + * + * @param mixed $decorator + * @return Zend_Tag_Cloud + */ + public function setTagDecorator($decorator) + { + $options = null; + + if (is_array($decorator)) { + if (isset($decorator['options'])) { + $options = $decorator['options']; + } + + if (isset($decorator['decorator'])) { + $decorator = $decorator['decorator']; + } + } + + if (is_string($decorator)) { + $classname = $this->getPluginLoader()->load($decorator); + $decorator = new $classname($options); + } + + if (!($decorator instanceof Zend_Tag_Cloud_Decorator_Tag)) { + require_once 'Zend/Tag/Cloud/Exception.php'; + throw new Zend_Tag_Cloud_Exception('Decorator is no instance of Zend_Tag_Cloud_Decorator_Tag'); + } + + $this->_tagDecorator = $decorator; + + return $this; + } + + /** + * Get the decorator for the tags + * + * @return Zend_Tag_Cloud_Decorator_Tag + */ + public function getTagDecorator() + { + if (null === $this->_tagDecorator) { + $this->setTagDecorator('htmlTag'); + } + return $this->_tagDecorator; + } + + /** + * Set plugin loaders for use with decorators + * + * @param Zend_Loader_PluginLoader_Interface $loader + * @return Zend_Tag_Cloud + */ + public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader) + { + $this->_pluginLoader = $loader; + return $this; + } + + /** + * Get the plugin loader for decorators + * + * @return Zend_Loader_PluginLoader + */ + public function getPluginLoader() + { + if ($this->_pluginLoader === null) { + $prefix = 'Zend_Tag_Cloud_Decorator_'; + $pathPrefix = 'Zend/Tag/Cloud/Decorator/'; + + require_once 'Zend/Loader/PluginLoader.php'; + $this->_pluginLoader = new Zend_Loader_PluginLoader(array($prefix => $pathPrefix)); + } + + return $this->_pluginLoader; + } + + /** + * Add many prefix paths at once + * + * @param array $paths + * @return Zend_Tag_Cloud + */ + public function addPrefixPaths(array $paths) + { + if (isset($paths['prefix']) && isset($paths['path'])) { + return $this->addPrefixPath($paths['prefix'], $paths['path']); + } + + foreach ($paths as $path) { + if (!isset($path['prefix']) || !isset($path['path'])) { + continue; + } + + $this->addPrefixPath($path['prefix'], $path['path']); + } + + return $this; + } + + /** + * Add prefix path for plugin loader + * + * @param string $prefix + * @param string $path + * @return Zend_Tag_Cloud + */ + public function addPrefixPath($prefix, $path) + { + $loader = $this->getPluginLoader(); + $loader->addPrefixPath($prefix, $path); + + return $this; + } + + /** + * Render the tag cloud + * + * @return string + */ + public function render() + { + $tags = $this->getItemList(); + + if (count($tags) === 0) { + return ''; + } + + $tagsResult = $this->getTagDecorator()->render($tags); + $cloudResult = $this->getCloudDecorator()->render($tagsResult); + + return $cloudResult; + } + + /** + * Render the tag cloud + * + * @return string + */ + public function __toString() + { + try { + $result = $this->render(); + return $result; + } catch (Exception $e) { + $message = "Exception caught by tag cloud: " . $e->getMessage() + . "\nStack Trace:\n" . $e->getTraceAsString(); + trigger_error($message, E_USER_WARNING); + return ''; + } + } +} diff --git a/lib/zend/Zend/Tag/Cloud/Decorator/Cloud.php b/lib/zend/Zend/Tag/Cloud/Decorator/Cloud.php new file mode 100644 index 0000000000..843fce5887 --- /dev/null +++ b/lib/zend/Zend/Tag/Cloud/Decorator/Cloud.php @@ -0,0 +1,88 @@ +toArray(); + } + + if (is_array($options)) { + $this->setOptions($options); + } + } + + /** + * Set options from array + * + * @param array $options Configuration for the decorator + * @return Zend_Tag_Cloud + */ + public function setOptions(array $options) + { + foreach ($options as $key => $value) { + if (in_array(strtolower($key), $this->_skipOptions)) { + continue; + } + + $method = 'set' . $key; + if (method_exists($this, $method)) { + $this->$method($value); + } + } + + return $this; + } + + /** + * Render a list of formatted tags + * + * @param array $tags + * @return string + */ + abstract public function render(array $tags); +} diff --git a/lib/zend/Zend/Tag/Cloud/Decorator/Exception.php b/lib/zend/Zend/Tag/Cloud/Decorator/Exception.php new file mode 100644 index 0000000000..0f59d61387 --- /dev/null +++ b/lib/zend/Zend/Tag/Cloud/Decorator/Exception.php @@ -0,0 +1,39 @@ + array('class' => 'Zend_Tag_Cloud') + ); + + /** + * Separator for the single tags + * + * @var string + */ + protected $_separator = ' '; + + /** + * Set the HTML tags surrounding all tags + * + * @param array $htmlTags + * @return Zend_Tag_Cloud_Decorator_HtmlCloud + */ + public function setHtmlTags(array $htmlTags) + { + $this->_htmlTags = $htmlTags; + return $this; + } + + /** + * Retrieve HTML tag map + * + * @return array + */ + public function getHtmlTags() + { + return $this->_htmlTags; + } + + /** + * Set the separator between the single tags + * + * @param string + * @return Zend_Tag_Cloud_Decorator_HtmlCloud + */ + public function setSeparator($separator) + { + $this->_separator = $separator; + return $this; + } + + /** + * Get tag separator + * + * @return string + */ + public function getSeparator() + { + return $this->_separator; + } + + /** + * Defined by Zend_Tag_Cloud_Decorator_Cloud + * + * @param array $tags + * @return string + */ + public function render(array $tags) + { + $cloudHtml = implode($this->getSeparator(), $tags); + + foreach ($this->getHtmlTags() as $key => $data) { + if (is_array($data)) { + $htmlTag = $key; + $attributes = ''; + + foreach ($data as $param => $value) { + $attributes .= ' ' . $param . '="' . htmlspecialchars($value) . '"'; + } + } else { + $htmlTag = $data; + $attributes = ''; + } + + $cloudHtml = sprintf('<%1$s%3$s>%2$s', $htmlTag, $cloudHtml, $attributes); + } + + return $cloudHtml; + } +} diff --git a/lib/zend/Zend/Tag/Cloud/Decorator/HtmlTag.php b/lib/zend/Zend/Tag/Cloud/Decorator/HtmlTag.php new file mode 100644 index 0000000000..33c196890d --- /dev/null +++ b/lib/zend/Zend/Tag/Cloud/Decorator/HtmlTag.php @@ -0,0 +1,278 @@ +_classList = $classList; + return $this; + } + + /** + * Get class list + * + * @return array + */ + public function getClassList() + { + return $this->_classList; + } + + /** + * Set the font size unit + * + * Possible values are: em, ex, px, in, cm, mm, pt, pc and % + * + * @param string $fontSizeUnit + * @throws Zend_Tag_Cloud_Decorator_Exception When an invalid fontsize unit is specified + * @return Zend_Tag_Cloud_Decorator_HtmlTag + */ + public function setFontSizeUnit($fontSizeUnit) + { + if (!in_array($fontSizeUnit, $this->_alloweFontSizeUnits)) { + require_once 'Zend/Tag/Cloud/Decorator/Exception.php'; + throw new Zend_Tag_Cloud_Decorator_Exception('Invalid fontsize unit specified'); + } + + $this->_fontSizeUnit = (string) $fontSizeUnit; + $this->setClassList(null); + return $this; + } + + /** + * Retrieve font size unit + * + * @return string + */ + public function getFontSizeUnit() + { + return $this->_fontSizeUnit; + } + /** + * Set the HTML tags surrounding the element + * + * @param array $htmlTags + * @return Zend_Tag_Cloud_Decorator_HtmlTag + */ + public function setHtmlTags(array $htmlTags) + { + $this->_htmlTags = $htmlTags; + return $this; + } + + /** + * Get HTML tags map + * + * @return array + */ + public function getHtmlTags() + { + return $this->_htmlTags; + } + + /** + * Set maximum font size + * + * @param integer $maxFontSize + * @throws Zend_Tag_Cloud_Decorator_Exception When fontsize is not numeric + * @return Zend_Tag_Cloud_Decorator_HtmlTag + */ + public function setMaxFontSize($maxFontSize) + { + if (!is_numeric($maxFontSize)) { + require_once 'Zend/Tag/Cloud/Decorator/Exception.php'; + throw new Zend_Tag_Cloud_Decorator_Exception('Fontsize must be numeric'); + } + + $this->_maxFontSize = (int) $maxFontSize; + $this->setClassList(null); + return $this; + } + + /** + * Retrieve maximum font size + * + * @return int + */ + public function getMaxFontSize() + { + return $this->_maxFontSize; + } + + /** + * Set minimum font size + * + * @param int $minFontSize + * @throws Zend_Tag_Cloud_Decorator_Exception When fontsize is not numeric + * @return Zend_Tag_Cloud_Decorator_HtmlTag + */ + public function setMinFontSize($minFontSize) + { + if (!is_numeric($minFontSize)) { + require_once 'Zend/Tag/Cloud/Decorator/Exception.php'; + throw new Zend_Tag_Cloud_Decorator_Exception('Fontsize must be numeric'); + } + + $this->_minFontSize = (int) $minFontSize; + $this->setClassList(null); + return $this; + } + + /** + * Retrieve minimum font size + * + * @return int + */ + public function getMinFontSize() + { + return $this->_minFontSize; + } + + /** + * Defined by Zend_Tag_Cloud_Decorator_Tag + * + * @param Zend_Tag_ItemList $tags + * @return array + */ + public function render(Zend_Tag_ItemList $tags) + { + if (null === ($weightValues = $this->getClassList())) { + $weightValues = range($this->getMinFontSize(), $this->getMaxFontSize()); + } + + $tags->spreadWeightValues($weightValues); + + $result = array(); + + foreach ($tags as $tag) { + if (null === ($classList = $this->getClassList())) { + $attribute = sprintf('style="font-size: %d%s;"', $tag->getParam('weightValue'), $this->getFontSizeUnit()); + } else { + $attribute = sprintf('class="%s"', htmlspecialchars($tag->getParam('weightValue'))); + } + + $tagHtml = sprintf('%s', htmlSpecialChars($tag->getParam('url')), $attribute, $tag->getTitle()); + + foreach ($this->getHtmlTags() as $key => $data) { + if (is_array($data)) { + $htmlTag = $key; + $attributes = ''; + + foreach ($data as $param => $value) { + $attributes .= ' ' . $param . '="' . htmlspecialchars($value) . '"'; + } + } else { + $htmlTag = $data; + $attributes = ''; + } + + $tagHtml = sprintf('<%1$s%3$s>%2$s', $htmlTag, $tagHtml, $attributes); + } + + $result[] = $tagHtml; + } + + return $result; + } +} diff --git a/lib/zend/Zend/Tag/Cloud/Decorator/Tag.php b/lib/zend/Zend/Tag/Cloud/Decorator/Tag.php new file mode 100644 index 0000000000..b27c16f0aa --- /dev/null +++ b/lib/zend/Zend/Tag/Cloud/Decorator/Tag.php @@ -0,0 +1,88 @@ +toArray(); + } + + if (is_array($options)) { + $this->setOptions($options); + } + } + + /** + * Set options from array + * + * @param array $options Configuration for the decorator + * @return Zend_Tag_Cloud + */ + public function setOptions(array $options) + { + foreach ($options as $key => $value) { + if (in_array(strtolower($key), $this->_skipOptions)) { + continue; + } + + $method = 'set' . $key; + if (method_exists($this, $method)) { + $this->$method($value); + } + } + + return $this; + } + + /** + * Render a list of tags + * + * @param Zend_Tag_ItemList $tags + * @return array + */ + abstract public function render(Zend_Tag_ItemList $tags); +} diff --git a/lib/zend/Zend/Tag/Cloud/Exception.php b/lib/zend/Zend/Tag/Cloud/Exception.php new file mode 100644 index 0000000000..919921fe21 --- /dev/null +++ b/lib/zend/Zend/Tag/Cloud/Exception.php @@ -0,0 +1,38 @@ +toArray(); + } + + if (!is_array($options)) { + require_once 'Zend/Tag/Exception.php'; + throw new Zend_Tag_Exception('Invalid options provided to constructor'); + } + + $this->setOptions($options); + + if ($this->_title === null) { + require_once 'Zend/Tag/Exception.php'; + throw new Zend_Tag_Exception('Title was not set'); + } + + if ($this->_weight === null) { + require_once 'Zend/Tag/Exception.php'; + throw new Zend_Tag_Exception('Weight was not set'); + } + } + + /** + * Set options of the tag + * + * @param array $options + * @return Zend_Tag_Item + */ + public function setOptions(array $options) + { + foreach ($options as $key => $value) { + if (in_array(strtolower($key), $this->_skipOptions)) { + continue; + } + + $method = 'set' . $key; + if (method_exists($this, $method)) { + $this->$method($value); + } + } + + return $this; + } + + /** + * Defined by Zend_Tag_Taggable + * + * @return string + */ + public function getTitle() + { + return $this->_title; + } + + /** + * Set the title + * + * @param string $title + * @throws Zend_Tag_Exception When title is no string + * @return Zend_Tag_Item + */ + public function setTitle($title) + { + if (!is_string($title)) { + require_once 'Zend/Tag/Exception.php'; + throw new Zend_Tag_Exception('Title must be a string'); + } + + $this->_title = (string) $title; + return $this; + } + + /** + * Defined by Zend_Tag_Taggable + * + * @return float + */ + public function getWeight() + { + return $this->_weight; + } + + /** + * Set the weight + * + * @param float $weight + * @throws Zend_Tag_Exception When weight is not numeric + * @return Zend_Tag_Item + */ + public function setWeight($weight) + { + if (!is_numeric($weight)) { + require_once 'Zend/Tag/Exception.php'; + throw new Zend_Tag_Exception('Weight must be numeric'); + } + + $this->_weight = (float) $weight; + return $this; + } + + /** + * Set multiple params at once + * + * @param array $params + * @return Zend_Tag_Item + */ + public function setParams(array $params) + { + foreach ($params as $name => $value) { + $this->setParam($name, $value); + } + + return $this; + } + + /** + * Defined by Zend_Tag_Taggable + * + * @param string $name + * @param mixed $value + * @return Zend_Tag_Item + */ + public function setParam($name, $value) + { + $this->_params[$name] = $value; + return $this; + } + + /** + * Defined by Zend_Tag_Taggable + * + * @param string $name + * @return mixed + */ + public function getParam($name) + { + if (isset($this->_params[$name])) { + return $this->_params[$name]; + } + return null; + } +} diff --git a/lib/zend/Zend/Tag/ItemList.php b/lib/zend/Zend/Tag/ItemList.php new file mode 100644 index 0000000000..6f5ad91408 --- /dev/null +++ b/lib/zend/Zend/Tag/ItemList.php @@ -0,0 +1,238 @@ +_items); + } + + /** + * Spread values in the items relative to their weight + * + * @param array $values + * @throws Zend_Tag_Exception When value list is empty + * @return void + */ + public function spreadWeightValues(array $values) + { + // Don't allow an empty value list + if (count($values) === 0) { + require_once 'Zend/Tag/Exception.php'; + throw new Zend_Tag_Exception('Value list may not be empty'); + } + + // Re-index the array + $values = array_values($values); + + // If just a single value is supplied simply assign it to to all tags + if (count($values) === 1) { + foreach ($this->_items as $item) { + $item->setParam('weightValue', $values[0]); + } + } else { + // Calculate min- and max-weight + $minWeight = null; + $maxWeight = null; + + foreach ($this->_items as $item) { + if ($minWeight === null && $maxWeight === null) { + $minWeight = $item->getWeight(); + $maxWeight = $item->getWeight(); + } else { + $minWeight = min($minWeight, $item->getWeight()); + $maxWeight = max($maxWeight, $item->getWeight()); + } + } + + // Calculate the thresholds + $steps = count($values); + $delta = ($maxWeight - $minWeight) / ($steps - 1); + $thresholds = array(); + + for ($i = 0; $i < $steps; $i++) { + $thresholds[$i] = floor(100 * log(($minWeight + $i * $delta) + 2)); + } + + // Then assign the weight values + foreach ($this->_items as $item) { + $threshold = floor(100 * log($item->getWeight() + 2)); + + for ($i = 0; $i < $steps; $i++) { + if ($threshold <= $thresholds[$i]) { + $item->setParam('weightValue', $values[$i]); + break; + } + } + } + } + } + + /** + * Seek to an absolute positio + * + * @param integer $index + * @throws OutOfBoundsException When the seek position is invalid + * @return void + */ + public function seek($index) + { + $this->rewind(); + $position = 0; + + while ($position < $index && $this->valid()) { + $this->next(); + $position++; + } + + if (!$this->valid()) { + throw new OutOfBoundsException('Invalid seek position'); + } + } + + /** + * Return the current element + * + * @return mixed + */ + public function current() + { + return current($this->_items); + } + + /** + * Move forward to next element + * + * @return mixed + */ + public function next() + { + return next($this->_items); + } + + /** + * Return the key of the current element + * + * @return mixed + */ + public function key() + { + return key($this->_items); + } + + /** + * Check if there is a current element after calls to rewind() or next() + * + * @return boolean + */ + public function valid() + { + return ($this->current() !== false); + } + + /** + * Rewind the Iterator to the first element + * + * @return void + */ + public function rewind() + { + reset($this->_items); + } + + /** + * Check if an offset exists + * + * @param mixed $offset + * @return boolean + */ + public function offsetExists($offset) { + return array_key_exists($offset, $this->_items); + } + + /** + * Get the value of an offset + * + * @param mixed $offset + * @return Zend_Tag_Taggable + */ + public function offsetGet($offset) { + return $this->_items[$offset]; + } + + /** + * Append a new item + * + * @param mixed $offset + * @param Zend_Tag_Taggable $item + * @throws OutOfBoundsException When item does not implement Zend_Tag_Taggable + * @return void + */ + public function offsetSet($offset, $item) { + // We need to make that check here, as the method signature must be + // compatible with ArrayAccess::offsetSet() + if (!($item instanceof Zend_Tag_Taggable)) { + require_once 'Zend/Tag/Exception.php'; + throw new Zend_Tag_Exception('Item must implement Zend_Tag_Taggable'); + } + + if ($offset === null) { + $this->_items[] = $item; + } else { + $this->_items[$offset] = $item; + } + } + + /** + * Unset an item + * + * @param mixed $offset + * @return void + */ + public function offsetUnset($offset) { + unset($this->_items[$offset]); + } +} diff --git a/lib/zend/Zend/Tag/Taggable.php b/lib/zend/Zend/Tag/Taggable.php new file mode 100644 index 0000000000..4567a60c0b --- /dev/null +++ b/lib/zend/Zend/Tag/Taggable.php @@ -0,0 +1,60 @@ +setEnabled(true); + $this->setProfiler($profiler); + } + + /** + * Append a new Statement to the SQL Result Stack. + * + * @param Zend_Test_DbStatement $stmt + * @return Zend_Test_DbAdapter + */ + public function appendStatementToStack(Zend_Test_DbStatement $stmt) + { + array_push($this->_statementStack, $stmt); + return $this; + } + + /** + * Append a new Insert Id to the {@see lastInsertId}. + * + * @param int|string $id + * @return Zend_Test_DbAdapter + */ + public function appendLastInsertIdToStack($id) + { + array_push($this->_lastInsertIdStack, $id); + return $this; + } + + /** + * Returns the symbol the adapter uses for delimited identifiers. + * + * @return string + */ + public function getQuoteIdentifierSymbol() + { + return ''; + } + + /** + * Set the result from {@see listTables()}. + * + * @param array $listTables + */ + public function setListTables(array $listTables) + { + $this->_listTables = $listTables; + } + + /** + * Returns a list of the tables in the database. + * + * @return array + */ + public function listTables() + { + return $this->_listTables; + } + + /** + * + * @param string $table + * @param array $tableInfo + * @return Zend_Test_DbAdapter + */ + public function setDescribeTable($table, $tableInfo) + { + $this->_describeTables[$table] = $tableInfo; + return $this; + } + + /** + * Returns the column descriptions for a table. + * + * The return value is an associative array keyed by the column name, + * as returned by the RDBMS. + * + * The value of each array element is an associative array + * with the following keys: + * + * SCHEMA_NAME => string; name of database or schema + * TABLE_NAME => string; + * COLUMN_NAME => string; column name + * COLUMN_POSITION => number; ordinal position of column in table + * DATA_TYPE => string; SQL datatype name of column + * DEFAULT => string; default expression of column, null if none + * NULLABLE => boolean; true if column can have nulls + * LENGTH => number; length of CHAR/VARCHAR + * SCALE => number; scale of NUMERIC/DECIMAL + * PRECISION => number; precision of NUMERIC/DECIMAL + * UNSIGNED => boolean; unsigned property of an integer type + * PRIMARY => boolean; true if column is part of the primary key + * PRIMARY_POSITION => integer; position of column in primary key + * + * @param string $tableName + * @param string $schemaName OPTIONAL + * @return array + */ + public function describeTable($tableName, $schemaName = null) + { + if(isset($this->_describeTables[$tableName])) { + return $this->_describeTables[$tableName]; + } else { + return array(); + } + } + + /** + * Creates a connection to the database. + * + * @return void + */ + protected function _connect() + { + $this->_connected = true; + } + + /** + * Test if a connection is active + * + * @return boolean + */ + public function isConnected() + { + return $this->_connected; + } + + /** + * Force the connection to close. + * + * @return void + */ + public function closeConnection() + { + $this->_connected = false; + } + + /** + * Prepare a statement and return a PDOStatement-like object. + * + * @param string|Zend_Db_Select $sql SQL query + * @return Zend_Db_Statment|PDOStatement + */ + public function prepare($sql) + { + $queryId = $this->getProfiler()->queryStart($sql); + + if(count($this->_statementStack)) { + $stmt = array_pop($this->_statementStack); + } else { + $stmt = new Zend_Test_DbStatement(); + } + + if($this->getProfiler()->getEnabled() == true) { + $qp = $this->getProfiler()->getQueryProfile($queryId); + $stmt->setQueryProfile($qp); + } + + return $stmt; + } + + /** + * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. + * + * As a convention, on RDBMS brands that support sequences + * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence + * from the arguments and returns the last id generated by that sequence. + * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method + * returns the last value generated for such a column, and the table name + * argument is disregarded. + * + * @param string $tableName OPTIONAL Name of table. + * @param string $primaryKey OPTIONAL Name of primary key column. + * @return string + */ + public function lastInsertId($tableName = null, $primaryKey = null) + { + if(count($this->_lastInsertIdStack)) { + return array_pop($this->_lastInsertIdStack); + } else { + return false; + } + } + + /** + * Begin a transaction. + */ + protected function _beginTransaction() + { + return; + } + + /** + * Commit a transaction. + */ + protected function _commit() + { + return; + } + + /** + * Roll-back a transaction. + */ + protected function _rollBack() + { + + } + + /** + * Set the fetch mode. + * + * @param integer $mode + * @return void + * @throws Zend_Db_Adapter_Exception + */ + public function setFetchMode($mode) + { + return; + } + + /** + * Adds an adapter-specific LIMIT clause to the SELECT statement. + * + * @param mixed $sql + * @param integer $count + * @param integer $offset + * @return string + */ + public function limit($sql, $count, $offset = 0) + { + return sprintf('%s LIMIT %d,%d', $sql, $offset, $count); + } + + /** + * Check if the adapter supports real SQL parameters. + * + * @param string $type 'positional' or 'named' + * @return bool + */ + public function supportsParameters($type) + { + return true; + } + + /** + * Retrieve server version in PHP style + * + * @return string + */ + function getServerVersion() + { + return "1.0.0"; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/DbStatement.php b/lib/zend/Zend/Test/DbStatement.php new file mode 100644 index 0000000000..bac040f66d --- /dev/null +++ b/lib/zend/Zend/Test/DbStatement.php @@ -0,0 +1,401 @@ +append($row); + } + return $stmt; + } + + /** + * Create an Insert Statement + * + * @param int $affectedRows + * @return Zend_Test_DbStatement + */ + static public function createInsertStatement($affectedRows=0) + { + return self::_createRowCountStatement($affectedRows); + } + + /** + * Create an Delete Statement + * + * @param int $affectedRows + * @return Zend_Test_DbStatement + */ + static public function createDeleteStatement($affectedRows=0) + { + return self::_createRowCountStatement($affectedRows); + } + + /** + * Create an Update Statement + * + * @param int $affectedRows + * @return Zend_Test_DbStatement + */ + static public function createUpdateStatement($affectedRows=0) + { + return self::_createRowCountStatement($affectedRows); + } + + /** + * Create a Row Count Statement + * + * @param int $affectedRows + * @return Zend_Test_DbStatement + */ + static protected function _createRowCountStatement($affectedRows) + { + $stmt = new Zend_Test_DbStatement(); + $stmt->setRowCount($affectedRows); + return $stmt; + } + + /** + * @param Zend_Db_Profiler_Query $qp + */ + public function setQueryProfile(Zend_Db_Profiler_Query $qp) + { + $this->_queryProfile = $qp; + } + + /** + * @param int $rowCount + */ + public function setRowCount($rowCount) + { + $this->_rowCount = $rowCount; + } + + /** + * Append a new row to the fetch stack. + * + * @param array $row + */ + public function append($row) + { + $this->_columnCount = count($row); + $this->_fetchStack[] = $row; + } + + /** + * Bind a column of the statement result set to a PHP variable. + * + * @param string $column Name the column in the result set, either by + * position or by name. + * @param mixed $param Reference to the PHP variable containing the value. + * @param mixed $type OPTIONAL + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function bindColumn($column, &$param, $type = null) + { + return true; + } + + /** + * Binds a parameter to the specified variable name. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $variable Reference to PHP variable containing the value. + * @param mixed $type OPTIONAL Datatype of SQL parameter. + * @param mixed $length OPTIONAL Length of SQL parameter. + * @param mixed $options OPTIONAL Other options. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function bindParam($parameter, &$variable, $type = null, $length = null, $options = null) + { + if($this->_queryProfile !== null) { + $this->_queryProfile->bindParam($parameter, $variable); + } + return true; + } + + /** + * Binds a value to a parameter. + * + * @param mixed $parameter Name the parameter, either integer or string. + * @param mixed $value Scalar value to bind to the parameter. + * @param mixed $type OPTIONAL Datatype of the parameter. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function bindValue($parameter, $value, $type = null) + { + return true; + } + + /** + * Closes the cursor, allowing the statement to be executed again. + * + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function closeCursor() + { + return true; + } + + /** + * Returns the number of columns in the result set. + * Returns null if the statement has no result set metadata. + * + * @return int The number of columns. + * @throws Zend_Db_Statement_Exception + */ + public function columnCount() + { + return $this->_columnCount; + } + + /** + * Retrieves the error code, if any, associated with the last operation on + * the statement handle. + * + * @return string error code. + * @throws Zend_Db_Statement_Exception + */ + public function errorCode() + { + return false; + } + + /** + * Retrieves an array of error information, if any, associated with the + * last operation on the statement handle. + * + * @return array + * @throws Zend_Db_Statement_Exception + */ + public function errorInfo() + { + return false; + } + + /** + * Executes a prepared statement. + * + * @param array $params OPTIONAL Values to bind to parameter placeholders. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function execute(array $params = array()) + { + if($this->_queryProfile !== null) { + $this->_queryProfile->bindParams($params); + $this->_queryProfile->end(); + } + return true; + } + + /** + * Fetches a row from the result set. + * + * @param int $style OPTIONAL Fetch mode for this fetch operation. + * @param int $cursor OPTIONAL Absolute, relative, or other. + * @param int $offset OPTIONAL Number for absolute or relative cursors. + * @return mixed Array, object, or scalar depending on fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetch($style = null, $cursor = null, $offset = null) + { + if(count($this->_fetchStack)) { + $row = array_shift($this->_fetchStack); + return $row; + } else { + return false; + } + } + + /** + * Returns an array containing all of the result set rows. + * + * @param int $style OPTIONAL Fetch mode. + * @param int $col OPTIONAL Column number, if fetch mode is by column. + * @return array Collection of rows, each in a format by the fetch mode. + * @throws Zend_Db_Statement_Exception + */ + public function fetchAll($style = null, $col = null) + { + $rows = $this->_fetchStack; + $this->_fetchStack = array(); + + return $rows; + } + + /** + * Returns a single column from the next row of a result set. + * + * @param int $col OPTIONAL Position of the column to fetch. + * @return string + * @throws Zend_Db_Statement_Exception + */ + public function fetchColumn($col = 0) + { + $row = $this->fetch(); + + if($row == false) { + return false; + } else { + if(count($row) < $col) { + require_once "Zend/Db/Statement/Exception.php"; + throw new Zend_Db_Statement_Exception( + "Column Position '".$col."' is out of bounds." + ); + } + + $keys = array_keys($row); + return $row[$keys[$col]]; + } + } + + /** + * Fetches the next row and returns it as an object. + * + * @param string $class OPTIONAL Name of the class to create. + * @param array $config OPTIONAL Constructor arguments for the class. + * @return mixed One object instance of the specified class. + * @throws Zend_Db_Statement_Exception + */ + public function fetchObject($class = 'stdClass', array $config = array()) + { + if(!class_exists($class)) { + throw new Zend_Db_Statement_Exception("Class '".$class."' does not exist!"); + } + + $object = new $class(); + $row = $this->fetch(); + foreach($row AS $k => $v) { + $object->$k = $v; + } + + return $object; + } + + /** + * Retrieve a statement attribute. + * + * @param string $key Attribute name. + * @return mixed Attribute value. + * @throws Zend_Db_Statement_Exception + */ + public function getAttribute($key) + { + return false; + } + + /** + * Retrieves the next rowset (result set) for a SQL statement that has + * multiple result sets. An example is a stored procedure that returns + * the results of multiple queries. + * + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function nextRowset() + { + return false; + } + + /** + * Returns the number of rows affected by the execution of the + * last INSERT, DELETE, or UPDATE statement executed by this + * statement object. + * + * @return int The number of rows affected. + * @throws Zend_Db_Statement_Exception + */ + public function rowCount() + { + return $this->_rowCount; + } + + /** + * Set a statement attribute. + * + * @param string $key Attribute name. + * @param mixed $val Attribute value. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function setAttribute($key, $val) + { + return true; + } + + /** + * Set the default fetch mode for this statement. + * + * @param int $mode The fetch mode. + * @return bool + * @throws Zend_Db_Statement_Exception + */ + public function setFetchMode($mode) + { + return true; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Constraint/DomQuery.php b/lib/zend/Zend/Test/PHPUnit/Constraint/DomQuery.php new file mode 100644 index 0000000000..39edb3f381 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Constraint/DomQuery.php @@ -0,0 +1,403 @@ +_path = $path; + } + + /** + * Indicate negative match + * + * @param bool $flag + * @return void + */ + public function setNegate($flag = true) + { + $this->_negate = $flag; + } + + /** + * Whether or not path is a straight XPath expression + * + * @param bool $flag + * @return Zend_Test_PHPUnit_Constraint_DomQuery + */ + public function setUseXpath($flag = true) + { + $this->_useXpath = (bool) $flag; + return $this; + } + + /** + * Evaluate an object to see if it fits the constraints + * + * @param string $other String to examine + * @param null|string Assertion type + * @return bool + */ + public function evaluate($other, $assertType = null) + { + if (strstr($assertType, 'Not')) { + $this->setNegate(true); + $assertType = str_replace('Not', '', $assertType); + } + + if (strstr($assertType, 'Xpath')) { + $this->setUseXpath(true); + $assertType = str_replace('Xpath', 'Query', $assertType); + } + + if (!in_array($assertType, $this->_assertTypes)) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception(sprintf('Invalid assertion type "%s" provided to %s constraint', $assertType, __CLASS__)); + } + + $this->_assertType = $assertType; + + $method = $this->_useXpath ? 'queryXpath' : 'query'; + $domQuery = new Zend_Dom_Query($other); + $result = $domQuery->$method($this->_path); + $argv = func_get_args(); + $argc = func_num_args(); + + switch ($assertType) { + case self::ASSERT_CONTENT_CONTAINS: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No content provided against which to match'); + } + $this->_content = $content = $argv[2]; + return ($this->_negate) + ? $this->_notMatchContent($result, $content) + : $this->_matchContent($result, $content); + case self::ASSERT_CONTENT_REGEX: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No pattern provided against which to match'); + } + $this->_content = $content = $argv[2]; + return ($this->_negate) + ? $this->_notRegexContent($result, $content) + : $this->_regexContent($result, $content); + case self::ASSERT_CONTENT_COUNT: + case self::ASSERT_CONTENT_COUNT_MIN: + case self::ASSERT_CONTENT_COUNT_MAX: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No count provided against which to compare'); + } + $this->_content = $content = $argv[2]; + return $this->_countContent($result, $content, $assertType); + case self::ASSERT_QUERY: + default: + if ($this->_negate) { + return (0 == count($result)); + } else { + return (0 != count($result)); + } + } + } + + /** + * Report Failure + * + * @see PHPUnit_Framework_Constraint for implementation details + * @param mixed $other CSS selector path + * @param string $description + * @param bool $not + * @return void + * @throws PHPUnit_Framework_ExpectationFailedException + */ + public function fail($other, $description, $not = false) + { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + switch ($this->_assertType) { + case self::ASSERT_CONTENT_CONTAINS: + $failure = 'Failed asserting node denoted by %s CONTAINS content "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting node DENOTED BY %s DOES NOT CONTAIN content "%s"'; + } + $failure = sprintf($failure, $other, $this->_content); + break; + case self::ASSERT_CONTENT_REGEX: + $failure = 'Failed asserting node denoted by %s CONTAINS content MATCHING "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting node DENOTED BY %s DOES NOT CONTAIN content MATCHING "%s"'; + } + $failure = sprintf($failure, $other, $this->_content); + break; + case self::ASSERT_CONTENT_COUNT: + $failure = 'Failed asserting node DENOTED BY %s OCCURS EXACTLY %d times'; + if ($this->_negate) { + $failure = 'Failed asserting node DENOTED BY %s DOES NOT OCCUR EXACTLY %d times'; + } + $failure = sprintf($failure, $other, $this->_content); + break; + case self::ASSERT_CONTENT_COUNT_MIN: + $failure = 'Failed asserting node DENOTED BY %s OCCURS AT LEAST %d times'; + $failure = sprintf($failure, $other, $this->_content); + break; + case self::ASSERT_CONTENT_COUNT_MAX: + $failure = 'Failed asserting node DENOTED BY %s OCCURS AT MOST %d times'; + $failure = sprintf($failure, $other, $this->_content); + break; + case self::ASSERT_QUERY: + default: + $failure = 'Failed asserting node DENOTED BY %s EXISTS'; + if ($this->_negate) { + $failure = 'Failed asserting node DENOTED BY %s DOES NOT EXIST'; + } + $failure = sprintf($failure, $other); + break; + } + + if (!empty($description)) { + $failure = $description . "\n" . $failure; + } + + throw new Zend_Test_PHPUnit_Constraint_Exception($failure); + } + + /** + * Complete implementation + * + * @return string + */ + public function toString() + { + return ''; + } + + /** + * Check to see if content is matched in selected nodes + * + * @param Zend_Dom_Query_Result $result + * @param string $match Content to match + * @return bool + */ + protected function _matchContent($result, $match) + { + if (0 == count($result)) { + return false; + } + + foreach ($result as $node) { + $content = $this->_getNodeContent($node); + if (strstr($content, $match)) { + return true; + } + } + + return false; + } + + /** + * Check to see if content is NOT matched in selected nodes + * + * @param Zend_Dom_Query_Result $result + * @param string $match + * @return bool + */ + protected function _notMatchContent($result, $match) + { + if (0 == count($result)) { + return true; + } + + foreach ($result as $node) { + $content = $this->_getNodeContent($node); + if (strstr($content, $match)) { + return false; + } + } + + return true; + } + + /** + * Check to see if content is matched by regex in selected nodes + * + * @param Zend_Dom_Query_Result $result + * @param string $pattern + * @return bool + */ + protected function _regexContent($result, $pattern) + { + if (0 == count($result)) { + return false; + } + + foreach ($result as $node) { + $content = $this->_getNodeContent($node); + if (preg_match($pattern, $content)) { + return true; + } + } + + return false; + } + + /** + * Check to see if content is NOT matched by regex in selected nodes + * + * @param Zend_Dom_Query_Result $result + * @param string $pattern + * @return bool + */ + protected function _notRegexContent($result, $pattern) + { + if (0 == count($result)) { + return true; + } + + foreach ($result as $node) { + $content = $this->_getNodeContent($node); + if (preg_match($pattern, $content)) { + return false; + } + } + + return true; + } + + /** + * Determine if content count matches criteria + * + * @param Zend_Dom_Query_Result $result + * @param int $test Value against which to test + * @param string $type assertion type + * @return boolean + */ + protected function _countContent($result, $test, $type) + { + $count = count($result); + + switch ($type) { + case self::ASSERT_CONTENT_COUNT: + return ($this->_negate) + ? ($test != $count) + : ($test == $count); + case self::ASSERT_CONTENT_COUNT_MIN: + return ($count >= $test); + case self::ASSERT_CONTENT_COUNT_MAX: + return ($count <= $test); + default: + return false; + } + } + + /** + * Get node content, minus node markup tags + * + * @param DOMNode $node + * @return string + */ + protected function _getNodeContent(DOMNode $node) + { + if ($node instanceof DOMAttr) { + return $node->value; + } else { + $doc = $node->ownerDocument; + $content = $doc->saveXML($node); + $tag = $node->nodeName; + $regex = '|]*>|'; + return preg_replace($regex, '', $content); + } + } +} diff --git a/lib/zend/Zend/Test/PHPUnit/Constraint/Exception.php b/lib/zend/Zend/Test/PHPUnit/Constraint/Exception.php new file mode 100644 index 0000000000..ad6f8e3a2b --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Constraint/Exception.php @@ -0,0 +1,36 @@ +_negate = $flag; + } + + /** + * Evaluate an object to see if it fits the constraints + * + * @param string $other String to examine + * @param null|string Assertion type + * @return bool + */ + public function evaluate($other, $assertType = null) + { + if (!$other instanceof Zend_Controller_Response_Abstract) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('Redirect constraint assertions require a response object'); + } + + if (strstr($assertType, 'Not')) { + $this->setNegate(true); + $assertType = str_replace('Not', '', $assertType); + } + + if (!in_array($assertType, $this->_assertTypes)) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception(sprintf('Invalid assertion type "%s" provided to %s constraint', $assertType, __CLASS__)); + } + + $this->_assertType = $assertType; + + $response = $other; + $argv = func_get_args(); + $argc = func_num_args(); + + switch ($assertType) { + case self::ASSERT_REDIRECT_TO: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No redirect URL provided against which to match'); + } + $this->_match = $match = $argv[2]; + return ($this->_negate) + ? $this->_notMatch($response, $match) + : $this->_match($response, $match); + case self::ASSERT_REDIRECT_REGEX: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No pattern provided against which to match redirect'); + } + $this->_match = $match = $argv[2]; + return ($this->_negate) + ? $this->_notRegex($response, $match) + : $this->_regex($response, $match); + case self::ASSERT_REDIRECT: + default: + return ($this->_negate) ? !$response->isRedirect() : $response->isRedirect(); + } + } + + /** + * Report Failure + * + * @see PHPUnit_Framework_Constraint for implementation details + * @param mixed $other + * @param string $description Additional message to display + * @param bool $not + * @return void + * @throws PHPUnit_Framework_ExpectationFailedException + */ + public function fail($other, $description, $not = false) + { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + switch ($this->_assertType) { + case self::ASSERT_REDIRECT_TO: + $failure = 'Failed asserting response redirects to "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting response DOES NOT redirect to "%s"'; + } + $failure = sprintf($failure, $this->_match); + break; + case self::ASSERT_REDIRECT_REGEX: + $failure = 'Failed asserting response redirects to URL MATCHING "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting response DOES NOT redirect to URL MATCHING "%s"'; + } + $failure = sprintf($failure, $this->_match); + break; + case self::ASSERT_REDIRECT: + default: + $failure = 'Failed asserting response is a redirect'; + if ($this->_negate) { + $failure = 'Failed asserting response is NOT a redirect'; + } + break; + } + + if (!empty($description)) { + $failure = $description . "\n" . $failure; + } + + throw new Zend_Test_PHPUnit_Constraint_Exception($failure); + } + + /** + * Complete implementation + * + * @return string + */ + public function toString() + { + return ''; + } + + /** + * Check to see if content is matched in selected nodes + * + * @param Zend_Controller_Response_HttpTestCase $response + * @param string $match Content to match + * @return bool + */ + protected function _match($response, $match) + { + if (!$response->isRedirect()) { + return false; + } + + $headers = $response->sendHeaders(); + $redirect = $headers['location']; + $redirect = str_replace('Location: ', '', $redirect); + + return ($redirect == $match); + } + + /** + * Check to see if content is NOT matched in selected nodes + * + * @param Zend_Controller_Response_HttpTestCase $response + * @param string $match + * @return bool + */ + protected function _notMatch($response, $match) + { + if (!$response->isRedirect()) { + return true; + } + + $headers = $response->sendHeaders(); + $redirect = $headers['location']; + $redirect = str_replace('Location: ', '', $redirect); + + return ($redirect != $match); + } + + /** + * Check to see if content is matched by regex in selected nodes + * + * @param Zend_Controller_Response_HttpTestCase $response + * @param string $pattern + * @return bool + */ + protected function _regex($response, $pattern) + { + if (!$response->isRedirect()) { + return false; + } + + $headers = $response->sendHeaders(); + $redirect = $headers['location']; + $redirect = str_replace('Location: ', '', $redirect); + + return preg_match($pattern, $redirect); + } + + /** + * Check to see if content is NOT matched by regex in selected nodes + * + * @param Zend_Controller_Response_HttpTestCase $response + * @param string $pattern + * @return bool + */ + protected function _notRegex($response, $pattern) + { + if (!$response->isRedirect()) { + return true; + } + + $headers = $response->sendHeaders(); + $redirect = $headers['location']; + $redirect = str_replace('Location: ', '', $redirect); + + return !preg_match($pattern, $redirect); + } +} diff --git a/lib/zend/Zend/Test/PHPUnit/Constraint/ResponseHeader.php b/lib/zend/Zend/Test/PHPUnit/Constraint/ResponseHeader.php new file mode 100644 index 0000000000..e7c70713a3 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Constraint/ResponseHeader.php @@ -0,0 +1,398 @@ +_negate = $flag; + } + + /** + * Evaluate an object to see if it fits the constraints + * + * @param Zend_Controller_Response_Abstract $other String to examine + * @param null|string Assertion type + * @return bool + */ + public function evaluate($other, $assertType = null) + { + if (!$other instanceof Zend_Controller_Response_Abstract) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('Header constraint assertions require a response object'); + } + + if (strstr($assertType, 'Not')) { + $this->setNegate(true); + $assertType = str_replace('Not', '', $assertType); + } + + if (!in_array($assertType, $this->_assertTypes)) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception(sprintf('Invalid assertion type "%s" provided to %s constraint', $assertType, __CLASS__)); + } + + $this->_assertType = $assertType; + + $response = $other; + $argv = func_get_args(); + $argc = func_num_args(); + + switch ($assertType) { + case self::ASSERT_RESPONSE_CODE: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No response code provided against which to match'); + } + $this->_code = $code = $argv[2]; + return ($this->_negate) + ? $this->_notCode($response, $code) + : $this->_code($response, $code); + case self::ASSERT_HEADER: + if (3 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('No header provided against which to match'); + } + $this->_header = $header = $argv[2]; + return ($this->_negate) + ? $this->_notHeader($response, $header) + : $this->_header($response, $header); + case self::ASSERT_HEADER_CONTAINS: + if (4 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('Both a header name and content to match are required for ' . __FUNCTION__); + } + $this->_header = $header = $argv[2]; + $this->_match = $match = $argv[3]; + return ($this->_negate) + ? $this->_notHeaderContains($response, $header, $match) + : $this->_headerContains($response, $header, $match); + case self::ASSERT_HEADER_REGEX: + if (4 > $argc) { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('Both a header name and content to match are required for ' . __FUNCTION__); + } + $this->_header = $header = $argv[2]; + $this->_match = $match = $argv[3]; + return ($this->_negate) + ? $this->_notHeaderRegex($response, $header, $match) + : $this->_headerRegex($response, $header, $match); + default: + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + throw new Zend_Test_PHPUnit_Constraint_Exception('Invalid assertion type ' . __FUNCTION__); + } + } + + /** + * Report Failure + * + * @see PHPUnit_Framework_Constraint for implementation details + * @param mixed $other + * @param string $description Additional message to display + * @param bool $not + * @return void + * @throws PHPUnit_Framework_ExpectationFailedException + */ + public function fail($other, $description, $not = false) + { + require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; + switch ($this->_assertType) { + case self::ASSERT_RESPONSE_CODE: + $failure = 'Failed asserting response code "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting response code IS NOT "%s"'; + } + $failure = sprintf($failure, $this->_code); + break; + case self::ASSERT_HEADER: + $failure = 'Failed asserting response header "%s" found'; + if ($this->_negate) { + $failure = 'Failed asserting response response header "%s" WAS NOT found'; + } + $failure = sprintf($failure, $this->_header); + break; + case self::ASSERT_HEADER_CONTAINS: + $failure = 'Failed asserting response header "%s" exists and contains "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting response header "%s" DOES NOT CONTAIN "%s"'; + } + $failure = sprintf($failure, $this->_header, $this->_match); + break; + case self::ASSERT_HEADER_REGEX: + $failure = 'Failed asserting response header "%s" exists and matches regex "%s"'; + if ($this->_negate) { + $failure = 'Failed asserting response header "%s" DOES NOT MATCH regex "%s"'; + } + $failure = sprintf($failure, $this->_header, $this->_match); + break; + default: + throw new Zend_Test_PHPUnit_Constraint_Exception('Invalid assertion type ' . __FUNCTION__); + } + + if (!empty($description)) { + $failure = $description . "\n" . $failure; + } + + throw new Zend_Test_PHPUnit_Constraint_Exception($failure); + } + + /** + * Complete implementation + * + * @return string + */ + public function toString() + { + return ''; + } + + /** + * Compare response code for positive match + * + * @param Zend_Controller_Response_Abstract $response + * @param int $code + * @return bool + */ + protected function _code(Zend_Controller_Response_Abstract $response, $code) + { + $test = $this->_getCode($response); + return ($test == $code); + } + + /** + * Compare response code for negative match + * + * @param Zend_Controller_Response_Abstract $response + * @param int $code + * @return bool + */ + protected function _notCode(Zend_Controller_Response_Abstract $response, $code) + { + $test = $this->_getCode($response); + return ($test != $code); + } + + /** + * Retrieve response code + * + * @param Zend_Controller_Response_Abstract $response + * @return int + */ + protected function _getCode(Zend_Controller_Response_Abstract $response) + { + $test = $response->getHttpResponseCode(); + if (null === $test) { + $test = 200; + } + return $test; + } + + /** + * Positive check for response header presence + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @return bool + */ + protected function _header(Zend_Controller_Response_Abstract $response, $header) + { + return (null !== $this->_getHeader($response, $header)); + } + + /** + * Negative check for response header presence + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @return bool + */ + protected function _notHeader(Zend_Controller_Response_Abstract $response, $header) + { + return (null === $this->_getHeader($response, $header)); + } + + /** + * Retrieve response header + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @return string|null + */ + protected function _getHeader(Zend_Controller_Response_Abstract $response, $header) + { + $headers = $response->sendHeaders(); + $header = strtolower($header); + if (array_key_exists($header, $headers)) { + return $headers[$header]; + } + return null; + } + + /** + * Positive check for header contents matching pattern + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @param string $match + * @return bool + */ + protected function _headerContains(Zend_Controller_Response_Abstract $response, $header, $match) + { + if (null === ($fullHeader = $this->_getHeader($response, $header))) { + return false; + } + + $contents = str_replace($header . ': ', '', $fullHeader); + + return (strstr($contents, $match)); + } + + /** + * Negative check for header contents matching pattern + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @param string $match + * @return bool + */ + protected function _notHeaderContains(Zend_Controller_Response_Abstract $response, $header, $match) + { + if (null === ($fullHeader = $this->_getHeader($response, $header))) { + return true; + } + + $contents = str_replace($header . ': ', '', $fullHeader); + + return (!strstr($contents, $match)); + } + + /** + * Positive check for header contents matching regex + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @param string $pattern + * @return bool + */ + protected function _headerRegex(Zend_Controller_Response_Abstract $response, $header, $pattern) + { + if (null === ($fullHeader = $this->_getHeader($response, $header))) { + return false; + } + + $contents = str_replace($header . ': ', '', $fullHeader); + + return preg_match($pattern, $contents); + } + + /** + * Negative check for header contents matching regex + * + * @param Zend_Controller_Response_Abstract $response + * @param string $header + * @param string $pattern + * @return bool + */ + protected function _notHeaderRegex(Zend_Controller_Response_Abstract $response, $header, $pattern) + { + if (null === ($fullHeader = $this->_getHeader($response, $header))) { + return true; + } + + $contents = str_replace($header . ': ', '', $fullHeader); + + return !preg_match($pattern, $contents); + } +} diff --git a/lib/zend/Zend/Test/PHPUnit/ControllerTestCase.php b/lib/zend/Zend/Test/PHPUnit/ControllerTestCase.php new file mode 100644 index 0000000000..cec7f3137f --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/ControllerTestCase.php @@ -0,0 +1,1143 @@ +$name = $value; + } + + /** + * Overloading for common properties + * + * Provides overloading for request, response, and frontController objects. + * + * @param mixed $name + * @return void + */ + public function __get($name) + { + switch ($name) { + case 'request': + return $this->getRequest(); + case 'response': + return $this->getResponse(); + case 'frontController': + return $this->getFrontController(); + } + + return null; + } + + /** + * Set up MVC app + * + * Calls {@link bootstrap()} by default + * + * @return void + */ + protected function setUp() + { + $this->bootstrap(); + } + + /** + * Bootstrap the front controller + * + * Resets the front controller, and then bootstraps it. + * + * If {@link $bootstrap} is a callback, executes it; if it is a file, it include's + * it. When done, sets the test case request and response objects into the + * front controller. + * + * @return void + */ + final public function bootstrap() + { + $this->reset(); + if (null !== $this->bootstrap) { + if (is_callable($this->bootstrap)) { + call_user_func($this->bootstrap); + } elseif (is_string($this->bootstrap)) { + require_once 'Zend/Loader.php'; + if (Zend_Loader::isReadable($this->bootstrap)) { + include $this->bootstrap; + } + } + } + $this->frontController + ->setRequest($this->getRequest()) + ->setResponse($this->getResponse()); + } + + /** + * Dispatch the MVC + * + * If a URL is provided, sets it as the request URI in the request object. + * Then sets test case request and response objects in front controller, + * disables throwing exceptions, and disables returning the response. + * Finally, dispatches the front controller. + * + * @param string|null $url + * @return void + */ + public function dispatch($url = null) + { + // redirector should not exit + $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); + $redirector->setExit(false); + + // json helper should not exit + $json = Zend_Controller_Action_HelperBroker::getStaticHelper('json'); + $json->suppressExit = true; + + $request = $this->getRequest(); + if (null !== $url) { + $request->setRequestUri($url); + } + $request->setPathInfo(null); + $controller = $this->getFrontController(); + $this->frontController + ->setRequest($request) + ->setResponse($this->getResponse()) + ->throwExceptions(false) + ->returnResponse(false); + $this->frontController->dispatch(); + } + + /** + * Reset MVC state + * + * Creates new request/response objects, resets the front controller + * instance, and resets the action helper broker. + * + * @todo Need to update Zend_Layout to add a resetInstance() method + * @return void + */ + public function reset() + { + $_SESSION = array(); + $_GET = array(); + $_POST = array(); + $_COOKIE = array(); + $this->resetRequest(); + $this->resetResponse(); + Zend_Layout::resetMvcInstance(); + Zend_Controller_Action_HelperBroker::resetHelpers(); + $this->frontController->resetInstance(); + Zend_Session::$_unitTestEnabled = true; + } + + /** + * Rest all view placeholders + * + * @return void + */ + protected function _resetPlaceholders() + { + $registry = Zend_Registry::getInstance(); + $remove = array(); + foreach ($registry as $key => $value) { + if (strstr($key, '_View_')) { + $remove[] = $key; + } + } + + foreach ($remove as $key) { + unset($registry[$key]); + } + } + + /** + * Reset the request object + * + * Useful for test cases that need to test multiple trips to the server. + * + * @return Zend_Test_PHPUnit_ControllerTestCase + */ + public function resetRequest() + { + if ($this->_request instanceof Zend_Controller_Request_HttpTestCase) { + $this->_request->clearQuery() + ->clearPost(); + } + $this->_request = null; + return $this; + } + + /** + * Reset the response object + * + * Useful for test cases that need to test multiple trips to the server. + * + * @return Zend_Test_PHPUnit_ControllerTestCase + */ + public function resetResponse() + { + $this->_response = null; + $this->_resetPlaceholders(); + return $this; + } + + /** + * Assert against DOM selection + * + * @param string $path CSS selector path + * @param string $message + * @return void + */ + public function assertQuery($path, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection + * + * @param string $path CSS selector path + * @param string $message + * @return void + */ + public function assertNotQuery($path, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; node should contain content + * + * @param string $path CSS selector path + * @param string $match content that should be contained in matched nodes + * @param string $message + * @return void + */ + public function assertQueryContentContains($path, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $match)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; node should NOT contain content + * + * @param string $path CSS selector path + * @param string $match content that should NOT be contained in matched nodes + * @param string $message + * @return void + */ + public function assertNotQueryContentContains($path, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $match)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; node should match content + * + * @param string $path CSS selector path + * @param string $pattern Pattern that should be contained in matched nodes + * @param string $message + * @return void + */ + public function assertQueryContentRegex($path, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; node should NOT match content + * + * @param string $path CSS selector path + * @param string $pattern pattern that should NOT be contained in matched nodes + * @param string $message + * @return void + */ + public function assertNotQueryContentRegex($path, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; should contain exact number of nodes + * + * @param string $path CSS selector path + * @param string $count Number of nodes that should match + * @param string $message + * @return void + */ + public function assertQueryCount($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; should NOT contain exact number of nodes + * + * @param string $path CSS selector path + * @param string $count Number of nodes that should NOT match + * @param string $message + * @return void + */ + public function assertNotQueryCount($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; should contain at least this number of nodes + * + * @param string $path CSS selector path + * @param string $count Minimum number of nodes that should match + * @param string $message + * @return void + */ + public function assertQueryCountMin($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against DOM selection; should contain no more than this number of nodes + * + * @param string $path CSS selector path + * @param string $count Maximum number of nodes that should match + * @param string $message + * @return void + */ + public function assertQueryCountMax($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection + * + * @param string $path XPath path + * @param string $message + * @return void + */ + public function assertXpath($path, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection + * + * @param string $path XPath path + * @param string $message + * @return void + */ + public function assertNotXpath($path, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; node should contain content + * + * @param string $path XPath path + * @param string $match content that should be contained in matched nodes + * @param string $message + * @return void + */ + public function assertXpathContentContains($path, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $match)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; node should NOT contain content + * + * @param string $path XPath path + * @param string $match content that should NOT be contained in matched nodes + * @param string $message + * @return void + */ + public function assertNotXpathContentContains($path, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $match)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; node should match content + * + * @param string $path XPath path + * @param string $pattern Pattern that should be contained in matched nodes + * @param string $message + * @return void + */ + public function assertXpathContentRegex($path, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; node should NOT match content + * + * @param string $path XPath path + * @param string $pattern pattern that should NOT be contained in matched nodes + * @param string $message + * @return void + */ + public function assertNotXpathContentRegex($path, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; should contain exact number of nodes + * + * @param string $path XPath path + * @param string $count Number of nodes that should match + * @param string $message + * @return void + */ + public function assertXpathCount($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; should NOT contain exact number of nodes + * + * @param string $path XPath path + * @param string $count Number of nodes that should NOT match + * @param string $message + * @return void + */ + public function assertNotXpathCount($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; should contain at least this number of nodes + * + * @param string $path XPath path + * @param string $count Minimum number of nodes that should match + * @param string $message + * @return void + */ + public function assertXpathCountMin($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert against XPath selection; should contain no more than this number of nodes + * + * @param string $path XPath path + * @param string $count Maximum number of nodes that should match + * @param string $message + * @return void + */ + public function assertXpathCountMax($path, $count, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path); + $content = $this->response->outputBody(); + if (!$constraint->evaluate($content, __FUNCTION__, $count)) { + $constraint->fail($path, $message); + } + } + + /** + * Assert that response is a redirect + * + * @param string $message + * @return void + */ + public function assertRedirect($message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that response is NOT a redirect + * + * @param string $message + * @return void + */ + public function assertNotRedirect($message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that response redirects to given URL + * + * @param string $url + * @param string $message + * @return void + */ + public function assertRedirectTo($url, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $url)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that response does not redirect to given URL + * + * @param string $url + * @param string $message + * @return void + */ + public function assertNotRedirectTo($url, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $url)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that redirect location matches pattern + * + * @param string $pattern + * @param string $message + * @return void + */ + public function assertRedirectRegex($pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $pattern)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that redirect location does not match pattern + * + * @param string $pattern + * @param string $message + * @return void + */ + public function assertNotRedirectRegex($pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_Redirect(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $pattern)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response code + * + * @param int $code + * @param string $message + * @return void + */ + public function assertResponseCode($code, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $code)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response code + * + * @param int $code + * @param string $message + * @return void + */ + public function assertNotResponseCode($code, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $constraint->setNegate(true); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $code)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header exists + * + * @param string $header + * @param string $message + * @return void + */ + public function assertHeader($header, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header does not exist + * + * @param string $header + * @param string $message + * @return void + */ + public function assertNotHeader($header, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $constraint->setNegate(true); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header exists and contains the given string + * + * @param string $header + * @param string $match + * @param string $message + * @return void + */ + public function assertHeaderContains($header, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header, $match)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header does not exist and/or does not contain the given string + * + * @param string $header + * @param string $match + * @param string $message + * @return void + */ + public function assertNotHeaderContains($header, $match, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $constraint->setNegate(true); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header, $match)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header exists and matches the given pattern + * + * @param string $header + * @param string $pattern + * @param string $message + * @return void + */ + public function assertHeaderRegex($header, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header, $pattern)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert response header does not exist and/or does not match the given regex + * + * @param string $header + * @param string $pattern + * @param string $message + * @return void + */ + public function assertNotHeaderRegex($header, $pattern, $message = '') + { + $this->_incrementAssertionCount(); + require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; + $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); + $constraint->setNegate(true); + $response = $this->response; + if (!$constraint->evaluate($response, __FUNCTION__, $header, $pattern)) { + $constraint->fail($response, $message); + } + } + + /** + * Assert that the last handled request used the given module + * + * @param string $module + * @param string $message + * @return void + */ + public function assertModule($module, $message = '') + { + $this->_incrementAssertionCount(); + if ($module != $this->request->getModuleName()) { + $msg = sprintf('Failed asserting last module used <"%s"> was "%s"', + $this->request->getModuleName(), + $module + ); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the last handled request did NOT use the given module + * + * @param string $module + * @param string $message + * @return void + */ + public function assertNotModule($module, $message = '') + { + $this->_incrementAssertionCount(); + if ($module == $this->request->getModuleName()) { + $msg = sprintf('Failed asserting last module used was NOT "%s"', $module); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the last handled request used the given controller + * + * @param string $controller + * @param string $message + * @return void + */ + public function assertController($controller, $message = '') + { + $this->_incrementAssertionCount(); + if ($controller != $this->request->getControllerName()) { + $msg = sprintf('Failed asserting last controller used <"%s"> was "%s"', + $this->request->getControllerName(), + $controller + ); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the last handled request did NOT use the given controller + * + * @param string $controller + * @param string $message + * @return void + */ + public function assertNotController($controller, $message = '') + { + $this->_incrementAssertionCount(); + if ($controller == $this->request->getControllerName()) { + $msg = sprintf('Failed asserting last controller used <"%s"> was NOT "%s"', + $this->request->getControllerName(), + $controller + ); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the last handled request used the given action + * + * @param string $action + * @param string $message + * @return void + */ + public function assertAction($action, $message = '') + { + $this->_incrementAssertionCount(); + if ($action != $this->request->getActionName()) { + $msg = sprintf('Failed asserting last action used <"%s"> was "%s"', $this->request->getActionName(), $action); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the last handled request did NOT use the given action + * + * @param string $action + * @param string $message + * @return void + */ + public function assertNotAction($action, $message = '') + { + $this->_incrementAssertionCount(); + if ($action == $this->request->getActionName()) { + $msg = sprintf('Failed asserting last action used <"%s"> was NOT "%s"', $this->request->getActionName(), $action); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the specified route was used + * + * @param string $route + * @param string $message + * @return void + */ + public function assertRoute($route, $message = '') + { + $this->_incrementAssertionCount(); + $router = $this->frontController->getRouter(); + if ($route != $router->getCurrentRouteName()) { + $msg = sprintf('Failed asserting matched route was "%s", actual route is %s', + $route, + $router->getCurrentRouteName() + ); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Assert that the route matched is NOT as specified + * + * @param string $route + * @param string $message + * @return void + */ + public function assertNotRoute($route, $message = '') + { + $this->_incrementAssertionCount(); + $router = $this->frontController->getRouter(); + if ($route == $router->getCurrentRouteName()) { + $msg = sprintf('Failed asserting route matched was NOT "%s"', $route); + if (!empty($message)) { + $msg = $message . "\n" . $msg; + } + $this->fail($msg); + } + } + + /** + * Retrieve front controller instance + * + * @return Zend_Controller_Front + */ + public function getFrontController() + { + if (null === $this->_frontController) { + $this->_frontController = Zend_Controller_Front::getInstance(); + } + return $this->_frontController; + } + + /** + * Retrieve test case request object + * + * @return Zend_Controller_Request_Abstract + */ + public function getRequest() + { + if (null === $this->_request) { + require_once 'Zend/Controller/Request/HttpTestCase.php'; + $this->_request = new Zend_Controller_Request_HttpTestCase; + } + return $this->_request; + } + + /** + * Retrieve test case response object + * + * @return Zend_Controller_Response_Abstract + */ + public function getResponse() + { + if (null === $this->_response) { + require_once 'Zend/Controller/Response/HttpTestCase.php'; + $this->_response = new Zend_Controller_Response_HttpTestCase; + } + return $this->_response; + } + + /** + * Retrieve DOM query object + * + * @return Zend_Dom_Query + */ + public function getQuery() + { + if (null === $this->_query) { + require_once 'Zend/Dom/Query.php'; + $this->_query = new Zend_Dom_Query; + } + return $this->_query; + } + + /** + * Increment assertion count + * + * @return void + */ + protected function _incrementAssertionCount() + { + $stack = debug_backtrace(); + foreach (debug_backtrace() as $step) { + if (isset($step['object']) + && $step['object'] instanceof PHPUnit_Framework_TestCase + ) { + if (version_compare(PHPUnit_Runner_Version::id(), '3.3.3', 'lt')) { + $step['object']->incrementAssertionCounter(); + } else { + $step['object']->addToAssertionCount(1); + } + break; + } + } + } +} diff --git a/lib/zend/Zend/Test/PHPUnit/DatabaseTestCase.php b/lib/zend/Zend/Test/PHPUnit/DatabaseTestCase.php new file mode 100644 index 0000000000..ac73d75ee3 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/DatabaseTestCase.php @@ -0,0 +1,151 @@ +getConnection()->getConnection(); + } + + /** + * Returns the database operation executed in test setup. + * + * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation + */ + protected function getSetUpOperation() + { + return new PHPUnit_Extensions_Database_Operation_Composite(array( + new Zend_Test_PHPUnit_Db_Operation_Truncate(), + new Zend_Test_PHPUnit_Db_Operation_Insert(), + )); + } + + /** + * Returns the database operation executed in test cleanup. + * + * @return PHPUnit_Extensions_Database_Operation_DatabaseOperation + */ + protected function getTearDownOperation() + { + return PHPUnit_Extensions_Database_Operation_Factory::NONE(); + } + + /** + * Create a dataset based on multiple Zend_Db_Table instances + * + * @param array $tables + * @return Zend_Test_PHPUnit_Db_DataSet_DbTableDataSet + */ + protected function createDbTableDataSet(array $tables=array()) + { + $dataSet = new Zend_Test_PHPUnit_Db_DataSet_DbTableDataSet(); + foreach($tables AS $table) { + $dataSet->addTable($table); + } + return $dataSet; + } + + /** + * Create a table based on one Zend_Db_Table instance + * + * @param Zend_Db_Table_Abstract $table + * @param string $where + * @param string $order + * @param string $count + * @param string $offset + * @return Zend_Test_PHPUnit_Db_DataSet_DbTable + */ + protected function createDbTable(Zend_Db_Table_Abstract $table, $where=null, $order=null, $count=null, $offset=null) + { + return new Zend_Test_PHPUnit_Db_DataSet_DbTable($table, $where, $order, $count, $offset); + } + + /** + * Create a data table based on a Zend_Db_Table_Rowset instance + * + * @param Zend_Db_Table_Rowset_Abstract $rowset + * @param string + * @return Zend_Test_PHPUnit_Db_DataSet_DbRowset + */ + protected function createDbRowset(Zend_Db_Table_Rowset_Abstract $rowset, $tableName = null) + { + return new Zend_Test_PHPUnit_Db_DataSet_DbRowset($rowset, $tableName); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/Connection.php b/lib/zend/Zend/Test/PHPUnit/Db/Connection.php new file mode 100644 index 0000000000..11562e8257 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/Connection.php @@ -0,0 +1,149 @@ +_connection = $db; + $this->_schema = $schema; + } + + /** + * Close this connection. + * + * @return void + */ + public function close() + { + $this->_connection->closeConnection(); + } + + /** + * Creates a table with the result of the specified SQL statement. + * + * @param string $resultName + * @param string $sql + * @return PHPUnit_Extensions_Database_DataSet_ITable + */ + public function createQueryTable($resultName, $sql) + { + return new Zend_Test_PHPUnit_Db_DataSet_QueryTable($resultName, $sql, $this); + } + + /** + * Returns a Zend_Db Connection + * + * @return Zend_Db_Adapter_Abstract + */ + public function getConnection() + { + return $this->_connection; + } + + /** + * Returns a database metadata object that can be used to retrieve table + * meta data from the database. + * + * @return PHPUnit_Extensions_Database_DB_IMetaData + */ + public function getMetaData() + { + if($this->_metaData === null) { + $this->_metaData = new Zend_Test_PHPUnit_Db_Metadata_Generic($this->getConnection(), $this->getSchema()); + } + return $this->_metaData; + } + + /** + * Returns the schema for the connection. + * + * @return string + */ + public function getSchema() + { + return $this->_schema; + } + + /** + * Returns the command used to truncate a table. + * + * @return string + */ + public function getTruncateCommand() + { + return "DELETE"; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php b/lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php new file mode 100644 index 0000000000..f3477d9de4 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php @@ -0,0 +1,75 @@ +getTable(); + if($table !== null) { + $tableName = $table->info('name'); + } else { + require_once "Zend/Test/PHPUnit/Db/Exception.php"; + throw new Zend_Test_PHPUnit_Db_Exception( + 'No table name was given to Rowset Table and table name cannot be infered from the table, '. + 'because the rowset is disconnected from database.' + ); + } + } + + $this->data = $rowset->toArray(); + + $columns = array(); + if(isset($this->data[0]) > 0) { + $columns = array_keys($this->data[0]); + } else if($rowset->getTable() != null) { + $columns = $rowset->getTable()->info('cols'); + } + + $this->tableName = $tableName; + $this->tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($this->tableName, $columns); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbTable.php b/lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbTable.php new file mode 100644 index 0000000000..1d35dc8af4 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbTable.php @@ -0,0 +1,123 @@ +tableName = $table->info('name'); + $this->_columns = $table->info('cols'); + + $this->_table = $table; + $this->_where = $where; + $this->_order = $order; + $this->_count = $count; + $this->_offset = $offset; + } + + /** + * Lazy load data via table fetchAll() method. + * + * @return void + */ + protected function loadData() + { + if ($this->data === null) { + $this->data = $this->_table->fetchAll( + $this->_where, $this->_order, $this->_count, $this->_offset + ); + if($this->data instanceof Zend_Db_Table_Rowset_Abstract) { + $this->data = $this->data->toArray(); + } + } + } + + /** + * Create Table Metadata object + */ + protected function createTableMetaData() + { + if ($this->tableMetaData === NULL) { + $this->loadData(); + $this->tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($this->tableName, $this->_columns); + } + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSet.php b/lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSet.php new file mode 100644 index 0000000000..140c9fa432 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/DataSet/DbTableDataSet.php @@ -0,0 +1,103 @@ +info('name'); + $this->tables[$tableName] = new Zend_Test_PHPUnit_Db_DataSet_DbTable($table, $where, $order, $count, $offset); + } + + /** + * Creates an iterator over the tables in the data set. If $reverse is + * true a reverse iterator will be returned. + * + * @param bool $reverse + * @return PHPUnit_Extensions_Database_DB_TableIterator + */ + protected function createIterator($reverse = FALSE) + { + return new PHPUnit_Extensions_Database_DataSet_DefaultTableIterator($this->tables, $reverse); + } + + /** + * Returns a table object for the given table. + * + * @param string $tableName + * @return PHPUnit_Extensions_Database_DB_Table + */ + public function getTable($tableName) + { + if (!isset($this->tables[$tableName])) { + throw new InvalidArgumentException("$tableName is not a table in the current database."); + } + + return $this->tables[$tableName]; + } + + /** + * Returns a list of table names for the database + * + * @return Array + */ + public function getTableNames() + { + return array_keys($this->tables); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/DataSet/QueryDataSet.php b/lib/zend/Zend/Test/PHPUnit/Db/DataSet/QueryDataSet.php new file mode 100644 index 0000000000..1760649b97 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/DataSet/QueryDataSet.php @@ -0,0 +1,86 @@ +databaseConnection = $databaseConnection; + } + + /** + * Add a Table dataset representation by specifiying an arbitrary select query. + * + * By default a select * will be done on the given tablename. + * + * @param string $tableName + * @param string|Zend_Db_Select $query + */ + public function addTable($tableName, $query = NULL) + { + if ($query === NULL) { + $query = $this->databaseConnection->getConnection()->select(); + $query->from($tableName, Zend_Db_Select::SQL_WILDCARD); + } + + if($query instanceof Zend_Db_Select) { + $query = $query->__toString(); + } + + $this->tables[$tableName] = new Zend_Test_PHPUnit_Db_DataSet_QueryTable($tableName, $query, $this->databaseConnection); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/DataSet/QueryTable.php b/lib/zend/Zend/Test/PHPUnit/Db/DataSet/QueryTable.php new file mode 100644 index 0000000000..89e98f8505 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/DataSet/QueryTable.php @@ -0,0 +1,86 @@ +data === null) { + $stmt = $this->databaseConnection->getConnection()->query($this->query); + $this->data = $stmt->fetchAll(Zend_Db::FETCH_ASSOC); + } + } + + /** + * Create Table Metadata + */ + protected function createTableMetaData() + { + if ($this->tableMetaData === NULL) + { + $this->loadData(); + $keys = array(); + if(count($this->data) > 0) { + $keys = array_keys($this->data[0]); + } + $this->tableMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData( + $this->tableName, $keys + ); + } + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/Exception.php b/lib/zend/Zend/Test/PHPUnit/Db/Exception.php new file mode 100644 index 0000000000..46a5e3e30c --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/Exception.php @@ -0,0 +1,41 @@ +_connection = $db; + $this->_schema = $schema; + } + + /** + * List Tables + * + * @return array + */ + public function getTableNames() + { + return $this->_connection->listTables(); + } + + /** + * Get Table information + * + * @param string $tableName + * @return array + */ + protected function getTableDescription($tableName) + { + if(!isset($this->_tableMetadata[$tableName])) { + $this->_tableMetadata[$tableName] = $this->_connection->describeTable($tableName); + } + return $this->_tableMetadata[$tableName]; + } + + /** + * Returns an array containing the names of all the columns in the + * $tableName table, + * + * @param string $tableName + * @return array + */ + public function getTableColumns($tableName) + { + $tableMeta = $this->getTableDescription($tableName); + $columns = array_keys($tableMeta); + return $columns; + } + + /** + * Returns an array containing the names of all the primary key columns in + * the $tableName table. + * + * @param string $tableName + * @return array + */ + public function getTablePrimaryKeys($tableName) + { + $tableMeta = $this->getTableDescription($tableName); + + $primaryColumnNames = array(); + foreach($tableMeta AS $column) { + if($column['PRIMARY'] == true) { + $primaryColumnNames[] = $column['COLUMN_NAME']; + } + } + return $primaryColumnNames; + } + + /** + * Returns the name of the default schema. + * + * @return string + */ + public function getSchema() + { + return $this->_schema; + } + + /** + * Returns a quoted schema object. (table name, column name, etc) + * + * @param string $object + * @return string + */ + public function quoteSchemaObject($object) + { + return $this->_connection->quoteIdentifier($object); + } + + /** + * Returns true if the rdbms allows cascading + * + * @return bool + */ + public function allowsCascading() + { + return false; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/Operation/DeleteAll.php b/lib/zend/Zend/Test/PHPUnit/Db/Operation/DeleteAll.php new file mode 100644 index 0000000000..6c2cfac93b --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/Operation/DeleteAll.php @@ -0,0 +1,69 @@ +getTableMetaData()->getTableName(); + $connection->getConnection()->delete($tableName); + } catch (Exception $e) { + require_once "PHPUnit/Extensions/Database/Operation/Exception.php"; + throw new PHPUnit_Extensions_Database_Operation_Exception('DELETEALL', 'DELETE FROM '.$tableName.'', array(), $table, $e->getMessage()); + } + } + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/Operation/Insert.php b/lib/zend/Zend/Test/PHPUnit/Db/Operation/Insert.php new file mode 100644 index 0000000000..355c9dd95e --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/Operation/Insert.php @@ -0,0 +1,92 @@ +createDataSet(); + + $dsIterator = $dataSet->getIterator(); + + foreach($dsIterator as $table) { + $tableName = $table->getTableMetaData()->getTableName(); + + $db = $connection->getConnection(); + for($i = 0; $i < $table->getRowCount(); $i++) { + $values = $this->buildInsertValues($table, $i); + try { + $db->insert($tableName, $values); + } catch (Exception $e) { + throw new PHPUnit_Extensions_Database_Operation_Exception("INSERT", "INSERT INTO ".$tableName." [..]", $values, $table, $e->getMessage()); + } + } + } + } + + /** + * + * @param PHPUnit_Extensions_Database_DataSet_ITable $table + * @param int $rowNum + * @return array + */ + protected function buildInsertValues(PHPUnit_Extensions_Database_DataSet_ITable $table, $rowNum) + { + $values = array(); + foreach($table->getTableMetaData()->getColumns() as $columnName) { + $values[$columnName] = $table->getValue($rowNum, $columnName); + } + return $values; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/Operation/Truncate.php b/lib/zend/Zend/Test/PHPUnit/Db/Operation/Truncate.php new file mode 100644 index 0000000000..03a16a9da2 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/Operation/Truncate.php @@ -0,0 +1,114 @@ +getReverseIterator() AS $table) { + try { + $tableName = $table->getTableMetaData()->getTableName(); + $this->_truncate($connection->getConnection(), $tableName); + } catch (Exception $e) { + throw new PHPUnit_Extensions_Database_Operation_Exception('TRUNCATE', 'TRUNCATE '.$tableName.'', array(), $table, $e->getMessage()); + } + } + } + + /** + * Truncate a given table. + * + * @param Zend_Db_Adapter_Abstract $db + * @param string $tableName + * @return void + */ + protected function _truncate(Zend_Db_Adapter_Abstract $db, $tableName) + { + $tableName = $db->quoteIdentifier($tableName); + if($db instanceof Zend_Db_Adapter_Pdo_Sqlite) { + $db->query('DELETE FROM '.$tableName); + } else if($db instanceof Zend_Db_Adapter_Db2) { + if(strstr(PHP_OS, "WIN")) { + $file = tempnam(sys_get_temp_dir(), "zendtestdbibm_"); + file_put_contents($file, ""); + $db->query('IMPORT FROM '.$file.' OF DEL REPLACE INTO '.$tableName); + unlink($file); + } else { + $db->query('IMPORT FROM /dev/null OF DEL REPLACE INTO '.$tableName); + } + } else if($this->_isMssqlOrOracle($db)) { + $db->query('TRUNCATE TABLE '.$tableName); + } else { + $db->query('TRUNCATE '.$tableName); + } + } + + /** + * Detect if an adapter is for Mssql or Oracle Databases. + * + * @param Zend_Db_Adapter_Abstract $db + * @return bool + */ + private function _isMssqlOrOracle($db) + { + return ( + $db instanceof Zend_Db_Adapter_Pdo_Mssql || + $db instanceof Zend_Db_Adapter_Sqlsrv || + $db instanceof Zend_Db_Adapter_Pdo_Oci || + $db instanceof Zend_Db_Adapter_Oracle + ); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Test/PHPUnit/Db/SimpleTester.php b/lib/zend/Zend/Test/PHPUnit/Db/SimpleTester.php new file mode 100644 index 0000000000..a37ae65c77 --- /dev/null +++ b/lib/zend/Zend/Test/PHPUnit/Db/SimpleTester.php @@ -0,0 +1,95 @@ +connection = $connection; + $this->setUpOperation = new PHPUnit_Extensions_Database_Operation_Composite(array( + new Zend_Test_PHPUnit_Db_Operation_Truncate(), + new Zend_Test_PHPUnit_Db_Operation_Insert(), + )); + $this->tearDownOperation = PHPUnit_Extensions_Database_Operation_Factory::NONE(); + } + + /** + * Set Up the database using the given Dataset and the SetUp strategy "Truncate, then Insert" + * + * @param PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet + */ + public function setUpDatabase(PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet) + { + $this->setDataSet($dataSet); + $this->onSetUp(); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Text/Exception.php b/lib/zend/Zend/Text/Exception.php new file mode 100644 index 0000000000..7d8dc7ab4f --- /dev/null +++ b/lib/zend/Zend/Text/Exception.php @@ -0,0 +1,38 @@ +setOptions($options); + } else if ($options instanceof Zend_Config) { + $this->setConfig($options); + } + + // If no font was defined, load default font + if (!$this->_fontLoaded) { + $this->_loadFont(dirname(__FILE__) . '/Figlet/zend-framework.flf'); + } + } + + /** + * Set options from array + * + * @param array $options Configuration for Zend_Text_Figlet + * @return Zend_Text_Figlet + */ + public function setOptions(array $options) + { + foreach ($options as $key => $value) { + if (in_array(strtolower($key), $this->_skipOptions)) { + continue; + } + + $method = 'set' . ucfirst($key); + if (method_exists($this, $method)) { + $this->$method($value); + } + } + return $this; + } + + /** + * Set options from config object + * + * @param Zend_Config $config Configuration for Zend_Text_Figlet + * @return Zend_Text_Figlet + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Set a font to use + * + * @param string $font Path to the font + * @return Zend_Text_Figlet + */ + public function setFont($font) + { + $this->_loadFont($font); + return $this; + } + + /** + * Set handling of paragraphs + * + * @param boolean $handleParagraphs Wether to handle paragraphs or not + * @return Zend_Text_Figlet + */ + public function setHandleParagraphs($handleParagraphs) + { + $this->_handleParagraphs = (bool) $handleParagraphs; + return $this; + } + + /** + * Set the justification. 0 stands for left aligned, 1 for centered and 2 + * for right aligned. + * + * @param integer $justification Justification of the output text + * @return Zend_Text_Figlet + */ + public function setJustification($justification) + { + $this->_justification = min(3, max(0, (int) $justification)); + return $this; + } + + /** + * Set the output width + * + * @param integer $outputWidth Output with which should be used for word + * wrapping and justification + * @return Zend_Text_Figlet + */ + public function setOutputWidth($outputWidth) + { + $this->_outputWidth = max(1, (int) $outputWidth); + return $this; + } + + /** + * Set right to left mode. For writing from left to right, use + * Zend_Text_Figlet::DIRECTION_LEFT_TO_RIGHT. For writing from right to left, + * use Zend_Text_Figlet::DIRECTION_RIGHT_TO_LEFT. + * + * @param integer $rightToLeft Right-to-left mode + * @return Zend_Text_Figlet + */ + public function setRightToLeft($rightToLeft) + { + $this->_rightToLeft = min(1, max(0, (int) $rightToLeft)); + return $this; + } + + /** + * Set the smush mode. + * + * Use one of the constants of Zend_Text_Figlet::SM_*, you may combine them. + * + * @param integer $smushMode Smush mode to use for generating text + * @return Zend_Text_Figlet + */ + public function setSmushMode($smushMode) + { + $smushMode = (int) $smushMode; + + if ($smushMode < -1) { + $this->_smushOverride = self::SMO_NO; + } else { + if ($smushMode === 0) { + $this->_userSmush = self::SM_KERN; + } else if ($smushMode === -1) { + $this->_userSmush = 0; + } else { + $this->_userSmush = (($smushMode & 63) | self::SM_SMUSH); + } + + $this->_smushOverride = self::SMO_YES; + } + + $this->_setUsedSmush(); + + return $this; + } + + /** + * Render a FIGlet text + * + * @param string $text Text to convert to a figlet text + * @param string $encoding Encoding of the input string + * @throws InvalidArgumentException When $text is not a string + * @throws Zend_Text_Figlet_Exception When $text it not properly encoded + * @return string + */ + public function render($text, $encoding = 'UTF-8') + { + if (!is_string($text)) { + throw new InvalidArgumentException('$text must be a string'); + } + + if ($encoding !== 'UTF-8') { + $text = iconv($encoding, 'UTF-8', $text); + } + + $this->_output = ''; + $this->_outputLine = array(); + + $this->_clearLine(); + + $this->_outlineLengthLimit = ($this->_outputWidth - 1); + $this->_inCharLineLengthLimit = ($this->_outputWidth * 4 + 100); + + $wordBreakMode = 0; + $lastCharWasEol = false; + $textLength = @iconv_strlen($text, 'UTF-8'); + + if ($textLength === false) { + require_once 'Zend/Text/Figlet/Exception.php'; + throw new Zend_Text_Figlet_Exception('$text is not encoded with ' . $encoding); + } + + for ($charNum = 0; $charNum < $textLength; $charNum++) { + // Handle paragraphs + $char = iconv_substr($text, $charNum, 1, 'UTF-8'); + + if ($char === "\n" && $this->_handleParagraphs && !$lastCharWasEol) { + $nextChar = iconv_substr($text, ($charNum + 1), 1, 'UTF-8'); + if (!$nextChar) { + $nextChar = null; + } + + $char = (ctype_space($nextChar)) ? "\n" : ' '; + } + + $lastCharWasEol = (ctype_space($char) && $char !== "\t" && $char !== ' '); + + if (ctype_space($char)) { + $char = ($char === "\t" || $char === ' ') ? ' ': "\n"; + } + + // Skip unprintable characters + $ordChar = $this->_uniOrd($char); + if (($ordChar > 0 && $ordChar < 32 && $char !== "\n") || $ordChar === 127) { + continue; + } + + // Build the character + // Note: The following code is complex and thoroughly tested. + // Be careful when modifying! + do { + $charNotAdded = false; + + if ($wordBreakMode === -1) { + if ($char === ' ') { + break; + } else if ($char === "\n") { + $wordBreakMode = 0; + break; + } + + $wordBreakMode = 0; + } + + if ($char === "\n") { + $this->_appendLine(); + $wordBreakMode = false; + } else if ($this->_addChar($char)) { + if ($char !== ' ') { + $wordBreakMode = ($wordBreakMode >= 2) ? 3: 1; + } else { + $wordBreakMode = ($wordBreakMode > 0) ? 2: 0; + } + } else if ($this->_outlineLength === 0) { + for ($i = 0; $i < $this->_charHeight; $i++) { + if ($this->_rightToLeft === 1 && $this->_outputWidth > 1) { + $offset = (strlen($this->_currentChar[$i]) - $this->_outlineLengthLimit); + $this->_putString(substr($this->_currentChar[$i], $offset)); + } else { + $this->_putString($this->_currentChar[$i]); + } + } + + $wordBreakMode = -1; + } else if ($char === ' ') { + if ($wordBreakMode === 2) { + $this->_splitLine(); + } else { + $this->_appendLine(); + } + + $wordBreakMode = -1; + } else { + if ($wordBreakMode >= 2) { + $this->_splitLine(); + } else { + $this->_appendLine(); + } + + $wordBreakMode = ($wordBreakMode === 3) ? 1 : 0; + $charNotAdded = true; + } + } while ($charNotAdded); + } + + if ($this->_outlineLength !== 0) { + $this->_appendLine(); + } + + return $this->_output; + } + + /** + * Puts the given string, substituting blanks for hardblanks. If outputWidth + * is 1, puts the entire string; otherwise puts at most outputWidth - 1 + * characters. Puts a newline at the end of the string. The string is left- + * justified, centered or right-justified (taking outputWidth as the screen + * width) if justification is 0, 1 or 2 respectively. + * + * @param string $string The string to add to the output + * @return void + */ + protected function _putString($string) + { + $length = strlen($string); + + if ($this->_outputWidth > 1) { + if ($length > ($this->_outputWidth - 1)) { + $length = ($this->_outputWidth - 1); + } + + if ($this->_justification > 0) { + for ($i = 1; + ((3 - $this->_justification) * $i + $length + $this->_justification - 2) < $this->_outputWidth; + $i++) { + $this->_output .= ' '; + } + } + } + + $this->_output .= str_replace($this->_hardBlank, ' ', $string) . "\n"; + } + + /** + * Appends the current line to the output + * + * @return void + */ + protected function _appendLine() + { + for ($i = 0; $i < $this->_charHeight; $i++) { + $this->_putString($this->_outputLine[$i]); + } + + $this->_clearLine(); + } + + /** + * Splits inCharLine at the last word break (bunch of consecutive blanks). + * Makes a new line out of the first part and appends it using appendLine(). + * Makes a new line out of the second part and returns. + * + * @return void + */ + protected function _splitLine() + { + $gotSpace = false; + for ($i = ($this->_inCharLineLength - 1); $i >= 0; $i--) { + if (!$gotSpace && $this->_inCharLine[$i] === ' ') { + $gotSpace = true; + $lastSpace = $i; + } + + if ($gotSpace && $this->_inCharLine[$i] !== ' ') { + break; + } + } + + $firstLength = ($i + 1); + $lastLength = ($this->_inCharLineLength - $lastSpace - 1); + + $firstPart = ''; + for ($i = 0; $i < $firstLength; $i++) { + $firstPart[$i] = $this->_inCharLine[$i]; + } + + $lastPart = ''; + for ($i = 0; $i < $lastLength; $i++) { + $lastPart[$i] = $this->_inCharLine[($lastSpace + 1 + $i)]; + } + + $this->_clearLine(); + + for ($i = 0; $i < $firstLength; $i++) { + $this->_addChar($firstPart[$i]); + } + + $this->_appendLine(); + + for ($i = 0; $i < $lastLength; $i++) { + $this->_addChar($lastPart[$i]); + } + } + + /** + * Clears the current line + * + * @return void + */ + protected function _clearLine() + { + for ($i = 0; $i < $this->_charHeight; $i++) { + $this->_outputLine[$i] = ''; + } + + $this->_outlineLength = 0; + $this->_inCharLineLength = 0; + } + + /** + * Attempts to add the given character onto the end of the current line. + * Returns true if this can be done, false otherwise. + * + * @param string $char Character which to add to the output + * @return boolean + */ + protected function _addChar($char) + { + $this->_getLetter($char); + + if ($this->_currentChar === null) { + return true; + } + + $smushAmount = $this->_smushAmount(); + + if (($this->_outlineLength + $this->_currentCharWidth - $smushAmount) > $this->_outlineLengthLimit + || ($this->_inCharLineLength + 1) > $this->_inCharLineLengthLimit) { + return false; + } + + $tempLine = ''; + for ($row = 0; $row < $this->_charHeight; $row++) { + if ($this->_rightToLeft === 1) { + $tempLine = $this->_currentChar[$row]; + + for ($k = 0; $k < $smushAmount; $k++) { + $position = ($this->_currentCharWidth - $smushAmount + $k); + $tempLine[$position] = $this->_smushem($tempLine[$position], $this->_outputLine[$row][$k]); + } + + $this->_outputLine[$row] = $tempLine . substr($this->_outputLine[$row], $smushAmount); + } else { + for ($k = 0; $k < $smushAmount; $k++) { + if (($this->_outlineLength - $smushAmount + $k) < 0) { + continue; + } + + $position = ($this->_outlineLength - $smushAmount + $k); + if (isset($this->_outputLine[$row][$position])) { + $leftChar = $this->_outputLine[$row][$position]; + } else { + $leftChar = null; + } + + $this->_outputLine[$row][$position] = $this->_smushem($leftChar, $this->_currentChar[$row][$k]); + } + + $this->_outputLine[$row] .= substr($this->_currentChar[$row], $smushAmount); + } + } + + $this->_outlineLength = strlen($this->_outputLine[0]); + $this->_inCharLine[$this->_inCharLineLength++] = $char; + + return true; + } + + /** + * Gets the requested character and sets current and previous char width. + * + * @param string $char The character from which to get the letter of + * @return void + */ + protected function _getLetter($char) + { + if (array_key_exists($this->_uniOrd($char), $this->_charList)) { + $this->_currentChar = $this->_charList[$this->_uniOrd($char)]; + $this->_previousCharWidth = $this->_currentCharWidth; + $this->_currentCharWidth = strlen($this->_currentChar[0]); + } else { + $this->_currentChar = null; + } + } + + /** + * Returns the maximum amount that the current character can be smushed into + * the current line. + * + * @return integer + */ + protected function _smushAmount() + { + if (($this->_smushMode & (self::SM_SMUSH | self::SM_KERN)) === 0) { + return 0; + } + + $maxSmush = $this->_currentCharWidth; + $amount = $maxSmush; + + for ($row = 0; $row < $this->_charHeight; $row++) { + if ($this->_rightToLeft === 1) { + $charbd = strlen($this->_currentChar[$row]); + while (true) { + if (!isset($this->_currentChar[$row][$charbd])) { + $leftChar = null; + } else { + $leftChar = $this->_currentChar[$row][$charbd]; + } + + if ($charbd > 0 && ($leftChar === null || $leftChar == ' ')) { + $charbd--; + } else { + break; + } + } + + $linebd = 0; + while (true) { + if (!isset($this->_outputLine[$row][$linebd])) { + $rightChar = null; + } else { + $rightChar = $this->_outputLine[$row][$linebd]; + } + + if ($rightChar === ' ') { + $linebd++; + } else { + break; + } + } + + $amount = ($linebd + $this->_currentCharWidth - 1 - $charbd); + } else { + $linebd = strlen($this->_outputLine[$row]); + while (true) { + if (!isset($this->_outputLine[$row][$linebd])) { + $leftChar = null; + } else { + $leftChar = $this->_outputLine[$row][$linebd]; + } + + if ($linebd > 0 && ($leftChar === null || $leftChar == ' ')) { + $linebd--; + } else { + break; + } + } + + $charbd = 0; + while (true) { + if (!isset($this->_currentChar[$row][$charbd])) { + $rightChar = null; + } else { + $rightChar = $this->_currentChar[$row][$charbd]; + } + + if ($rightChar === ' ') { + $charbd++; + } else { + break; + } + } + + $amount = ($charbd + $this->_outlineLength - 1 - $linebd); + } + + if (empty($leftChar) || $leftChar === ' ') { + $amount++; + } else if (!empty($rightChar)) { + if ($this->_smushem($leftChar, $rightChar) !== null) { + $amount++; + } + } + + $maxSmush = min($amount, $maxSmush); + } + + return $maxSmush; + } + + /** + * Given two characters, attempts to smush them into one, according to the + * current smushmode. Returns smushed character or false if no smushing can + * be done. + * + * Smushmode values are sum of following (all values smush blanks): + * + * 1: Smush equal chars (not hardblanks) + * 2: Smush '_' with any char in hierarchy below + * 4: hierarchy: "|", "/\", "[]", "{}", "()", "<>" + * Each class in hier. can be replaced by later class. + * 8: [ + ] -> |, { + } -> |, ( + ) -> | + * 16: / + \ -> X, > + < -> X (only in that order) + * 32: hardblank + hardblank -> hardblank + * + * @param string $leftChar Left character to smush + * @param string $rightChar Right character to smush + * @return string + */ + protected function _smushem($leftChar, $rightChar) + { + if ($leftChar === ' ') { + return $rightChar; + } + + if ($rightChar === ' ') { + return $leftChar; + } + + if ($this->_previousCharWidth < 2 || $this->_currentCharWidth < 2) { + // Disallows overlapping if the previous character or the current + // character has a width of one or zero. + return null; + } + + if (($this->_smushMode & self::SM_SMUSH) === 0) { + // Kerning + return null; + } + + if (($this->_smushMode & 63) === 0) { + // This is smushing by universal overlapping + if ($leftChar === ' ') { + return $rightChar; + } else if ($rightChar === ' ') { + return $leftChar; + } else if ($leftChar === $this->_hardBlank) { + return $rightChar; + } else if ($rightChar === $this->_hardBlank) { + return $rightChar; + } else if ($this->_rightToLeft === 1) { + return $leftChar; + } else { + // Occurs in the absence of above exceptions + return $rightChar; + } + } + + if (($this->_smushMode & self::SM_HARDBLANK) > 0) { + if ($leftChar === $this->_hardBlank && $rightChar === $this->_hardBlank) { + return $leftChar; + } + } + + if ($leftChar === $this->_hardBlank && $rightChar === $this->_hardBlank) { + return null; + } + + if (($this->_smushMode & self::SM_EQUAL) > 0) { + if ($leftChar === $rightChar) { + return $leftChar; + } + } + + if (($this->_smushMode & self::SM_LOWLINE) > 0) { + if ($leftChar === '_' && strchr('|/\\[]{}()<>', $rightChar) !== false) { + return $rightChar; + } else if ($rightChar === '_' && strchr('|/\\[]{}()<>', $leftChar) !== false) { + return $leftChar; + } + } + + if (($this->_smushMode & self::SM_HIERARCHY) > 0) { + if ($leftChar === '|' && strchr('/\\[]{}()<>', $rightChar) !== false) { + return $rightChar; + } else if ($rightChar === '|' && strchr('/\\[]{}()<>', $leftChar) !== false) { + return $leftChar; + } else if (strchr('/\\', $leftChar) && strchr('[]{}()<>', $rightChar) !== false) { + return $rightChar; + } else if (strchr('/\\', $rightChar) && strchr('[]{}()<>', $leftChar) !== false) { + return $leftChar; + } else if (strchr('[]', $leftChar) && strchr('{}()<>', $rightChar) !== false) { + return $rightChar; + } else if (strchr('[]', $rightChar) && strchr('{}()<>', $leftChar) !== false) { + return $leftChar; + } else if (strchr('{}', $leftChar) && strchr('()<>', $rightChar) !== false) { + return $rightChar; + } else if (strchr('{}', $rightChar) && strchr('()<>', $leftChar) !== false) { + return $leftChar; + } else if (strchr('()', $leftChar) && strchr('<>', $rightChar) !== false) { + return $rightChar; + } else if (strchr('()', $rightChar) && strchr('<>', $leftChar) !== false) { + return $leftChar; + } + } + + if (($this->_smushMode & self::SM_PAIR) > 0) { + if ($leftChar === '[' && $rightChar === ']') { + return '|'; + } else if ($rightChar === '[' && $leftChar === ']') { + return '|'; + } else if ($leftChar === '{' && $rightChar === '}') { + return '|'; + } else if ($rightChar === '{' && $leftChar === '}') { + return '|'; + } else if ($leftChar === '(' && $rightChar === ')') { + return '|'; + } else if ($rightChar === '(' && $leftChar === ')') { + return '|'; + } + } + + if (($this->_smushMode & self::SM_BIGX) > 0) { + if ($leftChar === '/' && $rightChar === '\\') { + return '|'; + } else if ($rightChar === '/' && $leftChar === '\\') { + return 'Y'; + } else if ($leftChar === '>' && $rightChar === '<') { + return 'X'; + } + } + + return null; + } + + /** + * Load the specified font + * + * @param string $fontFile Font file to load + * @throws Zend_Text_Figlet_Exception When font file was not found + * @throws Zend_Text_Figlet_Exception When GZIP library is required but not found + * @throws Zend_Text_Figlet_Exception When font file is not readable + * @return void + */ + protected function _loadFont($fontFile) + { + // Check if the font file exists + if (!file_exists($fontFile)) { + require_once 'Zend/Text/Figlet/Exception.php'; + throw new Zend_Text_Figlet_Exception($fontFile . ': Font file not found'); + } + + // Check if gzip support is required + if (substr($fontFile, -3) === '.gz') { + if (!function_exists('gzcompress')) { + require_once 'Zend/Text/Figlet/Exception.php'; + throw new Zend_Text_Figlet_Exception('GZIP library is required for ' + . 'gzip compressed font files'); + } + + $fontFile = 'compress.zlib://' . $fontFile; + $compressed = true; + } else { + $compressed = false; + } + + // Try to open the file + $fp = fopen($fontFile, 'rb'); + if ($fp === false) { + require_once 'Zend/Text/Figlet/Exception.php'; + throw new Zend_Text_Figlet_Exception($fontFile . ': Could not open file'); + } + + // If the file is not compressed, lock the stream + if (!$compressed) { + flock($fp, LOCK_SH); + } + + // Get magic + $magic = $this->_readMagic($fp); + + // Get the header + $numsRead = sscanf(fgets($fp, 1000), + '%*c%c %d %*d %d %d %d %d %d', + $this->_hardBlank, + $this->_charHeight, + $this->_maxLength, + $smush, + $cmtLines, + $rightToLeft, + $this->_fontSmush); + + if ($magic !== self::FONTFILE_MAGIC_NUMBER || $numsRead < 5) { + require_once 'Zend/Text/Figlet/Exception.php'; + throw new Zend_Text_Figlet_Exception($fontFile . ': Not a FIGlet 2 font file'); + } + + // Set default right to left + if ($numsRead < 6) { + $rightToLeft = 0; + } + + // If no smush2, decode smush into smush2 + if ($numsRead < 7) { + if ($smush === 2) { + $this->_fontSmush = self::SM_KERN; + } else if ($smush < 0) { + $this->_fontSmush = 0; + } else { + $this->_fontSmush = (($smush & 31) | self::SM_SMUSH); + } + } + + // Correct char height && maxlength + $this->_charHeight = max(1, $this->_charHeight); + $this->_maxLength = max(1, $this->_maxLength); + + // Give ourselves some extra room + $this->_maxLength += 100; + + // See if we have to override smush settings + $this->_setUsedSmush(); + + // Get left to right value + if ($this->_rightToLeft === null) { + $this->_rightToLeft = $rightToLeft; + } + + // Get justification value + if ($this->_justification === null) { + $this->_justification = (2 * $this->_rightToLeft); + } + + // Skip all comment lines + for ($line = 1; $line <= $cmtLines; $line++) { + $this->_skipToEol($fp); + } + + // Fetch all ASCII characters + for ($asciiCode = 32; $asciiCode < 127; $asciiCode++) { + $this->_charList[$asciiCode] = $this->_loadChar($fp); + } + + // Fetch all german characters + foreach ($this->_germanChars as $uniCode) { + $char = $this->_loadChar($fp); + + if ($char === false) { + fclose($fp); + return; + } + + if (trim(implode('', $char)) !== '') { + $this->_charList[$uniCode] = $char; + } + } + + // At the end fetch all extended characters + while (!feof($fp)) { + // Get the Unicode + list($uniCode) = explode(' ', fgets($fp, 2048)); + + if (empty($uniCode)) { + continue; + } + + // Convert it if required + if (substr($uniCode, 0, 2) === '0x') { + $uniCode = hexdec(substr($uniCode, 2)); + } else if (substr($uniCode, 0, 1) === '0' and + $uniCode !== '0' or + substr($uniCode, 0, 2) === '-0') { + $uniCode = octdec($uniCode); + } else { + $uniCode = (int) $uniCode; + } + + // Now fetch the character + $char = $this->_loadChar($fp); + + if ($char === false) { + fclose($fp); + return; + } + + $this->_charList[$uniCode] = $char; + } + + fclose($fp); + + $this->_fontLoaded = true; + } + + /** + * Set the used smush mode, according to smush override, user smsush and + * font smush. + * + * @return void + */ + protected function _setUsedSmush() + { + if ($this->_smushOverride === self::SMO_NO) { + $this->_smushMode = $this->_fontSmush; + } else if ($this->_smushOverride === self::SMO_YES) { + $this->_smushMode = $this->_userSmush; + } else if ($this->_smushOverride === self::SMO_FORCE) { + $this->_smushMode = ($this->_fontSmush | $this->_userSmush); + } + } + + /** + * Reads a four-character magic string from a stream + * + * @param resource $fp File pointer to the font file + * @return string + */ + protected function _readMagic($fp) + { + $magic = ''; + + for ($i = 0; $i < 4; $i++) { + $magic .= fgetc($fp); + } + + return $magic; + } + + /** + * Skip a stream to the end of line + * + * @param resource $fp File pointer to the font file + * @return void + */ + protected function _skipToEol($fp) + { + $dummy = fgetc($fp); + while ($dummy !== false && !feof($fp)) { + if ($dummy === "\n") { + return; + } + + if ($dummy === "\r") { + $dummy = fgetc($fp); + + if (!feof($fp) && $dummy !== "\n") { + fseek($fp, -1, SEEK_SET); + } + + return; + } + + $dummy = fgetc($fp); + } + } + + /** + * Load a single character from the font file + * + * @param resource $fp File pointer to the font file + * @return array + */ + protected function _loadChar($fp) + { + $char = array(); + + for ($i = 0; $i < $this->_charHeight; $i++) { + if (feof($fp)) { + return false; + } + + $line = rtrim(fgets($fp, 2048), "\r\n"); + + if (preg_match('#(.)\\1?$#', $line, $result) === 1) { + $line = str_replace($result[1], '', $line); + } + + $char[] = $line; + } + + return $char; + } + + /** + * Unicode compatible ord() method + * + * @param string $c The char to get the value from + * @return integer + */ + protected function _uniOrd($c) + { + $h = ord($c[0]); + + if ($h <= 0x7F) { + $ord = $h; + } else if ($h < 0xC2) { + $ord = 0; + } else if ($h <= 0xDF) { + $ord = (($h & 0x1F) << 6 | (ord($c[1]) & 0x3F)); + } else if ($h <= 0xEF) { + $ord = (($h & 0x0F) << 12 | (ord($c[1]) & 0x3F) << 6 | (ord($c[2]) & 0x3F)); + } else if ($h <= 0xF4) { + $ord = (($h & 0x0F) << 18 | (ord($c[1]) & 0x3F) << 12 | + (ord($c[2]) & 0x3F) << 6 | (ord($c[3]) & 0x3F)); + } else { + $ord = 0; + } + + return $ord; + } +} diff --git a/lib/zend/Zend/Text/Figlet/Exception.php b/lib/zend/Zend/Text/Figlet/Exception.php new file mode 100644 index 0000000000..dec19eb1d8 --- /dev/null +++ b/lib/zend/Zend/Text/Figlet/Exception.php @@ -0,0 +1,38 @@ +# + # + # + # + # + # + ## +?# + # + # + # + # + # + ## +@# + # + # + # + # + # + ## + ___ # + / _ \\ # + / //\ \\ # +| ___ ||# +|_|| |_||# +`-` `-` # + ## + ______ # +| \\ # +| --$ // # +| -- \\ # +|______// # +`------` # + ## + _____ # + / ____|| # +/ //---`' # +\ \\___ # + \_____|| # + `----` # + ## + _____ # +| __ \\ # +| |$ \ || # +| |__/ || # +|_____// # + -----` # + ## + _____ # + | ___|| # + | ||__ # + | ||__ # + |_____|| # + `-----` # + ## + ______ # + /_____// # + `____ ` # + /___// # + `__ ` # + /_// # + `-` ## + _____ # + / ___|| # +| //$__ # +| \\_\ || # + \____// # + `---` # + ## + __ _ # +| || | || # +| '--' || # +| .--. || # +|_|| |_|| # +`-` `-` # + ## + ______ # + /_ _// # + -| ||- # + _| ||_ # + /_____// # + `-----` # + ## + ______ # + /_ _// # + | || # + _| || # + /__// # + `--` # + ## + _ __ # + | |/ // # + | ' // # + | . \\ # + |_|\_\\ # + `-` --` # + ## + __ # + | || # + | || # + | ||__ # + |____// # + `----` # + ## + _ _ # +| \ / || # +| \/ || # +| . . || # +|_|\/|_|| # +`-` `-` # + ## + _ _ # + | \| || # + | ' || # + | . || # + |_|\_|| # + `-` -` # + ## + ___ # + / _ \\ # + | /$\ || # + | \_/ || # + \___// # + `---` # + ## + ____ # + | _ \\ # + | |_| || # + | .__// # + |_|--` # + `-` # + ## + ___ # + / _ \\ # +| /$\ || # +| \_/ || # + \___ \\ # + `---` # + ## + ____ # + | _ \\ # + | |_| || # + | . // # + |_|\_\\ # + `-` --` # + ## + _____ # + / ___// # + \___ \\ # + / $ // # + /____// # +`-----` # + ## + ______ # + /_ _// # + `-| |,- # + | || # + |_|| # + `-`' # + ## + _ _ # +| || | || # +| || | || # +| \\_/ || # + \____// # + `---` # + ## +__ __ # +\ \\ / // # + \ \/ // # + \ // # + \// # + ` # + ## + _ _ # +| | | || # +| |/\| || # +| /\ || # +|_// \_|| # +`-` `-` # + ## + __ __ # + \ \\/ // # + \ $ // # + / . \\ # + /_//\_\\ # + `-` --` # + ## + __ __ # + \ \\/ // # + \ ` // # + | || # + |_|| # + `-`' # + ## + ______ # +|____ // # + / // # + / // # + / //__ # +/______|| # +`------` ## +[# + # + # + # + # + # + ## +\# + # + # + # + # + # + ## +]# + # + # + # + # + # + ## +^# + # + # + # + # + # + ## +_# + # + # + # + # + # + ## +`# + # + # + # + # + # + ## + ___ # + / _ \\ # + / //\ \\ # +| ___ ||# +|_|| |_||# +`-` `-` # + ## + ______ # +| \\ # +| --$ // # +| -- \\ # +|______// # +`------` # + ## + _____ # + / ____|| # +/ //---`' # +\ \\___ # + \_____|| # + `----` # + ## + _____ # +| __ \\ # +| |$ \ || # +| |__/ || # +|_____// # + -----` # + ## + _____ # + | ___|| # + | ||__ # + | ||__ # + |_____|| # + `-----` # + ## + ______ # + /_____// # + `____ ` # + /___// # + `__ ` # + /_// # + `-` ## + _____ # + / ___|| # +| //$__ # +| \\_\ || # + \____// # + `---` # + ## + __ _ # +| || | || # +| '--' || # +| .--. || # +|_|| |_|| # +`-` `-` # + ## + ______ # + /_ _// # + -| ||- # + _| ||_ # + /_____// # + `-----` # + ## + ______ # + /_ _// # + | || # + _| || # + /__// # + `--` # + ## + _ __ # + | |/ // # + | ' // # + | . \\ # + |_|\_\\ # + `-` --` # + ## + __ # + | || # + | || # + | ||__ # + |____// # + `----` # + ## + _ _ # +| \ / || # +| \/ || # +| . . || # +|_|\/|_|| # +`-` `-` # + ## + _ _ # + | \| || # + | ' || # + | . || # + |_|\_|| # + `-` -` # + ## + ___ # + / _ \\ # + | /$\ || # + | \_/ || # + \___// # + `---` # + ## + # + ____ # + | \\ # + | [] || # + | __// # + |_|`-` # + `-` ## + # + ___ # + / || # + | [] || # + \__ || # + -|_|| # + `-` ## + ____ # + | _ \\ # + | |_| || # + | . // # + |_|\_\\ # + `-` --` # + ## + _____ # + / ___// # + \___ \\ # + / $ // # + /____// # +`-----` # + ## + ______ # + /_ _// # + `-| |,- # + | || # + |_|| # + `-`' # + ## + _ _ # +| || | || # +| || | || # +| \\_/ || # + \____// # + `---` # + ## +__ __ # +\ \\ / // # + \ \/ // # + \ // # + \// # + ` # + ## + _ _ # +| | | || # +| |/\| || # +| /\ || # +|_// \_|| # +`-` `-` # + ## + __ __ # + \ \\/ // # + \ $ // # + / . \\ # + /_//\_\\ # + `-` --` # + ## + __ __ # + \ \\/ // # + \ ` // # + | || # + |_|| # + `-`' # + ## + _____ # + |__ // # + / // # + / //__ # + /_____|| # + `-----` # + ## +{# + # + # + # + # + # + ## +|# + # + # + # + # + # + ## +}# + # + # + # + # + # + ## +~# + # + # + # + # + # + ## + []|_[]| # + / _ \\ # + / //\ \\ # +| $___$ ||# +|_||$ |_||# +`-` `-` # + ## + []|_[]| # + / _ \\ # + | /$\ || # + | \_/ || # + \___// # + ---` # + ## + []| []| # +| ||$| || # +| ||$| || # +| \\_/ || # + \____// # + `---` # + ## + []|_[]| # + / _ \\ # + / //\ \\ # +| $___$ ||# +|_||$ |_||# +`-` `-` # + ## + []|_[]| # + / _ \\ # + | /$\ || # + | \_/ || # + \___// # + ---` # + ## + []| []| # +| ||$| || # +| ||$| || # +| \\_/ || # + \____// # + `---` # + ## + ,--. # + | _$ \\ # + | // # + | |\ \\ # + |$ ___\\ # + |_|----` # + - ## +162 CENT SIGN + _ # + | || # + / __// # +| (__` # + \ \\ # + |_|` # + `-` ## +215 MULTIPLICATION SIGN + # + # + \\// # + \\ # + //\\ # + # + ## \ No newline at end of file diff --git a/lib/zend/Zend/Text/MultiByte.php b/lib/zend/Zend/Text/MultiByte.php new file mode 100644 index 0000000000..8afe8e7514 --- /dev/null +++ b/lib/zend/Zend/Text/MultiByte.php @@ -0,0 +1,153 @@ + 0) { + $subString = iconv_substr($string, 0, $width, $charset); + + if ($subString === $string) { + $cutLength = null; + } else { + $nextChar = iconv_substr($string, $width, 1, $charset); + + if ($nextChar === ' ' || $nextChar === $break) { + $afterNextChar = iconv_substr($string, $width + 1, 1, $charset); + + if ($afterNextChar === false) { + $subString .= $nextChar; + } + + $cutLength = iconv_strlen($subString, $charset) + 1; + } else { + $spacePos = iconv_strrpos($subString, ' ', $charset); + + if ($spacePos !== false) { + $subString = iconv_substr($subString, 0, $spacePos, $charset); + $cutLength = $spacePos + 1; + } else if ($cut === false) { + $spacePos = iconv_strpos($string, ' ', 0, $charset); + + if ($spacePos !== false) { + $subString = iconv_substr($string, 0, $spacePos, $charset); + $cutLength = $spacePos + 1; + } else { + $subString = $string; + $cutLength = null; + } + } else { + $breakPos = iconv_strpos($subString, $break, 0, $charset); + + if ($breakPos !== false) { + $subString = iconv_substr($subString, 0, $breakPos, $charset); + $cutLength = $breakPos + 1; + } else { + $subString = iconv_substr($subString, 0, $width, $charset); + $cutLength = $width; + } + } + } + } + + $result[] = $subString; + + if ($cutLength !== null) { + $string = iconv_substr($string, $cutLength, ($stringLength - $cutLength), $charset); + } else { + break; + } + } + + return implode($break, $result); + } + + /** + * String padding + * + * @param string $input + * @param integer $padLength + * @param string $padString + * @param integer $padType + * @param string $charset + * @return string + */ + public static function strPad($input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT, $charset = 'UTF-8') + { + $return = ''; + $lengthOfPadding = $padLength - iconv_strlen($input, $charset); + $padStringLength = iconv_strlen($padString, $charset); + + if ($padStringLength === 0 || $lengthOfPadding === 0) { + $return = $input; + } else { + $repeatCount = floor($lengthOfPadding / $padStringLength); + + if ($padType === STR_PAD_BOTH) { + $lastStringLeft = ''; + $lastStringRight = ''; + $repeatCountLeft = $repeatCountRight = ($repeatCount - $repeatCount % 2) / 2; + + $lastStringLength = $lengthOfPadding - 2 * $repeatCountLeft * $padStringLength; + $lastStringLeftLength = $lastStringRightLength = floor($lastStringLength / 2); + $lastStringRightLength += $lastStringLength % 2; + + $lastStringLeft = iconv_substr($padString, 0, $lastStringLeftLength, $charset); + $lastStringRight = iconv_substr($padString, 0, $lastStringRightLength, $charset); + + $return = str_repeat($padString, $repeatCountLeft) . $lastStringLeft + . $input + . str_repeat($padString, $repeatCountRight) . $lastStringRight; + } else { + $lastString = iconv_substr($padString, 0, $lengthOfPadding % $padStringLength, $charset); + + if ($padType === STR_PAD_LEFT) { + $return = str_repeat($padString, $repeatCount) . $lastString . $input; + } else { + $return = $input . str_repeat($padString, $repeatCount) . $lastString; + } + } + } + + return $return; + } +} diff --git a/lib/zend/Zend/Text/Table.php b/lib/zend/Zend/Text/Table.php new file mode 100644 index 0000000000..1f8912e226 --- /dev/null +++ b/lib/zend/Zend/Text/Table.php @@ -0,0 +1,532 @@ +setOptions($options); + } else if ($options instanceof Zend_Config) { + $this->setConfig($options); + } + + // Check if column widths were set + // @todo When column widths were not set, assume auto-sizing + if ($this->_columnWidths === null) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('You must define the column widths'); + } + + // If no decorator was given, use default unicode decorator + if ($this->_decorator === null) { + if (self::getOutputCharset() === 'utf-8') { + $this->setDecorator('unicode'); + } else { + $this->setDecorator('ascii'); + } + } + } + + /** + * Set options from array + * + * @param array $options Configuration for Zend_Text_Table + * @return Zend_Text_Table + */ + public function setOptions(array $options) + { + foreach ($options as $key => $value) { + if (in_array(strtolower($key), $this->_skipOptions)) { + continue; + } + + $method = 'set' . ucfirst($key); + if (method_exists($this, $method)) { + $this->$method($value); + } + } + + return $this; + } + + /** + * Set options from config object + * + * @param Zend_Config $config Configuration for Zend_Text_Table + * @return Zend_Text_Table + */ + public function setConfig(Zend_Config $config) + { + return $this->setOptions($config->toArray()); + } + + /** + * Set column widths + * + * @param array $columnWidths Widths of all columns + * @throws Zend_Text_Table_Exception When no columns were supplied + * @throws Zend_Text_Table_Exception When a column has an invalid width + * @return Zend_Text_Table + */ + public function setColumnWidths(array $columnWidths) + { + if (count($columnWidths) === 0) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('You must supply at least one column'); + } + + foreach ($columnWidths as $columnNum => $columnWidth) { + if (is_int($columnWidth) === false or $columnWidth < 1) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('Column ' . $columnNum . ' has an invalid' + . ' column width'); + } + } + + $this->_columnWidths = $columnWidths; + + return $this; + } + + /** + * Set auto separation mode + * + * @param integer $autoSeparate Auto separation mode + * @return Zend_Text_Table + */ + public function setAutoSeparate($autoSeparate) + { + $this->_autoSeparate = (int) $autoSeparate; + return $this; + } + + /** + * Set decorator + * + * @param Zend_Text_Table_Decorator_Interface|string $decorator Decorator to use + * @return Zend_Text_Table + */ + public function setDecorator($decorator) + { + if ($decorator instanceof Zend_Text_Table_Decorator_Interface) { + $this->_decorator = $decorator; + } else { + $classname = $this->getPluginLoader()->load($decorator); + $this->_decorator = new $classname; + } + + return $this; + } + + /** + * Set the column padding + * + * @param integer $padding The padding for the columns + * @return Zend_Text_Table + */ + public function setPadding($padding) + { + $this->_padding = max(0, (int) $padding); + return $this; + } + + /** + * Get the plugin loader for decorators + * + * @return Zend_Loader_PluginLoader + */ + public function getPluginLoader() + { + if ($this->_pluginLoader === null) { + $prefix = 'Zend_Text_Table_Decorator_'; + $pathPrefix = 'Zend/Text/Table/Decorator/'; + + require_once 'Zend/Loader/PluginLoader.php'; + $this->_pluginLoader = new Zend_Loader_PluginLoader(array($prefix => $pathPrefix)); + } + + return $this->_pluginLoader; + } + + /** + * Set default column align for rows created by appendRow(array $data) + * + * @param integer $columnNum + * @param string $align + * @return Zend_Text_Table + */ + public function setDefaultColumnAlign($columnNum, $align) + { + $this->_defaultColumnAligns[$columnNum] = $align; + + return $this; + } + + /** + * Set the input charset for column contents + * + * @param string $charset + */ + public static function setInputCharset($charset) + { + self::$_inputCharset = strtolower($charset); + } + + /** + * Get the input charset for column contents + * + * @param string $charset + */ + public static function getInputCharset() + { + return self::$_inputCharset; + } + + /** + * Set the output charset for column contents + * + * @param string $charset + */ + public static function setOutputCharset($charset) + { + self::$_outputCharset = strtolower($charset); + } + + /** + * Get the output charset for column contents + * + * @param string $charset + */ + public static function getOutputCharset() + { + return self::$_outputCharset; + } + + /** + * Append a row to the table + * + * @param array|Zend_Text_Table_Row $row The row to append to the table + * @throws Zend_Text_Table_Exception When $row is neither an array nor Zend_Zext_Table_Row + * @throws Zend_Text_Table_Exception When a row contains too many columns + * @return Zend_Text_Table + */ + public function appendRow($row) + { + if (!is_array($row) && !($row instanceof Zend_Text_Table_Row)) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('$row must be an array or instance of Zend_Text_Table_Row'); + } + + if (is_array($row)) { + if (count($row) > count($this->_columnWidths)) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('Row contains too many columns'); + } + + require_once 'Zend/Text/Table/Row.php'; + + $data = $row; + $row = new Zend_Text_Table_Row(); + $colNum = 0; + foreach ($data as $columnData) { + if (isset($this->_defaultColumnAligns[$colNum])) { + $align = $this->_defaultColumnAligns[$colNum]; + } else { + $align = null; + } + + $row->appendColumn(new Zend_Text_Table_Column($columnData, $align)); + $colNum++; + } + } + + $this->_rows[] = $row; + + return $this; + } + + /** + * Render the table + * + * @throws Zend_Text_Table_Exception When no rows were added to the table + * @return string + */ + public function render() + { + // There should be at least one row + if (count($this->_rows) === 0) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('No rows were added to the table yet'); + } + + // Initiate the result variable + $result = ''; + + // Count total columns + $totalNumColumns = count($this->_columnWidths); + + // Now render all rows, starting from the first one + $numRows = count($this->_rows); + foreach ($this->_rows as $rowNum => $row) { + // Get all column widths + if (isset($columnWidths) === true) { + $lastColumnWidths = $columnWidths; + } + + $renderedRow = $row->render($this->_columnWidths, $this->_decorator, $this->_padding); + $columnWidths = $row->getColumnWidths(); + $numColumns = count($columnWidths); + + // Check what we have to draw + if ($rowNum === 0) { + // If this is the first row, draw the table top + $result .= $this->_decorator->getTopLeft(); + + foreach ($columnWidths as $columnNum => $columnWidth) { + $result .= str_repeat($this->_decorator->getHorizontal(), + $columnWidth); + + if (($columnNum + 1) === $numColumns) { + $result .= $this->_decorator->getTopRight(); + } else { + $result .= $this->_decorator->getHorizontalDown(); + } + } + + $result .= "\n"; + } else { + // Else check if we have to draw the row separator + if ($this->_autoSeparate & self::AUTO_SEPARATE_ALL) { + $drawSeparator = true; + } else if ($rowNum === 1 && $this->_autoSeparate & self::AUTO_SEPARATE_HEADER) { + $drawSeparator = true; + } else if ($rowNum === ($numRows - 1) && $this->_autoSeparate & self::AUTO_SEPARATE_FOOTER) { + $drawSeparator = true; + } else { + $drawSeparator = false; + } + + if ($drawSeparator) { + $result .= $this->_decorator->getVerticalRight(); + + $currentUpperColumn = 0; + $currentLowerColumn = 0; + $currentUpperWidth = 0; + $currentLowerWidth = 0; + + // Loop through all column widths + foreach ($this->_columnWidths as $columnNum => $columnWidth) { + // Add the horizontal line + $result .= str_repeat($this->_decorator->getHorizontal(), + $columnWidth); + + // If this is the last line, break out + if (($columnNum + 1) === $totalNumColumns) { + break; + } + + // Else check, which connector style has to be used + $connector = 0x0; + $currentUpperWidth += $columnWidth; + $currentLowerWidth += $columnWidth; + + if ($lastColumnWidths[$currentUpperColumn] === $currentUpperWidth) { + $connector |= 0x1; + $currentUpperColumn += 1; + $currentUpperWidth = 0; + } else { + $currentUpperWidth += 1; + } + + if ($columnWidths[$currentLowerColumn] === $currentLowerWidth) { + $connector |= 0x2; + $currentLowerColumn += 1; + $currentLowerWidth = 0; + } else { + $currentLowerWidth += 1; + } + + switch ($connector) { + case 0x0: + $result .= $this->_decorator->getHorizontal(); + break; + + case 0x1: + $result .= $this->_decorator->getHorizontalUp(); + break; + + case 0x2: + $result .= $this->_decorator->getHorizontalDown(); + break; + + case 0x3: + $result .= $this->_decorator->getCross(); + break; + + default: + // This can never happen, but the CS tells I have to have it ... + break; + } + } + + $result .= $this->_decorator->getVerticalLeft() . "\n"; + } + } + + // Add the rendered row to the result + $result .= $renderedRow; + + // If this is the last row, draw the table bottom + if (($rowNum + 1) === $numRows) { + $result .= $this->_decorator->getBottomLeft(); + + foreach ($columnWidths as $columnNum => $columnWidth) { + $result .= str_repeat($this->_decorator->getHorizontal(), + $columnWidth); + + if (($columnNum + 1) === $numColumns) { + $result .= $this->_decorator->getBottomRight(); + } else { + $result .= $this->_decorator->getHorizontalUp(); + } + } + + $result .= "\n"; + } + } + + return $result; + } + + /** + * Magic method which returns the rendered table + * + * @return string + */ + public function __toString() + { + try { + return $this->render(); + } catch (Exception $e) { + trigger_error($e->getMessage(), E_USER_ERROR); + } + + } +} diff --git a/lib/zend/Zend/Text/Table/Column.php b/lib/zend/Zend/Text/Table/Column.php new file mode 100644 index 0000000000..49da9273e2 --- /dev/null +++ b/lib/zend/Zend/Text/Table/Column.php @@ -0,0 +1,243 @@ +setContent($content, $charset); + } + + if ($align !== null) { + $this->setAlign($align); + } + + if ($colSpan !== null) { + $this->setColSpan($colSpan); + } + } + + /** + * Set the content. + * + * If $charset is not defined, it is assumed that $content is encoded in + * the charset defined via Zend_Text_Table::setInputCharset() (defaults + * to utf-8). + * + * @param string $content Content of the column + * @param string $charset The charset of the content + * @throws Zend_Text_Table_Exception When $content is not a string + * @return Zend_Text_Table_Column + */ + public function setContent($content, $charset = null) + { + if (is_string($content) === false) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('$content must be a string'); + } + + if ($charset === null) { + $inputCharset = Zend_Text_Table::getInputCharset(); + } else { + $inputCharset = strtolower($charset); + } + + $outputCharset = Zend_Text_Table::getOutputCharset(); + + if ($inputCharset !== $outputCharset) { + if (PHP_OS !== 'AIX') { + // AIX does not understand these character sets + $content = iconv($inputCharset, $outputCharset, $content); + } + + } + + $this->_content = $content; + + return $this; + } + + /** + * Set the align + * + * @param string $align Align of the column + * @throws Zend_Text_Table_Exception When supplied align is invalid + * @return Zend_Text_Table_Column + */ + public function setAlign($align) + { + if (in_array($align, $this->_allowedAligns) === false) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('Invalid align supplied'); + } + + $this->_align = $align; + + return $this; + } + + /** + * Set the colspan + * + * @param int $colSpan + * @throws Zend_Text_Table_Exception When $colSpan is smaller than 1 + * @return Zend_Text_Table_Column + */ + public function setColSpan($colSpan) + { + if (is_int($colSpan) === false or $colSpan < 1) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('$colSpan must be an integer and greater than 0'); + } + + $this->_colSpan = $colSpan; + + return $this; + } + + /** + * Get the colspan + * + * @return integer + */ + public function getColSpan() + { + return $this->_colSpan; + } + + /** + * Render the column width the given column width + * + * @param integer $columnWidth The width of the column + * @param integer $padding The padding for the column + * @throws Zend_Text_Table_Exception When $columnWidth is lower than 1 + * @throws Zend_Text_Table_Exception When padding is greater than columnWidth + * @return string + */ + public function render($columnWidth, $padding = 0) + { + if (is_int($columnWidth) === false or $columnWidth < 1) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('$columnWidth must be an integer and greater than 0'); + } + + $columnWidth -= ($padding * 2); + + if ($columnWidth < 1) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('Padding (' . $padding . ') is greater than column width'); + } + + switch ($this->_align) { + case self::ALIGN_LEFT: + $padMode = STR_PAD_RIGHT; + break; + + case self::ALIGN_CENTER: + $padMode = STR_PAD_BOTH; + break; + + case self::ALIGN_RIGHT: + $padMode = STR_PAD_LEFT; + break; + + default: + // This can never happen, but the CS tells I have to have it ... + break; + } + + $outputCharset = Zend_Text_Table::getOutputCharset(); + $lines = explode("\n", Zend_Text_MultiByte::wordWrap($this->_content, $columnWidth, "\n", true, $outputCharset)); + $paddedLines = array(); + + foreach ($lines AS $line) { + $paddedLines[] = str_repeat(' ', $padding) + . Zend_Text_MultiByte::strPad($line, $columnWidth, ' ', $padMode, $outputCharset) + . str_repeat(' ', $padding); + } + + $result = implode("\n", $paddedLines); + + return $result; + } +} diff --git a/lib/zend/Zend/Text/Table/Decorator/Ascii.php b/lib/zend/Zend/Text/Table/Decorator/Ascii.php new file mode 100644 index 0000000000..b40451d346 --- /dev/null +++ b/lib/zend/Zend/Text/Table/Decorator/Ascii.php @@ -0,0 +1,147 @@ +_uniChar(0x250C); + } + + /** + * Defined by Zend_Text_Table_Decorator_Interface + * + * @return string + */ + public function getTopRight() + { + return $this->_uniChar(0x2510); + } + + /** + * Defined by Zend_Text_Table_Decorator_Interface + * + * @return string + */ + public function getBottomLeft() + { + return $this->_uniChar(0x2514); + } + + /** + * Defined by Zend_Text_Table_Decorator_Interface + * + * @return string + */ + public function getBottomRight() + { + return $this->_uniChar(0x2518); + } + + /** + * Defined by Zend_Text_Table_Decorator_Interface + * + * @return string + */ + public function getVertical() + { + return $this->_uniChar(0x2502); + } + + /** + * Defined by Zend_Text_Table_Decorator_Interface + * + * @return string + */ + public function getHorizontal() + { + return $this->_uniChar(0x2500); + } + + /** + * Defined by Zend_Text_Table_Decorator_Interface + * + * @return string + */ + public function getCross() + { + return $this->_uniChar(0x253C); + } + + /** + * Defined by Zend_Text_Table_Decorator_Interface + * + * @return string + */ + public function getVerticalRight() + { + return $this->_uniChar(0x251C); + } + + /** + * Defined by Zend_Text_Table_Decorator_Interface + * + * @return string + */ + public function getVerticalLeft() + { + return $this->_uniChar(0x2524); + } + + /** + * Defined by Zend_Text_Table_Decorator_Interface + * + * @return string + */ + public function getHorizontalDown() + { + return $this->_uniChar(0x252C); + } + + /** + * Defined by Zend_Text_Table_Decorator_Interface + * + * @return string + */ + public function getHorizontalUp() + { + return $this->_uniChar(0x2534); + } + + /** + * Convert am unicode character code to a character + * + * @param integer $code + * @return string|false + */ + protected function _uniChar($code) + { + if ($code <= 0x7F) { + $char = chr($code); + } else if ($code <= 0x7FF) { + $char = chr(0xC0 | $code >> 6) + . chr(0x80 | $code & 0x3F); + } else if ($code <= 0xFFFF) { + $char = chr(0xE0 | $code >> 12) + . chr(0x80 | $code >> 6 & 0x3F) + . chr(0x80 | $code & 0x3F); + } else if ($code <= 0x10FFFF) { + $char = chr(0xF0 | $code >> 18) + . chr(0x80 | $code >> 12 & 0x3F) + . chr(0x80 | $code >> 6 & 0x3F) + . chr(0x80 | $code & 0x3F); + } else { + return false; + } + + return $char; + } +} diff --git a/lib/zend/Zend/Text/Table/Exception.php b/lib/zend/Zend/Text/Table/Exception.php new file mode 100644 index 0000000000..ae5ef1bf90 --- /dev/null +++ b/lib/zend/Zend/Text/Table/Exception.php @@ -0,0 +1,38 @@ +appendColumn($column); + + return $this; + } + + /** + * Append a column to the row + * + * @param Zend_Text_Table_Column $column The column to append to the row + * @return Zend_Text_Table_Row + */ + public function appendColumn(Zend_Text_Table_Column $column) + { + $this->_columns[] = $column; + + return $this; + } + + /** + * Get a column by it's index + * + * Returns null, when the index is out of range + * + * @param integer $index + * @return Zend_Text_Table_Column|null + */ + public function getColumn($index) + { + if (!isset($this->_columns[$index])) { + return null; + } + + return $this->_columns[$index]; + } + + /** + * Get all columns of the row + * + * @return array + */ + public function getColumns() + { + return $this->_columns; + } + + /** + * Get the widths of all columns, which were rendered last + * + * @throws Zend_Text_Table_Exception When no columns were rendered yet + * @return integer + */ + public function getColumnWidths() + { + if ($this->_columnWidths === null) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('No columns were rendered yet'); + } + + return $this->_columnWidths; + } + + /** + * Render the row + * + * @param array $columnWidths Width of all columns + * @param Zend_Text_Table_Decorator_Interface $decorator Decorator for the row borders + * @param integer $padding Padding for the columns + * @throws Zend_Text_Table_Exception When there are too many columns + * @return string + */ + public function render(array $columnWidths, + Zend_Text_Table_Decorator_Interface $decorator, + $padding = 0) + { + // Prepare an array to store all column widths + $this->_columnWidths = array(); + + // If there is no single column, create a column which spans over the + // entire row + if (count($this->_columns) === 0) { + require_once 'Zend/Text/Table/Column.php'; + $this->appendColumn(new Zend_Text_Table_Column(null, null, count($columnWidths))); + } + + // First we have to render all columns, to get the maximum height + $renderedColumns = array(); + $maxHeight = 0; + $colNum = 0; + foreach ($this->_columns as $column) { + // Get the colspan of the column + $colSpan = $column->getColSpan(); + + // Verify if there are enough column widths defined + if (($colNum + $colSpan) > count($columnWidths)) { + require_once 'Zend/Text/Table/Exception.php'; + throw new Zend_Text_Table_Exception('Too many columns'); + } + + // Calculate the column width + $columnWidth = ($colSpan - 1 + array_sum(array_slice($columnWidths, + $colNum, + $colSpan))); + + // Render the column and split it's lines into an array + $result = explode("\n", $column->render($columnWidth, $padding)); + + // Store the width of the rendered column + $this->_columnWidths[] = $columnWidth; + + // Store the rendered column and calculate the new max height + $renderedColumns[] = $result; + $maxHeight = max($maxHeight, count($result)); + + // Set up the internal column number + $colNum += $colSpan; + } + + // If the row doesnt contain enough columns to fill the entire row, fill + // it with an empty column + if ($colNum < count($columnWidths)) { + $remainingWidth = (count($columnWidths) - $colNum - 1) + + array_sum(array_slice($columnWidths, + $colNum)); + $renderedColumns[] = array(str_repeat(' ', $remainingWidth)); + + $this->_columnWidths[] = $remainingWidth; + } + + // Add each single column line to the result + $result = ''; + for ($line = 0; $line < $maxHeight; $line++) { + $result .= $decorator->getVertical(); + + foreach ($renderedColumns as $renderedColumn) { + if (isset($renderedColumn[$line]) === true) { + $result .= $renderedColumn[$line]; + } else { + $result .= str_repeat(' ', strlen($renderedColumn[0])); + } + + $result .= $decorator->getVertical(); + } + + $result .= "\n"; + } + + return $result; + } +} diff --git a/lib/zend/Zend/TimeSync/Exception.php b/lib/zend/Zend/TimeSync/Exception.php new file mode 100644 index 0000000000..7b83eff816 --- /dev/null +++ b/lib/zend/Zend/TimeSync/Exception.php @@ -0,0 +1,64 @@ +_exceptions[] = $exception; + } + + /** + * Returns an array of exceptions that were thrown + * + * @return array + */ + public function get() + { + return $this->_exceptions; + } +} diff --git a/lib/zend/Zend/TimeSync/Ntp.php b/lib/zend/Zend/TimeSync/Ntp.php new file mode 100644 index 0000000000..b174158f26 --- /dev/null +++ b/lib/zend/Zend/TimeSync/Ntp.php @@ -0,0 +1,400 @@ +_timeserver = 'udp://' . $timeserver; + if ($port !== null) { + $this->_port = $port; + } + } + + /** + * Prepare local timestamp for transmission in our request packet + * + * NTP timestamps are represented as a 64-bit fixed-point number, in + * seconds relative to 0000 UT on 1 January 1900. The integer part is + * in the first 32 bits and the fraction part in the last 32 bits + * + * @return string + */ + protected function _prepare() + { + $frac = microtime(); + $fracba = ($frac & 0xff000000) >> 24; + $fracbb = ($frac & 0x00ff0000) >> 16; + $fracbc = ($frac & 0x0000ff00) >> 8; + $fracbd = ($frac & 0x000000ff); + + $sec = (time() + 2208988800); + $secba = ($sec & 0xff000000) >> 24; + $secbb = ($sec & 0x00ff0000) >> 16; + $secbc = ($sec & 0x0000ff00) >> 8; + $secbd = ($sec & 0x000000ff); + + // Flags + $nul = chr(0x00); + $nulbyte = $nul . $nul . $nul . $nul; + $ntppacket = chr(0xd9) . $nul . chr(0x0a) . chr(0xfa); + + /* + * Root delay + * + * Indicates the total roundtrip delay to the primary reference + * source at the root of the synchronization subnet, in seconds + */ + $ntppacket .= $nul . $nul . chr(0x1c) . chr(0x9b); + + /* + * Clock Dispersion + * + * Indicates the maximum error relative to the primary reference source at the + * root of the synchronization subnet, in seconds + */ + $ntppacket .= $nul . chr(0x08) . chr(0xd7) . chr(0xff); + + /* + * ReferenceClockID + * + * Identifying the particular reference clock + */ + $ntppacket .= $nulbyte; + + /* + * The local time, in timestamp format, at the peer when its latest NTP message + * was sent. Contanis an integer and a fractional part + */ + $ntppacket .= chr($secba) . chr($secbb) . chr($secbc) . chr($secbd); + $ntppacket .= chr($fracba) . chr($fracbb) . chr($fracbc) . chr($fracbd); + + /* + * The local time, in timestamp format, at the peer. Contains an integer + * and a fractional part. + */ + $ntppacket .= $nulbyte; + $ntppacket .= $nulbyte; + + /* + * This is the local time, in timestamp format, when the latest NTP message from + * the peer arrived. Contanis an integer and a fractional part. + */ + $ntppacket .= $nulbyte; + $ntppacket .= $nulbyte; + + /* + * The local time, in timestamp format, at which the + * NTP message departed the sender. Contanis an integer + * and a fractional part. + */ + $ntppacket .= chr($secba) . chr($secbb) . chr($secbc) . chr($secbd); + $ntppacket .= chr($fracba) . chr($fracbb) . chr($fracbc) . chr($fracbd); + + return $ntppacket; + } + + /** + * Reads the data returned from the timeserver + * + * This will return an array with binary data listing: + * + * @return array + * @throws Zend_TimeSync_Exception When timeserver can not be connected + */ + protected function _read() + { + $flags = ord(fread($this->_socket, 1)); + $info = stream_get_meta_data($this->_socket); + + if ($info['timed_out'] === true) { + fclose($this->_socket); + throw new Zend_TimeSync_Exception('could not connect to ' . + "'$this->_timeserver' on port '$this->_port', reason: 'server timed out'"); + } + + $result = array( + 'flags' => $flags, + 'stratum' => ord(fread($this->_socket, 1)), + 'poll' => ord(fread($this->_socket, 1)), + 'precision' => ord(fread($this->_socket, 1)), + 'rootdelay' => ord(fread($this->_socket, 4)), + 'rootdispersion' => ord(fread($this->_socket, 4)), + 'referenceid' => ord(fread($this->_socket, 4)), + 'referencestamp' => ord(fread($this->_socket, 4)), + 'referencemicro' => ord(fread($this->_socket, 4)), + 'originatestamp' => ord(fread($this->_socket, 4)), + 'originatemicro' => ord(fread($this->_socket, 4)), + 'receivestamp' => ord(fread($this->_socket, 4)), + 'receivemicro' => ord(fread($this->_socket, 4)), + 'transmitstamp' => ord(fread($this->_socket, 4)), + 'transmitmicro' => ord(fread($this->_socket, 4)), + 'clientreceived' => 0 + ); + + $this->_disconnect(); + + return $result; + } + + /** + * Sends the NTP packet to the server + * + * @param string $data Data to send to the timeserver + * @return void + */ + protected function _write($data) + { + $this->_connect(); + + fwrite($this->_socket, $data); + stream_set_timeout($this->_socket, Zend_TimeSync::$options['timeout']); + } + + /** + * Extracts the binary data returned from the timeserver + * + * @param string|array $binary Data returned from the timeserver + * @return integer Difference in seconds + */ + protected function _extract($binary) + { + /* + * Leap Indicator bit 1100 0000 + * + * Code warning of impending leap-second to be inserted at the end of + * the last day of the current month. + */ + $leap = ($binary['flags'] & 0xc0) >> 6; + switch($leap) { + case 0: + $this->_info['leap'] = '0 - no warning'; + break; + + case 1: + $this->_info['leap'] = '1 - last minute has 61 seconds'; + break; + + case 2: + $this->_info['leap'] = '2 - last minute has 59 seconds'; + break; + + default: + $this->_info['leap'] = '3 - not syncronised'; + break; + } + + /* + * Version Number bit 0011 1000 + * + * This should be 3 (RFC 1305) + */ + $this->_info['version'] = ($binary['flags'] & 0x38) >> 3; + + /* + * Mode bit 0000 0111 + * + * Except in broadcast mode, an NTP association is formed when two peers + * exchange messages and one or both of them create and maintain an + * instantiation of the protocol machine, called an association. + */ + $mode = ($binary['flags'] & 0x07); + switch($mode) { + case 1: + $this->_info['mode'] = 'symetric active'; + break; + + case 2: + $this->_info['mode'] = 'symetric passive'; + break; + + case 3: + $this->_info['mode'] = 'client'; + break; + + case 4: + $this->_info['mode'] = 'server'; + break; + + case 5: + $this->_info['mode'] = 'broadcast'; + break; + + default: + $this->_info['mode'] = 'reserved'; + break; + } + + $ntpserviceid = 'Unknown Stratum ' . $binary['stratum'] . ' Service'; + + /* + * Reference Clock Identifier + * + * Identifies the particular reference clock. + */ + $refid = strtoupper($binary['referenceid']); + switch($binary['stratum']) { + case 0: + if (substr($refid, 0, 3) === 'DCN') { + $ntpserviceid = 'DCN routing protocol'; + } else if (substr($refid, 0, 4) === 'NIST') { + $ntpserviceid = 'NIST public modem'; + } else if (substr($refid, 0, 3) === 'TSP') { + $ntpserviceid = 'TSP time protocol'; + } else if (substr($refid, 0, 3) === 'DTS') { + $ntpserviceid = 'Digital Time Service'; + } + break; + + case 1: + if (substr($refid, 0, 4) === 'ATOM') { + $ntpserviceid = 'Atomic Clock (calibrated)'; + } else if (substr($refid, 0, 3) === 'VLF') { + $ntpserviceid = 'VLF radio'; + } else if ($refid === 'CALLSIGN') { + $ntpserviceid = 'Generic radio'; + } else if (substr($refid, 0, 4) === 'LORC') { + $ntpserviceid = 'LORAN-C radionavigation'; + } else if (substr($refid, 0, 4) === 'GOES') { + $ntpserviceid = 'GOES UHF environment satellite'; + } else if (substr($refid, 0, 3) === 'GPS') { + $ntpserviceid = 'GPS UHF satellite positioning'; + } + break; + + default: + $ntpserviceid = ord(substr($binary['referenceid'], 0, 1)); + $ntpserviceid .= '.'; + $ntpserviceid .= ord(substr($binary['referenceid'], 1, 1)); + $ntpserviceid .= '.'; + $ntpserviceid .= ord(substr($binary['referenceid'], 2, 1)); + $ntpserviceid .= '.'; + $ntpserviceid .= ord(substr($binary['referenceid'], 3, 1)); + break; + } + + $this->_info['ntpid'] = $ntpserviceid; + + /* + * Stratum + * + * Indicates the stratum level of the local clock + */ + switch($binary['stratum']) { + case 0: + $this->_info['stratum'] = 'undefined'; + break; + + case 1: + $this->_info['stratum'] = 'primary reference'; + break; + + default: + $this->_info['stratum'] = 'secondary reference'; + break; + } + + /* + * Indicates the total roundtrip delay to the primary reference source at the + * root of the synchronization subnet, in seconds. + * + * Both positive and negative values, depending on clock precision and skew, are + * possible. + */ + $this->_info['rootdelay'] = $binary['rootdelay'] >> 15; + $this->_info['rootdelayfrac'] = ($binary['rootdelay'] << 17) >> 17; + + /* + * Indicates the maximum error relative to the primary reference source at the + * root of the synchronization subnet, in seconds. + * + * Only positive values greater than zero are possible. + */ + $this->_info['rootdispersion'] = $binary['rootdispersion'] >> 15; + $this->_info['rootdispersionfrac'] = ($binary['rootdispersion'] << 17) >> 17; + + /* + * The local time, in timestamp format, at the peer + * when its latest NTP message was sent. + */ + $original = (float) $binary['originatestamp']; + $original += (float) ($binary['originatemicro'] / 4294967296); + + /* + * The local time, in timestamp format, when the latest + * NTP message from the peer arrived. + */ + $received = (float) $binary['receivestamp']; + $received += (float) ($binary['receivemicro'] / 4294967296); + + /* + * The local time, in timestamp format, at which the + * NTP message departed the sender. + */ + $transmit = (float) $binary['transmitstamp']; + $transmit += (float) ($binary['transmitmicro'] / 4294967296); + + /* + * The roundtrip delay of the peer clock relative to the local clock + * over the network path between them, in seconds. + * + * Note that this variable can take on both positive and negative values, + * depending on clock precision and skew-error accumulation. + */ + $roundtrip = ($binary['clientreceived'] - $original); + $roundtrip -= ($transmit - $received); + $this->_info['roundtrip'] = ($roundtrip / 2); + + // The offset of the peer clock relative to the local clock, in seconds. + $offset = ($received - $original + $transmit - $binary['clientreceived']); + $this->_info['offset'] = ($offset / 2); + + $time = (time() - $this->_info['offset']); + + return $time; + } +} diff --git a/lib/zend/Zend/TimeSync/Protocol.php b/lib/zend/Zend/TimeSync/Protocol.php new file mode 100644 index 0000000000..cbb9765db5 --- /dev/null +++ b/lib/zend/Zend/TimeSync/Protocol.php @@ -0,0 +1,148 @@ +_timeserver, $this->_port, $errno, $errstr, + Zend_TimeSync::$options['timeout']); + if ($socket === false) { + throw new Zend_TimeSync_Exception('could not connect to ' . + "'$this->_timeserver' on port '$this->_port', reason: '$errstr'"); + } + + $this->_socket = $socket; + } + + /** + * Disconnects from the peer, closes the socket. + * + * @return void + */ + protected function _disconnect() + { + @fclose($this->_socket); + $this->_socket = null; + } + + /** + * Return information sent/returned from the timeserver + * + * @return array + */ + public function getInfo() + { + if (empty($this->_info) === true) { + $this->_write($this->_prepare()); + $timestamp = $this->_extract($this->_read()); + } + + return $this->_info; + } + + /** + * Query this timeserver without using the fallback mechanism + * + * @param string|Zend_Locale $locale (Optional) Locale + * @return Zend_Date + */ + public function getDate($locale = null) + { + $this->_write($this->_prepare()); + $timestamp = $this->_extract($this->_read()); + + $date = new Zend_Date($this, null, $locale); + return $date; + } +} diff --git a/lib/zend/Zend/TimeSync/Sntp.php b/lib/zend/Zend/TimeSync/Sntp.php new file mode 100644 index 0000000000..6c0884fdf7 --- /dev/null +++ b/lib/zend/Zend/TimeSync/Sntp.php @@ -0,0 +1,119 @@ +_timeserver = 'udp://' . $timeserver; + if ($port !== null) { + $this->_port = $port; + } + } + + /** + * Prepares the data that will be send to the timeserver + * + * @return array + */ + protected function _prepare() + { + return "\n"; + } + + /** + * Reads the data returned from the timeserver + * + * @return string + */ + protected function _read() + { + $result = fread($this->_socket, 49); + $this->_delay = (($this->_delay - time()) / 2); + + return $result; + } + + /** + * Writes data to to the timeserver + * + * @param string $data Data to write to the timeserver + * @return void + */ + protected function _write($data) + { + $this->_connect(); + $this->_delay = time(); + fputs($this->_socket, $data); + } + + /** + * Extracts the data returned from the timeserver + * + * @param string $result Data to extract + * @return integer + */ + protected function _extract($result) + { + $dec = hexdec('7fffffff'); + $time = abs(($dec - hexdec(bin2hex($result))) - $dec); + $time -= 2208988800; + // Socket delay + $time -= $this->_delay; + + $this->_info['offset'] = $this->_delay; + + return $time; + } +} diff --git a/lib/zend/Zend/Tool/Framework/Action/Base.php b/lib/zend/Zend/Tool/Framework/Action/Base.php new file mode 100644 index 0000000000..3a5d7aeb87 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Action/Base.php @@ -0,0 +1,95 @@ +setName($options); + } + // implement $options here in the future if this is needed + } + } + + /** + * setName() + * + * @param string $name + * @return Zend_Tool_Framework_Action_Base + */ + public function setName($name) + { + $this->_name = $name; + return $this; + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + if ($this->_name == null) { + $this->_name = $this->_parseName(); + } + return $this->_name; + } + + /** + * _parseName - internal method to determine the name of an action when one is not explicity provided. + * + * @param Zend_Tool_Framework_Action_Interface $action + * @return string + */ + protected function _parseName() + { + $className = get_class($this); + $actionName = substr($className, strrpos($className, '_')+1); + return $actionName; + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Action/Exception.php b/lib/zend/Zend/Tool/Framework/Action/Exception.php new file mode 100644 index 0000000000..b189435618 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Action/Exception.php @@ -0,0 +1,37 @@ +_registry = $registry; + } + + /** + * addAction() + * + * @param Zend_Tool_Framework_Action_Interface $action + * @return Zend_Tool_Framework_Action_Repository + */ + public function addAction(Zend_Tool_Framework_Action_Interface $action, $overrideExistingAction = false) + { + $actionName = $action->getName(); + + if ($actionName == '' || $actionName == 'Base') { + require_once 'Zend/Tool/Framework/Action/Exception.php'; + throw new Zend_Tool_Framework_Action_Exception('An action name for the provided action could not be determined.'); + } + + if (!$overrideExistingAction && array_key_exists(strtolower($actionName), $this->_actions)) { + require_once 'Zend/Tool/Framework/Action/Exception.php'; + throw new Zend_Tool_Framework_Action_Exception('An action by the name ' . $actionName + . ' is already registered and $overrideExistingAction is set to false.'); + } + + $this->_actions[strtolower($actionName)] = $action; + return $this; + } + + /** + * process() - this is called when the client is done constructing (after init()) + * + * @return unknown + */ + public function process() + { + return null; + } + + /** + * getActions() - get all actions in the repository + * + * @return array + */ + public function getActions() + { + return $this->_actions; + } + + /** + * getAction() - get an action by a specific name + * + * @param string $actionName + * @return Zend_Tool_Framework_Action_Interface + */ + public function getAction($actionName) + { + if (!array_key_exists(strtolower($actionName), $this->_actions)) { + return null; + } + + return $this->_actions[strtolower($actionName)]; + } + + /** + * count() required by the Countable interface + * + * @return int + */ + public function count() + { + return count($this->_actions); + } + + /** + * getIterator() - get all actions, this supports the IteratorAggregate interface + * + * @return array + */ + public function getIterator() + { + return new ArrayIterator($this->_actions); + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Abstract.php b/lib/zend/Zend/Tool/Framework/Client/Abstract.php new file mode 100644 index 0000000000..8a475e6950 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Abstract.php @@ -0,0 +1,317 @@ +setOptions($options); + } + } + + public function setOptions(Array $options) + { + foreach ($options as $optionName => $optionValue) { + $setMethodName = 'set' . $optionName; + if (method_exists($this, $setMethodName)) { + $this->{$setMethodName}($optionValue); + } + } + } + + /** + * getName() - Return the client name which can be used to + * query the manifest if need be. + * + * @return string The client name + */ + abstract public function getName(); + + /** + * initialized() - This will initialize the client for use + * + */ + public function initialize() + { + // if its already initialized, no need to initialize again + if ($this->_isInitialized) { + return; + } + + // this might look goofy, but this is setting up the + // registry for dependency injection into the client + $registry = new Zend_Tool_Framework_Registry(); + $registry->setClient($this); + + // NOTE: at this moment, $this->_registry should contain + // the registry object + + // run any preInit + $this->_preInit(); + + // setup the debug log + if (!$this->_debugLogger instanceof Zend_Log) { + require_once 'Zend/Log.php'; + require_once 'Zend/Log/Writer/Null.php'; + $this->_debugLogger = new Zend_Log(new Zend_Log_Writer_Null()); + } + + // let the loader load, then the repositories process whats been loaded + $this->_registry->getLoader()->load(); + + // process the action repository + $this->_registry->getActionRepository()->process(); + + // process the provider repository + $this->_registry->getProviderRepository()->process(); + + // process the manifest repository + $this->_registry->getManifestRepository()->process(); + + if ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface) { + require_once 'Zend/Tool/Framework/Client/Interactive/InputHandler.php'; + } + + if ($this instanceof Zend_Tool_Framework_Client_Interactive_OutputInterface) { + $this->_registry->getResponse()->setContentCallback(array($this, 'handleInteractiveOutput')); + } + + } + + + /** + * This method should be implemented by the client implementation to + * construct and set custom inflectors, request and response objects. + */ + protected function _preInit() + { + } + + /** + * This method *must* be implemented by the client implementation to + * parse out and setup the request objects action, provider and parameter + * information. + */ + abstract protected function _preDispatch(); + + /** + * This method should be implemented by the client implementation to + * take the output of the response object and return it (in an client + * specific way) back to the Tooling Client. + */ + protected function _postDispatch() + { + } + + /** + * setRegistry() - Required by the Zend_Tool_Framework_Registry_EnabledInterface + * interface which ensures proper registry dependency resolution + * + * @param Zend_Tool_Framework_Registry_Interface $registry + * @return Zend_Tool_Framework_Client_Abstract + */ + public function setRegistry(Zend_Tool_Framework_Registry_Interface $registry) + { + $this->_registry = $registry; + return $this; + } + + /** + * hasInteractiveInput() - Convienence method for determining if this + * client can handle interactive input, and thus be able to run the + * promptInteractiveInput + * + * @return bool + */ + public function hasInteractiveInput() + { + return ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface); + } + + public function promptInteractiveInput($inputRequest) + { + if (!$this->hasInteractiveInput()) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('promptInteractive() cannot be called on a non-interactive client.'); + } + + $inputHandler = new Zend_Tool_Framework_Client_Interactive_InputHandler(); + $inputHandler->setClient($this); + $inputHandler->setInputRequest($inputRequest); + return $inputHandler->handle(); + + } + + /** + * This method should be called in order to "handle" a Tooling Client + * request that has come to the client that has been implemented. + */ + public function dispatch() + { + $this->initialize(); + + try { + + $this->_preDispatch(); + + if ($this->_registry->getRequest()->isDispatchable()) { + + if ($this->_registry->getRequest()->getActionName() == null) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('Client failed to setup the action name.'); + } + + if ($this->_registry->getRequest()->getProviderName() == null) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('Client failed to setup the provider name.'); + } + + $this->_handleDispatch(); + + } + + } catch (Exception $exception) { + $this->_registry->getResponse()->setException($exception); + } + + $this->_postDispatch(); + } + + public function convertToClientNaming($string) + { + return $string; + } + + public function convertFromClientNaming($string) + { + return $string; + } + + protected function _handleDispatch() + { + // get the provider repository + $providerRepository = $this->_registry->getProviderRepository(); + + $request = $this->_registry->getRequest(); + + // get the dispatchable provider signature + $providerSignature = $providerRepository->getProviderSignature($request->getProviderName()); + + // get the actual provider + $provider = $providerSignature->getProvider(); + + // ensure that we can pretend if this is a pretend request + if ($request->isPretend() && (!$provider instanceof Zend_Tool_Framework_Provider_Pretendable)) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('Dispatcher error - provider does not support pretend'); + } + + // get the action name + $actionName = $this->_registry->getRequest()->getActionName(); + + if (!$actionableMethod = $providerSignature->getActionableMethodByActionName($actionName)) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('Dispatcher error - actionable method not found'); + } + + // get the actual method and param information + $methodName = $actionableMethod['methodName']; + $methodParameters = $actionableMethod['parameterInfo']; + + // get the provider params + $requestParameters = $this->_registry->getRequest()->getProviderParameters(); + + // @todo This seems hackish, determine if there is a better way + $callParameters = array(); + foreach ($methodParameters as $methodParameterName => $methodParameterValue) { + if (!array_key_exists($methodParameterName, $requestParameters) && $methodParameterValue['optional'] == false) { + if ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface) { + $promptSting = $this->getMissingParameterPromptString($provider, $actionableMethod['action'], $methodParameterValue['name']); + $parameterPromptValue = $this->promptInteractiveInput($promptSting)->getContent(); + if ($parameterPromptValue == null) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('Value supplied for required parameter "' . $methodParameterValue['name'] . '" is empty'); + } + $callParameters[] = $parameterPromptValue; + } else { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('A required parameter "' . $methodParameterValue['name'] . '" was not supplied.'); + } + } else { + $callParameters[] = (array_key_exists($methodParameterName, $requestParameters)) ? $requestParameters[$methodParameterName] : $methodParameterValue['default']; + } + } + + if (($specialtyName = $this->_registry->getRequest()->getSpecialtyName()) != '_Global') { + $methodName .= $specialtyName; + } + + if (method_exists($provider, $methodName)) { + call_user_func_array(array($provider, $methodName), $callParameters); + } elseif (method_exists($provider, $methodName . 'Action')) { + call_user_func_array(array($provider, $methodName . 'Action'), $callParameters); + } else { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('Not a supported method.'); + } + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Config.php b/lib/zend/Zend/Tool/Framework/Client/Config.php new file mode 100644 index 0000000000..4e8ca851ac --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Config.php @@ -0,0 +1,105 @@ +setOptions($options); + } + } + + public function setOptions(Array $options) + { + foreach ($options as $optionName => $optionValue) { + $setMethodName = 'set' . $optionName; + if (method_exists($this, $setMethodName)) { + $this->{$setMethodName}($optionValue); + } + } + } + + public function setConfigFilepath($configFilepath) + { + if (!file_exists($configFilepath)) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('Provided path to config ' . $configFilepath . ' does not exist'); + } + + $this->_configFilepath = $configFilepath; + + $suffix = substr($configFilepath, -4); + + switch ($suffix) { + case '.ini': + require_once 'Zend/Config/Ini.php'; + $this->_config = new Zend_Config_Ini($configFilepath); + break; + case '.xml': + require_once 'Zend/Config/Xml.php'; + $this->_config = new Zend_Config_Xml($configFilepath); + break; + case '.php': + require_once 'Zend/Config.php'; + $this->_config = new Zend_Config(include $configFilepath); + break; + default: + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('Unknown config file type ' + . $suffix . ' at location ' . $configFilepath + ); + } + + return $this; + } + + public function getConfigFilepath() + { + return $this->_configFilepath; + } + + public function get($name, $defaultValue) + { + return $this->_config->get($name, $defaultValue); + } + + public function __get($name) + { + return $this->_config->{$name}; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Framework/Client/Console.php b/lib/zend/Zend/Tool/Framework/Client/Console.php new file mode 100644 index 0000000000..3b94c6a344 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Console.php @@ -0,0 +1,294 @@ +dispatch(); + } + + public function setConfigOptions($configOptions) + { + $this->_configOptions = $configOptions; + return $this; + } + + public function setStorageOptions($storageOptions) + { + $this->_storageOptions = $storageOptions; + return $this; + } + + /** + * getName() - return the name of the client, in this case 'console' + * + * @return string + */ + public function getName() + { + return 'console'; + } + + /** + * _init() - Tasks processed before the constructor, generally setting up objects to use + * + */ + protected function _preInit() + { + $config = $this->_registry->getConfig(); + + if ($this->_configOptions != null) { + $config->setOptions($this->_configOptions); + } + + $storage = $this->_registry->getStorage(); + + if ($this->_storageOptions != null && isset($this->_storageOptions['directory'])) { + require_once 'Zend/Tool/Framework/Client/Storage/Directory.php'; + $storage->setAdapter( + new Zend_Tool_Framework_Client_Storage_Directory($this->_storageOptions['directory']) + ); + } + + // support the changing of the current working directory, necessary for some providers + if (isset($_ENV['ZEND_TOOL_CURRENT_WORKING_DIRECTORY'])) { + chdir($_ENV['ZEND_TOOL_CURRENT_WORKING_DIRECTORY']); + } + + // support setting the loader from the environment + if (isset($_ENV['ZEND_TOOL_FRAMEWORK_LOADER_CLASS'])) { + if (class_exists($_ENV['ZEND_TOOL_FRAMEWORK_LOADER_CLASS']) + || Zend_Loader::loadClass($_ENV['ZEND_TOOL_FRAMEWORK_LOADER_CLASS']) + ) { + $this->_registry->setLoader(new $_ENV['ZEND_TOOL_FRAMEWORK_LOADER_CLASS']); + } + } + + return; + } + + /** + * _preDispatch() - Tasks handed after initialization but before dispatching + * + */ + protected function _preDispatch() + { + $response = $this->_registry->getResponse(); + + if (function_exists('posix_isatty')) { + require_once 'Zend/Tool/Framework/Client/Console/ResponseDecorator/Colorizer.php'; + $response->addContentDecorator(new Zend_Tool_Framework_Client_Console_ResponseDecorator_Colorizer()); + } + + $response->addContentDecorator(new Zend_Tool_Framework_Client_Response_ContentDecorator_Separator()) + ->setDefaultDecoratorOptions(array('separator' => true)); + + $optParser = new Zend_Tool_Framework_Client_Console_ArgumentParser(); + $optParser->setArguments($_SERVER['argv']) + ->setRegistry($this->_registry) + ->parse(); + + return; + } + + /** + * _postDispatch() - Tasks handled after dispatching + * + */ + protected function _postDispatch() + { + $request = $this->_registry->getRequest(); + $response = $this->_registry->getResponse(); + + if ($response->isException()) { + require_once 'Zend/Tool/Framework/Client/Console/HelpSystem.php'; + $helpSystem = new Zend_Tool_Framework_Client_Console_HelpSystem(); + $helpSystem->setRegistry($this->_registry) + ->respondWithErrorMessage($response->getException()->getMessage(), $response->getException()) + ->respondWithSpecialtyAndParamHelp( + $request->getProviderName(), + $request->getActionName() + ); + } + + echo PHP_EOL; + return; + } + + /** + * handleInteractiveInputRequest() is required by the Interactive InputInterface + * + * + * @param Zend_Tool_Framework_Client_Interactive_InputRequest $inputRequest + * @return string + */ + public function handleInteractiveInputRequest(Zend_Tool_Framework_Client_Interactive_InputRequest $inputRequest) + { + fwrite(STDOUT, $inputRequest->getContent() . PHP_EOL . 'zf> '); + $inputContent = fgets(STDIN); + return rtrim($inputContent); // remove the return from the end of the string + } + + /** + * handleInteractiveOutput() is required by the Interactive OutputInterface + * + * This allows us to display output immediately from providers, rather + * than displaying it after the provider is done. + * + * @param string $output + */ + public function handleInteractiveOutput($output) + { + echo $output; + } + + /** + * getMissingParameterPromptString() + * + * @param Zend_Tool_Framework_Provider_Interface $provider + * @param Zend_Tool_Framework_Action_Interface $actionInterface + * @param string $missingParameterName + * @return string + */ + public function getMissingParameterPromptString(Zend_Tool_Framework_Provider_Interface $provider, Zend_Tool_Framework_Action_Interface $actionInterface, $missingParameterName) + { + return 'Please provide a value for $' . $missingParameterName; + } + + + /** + * convertToClientNaming() + * + * Convert words to client specific naming, in this case is lower, dash separated + * + * Filters are lazy-loaded. + * + * @param string $string + * @return string + */ + public function convertToClientNaming($string) + { + if (!$this->_filterToClientNaming) { + require_once 'Zend/Filter.php'; + require_once 'Zend/Filter/Word/CamelCaseToDash.php'; + require_once 'Zend/Filter/StringToLower.php'; + $filter = new Zend_Filter(); + $filter->addFilter(new Zend_Filter_Word_CamelCaseToDash()); + $filter->addFilter(new Zend_Filter_StringToLower()); + + $this->_filterToClientNaming = $filter; + } + + return $this->_filterToClientNaming->filter($string); + } + + /** + * convertFromClientNaming() + * + * Convert words from client specific naming to code naming - camelcased + * + * Filters are lazy-loaded. + * + * @param string $string + * @return string + */ + public function convertFromClientNaming($string) + { + if (!$this->_filterFromClientNaming) { + require_once 'Zend/Filter/Word/DashToCamelCase.php'; + $this->_filterFromClientNaming = new Zend_Filter_Word_DashToCamelCase(); + } + + return $this->_filterFromClientNaming->filter($string); + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Console/ArgumentParser.php b/lib/zend/Zend/Tool/Framework/Client/Console/ArgumentParser.php new file mode 100644 index 0000000000..51efbbb05a --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Console/ArgumentParser.php @@ -0,0 +1,503 @@ +_argumentsOriginal = $this->_argumentsWorking = $arguments; + return $this; + } + + /** + * setRegistry() + * + * @param Zend_Tool_Framework_Registry_Interface $registry + * @return Zend_Tool_Framework_Client_Console_ArgumentParser + */ + public function setRegistry(Zend_Tool_Framework_Registry_Interface $registry) + { + // get the client registry + $this->_registry = $registry; + + // set manifest repository, request, response for easy access + $this->_manifestRepository = $this->_registry->getManifestRepository(); + $this->_request = $this->_registry->getRequest(); + $this->_response = $this->_registry->getResponse(); + return $this; + } + + /** + * Parse() - This method does the work of parsing the arguments into the enpooint request, + * this will also (during help operations) fill the response in with information as needed + * + * @return null + */ + public function parse() + { + + if ($this->_request == null || $this->_response == null) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('The client registry must have both a request and response registered.'); + } + + // setup the help options + $helpResponseOptions = array(); + + // check to see if the first cli arg is the script name + if ($this->_argumentsWorking[0] == $_SERVER['SCRIPT_NAME' ]) { + array_shift($this->_argumentsWorking); + } + + // process global options + try { + $this->_parseGlobalPart(); + } catch (Zend_Tool_Framework_Client_Exception $exception) { + $this->_createHelpResponse(array('error' => $exception->getMessage())); + return; + } + + // ensure there are arguments left + if (count($this->_argumentsWorking) == 0) { + $this->_request->setDispatchable(false); // at this point request is not dispatchable + + // check to see if this was a help request + if ($this->_help) { + $this->_createHelpResponse(); + } else { + $this->_createHelpResponse(array('error' => 'An action and provider is required.')); + } + return; + } + + // process the action part of the command line + try { + $this->_parseActionPart(); + } catch (Zend_Tool_Framework_Client_Exception $exception) { + $this->_request->setDispatchable(false); + $this->_createHelpResponse(array('error' => $exception->getMessage())); + return; + } + + if ($this->_helpKnownAction) { + $helpResponseOptions = array_merge( + $helpResponseOptions, + array('actionName' => $this->_request->getActionName()) + ); + } + + /* @TODO Action Parameter Requirements */ + + // make sure there are more "words" on the command line + if (count($this->_argumentsWorking) == 0) { + $this->_request->setDispatchable(false); // at this point request is not dispatchable + + // check to see if this is a help request + if ($this->_help) { + $this->_createHelpResponse($helpResponseOptions); + } else { + $this->_createHelpResponse(array_merge($helpResponseOptions, array('error' => 'A provider is required.'))); + } + return; + } + + + // process the provider part of the command line + try { + $this->_parseProviderPart(); + } catch (Zend_Tool_Framework_Client_Exception $exception) { + $this->_request->setDispatchable(false); + $this->_createHelpResponse(array('error' => $exception->getMessage())); + return; + } + + if ($this->_helpKnownProvider) { + $helpResponseOptions = array_merge( + $helpResponseOptions, + array('providerName' => $this->_request->getProviderName()) + ); + } + + if ($this->_helpKnownSpecialty) { + $helpResponseOptions = array_merge( + $helpResponseOptions, + array('specialtyName' => $this->_request->getSpecialtyName()) + ); + } + + // if there are arguments on the command line, lets process them as provider options + if (count($this->_argumentsWorking) != 0) { + $this->_parseProviderOptionsPart(); + } + + // if there is still arguments lingering around, we can assume something is wrong + if (count($this->_argumentsWorking) != 0) { + $this->_request->setDispatchable(false); // at this point request is not dispatchable + if ($this->_help) { + $this->_createHelpResponse($helpResponseOptions); + } else { + $this->_createHelpResponse(array_merge( + $helpResponseOptions, + array('error' => 'Unknown arguments left on the command line: ' . implode(' ', $this->_argumentsWorking)) + )); + } + return; + } + + // everything was processed and this is a request for help information + if ($this->_help) { + $this->_request->setDispatchable(false); // at this point request is not dispatchable + $this->_createHelpResponse($helpResponseOptions); + } + + return; + } + + /** + * Internal routine for parsing global options from the command line + * + * @return null + */ + protected function _parseGlobalPart() + { + $getoptOptions = array(); + $getoptOptions['help|h'] = 'HELP'; + $getoptOptions['verbose|v'] = 'VERBOSE'; + $getoptOptions['pretend|p'] = 'PRETEND'; + $getoptOptions['debug|d'] = 'DEBUG'; + $getoptParser = new Zend_Console_Getopt($getoptOptions, $this->_argumentsWorking, array('parseAll' => false)); + + // @todo catch any exceptions here + $getoptParser->parse(); + + foreach ($getoptParser->getOptions() as $option) { + if ($option == 'pretend') { + $this->_request->setPretend(true); + } elseif ($option == 'debug') { + $this->_request->setDebug(true); + } elseif ($option == 'verbose') { + $this->_request->setVerbose(true); + } else { + $property = '_'.$option; + $this->{$property} = true; + } + } + + $this->_argumentsWorking = $getoptParser->getRemainingArgs(); + + return; + } + + /** + * Internal routine for parsing the action name from the arguments + * + * @return null + */ + protected function _parseActionPart() + { + // the next "word" should be the action name + $consoleActionName = array_shift($this->_argumentsWorking); + + if ($consoleActionName == '?') { + $this->_help = true; + return; + } + + // is the action name valid? + $actionMetadata = $this->_manifestRepository->getMetadata(array( + 'type' => 'Tool', + 'name' => 'actionName', + 'value' => $consoleActionName, + 'clientName' => 'console' + )); + + // if no action, handle error + if (!$actionMetadata) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('Action \'' . $consoleActionName . '\' is not a valid action.'); + } + + // prepare action request name + $this->_helpKnownAction = true; + $this->_request->setActionName($actionMetadata->getActionName()); + return; + } + + /** + * Internal routine for parsing the provider part of the command line arguments + * + * @return null + */ + protected function _parseProviderPart() + { + // get the cli "word" as the provider name from command line + $consoleProviderFull = array_shift($this->_argumentsWorking); + $consoleSpecialtyName = '_global'; + + // if there is notation for specialties? If so, break them up + if (strstr($consoleProviderFull, '.')) { + list($consoleProviderName, $consoleSpecialtyName) = explode('.', $consoleProviderFull); + } else { + $consoleProviderName = $consoleProviderFull; + } + + if ($consoleProviderName == '?') { + $this->_help = true; + return; + } + + // get the cli provider names from the manifest + $providerMetadata = $this->_manifestRepository->getMetadata(array( + 'type' => 'Tool', + 'name' => 'providerName', + 'value' => $consoleProviderName, + 'clientName' => 'console' + )); + + if (!$providerMetadata) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception( + 'Provider \'' . $consoleProviderFull . '\' is not a valid provider.' + ); + } + + $this->_helpKnownProvider = true; + $this->_request->setProviderName($providerMetadata->getProviderName()); + + if ($consoleSpecialtyName == '?') { + $this->_help = true; + return; + } + + $providerSpecialtyMetadata = $this->_manifestRepository->getMetadata(array( + 'type' => 'Tool', + 'name' => 'specialtyName', + 'value' => $consoleSpecialtyName, + 'providerName' => $providerMetadata->getProviderName(), + 'clientName' => 'console' + )); + + if (!$providerSpecialtyMetadata) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception( + 'Provider \'' . $consoleSpecialtyName . '\' is not a valid specialty.' + ); + } + + $this->_helpKnownSpecialty = true; + $this->_request->setSpecialtyName($providerSpecialtyMetadata->getSpecialtyName()); + return; + } + + /** + * Internal routine for parsing the provider options from the command line + * + * @return null + */ + protected function _parseProviderOptionsPart() + { + if (current($this->_argumentsWorking) == '?') { + $this->_help = true; + return; + } + + $searchParams = array( + 'type' => 'Tool', + 'providerName' => $this->_request->getProviderName(), + 'actionName' => $this->_request->getActionName(), + 'specialtyName' => $this->_request->getSpecialtyName(), + 'clientName' => 'console' + ); + + $actionableMethodLongParamsMetadata = $this->_manifestRepository->getMetadata( + array_merge($searchParams, array('name' => 'actionableMethodLongParams')) + ); + + $actionableMethodShortParamsMetadata = $this->_manifestRepository->getMetadata( + array_merge($searchParams, array('name' => 'actionableMethodShortParams')) + ); + + $paramNameShortValues = $actionableMethodShortParamsMetadata->getValue(); + + $getoptOptions = array(); + $wordArguments = array(); + $longParamCanonicalNames = array(); + + $actionableMethodLongParamsMetadataReference = $actionableMethodLongParamsMetadata->getReference(); + foreach ($actionableMethodLongParamsMetadata->getValue() as $parameterNameLong => $consoleParameterNameLong) { + $optionConfig = $consoleParameterNameLong . '|'; + + $parameterInfo = $actionableMethodLongParamsMetadataReference['parameterInfo'][$parameterNameLong]; + + // process ParameterInfo into array for command line option matching + if ($parameterInfo['type'] == 'string' || $parameterInfo['type'] == 'bool') { + $optionConfig .= $paramNameShortValues[$parameterNameLong] + . (($parameterInfo['optional']) ? '-' : '=') . 's'; + } elseif (in_array($parameterInfo['type'], array('int', 'integer', 'float'))) { + $optionConfig .= $paramNameShortValues[$parameterNameLong] + . (($parameterInfo['optional']) ? '-' : '=') . 'i'; + } else { + $optionConfig .= $paramNameShortValues[$parameterNameLong] . '-s'; + } + + $getoptOptions[$optionConfig] = ($parameterInfo['description'] != '') ? $parameterInfo['description'] : 'No description available.'; + + + // process ParameterInfo into array for command line WORD (argument) matching + $wordArguments[$parameterInfo['position']]['parameterName'] = $parameterInfo['name']; + $wordArguments[$parameterInfo['position']]['optional'] = $parameterInfo['optional']; + $wordArguments[$parameterInfo['position']]['type'] = $parameterInfo['type']; + + // keep a translation of console to canonical names + $longParamCanonicalNames[$consoleParameterNameLong] = $parameterNameLong; + } + + + if (!$getoptOptions) { + // no options to parse here, return + return; + } + + // if non-option arguments exist, attempt to process them before processing options + $wordStack = array(); + while ($wordOnTop = array_shift($this->_argumentsWorking)) { + if (substr($wordOnTop, 0, 1) != '-') { + array_push($wordStack, $wordOnTop); + } else { + // put word back on stack and move on + array_unshift($this->_argumentsWorking, $wordOnTop); + break; + } + + if (count($wordStack) == count($wordArguments)) { + // when we get at most the number of arguments we are expecting + // then break out. + break; + } + + } + + if ($wordStack && $wordArguments) { + for ($wordIndex = 1; $wordIndex <= count($wordArguments); $wordIndex++) { + if (!array_key_exists($wordIndex-1, $wordStack) || !array_key_exists($wordIndex, $wordArguments)) { + break; + } + $this->_request->setProviderParameter($wordArguments[$wordIndex]['parameterName'], $wordStack[$wordIndex-1]); + unset($wordStack[$wordIndex-1]); + } + } + + $getoptParser = new Zend_Console_Getopt($getoptOptions, $this->_argumentsWorking, array('parseAll' => false)); + $getoptParser->parse(); + foreach ($getoptParser->getOptions() as $option) { + $value = $getoptParser->getOption($option); + $providerParamOption = $longParamCanonicalNames[$option]; + $this->_request->setProviderParameter($providerParamOption, $value); + } + + /* + $this->_metadataProviderOptionsLong = $actionableMethodLongParamsMetadata; + $this->_metadataProviderOptionsShort = $actionableMethodShortParamsMetadata; + */ + + $this->_argumentsWorking = $getoptParser->getRemainingArgs(); + + return; + } + + /** + * _createHelpResponse + * + * @param unknown_type $options + */ + protected function _createHelpResponse($options = array()) + { + require_once 'Zend/Tool/Framework/Client/Console/HelpSystem.php'; + $helpSystem = new Zend_Tool_Framework_Client_Console_HelpSystem(); + $helpSystem->setRegistry($this->_registry); + + if (isset($options['error'])) { + $helpSystem->respondWithErrorMessage($options['error']); + } + + if (isset($options['actionName']) && isset($options['providerName'])) { + $helpSystem->respondWithSpecialtyAndParamHelp($options['providerName'], $options['actionName']); + } elseif (isset($options['actionName'])) { + $helpSystem->respondWithActionHelp($options['actionName']); + } elseif (isset($options['providerName'])) { + $helpSystem->respondWithProviderHelp($options['providerName']); + } else { + $helpSystem->respondWithGeneralHelp(); + } + + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Console/HelpSystem.php b/lib/zend/Zend/Tool/Framework/Client/Console/HelpSystem.php new file mode 100644 index 0000000000..44e1415f94 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Console/HelpSystem.php @@ -0,0 +1,375 @@ +_registry = $registry; + $this->_response = $registry->getResponse(); + return $this; + } + + /** + * respondWithErrorMessage() + * + * @param string $errorMessage + * @param Exception $exception + */ + public function respondWithErrorMessage($errorMessage, Exception $exception = null) + { + // break apart the message into wrapped chunks + $errorMessages = explode(PHP_EOL, wordwrap($errorMessage, 70, PHP_EOL, false)); + + $text = ' An Error Has Occurred '; + $this->_response->appendContent($text, array('color' => array('hiWhite', 'bgRed'))); + + foreach ($errorMessages as $errorMessage) { + $errorMessage = sprintf('%-70s', $errorMessage); + $this->_response->appendContent(' ' . $errorMessage . ' ', array('color' => array('white', 'bgRed'))); + } + + if ($exception && $this->_registry->getRequest()->isDebug()) { + $this->_response->appendContent($exception->getTraceAsString()); + } + + $this->_response->appendContent(null, array('separator' => true)); + return $this; + } + + /** + * respondWithGeneralHelp() + * + * @return Zend_Tool_Framework_Client_Console_HelpSystem + */ + public function respondWithGeneralHelp() + { + $this->_respondWithHeader(); + + $noSeparator = array('separator' => false); + + $this->_response->appendContent('Usage:', array('color' => 'green')) + ->appendContent(' ', $noSeparator) + ->appendContent('zf', array_merge(array('color' => 'cyan'), $noSeparator)) + ->appendContent(' [--global-opts]', $noSeparator) + ->appendContent(' action-name', array_merge(array('color' => 'cyan'), $noSeparator)) + ->appendContent(' [--action-opts]', $noSeparator) + ->appendContent(' provider-name', array_merge(array('color' => 'cyan'), $noSeparator)) + ->appendContent(' [--provider-opts]', $noSeparator) + ->appendContent(' [provider parameters ...]') + ->appendContent(' Note: You may use "?" in any place of the above usage string to ask for more specific help information.', array('color'=>'yellow')) + ->appendContent(' Example: "zf ? version" will list all available actions for the version provider.', array('color'=>'yellow', 'separator' => 2)) + ->appendContent('Providers and their actions:', array('color' => 'green')); + + $this->_respondWithSystemInformation(); + return $this; + } + + /** + * respondWithActionHelp() + * + * @param string $actionName + * @return Zend_Tool_Framework_Client_Console_HelpSystem + */ + public function respondWithActionHelp($actionName) + { + $this->_respondWithHeader(); + $this->_response->appendContent('Providers that support the action "' . $actionName . '"', array('color' => 'green')); + $this->_respondWithSystemInformation(null, $actionName); + return $this; + } + + /** + * respondWithSpecialtyAndParamHelp() + * + * @param string $providerName + * @param string $actionName + * @return Zend_Tool_Framework_Client_Console_HelpSystem + */ + public function respondWithSpecialtyAndParamHelp($providerName, $actionName) + { + $this->_respondWithHeader(); + $this->_response->appendContent( + 'Details for action "' . $actionName . '" and provider "' . $providerName . '"', + array('color' => 'green') + ); + $this->_respondWithSystemInformation($providerName, $actionName, true); + return $this; + } + + /** + * respondWithProviderHelp() + * + * @param string $providerName + * @return Zend_Tool_Framework_Client_Console_HelpSystem + */ + public function respondWithProviderHelp($providerName) + { + $this->_respondWithHeader(); + $this->_response->appendContent('Actions supported by provider "' . $providerName . '"', array('color' => 'green')); + $this->_respondWithSystemInformation($providerName); + return $this; + } + + /** + * _respondWithHeader() + * + * @return Zend_Tool_Framework_Client_Console_HelpSystem + */ + protected function _respondWithHeader() + { + /** + * @see Zend_Version + */ + require_once 'Zend/Version.php'; + $this->_response->appendContent('Zend Framework', array('color' => array('hiWhite'), 'separator' => false)); + $this->_response->appendContent(' Command Line Console Tool v' . Zend_Version::VERSION . ''); + return $this; + } + + /** + * _respondWithSystemInformation() + * + * @param string $providerNameFilter + * @param string $actionNameFilter + * @param bool $includeAllSpecialties + * @return Zend_Tool_Framework_Client_Console_HelpSystem + */ + protected function _respondWithSystemInformation($providerNameFilter = null, $actionNameFilter = null, $includeAllSpecialties = false) + { + $manifest = $this->_registry->getManifestRepository(); + + $providerMetadatasSearch = array( + 'type' => 'Tool', + 'name' => 'providerName', + 'clientName' => 'console' + ); + + if (is_string($providerNameFilter)) { + $providerMetadatasSearch = array_merge($providerMetadatasSearch, array('providerName' => $providerNameFilter)); + } + + $actionMetadatasSearch = array( + 'type' => 'Tool', + 'name' => 'actionName', + 'clientName' => 'console' + ); + + if (is_string($actionNameFilter)) { + $actionMetadatasSearch = array_merge($actionMetadatasSearch, array('actionName' => $actionNameFilter)); + } + + // get the metadata's for the things to display + $displayProviderMetadatas = $manifest->getMetadatas($providerMetadatasSearch); + $displayActionMetadatas = $manifest->getMetadatas($actionMetadatasSearch); + + // create index of actionNames + for ($i = 0; $i < count($displayActionMetadatas); $i++) { + $displayActionNames[] = $displayActionMetadatas[$i]->getActionName(); + } + + foreach ($displayProviderMetadatas as $providerMetadata) { + + $providerNameDisplayed = false; + + $providerName = $providerMetadata->getProviderName(); + $providerSignature = $providerMetadata->getReference(); + + foreach ($providerSignature->getActions() as $actionInfo) { + + $actionName = $actionInfo->getName(); + + // check to see if this action name is valid + if (($foundActionIndex = array_search($actionName, $displayActionNames)) === false) { + continue; + } else { + $actionMetadata = $displayActionMetadatas[$foundActionIndex]; + } + + $specialtyMetadata = $manifest->getMetadata(array( + 'type' => 'Tool', + 'name' => 'specialtyName', + 'providerName' => $providerName, + 'specialtyName' => '_Global', + 'clientName' => 'console' + )); + + // lets do the main _Global action first + $actionableGlobalLongParamMetadata = $manifest->getMetadata(array( + 'type' => 'Tool', + 'name' => 'actionableMethodLongParams', + 'providerName' => $providerName, + 'specialtyName' => '_Global', + 'actionName' => $actionName, + 'clientName' => 'console' + )); + + if ($actionableGlobalLongParamMetadata) { + + if (!$providerNameDisplayed) { + $this->_respondWithProviderName($providerMetadata); + $providerNameDisplayed = true; + } + + $this->_respondWithCommand($providerMetadata, $actionMetadata, $specialtyMetadata, $actionableGlobalLongParamMetadata); + + $actionIsGlobal = true; + } else { + $actionIsGlobal = false; + } + + $actionableGlobalMetadatas = $manifest->getMetadatas(array( + 'type' => 'Tool', + 'name' => 'actionableMethodLongParams', + 'providerName' => $providerName, + 'actionName' => $actionName, + 'clientName' => 'console' + )); + + if (!$actionIsGlobal && count($actionableGlobalMetadatas) == 1) { + $this->_response->appendContent('single special action/provider'); + } + + if ($includeAllSpecialties) { + + foreach ($providerSignature->getSpecialties() as $specialtyName) { + + if ($specialtyName == '_Global') { + continue; + } + + $specialtyMetadata = $manifest->getMetadata(array( + 'type' => 'Tool', + 'name' => 'specialtyName', + 'providerName' => $providerMetadata->getProviderName(), + 'specialtyName' => $specialtyName, + 'clientName' => 'console' + )); + + $actionableSpecialtyLongMetadata = $manifest->getMetadata(array( + 'type' => 'Tool', + 'name' => 'actionableMethodLongParams', + 'providerName' => $providerMetadata->getProviderName(), + 'specialtyName' => $specialtyName, + 'actionName' => $actionName, + 'clientName' => 'console' + )); + + if($actionableSpecialtyLongMetadata) { + $this->_respondWithCommand($providerMetadata, $actionMetadata, $specialtyMetadata, $actionableSpecialtyLongMetadata); + } + + } + } + + if (!$includeAllSpecialties && count($actionableGlobalMetadatas) > 1) { + $this->_response->appendContent(' Note: There are specialties, use ', array('color' => 'yellow', 'separator' => false)); + $this->_response->appendContent( + 'zf ' . $actionMetadata->getValue() . ' ' . $providerMetadata->getValue() . '.?', + array('color' => 'cyan', 'separator' => false) + ); + $this->_response->appendContent(' to get specific help on them.', array('color' => 'yellow')); + } + + } + + if ($providerNameDisplayed) { + $this->_response->appendContent(null, array('separator' => true)); + } + } + return $this; + } + + /** + * _respondWithProviderName() + * + * @param Zend_Tool_Framework_Metadata_Tool $providerMetadata + * @return Zend_Tool_Framework_Client_Console_HelpSystem + */ + protected function _respondWithProviderName(Zend_Tool_Framework_Metadata_Tool $providerMetadata) + { + $this->_response->appendContent(' ' . $providerMetadata->getProviderName()); + return $this; + } + + /** + * _respondWithCommand() + * + * @param Zend_Tool_Framework_Metadata_Tool $providerMetadata + * @param Zend_Tool_Framework_Metadata_Tool $actionMetadata + * @param Zend_Tool_Framework_Metadata_Tool $specialtyMetadata + * @param Zend_Tool_Framework_Metadata_Tool $parameterLongMetadata + * @return Zend_Tool_Framework_Client_Console_HelpSystem + */ + protected function _respondWithCommand( + Zend_Tool_Framework_Metadata_Tool $providerMetadata, + Zend_Tool_Framework_Metadata_Tool $actionMetadata, + Zend_Tool_Framework_Metadata_Tool $specialtyMetadata, + Zend_Tool_Framework_Metadata_Tool $parameterLongMetadata)//, + //Zend_Tool_Framework_Metadata_Tool $parameterShortMetadata) + { + $this->_response->appendContent( + ' zf ' . $actionMetadata->getValue() . ' ' . $providerMetadata->getValue(), + array('color' => 'cyan', 'separator' => false) + ); + + if ($specialtyMetadata->getSpecialtyName() != '_Global') { + $this->_response->appendContent('.' . $specialtyMetadata->getValue(), array('color' => 'cyan', 'separator' => false)); + } + + foreach ($parameterLongMetadata->getValue() as $paramName => $consoleParamName) { + $methodInfo = $parameterLongMetadata->getReference(); + $paramString = ' ' . $consoleParamName; + if ( ($defaultValue = $methodInfo['parameterInfo'][$paramName]['default']) != null) { + $paramString .= '[=' . $defaultValue . ']'; + } + $this->_response->appendContent($paramString . '', array('separator' => false)); + } + + $this->_response->appendContent(null, array('separator' => true)); + return $this; + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Console/Manifest.php b/lib/zend/Zend/Tool/Framework/Client/Console/Manifest.php new file mode 100644 index 0000000000..e0f9652328 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Console/Manifest.php @@ -0,0 +1,209 @@ +_registry = $registry; + return $this; + } + + /** + * getMetadata() is required by the Manifest Interface. + * + * These are the following metadatas that will be setup: + * + * actionName + * - metadata for actions + * - value will be a dashed name for the action named in 'actionName' + * providerName + * - metadata for providers + * - value will be a dashed-name for the provider named in 'providerName' + * providerSpecialtyNames + * - metadata for providers + * actionableMethodLongParameters + * - metadata for providers + * actionableMethodShortParameters + * - metadata for providers + * + * @return array Array of Metadatas + */ + public function getMetadata() + { + $metadatas = array(); + + // setup the camelCase to dashed filter to use since cli expects dashed named + $ccToDashedFilter = new Zend_Filter(); + $ccToDashedFilter + ->addFilter(new Zend_Filter_Word_CamelCaseToDash()) + ->addFilter(new Zend_Filter_StringToLower()); + + // get the registry to get the action and provider repository + $actionRepository = $this->_registry->getActionRepository(); + $providerRepository = $this->_registry->getProviderRepository(); + + // loop through all actions and create a metadata for each + foreach ($actionRepository->getActions() as $action) { + // each action metadata will be called + $metadatas[] = new Zend_Tool_Framework_Metadata_Tool(array( + 'name' => 'actionName', + 'value' => $ccToDashedFilter->filter($action->getName()), + 'reference' => $action, + 'actionName' => $action->getName(), + 'clientName' => 'console', + 'clientReference' => $this->_registry->getClient() + )); + } + + foreach ($providerRepository->getProviderSignatures() as $providerSignature) { + + // create the metadata for the provider's cliProviderName + $metadatas[] = new Zend_Tool_Framework_Metadata_Tool(array( + 'name' => 'providerName', + 'value' => $ccToDashedFilter->filter($providerSignature->getName()), + 'reference' => $providerSignature, + 'clientName' => 'console', + 'providerName' => $providerSignature->getName(), + 'clientReference' => $this->_registry->getClient() + )); + + // create the metadatas for the per provider specialites in providerSpecaltyNames + foreach ($providerSignature->getSpecialties() as $specialty) { + + $metadatas[] = new Zend_Tool_Framework_Metadata_Tool(array( + 'name' => 'specialtyName', + 'value' => $ccToDashedFilter->filter($specialty), + 'reference' => $providerSignature, + 'clientName' => 'console', + 'providerName' => $providerSignature->getName(), + 'specialtyName' => $specialty, + 'clientReference' => $this->_registry->getClient() + )); + + } + + // $actionableMethod is keyed by the methodName (but not used) + foreach ($providerSignature->getActionableMethods() as $actionableMethodData) { + + $methodLongParams = array(); + $methodShortParams = array(); + + // $actionableMethodData get both the long and short names + foreach ($actionableMethodData['parameterInfo'] as $parameterInfoData) { + + // filter to dashed + $methodLongParams[$parameterInfoData['name']] = $ccToDashedFilter->filter($parameterInfoData['name']); + + // simply lower the character, (its only 1 char after all) + $methodShortParams[$parameterInfoData['name']] = strtolower($parameterInfoData['name'][0]); + + } + + // create metadata for the long name cliActionableMethodLongParameters + $metadatas[] = new Zend_Tool_Framework_Metadata_Tool(array( + 'name' => 'actionableMethodLongParams', + 'value' => $methodLongParams, + 'clientName' => 'console', + 'providerName' => $providerSignature->getName(), + 'specialtyName' => $actionableMethodData['specialty'], + 'actionName' => $actionableMethodData['actionName'], + 'reference' => &$actionableMethodData, + 'clientReference' => $this->_registry->getClient() + )); + + // create metadata for the short name cliActionableMethodShortParameters + $metadatas[] = new Zend_Tool_Framework_Metadata_Tool(array( + 'name' => 'actionableMethodShortParams', + 'value' => $methodShortParams, + 'clientName' => 'console', + 'providerName' => $providerSignature->getName(), + 'specialtyName' => $actionableMethodData['specialty'], + 'actionName' => $actionableMethodData['actionName'], + 'reference' => &$actionableMethodData, + 'clientReference' => $this->_registry->getClient() + )); + + } + + } + + return $metadatas; + } + + public function getIndex() + { + return 10000; + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Console/ResponseDecorator/Colorizer.php b/lib/zend/Zend/Tool/Framework/Client/Console/ResponseDecorator/Colorizer.php new file mode 100644 index 0000000000..06161921ae --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Console/ResponseDecorator/Colorizer.php @@ -0,0 +1,92 @@ + '30m', + 'hiBlack' => '1;30m', + 'bgBlack' => '40m', + // reds + 'red' => '31m', + 'hiRed' => '1;31m', + 'bgRed' => '41m', + // greens + 'green' => '32m', + 'hiGreen' => '1;32m', + 'bgGreen' => '42m', + // yellows + 'yellow' => '33m', + 'hiYellow' => '1;33m', + 'bgYellow' => '43m', + // blues + 'blue' => '34m', + 'hiBlue' => '1;34m', + 'bgBlue' => '44m', + // magentas + 'magenta' => '35m', + 'hiMagenta' => '1;35m', + 'bgMagenta' => '45m', + // cyans + 'cyan' => '36m', + 'hiCyan' => '1;36m', + 'bgCyan' => '46m', + // whites + 'white' => '37m', + 'hiWhite' => '1;37m', + 'bgWhite' => '47m' + ); + + public function getName() + { + return 'color'; + } + + public function decorate($content, $color) + { + if (is_string($color)) { + $color = array($color); + } + + $newContent = ''; + + foreach ($color as $c) { + if (array_key_exists($c, $this->_colorOptions)) { + $newContent .= "\033[" . $this->_colorOptions[$c]; + } + } + + $newContent .= $content . "\033[m"; + + return $newContent; + } + + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Exception.php b/lib/zend/Zend/Tool/Framework/Client/Exception.php new file mode 100644 index 0000000000..d4017f7299 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Exception.php @@ -0,0 +1,36 @@ +_client = $client; + return $this; + } + + public function setInputRequest($inputRequest) + { + if (is_string($inputRequest)) { + require_once 'Zend/Tool/Framework/Client/Interactive/InputRequest.php'; + $inputRequest = new Zend_Tool_Framework_Client_Interactive_InputRequest($inputRequest); + } elseif (!$inputRequest instanceof Zend_Tool_Framework_Client_Interactive_InputRequest) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('promptInteractive() requires either a string or an instance of Zend_Tool_Framework_Client_Interactive_InputRequest.'); + } + + $this->_inputRequest = $inputRequest; + return $this; + } + + public function handle() + { + $inputResponse = $this->_client->handleInteractiveInputRequest($this->_inputRequest); + + if (is_string($inputResponse)) { + require_once 'Zend/Tool/Framework/Client/Interactive/InputResponse.php'; + $inputResponse = new Zend_Tool_Framework_Client_Interactive_InputResponse($inputResponse); + } elseif (!$inputResponse instanceof Zend_Tool_Framework_Client_Interactive_InputResponse) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('The registered $_interactiveCallback for the client must either return a string or an instance of Zend_Tool_Framework_Client_Interactive_InputResponse.'); + } + + return $inputResponse; + } + + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Interactive/InputInterface.php b/lib/zend/Zend/Tool/Framework/Client/Interactive/InputInterface.php new file mode 100644 index 0000000000..1a5f430e52 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Interactive/InputInterface.php @@ -0,0 +1,41 @@ +setContent($content); + } + } + + public function setContent($content) + { + $this->_content = $content; + return $this; + } + + public function getContent() + { + return $this->_content; + } + + public function __toString() + { + return $this->_content; + } +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Interactive/InputResponse.php b/lib/zend/Zend/Tool/Framework/Client/Interactive/InputResponse.php new file mode 100644 index 0000000000..ef9d7890a5 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Interactive/InputResponse.php @@ -0,0 +1,52 @@ +setContent($content); + } + } + + public function setContent($content) + { + $this->_content = $content; + return $this; + } + + public function getContent() + { + return $this->_content; + } + + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Interactive/OutputInterface.php b/lib/zend/Zend/Tool/Framework/Client/Interactive/OutputInterface.php new file mode 100644 index 0000000000..dff9502869 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Interactive/OutputInterface.php @@ -0,0 +1,33 @@ +_providerName = $providerName; + return $this; + } + + /** + * getProviderName() + * + * @return string + */ + public function getProviderName() + { + return $this->_providerName; + } + + /** + * setSpecialtyName() + * + * @param string $specialtyName + * @return Zend_Tool_Framework_Client_Request + */ + public function setSpecialtyName($specialtyName) + { + $this->_specialtyName = $specialtyName; + return $this; + } + + /** + * getSpecialtyName() + * + * @return string + */ + public function getSpecialtyName() + { + return $this->_specialtyName; + } + + /** + * setActionName() + * + * @param string $actionName + * @return Zend_Tool_Framework_Client_Request + */ + public function setActionName($actionName) + { + $this->_actionName = $actionName; + return $this; + } + + /** + * getActionName() + * + * @return string + */ + public function getActionName() + { + return $this->_actionName; + } + + /** + * setActionParameter() + * + * @param string $parameterName + * @param string $parameterValue + * @return Zend_Tool_Framework_Client_Request + */ + public function setActionParameter($parameterName, $parameterValue) + { + $this->_actionParameters[$parameterName] = $parameterValue; + return $this; + } + + /** + * getActionParameters() + * + * @return array + */ + public function getActionParameters() + { + return $this->_actionParameters; + } + + /** + * getActionParameter() + * + * @param string $parameterName + * @return string + */ + public function getActionParameter($parameterName) + { + return (isset($this->_actionParameters[$parameterName])) ? $this->_actionParameters[$parameterName] : null; + } + + /** + * setProviderParameter() + * + * @param string $parameterName + * @param string $parameterValue + * @return Zend_Tool_Framework_Client_Request + */ + public function setProviderParameter($parameterName, $parameterValue) + { + $this->_providerParameters[$parameterName] = $parameterValue; + return $this; + } + + /** + * getProviderParameters() + * + * @return array + */ + public function getProviderParameters() + { + return $this->_providerParameters; + } + + /** + * getProviderParameter() + * + * @param string $parameterName + * @return string + */ + public function getProviderParameter($parameterName) + { + return (isset($this->_providerParameters[$parameterName])) ? $this->_providerParameters[$parameterName] : null; + } + + /** + * setPretend() + * + * @param bool $pretend + * @return Zend_Tool_Framework_Client_Request + */ + public function setPretend($pretend) + { + $this->_isPretend = (bool) $pretend; + return $this; + } + + /** + * isPretend() - Whether or not this is a pretend request + * + * @return bool + */ + public function isPretend() + { + return $this->_isPretend; + } + + /** + * setDebug() + * + * @param bool $pretend + * @return Zend_Tool_Framework_Client_Request + */ + public function setDebug($debug) + { + $this->_isDebug = (bool) $debug; + return $this; + } + + /** + * isDebug() - Whether or not this is a debug enabled request + * + * @return bool + */ + public function isDebug() + { + return $this->_isDebug; + } + + /** + * setVerbose() + * + * @param bool $verbose + * @return Zend_Tool_Framework_Client_Request + */ + public function setVerbose($verbose) + { + $this->_isVerbose = (bool) $verbose; + return $this; + } + + /** + * isVerbose() - Whether or not this is a verbose enabled request + * + * @return bool + */ + public function isVerbose() + { + return $this->_isVerbose; + } + + /** + * setDispatchable() + * + * @param bool $dispatchable + * @return Zend_Tool_Framework_Client_Request + */ + public function setDispatchable($dispatchable) + { + $this->_isDispatchable = (bool) $dispatchable; + return $this; + } + + /** + * isDispatchable() Is this request Dispatchable? + * + * @return bool + */ + public function isDispatchable() + { + return $this->_isDispatchable; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Framework/Client/Response.php b/lib/zend/Zend/Tool/Framework/Client/Response.php new file mode 100644 index 0000000000..e743e7e91a --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Response.php @@ -0,0 +1,223 @@ +_callback = $callback; + return $this; + } + + /** + * setContent() + * + * @param string $content + * @return Zend_Tool_Framework_Client_Response + */ + public function setContent($content, Array $decoratorOptions = array()) + { + $this->_applyDecorators($content, $decoratorOptions); + + $this->_content = array(); + $this->appendContent($content); + return $this; + } + + /** + * appendCallback + * + * @param string $content + * @return Zend_Tool_Framework_Client_Response + */ + public function appendContent($content, Array $decoratorOptions = array()) + { + $content = $this->_applyDecorators($content, $decoratorOptions); + + if ($this->_callback !== null) { + call_user_func($this->_callback, $content); + } + + $this->_content[] = $content; + + return $this; + } + + /** + * setDefaultDecoratorOptions() + * + * @param array $decoratorOptions + * @param bool $mergeIntoExisting + * @return Zend_Tool_Framework_Client_Response + */ + public function setDefaultDecoratorOptions(Array $decoratorOptions, $mergeIntoExisting = false) + { + if ($mergeIntoExisting == false) { + $this->_defaultDecoratorOptions = array(); + } + + $this->_defaultDecoratorOptions = array_merge($this->_defaultDecoratorOptions, $decoratorOptions); + return $this; + } + + /** + * getContent() + * + * @return string + */ + public function getContent() + { + return implode('', $this->_content); + } + + /** + * isException() + * + * @return bool + */ + public function isException() + { + return isset($this->_exception); + } + + /** + * setException() + * + * @param Exception $exception + * @return Zend_Tool_Framework_Client_Response + */ + public function setException(Exception $exception) + { + $this->_exception = $exception; + return $this; + } + + /** + * getException() + * + * @return Exception + */ + public function getException() + { + return $this->_exception; + } + + /** + * Add Content Decorator + * + * @param Zend_Tool_Framework_Client_Response_ContentDecorator_Interface $contentDecorator + * @return unknown + */ + public function addContentDecorator(Zend_Tool_Framework_Client_Response_ContentDecorator_Interface $contentDecorator) + { + $decoratorName = strtolower($contentDecorator->getName()); + $this->_decorators[$decoratorName] = $contentDecorator; + return $this; + } + + /** + * getContentDecorators() + * + * @return array + */ + public function getContentDecorators() + { + return $this->_decorators; + } + + /** + * __toString() to cast to a string + * + * @return string + */ + public function __toString() + { + return (string) implode('', $this->_content); + } + + /** + * _applyDecorators() apply a group of decorators + * + * @param string $content + * @param array $decoratorOptions + * @return string + */ + protected function _applyDecorators($content, Array $decoratorOptions) + { + $options = array_merge($this->_defaultDecoratorOptions, $decoratorOptions); + + $options = array_change_key_case($options, CASE_LOWER); + + if ($options) { + foreach ($this->_decorators as $decoratorName => $decorator) { + if (array_key_exists($decoratorName, $options)) { + $content = $decorator->decorate($content, $options[$decoratorName]); + } + } + } + + return $content; + + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Response/ContentDecorator/Interface.php b/lib/zend/Zend/Tool/Framework/Client/Response/ContentDecorator/Interface.php new file mode 100644 index 0000000000..44962e5c29 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Response/ContentDecorator/Interface.php @@ -0,0 +1,35 @@ +_separator = $separator; + return $this; + } + + /** + * getSeparator() + * + * @return string + */ + public function getSeparator() + { + return $this->_separator; + } + + public function decorate($content, $decoratorValue) + { + $run = 1; + if (is_bool($decoratorValue) && $decoratorValue === false) { + return $content; + } + + if (is_int($decoratorValue)) { + $run = $decoratorValue; + } + + for ($i = 0; $i < $run; $i++) { + $content .= $this->_separator; + } + + return $content; + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Storage.php b/lib/zend/Zend/Tool/Framework/Client/Storage.php new file mode 100644 index 0000000000..84baef2de7 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Storage.php @@ -0,0 +1,117 @@ +setAdapter($options['adapter']); + } + } + + public function setAdapter($adapter) + { + if (is_string($adapter)) { + $storageAdapterClass = 'Zend_Tool_Framework_Client_Storage_' . ucfirst($adapter); + Zend_Loader::loadClass($storageAdapterClass); + $adapter = new $storageAdapterClass(); + } + $this->_adapter = $adapter; + } + + public function isEnabled() + { + return ($this->_adapter instanceof Zend_Tool_Framework_Client_Storage_AdapterInterface); + } + + public function put($name, $value) + { + if (!$this->_adapter) { + return false; + } + + $this->_adapter->put($name, $value); + + return $this; + } + + public function get($name, $defaultValue = false) + { + if (!$this->_adapter) { + return false; + } + + if ($this->_adapter->has($name)) { + return $this->_adapter->get($name); + } else { + return $defaultValue; + } + + } + + public function has($name) + { + if (!$this->_adapter) { + return false; + } + + return $this->_adapter->has($name); + } + + public function remove($name) + { + if (!$this->_adapter) { + return false; + } + + $this->_adapter->remove($name); + + return $this; + } + + public function getStreamUri($name) + { + if (!$this->_adapter) { + return false; + } + + return $this->_adapter->getStreamUri($name); + } +} diff --git a/lib/zend/Zend/Tool/Framework/Client/Storage/AdapterInterface.php b/lib/zend/Zend/Tool/Framework/Client/Storage/AdapterInterface.php new file mode 100644 index 0000000000..ad9864b2af --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Client/Storage/AdapterInterface.php @@ -0,0 +1,42 @@ +_directoryPath = $directoryPath; + } + + public function put($name, $value) + { + return file_put_contents($this->_directoryPath . DIRECTORY_SEPARATOR . $name, $value); + } + + public function get($name) + { + return file_get_contents($this->_directoryPath . DIRECTORY_SEPARATOR . $name); + } + + public function has($name) + { + return file_exists($this->_directoryPath . DIRECTORY_SEPARATOR . $name); + } + + public function remove($name) + { + return unlink($this->_directoryPath . DIRECTORY_SEPARATOR . $name); + } + + public function getStreamUri($name) + { + return $this->_directoryPath . DIRECTORY_SEPARATOR . $name; + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Exception.php b/lib/zend/Zend/Tool/Framework/Exception.php new file mode 100644 index 0000000000..8afc20e083 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Exception.php @@ -0,0 +1,36 @@ +_registry = $registry; + return $this; + } + + /** + * load() - called by the client initialize routine to load files + * + */ + public function load() + { + $this->_retrievedFiles = $this->getRetrievedFiles(); + $this->_loadedClasses = array(); + + $manifestRegistry = $this->_registry->getManifestRepository(); + $providerRegistry = $this->_registry->getProviderRepository(); + + $loadedClasses = array(); + + // loop through files and find the classes declared by loading the file + foreach ($this->_retrievedFiles as $file) { + $classesLoadedBefore = get_declared_classes(); + $oldLevel = error_reporting(E_ALL | ~E_STRICT); // remove strict so that other packages wont throw warnings + // should we lint the files here? i think so + include_once $file; + error_reporting($oldLevel); // restore old error level + $classesLoadedAfter = get_declared_classes(); + $loadedClasses = array_merge($loadedClasses, array_diff($classesLoadedAfter, $classesLoadedBefore)); + } + + // loop through the loaded classes and ensure that + foreach ($loadedClasses as $loadedClass) { + + // reflect class to see if its something we want to load + $reflectionClass = new ReflectionClass($loadedClass); + if ($reflectionClass->implementsInterface('Zend_Tool_Framework_Manifest_Interface') + && !$reflectionClass->isAbstract()) + { + $manifestRegistry->addManifest($reflectionClass->newInstance()); + $this->_loadedClasses[] = $loadedClass; + } + + if ($reflectionClass->implementsInterface('Zend_Tool_Framework_Provider_Interface') + && !$reflectionClass->isAbstract() + && !$providerRegistry->hasProvider($reflectionClass->getName(), false)) + { + $providerRegistry->addProvider($reflectionClass->newInstance()); + $this->_loadedClasses[] = $loadedClass; + } + + } + + return $this->_loadedClasses; + } + + /** + * getRetrievedFiles() + * + * @return array Array of Files Retrieved + */ + public function getRetrievedFiles() + { + if ($this->_retrievedFiles == null) { + $this->_retrievedFiles = $this->_getFiles(); + } + + return $this->_retrievedFiles; + } + + /** + * getLoadedClasses() + * + * @return array Array of Loaded Classes + */ + public function getLoadedClasses() + { + return $this->_loadedClasses; + } + + +} diff --git a/lib/zend/Zend/Tool/Framework/Loader/IncludePathLoader.php b/lib/zend/Zend/Tool/Framework/Loader/IncludePathLoader.php new file mode 100644 index 0000000000..0a3b3c98f1 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Loader/IncludePathLoader.php @@ -0,0 +1,115 @@ +getRealPath()); + + // no links allowed here for now + if ($item->isLink()) { + continue; + } + + // no items that are relavitely the same are allowed + if (in_array($relativeItem, $relativeItems)) { + continue; + } + + $relativeItems[] = $relativeItem; + $files[] = $item->getRealPath(); + } + } + + return $files; + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Loader/IncludePathLoader/RecursiveFilterIterator.php b/lib/zend/Zend/Tool/Framework/Loader/IncludePathLoader/RecursiveFilterIterator.php new file mode 100644 index 0000000000..a3550987bf --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Loader/IncludePathLoader/RecursiveFilterIterator.php @@ -0,0 +1,91 @@ +_denyDirectoryPattern = $denyDirectoryPattern; + $this->_acceptFilePattern = $acceptFilePattern; + parent::__construct($iterator); + } + + /** + * accept() - Which iterable items to accept or deny, required by FilterInterface + * + * @return unknown + */ + public function accept() + { + $currentNode = $this->current(); + $currentNodeRealPath = $currentNode->getRealPath(); + + // if the current node is a directory AND doesn't match the denyDirectory pattern, accept + if ($currentNode->isDir() + && !preg_match('#' . $this->_denyDirectoryPattern . '#', $currentNodeRealPath)) { + return true; + } + + // if the file matches the accept file pattern, accept + $acceptable = (preg_match('#' . $this->_acceptFilePattern . '#', $currentNodeRealPath)) ? true : false; + return $acceptable; + } + + /** + * getChildren() - overridden from RecursiveFilterIterator to allow the persistence of + * the $_denyDirectoryPattern and the $_acceptFilePattern when sub iterators of this filter + * are needed to be created. + * + * @return Zend_Tool_Framework_Loader_IncludePathLoader_RecursiveFilterIterator + */ + public function getChildren() + { + if (empty($this->ref)) { + $this->ref = new ReflectionClass($this); + } + + return $this->ref->newInstance( + $this->getInnerIterator()->getChildren(), + $this->_denyDirectoryPattern, + $this->_acceptFilePattern + ); + } + +} + diff --git a/lib/zend/Zend/Tool/Framework/Manifest/ActionManifestable.php b/lib/zend/Zend/Tool/Framework/Manifest/ActionManifestable.php new file mode 100644 index 0000000000..73bc9d688b --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Manifest/ActionManifestable.php @@ -0,0 +1,47 @@ +_registry = $registry; + return $this; + } + + /** + * addManifest() - Add a manifest for later processing + * + * @param Zend_Tool_Framework_Manifest_Interface $manifest + * @return Zend_Tool_Framework_Manifest_Repository + */ + public function addManifest(Zend_Tool_Framework_Manifest_Interface $manifest) + { + // we need to get an index number so that manifests with + // higher indexes have priority over others + $index = count($this->_manifests); + + if ($manifest instanceof Zend_Tool_Framework_Registry_EnabledInterface) { + $manifest->setRegistry($this->_registry); + } + + // if the manifest supplies a getIndex() method, use it + if ($manifest instanceof Zend_Tool_Framework_Manifest_Indexable) { + $index = $manifest->getIndex(); + } + + // get the required objects from the framework registry + $actionRepository = $this->_registry->getActionRepository(); + $providerRepository = $this->_registry->getProviderRepository(); + + // load providers if interface supports that method + if ($manifest instanceof Zend_Tool_Framework_Manifest_ProviderManifestable) { + $providers = $manifest->getProviders(); + if (!is_array($providers)) { + $providers = array($providers); + } + + foreach ($providers as $provider) { + if (!$provider instanceof Zend_Tool_Framework_Provider_Interface) { + require_once 'Zend/Tool/Framework/Manifest/Exception.php'; + throw new Zend_Tool_Framework_Manifest_Exception( + 'A provider provided by the ' . get_class($manifest) + . ' does not implement Zend_Tool_Framework_Provider_Interface' + ); + } + if (!$providerRepository->hasProvider($provider, false)) { + $providerRepository->addProvider($provider); + } + } + + } + + // load actions if interface supports that method + if ($manifest instanceof Zend_Tool_Framework_Manifest_ActionManifestable) { + $actions = $manifest->getActions(); + if (!is_array($actions)) { + $actions = array($actions); + } + + foreach ($actions as $action) { + if (is_string($action)) { + $action = new Zend_Tool_Framework_Action_Base($action); + } + $actionRepository->addAction($action); + } + } + + // should we detect collisions here? does it even matter? + $this->_manifests[$index] = $manifest; + ksort($this->_manifests); + + return $this; + } + + /** + * getManifests() + * + * @return Zend_Tool_Framework_Manifest_Interface[] + */ + public function getManifests() + { + return $this->_manifests; + } + + /** + * addMetadata() - add a metadata peice by peice + * + * @param Zend_Tool_Framework_Manifest_Metadata $metadata + * @return Zend_Tool_Framework_Manifest_Repository + */ + public function addMetadata(Zend_Tool_Framework_Metadata_Interface $metadata) + { + $this->_metadatas[] = $metadata; + return $this; + } + + /** + * process() - Process is expected to be called at the end of client construction time. + * By this time, the loader has run and loaded any found manifests into the repository + * for loading + * + * @return Zend_Tool_Framework_Manifest_Repository + */ + public function process() + { + + foreach ($this->_manifests as $manifest) { + if ($manifest instanceof Zend_Tool_Framework_Manifest_MetadataManifestable) { + $metadatas = $manifest->getMetadata(); + if (!is_array($metadatas)) { + $metadatas = array($metadatas); + } + + foreach ($metadatas as $metadata) { + if (!$metadata instanceof Zend_Tool_Framework_Metadata_Interface) { + require_once 'Zend/Tool/Framework/Manifest/Exception.php'; + throw new Zend_Tool_Framework_Manifest_Exception( + 'A Zend_Tool_Framework_Metadata_Interface object was not found in manifest ' . get_class($manifest) + ); + } + + $this->addMetadata($metadata); + } + + } + } + + return $this; + } + + /** + * getMetadatas() - This is the main search function for the repository. + * + * @example This will retrieve all metadata that matches the following criteria + * $manifestRepo->getMetadatas(array( + * 'providerName' => 'Version', + * 'actionName' => 'show' + * )); + * + * @param array $searchProperties + * @param bool $includeNonExistentProperties + * @return Zend_Tool_Framework_Manifest_Metadata[] + */ + public function getMetadatas(Array $searchProperties = array(), $includeNonExistentProperties = true) + { + + $returnMetadatas = array(); + + // loop through the metadatas so that we can search each individual one + foreach ($this->_metadatas as $metadata) { + + // each value will be retrieved from the metadata, each metadata should + // implement a getter method to retrieve the value + foreach ($searchProperties as $searchPropertyName => $searchPropertyValue) { + if (method_exists($metadata, 'get' . $searchPropertyName)) { + if ($metadata->{'get' . $searchPropertyName}() != $searchPropertyValue) { + // if the metadata supports a specific property but the value does not + // match, move on + continue 2; + } + } elseif (!$includeNonExistentProperties) { + // if the option $includeNonExitentProperties is false, then move on as + // we dont want to include this metadata if non existent + // search properties are not inside the target (current) metadata + continue 2; + } + } + + // all searching has been accounted for, if we reach this point, then the metadata + // is good and we can return it + $returnMetadatas[] = $metadata; + + } + + return $returnMetadatas; + } + + /** + * getMetadata() - This will proxy to getMetadatas(), but will only return a single metadata. This method + * should be used in situations where the search criteria is known to only find a single metadata object + * + * @param array $searchProperties + * @param bool $includeNonExistentProperties + * @return Zend_Tool_Framework_Manifest_Metadata + */ + public function getMetadata(Array $searchProperties = array(), $includeNonExistentProperties = true) + { + $metadatas = $this->getMetadatas($searchProperties, $includeNonExistentProperties); + return array_shift($metadatas); + } + + /** + * __toString() - cast to string + * + * @return string + */ + public function __toString() + { + $metadatasByType = array(); + + foreach ($this->_metadatas as $metadata) { + if (!array_key_exists($metadata->getType(), $metadatasByType)) { + $metadatasByType[$metadata->getType()] = array(); + } + $metadatasByType[$metadata->getType()][] = $metadata; + } + + $string = ''; + foreach ($metadatasByType as $type => $metadatas) { + $string .= $type . PHP_EOL; + foreach ($metadatas as $metadata) { + $metadataString = ' ' . $metadata->__toString() . PHP_EOL; + //$metadataString = str_replace(PHP_EOL, PHP_EOL . ' ', $metadataString); + $string .= $metadataString; + } + } + + return $string; + } + + /** + * count() - required by the Countable Interface + * + * @return int + */ + public function count() + { + return count($this->_metadatas); + } + + /** + * getIterator() - required by the IteratorAggregate interface + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_metadatas); + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Metadata/Basic.php b/lib/zend/Zend/Tool/Framework/Metadata/Basic.php new file mode 100644 index 0000000000..d682598525 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Metadata/Basic.php @@ -0,0 +1,221 @@ +setOptions($options); + } + } + + /** + * setOptions() - standard issue implementation, this will set any + * options that are supported via a set method. + * + * @param array $options + * @return Zend_Tool_Framework_Metadata_Basic + */ + public function setOptions(Array $options) + { + foreach ($options as $optionName => $optionValue) { + $setMethod = 'set' . $optionName; + if (method_exists($this, $setMethod)) { + $this->{$setMethod}($optionValue); + } + } + + return $this; + } + + /** + * getType() + * + * @return string + */ + public function getType() + { + return $this->_type; + } + + /** + * setType() + * + * @param string $type + * @return Zend_Tool_Framework_Metadata_Basic + */ + public function setType($type) + { + $this->_type = $type; + return $this; + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * setName() + * + * @param string $name + * @return Zend_Tool_Framework_Metadata_Basic + */ + public function setName($name) + { + $this->_name = $name; + return $this; + } + + /** + * getValue() + * + * @return mixed + */ + public function getValue() + { + return $this->_value; + } + + /** + * setValue() + * + * @param unknown_type $Value + * @return Zend_Tool_Framework_Metadata_Basic + */ + public function setValue($value) + { + $this->_value = $value; + return $this; + } + + /** + * setReference() + * + * @param mixed $reference + * @return Zend_Tool_Framework_Metadata_Basic + */ + public function setReference($reference) + { + $this->_reference = $reference; + return $this; + } + + /** + * getReference() + * + * @return mixed + */ + public function getReference() + { + return $this->_reference; + } + + /** + * getAttributes() - this will retrieve any attributes of this object that exist as properties + * This is most useful for printing metadata. + * + * @param const $type + * @return array + */ + public function getAttributes($type = self::ATTRIBUTES_ALL, $stringRepresentationOfNonScalars = false) + { + $thisReflection = new ReflectionObject($this); + + $metadataPairValues = array(); + + foreach (get_object_vars($this) as $varName => $varValue) { + if ($type == self::ATTRIBUTES_NO_PARENT && ($thisReflection->getProperty($varName)->getDeclaringClass()->getName() == 'Zend_Tool_Framework_Metadata_Basic')) { + continue; + } + + if ($stringRepresentationOfNonScalars) { + + if (is_object($varValue)) { + $varValue = '(object)'; + } + + if (is_null($varValue)) { + $varValue = '(null)'; + } + + } + + $metadataPairValues[ltrim($varName, '_')] = $varValue; + } + + return $metadataPairValues; + } + + /** + * __toString() - string representation of this object + * + * @return string + */ + public function __toString() + { + return 'Type: ' . $this->_type . ', Name: ' . $this->_name . ', Value: ' . (is_array($this->_value) ? http_build_query($this->_value) : (string) $this->_value); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Framework/Metadata/Dynamic.php b/lib/zend/Zend/Tool/Framework/Metadata/Dynamic.php new file mode 100644 index 0000000000..efcf0ff81d --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Metadata/Dynamic.php @@ -0,0 +1,154 @@ +_type; + } + + /** + * getName() + * + * Metadata name + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * getValue() + * + * Metadata Value + * + * @return string + */ + public function getValue() + { + return $this->_value; + } + + + /** + * __isset() + * + * Check if an attrbute is set + * + * @param string $name + * @return bool + */ + public function __isset($name) + { + return isset($this->_dynamicAttributes[$name]); + } + + /** + * __unset() + * + * @param string $name + * @return null + */ + public function __unset($name) + { + unset($this->_dynamicAttributes[$name]); + return; + } + + /** + * __get() - Get a property via property call $metadata->foo + * + * @param string $name + * @return mixed + */ + public function __get($name) + { + if (method_exists($this, 'get' . $name)) { + return $this->{'get' . $name}(); + } elseif (array_key_exists($name, $this->_dynamicAttributes)) { + return ; + } else { + require_once 'Zend/Tool/Framework/Registry/Exception.php'; + throw new Zend_Tool_Framework_Registry_Exception('Property ' . $name . ' was not located in this metadata.'); + } + } + + /** + * __set() - Set a property via the magic set $metadata->foo = 'foo' + * + * @param string $name + * @param mixed $value + */ + public function __set($name, $value) + { + if (method_exists($this, 'set' . $name)) { + $this->{'set' . $name}($value); + return; + } else { + require_once 'Zend/Tool/Framework/Registry/Exception.php'; + throw new Zend_Tool_Framework_Registry_Exception('Property ' . $name . ' was not located in this registry.'); + } + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Metadata/Interface.php b/lib/zend/Zend/Tool/Framework/Metadata/Interface.php new file mode 100644 index 0000000000..713202f821 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Metadata/Interface.php @@ -0,0 +1,52 @@ +_clientName = $clientName; + return $this; + } + + public function getClientName() + { + return $this->_clientName; + } + + /** + * setActionName() + * + * @param string $actionName + * @return Zend_Tool_Framework_Metadata_Tool + */ + public function setActionName($actionName) + { + $this->_actionName = $actionName; + return $this; + } + + /** + * getActionName() + * + * @return string + */ + public function getActionName() + { + return $this->_actionName; + } + + /** + * setProviderName() + * + * @param string $providerName + * @return Zend_Tool_Framework_Metadata_Tool + */ + public function setProviderName($providerName) + { + $this->_providerName = $providerName; + return $this; + } + + /** + * getProviderName() + * + * @return string + */ + public function getProviderName() + { + return $this->_providerName; + } + + /** + * setSpecialtyName() + * + * @param string $specialtyName + * @return Zend_Tool_Framework_Metadata_Tool + */ + public function setSpecialtyName($specialtyName) + { + $this->_specialtyName = $specialtyName; + return $this; + } + + /** + * getSpecialtyName() + * + * @return string + */ + public function getSpecialtyName() + { + return $this->_specialtyName; + } + + /** + * setClientReference() + * + * @param Zend_Tool_Framework_Client_Abstract $client + * @return Zend_Tool_Framework_Metadata_Tool + */ + public function setClientReference(Zend_Tool_Framework_Client_Abstract $client) + { + $this->_clientReference = $client; + return $this; + } + + /** + * getClientReference() + * + * @return Zend_Tool_Framework_Client_Abstract + */ + public function getClientReference() + { + return $this->_clientReference; + } + + /** + * setActionReference() + * + * @param Zend_Tool_Framework_Action_Interface $action + * @return Zend_Tool_Framework_Metadata_Tool + */ + public function setActionReference(Zend_Tool_Framework_Action_Interface $action) + { + $this->_actionReference = $action; + return $this; + } + + /** + * getActionReference() + * + * @return Zend_Tool_Framework_Action_Interface + */ + public function getActionReference() + { + return $this->_actionReference; + } + + /** + * setProviderReference() + * + * @param Zend_Tool_Framework_Provider_Interface $provider + * @return Zend_Tool_Framework_Metadata_Tool + */ + public function setProviderReference(Zend_Tool_Framework_Provider_Interface $provider) + { + $this->_providerReference = $provider; + return $this; + } + + /** + * getProviderReference() + * + * @return Zend_Tool_Framework_Provider_Interface + */ + public function getProviderReference() + { + return $this->_providerReference; + } + + /** + * __toString() cast to string + * + * @return string + */ + public function __toString() + { + $string = parent::__toString(); + $string .= ' (ProviderName: ' . $this->_providerName + . ', ActionName: ' . $this->_actionName + . ', SpecialtyName: ' . $this->_specialtyName + . ')'; + + return $string; + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Provider/Abstract.php b/lib/zend/Zend/Tool/Framework/Provider/Abstract.php new file mode 100644 index 0000000000..059abf0854 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Provider/Abstract.php @@ -0,0 +1,68 @@ +_registry = $registry; + return $this; + } + + +} diff --git a/lib/zend/Zend/Tool/Framework/Provider/DocblockManifestable.php b/lib/zend/Zend/Tool/Framework/Provider/DocblockManifestable.php new file mode 100644 index 0000000000..3d463fc5bf --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Provider/DocblockManifestable.php @@ -0,0 +1,30 @@ +_registry = $registry; + return $this; + } + + /** + * Set the ProcessOnAdd flag + * + * @param unknown_type $processOnAdd + * @return unknown + */ + public function setProcessOnAdd($processOnAdd = true) + { + $this->_processOnAdd = (bool) $processOnAdd; + return $this; + } + + /** + * Add a provider to the repository for processing + * + * @param Zend_Tool_Framework_Provider_Interface $provider + * @return Zend_Tool_Framework_Provider_Repository + */ + public function addProvider(Zend_Tool_Framework_Provider_Interface $provider, $overwriteExistingProvider = false) + { + if ($provider instanceof Zend_Tool_Framework_Registry_EnabledInterface) { + $provider->setRegistry($this->_registry); + } + + if (method_exists($provider, 'getName')) { + $providerName = $provider->getName(); + } else { + $providerName = $this->_parseName($provider); + } + + // if a provider by the given name already exist, and its not set as overwritable, throw exception + if (!$overwriteExistingProvider && + (array_key_exists($providerName, $this->_unprocessedProviders) + || array_key_exists($providerName, $this->_providers))) + { + require_once 'Zend/Tool/Framework/Provider/Exception.php'; + throw new Zend_Tool_Framework_Provider_Exception('A provider by the name ' . $providerName + . ' is already registered and $overrideExistingProvider is set to false.'); + } + + $this->_unprocessedProviders[$providerName] = $provider; + + // if process has already been called, process immediately. + if ($this->_processOnAdd) { + $this->process(); + } + + return $this; + } + + public function hasProvider($providerOrClassName, $processedOnly = true) + { + if ($providerOrClassName instanceof Zend_Tool_Framework_Provider_Interface) { + $targetProviderClassName = get_class($providerOrClassName); + } else { + $targetProviderClassName = (string) $providerOrClassName; + } + + if (!$processedOnly) { + foreach ($this->_unprocessedProviders as $unprocessedProvider) { + if (get_class($unprocessedProvider) == $targetProviderClassName) { + return true; + } + } + } + + foreach ($this->_providers as $processedProvider) { + if (get_class($processedProvider) == $targetProviderClassName) { + return true; + } + } + + return false; + } + + /** + * Process all of the unprocessed providers + * + */ + public function process() + { + + // process all providers in the unprocessedProviders array + foreach ($this->_unprocessedProviders as $providerName => $provider) { + + // create a signature for the provided provider + $providerSignature = new Zend_Tool_Framework_Provider_Signature($provider); + + if ($providerSignature instanceof Zend_Tool_Framework_Registry_EnabledInterface) { + $providerSignature->setRegistry($this->_registry); + } + + $providerSignature->process(); + + // ensure the name is lowercased for easier searching + $providerName = strtolower($providerName); + + // add to the appropraite place + $this->_providerSignatures[$providerName] = $providerSignature; + $this->_providers[$providerName] = $providerSignature->getProvider(); + + // remove from unprocessed array + unset($this->_unprocessedProviders[$providerName]); + } + + } + + /** + * getProviders() Get all the providers in the repository + * + * @return array + */ + public function getProviders() + { + return $this->_providers; + } + + /** + * getProviderSignatures() Get all the provider signatures + * + * @return array + */ + public function getProviderSignatures() + { + return $this->_providerSignatures; + } + + /** + * getProvider() + * + * @param string $providerName + * @return Zend_Tool_Framework_Provider_Interface + */ + public function getProvider($providerName) + { + return $this->_providers[strtolower($providerName)]; + } + + /** + * getProviderSignature() + * + * @param string $providerName + * @return Zend_Tool_Framework_Provider_Signature + */ + public function getProviderSignature($providerName) + { + return $this->_providerSignatures[strtolower($providerName)]; + } + + /** + * count() - return the number of providers + * + * @return int + */ + public function count() + { + return count($this->_providers); + } + + /** + * getIterator() - Required by the IteratorAggregate Interface + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->getProviders()); + } + + /** + * _parseName - internal method to determine the name of an action when one is not explicity provided. + * + * @param Zend_Tool_Framework_Action_Interface $action + * @return string + */ + protected function _parseName(Zend_Tool_Framework_Provider_Interface $provider) + { + $className = get_class($provider); + $providerName = substr($className, strrpos($className, '_')+1); + if (substr($providerName, -8) == 'Provider') { + $providerName = substr($providerName, 0, strlen($providerName)-8); + } + return $providerName; + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Provider/Signature.php b/lib/zend/Zend/Tool/Framework/Provider/Signature.php new file mode 100644 index 0000000000..00c3f003e8 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Provider/Signature.php @@ -0,0 +1,390 @@ +_provider = $provider; + $this->_providerReflection = new Zend_Reflection_Class($provider); + } + + /** + * setRegistry() + * + * @param Zend_Tool_Framework_Registry_Interface $registry + * @return Zend_Tool_Framework_Provider_Signature + */ + public function setRegistry(Zend_Tool_Framework_Registry_Interface $registry) + { + $this->_registry = $registry; + return $this; + } + + public function process() + { + if ($this->_isProcessed) { + return; + } + + $this->_process(); + } + + /** + * getName() of the provider + * + * @return unknown + */ + public function getName() + { + return $this->_name; + } + + /** + * Get the provider for this signature + * + * @return Zend_Tool_Framework_Provider_Interface + */ + public function getProvider() + { + return $this->_provider; + } + + /** + * getProviderReflection() + * + * @return Zend_Reflection_Class + */ + public function getProviderReflection() + { + return $this->_providerReflection; + } + + /** + * getSpecialities() + * + * @return array + */ + public function getSpecialties() + { + return $this->_specialties; + } + + /** + * getActions() + * + * @return array Array of Actions + */ + public function getActions() + { + return $this->_actions; + } + + /** + * getActionableMethods() + * + * @return array + */ + public function getActionableMethods() + { + return $this->_actionableMethods; + } + + /** + * getActionableMethod() - Get an actionable method by name, this will return an array of + * useful information about what can be exectued on this provider + * + * @param string $methodName + * @return array + */ + public function getActionableMethod($methodName) + { + if (isset($this->_actionableMethods[$methodName])) { + return $this->_actionableMethods[$methodName]; + } + + return false; + } + + /** + * getActionableMethodByActionName() - Get an actionable method by its action name, this + * will return an array of useful information about what can be exectued on this provider + * + * @param string $actionName + * @return array + */ + public function getActionableMethodByActionName($actionName) + { + foreach ($this->_actionableMethods as $actionableMethod) { + if ($actionName == $actionableMethod['actionName']) { + return $actionableMethod; + } + } + + return false; + } + + /** + * _process() is called at construction time and is what will build the signature information + * for determining what is actionable + * + */ + protected function _process() + { + $this->_isProcessed = true; + $this->_processName(); + $this->_processSpecialties(); + $this->_processActionableMethods(); + } + + /** + * _processName(); + * + */ + protected function _processName() + { + if (method_exists($this->_provider, 'getName')) { + $this->_name = $this->_provider->getName(); + } + + if ($this->_name == null) { + $className = get_class($this->_provider); + $name = substr($className, strrpos($className, '_')+1); + $name = preg_replace('#(Provider|Manifest)$#', '', $name); + $this->_name = $name; + } + } + + /** + * _processSpecialties() - Break out the specialty names for this provider + * + */ + protected function _processSpecialties() + { + $specialties = array(); + + if ($this->_providerReflection->hasMethod('getSpecialties')) { + $specialties = $this->_provider->getSpecialties(); + if (!is_array($specialties)) { + require_once 'Zend/Tool/Framework/Provider/Exception.php'; + throw new Zend_Tool_Framework_Provider_Exception( + 'Provider ' . get_class($this->_provider) . ' must return an array for method getSpecialties().' + ); + } + } else { + $defaultProperties = $this->_providerReflection->getDefaultProperties(); + $specialties = (isset($defaultProperties['_specialties'])) ? $defaultProperties['_specialties'] : array(); + if (!is_array($specialties)) { + require_once 'Zend/Tool/Framework/Provider/Exception.php'; + throw new Zend_Tool_Framework_Provider_Exception( + 'Provider ' . get_class($this->_provider) . '\'s property $_specialties must be an array.' + ); + } + } + + $this->_specialties = array_merge(array('_Global'), $specialties); + + } + + /** + * _processActionableMethods() - process all methods that can be called on this provider. + * + */ + protected function _processActionableMethods() + { + + $specialtyRegex = '#(.*)(' . implode('|', $this->_specialties) . ')$#i'; + + + $methods = $this->_providerReflection->getMethods(); + + $actionableMethods = array(); + foreach ($methods as $method) { + + $methodName = $method->getName(); + + /** + * the following will determine what methods are actually actionable + * public, non-static, non-underscore prefixed, classes that dont + * contain the name " + */ + if (!$method->getDeclaringClass()->isInstantiable() + || !$method->isPublic() + || $methodName[0] == '_' + || $method->isStatic() + || in_array($methodName, array('getContextClasses', 'getName')) // other protected public methods will nee to go here + ) { + continue; + } + + /** + * check to see if the method was a required method by a Zend_Tool_* interface + */ + foreach ($method->getDeclaringClass()->getInterfaces() as $methodDeclaringClassInterface) { + if (strpos($methodDeclaringClassInterface->getName(), 'Zend_Tool_') === 0 + && $methodDeclaringClassInterface->hasMethod($methodName)) { + continue 2; + } + } + + $actionableName = ucfirst($methodName); + + if (substr($actionableName, -6) == 'Action') { + $actionableName = substr($actionableName, 0, -6); + } + + $actionableMethods[$methodName]['methodName'] = $methodName; + + $matches = null; + if (preg_match($specialtyRegex, $actionableName, $matches)) { + $actionableMethods[$methodName]['actionName'] = $matches[1]; + $actionableMethods[$methodName]['specialty'] = $matches[2]; + } else { + $actionableMethods[$methodName]['actionName'] = $actionableName; + $actionableMethods[$methodName]['specialty'] = '_Global'; + } + + // get the action, and create non-existent actions when they dont exist (the true part below) + $action = $this->_registry->getActionRepository()->getAction($actionableMethods[$methodName]['actionName']); + if ($action == null) { + $action = new Zend_Tool_Framework_Action_Base($actionableMethods[$methodName]['actionName']); + $this->_registry->getActionRepository()->addAction($action); + } + $actionableMethods[$methodName]['action'] = $action; + + if (!in_array($actionableMethods[$methodName]['action'], $this->_actions)) { + $this->_actions[] = $actionableMethods[$methodName]['action']; + } + + $parameterInfo = array(); + $position = 1; + foreach ($method->getParameters() as $parameter) { + $currentParam = $parameter->getName(); + $parameterInfo[$currentParam]['position'] = $position++; + $parameterInfo[$currentParam]['optional'] = $parameter->isOptional(); + $parameterInfo[$currentParam]['default'] = ($parameter->isOptional()) ? $parameter->getDefaultValue() : null; + $parameterInfo[$currentParam]['name'] = $currentParam; + $parameterInfo[$currentParam]['type'] = 'string'; + $parameterInfo[$currentParam]['description'] = null; + } + + $matches = null; + if (($docComment = $method->getDocComment()) != '' && + (preg_match_all('/@param\s+(\w+)+\s+(\$\S+)\s+(.*?)(?=(?:\*\s*@)|(?:\*\/))/s', $docComment, $matches))) + { + for ($i=0; $i <= count($matches[0])-1; $i++) { + $currentParam = ltrim($matches[2][$i], '$'); + + if ($currentParam != '' && isset($parameterInfo[$currentParam])) { + + $parameterInfo[$currentParam]['type'] = $matches[1][$i]; + + $descriptionSource = $matches[3][$i]; + + if ($descriptionSource != '') { + $parameterInfo[$currentParam]['description'] = trim($descriptionSource); + } + + } + + } + + } + + $actionableMethods[$methodName]['parameterInfo'] = $parameterInfo; + + } + + $this->_actionableMethods = $actionableMethods; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Framework/Registry.php b/lib/zend/Zend/Tool/Framework/Registry.php new file mode 100644 index 0000000000..f0a31d0494 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Registry.php @@ -0,0 +1,419 @@ +_client); + unset($this->_loader); + unset($this->_actionRepository); + unset($this->_providerRepository); + unset($this->_request); + unset($this->_response); + } + +// public function __construct() +// { +// // no instantiation from outside +// } + + /** + * Enter description here... + * + * @param Zend_Tool_Framework_Client_Abstract $client + * @return Zend_Tool_Framework_Registry + */ + public function setClient(Zend_Tool_Framework_Client_Abstract $client) + { + $this->_client = $client; + if ($this->isObjectRegistryEnablable($this->_client)) { + $this->enableRegistryOnObject($this->_client); + } + return $this; + } + + /** + * getClient() return the client in the registry + * + * @return Zend_Tool_Framework_Client_Abstract + */ + public function getClient() + { + return $this->_client; + } + + /** + * setConfig() + * + * @param Zend_Tool_Framework_Client_Config $config + * @return Zend_Tool_Framework_Registry + */ + public function setConfig(Zend_Tool_Framework_Client_Config $config) + { + $this->_config = $config; + return $this; + } + + /** + * getConfig() + * + * @return Zend_Tool_Framework_Client_Config + */ + public function getConfig() + { + if ($this->_config === null) { + require_once 'Zend/Tool/Framework/Client/Config.php'; + $this->setConfig(new Zend_Tool_Framework_Client_Config()); + } + + return $this->_config; + } + + /** + * setStorage() + * + * @param Zend_Tool_Framework_Client_Storage $storage + * @return Zend_Tool_Framework_Registry + */ + public function setStorage(Zend_Tool_Framework_Client_Storage $storage) + { + $this->_storage = $storage; + return $this; + } + + /** + * getConfig() + * + * @return Zend_Tool_Framework_Client_Storage + */ + public function getStorage() + { + if ($this->_storage === null) { + require_once 'Zend/Tool/Framework/Client/Storage.php'; + $this->setStorage(new Zend_Tool_Framework_Client_Storage()); + } + + return $this->_storage; + } + + /** + * setLoader() + * + * @param Zend_Tool_Framework_Loader_Abstract $loader + * @return Zend_Tool_Framework_Registry + */ + public function setLoader(Zend_Tool_Framework_Loader_Abstract $loader) + { + $this->_loader = $loader; + if ($this->isObjectRegistryEnablable($this->_loader)) { + $this->enableRegistryOnObject($this->_loader); + } + return $this; + } + + /** + * getLoader() + * + * @return Zend_Tool_Framework_Loader_Abstract + */ + public function getLoader() + { + if ($this->_loader === null) { + require_once 'Zend/Tool/Framework/Loader/IncludePathLoader.php'; + $this->setLoader(new Zend_Tool_Framework_Loader_IncludePathLoader()); + } + + return $this->_loader; + } + + /** + * setActionRepository() + * + * @param Zend_Tool_Framework_Action_Repository $actionRepository + * @return Zend_Tool_Framework_Registry + */ + public function setActionRepository(Zend_Tool_Framework_Action_Repository $actionRepository) + { + $this->_actionRepository = $actionRepository; + if ($this->isObjectRegistryEnablable($this->_actionRepository)) { + $this->enableRegistryOnObject($this->_actionRepository); + } + return $this; + } + + /** + * getActionRepository() + * + * @return Zend_Tool_Framework_Action_Repository + */ + public function getActionRepository() + { + if ($this->_actionRepository == null) { + require_once 'Zend/Tool/Framework/Action/Repository.php'; + $this->setActionRepository(new Zend_Tool_Framework_Action_Repository()); + } + + return $this->_actionRepository; + } + + /** + * setProviderRepository() + * + * @param Zend_Tool_Framework_Provider_Repository $providerRepository + * @return Zend_Tool_Framework_Registry + */ + public function setProviderRepository(Zend_Tool_Framework_Provider_Repository $providerRepository) + { + $this->_providerRepository = $providerRepository; + if ($this->isObjectRegistryEnablable($this->_providerRepository)) { + $this->enableRegistryOnObject($this->_providerRepository); + } + return $this; + } + + /** + * getProviderRepository() + * + * @return Zend_Tool_Framework_Provider_Repository + */ + public function getProviderRepository() + { + if ($this->_providerRepository == null) { + require_once 'Zend/Tool/Framework/Provider/Repository.php'; + $this->setProviderRepository(new Zend_Tool_Framework_Provider_Repository()); + } + + return $this->_providerRepository; + } + + /** + * setManifestRepository() + * + * @param Zend_Tool_Framework_Manifest_Repository $manifestRepository + * @return Zend_Tool_Framework_Registry + */ + public function setManifestRepository(Zend_Tool_Framework_Manifest_Repository $manifestRepository) + { + $this->_manifestRepository = $manifestRepository; + if ($this->isObjectRegistryEnablable($this->_manifestRepository)) { + $this->enableRegistryOnObject($this->_manifestRepository); + } + return $this; + } + + /** + * getManifestRepository() + * + * @return Zend_Tool_Framework_Manifest_Repository + */ + public function getManifestRepository() + { + if ($this->_manifestRepository == null) { + require_once 'Zend/Tool/Framework/Manifest/Repository.php'; + $this->setManifestRepository(new Zend_Tool_Framework_Manifest_Repository()); + } + + return $this->_manifestRepository; + } + + /** + * setRequest() + * + * @param Zend_Tool_Framework_Client_Request $request + * @return Zend_Tool_Framework_Registry + */ + public function setRequest(Zend_Tool_Framework_Client_Request $request) + { + $this->_request = $request; + return $this; + } + + /** + * getRequest() + * + * @return Zend_Tool_Framework_Client_Request + */ + public function getRequest() + { + if ($this->_request == null) { + require_once 'Zend/Tool/Framework/Client/Request.php'; + $this->setRequest(new Zend_Tool_Framework_Client_Request()); + } + + return $this->_request; + } + + /** + * setResponse() + * + * @param Zend_Tool_Framework_Client_Response $response + * @return Zend_Tool_Framework_Registry + */ + public function setResponse(Zend_Tool_Framework_Client_Response $response) + { + $this->_response = $response; + return $this; + } + + /** + * getResponse() + * + * @return Zend_Tool_Framework_Client_Response + */ + public function getResponse() + { + if ($this->_response == null) { + require_once 'Zend/Tool/Framework/Client/Response.php'; + $this->setResponse(new Zend_Tool_Framework_Client_Response()); + } + + return $this->_response; + } + + /** + * __get() - Get a property via property call $registry->foo + * + * @param string $name + * @return mixed + */ + public function __get($name) + { + if (method_exists($this, 'get' . $name)) { + return $this->{'get' . $name}(); + } else { + require_once 'Zend/Tool/Framework/Registry/Exception.php'; + throw new Zend_Tool_Framework_Registry_Exception('Property ' . $name . ' was not located in this registry.'); + } + } + + /** + * __set() - Set a property via the magic set $registry->foo = 'foo' + * + * @param string $name + * @param mixed $value + */ + public function __set($name, $value) + { + if (method_exists($this, 'set' . $name)) { + $this->{'set' . $name}($value); + return; + } else { + require_once 'Zend/Tool/Framework/Registry/Exception.php'; + throw new Zend_Tool_Framework_Registry_Exception('Property ' . $name . ' was not located in this registry.'); + } + } + + /** + * isObjectRegistryEnablable() - Check whether an object is registry enablable + * + * @param object $object + * @return bool + */ + public function isObjectRegistryEnablable($object) + { + if (!is_object($object)) { + require_once 'Zend/Tool/Framework/Registry/Exception.php'; + throw new Zend_Tool_Framework_Registry_Exception('isObjectRegistryEnablable() expects an object.'); + } + + return ($object instanceof Zend_Tool_Framework_Registry_EnabledInterface); + } + + /** + * enableRegistryOnObject() - make an object registry enabled + * + * @param object $object + * @return Zend_Tool_Framework_Registry + */ + public function enableRegistryOnObject($object) + { + if (!$this->isObjectRegistryEnablable($object)) { + require_once 'Zend/Tool/Framework/Registry/Exception.php'; + throw new Zend_Tool_Framework_Registry_Exception('Object provided is not registry enablable, check first with Zend_Tool_Framework_Registry::isObjectRegistryEnablable()'); + } + + $object->setRegistry($this); + return $this; + } + +} diff --git a/lib/zend/Zend/Tool/Framework/Registry/EnabledInterface.php b/lib/zend/Zend/Tool/Framework/Registry/EnabledInterface.php new file mode 100644 index 0000000000..dfdde93c55 --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/Registry/EnabledInterface.php @@ -0,0 +1,40 @@ +_registry = $registry; + } + + public function getName() + { + return 'Manifest'; + } + + public function show() + { + + $manifestRepository = $this->_registry->getManifestRepository(); + $response = $this->_registry->getResponse(); + + $metadataTree = array(); + + $longestAttrNameLen = 50; + + foreach ($manifestRepository as $metadata) { + + $metadataType = $metadata->getType(); + $metadataName = $metadata->getName(); + $metadataAttrs = $metadata->getAttributes('attributesParent'); + + if (!$metadataAttrs) { + $metadataAttrs = '(None)'; + } else { + $metadataAttrs = urldecode(http_build_query($metadataAttrs, null, ', ')); + } + + if (!array_key_exists($metadataType, $metadataTree)) { + $metadataTree[$metadataType] = array(); + } + + if (!array_key_exists($metadataName, $metadataTree[$metadataType])) { + $metadataTree[$metadataType][$metadataName] = array(); + } + + if (!array_key_exists($metadataAttrs, $metadataTree[$metadataType][$metadataName])) { + $metadataTree[$metadataType][$metadataName][$metadataAttrs] = array(); + } + + $longestAttrNameLen = (strlen($metadataAttrs) > $longestAttrNameLen) ? strlen($metadataAttrs) : $longestAttrNameLen; + + $metadataValue = $metadata->getValue(); + if (is_array($metadataValue) && count($metadataValue) > 0) { + $metadataValue = urldecode(http_build_query($metadataValue, null, ', ')); + } elseif (is_array($metadataValue)) { + $metadataValue = '(empty array)'; + } + + $metadataTree[$metadataType][$metadataName][$metadataAttrs][] = $metadataValue; + } + + foreach ($metadataTree as $metadataType => $metadatasByName) { + $response->appendContent($metadataType); + foreach ($metadatasByName as $metadataName => $metadatasByAttributes) { + $response->appendContent(" " . $metadataName); + foreach ($metadatasByAttributes as $metadataAttributeName => $metadataValues) { + foreach ($metadataValues as $metadataValue) { + $string = sprintf(" %-{$longestAttrNameLen}.{$longestAttrNameLen}s : ", $metadataAttributeName) + . $metadataValue; + $response->appendContent($string); + } + } + } + } + + } +} diff --git a/lib/zend/Zend/Tool/Framework/System/Provider/Phpinfo.php b/lib/zend/Zend/Tool/Framework/System/Provider/Phpinfo.php new file mode 100644 index 0000000000..88a5ad889b --- /dev/null +++ b/lib/zend/Zend/Tool/Framework/System/Provider/Phpinfo.php @@ -0,0 +1,38 @@ +_registry = $registry; + return $this; + } + + /** + * Show Action + * + * @param string $mode The mode switch can be one of: major, minor, or mini (default) + * @param bool $nameincluded + */ + public function show($mode = self::MODE_MINI, $nameIncluded = true) + { + + $versionInfo = $this->_splitVersion(); + + switch($mode) { + case self::MODE_MINOR: + unset($versionInfo['mini']); + break; + case self::MODE_MAJOR: + unset($versionInfo['mini'], $versionInfo['minor']); + break; + } + + $output = implode('.', $versionInfo); + + if ($nameIncluded) { + $output = 'Zend Framework Version: ' . $output; + } + + $this->_registry->response->appendContent($output); + } + + public function showMajorPart($nameIncluded = true) + { + $versionNumbers = $this->_splitVersion(); + $output = (($nameIncluded == true) ? 'ZF Major Version: ' : null) . $versionNumbers['major']; + $this->_registry->response->appendContent($output); + } + + public function showMinorPart($nameIncluded = true) + { + $versionNumbers = $this->_splitVersion(); + $output = (($nameIncluded == true) ? 'ZF Minor Version: ' : null) . $versionNumbers['minor']; + $this->_registry->response->appendContent($output); + } + + public function showMiniPart($nameIncluded = true) + { + $versionNumbers = $this->_splitVersion(); + $output = (($nameIncluded == true) ? 'ZF Mini Version: ' : null) . $versionNumbers['mini']; + $this->_registry->response->appendContent($output); + } + + protected function _splitVersion() + { + list($major, $minor, $mini) = explode('.', Zend_Version::VERSION); + return array('major' => $major, 'minor' => $minor, 'mini' => $mini); + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Content/Engine.php b/lib/zend/Zend/Tool/Project/Context/Content/Engine.php new file mode 100644 index 0000000000..3565816f43 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Content/Engine.php @@ -0,0 +1,106 @@ +_storage = $storage; + $this->_engines = array( + new Zend_Tool_Project_Context_Content_Engine_CodeGenerator($storage, $this->_keyInStorage), + new Zend_Tool_Project_Context_Content_Engine_Phtml($storage, $this->_keyInStorage), + ); + } + + /** + * getContent() + * + * @param Zend_Tool_Project_Context_Interface $context + * @param string $methodName + * @param mixed $parameters + * @return string + */ + public function getContent(Zend_Tool_Project_Context_Interface $context, $methodName, $parameters) + { + $content = null; + + foreach ($this->_engines as $engine) { + if ($engine->hasContent($context, $methodName, $parameters)) { + $content = $engine->getContent($context, $methodName, $parameters); + + if ($content != null) { + break; + } + + } + + } + + if ($content == null) { + return false; + } + + return $content; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Context/Content/Engine/CodeGenerator.php b/lib/zend/Zend/Tool/Project/Context/Content/Engine/CodeGenerator.php new file mode 100644 index 0000000000..2c1610c488 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Content/Engine/CodeGenerator.php @@ -0,0 +1,98 @@ +_storage = $storage; + $this->_contentPrefix = $contentPrefix; + } + + /** + * hasContent() + * + * @param Zend_Tool_Project_Context_Interface $context + * @param string $method + * @return string + */ + public function hasContent(Zend_Tool_Project_Context_Interface $context, $method) + { + return $this->_storage->has($this->_contentPrefix . '/' . $context->getName() . '/' . $method . '.php'); + } + + /** + * getContent() + * + * @param Zend_Tool_Project_Context_Interface $context + * @param string $method + * @param mixed $parameters + * @return string + */ + public function getContent(Zend_Tool_Project_Context_Interface $context, $method, $parameters) + { + $streamUri = $this->_storage->getStreamUri($this->_contentPrefix . '/' . $context->getName() . '/' . $method . '.php'); + + if (method_exists($context, 'getCodeGenerator')) { + $codeGenerator = $context->getCodeGenerator(); + } else { + $codeGenerator = new Zend_CodeGenerator_Php_File(); + } + + $codeGenerator = include $streamUri; + + if (!$codeGenerator instanceof Zend_CodeGenerator_Abstract) { + throw new Zend_Tool_Project_Exception('Custom file at ' . $streamUri . ' did not return the $codeGenerator object.'); + } + + return $codeGenerator->generate(); + } + + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Context/Content/Engine/Phtml.php b/lib/zend/Zend/Tool/Project/Context/Content/Engine/Phtml.php new file mode 100644 index 0000000000..df03d91dd4 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Content/Engine/Phtml.php @@ -0,0 +1,89 @@ +_storage = $storage; + $this->_contentPrefix = $contentPrefix; + } + + /** + * hasContext() + * + * @param Zend_Tool_Project_Context_Interface $context + * @param string $method + * @return string + */ + public function hasContent(Zend_Tool_Project_Context_Interface $context, $method) + { + return $this->_storage->has($this->_contentPrefix . '/' . $context . '/' . $method . '.phtml'); + } + + /** + * getContent() + * + * @param Zend_Tool_Project_Context_Interface $context + * @param string $method + * @param mixed $parameters + */ + public function getContent(Zend_Tool_Project_Context_Interface $context, $method, $parameters) + { + $streamUri = $this->_storage->getStreamUri($this->_contentPrefix . '/' . $context->getName() . '/' . $method . '.phtml'); + + ob_start(); + include $streamUri; + $content = ob_get_clean(); + + return $content; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Context/Exception.php b/lib/zend/Zend/Tool/Project/Context/Exception.php new file mode 100644 index 0000000000..15ce971644 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Exception.php @@ -0,0 +1,33 @@ +_resource->getParentResource()->getContext()->getPath(); + $this->_baseDirectory = $parentBaseDirectory; + return $this; + } + + /** + * setResource() + * + * @param Zend_Tool_Project_Profile_Resource $resource + * @return Zend_Tool_Project_Context_Filesystem_Abstract + */ + public function setResource(Zend_Tool_Project_Profile_Resource $resource) + { + $this->_resource = $resource; + return $this; + } + + /** + * setBaseDirectory() + * + * @param string $baseDirectory + * @return Zend_Tool_Project_Context_Filesystem_Abstract + */ + public function setBaseDirectory($baseDirectory) + { + $this->_baseDirectory = rtrim(str_replace('\\', '/', $baseDirectory), '/'); + return $this; + } + + /** + * getBaseDirectory() + * + * @return string + */ + public function getBaseDirectory() + { + return $this->_baseDirectory; + } + + /** + * setFilesystemName() + * + * @param string $filesystemName + * @return Zend_Tool_Project_Context_Filesystem_Abstract + */ + public function setFilesystemName($filesystemName) + { + $this->_filesystemName = $filesystemName; + return $this; + } + + /** + * getFilesystemName() + * + * @return string + */ + public function getFilesystemName() + { + return $this->_filesystemName; + } + + /** + * getPath() + * + * @return string + */ + public function getPath() + { + $path = $this->_baseDirectory; + if ($this->_filesystemName) { + $path .= '/' . $this->_filesystemName; + } + return $path; + } + + /** + * exists() + * + * @return bool + */ + public function exists() + { + return file_exists($this->getPath()); + } + + /** + * create() + * + * Create this resource/context + * + */ + abstract public function create(); + + /** + * delete() + * + * Delete this resouce/context + * + */ + abstract public function delete(); + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Context/Filesystem/Directory.php b/lib/zend/Zend/Tool/Project/Context/Filesystem/Directory.php new file mode 100644 index 0000000000..7e22a808fd --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Filesystem/Directory.php @@ -0,0 +1,77 @@ +_resource->getParentResource()) instanceof Zend_Tool_Project_Profile_Resource) { + if ((($parentContext = $parentResource->getContext()) instanceof Zend_Tool_Project_Context_Filesystem_Abstract) + && (!$parentContext->exists())) { + $parentResource->create(); + } + } + + if (!file_exists($this->getPath())) { + mkdir($this->getPath()); + } + + return $this; + } + + /** + * delete() + * + * @return Zend_Tool_Project_Context_Filesystem_Directory + */ + public function delete() + { + $this->_resource->setDeleted(true); + rmdir($this->getPath()); + + return $this; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Context/Filesystem/File.php b/lib/zend/Zend/Tool/Project/Context/Filesystem/File.php new file mode 100644 index 0000000000..de4eb4b39b --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Filesystem/File.php @@ -0,0 +1,112 @@ +_resource = $resource; + $this->_resource->setAppendable(false); + return $this; + } + + /** + * create() + * + * @return Zend_Tool_Project_Context_Filesystem_File + */ + public function create() + { + // check to ensure the parent exists, if not, call it and create it + if (($parentResource = $this->_resource->getParentResource()) instanceof Zend_Tool_Project_Profile_Resource) { + if ((($parentContext = $parentResource->getContext()) instanceof Zend_Tool_Project_Context_Filesystem_Abstract) + && (!$parentContext->exists())) { + $parentResource->create(); + } + } + + + if (file_exists($this->getPath())) { + // @todo propt user to determine if its ok to overwrite file + } + + file_put_contents($this->getPath(), $this->getContents()); + return $this; + } + + /** + * delete() + * + * @return Zend_Tool_Project_Context_Filesystem_File + */ + public function delete() + { + unlink($this->getPath()); + $this->_resource->setDeleted(true); + return $this; + } + + /** + * getContents() + * + * @return null + */ + public function getContents() + { + return null; + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Interface.php b/lib/zend/Zend/Tool/Project/Context/Interface.php new file mode 100644 index 0000000000..28c98ede27 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Interface.php @@ -0,0 +1,38 @@ +addContextClass('Zend_Tool_Project_Context_System_ProjectDirectory') + ->addContextClass('Zend_Tool_Project_Context_System_ProjectProfileFile') + ->addContextClass('Zend_Tool_Project_Context_System_ProjectProvidersDirectory'); + self::$_isInitialized = true; + } + } + + public function addContextsFromDirectory($directory, $prefix) + { + $prefix = trim($prefix, '_') . '_'; + foreach (new DirectoryIterator($directory) as $directoryItem) { + if ($directoryItem->isDot() || (substr($directoryItem->getFilename(), -4) !== '.php')) { + continue; + } + $class = $prefix . substr($directoryItem->getFilename(), 0, -4); + $this->addContextClass($class); + } + } + + + public function addContextClass($contextClass) + { + if (!class_exists($contextClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($contextClass); + } + $context = new $contextClass(); + return $this->addContext($context); + } + + /** + * Enter description here... + * + * @param Zend_Tool_Project_Context_Interface $context + * @return Zend_Tool_Project_Context_Repository + */ + public function addContext(Zend_Tool_Project_Context_Interface $context) + { + $isSystem = ($context instanceof Zend_Tool_Project_Context_System_Interface); + $isTopLevel = ($context instanceof Zend_Tool_Project_Context_System_TopLevelRestrictable); + $isOverwritable = !($context instanceof Zend_Tool_Project_Context_System_NotOverwritable); + + $index = (count($this->_contexts)) ? max(array_keys($this->_contexts)) + 1 : 1; + + $normalName = $this->_normalizeName($context->getName()); + + if (isset($this->_shortContextNames[$normalName]) && ($this->_contexts[$this->_shortContextNames[$normalName]]['isOverwritable'] === false) ) { + require_once 'Zend/Tool/Project/Context/Exception.php'; + throw new Zend_Tool_Project_Context_Exception('Context ' . $context->getName() . ' is not overwriteable.'); + } + + $this->_shortContextNames[$normalName] = $index; + $this->_contexts[$index] = array( + 'isTopLevel' => $isTopLevel, + 'isSystem' => $isSystem, + 'isOverwritable' => $isOverwritable, + 'normalName' => $normalName, + 'context' => $context + ); + + return $this; + } + + public function getContext($name) + { + if (!$this->hasContext($name)) { + require_once 'Zend/Tool/Project/Context/Exception.php'; + throw new Zend_Tool_Project_Context_Exception('Context by name ' . $name . ' does not exist in the registry.'); + } + + $name = $this->_normalizeName($name); + return clone $this->_contexts[$this->_shortContextNames[$name]]['context']; + } + + public function hasContext($name) + { + $name = $this->_normalizeName($name); + return (isset($this->_shortContextNames[$name]) ? true : false); + } + + public function isSystemContext($name) + { + if (!$this->hasContext($name)) { + return false; + } + + $name = $this->_normalizeName($name); + $index = $this->_shortContextNames[$name]; + return $this->_contexts[$index]['isSystemContext']; + } + + public function isTopLevelContext($name) + { + if (!$this->hasContext($name)) { + return false; + } + $name = $this->_normalizeName($name); + $index = $this->_shortContextNames[$name]; + return $this->_contexts[$index]['isTopLevel']; + } + + public function isOverwritableContext($name) + { + if (!$this->hasContext($name)) { + return false; + } + $name = $this->_normalizeName($name); + $index = $this->_shortContextNames[$name]; + return $this->_contexts[$index]['isOverwritable']; + } + + public function count() + { + return count($this->_contexts); + } + + protected function _normalizeName($name) + { + return strtolower($name); + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/System/Interface.php b/lib/zend/Zend/Tool/Project/Context/System/Interface.php new file mode 100644 index 0000000000..016f4d8367 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/System/Interface.php @@ -0,0 +1,37 @@ +_resource->getAttribute('path'); + + // if not, get from profile + if ($projectDirectory == null) { + $projectDirectory = $this->_resource->getProfile()->getAttribute('projectDirectory'); + } + + // if not, exception. + if ($projectDirectory == null) { + require_once 'Zend/Tool/Project/Exception.php'; + throw new Zend_Tool_Project_Exception('projectDirectory cannot find the directory for this project.'); + } + + $this->_baseDirectory = rtrim($projectDirectory, '\\/'); + return $this; + } + + /** + * create() + * + * @return Zend_Tool_Project_Context_System_ProjectDirectory + */ + public function create() + { + if (file_exists($this->getPath())) { + /* + foreach (new DirectoryIterator($this->getPath()) as $item) { + if (!$item->isDot()) { + if ($registry->getClient()->isInteractive()) { + // @todo prompt for override + } else { + require_once 'Zend/Tool/Project/Context/Exception.php'; + throw new Zend_Tool_Project_Context_Exception('This directory is not empty, project creation aborted.'); + } + break; + } + } + */ + } + + parent::create(); + return $this; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Context/System/ProjectProfileFile.php b/lib/zend/Zend/Tool/Project/Context/System/ProjectProfileFile.php new file mode 100644 index 0000000000..9499a37d4e --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/System/ProjectProfileFile.php @@ -0,0 +1,118 @@ +_profile = $profile; + return $this; + } + + /** + * save() + * + * Proxy to create + * + * @return Zend_Tool_Project_Context_System_ProjectProfileFile + */ + public function save() + { + parent::create(); + return $this; + } + + /** + * getContents() + * + * @return string + */ + public function getContents() + { + $parser = new Zend_Tool_Project_Profile_FileParser_Xml(); + $profile = $this->_resource->getProfile(); + $xml = $parser->serialize($profile); + return $xml; + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/System/ProjectProvidersDirectory.php b/lib/zend/Zend/Tool/Project/Context/System/ProjectProvidersDirectory.php new file mode 100644 index 0000000000..c4b2f223e3 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/System/ProjectProvidersDirectory.php @@ -0,0 +1,97 @@ +getPath())) { + + foreach (new DirectoryIterator($this->getPath()) as $item) { + if ($item->isFile()) { + $loadableFiles[] = $item->getPathname(); + } + } + + if ($loadableFiles) { + + // @todo process and add the files to the system for usage. + + } + } + + return $this; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Context/System/TopLevelRestrictable.php b/lib/zend/Zend/Tool/Project/Context/System/TopLevelRestrictable.php new file mode 100644 index 0000000000..dae9037266 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/System/TopLevelRestrictable.php @@ -0,0 +1,37 @@ +_actionName = $this->_resource->getAttribute('actionName'); + + $this->_resource->setAppendable(false); + $this->_controllerResource = $this->_resource->getParentResource(); + if (!$this->_controllerResource->getContext() instanceof Zend_Tool_Project_Context_Zf_ControllerFile) { + require_once 'Zend/Tool/Project/Context/Exception.php'; + throw new Zend_Tool_Project_Context_Exception('ActionMethod must be a sub resource of a ControllerFile'); + } + // make the ControllerFile node appendable so we can tack on the actionMethod. + $this->_resource->getParentResource()->setAppendable(true); + + $this->_controllerPath = $this->_controllerResource->getContext()->getPath(); + + /* + * This code block is now commented, its doing to much for init() + * + if ($this->_controllerPath != '' && self::hasActionMethod($this->_controllerPath, $this->_actionName)) { + require_once 'Zend/Tool/Project/Context/Exception.php'; + throw new Zend_Tool_Project_Context_Exception('An action named ' . $this->_actionName . 'Action already exists in this controller'); + } + */ + + return $this; + } + + /** + * getPersistentAttributes + * + * @return array + */ + public function getPersistentAttributes() + { + return array( + 'actionName' => $this->getActionName() + ); + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return 'ActionMethod'; + } + + /** + * setResource() + * + * @param Zend_Tool_Project_Profile_Resource $resource + * @return Zend_Tool_Project_Context_Zf_ActionMethod + */ + public function setResource(Zend_Tool_Project_Profile_Resource $resource) + { + $this->_resource = $resource; + return $this; + } + + /** + * setActionName() + * + * @param string $actionName + * @return Zend_Tool_Project_Context_Zf_ActionMethod + */ + public function setActionName($actionName) + { + $this->_actionName = $actionName; + return $this; + } + + /** + * getActionName() + * + * @return string + */ + public function getActionName() + { + return $this->_actionName; + } + + /** + * create() + * + * @return Zend_Tool_Project_Context_Zf_ActionMethod + */ + public function create() + { + if (self::createActionMethod($this->_controllerPath, $this->_actionName) === false) { + require_once 'Zend/Tool/Project/Context/Exception.php'; + throw new Zend_Tool_Project_Context_Exception( + 'Could not create action within controller ' . $this->_controllerPath + . ' with action name ' . $this->_actionName + ); + } + return $this; + } + + /** + * delete() + * + * @return Zend_Tool_Project_Context_Zf_ActionMethod + */ + public function delete() + { + // @todo do this + return $this; + } + + /** + * createAcionMethod() + * + * @param string $controllerPath + * @param string $actionName + * @param string $body + * @return true + */ + public static function createActionMethod($controllerPath, $actionName, $body = ' // action body') + { + if (!file_exists($controllerPath)) { + return false; + } + + $controllerCodeGenFile = Zend_CodeGenerator_Php_File::fromReflectedFileName($controllerPath, true, true); + $controllerCodeGenFile->getClass()->setMethod(array( + 'name' => $actionName . 'Action', + 'body' => $body + )); + + file_put_contents($controllerPath, $controllerCodeGenFile->generate()); + return true; + } + + /** + * hasActionMethod() + * + * @param string $controllerPath + * @param string $actionName + * @return bool + */ + public static function hasActionMethod($controllerPath, $actionName) + { + if (!file_exists($controllerPath)) { + return false; + } + + $controllerCodeGenFile = Zend_CodeGenerator_Php_File::fromReflectedFileName($controllerPath, true, true); + return $controllerCodeGenFile->getClass()->hasMethod($actionName . 'Action'); + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/ApisDirectory.php b/lib/zend/Zend/Tool/Project/Context/Zf/ApisDirectory.php new file mode 100644 index 0000000000..d69e8b11cf --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/ApisDirectory.php @@ -0,0 +1,57 @@ +_type = $this->_resource->getAttribute('type'); + parent::init(); + return $this; + } + + /** + * getPersistentAttributes() + * + * @return array + */ + public function getPersistentAttributes() + { + return array('type' => $this->_type); + } + + /** + * getContents() + * + * @return string + */ + public function getContents() + { + $contents =<<_resource->getProfile()->search('ApplicationConfigFile'); + $applicationDirectory = $this->_resource->getProfile()->search('ApplicationDirectory'); + + if (($applicationConfigFile === false) || ($applicationDirectory === false)) { + throw new Exception('To use the BootstrapFile context, your project requires the use of both the "ApplicationConfigFile" and "ApplicationDirectory" contexts.'); + } + + if ($applicationConfigFile->getContext()->exists()) { + define('APPLICATION_PATH', $applicationDirectory->getPath()); + $applicationOptions = array(); + $applicationOptions['config'] = $applicationConfigFile->getPath(); + + $this->_applicationInstance = new Zend_Application( + 'development', + $applicationOptions + ); + } + } + + /** + * getContents() + * + * @return array + */ + public function getContents() + { + $codeGenFile = new Zend_CodeGenerator_Php_File(array( + 'classes' => array( + new Zend_CodeGenerator_Php_Class(array( + 'name' => 'Bootstrap', + 'extendedClass' => 'Zend_Application_Bootstrap_Bootstrap', + )), + ) + )); + + return $codeGenFile->generate(); + } +} diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/CacheDirectory.php b/lib/zend/Zend/Tool/Project/Context/Zf/CacheDirectory.php new file mode 100644 index 0000000000..4210d1fb70 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/CacheDirectory.php @@ -0,0 +1,57 @@ +_controllerName = $this->_resource->getAttribute('controllerName'); + $this->_filesystemName = ucfirst($this->_controllerName) . 'Controller.php'; + parent::init(); + return $this; + } + + /** + * getPersistentAttributes + * + * @return array + */ + public function getPersistentAttributes() + { + return array( + 'controllerName' => $this->getControllerName() + ); + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return 'ControllerFile'; + } + + /** + * getControllerName() + * + * @return string + */ + public function getControllerName() + { + return $this->_controllerName; + } + + /** + * getContents() + * + * @return string + */ + public function getContents() + { + + $filter = new Zend_Filter_Word_DashToCamelCase(); + + $className = $filter->filter($this->_controllerName) . 'Controller'; + + $codeGenFile = new Zend_CodeGenerator_Php_File(array( + 'fileName' => $this->getPath(), + 'classes' => array( + new Zend_CodeGenerator_Php_Class(array( + 'name' => $className, + 'extendedClass' => 'Zend_Controller_Action', + 'methods' => array( + new Zend_CodeGenerator_Php_Method(array( + 'name' => 'init', + 'body' => '/* Initialize action controller here */', + )) + ) + )) + ) + )); + + + if ($className == 'ErrorController') { + + $codeGenFile = new Zend_CodeGenerator_Php_File(array( + 'fileName' => $this->getPath(), + 'classes' => array( + new Zend_CodeGenerator_Php_Class(array( + 'name' => $className, + 'extendedClass' => 'Zend_Controller_Action', + 'methods' => array( + new Zend_CodeGenerator_Php_Method(array( + 'name' => 'errorAction', + 'body' => <<_getParam('error_handler'); + +switch (\$errors->type) { + case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: + case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: + + // 404 error -- controller or action not found + \$this->getResponse()->setHttpResponseCode(404); + \$this->view->message = 'Page not found'; + break; + default: + // application error + \$this->getResponse()->setHttpResponseCode(500); + \$this->view->message = 'Application error'; + break; +} + +\$this->view->exception = \$errors->exception; +\$this->view->request = \$errors->request; +EOS + )) + ) + )) + ) + )); + + } + + // store the generator into the registry so that the addAction command can use the same object later + Zend_CodeGenerator_Php_File::registerFileCodeGenerator($codeGenFile); // REQUIRES filename to be set + return $codeGenFile->generate(); + } + + /** + * addAction() + * + * @param string $actionName + */ + public function addAction($actionName) + { + $class = $this->getCodeGenerator(); + $class->setMethod(array('name' => $actionName . 'Action', 'body' => ' // action body here')); + file_put_contents($this->getPath(), $codeGenFile->generate()); + } + + /** + * getCodeGenerator() + * + * @return Zend_CodeGenerator_Php_Class + */ + public function getCodeGenerator() + { + $codeGenFile = Zend_CodeGenerator_Php_File::fromReflectedFileName($this->getPath()); + $codeGenFileClasses = $codeGenFile->getClasses(); + $class = array_shift($codeGenFileClasses); + return $class; + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/ControllersDirectory.php b/lib/zend/Zend/Tool/Project/Context/Zf/ControllersDirectory.php new file mode 100644 index 0000000000..2de84cd0e3 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/ControllersDirectory.php @@ -0,0 +1,57 @@ + $this->_dbTableName); + } + + public function setDbTableName($dbTableName) + { + $this->_dbTableName = $dbTableName; + $this->_filesystemName = $dbTableName . '.php'; + } + + public function getDbTableName() + { + return $this->_dbTableName; + } + */ + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/FormFile.php b/lib/zend/Zend/Tool/Project/Context/Zf/FormFile.php new file mode 100644 index 0000000000..5a5960638f --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/FormFile.php @@ -0,0 +1,52 @@ +_filesystemName = $this->_moduleName = $this->_resource->getAttribute('moduleName'); + parent::init(); + return $this; + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return 'ModuleDirectory'; + } + + /** + * getPersistentAttributes + * + * @return array + */ + public function getPersistentAttributes() + { + return array( + 'moduleName' => $this->getModuleName() + ); + } + + /** + * getModuleName() + * + * @return string + */ + public function getModuleName() + { + return $this->_moduleName; + } + + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/ModulesDirectory.php b/lib/zend/Zend/Tool/Project/Context/Zf/ModulesDirectory.php new file mode 100644 index 0000000000..36b0366390 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/ModulesDirectory.php @@ -0,0 +1,57 @@ +_projectProviderName = $this->_resource->getAttribute('projectProviderName'); + $this->_actionNames = $this->_resource->getAttribute('actionNames'); + $this->_filesystemName = ucfirst($this->_projectProviderName) . 'Provider.php'; + + if (strpos($this->_actionNames, ',')) { + $this->_actionNames = explode(',', $this->_actionNames); + } else { + $this->_actionNames = ($this->_actionNames) ? array($this->_actionNames) : array(); + } + + parent::init(); + return $this; + } + + /** + * getPersistentAttributes() + * + * @return array + */ + public function getPersistentAttributes() + { + return array( + 'projectProviderName' => $this->getProjectProviderName(), + 'actionNames' => implode(',', $this->_actionNames) + ); + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return 'ProjectProviderFile'; + } + + /** + * getProjectProviderName() + * + * @return string + */ + public function getProjectProviderName() + { + return $this->_projectProviderName; + } + + /** + * getContents() + * + * @return string + */ + public function getContents() + { + + $filter = new Zend_Filter_Word_DashToCamelCase(); + + $className = $filter->filter($this->_projectProviderName) . 'Provider'; + + $class = new Zend_CodeGenerator_Php_Class(array( + 'name' => $className, + 'extendedClass' => 'Zend_Tool_Project_Provider_Abstract' + )); + + $methods = array(); + foreach ($this->_actionNames as $actionName) { + $methods[] = new Zend_CodeGenerator_Php_Method(array( + 'name' => $actionName, + 'body' => ' /** @todo Implementation */' + )); + } + + if ($methods) { + $class->setMethods($methods); + } + + $codeGenFile = new Zend_CodeGenerator_Php_File(array( + 'requiredFiles' => array( + 'Zend/Tool/Project/Provider/Abstract.php', + 'Zend/Tool/Project/Provider/Exception.php' + ), + 'classes' => array($class) + )); + + return $codeGenFile->generate(); + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/PublicDirectory.php b/lib/zend/Zend/Tool/Project/Context/Zf/PublicDirectory.php new file mode 100644 index 0000000000..66d6726d10 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/PublicDirectory.php @@ -0,0 +1,57 @@ + <<bootstrap() + ->run(); +EOS + )); + return $codeGenerator->generate(); + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/PublicScriptsDirectory.php b/lib/zend/Zend/Tool/Project/Context/Zf/PublicScriptsDirectory.php new file mode 100644 index 0000000000..0fdce8e71b --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/PublicScriptsDirectory.php @@ -0,0 +1,57 @@ +_forControllerName = $this->_resource->getAttribute('forControllerName'); + $this->_filesystemName = ucfirst($this->_forControllerName) . 'ControllerTest.php'; + parent::init(); + return $this; + } + + /** + * getContents() + * + * @return string + */ + public function getContents() + { + + $filter = new Zend_Filter_Word_DashToCamelCase(); + + $className = $filter->filter($this->_forControllerName) . 'ControllerTest'; + + $codeGenFile = new Zend_CodeGenerator_Php_File(array( + 'requiredFiles' => array( + 'PHPUnit/Framework/TestCase.php' + ), + 'classes' => array( + new Zend_CodeGenerator_Php_Class(array( + 'name' => $className, + 'extendedClass' => 'PHPUnit_Framework_TestCase', + 'methods' => array( + new Zend_CodeGenerator_Php_Method(array( + 'name' => 'setUp', + 'body' => ' /* Setup Routine */' + )), + new Zend_CodeGenerator_Php_Method(array( + 'name' => 'tearDown', + 'body' => ' /* Tear Down Routine */' + )) + ) + )) + ) + )); + + return $codeGenFile->generate(); + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/TestApplicationDirectory.php b/lib/zend/Zend/Tool/Project/Context/Zf/TestApplicationDirectory.php new file mode 100644 index 0000000000..8c23c04efa --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/TestApplicationDirectory.php @@ -0,0 +1,57 @@ +_forClassName = $this->_resource->getAttribute('forClassName'); + $this->_filesystemName = ucfirst(ltrim(strrchr($this->_forClassName, '_'), '_')) . 'Test.php'; + parent::init(); + return $this; + } + + /** + * getContents() + * + * @return string + */ + public function getContents() + { + + $filter = new Zend_Filter_Word_DashToCamelCase(); + + $className = $filter->filter($this->_forClassName) . 'Test'; + + $codeGenFile = new Zend_CodeGenerator_Php_File(array( + 'requiredFiles' => array( + 'PHPUnit/Framework/TestCase.php' + ), + 'classes' => array( + new Zend_CodeGenerator_Php_Class(array( + 'name' => $className, + 'extendedClass' => 'PHPUnit_Framework_TestCase', + 'methods' => array( + new Zend_CodeGenerator_Php_Method(array( + 'name' => 'setUp', + 'body' => ' /* Setup Routine */' + )), + new Zend_CodeGenerator_Php_Method(array( + 'name' => 'tearDown', + 'body' => ' /* Tear Down Routine */' + )) + ) + )) + ) + )); + + return $codeGenFile->generate(); + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/TestLibraryNamespaceDirectory.php b/lib/zend/Zend/Tool/Project/Context/Zf/TestLibraryNamespaceDirectory.php new file mode 100644 index 0000000000..81e4104c58 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/TestLibraryNamespaceDirectory.php @@ -0,0 +1,88 @@ +_namespaceName = $this->_resource->getAttribute('namespaceName'); + $this->_filesystemName = $this->_namespaceName; + parent::init(); + return $this; + } + + /** + * getPersistentAttributes() + * + * @return array + */ + public function getPersistentAttributes() + { + $attributes = array(); + $attributes['namespaceName'] = $this->_namespaceName; + + return $attributes; + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/TestPHPUnitConfigFile.php b/lib/zend/Zend/Tool/Project/Context/Zf/TestPHPUnitConfigFile.php new file mode 100644 index 0000000000..1838ad0649 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/TestPHPUnitConfigFile.php @@ -0,0 +1,57 @@ +_forControllerName = $this->_resource->getAttribute('forControllerName'); + $this->_filesystemName = $this->_forControllerName; + parent::init(); + return $this; + } + + /** + * getPersistentAttributes() + * + * @return array + */ + public function getPersistentAttributes() + { + return array( + 'forControllerName' => $this->_forControllerName + ); + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return 'ViewControllerScriptsDirectory'; + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/ViewFiltersDirectory.php b/lib/zend/Zend/Tool/Project/Context/Zf/ViewFiltersDirectory.php new file mode 100644 index 0000000000..2103bfa963 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/ViewFiltersDirectory.php @@ -0,0 +1,57 @@ +_resource->getAttribute('forActionName')) { + $this->_forActionName = $forActionName; + $this->_filesystemName = $forActionName . '.phtml'; + } elseif ($scriptName = $this->_resource->getAttribute('scriptName')) { + $this->_scriptName = $scriptName; + $this->_filesystemName = $scriptName . '.phtml'; + } else { + throw new Exception('Either a forActionName or scriptName is required.'); + } + + parent::init(); + return $this; + } + + /** + * getPersistentAttributes() + * + * @return unknown + */ + public function getPersistentAttributes() + { + $attributes = array(); + + if ($this->_forActionName) { + $attributes['forActionName'] = $this->_forActionName; + } + + if ($this->_scriptName) { + $attributes['scriptName'] = $this->_scriptName; + } + + return $attributes; + } + + /** + * getContents() + * + * @return string + */ + public function getContents() + { + $contents = ''; + + if ($this->_filesystemName == 'error.phtml') { // should also check that the above directory is forController=error + $contents .= << + + + + Zend Framework Default Application + + +

      An error occurred

      +

      message ?>

      + + + +

      Exception information:

      +

      + Message: exception->getMessage() ?> +

      + +

      Stack trace:

      +
      exception->getTraceAsString() ?>
      +  
      + +

      Request Parameters:

      +
      request->getParams(), true) ?>
      +  
      + + + + + +EOS; + } elseif ($this->_forActionName == 'index' && $this->_resource->getParentResource()->getAttribute('forControllerName') == 'index') { + + $contents =<< + a:link, + a:visited + { + color: #0398CA; + } + + span#zf-name + { + color: #91BE3F; + } + + div#welcome + { + color: #FFFFFF; + background-image: url(http://framework.zend.com/images/bkg_header.jpg); + width: 600px; + height: 400px; + border: 2px solid #444444; + overflow: hidden; + text-align: center; + } + + div#more-information + { + background-image: url(http://framework.zend.com/images/bkg_body-bottom.gif); + height: 100%; + } + +
      +

      Welcome to the Zend Framework!

      + +

      This is your project's main page

      + +
      +

      +

      + Helpful Links:
      + Zend Framework Website | + Zend Framework Manual +

      +
      +
      +EOS; + + } else { + $contents = '

      View script for controller ' . $this->_resource->getParentResource()->getAttribute('forControllerName') . '' + . ' and script/action name ' . $this->_forActionName . '
      '; + } + return $contents; + } + +} diff --git a/lib/zend/Zend/Tool/Project/Context/Zf/ViewScriptsDirectory.php b/lib/zend/Zend/Tool/Project/Context/Zf/ViewScriptsDirectory.php new file mode 100644 index 0000000000..1d19563826 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Context/Zf/ViewScriptsDirectory.php @@ -0,0 +1,57 @@ +_getZfPath(); + if ($zfPath != false) { + $zfIterator = new RecursiveDirectoryIterator($zfPath); + foreach ($rii = new RecursiveIteratorIterator($zfIterator, RecursiveIteratorIterator::SELF_FIRST) as $file) { + $relativePath = preg_replace('#^'.preg_quote(realpath($zfPath), '#').'#', '', realpath($file->getPath())) . DIRECTORY_SEPARATOR . $file->getFilename(); + if (strpos($relativePath, DIRECTORY_SEPARATOR . '.') !== false) { + continue; + } + + if ($file->isDir()) { + mkdir($this->getBaseDirectory() . DIRECTORY_SEPARATOR . $this->getFilesystemName() . $relativePath); + } else { + copy($file->getPathname(), $this->getBaseDirectory() . DIRECTORY_SEPARATOR . $this->getFilesystemName() . $relativePath); + } + + } + } + } + + /** + * _getZfPath() + * + * @return string|false + */ + protected function _getZfPath() + { + foreach (explode(PATH_SEPARATOR, get_include_path()) as $includePath) { + + if (!file_exists($includePath) || $includePath[0] == '.') { + continue; + } + + if (realpath($checkedPath = rtrim($includePath, '\\/') . '/Zend/Loader.php') !== false && file_exists($checkedPath)) { + return dirname($checkedPath); + } + } + + return false; + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Exception.php b/lib/zend/Zend/Tool/Project/Exception.php new file mode 100644 index 0000000000..0be228dd82 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Exception.php @@ -0,0 +1,37 @@ +setOptions($options); + } + + $this->_topResources = new Zend_Tool_Project_Profile_Resource_Container(); + } + + /** + * Process options and either set a profile property or + * set a profile 'attribute' + * + * @param array $options + */ + public function setOptions(Array $options) + { + $this->setAttributes($options); + } + + /** + * getIterator() - reqruied by the RecursiveIterator interface + * + * @return RecursiveIteratorIterator + */ + public function getIterator() + { + require_once 'Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php'; + + return new RecursiveIteratorIterator( + new Zend_Tool_Project_Profile_Iterator_EnabledResourceFilter($this), + RecursiveIteratorIterator::SELF_FIRST + ); + } + + /** + * loadFromData() - Load a profile from data provided by the + * 'profilData' attribute + * + */ + public function loadFromData() + { + if (!isset($this->_attributes['profileData'])) { + require_once 'Zend/Tool/Project/Exception.php'; + throw new Zend_Tool_Project_Exception('loadFromData() must have "profileData" set.'); + } + + $profileFileParser = new Zend_Tool_Project_Profile_FileParser_Xml(); + $profileFileParser->unserialize($this->_attributes['profileData'], $this); + + $this->rewind(); + } + + /** + * isLoadableFromFile() - can a profile be loaded from a file + * + * wether or not a profile can be loaded from the + * file in attribute 'projectProfileFile', or from a file named + * '.zfproject.xml' inside a directory in key 'projectDirectory' + * + * @return bool + */ + public function isLoadableFromFile() + { + if (!isset($this->_attributes['projectProfileFile']) && !isset($this->_attributes['projectDirectory'])) { + return false; + } + + if (isset($this->_attributes['projectProfileFile'])) { + $projectProfileFilePath = $this->_attributes['projectProfileFile']; + if (!file_exists($projectProfileFilePath)) { + return false; + } + } else { + $projectProfileFilePath = rtrim($this->_attributes['projectDirectory'], '/\\') . '/.zfproject.xml'; + if (!file_exists($projectProfileFilePath)) { + return false; + } + } + + return true; + } + + /** + * loadFromFile() - Load data from file + * + * this attempts to load a project profile file from a variety of locations depending + * on what information the user provided vie $options or attributes, specifically the + * 'projectDirectory' or 'projectProfileFile' + * + */ + public function loadFromFile() + { + // if no data is supplied, need either a projectProfileFile or a projectDirectory + if (!isset($this->_attributes['projectProfileFile']) && !isset($this->_attributes['projectDirectory'])) { + require_once 'Zend/Tool/Project/Exception.php'; + throw new Zend_Tool_Project_Exception('loadFromFile() must have at least "projectProfileFile" or "projectDirectory" set.'); + } + + if (isset($this->_attributes['projectProfileFile'])) { + $projectProfileFilePath = $this->_attributes['projectProfileFile']; + if (!file_exists($projectProfileFilePath)) { + require_once 'Zend/Tool/Project/Exception.php'; + throw new Zend_Tool_Project_Exception('"projectProfileFile" was supplied but file was not found at location ' . $projectProfileFilePath); + } + $this->_attributes['projectDirectory'] = dirname($projectProfileFilePath); + } else { + $projectProfileFilePath = rtrim($this->_attributes['projectDirectory'], '/\\') . '/.zfproject.xml'; + if (!file_exists($projectProfileFilePath)) { + require_once 'Zend/Tool/Project/Exception.php'; + throw new Zend_Tool_Project_Exception('"projectDirectory" was supplied but no profile file file was not found at location ' . $projectProfileFilePath); + } + $this->_attributes['projectProfileFile'] = $projectProfileFilePath; + } + + $profileData = file_get_contents($projectProfileFilePath); + + $profileFileParser = new Zend_Tool_Project_Profile_FileParser_Xml(); + $profileFileParser->unserialize($profileData, $this); + + $this->rewind(); + } + + /** + * storeToFile() - store the current profile to file + * + * This will store the profile in memory to a place on disk determined by the attributes + * available, specifically if the key 'projectProfileFile' is available + * + */ + public function storeToFile() + { + $file = null; + + if (isset($this->_attributes['projectProfileFile'])) { + $file = $this->_attributes['projectProfileFile']; + } + + if ($file == null) { + require_once 'Zend/Tool/Project/Exception.php'; + throw new Zend_Tool_Project_Exception('storeToFile() must have a "projectProfileFile" attribute set.'); + } + + $parser = new Zend_Tool_Project_Profile_FileParser_Xml(); + $xml = $parser->serialize($this); + file_put_contents($file, $xml); + } + + /** + * storeToData() - create a string representation of the profile in memory + * + * @return string + */ + public function storeToData() + { + $parser = new Zend_Tool_Project_Profile_FileParser_Xml(); + $xml = $parser->serialize($this); + return $xml; + } + + /** + * __toString() - cast this profile to string to be able to view it. + * + * @return string + */ + public function __toString() + { + $string = ''; + foreach ($this as $resource) { + $string .= $resource->getName() . PHP_EOL; + $rii = new RecursiveIteratorIterator($resource, RecursiveIteratorIterator::SELF_FIRST); + foreach ($rii as $item) { + $string .= str_repeat(' ', $rii->getDepth()+1) . $item->getName() + . ((count($attributes = $item->getAttributes()) > 0) ? ' [' . http_build_query($attributes) . ']' : '') + . PHP_EOL; + } + } + return $string; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Profile/Exception.php b/lib/zend/Zend/Tool/Project/Profile/Exception.php new file mode 100644 index 0000000000..d0de1191f0 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Profile/Exception.php @@ -0,0 +1,37 @@ +_contextRepository = Zend_Tool_Project_Context_Repository::getInstance(); + } + + /** + * serialize() + * + * create an xml string from the provided profile + * + * @param Zend_Tool_Project_Profile $profile + * @return string + */ + public function serialize(Zend_Tool_Project_Profile $profile) + { + + $profile = clone $profile; + + $this->_profile = $profile; + $xmlElement = new SimpleXMLElement(''); + + self::_serializeRecurser($profile, $xmlElement); + + $doc = new DOMDocument('1.0'); + $doc->formatOutput = true; + $domnode = dom_import_simplexml($xmlElement); + $domnode = $doc->importNode($domnode, true); + $domnode = $doc->appendChild($domnode); + + return $doc->saveXML(); + } + + /** + * unserialize() + * + * Create a structure in the object $profile from the structure specficied + * in the xml string provided + * + * @param string xml data + * @param Zend_Tool_Project_Profile The profile to use as the top node + * @return Zend_Tool_Project_Profile + */ + public function unserialize($data, Zend_Tool_Project_Profile $profile) + { + if ($data == null) { + throw new Exception('contents not available to unserialize.'); + } + + $this->_profile = $profile; + + $xmlDataIterator = new SimpleXMLIterator($data); + + if ($xmlDataIterator->getName() != 'projectProfile') { + throw new Exception('Profiles must start with a projectProfile node'); + } + + + $this->_unserializeRecurser($xmlDataIterator); + + $this->_lazyLoadContexts(); + + return $this->_profile; + + } + + /** + * _serializeRecurser() + * + * This method will be used to traverse the depths of the structure + * when *serializing* an xml structure into a string + * + * @param array $resources + * @param SimpleXmlElement $xmlNode + */ + protected function _serializeRecurser($resources, SimpleXmlElement $xmlNode) + { + // @todo find a better way to handle concurrency.. if no clone, _position in node gets messed up + //if ($resources instanceof Zend_Tool_Project_Profile_Resource) { + // $resources = clone $resources; + //} + + foreach ($resources as $resource) { + + if ($resource->isDeleted()) { + continue; + } + + $resourceName = $resource->getContext()->getName(); + $resourceName[0] = strtolower($resourceName[0]); + + $newNode = $xmlNode->addChild($resourceName); + + //$reflectionClass = new ReflectionClass($resource->getContext()); + + if ($resource->isEnabled() == false) { + $newNode->addAttribute('enabled', 'false'); + } + + foreach ($resource->getPersistentAttributes() as $paramName => $paramValue) { + $newNode->addAttribute($paramName, $paramValue); + } + + if ($resource->hasChildren()) { + self::_serializeRecurser($resource, $newNode); + } + + } + + } + + + /** + * _unserializeRecurser() + * + * This method will be used to traverse the depths of the structure + * as needed to *unserialize* the profile from an xmlIterator + * + * @param SimpleXMLIterator $xmlIterator + * @param Zend_Tool_Project_Profile_Resource $resource + */ + protected function _unserializeRecurser(SimpleXMLIterator $xmlIterator, Zend_Tool_Project_Profile_Resource $resource = null) + { + + foreach ($xmlIterator as $resourceName => $resourceData) { + + $contextName = $resourceName; + $subResource = new Zend_Tool_Project_Profile_Resource($contextName); + $subResource->setProfile($this->_profile); + + if ($resourceAttributes = $resourceData->attributes()) { + $attributes = array(); + foreach ($resourceAttributes as $attrName => $attrValue) { + $attributes[$attrName] = (string) $attrValue; + } + $subResource->setAttributes($attributes); + } + + if ($resource) { + $resource->append($subResource, false); + } else { + $this->_profile->append($subResource); + } + + if ($this->_contextRepository->isOverwritableContext($contextName) == false) { + $subResource->initializeContext(); + } + + if ($xmlIterator->hasChildren()) { + self::_unserializeRecurser($xmlIterator->getChildren(), $subResource); + } + } + } + + /** + * _lazyLoadContexts() + * + * This method will call initializeContext on the resources in a profile + * @todo determine if this method belongs inside the profile + * + */ + protected function _lazyLoadContexts() + { + + foreach ($this->_profile as $topResource) { + $rii = new RecursiveIteratorIterator($topResource, RecursiveIteratorIterator::SELF_FIRST); + foreach ($rii as $resource) { + $resource->initializeContext(); + } + } + + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Profile/Iterator/ContextFilter.php b/lib/zend/Zend/Tool/Project/Profile/Iterator/ContextFilter.php new file mode 100644 index 0000000000..8c4df75056 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Profile/Iterator/ContextFilter.php @@ -0,0 +1,203 @@ +_rawOptions = $options; + if ($options) { + $this->setOptions($options); + } + } + + /** + * setOptions() + * + * @param array $options + */ + public function setOptions(Array $options) + { + foreach ($options as $optionName => $optionValue) { + if (substr($optionName, -1, 1) != 's') { + $optionName .= 's'; + } + if (method_exists($this, 'set' . $optionName)) { + $this->{'set' . $optionName}($optionValue); + } + } + } + + /** + * setAcceptTypes() + * + * @param array|string $acceptTypes + * @return Zend_Tool_Project_Profile_Iterator_ContextFilter + */ + public function setAcceptTypes($acceptTypes) + { + if (!is_array($acceptTypes)) { + $acceptTypes = array($acceptTypes); + } + + $this->_acceptTypes = $acceptTypes; + return $this; + } + + /** + * setDenyTypes() + * + * @param array|string $denyTypes + * @return Zend_Tool_Project_Profile_Iterator_ContextFilter + */ + public function setDenyTypes($denyTypes) + { + if (!is_array($denyTypes)) { + $denyTypes = array($denyTypes); + } + + $this->_denyTypes = $denyTypes; + return $this; + } + + /** + * setAcceptNames() + * + * @param array|string $acceptNames + * @return Zend_Tool_Project_Profile_Iterator_ContextFilter + */ + public function setAcceptNames($acceptNames) + { + if (!is_array($acceptNames)) { + $acceptNames = array($acceptNames); + } + + $this->_acceptNames = $acceptNames; + return $this; + } + + /** + * setDenyNames() + * + * @param array|string $denyNames + * @return Zend_Tool_Project_Profile_Iterator_ContextFilter + */ + public function setDenyNames($denyNames) + { + if (!is_array($denyNames)) { + $denyNames = array($denyNames); + } + + $this->_denyNames = $denyNames; + return $this; + } + + /** + * accept() is required by teh RecursiveFilterIterator + * + * @return bool + */ + public function accept() + { + $currentItem = $this->current(); + + if (in_array($currentItem->getName(), $this->_acceptNames)) { + return true; + } elseif (in_array($currentItem->getName(), $this->_denyNames)) { + return false; + } + + foreach ($this->_acceptTypes as $acceptType) { + if ($currentItem->getContent() instanceof $acceptType) { + return true; + } + } + + foreach ($this->_denyTypes as $denyType) { + if ($currentItem->getContext() instanceof $denyType) { + return false; + } + } + + return true; + } + + /** + * getChildren() + * + * This is here due to a bug/design issue in PHP + * @link + * + * @return unknown + */ + function getChildren() + { + + if (empty($this->ref)) { + $this->ref = new ReflectionClass($this); + } + + return $this->ref->newInstance($this->getInnerIterator()->getChildren(), $this->_rawOptions); + } + +} diff --git a/lib/zend/Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php b/lib/zend/Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php new file mode 100644 index 0000000000..285e686998 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php @@ -0,0 +1,43 @@ +current()->isEnabled(); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Profile/Resource.php b/lib/zend/Zend/Tool/Project/Profile/Resource.php new file mode 100644 index 0000000000..605c08d5bc --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Profile/Resource.php @@ -0,0 +1,262 @@ +setContext($context); + } + + /** + * setContext() + * + * @param string|Zend_Tool_Project_Context_Interface $context + * @return Zend_Tool_Project_Profile_Resource + */ + public function setContext($context) + { + $this->_context = $context; + return $this; + } + + /** + * getContext() + * + * @return Zend_Tool_Project_Context_Interface + */ + public function getContext() + { + return $this->_context; + } + + /** + * getName() - Get the resource name + * + * Name is derived from the context name + * + * @return string + */ + public function getName() + { + if (is_string($this->_context)) { + return $this->_context; + } elseif ($this->_context instanceof Zend_Tool_Project_Context_Interface) { + return $this->_context->getName(); + } else { + throw new Zend_Tool_Project_Exception('Invalid context in resource'); + } + } + + /** + * setProfile() + * + * @param Zend_Tool_Project_Profile $profile + * @return Zend_Tool_Project_Profile_Resource + */ + public function setProfile(Zend_Tool_Project_Profile $profile) + { + $this->_profile = $profile; + return $this; + } + + /** + * getProfile + * + * @return Zend_Tool_Project_Profile + */ + public function getProfile() + { + return $this->_profile; + } + + /** + * getPersistentAttributes() + * + * @return array + */ + public function getPersistentAttributes() + { + if (method_exists($this->_context, 'getPersistentAttributes')) { + return $this->_context->getPersistentAttributes(); + } + + return array(); + } + + /** + * setEnabled() + * + * @param bool $enabled + * @return Zend_Tool_Project_Profile_Resource + */ + public function setEnabled($enabled = true) + { + // convert fuzzy types to bool + $this->_enabled = (!in_array($enabled, array('false', 'disabled', 0, -1, false), true)) ? true : false; + return $this; + } + + /** + * isEnabled() + * + * @return bool + */ + public function isEnabled() + { + return $this->_enabled; + } + + /** + * setDeleted() + * + * @param bool $deleted + * @return Zend_Tool_Project_Profile_Resource + */ + public function setDeleted($deleted = true) + { + $this->_deleted = (bool) $deleted; + return $this; + } + + /** + * isDeleted() + * + * @return Zend_Tool_Project_Profile_Resource + */ + public function isDeleted() + { + return $this->_deleted; + } + + /** + * initializeContext() + * + * @return Zend_Tool_Project_Profile_Resource + */ + public function initializeContext() + { + if ($this->_isContextInitialized) { + return; + } + if (is_string($this->_context)) { + $this->_context = Zend_Tool_Project_Context_Repository::getInstance()->getContext($this->_context); + } + + if (method_exists($this->_context, 'setResource')) { + $this->_context->setResource($this); + } + + if (method_exists($this->_context, 'init')) { + $this->_context->init(); + } + + $this->_isContextInitialized = true; + return $this; + } + + /** + * __toString() + * + * @return string + */ + public function __toString() + { + return $this->_context->getName(); + } + + /** + * __call() + * + * @param string $method + * @param array $arguments + * @return Zend_Tool_Project_Profile_Resource + */ + public function __call($method, $arguments) + { + if (method_exists($this->_context, $method)) { + if (!$this->isEnabled()) { + $this->setEnabled(true); + } + return call_user_func_array(array($this->_context, $method), $arguments); + } else { + throw new Zend_Tool_Project_Profile_Exception('cannot call ' . $method); + } + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Profile/Resource/Container.php b/lib/zend/Zend/Tool/Project/Profile/Resource/Container.php new file mode 100644 index 0000000000..1e3480965a --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Profile/Resource/Container.php @@ -0,0 +1,405 @@ + + * + * + * + * @param Zend_Tool_Project_Profile_Resource_SearchConstraints|string|array $searchParameters + * @return Zend_Tool_Project_Profile_Resource + */ + public function search($matchSearchConstraints, $nonMatchSearchConstraints = null) + { + if (!$matchSearchConstraints instanceof Zend_Tool_Project_Profile_Resource_SearchConstraints) { + $matchSearchConstraints = new Zend_Tool_Project_Profile_Resource_SearchConstraints($matchSearchConstraints); + } + + $this->rewind(); + + /** + * @todo This should be re-written with better support for a filter iterator, its the way to go + */ + + if ($nonMatchSearchConstraints) { + $filterIterator = new Zend_Tool_Project_Profile_Iterator_ContextFilter($this, array('denyNames' => $nonMatchSearchConstraints)); + $riIterator = new RecursiveIteratorIterator($filterIterator, RecursiveIteratorIterator::SELF_FIRST); + } else { + $riIterator = new RecursiveIteratorIterator($this, RecursiveIteratorIterator::SELF_FIRST); + } + + $foundResource = false; + $currentConstraint = $matchSearchConstraints->getConstraint(); + $foundDepth = 0; + + foreach ($riIterator as $currentResource) { + + // if current depth is less than found depth, end + if ($riIterator->getDepth() < $foundDepth) { + break; + } + + if (strtolower($currentResource->getName()) == strtolower($currentConstraint->name)) { + + $paramsMatch = true; + + // @todo check to ensure params match (perhaps) + if (count($currentConstraint->params) > 0) { + $currentResourceAttributes = $currentResource->getAttributes(); + if (!is_array($currentConstraint->params)) { + require_once 'Zend/Tool/Project/Profile/Exception.php'; + throw new Zend_Tool_Project_Profile_Exception('Search parameter specifics must be in the form of an array for key "' + . $currentConstraint->name .'"'); + } + foreach ($currentConstraint->params as $paramName => $paramValue) { + if (!isset($currentResourceAttributes[$paramName]) || $currentResourceAttributes[$paramName] != $paramValue) { + $paramsMatch = false; + break; + } + } + } + + if ($paramsMatch) { + $foundDepth = $riIterator->getDepth(); + + if (($currentConstraint = $matchSearchConstraints->getConstraint()) == null) { + $foundResource = $currentResource; + break; + } + } + + } + + } + + return $foundResource; + } + + /** + * createResourceAt() + * + * @param array|Zend_Tool_Project_Profile_Resource_SearchConstraints $appendResourceOrSearchConstraints + * @param string $context + * @param array $attributes + * @return Zend_Tool_Project_Profile_Resource + */ + public function createResourceAt($appendResourceOrSearchConstraints, $context, Array $attributes = array()) + { + if (!$appendResourceOrSearchConstraints instanceof Zend_Tool_Project_Profile_Resource_Container) { + if (($parentResource = $this->search($appendResourceOrSearchConstraints)) == false) { + require_once 'Zend/Tool/Project/Profile/Exception.php'; + throw new Zend_Tool_Project_Profile_Exception('No node was found to append to.'); + } + } else { + $parentResource = $appendResourceOrSearchConstraints; + } + + return $parentResource->createResource($context, $attributes); + } + + /** + * createResource() + * + * Method to create a resource with a given context with specific attributes + * + * @param string $context + * @param array $attributes + * @return Zend_Tool_Project_Profile_Resource + */ + public function createResource($context, Array $attributes = array()) + { + if (is_string($context)) { + $contextRegistry = Zend_Tool_Project_Context_Repository::getInstance(); + if ($contextRegistry->hasContext($context)) { + $context = $contextRegistry->getContext($context); + } else { + require_once 'Zend/Tool/Project/Profile/Exception.php'; + throw new Zend_Tool_Project_Profile_Exception('Context by name ' . $context . ' was not found in the context registry.'); + } + } elseif (!$context instanceof Zend_Tool_Project_Context_Interface) { + require_once 'Zend/Tool/Project/Profile/Exception.php'; + throw new Zend_Tool_Project_Profile_Exception('Context must be of type string or Zend_Tool_Project_Context_Interface.'); + } + + $newResource = new Zend_Tool_Project_Profile_Resource($context); + + if ($attributes) { + $newResource->setAttributes($attributes); + } + + /** + * Interesting logic here: + * + * First set the parentResource (this will also be done inside append). This will allow + * the initialization routine to change the appendability of the parent resource. This + * is important to allow specific resources to be appendable by very specific sub-resources. + */ + $newResource->setParentResource($this); + $newResource->initializeContext(); + $this->append($newResource); + + return $newResource; + } + + /** + * setAttributes() + * + * persist the attributes if the resource will accept them + * + * @param array $attributes + * @return Zend_Tool_Project_Profile_Resource_Container + */ + public function setAttributes(Array $attributes) + { + foreach ($attributes as $attrName => $attrValue) { + $setMethod = 'set' . $attrName; + if (method_exists($this, $setMethod)) { + $this->{$setMethod}($attrValue); + } else { + $this->setAttribute($attrName, $attrValue); + } + } + return $this; + } + + /** + * getAttributes() + * + * @return array + */ + public function getAttributes() + { + return $this->_attributes; + } + + /** + * setAttribute() + * + * @param string $name + * @param mixed $value + * @return Zend_Tool_Project_Profile_Resource_Container + */ + public function setAttribute($name, $value) + { + $this->_attributes[$name] = $value; + return $this; + } + + /** + * getAttribute() + * + * @param string $name + * @return Zend_Tool_Project_Profile_Resource_Container + */ + public function getAttribute($name) + { + return (array_key_exists($name, $this->_attributes)) ? $this->_attributes[$name] : null; + } + + /** + * setAppendable() + * + * @param bool $appendable + * @return Zend_Tool_Project_Profile_Resource_Container + */ + public function setAppendable($appendable) + { + $this->_appendable = (bool) $appendable; + return $this; + } + + /** + * isAppendable() + * + * @return bool + */ + public function isAppendable() + { + return $this->_appendable; + } + + /** + * setParentResource() + * + * @param Zend_Tool_Project_Profile_Resource_Container $parentResource + * @return Zend_Tool_Project_Profile_Resource_Container + */ + public function setParentResource(Zend_Tool_Project_Profile_Resource_Container $parentResource) + { + $this->_parentResource = $parentResource; + return $this; + } + + /** + * getParentResource() + * + * @return Zend_Tool_Project_Profile_Resource_Container + */ + public function getParentResource() + { + return $this->_parentResource; + } + + /** + * append() + * + * @param Zend_Tool_Project_Profile_Resource_Container $resource + * @return Zend_Tool_Project_Profile_Resource_Container + */ + public function append(Zend_Tool_Project_Profile_Resource_Container $resource) + { + if (!$this->isAppendable()) { + throw new Exception('Resource by name ' . (string) $this . ' is not appendable'); + } + array_push($this->_subResources, $resource); + $resource->setParentResource($this); + + return $this; + } + + /** + * current() - required by RecursiveIterator + * + * @return Zend_Tool_Project_Profile_Resource + */ + public function current() + { + return current($this->_subResources); + } + + /** + * key() - required by RecursiveIterator + * + * @return int + */ + public function key() + { + return key($this->_subResources); + } + + /** + * next() - required by RecursiveIterator + * + * @return bool + */ + public function next() + { + return next($this->_subResources); + } + + /** + * rewind() - required by RecursiveIterator + * + * @return bool + */ + public function rewind() + { + return reset($this->_subResources); + } + + /** + * valid() - - required by RecursiveIterator + * + * @return bool + */ + public function valid() + { + return (bool) $this->current(); + } + + /** + * hasChildren() + * + * @return bool + */ + public function hasChildren() + { + return (count($this->_subResources > 0)) ? true : false; + } + + /** + * getChildren() + * + * @return array + */ + public function getChildren() + { + return $this->current(); + } + + /** + * count() + * + * @return int + */ + public function count() + { + return count($this->_subResources); + } + + /** + * __clone() + * + */ + public function __clone() + { + $this->rewind(); + foreach ($this->_subResources as $index => $resource) { + $this->_subResources[$index] = clone $resource; + } + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Profile/Resource/SearchConstraints.php b/lib/zend/Zend/Tool/Project/Profile/Resource/SearchConstraints.php new file mode 100644 index 0000000000..27f9e49dd5 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Profile/Resource/SearchConstraints.php @@ -0,0 +1,117 @@ +addConstraint($options); + } elseif (is_array($options)) { + $this->setOptions($options); + } + } + + /** + * setOptions() + * + * @param array $option + * @return Zend_Tool_Project_Profile_Resource_SearchConstraints + */ + public function setOptions(Array $option) + { + foreach ($option as $optionName => $optionValue) { + if (is_int($optionName)) { + $this->addConstraint($optionValue); + } elseif (is_string($optionName)) { + $this->addConstraint(array('name' => $optionName, 'params' => $optionValue)); + } + } + + return $this; + } + + /** + * addConstraint() + * + * @param string|array $constraint + * @return Zend_Tool_Project_Profile_Resource_SearchConstraints + */ + public function addConstraint($constraint) + { + if (is_string($constraint)) { + $name = $constraint; + $params = array(); + } elseif (is_array($constraint)) { + $name = $constraint['name']; + $params = $constraint['params']; + } + + $constraint = $this->_makeConstraint($name, $params); + + array_push($this->_constraints, $constraint); + return $this; + } + + /** + * getConstraint() + * + * @return ArrayObject + */ + public function getConstraint() + { + return array_shift($this->_constraints); + } + + /** + * _makeConstraint + * + * @param string $name + * @param mixed $params + * @return ArrayObject + */ + protected function _makeConstraint($name, $params) + { + $value = array('name' => $name, 'params' => $params); + return new ArrayObject($value, ArrayObject::ARRAY_AS_PROPS); + } + +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Provider/Abstract.php b/lib/zend/Zend/Tool/Project/Provider/Abstract.php new file mode 100644 index 0000000000..76cdc08188 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Provider/Abstract.php @@ -0,0 +1,238 @@ +addContextsFromDirectory( + dirname(dirname(__FILE__)) . '/Context/Zf/', 'Zend_Tool_Project_Context_Zf_' + ); + self::$_isInitialized = true; + } + + // load up the extending providers required context classes + if ($contextClasses = $this->getContextClasses()) { + $this->_loadContextClassesIntoRegistry($contextClasses); + } + + } + + public function getContextClasses() + { + return array(); + } + + /** + * _getProject is designed to find if there is project file in the context of where + * the client has been called from.. The search order is as follows.. + * - traversing downwards from (PWD) - current working directory + * - if an enpoint variable has been registered in teh client registry - key=workingDirectory + * - if an ENV variable with the key ZFPROJECT_PATH is found + * + * @param $loadProfileFlag bool Whether or not to throw an exception when no profile is found + * @param $projectDirectory string The project directory to use to search + * @param $searchParentDirectories bool Whether or not to search upper level direcotries + * @return Zend_Tool_Project_Profile + */ + protected function _loadProfile($loadProfileFlag = self::NO_PROFILE_THROW_EXCEPTION, $projectDirectory = null, $searchParentDirectories = true) + { + // use the cwd if no directory was provided + if ($projectDirectory == null) { + $projectDirectory = getcwd(); + } elseif (realpath($projectDirectory) == false) { + throw new Zend_Tool_Project_Provider_Exception('The $projectDirectory supplied does not exist.'); + } + + $profile = new Zend_Tool_Project_Profile(); + + $parentDirectoriesArray = explode(DIRECTORY_SEPARATOR, ltrim($projectDirectory, DIRECTORY_SEPARATOR)); + while ($parentDirectoriesArray) { + $projectDirectoryAssembled = implode(DIRECTORY_SEPARATOR, $parentDirectoriesArray); + + if (DIRECTORY_SEPARATOR !== "\\") { + $projectDirectoryAssembled = DIRECTORY_SEPARATOR . $projectDirectoryAssembled; + } + + $profile->setAttribute('projectDirectory', $projectDirectoryAssembled); + if ($profile->isLoadableFromFile()) { + chdir($projectDirectoryAssembled); + + $profile->loadFromFile(); + $this->_loadedProfile = $profile; + break; + } + + // break after first run if we are not to check upper directories + if ($searchParentDirectories == false) { + break; + } + + array_pop($parentDirectoriesArray); + } + + if ($this->_loadedProfile == null) { + if ($loadProfileFlag == self::NO_PROFILE_THROW_EXCEPTION) { + throw new Zend_Tool_Project_Provider_Exception('A project profile was not found.'); + } elseif ($loadProfileFlag == self::NO_PROFILE_RETURN_FALSE) { + return false; + } + } + + return $profile; + } + + /** + * Load the project profile from the current working directory, if not throw exception + * + * @return Zend_Tool_Project_Profile + */ + protected function _loadProfileRequired() + { + $profile = $this->_loadProfile(); + if ($profile === false) { + require_once 'Zend/Tool/Project/Provider/Exception.php'; + throw new Zend_Tool_Project_Provider_Exception('A project profile was not found in the current working directory.'); + } + return $profile; + } + + /** + * Return the currently loaded profile + * + * @return Zend_Tool_Project_Profile + */ + protected function _getProfile($loadProfileFlag = self::NO_PROFILE_THROW_EXCEPTION) + { + if (!$this->_loadedProfile) { + if (($this->_loadProfile($loadProfileFlag) === false) && ($loadProfileFlag === self::NO_PROFILE_RETURN_FALSE)) { + return false; + } + } + + return $this->_loadedProfile; + } + + /** + * _storeProfile() + * + * This method will store the profile into its proper location + * + */ + protected function _storeProfile() + { + $projectProfileFile = $this->_loadedProfile->search('ProjectProfileFile'); + + $name = $projectProfileFile->getContext()->getPath(); + + $this->_registry->getResponse()->appendContent('Updating project profile \'' . $name . '\''); + + $projectProfileFile->getContext()->save(); + } + + protected function _getContentForContext(Zend_Tool_Project_Context_Interface $context, $methodName, $parameters) + { + $storage = $this->_registry->getStorage(); + if (!$storage->isEnabled()) { + return false; + } + + if (!class_exists('Zend_Tool_Project_Context_Content_Engine')) { + require_once 'Zend/Tool/Project/Context/Content/Engine.php'; + } + + $engine = new Zend_Tool_Project_Context_Content_Engine($storage); + return $engine->getContent($context, $methodName, $parameters); + } + + /** + * _loadContextClassesIntoRegistry() - This is called by the constructor + * so that child providers can provide a list of contexts to load into the + * context repository + * + * @param array $contextClasses + */ + private function _loadContextClassesIntoRegistry($contextClasses) + { + $registry = Zend_Tool_Project_Context_Repository::getInstance(); + + foreach ($contextClasses as $contextClass) { + $registry->addContextClass($contextClass); + } + } +} diff --git a/lib/zend/Zend/Tool/Project/Provider/Action.php b/lib/zend/Zend/Tool/Project/Provider/Action.php new file mode 100644 index 0000000000..258585a003 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Provider/Action.php @@ -0,0 +1,168 @@ +createResource('ActionMethod', array('actionName' => $actionName)); + + return $actionMethod; + } + + /** + * hasResource() + * + * @param Zend_Tool_Project_Profile $profile + * @param string $actionName + * @param string $controllerName + * @param string $moduleName + * @return Zend_Tool_Project_Profile_Resource + */ + public static function hasResource(Zend_Tool_Project_Profile $profile, $actionName, $controllerName, $moduleName = null) + { + if (!is_string($actionName)) { + throw new Zend_Tool_Project_Provider_Exception('Zend_Tool_Project_Provider_Action::createResource() expects \"actionName\" is the name of a action resource to create.'); + } + + if (!is_string($controllerName)) { + throw new Zend_Tool_Project_Provider_Exception('Zend_Tool_Project_Provider_Action::createResource() expects \"controllerName\" is the name of a controller resource to create.'); + } + + $controllerFile = self::_getControllerFileResource($profile, $controllerName, $moduleName); + + return (($controllerFile->search(array('actionMethod' => array('actionName' => $actionName)))) instanceof Zend_Tool_Project_Profile_Resource); + } + + /** + * _getControllerFileResource() + * + * @param Zend_Tool_Project_Profile $profile + * @param string $controllerName + * @param string $moduleName + * @return Zend_Tool_Project_Profile_Resource + */ + protected static function _getControllerFileResource(Zend_Tool_Project_Profile $profile, $controllerName, $moduleName = null) + { + $profileSearchParams = array(); + + if ($moduleName != null && is_string($moduleName)) { + $profileSearchParams = array('modulesDirectory', 'moduleDirectory' => array('moduleName' => $moduleName)); + } + + $profileSearchParams[] = 'controllersDirectory'; + $profileSearchParams['controllerFile'] = array('controllerName' => $controllerName); + + return $profile->search($profileSearchParams); + } + + /** + * create() + * + * @param string $name + * @param string $controllerName + * @param bool $viewIncluded + */ + public function create($name, $controllerName = 'index', $viewIncluded = true, $module = null) + { + + $this->_loadProfile(); + + if (self::hasResource($this->_loadedProfile, $name, $controllerName, $module)) { + throw new Zend_Tool_Project_Provider_Exception('This controller (' . $controllerName . ') already has an action named (' . $name . ')'); + } + + $actionMethod = self::createResource($this->_loadedProfile, $name, $controllerName, $module); + + if ($this->_registry->getRequest()->isPretend()) { + $this->_registry->getResponse()->appendContent( + 'Would create an action named ' . $name . + ' inside controller at ' . $actionMethod->getParentResource()->getContext()->getPath() + ); + } else { + $this->_registry->getResponse()->appendContent( + 'Creating an action named ' . $name . + ' inside controller at ' . $actionMethod->getParentResource()->getContext()->getPath() + ); + $actionMethod->create(); + $this->_storeProfile(); + } + + if ($viewIncluded) { + $viewResource = Zend_Tool_Project_Provider_View::createResource($this->_loadedProfile, $name, $controllerName, $module); + + if ($this->_registry->getRequest()->isPretend()) { + $this->_registry->getResponse()->appendContent( + 'Would create a view script for the ' . $name . ' action method at ' . $viewResource->getContext()->getPath() + ); + } else { + $this->_registry->getResponse()->appendContent( + 'Creating a view script for the ' . $name . ' action method at ' . $viewResource->getContext()->getPath() + ); + $viewResource->create(); + $this->_storeProfile(); + } + + } + + } + +} diff --git a/lib/zend/Zend/Tool/Project/Provider/Controller.php b/lib/zend/Zend/Tool/Project/Provider/Controller.php new file mode 100644 index 0000000000..28db4325db --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Provider/Controller.php @@ -0,0 +1,199 @@ +createResource('controllerFile', array('controllerName' => $controllerName)); + + return $newController; + } + + /** + * hasResource() + * + * @param Zend_Tool_Project_Profile $profile + * @param string $controllerName + * @param string $moduleName + * @return Zend_Tool_Project_Profile_Resource + */ + public static function hasResource(Zend_Tool_Project_Profile $profile, $controllerName, $moduleName = null) + { + if (!is_string($controllerName)) { + throw new Zend_Tool_Project_Provider_Exception('Zend_Tool_Project_Provider_Controller::createResource() expects \"controllerName\" is the name of a controller resource to create.'); + } + + $controllersDirectory = self::_getControllersDirectoryResource($profile, $moduleName); + return (($controllersDirectory->search(array('controllerFile' => array('controllerName' => $controllerName)))) instanceof Zend_Tool_Project_Profile_Resource); + } + + /** + * _getControllersDirectoryResource() + * + * @param Zend_Tool_Project_Profile $profile + * @param string $moduleName + * @return Zend_Tool_Project_Profile_Resource + */ + protected static function _getControllersDirectoryResource(Zend_Tool_Project_Profile $profile, $moduleName = null) + { + $profileSearchParams = array(); + + if ($moduleName != null && is_string($moduleName)) { + $profileSearchParams = array('modulesDirectory', 'moduleDirectory' => array('moduleName' => $moduleName)); + } + + $profileSearchParams[] = 'controllersDirectory'; + + return $profile->search($profileSearchParams); + } + + /** + * Enter description here... + * + * @param string $name The name of the controller to create. + * @param bool $indexActionIncluded Whether or not to create the index action. + */ + public function create($name, $indexActionIncluded = true, $module = null) + { + $this->_loadProfile(self::NO_PROFILE_THROW_EXCEPTION); + + // determine if testing is enabled in the project + require_once 'Zend/Tool/Project/Provider/Test.php'; + $testingEnabled = Zend_Tool_Project_Provider_Test::isTestingEnabled($this->_loadedProfile); + + if (self::hasResource($this->_loadedProfile, $name, $module)) { + throw new Zend_Tool_Project_Provider_Exception('This project already has a controller named ' . $name); + } + + try { + $controllerResource = self::createResource($this->_loadedProfile, $name, $module); + if ($indexActionIncluded) { + $indexActionResource = Zend_Tool_Project_Provider_Action::createResource($this->_loadedProfile, 'index', $name, $module); + $indexActionViewResource = Zend_Tool_Project_Provider_View::createResource($this->_loadedProfile, 'index', $name, $module); + } + if ($testingEnabled) { + $testControllerResource = Zend_Tool_Project_Provider_Test::createApplicationResource($this->_loadedProfile, $name, 'index', $module); + } + + } catch (Exception $e) { + $response = $this->_registry->getResponse(); + $response->setException($e); + return; + } + + // do the creation + if ($this->_registry->getRequest()->isPretend()) { + + $this->_registry->getResponse()->appendContent('Would create a controller at ' . $controllerResource->getContext()->getPath()); + + if (isset($indexActionResource)) { + $this->_registry->getResponse()->appendContent('Would create an index action method in controller ' . $name); + $this->_registry->getResponse()->appendContent('Would create a view script for the index action method at ' . $indexActionViewResource->getContext()->getPath()); + } + + if ($testControllerResource) { + $this->_registry->getResponse()->appendContent('Would create a controller test file at ' . $testControllerResource->getContext()->getPath()); + } + + } else { + + $this->_registry->getResponse()->appendContent('Creating a controller at ' . $controllerResource->getContext()->getPath()); + $controllerResource->create(); + + if (isset($indexActionResource)) { + $this->_registry->getResponse()->appendContent('Creating an index action method in controller ' . $name); + $indexActionResource->create(); + $this->_registry->getResponse()->appendContent('Creating a view script for the index action method at ' . $indexActionViewResource->getContext()->getPath()); + $indexActionViewResource->create(); + } + + if ($testControllerResource) { + $this->_registry->getResponse()->appendContent('Creating a controller test file at ' . $testControllerResource->getContext()->getPath()); + $testControllerResource->create(); + } + + $this->_storeProfile(); + } + + } + + + +} diff --git a/lib/zend/Zend/Tool/Project/Provider/Exception.php b/lib/zend/Zend/Tool/Project/Provider/Exception.php new file mode 100644 index 0000000000..9f6995d72f --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Provider/Exception.php @@ -0,0 +1,37 @@ +search('applicationDirectory'); + $targetModuleEnabledResources = array( + 'ControllersDirectory', 'ModelsDirectory', 'ViewsDirectory', + 'ViewScriptsDirectory', 'ViewHelpersDirectory', 'ViewFiltersDirectory' + ); + } + + // find the actual modules directory we will use to house our module + $modulesDirectory = $profile->search('modulesDirectory'); + + // if there is a module directory already, except + if ($modulesDirectory->search(array('moduleDirectory' => array('moduleName' => $moduleName)))) { + throw new Zend_Tool_Project_Provider_Exception('A module named "' . $moduleName . '" already exists.'); + } + + // create the module directory + $moduleDirectory = $modulesDirectory->createResource('moduleDirectory', array('moduleName' => $moduleName)); + + // create a context filter so that we can pull out only what we need from the module skeleton + $moduleContextFilterIterator = new Zend_Tool_Project_Profile_Iterator_ContextFilter( + $targetModuleResource, + array( + 'denyNames' => array('ModulesDirectory', 'ViewControllerScriptsDirectory'), + 'denyType' => 'Zend_Tool_Project_Context_Filesystem_File' + ) + ); + + // the iterator for the module skeleton + $targetIterator = new RecursiveIteratorIterator($moduleContextFilterIterator, RecursiveIteratorIterator::SELF_FIRST); + + // initialize some loop state information + $currentDepth = 0; + $parentResources = array(); + $currentResource = $moduleDirectory; + + // loop through the target module skeleton + foreach ($targetIterator as $targetSubResource) { + + $depthDifference = $targetIterator->getDepth() - $currentDepth; + $currentDepth = $targetIterator->getDepth(); + + if ($depthDifference === 1) { + // if we went down into a child, make note + array_push($parentResources, $currentResource); + // this will have always been set previously by another loop + $currentResource = $currentChildResource; + } elseif ($depthDifference < 0) { + // if we went up to a parent, make note + $i = $depthDifference; + do { + // if we went out more than 1 parent, get to the correct parent + $currentResource = array_pop($parentResources); + } while ($i-- > 0); + } + + // get parameters for the newly created module resource + $params = $targetSubResource->getAttributes(); + $currentChildResource = $currentResource->createResource($targetSubResource->getName(), $params); + + // based of the provided list (Currently up top), enable specific resources + if (isset($targetModuleEnabledResources)) { + $currentChildResource->setEnabled(in_array($targetSubResource->getName(), $targetModuleEnabledResources)); + } else { + $currentChildResource->setEnabled($targetSubResource->isEnabled()); + } + + } + + return $moduleDirectory; + } + + /** + * create() + * + * @param string $name + */ + public function create($name) //, $moduleProfile = null) + { + $this->_loadProfile(self::NO_PROFILE_THROW_EXCEPTION); + + $resources = self::createResources($this->_loadedProfile, $name); + + $response = $this->_registry->getResponse(); + + if ($this->_registry->getRequest()->isPretend()) { + $response->appendContent('I would create the following module and artifacts:'); + foreach (new RecursiveIteratorIterator($resources, RecursiveIteratorIterator::SELF_FIRST) as $resource) { + if (is_callable(array($resource->getContext(), 'getPath'))) { + $response->appendContent($resource->getContext()->getPath()); + } + } + } else { + $response->appendContent('Creating the following module and artifacts:'); + $enabledFilter = new Zend_Tool_Project_Profile_Iterator_EnabledResourceFilter($resources); + foreach (new RecursiveIteratorIterator($enabledFilter, RecursiveIteratorIterator::SELF_FIRST) as $resource) { + $response->appendContent($resource->getContext()->getPath()); + $resource->create(); + } + + // store changes to the profile + $this->_storeProfile(); + } + + } + +} + diff --git a/lib/zend/Zend/Tool/Project/Provider/Profile.php b/lib/zend/Zend/Tool/Project/Provider/Profile.php new file mode 100644 index 0000000000..c8baf56a28 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Provider/Profile.php @@ -0,0 +1,54 @@ +_loadProfile(); + + $profileIterator = $this->_loadedProfile->getIterator(); + + foreach ($profileIterator as $profileItem) { + $this->_registry->getResponse()->appendContent( + str_repeat(' ', $profileIterator->getDepth()) . $profileItem + ); + } + + } +} diff --git a/lib/zend/Zend/Tool/Project/Provider/Project.php b/lib/zend/Zend/Tool/Project/Provider/Project.php new file mode 100644 index 0000000000..16eca8342f --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Provider/Project.php @@ -0,0 +1,180 @@ +_loadProfile(self::NO_PROFILE_RETURN_FALSE, $path); + + if ($profile !== false) { + require_once 'Zend/Tool/Framework/Client/Exception.php'; + throw new Zend_Tool_Framework_Client_Exception('A project already exists here'); + } + + $profileData = null; + + if ($fileOfProfile != null && file_exists($fileOfProfile)) { + $profileData = file_get_contents($fileOfProfile); + } + + $storage = $this->_registry->getStorage(); + if ($profileData == '' && $nameOfProfile != null && $storage->isEnabled()) { + $profileData = $storage->get('project/profiles/' . $nameOfProfile . '.xml'); + } + + if ($profileData == '') { + $profileData = $this->_getDefaultProfile(); + } + + $newProfile = new Zend_Tool_Project_Profile(array( + 'projectDirectory' => $path, + 'profileData' => $profileData + )); + + $newProfile->loadFromData(); + + $this->_registry->getResponse()->appendContent('Creating project at ' . $path); + + foreach ($newProfile->getIterator() as $resource) { + $resource->create(); + } + } + + public function show() + { + $this->_registry->getResponse()->appendContent('You probably meant to run "show project.info".', array('color' => 'yellow')); + } + + public function showInfo() + { + $profile = $this->_loadProfile(self::NO_PROFILE_RETURN_FALSE); + if (!$profile) { + $this->_registry->getResponse()->appendContent('No project found.'); + } else { + $this->_registry->getResponse()->appendContent('Working with project located at: ' . $profile->getAttribute('projectDirectory')); + } + } + + protected function _getDefaultProfile() + { + $data = << + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +EOS; + return $data; + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Tool/Project/Provider/ProjectProvider.php b/lib/zend/Zend/Tool/Project/Provider/ProjectProvider.php new file mode 100644 index 0000000000..2bf3c0b816 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Provider/ProjectProvider.php @@ -0,0 +1,97 @@ +createResourceAt($profileSearchParams, 'projectProviderFile', array('projectProviderName' => $projectProviderName, 'actionNames' => $actionNames)); + + return $projectProvider; + } + + /** + * getName() + * + * @return string + */ + public function getName() + { + return 'ProjectProvider'; + } + + /** + * Create stub for Zend_Tool Project Provider + * + * @var string $name class name for new Zend_Tool Project Provider + * @var array|string $actions list of provider methods + * @throws Zend_Tool_Project_Provider_Exception + */ + public function create($name, $actions = null) + { + $profile = $this->_loadProfileRequired(); + + $projectProvider = self::createResource($profile, $name, $actions); + + if ($this->_registry->getRequest()->isPretend()) { + $this->_registry->getResponse()->appendContent('Would create a project provider named ' . $name + . ' in location ' . $projectProvider->getPath() + ); + } else { + $this->_registry->getResponse()->appendContent('Creating a project provider named ' . $name + . ' in location ' . $projectProvider->getPath() + ); + $projectProvider->create(); + $this->_storeProfile(); + } + + } +} diff --git a/lib/zend/Zend/Tool/Project/Provider/Test.php b/lib/zend/Zend/Tool/Project/Provider/Test.php new file mode 100644 index 0000000000..73bf84a7b1 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Provider/Test.php @@ -0,0 +1,174 @@ +search($profileSearchParams); + + return $testsDirectory->isEnabled(); + } + + /** + * createApplicationResource() + * + * @param Zend_Tool_Project_Profile $profile + * @param string $controllerName + * @param string $actionName + * @param string $moduleName + * @return Zend_Tool_Project_Profile_Resource + */ + public static function createApplicationResource(Zend_Tool_Project_Profile $profile, $controllerName, $actionName, $moduleName = null) + { + if (!is_string($controllerName)) { + throw new Zend_Tool_Project_Provider_Exception('Zend_Tool_Project_Provider_View::createApplicationResource() expects \"controllerName\" is the name of a controller resource to create.'); + } + + if (!is_string($actionName)) { + throw new Zend_Tool_Project_Provider_Exception('Zend_Tool_Project_Provider_View::createApplicationResource() expects \"actionName\" is the name of a controller resource to create.'); + } + + $testsDirectoryResource = $profile->search('testsDirectory'); + + if (($testAppDirectoryResource = $testsDirectoryResource->search('testApplicationDirectory')) === false) { + $testAppDirectoryResource = $testsDirectoryResource->createResource('testApplicationDirectory'); + } + + if ($moduleName) { + //@todo $moduleName + $moduleName = ''; + } + + if (($testAppControllerDirectoryResource = $testAppDirectoryResource->search('testApplicationControllerDirectory')) === false) { + $testAppControllerDirectoryResource = $testAppDirectoryResource->createResource('testApplicationControllerDirectory'); + } + + $testAppControllerFileResource = $testAppControllerDirectoryResource->createResource('testApplicationControllerFile', array('forControllerName' => $controllerName)); + + return $testAppControllerFileResource; + } + + /** + * createLibraryResource() + * + * @param Zend_Tool_Project_Profile $profile + * @param string $libraryClassName + * @return Zend_Tool_Project_Profile_Resource + */ + public static function createLibraryResource(Zend_Tool_Project_Profile $profile, $libraryClassName) + { + $testLibraryDirectoryResource = $profile->search(array('TestsDirectory', 'TestLibraryDirectory')); + + + $fsParts = explode('_', $libraryClassName); + + $currentDirectoryResource = $testLibraryDirectoryResource; + + while ($nameOrNamespacePart = array_shift($fsParts)) { + + if (count($fsParts) > 0) { + + if (($libraryDirectoryResource = $currentDirectoryResource->search(array('TestLibraryNamespaceDirectory' => array('namespaceName' => $nameOrNamespacePart)))) === false) { + $currentDirectoryResource = $currentDirectoryResource->createResource('TestLibraryNamespaceDirectory', array('namespaceName' => $nameOrNamespacePart)); + } else { + $currentDirectoryResource = $libraryDirectoryResource; + } + + + } else { + + if (($libraryFileResource = $currentDirectoryResource->search(array('TestLibraryFile' => array('forClassName' => $libraryClassName)))) === false) { + $libraryFileResource = $currentDirectoryResource->createResource('TestLibraryFile', array('forClassName' => $libraryClassName)); + } + + } + + } + + return $libraryFileResource; + } + + public function enable() + { + + } + + public function disable() + { + + } + + /** + * create() + * + * @param unknown_type $libraryClassName + */ + public function create($libraryClassName) + { + $profile = $this->_loadProfile(); + + if (!self::isTestingEnabled($profile)) { + $this->_registry->getResponse()->appendContent('Testing is not enabled for this project.'); + } + + $testLibraryResource = self::createLibraryResource($profile, $libraryClassName); + + $response = $this->_registry->getResponse(); + + if ($this->_registry->getRequest()->isPretend()) { + $response->appendContent('Would create a library stub in location ' . $testLibraryResource->getContext()->getPath()); + } else { + $response->appendContent('Creating a library stub in location ' . $testLibraryResource->getContext()->getPath()); + $testLibraryResource->create(); + $this->_storeProfile(); + } + + } + +} diff --git a/lib/zend/Zend/Tool/Project/Provider/View.php b/lib/zend/Zend/Tool/Project/Provider/View.php new file mode 100644 index 0000000000..fdc38412e5 --- /dev/null +++ b/lib/zend/Zend/Tool/Project/Provider/View.php @@ -0,0 +1,118 @@ + array('moduleName' => $moduleName)); + $noModuleSearch = null; + } else { + $noModuleSearch = array('ModulesDirectory'); + } + + $profileSearchParams[] = 'viewsDirectory'; + $profileSearchParams[] = 'viewScriptsDirectory'; + + if (($viewScriptsDirectory = $profile->search($profileSearchParams, $noModuleSearch)) === false) { + require_once 'Zend/Tool/Project/Provider/Exception.php'; + throw new Zend_Tool_Project_Provider_Exception('This project does not have a viewScriptsDirectory resource.'); + } + + $profileSearchParams['viewControllerScriptsDirectory'] = array('forControllerName' => $controllerName); + + // XXXXXXXXX below is failing b/c of above search params + if (($viewControllerScriptsDirectory = $viewScriptsDirectory->search($profileSearchParams)) === false) { + $viewControllerScriptsDirectory = $viewScriptsDirectory->createResource('viewControllerScriptsDirectory', array('forControllerName' => $controllerName)); + } + + $newViewScriptFile = $viewControllerScriptsDirectory->createResource('ViewScriptFile', array('forActionName' => $actionName)); + + return $newViewScriptFile; + } + + /** + * create() + * + * @param string $controllerName + * @param string $actionNameOrSimpleName + */ + public function create($controllerName, $actionNameOrSimpleName) + { + + if ($controllerName == '' || $actionNameOrSimpleName == '') { + require_once 'Zend/Tool/Project/Provider/Exception.php'; + throw new Zend_Tool_Project_Provider_Exception('ControllerName and/or ActionName are empty.'); + } + + $profile = $this->_loadProfile(); + + $view = self::createResource($profile, $actionNameOrSimpleName, $controllerName); + + if ($this->_registry->getRequest()->isPretend()) { + $this->_registry->getResponse( + 'Would create a view script in location ' . $view->getContext()->getPath() + ); + } else { + $this->_registry->getResponse( + 'Creating a view script in location ' . $view->getContext()->getPath() + ); + $view->create(); + $this->_storeProfile(); + } + + } +} diff --git a/lib/zend/Zend/Translate/Adapter.php b/lib/zend/Zend/Translate/Adapter.php new file mode 100644 index 0000000000..217beae214 --- /dev/null +++ b/lib/zend/Zend/Translate/Adapter.php @@ -0,0 +1,761 @@ + clears already loaded data when adding new files + * 'scan' => searches for translation files using the LOCALE constants + * 'locale' => the actual set locale to use + * @var array + */ + protected $_options = array( + 'clear' => false, + 'disableNotices' => false, + 'ignore' => '.', + 'locale' => 'auto', + 'log' => null, + 'logMessage' => "Untranslated message within '%locale%': %message%", + 'logUntranslated' => false, + 'scan' => null + ); + + /** + * Translation table + * @var array + */ + protected $_translate = array(); + + /** + * Generates the adapter + * + * @param string|array $data Translation data or filename for this adapter + * @param string|Zend_Locale $locale (optional) Locale/Language to set, identical with Locale + * identifiers see Zend_Locale for more information + * @param array $options (optional) Options for the adaptor + * @throws Zend_Translate_Exception + * @return void + */ + public function __construct($data, $locale = null, array $options = array()) + { + if (isset(self::$_cache)) { + $id = 'Zend_Translate_' . $this->toString() . '_Options'; + $result = self::$_cache->load($id); + if ($result) { + $this->_options = unserialize($result); + } + } + + if (($locale === "auto") or ($locale === null)) { + $this->_automatic = true; + } else { + $this->_automatic = false; + } + + $this->addTranslation($data, $locale, $options); + if ($this->getLocale() !== (string) $locale) { + $this->setLocale($locale); + } + } + + /** + * Add translation data + * + * It may be a new language or additional data for existing language + * If $clear parameter is true, then translation data for specified + * language is replaced and added otherwise + * + * @param array|string $data Translation data + * @param string|Zend_Locale $locale (optional) Locale/Language to add data for, identical + * with locale identifier, see Zend_Locale for more information + * @param array $options (optional) Option for this Adapter + * @throws Zend_Translate_Exception + * @return Zend_Translate_Adapter Provides fluent interface + */ + public function addTranslation($data, $locale = null, array $options = array()) + { + try { + $locale = Zend_Locale::findLocale($locale); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception("The given Language '{$locale}' does not exist"); + } + + $originate = (string) $locale; + + $this->setOptions($options); + if (is_string($data) and is_dir($data)) { + $data = realpath($data); + $prev = ''; + foreach (new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($data, RecursiveDirectoryIterator::KEY_AS_PATHNAME), + RecursiveIteratorIterator::SELF_FIRST) as $directory => $info) { + $file = $info->getFilename(); + if (strpos($directory, DIRECTORY_SEPARATOR . $this->_options['ignore']) !== false) { + // ignore files matching first characters from option 'ignore' and all files below + continue; + } + + if ($info->isDir()) { + // pathname as locale + if (($this->_options['scan'] === self::LOCALE_DIRECTORY) and (Zend_Locale::isLocale($file, true, false))) { + if (strlen($prev) <= strlen($file)) { + $locale = $file; + $prev = (string) $locale; + } + } + } else if ($info->isFile()) { + // filename as locale + if ($this->_options['scan'] === self::LOCALE_FILENAME) { + $filename = explode('.', $file); + array_pop($filename); + $filename = implode('.', $filename); + if (Zend_Locale::isLocale((string) $filename, true, false)) { + $locale = (string) $filename; + } else { + $parts = explode('.', $file); + $parts2 = array(); + foreach($parts as $token) { + $parts2 += explode('_', $token); + } + $parts = array_merge($parts, $parts2); + $parts2 = array(); + foreach($parts as $token) { + $parts2 += explode('-', $token); + } + $parts = array_merge($parts, $parts2); + $parts = array_unique($parts); + $prev = ''; + foreach($parts as $token) { + if (Zend_Locale::isLocale($token, true, false)) { + if (strlen($prev) <= strlen($token)) { + $locale = $token; + $prev = $token; + } + } + } + } + } + try { + $this->_addTranslationData($info->getPathname(), (string) $locale, $this->_options); + if ((isset($this->_translate[(string) $locale]) === true) and (count($this->_translate[(string) $locale]) > 0)) { + $this->setLocale($locale); + } + } catch (Zend_Translate_Exception $e) { + // ignore failed sources while scanning + } + } + } + } else { + $this->_addTranslationData($data, (string) $locale, $this->_options); + if ((isset($this->_translate[(string) $locale]) === true) and (count($this->_translate[(string) $locale]) > 0)) { + $this->setLocale($locale); + } + } + + if ((isset($this->_translate[$originate]) === true) and (count($this->_translate[$originate]) > 0) and ($originate !== (string) $locale)) { + $this->setLocale($originate); + } + + return $this; + } + + /** + * Sets new adapter options + * + * @param array $options Adapter options + * @throws Zend_Translate_Exception + * @return Zend_Translate_Adapter Provides fluent interface + */ + public function setOptions(array $options = array()) + { + $change = false; + $locale = null; + foreach ($options as $key => $option) { + if ($key == 'locale') { + $locale = $option; + } else if ((isset($this->_options[$key]) and ($this->_options[$key] != $option)) or + !isset($this->_options[$key])) { + if (($key == 'log') && !($option instanceof Zend_Log)) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Instance of Zend_Log expected for option log'); + } + + $this->_options[$key] = $option; + $change = true; + } + } + + if ($locale !== null) { + $this->setLocale($locale); + } + + if (isset(self::$_cache) and ($change == true)) { + $id = 'Zend_Translate_' . $this->toString() . '_Options'; + self::$_cache->save( serialize($this->_options), $id, array('Zend_Translate')); + } + + return $this; + } + + /** + * Returns the adapters name and it's options + * + * @param string|null $optionKey String returns this option + * null returns all options + * @return integer|string|array|null + */ + public function getOptions($optionKey = null) + { + if ($optionKey === null) { + return $this->_options; + } + + if (isset($this->_options[$optionKey]) === true) { + return $this->_options[$optionKey]; + } + + return null; + } + + /** + * Gets locale + * + * @return Zend_Locale|string|null + */ + public function getLocale() + { + return $this->_options['locale']; + } + + /** + * Sets locale + * + * @param string|Zend_Locale $locale Locale to set + * @throws Zend_Translate_Exception + * @return Zend_Translate_Adapter Provides fluent interface + */ + public function setLocale($locale) + { + if (($locale === "auto") or ($locale === null)) { + $this->_automatic = true; + } else { + $this->_automatic = false; + } + + try { + $locale = Zend_Locale::findLocale($locale); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception("The given Language ({$locale}) does not exist"); + } + + if (!isset($this->_translate[$locale])) { + $temp = explode('_', $locale); + if (!isset($this->_translate[$temp[0]]) and !isset($this->_translate[$locale])) { + if (!$this->_options['disableNotices']) { + if ($this->_options['log']) { + $this->_options['log']->notice("The language '{$locale}' has to be added before it can be used."); + } else { + trigger_error("The language '{$locale}' has to be added before it can be used.", E_USER_NOTICE); + } + } + } + + $locale = $temp[0]; + } + + if (empty($this->_translate[$locale])) { + if (!$this->_options['disableNotices']) { + if ($this->_options['log']) { + $this->_options['log']->notice("No translation for the language '{$locale}' available."); + } else { + trigger_error("No translation for the language '{$locale}' available.", E_USER_NOTICE); + } + } + } + + if ($this->_options['locale'] != $locale) { + $this->_options['locale'] = $locale; + + if (isset(self::$_cache)) { + $id = 'Zend_Translate_' . $this->toString() . '_Options'; + self::$_cache->save( serialize($this->_options), $id, array('Zend_Translate')); + } + } + + return $this; + } + + /** + * Returns the available languages from this adapter + * + * @return array + */ + public function getList() + { + $list = array_keys($this->_translate); + $result = null; + foreach($list as $value) { + if (!empty($this->_translate[$value])) { + $result[$value] = $value; + } + } + return $result; + } + + /** + * Returns all available message ids from this adapter + * If no locale is given, the actual language will be used + * + * @param string|Zend_Locale $locale (optional) Language to return the message ids from + * @return array + */ + public function getMessageIds($locale = null) + { + if (empty($locale) or !$this->isAvailable($locale)) { + $locale = $this->_options['locale']; + } + + return array_keys($this->_translate[(string) $locale]); + } + + /** + * Returns all available translations from this adapter + * If no locale is given, the actual language will be used + * If 'all' is given the complete translation dictionary will be returned + * + * @param string|Zend_Locale $locale (optional) Language to return the messages from + * @return array + */ + public function getMessages($locale = null) + { + if ($locale === 'all') { + return $this->_translate; + } + + if ((empty($locale) === true) or ($this->isAvailable($locale) === false)) { + $locale = $this->_options['locale']; + } + + return $this->_translate[(string) $locale]; + } + + /** + * Is the wished language available ? + * + * @see Zend_Locale + * @param string|Zend_Locale $locale Language to search for, identical with locale identifier, + * @see Zend_Locale for more information + * @return boolean + */ + public function isAvailable($locale) + { + $return = isset($this->_translate[(string) $locale]); + return $return; + } + + /** + * Load translation data + * + * @param mixed $data + * @param string|Zend_Locale $locale + * @param array $options (optional) + * @return array + */ + abstract protected function _loadTranslationData($data, $locale, array $options = array()); + + /** + * Internal function for adding translation data + * + * It may be a new language or additional data for existing language + * If $clear parameter is true, then translation data for specified + * language is replaced and added otherwise + * + * @see Zend_Locale + * @param array|string $data Translation data + * @param string|Zend_Locale $locale Locale/Language to add data for, identical with locale identifier, + * @see Zend_Locale for more information + * @param array $options (optional) Option for this Adapter + * @throws Zend_Translate_Exception + * @return Zend_Translate_Adapter Provides fluent interface + */ + private function _addTranslationData($data, $locale, array $options = array()) + { + try { + $locale = Zend_Locale::findLocale($locale); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception("The given Language '{$locale}' does not exist"); + } + + if ($options['clear'] || !isset($this->_translate[$locale])) { + $this->_translate[$locale] = array(); + } + + $read = true; + if (isset(self::$_cache)) { + $id = 'Zend_Translate_' . md5(serialize($data)) . '_' . $this->toString(); + $result = self::$_cache->load($id); + if ($result) { + $temp = unserialize($result); + $read = false; + } + } + + if ($read) { + $temp = $this->_loadTranslationData($data, $locale, $options); + } + + if (empty($temp)) { + $temp = array(); + } + + $keys = array_keys($temp); + foreach($keys as $key) { + if (!isset($this->_translate[$key])) { + $this->_translate[$key] = array(); + } + + $this->_translate[$key] = $temp[$key] + $this->_translate[$key]; + } + + if ($this->_automatic === true) { + $find = new Zend_Locale($locale); + $browser = $find->getEnvironment() + $find->getBrowser(); + arsort($browser); + foreach($browser as $language => $quality) { + if (isset($this->_translate[$language])) { + $this->_options['locale'] = $language; + break; + } + } + } + + if (($read) and (isset(self::$_cache))) { + $id = 'Zend_Translate_' . md5(serialize($data)) . '_' . $this->toString(); + self::$_cache->save( serialize($temp), $id, array('Zend_Translate')); + } + + return $this; + } + + /** + * Translates the given string + * returns the translation + * + * @see Zend_Locale + * @param string|array $messageId Translation string, or Array for plural translations + * @param string|Zend_Locale $locale (optional) Locale/Language to use, identical with + * locale identifier, @see Zend_Locale for more information + * @return string + */ + public function translate($messageId, $locale = null) + { + if ($locale === null) { + $locale = $this->_options['locale']; + } + + $plural = null; + if (is_array($messageId)) { + if (count($messageId) > 2) { + $number = array_pop($messageId); + if (!is_numeric($number)) { + $plocale = $number; + $number = array_pop($messageId); + } else { + $plocale = 'en'; + } + + $plural = $messageId; + $messageId = $messageId[0]; + } else { + $messageId = $messageId[0]; + } + } + + if (!Zend_Locale::isLocale($locale, true, false)) { + if (!Zend_Locale::isLocale($locale, false, false)) { + // language does not exist, return original string + $this->_log($messageId, $locale); + if ($plural === null) { + return $messageId; + } + + $rule = Zend_Translate_Plural::getPlural($number, $plocale); + if (!isset($plural[$rule])) { + $rule = 0; + } + + return $plural[$rule]; + } + + $locale = new Zend_Locale($locale); + } + + $locale = (string) $locale; + if (isset($this->_translate[$locale][$messageId])) { + // return original translation + if ($plural === null) { + return $this->_translate[$locale][$messageId]; + } + + $rule = Zend_Translate_Plural::getPlural($number, $locale); + if (isset($this->_translate[$locale][$plural[0]][$rule])) { + return $this->_translate[$locale][$plural[0]][$rule]; + } + } else if (strlen($locale) != 2) { + // faster than creating a new locale and separate the leading part + $locale = substr($locale, 0, -strlen(strrchr($locale, '_'))); + + if (isset($this->_translate[$locale][$messageId])) { + // return regionless translation (en_US -> en) + if ($plural === null) { + return $this->_translate[$locale][$messageId]; + } + + $rule = Zend_Translate_Plural::getPlural($number, $locale); + if (isset($this->_translate[$locale][$plural[0]][$rule])) { + return $this->_translate[$locale][$plural[0]][$rule]; + } + } + } + + $this->_log($messageId, $locale); + if ($plural === null) { + return $messageId; + } + + $rule = Zend_Translate_Plural::getPlural($number, $plocale); + if (!isset($plural[$rule])) { + $rule = 0; + } + + return $plural[$rule]; + } + + /** + * Translates the given string using plural notations + * Returns the translated string + * + * @see Zend_Locale + * @param string $singular Singular translation string + * @param string $plural Plural translation string + * @param integer $number Number for detecting the correct plural + * @param string|Zend_Locale $locale (Optional) Locale/Language to use, identical with + * locale identifier, @see Zend_Locale for more information + * @return string + */ + public function plural($singular, $plural, $number, $locale = null) + { + return $this->translate(array($singular, $plural, $number), $locale); + } + + /** + * Logs a message when the log option is set + * + * @param string $message Message to log + * @param String $locale Locale to log + */ + protected function _log($message, $locale) { + if ($this->_options['logUntranslated']) { + $message = str_replace('%message%', $message, $this->_options['logMessage']); + $message = str_replace('%locale%', $locale, $message); + if ($this->_options['log']) { + $this->_options['log']->notice($message); + } else { + trigger_error($message, E_USER_NOTICE); + } + } + } + + /** + * Translates the given string + * returns the translation + * + * @param string $messageId Translation string + * @param string|Zend_Locale $locale (optional) Locale/Language to use, identical with locale + * identifier, @see Zend_Locale for more information + * @return string + */ + public function _($messageId, $locale = null) + { + return $this->translate($messageId, $locale); + } + + /** + * Checks if a string is translated within the source or not + * returns boolean + * + * @param string $messageId Translation string + * @param boolean $original (optional) Allow translation only for original language + * when true, a translation for 'en_US' would give false when it can + * be translated with 'en' only + * @param string|Zend_Locale $locale (optional) Locale/Language to use, identical with locale identifier, + * see Zend_Locale for more information + * @return boolean + */ + public function isTranslated($messageId, $original = false, $locale = null) + { + if (($original !== false) and ($original !== true)) { + $locale = $original; + $original = false; + } + + if ($locale === null) { + $locale = $this->_options['locale']; + } + + if (!Zend_Locale::isLocale($locale, true, false)) { + if (!Zend_Locale::isLocale($locale, false, false)) { + // language does not exist, return original string + $this->_log($messageId, $locale); + return false; + } + + $locale = new Zend_Locale($locale); + } + + $locale = (string) $locale; + if (isset($this->_translate[$locale][$messageId]) === true) { + // return original translation + return true; + } else if ((strlen($locale) != 2) and ($original === false)) { + // faster than creating a new locale and separate the leading part + $locale = substr($locale, 0, -strlen(strrchr($locale, '_'))); + + if (isset($this->_translate[$locale][$messageId]) === true) { + // return regionless translation (en_US -> en) + return true; + } + } + + // No translation found, return original + $this->_log($messageId, $locale); + return false; + } + + /** + * Returns the set cache + * + * @return Zend_Cache_Core The set cache + */ + public static function getCache() + { + return self::$_cache; + } + + /** + * Sets a cache for all Zend_Translate_Adapters + * + * @param Zend_Cache_Core $cache Cache to store to + */ + public static function setCache(Zend_Cache_Core $cache) + { + self::$_cache = $cache; + } + + /** + * Returns true when a cache is set + * + * @return boolean + */ + public static function hasCache() + { + if (self::$_cache !== null) { + return true; + } + + return false; + } + + /** + * Removes any set cache + * + * @return void + */ + public static function removeCache() + { + self::$_cache = null; + } + + /** + * Clears all set cache data + * + * @return void + */ + public static function clearCache() + { + require_once 'Zend/Cache.php'; + self::$_cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('Zend_Translate')); + } + + /** + * Returns the adapter name + * + * @return string + */ + abstract public function toString(); +} \ No newline at end of file diff --git a/lib/zend/Zend/Translate/Adapter/Array.php b/lib/zend/Zend/Translate/Adapter/Array.php new file mode 100644 index 0000000000..3208508602 --- /dev/null +++ b/lib/zend/Zend/Translate/Adapter/Array.php @@ -0,0 +1,94 @@ +_data = array(); + if (!is_array($data)) { + if (file_exists($data)) { + ob_start(); + $data = include($data); + ob_end_clean(); + } + } + if (!is_array($data)) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception("Error including array or file '".$data."'"); + } + + if (!isset($this->_data[$locale])) { + $this->_data[$locale] = array(); + } + + $this->_data[$locale] = $data + $this->_data[$locale]; + return $this->_data; + } + + /** + * returns the adapters name + * + * @return string + */ + public function toString() + { + return "Array"; + } +} diff --git a/lib/zend/Zend/Translate/Adapter/Csv.php b/lib/zend/Zend/Translate/Adapter/Csv.php new file mode 100644 index 0000000000..4d1212daa6 --- /dev/null +++ b/lib/zend/Zend/Translate/Adapter/Csv.php @@ -0,0 +1,104 @@ +_options['delimiter'] = ";"; + $this->_options['length'] = 0; + $this->_options['enclosure'] = '"'; + parent::__construct($data, $locale, $options); + } + + /** + * Load translation data + * + * @param string|array $filename Filename and full path to the translation source + * @param string $locale Locale/Language to add data for, identical with locale identifier, + * see Zend_Locale for more information + * @param array $option OPTIONAL Options to use + * @return array + */ + protected function _loadTranslationData($filename, $locale, array $options = array()) + { + $this->_data = array(); + $options = $options + $this->_options; + $this->_file = @fopen($filename, 'rb'); + if (!$this->_file) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Error opening translation file \'' . $filename . '\'.'); + } + + while(($data = fgetcsv($this->_file, $options['length'], $options['delimiter'], $options['enclosure'])) !== false) { + if (substr($data[0], 0, 1) === '#') { + continue; + } + + if (!isset($data[1])) { + continue; + } + + if (count($data) == 2) { + $this->_data[$locale][$data[0]] = $data[1]; + } else { + $singular = array_shift($data); + $this->_data[$locale][$singular] = $data; + } + } + + return $this->_data; + } + + /** + * returns the adapters name + * + * @return string + */ + public function toString() + { + return "Csv"; + } +} diff --git a/lib/zend/Zend/Translate/Adapter/Gettext.php b/lib/zend/Zend/Translate/Adapter/Gettext.php new file mode 100644 index 0000000000..658c2cd659 --- /dev/null +++ b/lib/zend/Zend/Translate/Adapter/Gettext.php @@ -0,0 +1,178 @@ +_bigEndian === false) { + return unpack('V' . $bytes, fread($this->_file, 4 * $bytes)); + } else { + return unpack('N' . $bytes, fread($this->_file, 4 * $bytes)); + } + } + + /** + * Load translation data (MO file reader) + * + * @param string $filename MO file to add, full path must be given for access + * @param string $locale New Locale/Language to set, identical with locale identifier, + * see Zend_Locale for more information + * @param array $option OPTIONAL Options to use + * @throws Zend_Translation_Exception + * @return array + */ + protected function _loadTranslationData($filename, $locale, array $options = array()) + { + $this->_data = array(); + $this->_bigEndian = false; + $this->_file = @fopen($filename, 'rb'); + if (!$this->_file) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Error opening translation file \'' . $filename . '\'.'); + } + if (@filesize($filename) < 10) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('\'' . $filename . '\' is not a gettext file'); + } + + // get Endian + $input = $this->_readMOData(1); + if (strtolower(substr(dechex($input[1]), -8)) == "950412de") { + $this->_bigEndian = false; + } else if (strtolower(substr(dechex($input[1]), -8)) == "de120495") { + $this->_bigEndian = true; + } else { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('\'' . $filename . '\' is not a gettext file'); + } + // read revision - not supported for now + $input = $this->_readMOData(1); + + // number of bytes + $input = $this->_readMOData(1); + $total = $input[1]; + + // number of original strings + $input = $this->_readMOData(1); + $OOffset = $input[1]; + + // number of translation strings + $input = $this->_readMOData(1); + $TOffset = $input[1]; + + // fill the original table + fseek($this->_file, $OOffset); + $origtemp = $this->_readMOData(2 * $total); + fseek($this->_file, $TOffset); + $transtemp = $this->_readMOData(2 * $total); + + for($count = 0; $count < $total; ++$count) { + if ($origtemp[$count * 2 + 1] != 0) { + fseek($this->_file, $origtemp[$count * 2 + 2]); + $original = @fread($this->_file, $origtemp[$count * 2 + 1]); + $original = explode(chr(00), $original); + } else { + $original[0] = ''; + } + + if ($transtemp[$count * 2 + 1] != 0) { + fseek($this->_file, $transtemp[$count * 2 + 2]); + $translate = fread($this->_file, $transtemp[$count * 2 + 1]); + $translate = explode(chr(00), $translate); + if ((count($original) > 1) && (count($translate) > 1)) { + $this->_data[$locale][$original[0]] = $translate; + array_shift($original); + foreach ($original as $orig) { + $this->_data[$locale][$orig] = ''; + } + } else { + $this->_data[$locale][$original[0]] = $translate[0]; + } + } + } + + $this->_data[$locale][''] = trim($this->_data[$locale]['']); + if (empty($this->_data[$locale][''])) { + $this->_adapterInfo[$filename] = 'No adapter information available'; + } else { + $this->_adapterInfo[$filename] = $this->_data[$locale]['']; + } + + unset($this->_data[$locale]['']); + return $this->_data; + } + + /** + * Returns the adapter informations + * + * @return array Each loaded adapter information as array value + */ + public function getAdapterInfo() + { + return $this->_adapterInfo; + } + + /** + * Returns the adapter name + * + * @return string + */ + public function toString() + { + return "Gettext"; + } +} diff --git a/lib/zend/Zend/Translate/Adapter/Ini.php b/lib/zend/Zend/Translate/Adapter/Ini.php new file mode 100644 index 0000000000..4831d818e3 --- /dev/null +++ b/lib/zend/Zend/Translate/Adapter/Ini.php @@ -0,0 +1,87 @@ +_data = array(); + if (!file_exists($data)) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception("Ini file '".$data."' not found"); + } + + $inidata = parse_ini_file($data, false); + if (!isset($this->_data[$locale])) { + $this->_data[$locale] = array(); + } + + $this->_data[$locale] = array_merge($this->_data[$locale], $inidata); + return $this->_data; + } + + /** + * returns the adapters name + * + * @return string + */ + public function toString() + { + return "Ini"; + } +} diff --git a/lib/zend/Zend/Translate/Adapter/Qt.php b/lib/zend/Zend/Translate/Adapter/Qt.php new file mode 100644 index 0000000000..3d23b64735 --- /dev/null +++ b/lib/zend/Zend/Translate/Adapter/Qt.php @@ -0,0 +1,175 @@ +_data = array(); + if (!is_readable($filename)) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Translation file \'' . $filename . '\' is not readable.'); + } + + $this->_target = $locale; + + $encoding = $this->_findEncoding($filename); + $this->_file = xml_parser_create($encoding); + xml_set_object($this->_file, $this); + xml_parser_set_option($this->_file, XML_OPTION_CASE_FOLDING, 0); + xml_set_element_handler($this->_file, "_startElement", "_endElement"); + xml_set_character_data_handler($this->_file, "_contentElement"); + + if (!xml_parse($this->_file, file_get_contents($filename))) { + $ex = sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($this->_file)), + xml_get_current_line_number($this->_file)); + xml_parser_free($this->_file); + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception($ex); + } + + return $this->_data; + } + + private function _startElement($file, $name, $attrib) + { + switch(strtolower($name)) { + case 'message': + $this->_source = null; + $this->_stag = false; + $this->_ttag = false; + $this->_scontent = null; + $this->_tcontent = null; + break; + case 'source': + $this->_stag = true; + break; + case 'translation': + $this->_ttag = true; + break; + default: + break; + } + } + + private function _endElement($file, $name) + { + switch (strtolower($name)) { + case 'source': + $this->_stag = false; + break; + + case 'translation': + if (!empty($this->_scontent) and !empty($this->_tcontent) or + (isset($this->_data[$this->_target][$this->_scontent]) === false)) { + $this->_data[$this->_target][$this->_scontent] = $this->_tcontent; + } + $this->_ttag = false; + break; + + default: + break; + } + } + + private function _contentElement($file, $data) + { + if ($this->_stag === true) { + $this->_scontent .= $data; + } + + if ($this->_ttag === true) { + $this->_tcontent .= $data; + } + } + + private function _findEncoding($filename) + { + $file = file_get_contents($filename, null, null, 0, 100); + if (strpos($file, "encoding") !== false) { + $encoding = substr($file, strpos($file, "encoding") + 9); + $encoding = substr($encoding, 1, strpos($encoding, $encoding[0], 1) - 1); + return $encoding; + } + return 'UTF-8'; + } + + /** + * Returns the adapter name + * + * @return string + */ + public function toString() + { + return "Qt"; + } +} diff --git a/lib/zend/Zend/Translate/Adapter/Tbx.php b/lib/zend/Zend/Translate/Adapter/Tbx.php new file mode 100644 index 0000000000..72dc1cb841 --- /dev/null +++ b/lib/zend/Zend/Translate/Adapter/Tbx.php @@ -0,0 +1,179 @@ +_data = array(); + if (!is_readable($filename)) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Translation file \'' . $filename . '\' is not readable.'); + } + + $encoding = $this->_findEncoding($filename); + $this->_file = xml_parser_create($encoding); + xml_set_object($this->_file, $this); + xml_parser_set_option($this->_file, XML_OPTION_CASE_FOLDING, 0); + xml_set_element_handler($this->_file, "_startElement", "_endElement"); + xml_set_character_data_handler($this->_file, "_contentElement"); + + if (!xml_parse($this->_file, file_get_contents($filename))) { + $ex = sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($this->_file)), + xml_get_current_line_number($this->_file)); + xml_parser_free($this->_file); + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception($ex); + } + + return $this->_data; + } + + private function _startElement($file, $name, $attrib) + { + if ($this->_term !== null) { + $this->_content .= "<".$name; + foreach($attrib as $key => $value) { + $this->_content .= " $key=\"$value\""; + } + $this->_content .= ">"; + } else { + switch(strtolower($name)) { + case 'termentry': + $this->_termentry = null; + break; + case 'langset': + if (isset($attrib['xml:lang']) === true) { + $this->_langset = $attrib['xml:lang']; + if (isset($this->_data[$this->_langset]) === false) { + $this->_data[$this->_langset] = array(); + } + } + break; + case 'term': + $this->_term = true; + $this->_content = null; + break; + default: + break; + } + } + } + + private function _endElement($file, $name) + { + if (($this->_term !== null) and ($name != "term")) { + $this->_content .= ""; + } else { + switch (strtolower($name)) { + case 'langset': + $this->_langset = null; + break; + case 'term': + $this->_term = null; + if (empty($this->_termentry)) { + $this->_termentry = $this->_content; + } + if (!empty($this->_content) or (isset($this->_data[$this->_langset][$this->_termentry]) === false)) { + $this->_data[$this->_langset][$this->_termentry] = $this->_content; + } + break; + default: + break; + } + } + } + + private function _contentElement($file, $data) + { + if ($this->_term !== null) { + $this->_content .= $data; + } + } + + private function _findEncoding($filename) + { + $file = file_get_contents($filename, null, null, 0, 100); + if (strpos($file, "encoding") !== false) { + $encoding = substr($file, strpos($file, "encoding") + 9); + $encoding = substr($encoding, 1, strpos($encoding, $encoding[0], 1) - 1); + return $encoding; + } + return 'UTF-8'; + } + + /** + * Returns the adapter name + * + * @return string + */ + public function toString() + { + return "Tbx"; + } +} diff --git a/lib/zend/Zend/Translate/Adapter/Tmx.php b/lib/zend/Zend/Translate/Adapter/Tmx.php new file mode 100644 index 0000000000..403e6c1523 --- /dev/null +++ b/lib/zend/Zend/Translate/Adapter/Tmx.php @@ -0,0 +1,181 @@ +_data = array(); + if (!is_readable($filename)) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Translation file \'' . $filename . '\' is not readable.'); + } + + $encoding = $this->_findEncoding($filename); + $this->_file = xml_parser_create($encoding); + xml_set_object($this->_file, $this); + xml_parser_set_option($this->_file, XML_OPTION_CASE_FOLDING, 0); + xml_set_element_handler($this->_file, "_startElement", "_endElement"); + xml_set_character_data_handler($this->_file, "_contentElement"); + + if (!xml_parse($this->_file, file_get_contents($filename))) { + $ex = sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($this->_file)), + xml_get_current_line_number($this->_file)); + xml_parser_free($this->_file); + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception($ex); + } + + return $this->_data; + } + + private function _startElement($file, $name, $attrib) + { + if ($this->_seg !== null) { + $this->_content .= "<".$name; + foreach($attrib as $key => $value) { + $this->_content .= " $key=\"$value\""; + } + $this->_content .= ">"; + } else { + switch(strtolower($name)) { + case 'tu': + if (isset($attrib['tuid']) === true) { + $this->_tu = $attrib['tuid']; + } + break; + case 'tuv': + if (isset($attrib['xml:lang']) === true) { + $this->_tuv = $attrib['xml:lang']; + if (isset($this->_data[$this->_tuv]) === false) { + $this->_data[$this->_tuv] = array(); + } + } + break; + case 'seg': + $this->_seg = true; + $this->_content = null; + break; + default: + break; + } + } + } + + private function _endElement($file, $name) + { + if (($this->_seg !== null) and ($name !== 'seg')) { + $this->_content .= ""; + } else { + switch (strtolower($name)) { + case 'tu': + $this->_tu = null; + break; + case 'tuv': + $this->_tuv = null; + break; + case 'seg': + $this->_seg = null; + if (!empty($this->_content) or (!isset($this->_data[$this->_tuv][$this->_tu]))) { + $this->_data[$this->_tuv][$this->_tu] = $this->_content; + } + break; + default: + break; + } + } + } + + private function _contentElement($file, $data) + { + if (($this->_seg !== null) and ($this->_tu !== null) and ($this->_tuv !== null)) { + $this->_content .= $data; + } + } + + private function _findEncoding($filename) + { + $file = file_get_contents($filename, null, null, 0, 100); + if (strpos($file, "encoding") !== false) { + $encoding = substr($file, strpos($file, "encoding") + 9); + $encoding = substr($encoding, 1, strpos($encoding, $encoding[0], 1) - 1); + return $encoding; + } + return 'UTF-8'; + } + + /** + * Returns the adapter name + * + * @return string + */ + public function toString() + { + return "Tmx"; + } +} diff --git a/lib/zend/Zend/Translate/Adapter/Xliff.php b/lib/zend/Zend/Translate/Adapter/Xliff.php new file mode 100644 index 0000000000..ff33129081 --- /dev/null +++ b/lib/zend/Zend/Translate/Adapter/Xliff.php @@ -0,0 +1,220 @@ +_data = array(); + if (!is_readable($filename)) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Translation file \'' . $filename . '\' is not readable.'); + } + + $encoding = $this->_findEncoding($filename); + $this->_target = $locale; + $this->_file = xml_parser_create($encoding); + xml_set_object($this->_file, $this); + xml_parser_set_option($this->_file, XML_OPTION_CASE_FOLDING, 0); + xml_set_element_handler($this->_file, "_startElement", "_endElement"); + xml_set_character_data_handler($this->_file, "_contentElement"); + + if (!xml_parse($this->_file, file_get_contents($filename))) { + $ex = sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($this->_file)), + xml_get_current_line_number($this->_file)); + xml_parser_free($this->_file); + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception($ex); + } + + return $this->_data; + } + + private function _startElement($file, $name, $attrib) + { + if ($this->_stag === true) { + $this->_scontent .= "<".$name; + foreach($attrib as $key => $value) { + $this->_scontent .= " $key=\"$value\""; + } + $this->_scontent .= ">"; + } else if ($this->_ttag === true) { + $this->_tcontent .= "<".$name; + foreach($attrib as $key => $value) { + $this->_tcontent .= " $key=\"$value\""; + } + $this->_tcontent .= ">"; + } else { + switch(strtolower($name)) { + case 'file': + $this->_source = $attrib['source-language']; + if (isset($attrib['target-language'])) { + $this->_target = $attrib['target-language']; + } + + if (!isset($this->_data[$this->_source])) { + $this->_data[$this->_source] = array(); + } + + if (!isset($this->_data[$this->_target])) { + $this->_data[$this->_target] = array(); + } + + break; + case 'trans-unit': + $this->_transunit = true; + break; + case 'source': + if ($this->_transunit === true) { + $this->_scontent = null; + $this->_stag = true; + $this->_ttag = false; + } + break; + case 'target': + if ($this->_transunit === true) { + $this->_tcontent = null; + $this->_ttag = true; + $this->_stag = false; + } + break; + default: + break; + } + } + } + + private function _endElement($file, $name) + { + if (($this->_stag === true) and ($name !== 'source')) { + $this->_scontent .= ""; + } else if (($this->_ttag === true) and ($name !== 'target')) { + $this->_tcontent .= ""; + } else { + switch (strtolower($name)) { + case 'trans-unit': + $this->_transunit = null; + $this->_scontent = null; + $this->_tcontent = null; + break; + case 'source': + if (!empty($this->_scontent) and !empty($this->_tcontent) or + (isset($this->_data[$this->_source][$this->_scontent]) === false)) { + $this->_data[$this->_source][$this->_scontent] = $this->_scontent; + } + $this->_stag = false; + break; + case 'target': + if (!empty($this->_scontent) and !empty($this->_tcontent) or + (isset($this->_data[$this->_source][$this->_scontent]) === false)) { + $this->_data[$this->_target][$this->_scontent] = $this->_tcontent; + } + $this->_ttag = false; + break; + default: + break; + } + } + } + + private function _contentElement($file, $data) + { + if (($this->_transunit !== null) and ($this->_source !== null) and ($this->_stag === true)) { + $this->_scontent .= $data; + } + + if (($this->_transunit !== null) and ($this->_target !== null) and ($this->_ttag === true)) { + $this->_tcontent .= $data; + } + } + + private function _findEncoding($filename) + { + $file = file_get_contents($filename, null, null, 0, 100); + if (strpos($file, "encoding") !== false) { + $encoding = substr($file, strpos($file, "encoding") + 9); + $encoding = substr($encoding, 1, strpos($encoding, $encoding[0], 1) - 1); + return $encoding; + } + return 'UTF-8'; + } + + /** + * Returns the adapter name + * + * @return string + */ + public function toString() + { + return "Xliff"; + } +} diff --git a/lib/zend/Zend/Translate/Adapter/XmlTm.php b/lib/zend/Zend/Translate/Adapter/XmlTm.php new file mode 100644 index 0000000000..a704a26b32 --- /dev/null +++ b/lib/zend/Zend/Translate/Adapter/XmlTm.php @@ -0,0 +1,154 @@ +_data = array(); + $this->_lang = $locale; + if (!is_readable($filename)) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Translation file \'' . $filename . '\' is not readable.'); + } + + $encoding = $this->_findEncoding($filename); + $this->_file = xml_parser_create($encoding); + xml_set_object($this->_file, $this); + xml_parser_set_option($this->_file, XML_OPTION_CASE_FOLDING, 0); + xml_set_element_handler($this->_file, "_startElement", "_endElement"); + xml_set_character_data_handler($this->_file, "_contentElement"); + + if (!xml_parse($this->_file, file_get_contents($filename))) { + $ex = sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($this->_file)), + xml_get_current_line_number($this->_file)); + xml_parser_free($this->_file); + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception($ex); + } + + return $this->_data; + } + + private function _startElement($file, $name, $attrib) + { + switch(strtolower($name)) { + case 'tm:tu': + $this->_tag = $attrib['id']; + $this->_content = null; + break; + default: + break; + } + } + + private function _endElement($file, $name) + { + switch (strtolower($name)) { + case 'tm:tu': + if (!empty($this->_tag) and !empty($this->_content) or + (isset($this->_data[$this->_lang][$this->_tag]) === false)) { + $this->_data[$this->_lang][$this->_tag] = $this->_content; + } + $this->_tag = null; + $this->_content = null; + break; + + default: + break; + } + } + + private function _contentElement($file, $data) + { + if (($this->_tag !== null)) { + $this->_content .= $data; + } + } + + private function _findEncoding($filename) + { + $file = file_get_contents($filename, null, null, 0, 100); + if (strpos($file, "encoding") !== false) { + $encoding = substr($file, strpos($file, "encoding") + 9); + $encoding = substr($encoding, 1, strpos($encoding, $encoding[0], 1) - 1); + return $encoding; + } + return 'UTF-8'; + } + + /** + * Returns the adapter name + * + * @return string + */ + public function toString() + { + return "XmlTm"; + } +} diff --git a/lib/zend/Zend/Translate/Exception.php b/lib/zend/Zend/Translate/Exception.php new file mode 100644 index 0000000000..30b421ec42 --- /dev/null +++ b/lib/zend/Zend/Translate/Exception.php @@ -0,0 +1,37 @@ + 3) { + $locale = substr($locale, 0, -strlen(strrchr($locale, '_'))); + } + + switch($locale) { + case 'bo': + case 'dz': + case 'id': + case 'ja': + case 'jv': + case 'ka': + case 'km': + case 'kn': + case 'ko': + case 'ms': + case 'th': + case 'tr': + case 'vi': + return 0; + break; + + case 'af': + case 'az': + case 'bn': + case 'bg': + case 'ca': + case 'da': + case 'de': + case 'el': + case 'en': + case 'eo': + case 'es': + case 'et': + case 'eu': + case 'fa': + case 'fi': + case 'fo': + case 'fur': + case 'fy': + case 'gl': + case 'gu': + case 'ha': + case 'he': + case 'hu': + case 'is': + case 'it': + case 'ku': + case 'lb': + case 'ml': + case 'mn': + case 'mr': + case 'nah': + case 'nb': + case 'ne': + case 'nl': + case 'nn': + case 'no': + case 'om': + case 'or': + case 'pa': + case 'pap': + case 'ps': + case 'pt': + case 'so': + case 'sq': + case 'sv': + case 'sw': + case 'ta': + case 'te': + case 'tk': + case 'ur': + case 'zh': + case 'zu': + return ($number == 1) ? 0 : 1; + + case 'am': + case 'bh': + case 'fil': + case 'fr': + case 'gun': + case 'hi': + case 'ln': + case 'mg': + case 'nso': + case 'xbr': + case 'ti': + case 'wa': + return (($number == 0) || ($number == 1)) ? 0 : 1; + + case 'be': + case 'bs': + case 'hr': + case 'ru': + case 'sr': + case 'uk': + return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + + case 'cs': + case 'sk': + return ($number == 1) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2); + + case 'ga': + return ($number == 1) ? 0 : (($number == 2) ? 1 : 2); + + case 'lt': + return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + + case 'sl': + return ($number % 100 == 1) ? 0 : (($number % 100 == 2) ? 1 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 2 : 3)); + + case 'mk': + return ($number % 10 == 1) ? 0 : 1; + + case 'mt': + return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3)); + + case 'lv': + return ($number == 0) ? 0 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2); + + case 'pl': + return ($number == 1) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 > 29))) ? 1 : 2); + + case 'cy': + return ($number == 1) ? 0 : (($number == 2) ? 1 : ((($number == 8) || ($number == 11)) ? 2 : 3)); + + case 'ro': + return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2); + + case 'ar': + return ($number == 0) ? 0 : (($number == 1) ? 1 : (($number == 2) ? 2 : ((($number >= 3) && ($number <= 10)) ? 3 : ((($number >= 11) && ($number <= 99)) ? 4 : 5)))); + + default: + return 0; + } + } +} diff --git a/lib/zend/Zend/Uri/Exception.php b/lib/zend/Zend/Uri/Exception.php new file mode 100644 index 0000000000..d2fefec15c --- /dev/null +++ b/lib/zend/Zend/Uri/Exception.php @@ -0,0 +1,37 @@ +_regex['alphanum'] = '[^\W_]'; - $this->_regex['escaped'] = '(?:%[\da-fA-F]{2})'; - $this->_regex['mark'] = '[-_.!~*\'()\[\]]'; - $this->_regex['reserved'] = '[;\/?:@&=+$,]'; - $this->_regex['unreserved'] = '(?:' . $this->_regex['alphanum'] . '|' . $this->_regex['mark'] . ')'; - $this->_regex['segment'] = '(?:(?:' . $this->_regex['unreserved'] . '|' . $this->_regex['escaped'] - . '|[:@&=+$,;])*)'; - $this->_regex['path'] = '(?:\/' . $this->_regex['segment'] . '?)+'; - $this->_regex['uric'] = '(?:' . $this->_regex['reserved'] . '|' . $this->_regex['unreserved'] . '|' - . $this->_regex['escaped'] . ')'; + + // Escaped special characters (eg. '%25' for '%') + $this->_regex['escaped'] = '%[[:xdigit:]]{2}'; + + // Unreserved characters + $this->_regex['unreserved'] = '[' . self::CHAR_ALNUM . self::CHAR_MARK . ']'; + + // Segment can use escaped, unreserved or a set of additional chars + $this->_regex['segment'] = '(?:' . $this->_regex['escaped'] . '|[' . + self::CHAR_ALNUM . self::CHAR_MARK . self::CHAR_SEGMENT . '])*'; + + // Path can be a series of segmets char strings seperated by '/' + $this->_regex['path'] = '(?:\/(?:' . $this->_regex['segment'] . ')?)+'; + + // URI characters can be escaped, alphanumeric, mark or reserved chars + $this->_regex['uric'] = '(?:' . $this->_regex['escaped'] . '|[' . + self::CHAR_ALNUM . self::CHAR_MARK . self::CHAR_RESERVED . + + // If unwise chars are allowed, add them to the URI chars class + (self::$_config['allow_unwise'] ? self::CHAR_UNWISE : '') . '])'; + // If no scheme-specific part was supplied, the user intends to create // a new URI with this object. No further parsing is required. if (strlen($schemeSpecific) === 0) { @@ -150,7 +170,8 @@ class Zend_Uri_Http extends Zend_Uri public static function fromString($uri) { if (is_string($uri) === false) { - throw new InvalidArgumentException('$uri is not a string'); + require_once 'Zend/Uri/Exception.php'; + throw new Zend_Uri_Exception('$uri is not a string'); } $uri = explode(':', $uri, 2); @@ -295,8 +316,9 @@ class Zend_Uri_Http extends Zend_Uri } // Check the username against the allowed values - $status = @preg_match('/^(' . $this->_regex['alphanum'] . '|' . $this->_regex['mark'] . '|' - . $this->_regex['escaped'] . '|[;:&=+$,])+$/', $username); + $status = @preg_match('/^(?:' . $this->_regex['escaped'] . '|[' . + self::CHAR_ALNUM . self::CHAR_MARK . ';:&=+$,' . '])+$/', $username); + if ($status === false) { require_once 'Zend/Uri/Exception.php'; throw new Zend_Uri_Exception('Internal error: username validation failed'); @@ -361,8 +383,9 @@ class Zend_Uri_Http extends Zend_Uri } // Check the password against the allowed values - $status = @preg_match('/^(' . $this->_regex['alphanum'] . '|' . $this->_regex['mark'] . '|' - . $this->_regex['escaped'] . '|[;:&=+$,])+$/', $password); + $status = @preg_match('/^(?:' . $this->_regex['escaped'] . '|[' . + self::CHAR_ALNUM . self::CHAR_MARK . ';:&=+$,' . '])+$/', $password); + if ($status === false) { require_once 'Zend/Uri/Exception.php'; throw new Zend_Uri_Exception('Internal error: password validation failed.'); diff --git a/lib/zend/Zend/Validate/Abstract.php b/lib/zend/Zend/Validate/Abstract.php index 31255108e8..fb9ac45b87 100644 --- a/lib/zend/Zend/Validate/Abstract.php +++ b/lib/zend/Zend/Validate/Abstract.php @@ -1,5 +1,4 @@ _messageVariables); } + /** + * Returns the message templates from the validator + * + * @return array + */ + public function getMessageTemplates() + { + return $this->_messageTemplates; + } + /** * Sets the validation failure message template for a particular key * @@ -122,12 +142,17 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface { if ($messageKey === null) { $keys = array_keys($this->_messageTemplates); - $messageKey = current($keys); + foreach($keys as $key) { + $this->setMessage($messageString, $key); + } + return $this; } + if (!isset($this->_messageTemplates[$messageKey])) { require_once 'Zend/Validate/Exception.php'; throw new Zend_Validate_Exception("No message template exists for key '$messageKey'"); } + $this->_messageTemplates[$messageKey] = $messageString; return $this; } @@ -175,7 +200,7 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface * * Returns null if and only if $messageKey does not correspond to an existing template. * - * If a translator is available and a translation exists for $messageKey, + * If a translator is available and a translation exists for $messageKey, * the translation will be used. * * @param string $messageKey @@ -198,23 +223,39 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface } } + if (is_object($value)) { + if (!in_array('__toString', get_class_methods($value))) { + $value = get_class($value) . ' object'; + } else { + $value = $value->__toString(); + } + } else { + $value = (string)$value; + } + if ($this->getObscureValue()) { $value = str_repeat('*', strlen($value)); } $message = str_replace('%value%', (string) $value, $message); foreach ($this->_messageVariables as $ident => $property) { - $message = str_replace("%$ident%", $this->$property, $message); + $message = str_replace("%$ident%", (string) $this->$property, $message); } + + $length = self::getMessageLength(); + if (($length > -1) && (strlen($message) > $length)) { + $message = substr($message, 0, (self::getMessageLength() - 3)) . '...'; + } + return $message; } /** - * @param string $messageKey OPTIONAL + * @param string $messageKey * @param string $value OPTIONAL * @return void */ - protected function _error($messageKey = null, $value = null) + protected function _error($messageKey, $value = null) { if ($messageKey === null) { $keys = array_keys($this->_messageTemplates); @@ -253,8 +294,8 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface /** * Set flag indicating whether or not value should be obfuscated in messages - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Validate_Abstract */ public function setObscureValue($flag) @@ -264,9 +305,9 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface } /** - * Retrieve flag indicating whether or not value should be obfuscated in + * Retrieve flag indicating whether or not value should be obfuscated in * messages - * + * * @return bool */ public function getObscureValue() @@ -276,8 +317,8 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface /** * Set translation object - * - * @param Zend_Translate|Zend_Translate_Adapter|null $translator + * + * @param Zend_Translate|Zend_Translate_Adapter|null $translator * @return Zend_Validate_Abstract */ public function setTranslator($translator = null) @@ -295,11 +336,15 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface /** * Return translation object - * + * * @return Zend_Translate_Adapter|null */ public function getTranslator() { + if ($this->translatorIsDisabled()) { + return null; + } + if (null === $this->_translator) { return self::getDefaultTranslator(); } @@ -309,8 +354,8 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface /** * Set default translation object for all validate objects - * - * @param Zend_Translate|Zend_Translate_Adapter|null $translator + * + * @param Zend_Translate|Zend_Translate_Adapter|null $translator * @return void */ public static function setDefaultTranslator($translator = null) @@ -327,7 +372,7 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface /** * Get default translation object for all validate objects - * + * * @return Zend_Translate_Adapter|null */ public static function getDefaultTranslator() @@ -343,6 +388,49 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface } } } + return self::$_defaultTranslator; } + + /** + * Indicate whether or not translation should be disabled + * + * @param bool $flag + * @return Zend_Validate_Abstract + */ + public function setDisableTranslator($flag) + { + $this->_translatorDisabled = (bool) $flag; + return $this; + } + + /** + * Is translation disabled? + * + * @return bool + */ + public function translatorIsDisabled() + { + return $this->_translatorDisabled; + } + + /** + * Returns the maximum allowed message length + * + * @return integer + */ + public static function getMessageLength() + { + return self::$_messageLength; + } + + /** + * Sets the maximum allowed message length + * + * @param integer $length + */ + public static function setMessageLength($length = -1) + { + self::$_messageLength = $length; + } } diff --git a/lib/zend/Zend/Validate/Alnum.php b/lib/zend/Zend/Validate/Alnum.php new file mode 100644 index 0000000000..7a6bfde579 --- /dev/null +++ b/lib/zend/Zend/Validate/Alnum.php @@ -0,0 +1,138 @@ + "Invalid type given, value should be float, string, or integer", + self::NOT_ALNUM => "'%value%' has not only alphabetic and digit characters", + self::STRING_EMPTY => "'%value%' is an empty string" + ); + + /** + * Sets default option values for this instance + * + * @param boolean $allowWhiteSpace + * @return void + */ + public function __construct($allowWhiteSpace = false) + { + $this->allowWhiteSpace = (boolean) $allowWhiteSpace; + } + + /** + * Returns the allowWhiteSpace option + * + * @return boolean + */ + public function getAllowWhiteSpace() + { + return $this->allowWhiteSpace; + } + + /** + * Sets the allowWhiteSpace option + * + * @param boolean $allowWhiteSpace + * @return Zend_Filter_Alnum Provides a fluent interface + */ + public function setAllowWhiteSpace($allowWhiteSpace) + { + $this->allowWhiteSpace = (boolean) $allowWhiteSpace; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value contains only alphabetic and digit characters + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value) && !is_float($value)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue($value); + + if ('' === $value) { + $this->_error(self::STRING_EMPTY); + return false; + } + + if (null === self::$_filter) { + /** + * @see Zend_Filter_Alnum + */ + require_once 'Zend/Filter/Alnum.php'; + self::$_filter = new Zend_Filter_Alnum(); + } + + self::$_filter->allowWhiteSpace = $this->allowWhiteSpace; + + if ($value != self::$_filter->filter($value)) { + $this->_error(self::NOT_ALNUM); + return false; + } + + return true; + } + +} diff --git a/lib/zend/Zend/Validate/Alpha.php b/lib/zend/Zend/Validate/Alpha.php new file mode 100644 index 0000000000..2857526f00 --- /dev/null +++ b/lib/zend/Zend/Validate/Alpha.php @@ -0,0 +1,138 @@ + "Invalid type given, value should be a string", + self::NOT_ALPHA => "'%value%' has not only alphabetic characters", + self::STRING_EMPTY => "'%value%' is an empty string" + ); + + /** + * Sets default option values for this instance + * + * @param boolean $allowWhiteSpace + * @return void + */ + public function __construct($allowWhiteSpace = false) + { + $this->allowWhiteSpace = (boolean) $allowWhiteSpace; + } + + /** + * Returns the allowWhiteSpace option + * + * @return boolean + */ + public function getAllowWhiteSpace() + { + return $this->allowWhiteSpace; + } + + /** + * Sets the allowWhiteSpace option + * + * @param boolean $allowWhiteSpace + * @return Zend_Filter_Alpha Provides a fluent interface + */ + public function setAllowWhiteSpace($allowWhiteSpace) + { + $this->allowWhiteSpace = (boolean) $allowWhiteSpace; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value contains only alphabetic characters + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue($value); + + if ('' === $value) { + $this->_error(self::STRING_EMPTY); + return false; + } + + if (null === self::$_filter) { + /** + * @see Zend_Filter_Alpha + */ + require_once 'Zend/Filter/Alpha.php'; + self::$_filter = new Zend_Filter_Alpha(); + } + + self::$_filter->allowWhiteSpace = $this->allowWhiteSpace; + + if ($value !== self::$_filter->filter($value)) { + $this->_error(self::NOT_ALPHA); + return false; + } + + return true; + } + +} diff --git a/lib/zend/Zend/Validate/Barcode.php b/lib/zend/Zend/Validate/Barcode.php new file mode 100644 index 0000000000..5736ea544b --- /dev/null +++ b/lib/zend/Zend/Validate/Barcode.php @@ -0,0 +1,95 @@ +setType($barcodeType); + } + + /** + * Sets a new barcode validator + * + * @param string $barcodeType - Barcode validator to use + * @return void + * @throws Zend_Validate_Exception + */ + public function setType($barcodeType) + { + switch (strtolower($barcodeType)) { + case 'upc': + case 'upc-a': + require_once 'Zend/Validate/Barcode/UpcA.php'; + $class = 'Zend_Validate_Barcode_UpcA'; + break; + case 'ean13': + case 'ean-13': + require_once 'Zend/Validate/Barcode/Ean13.php'; + $class = 'Zend_Validate_Barcode_Ean13'; + break; + default: + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("Barcode type '$barcodeType' is not supported'"); + break; + } + + $this->_barcodeValidator = new $class; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value contains a valid barcode + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + return call_user_func(array($this->_barcodeValidator, 'isValid'), $value); + } +} diff --git a/lib/zend/Zend/Validate/Barcode/Ean13.php b/lib/zend/Zend/Validate/Barcode/Ean13.php new file mode 100644 index 0000000000..fda96e923f --- /dev/null +++ b/lib/zend/Zend/Validate/Barcode/Ean13.php @@ -0,0 +1,110 @@ + "'%value%' is an invalid EAN-13 barcode", + self::INVALID_LENGTH => "'%value%' should be 13 characters", + self::NOT_NUMERIC => "'%value%' should contain only numeric characters", + ); + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value contains a valid barcode + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value) || !ctype_digit($value)) { + $this->_error(self::NOT_NUMERIC); + return false; + } + + $this->_setValue($value); + if (strlen($value) !== 13) { + $this->_error(self::INVALID_LENGTH); + return false; + } + + $barcode = strrev(substr($value, 0, -1)); + $oddSum = 0; + $evenSum = 0; + + for ($i = 0; $i < 12; $i++) { + if ($i % 2 === 0) { + $oddSum += $barcode[$i] * 3; + } elseif ($i % 2 === 1) { + $evenSum += $barcode[$i]; + } + } + + $calculation = ($oddSum + $evenSum) % 10; + $checksum = ($calculation === 0) ? 0 : 10 - $calculation; + + if ($value[12] != $checksum) { + $this->_error(self::INVALID); + return false; + } + + return true; + } +} diff --git a/lib/zend/Zend/Validate/Barcode/UpcA.php b/lib/zend/Zend/Validate/Barcode/UpcA.php new file mode 100644 index 0000000000..dfb4fcd75a --- /dev/null +++ b/lib/zend/Zend/Validate/Barcode/UpcA.php @@ -0,0 +1,103 @@ + "'%value%' is an invalid UPC-A barcode", + self::INVALID_LENGTH => "'%value%' should be 12 characters", + ); + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value contains a valid barcode + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue($value); + if (strlen($value) !== 12) { + $this->_error(self::INVALID_LENGTH); + return false; + } + + $barcode = substr($value, 0, -1); + $oddSum = 0; + $evenSum = 0; + + for ($i = 0; $i < 11; $i++) { + if ($i % 2 === 0) { + $oddSum += $barcode[$i] * 3; + } elseif ($i % 2 === 1) { + $evenSum += $barcode[$i]; + } + } + + $calculation = ($oddSum + $evenSum) % 10; + $checksum = ($calculation === 0) ? 0 : 10 - $calculation; + + if ($value[11] != $checksum) { + $this->_error(self::INVALID); + return false; + } + + return true; + } +} diff --git a/lib/zend/Zend/Validate/Between.php b/lib/zend/Zend/Validate/Between.php new file mode 100644 index 0000000000..75f6d09959 --- /dev/null +++ b/lib/zend/Zend/Validate/Between.php @@ -0,0 +1,200 @@ + "'%value%' is not between '%min%' and '%max%', inclusively", + self::NOT_BETWEEN_STRICT => "'%value%' is not strictly between '%min%' and '%max%'" + ); + + /** + * Additional variables available for validation failure messages + * + * @var array + */ + protected $_messageVariables = array( + 'min' => '_min', + 'max' => '_max' + ); + + /** + * Minimum value + * + * @var mixed + */ + protected $_min; + + /** + * Maximum value + * + * @var mixed + */ + protected $_max; + + /** + * Whether to do inclusive comparisons, allowing equivalence to min and/or max + * + * If false, then strict comparisons are done, and the value may equal neither + * the min nor max options + * + * @var boolean + */ + protected $_inclusive; + + /** + * Sets validator options + * + * @param mixed $min + * @param mixed $max + * @param boolean $inclusive + * @return void + */ + public function __construct($min, $max, $inclusive = true) + { + $this->setMin($min) + ->setMax($max) + ->setInclusive($inclusive); + } + + /** + * Returns the min option + * + * @return mixed + */ + public function getMin() + { + return $this->_min; + } + + /** + * Sets the min option + * + * @param mixed $min + * @return Zend_Validate_Between Provides a fluent interface + */ + public function setMin($min) + { + $this->_min = $min; + return $this; + } + + /** + * Returns the max option + * + * @return mixed + */ + public function getMax() + { + return $this->_max; + } + + /** + * Sets the max option + * + * @param mixed $max + * @return Zend_Validate_Between Provides a fluent interface + */ + public function setMax($max) + { + $this->_max = $max; + return $this; + } + + /** + * Returns the inclusive option + * + * @return boolean + */ + public function getInclusive() + { + return $this->_inclusive; + } + + /** + * Sets the inclusive option + * + * @param boolean $inclusive + * @return Zend_Validate_Between Provides a fluent interface + */ + public function setInclusive($inclusive) + { + $this->_inclusive = $inclusive; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value is between min and max options, inclusively + * if inclusive option is true. + * + * @param mixed $value + * @return boolean + */ + public function isValid($value) + { + $this->_setValue($value); + + if ($this->_inclusive) { + if ($this->_min > $value || $value > $this->_max) { + $this->_error(self::NOT_BETWEEN); + return false; + } + } else { + if ($this->_min >= $value || $value >= $this->_max) { + $this->_error(self::NOT_BETWEEN_STRICT); + return false; + } + } + return true; + } + +} diff --git a/lib/zend/Zend/Validate/Ccnum.php b/lib/zend/Zend/Validate/Ccnum.php new file mode 100644 index 0000000000..ffad2a9c26 --- /dev/null +++ b/lib/zend/Zend/Validate/Ccnum.php @@ -0,0 +1,111 @@ + "'%value%' must contain between 13 and 19 digits", + self::CHECKSUM => "Luhn algorithm (mod-10 checksum) failed on '%value%'" + ); + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value follows the Luhn algorithm (mod-10 checksum) + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + $this->_setValue($value); + + if (null === self::$_filter) { + /** + * @see Zend_Filter_Digits + */ + require_once 'Zend/Filter/Digits.php'; + self::$_filter = new Zend_Filter_Digits(); + } + + $valueFiltered = self::$_filter->filter($value); + + $length = strlen($valueFiltered); + + if ($length < 13 || $length > 19) { + $this->_error(self::LENGTH); + return false; + } + + $sum = 0; + $weight = 2; + + for ($i = $length - 2; $i >= 0; $i--) { + $digit = $weight * $valueFiltered[$i]; + $sum += floor($digit / 10) + $digit % 10; + $weight = $weight % 2 + 1; + } + + if ((10 - $sum % 10) % 10 != $valueFiltered[$length - 1]) { + $this->_error(self::CHECKSUM, $valueFiltered); + return false; + } + + return true; + } + +} diff --git a/lib/zend/Zend/Validate/Date.php b/lib/zend/Zend/Validate/Date.php new file mode 100644 index 0000000000..eb0a24b020 --- /dev/null +++ b/lib/zend/Zend/Validate/Date.php @@ -0,0 +1,238 @@ + "Invalid type given, value should be string, integer, array or Zend_Date", + self::NOT_YYYY_MM_DD => "'%value%' is not of the format YYYY-MM-DD", + self::INVALID_DATE => "'%value%' does not appear to be a valid date", + self::FALSEFORMAT => "'%value%' does not fit given date format" + ); + + /** + * Optional format + * + * @var string|null + */ + protected $_format; + + /** + * Optional locale + * + * @var string|Zend_Locale|null + */ + protected $_locale; + + /** + * Sets validator options + * + * @param string $format OPTIONAL + * @param string|Zend_Locale $locale OPTIONAL + * @return void + */ + public function __construct($format = null, $locale = null) + { + $this->setFormat($format); + if ($locale === null) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Locale')) { + $locale = Zend_Registry::get('Zend_Locale'); + } + } + + if ($locale !== null) { + $this->setLocale($locale); + } + } + + /** + * Returns the locale option + * + * @return string|Zend_Locale|null + */ + public function getLocale() + { + return $this->_locale; + } + + /** + * Sets the locale option + * + * @param string|Zend_Locale $locale + * @return Zend_Validate_Date provides a fluent interface + */ + public function setLocale($locale = null) + { + require_once 'Zend/Locale.php'; + $this->_locale = Zend_Locale::findLocale($locale); + return $this; + } + + /** + * Returns the locale option + * + * @return string|null + */ + public function getFormat() + { + return $this->_format; + } + + /** + * Sets the format option + * + * @param string $format + * @return Zend_Validate_Date provides a fluent interface + */ + public function setFormat($format = null) + { + $this->_format = $format; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if $value is a valid date of the format YYYY-MM-DD + * If optional $format or $locale is set the date format is checked + * according to Zend_Date, see Zend_Date::isDate() + * + * @param string|array|Zend_Date $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value) && !is_float($value) && + !is_array($value) && !($value instanceof Zend_Date)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue($value); + + if (($this->_format !== null) || ($this->_locale !== null) || is_array($value) || + $value instanceof Zend_Date) { + require_once 'Zend/Date.php'; + if (!Zend_Date::isDate($value, $this->_format, $this->_locale)) { + if ($this->_checkFormat($value) === false) { + $this->_error(self::FALSEFORMAT); + } else { + $this->_error(self::INVALID_DATE); + } + return false; + } + } else { + if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) { + $this->_error(self::NOT_YYYY_MM_DD); + return false; + } + + list($year, $month, $day) = sscanf($value, '%d-%d-%d'); + + if (!checkdate($month, $day, $year)) { + $this->_error(self::INVALID_DATE); + return false; + } + } + + return true; + } + + /** + * Check if the given date fits the given format + * + * @param string $value Date to check + * @return boolean False when date does not fit the format + */ + private function _checkFormat($value) + { + try { + require_once 'Zend/Locale/Format.php'; + $parsed = Zend_Locale_Format::getDate($value, array( + 'date_format' => $this->_format, 'format_type' => 'iso', + 'fix_date' => false)); + if (isset($parsed['year']) and ((strpos(strtoupper($this->_format), 'YY') !== false) and + (strpos(strtoupper($this->_format), 'YYYY') === false))) { + $parsed['year'] = Zend_Date::getFullYear($parsed['year']); + } + } catch (Exception $e) { + // Date can not be parsed + return false; + } + + if (((strpos($this->_format, 'Y') !== false) or (strpos($this->_format, 'y') !== false)) and + (!isset($parsed['year']))) { + // Year expected but not found + return false; + } + + if ((strpos($this->_format, 'M') !== false) and (!isset($parsed['month']))) { + // Month expected but not found + return false; + } + + if ((strpos($this->_format, 'd') !== false) and (!isset($parsed['day']))) { + // Day expected but not found + return false; + } + + if (((strpos($this->_format, 'H') !== false) or (strpos($this->_format, 'h') !== false)) and + (!isset($parsed['hour']))) { + // Hour expected but not found + return false; + } + + if ((strpos($this->_format, 'm') !== false) and (!isset($parsed['minute']))) { + // Minute expected but not found + return false; + } + + if ((strpos($this->_format, 's') !== false) and (!isset($parsed['second']))) { + // Second expected but not found + return false; + } + + // Date fits the format + return true; + } +} diff --git a/lib/zend/Zend/Validate/Db/Abstract.php b/lib/zend/Zend/Validate/Db/Abstract.php new file mode 100644 index 0000000000..9c601b921b --- /dev/null +++ b/lib/zend/Zend/Validate/Db/Abstract.php @@ -0,0 +1,148 @@ + 'No record matching %value% was found', + self::ERROR_RECORD_FOUND => 'A record matching %value% was found'); + + /** + * @var string + */ + protected $_schema = null; + + /** + * @var string + */ + protected $_table = ''; + + /** + * @var string + */ + protected $_field = ''; + + /** + * @var mixed + */ + protected $_exclude = null; + + /** + * Database adapter to use. If null isValid() will use Zend_Db::getInstance instead + * + * @var unknown_type + */ + protected $_adapter = null; + + /** + * Provides basic configuration for use with Zend_Validate_Db Validators + * Setting $exclude allows a single record to be excluded from matching. + * Exclude can either be a String containing a where clause, or an array with `field` and `value` keys + * to define the where clause added to the sql. + * A database adapter may optionally be supplied to avoid using the registered default adapter. + * + * @param string||array $table The database table to validate against, or array with table and schema keys + * @param string $field The field to check for a match + * @param string||array $exclude An optional where clause or field/value pair to exclude from the query + * @param Zend_Db_Adapter_Abstract $adapter An optional database adapter to use. + */ + public function __construct($table, $field, $exclude = null, Zend_Db_Adapter_Abstract $adapter = null) + { + if ($adapter !== null) { + $this->_adapter = $adapter; + } + $this->_exclude = $exclude; + $this->_field = (string) $field; + + if (is_array($table)) { + $this->_table = (isset($table['table'])) ? $table['table'] : ''; + $this->_schema = (isset($table['schema'])) ? $table['schema'] : null; + } else { + $this->_table = (string) $table; + } + + } + + /** + * Run query and returns matches, or null if no matches are found. + * + * @param String $value + * @return Array when matches are found. + */ + protected function _query($value) + { + /** + * Check for an adapter being defined. if not, fetch the default adapter. + */ + if ($this->_adapter === null) { + $this->_adapter = Zend_Db_Table_Abstract::getDefaultAdapter(); + if (null === $this->_adapter) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('No database adapter present'); + } + } + + /** + * Build select object + */ + $select = new Zend_Db_Select($this->_adapter); + $select->from($this->_table, array($this->_field), $this->_schema) + ->where($this->_adapter->quoteIdentifier($this->_field).' = ?', $value); + if ($this->_exclude !== null) { + if (is_array($this->_exclude)) { + $select->where($this->_adapter->quoteIdentifier($this->_exclude['field']).' != ?', $this->_exclude['value']); + } else { + $select->where($this->_exclude); + } + } + $select->limit(1); + + /** + * Run query + */ + $result = $this->_adapter->fetchRow($select, array(), Zend_Db::FETCH_ASSOC); + + return $result; + } +} diff --git a/lib/zend/Zend/Validate/Db/NoRecordExists.php b/lib/zend/Zend/Validate/Db/NoRecordExists.php new file mode 100644 index 0000000000..f6e8c7d0e2 --- /dev/null +++ b/lib/zend/Zend/Validate/Db/NoRecordExists.php @@ -0,0 +1,52 @@ +_setValue($value); + + $result = $this->_query($value); + if ($result) { + $valid = false; + $this->_error(self::ERROR_RECORD_FOUND); + } + + return $valid; + } +} diff --git a/lib/zend/Zend/Validate/Db/RecordExists.php b/lib/zend/Zend/Validate/Db/RecordExists.php new file mode 100644 index 0000000000..4dc2709f98 --- /dev/null +++ b/lib/zend/Zend/Validate/Db/RecordExists.php @@ -0,0 +1,53 @@ +_setValue($value); + + $result = $this->_query($value); + if (!$result) { + $valid = false; + $this->_error(self::ERROR_NO_RECORD_FOUND); + } + + return $valid; + } +} diff --git a/lib/zend/Zend/Validate/Digits.php b/lib/zend/Zend/Validate/Digits.php new file mode 100644 index 0000000000..cf23c2a411 --- /dev/null +++ b/lib/zend/Zend/Validate/Digits.php @@ -0,0 +1,95 @@ + "'%value%' contains not only digit characters", + self::STRING_EMPTY => "'%value%' is an empty string", + self::INVALID => "Invalid type given, value should be string, integer or float", + ); + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value only contains digit characters + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value) && !is_float($value)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue((string) $value); + + if ('' === $this->_value) { + $this->_error(self::STRING_EMPTY); + return false; + } + + if (null === self::$_filter) { + require_once 'Zend/Filter/Digits.php'; + self::$_filter = new Zend_Filter_Digits(); + } + + if ($this->_value !== self::$_filter->filter($this->_value)) { + $this->_error(self::NOT_DIGITS); + return false; + } + + return true; + } + +} diff --git a/lib/zend/Zend/Validate/EmailAddress.php b/lib/zend/Zend/Validate/EmailAddress.php new file mode 100644 index 0000000000..994ec19883 --- /dev/null +++ b/lib/zend/Zend/Validate/EmailAddress.php @@ -0,0 +1,264 @@ + "Invalid type given, value should be a string", + self::INVALID_FORMAT => "'%value%' is not a valid email address in the basic format local-part@hostname", + self::INVALID_HOSTNAME => "'%hostname%' is not a valid hostname for email address '%value%'", + self::INVALID_MX_RECORD => "'%hostname%' does not appear to have a valid MX record for the email address '%value%'", + self::DOT_ATOM => "'%localPart%' not matched against dot-atom format", + self::QUOTED_STRING => "'%localPart%' not matched against quoted-string format", + self::INVALID_LOCAL_PART => "'%localPart%' is not a valid local part for email address '%value%'", + self::LENGTH_EXCEEDED => "'%value%' exceeds the allowed length" + ); + + /** + * @var array + */ + protected $_messageVariables = array( + 'hostname' => '_hostname', + 'localPart' => '_localPart' + ); + + /** + * Local object for validating the hostname part of an email address + * + * @var Zend_Validate_Hostname + * @depreciated + */ + public $hostnameValidator; + + /** + * Whether we check for a valid MX record via DNS + * + * @var boolean + */ + protected $_validateMx = false; + + /** + * @var string + */ + protected $_hostname; + + /** + * @var string + */ + protected $_localPart; + + /** + * Instantiates hostname validator for local use + * + * You can pass a bitfield to determine what types of hostnames are allowed. + * These bitfields are defined by the ALLOW_* constants in Zend_Validate_Hostname + * The default is to allow DNS hostnames only + * + * @param integer $allow OPTIONAL + * @param bool $validateMx OPTIONAL + * @param Zend_Validate_Hostname $hostnameValidator OPTIONAL + * @return void + */ + public function __construct($allow = Zend_Validate_Hostname::ALLOW_DNS, $validateMx = false, Zend_Validate_Hostname $hostnameValidator = null) + { + $this->setValidateMx($validateMx); + $this->setHostnameValidator($hostnameValidator, $allow); + } + + /** + * Returns the set hostname validator + * + * @return Zend_Validate_Hostname + */ + public function getHostnameValidator() + { + return $this->hostnameValidator; + } + + /** + * @param Zend_Validate_Hostname $hostnameValidator OPTIONAL + * @param int $allow OPTIONAL + * @return void + */ + public function setHostnameValidator(Zend_Validate_Hostname $hostnameValidator = null, $allow = Zend_Validate_Hostname::ALLOW_DNS) + { + if ($hostnameValidator === null) { + $hostnameValidator = new Zend_Validate_Hostname($allow); + } + $this->hostnameValidator = $hostnameValidator; + } + + /** + * Whether MX checking via dns_get_mx is supported or not + * + * This currently only works on UNIX systems + * + * @return boolean + */ + public function validateMxSupported() + { + return function_exists('dns_get_mx'); + } + + /** + * Set whether we check for a valid MX record via DNS + * + * This only applies when DNS hostnames are validated + * + * @param boolean $allowed Set allowed to true to validate for MX records, and false to not validate them + */ + public function setValidateMx($allowed) + { + $this->_validateMx = (bool) $allowed; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value is a valid email address + * according to RFC2822 + * + * @link http://www.ietf.org/rfc/rfc2822.txt RFC2822 + * @link http://www.columbia.edu/kermit/ascii.html US-ASCII characters + * @param string $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->_error(self::INVALID); + return false; + } + + $matches = array(); + $length = true; + + $this->_setValue($value); + + // Split email address up and disallow '..' + if ((strpos($value, '..') !== false) or + (!preg_match('/^(.+)@([^@]+)$/', $value, $matches))) { + $this->_error(self::INVALID_FORMAT); + return false; + } + + $this->_localPart = $matches[1]; + $this->_hostname = $matches[2]; + + if ((strlen($this->_localPart) > 64) || (strlen($this->_hostname) > 255)) { + $length = false; + $this->_error(self::LENGTH_EXCEEDED); + } + + // Match hostname part + $hostnameResult = $this->hostnameValidator->setTranslator($this->getTranslator()) + ->isValid($this->_hostname); + if (!$hostnameResult) { + $this->_error(self::INVALID_HOSTNAME); + + // Get messages and errors from hostnameValidator + foreach ($this->hostnameValidator->getMessages() as $code => $message) { + $this->_messages[$code] = $message; + } + foreach ($this->hostnameValidator->getErrors() as $error) { + $this->_errors[] = $error; + } + } else if ($this->_validateMx) { + // MX check on hostname via dns_get_record() + if ($this->validateMxSupported()) { + $result = dns_get_mx($this->_hostname, $mxHosts); + if (count($mxHosts) < 1) { + $hostnameResult = false; + $this->_error(self::INVALID_MX_RECORD); + } + } else { + /** + * MX checks are not supported by this system + * @see Zend_Validate_Exception + */ + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('Internal error: MX checking not available on this system'); + } + } + + // First try to match the local part on the common dot-atom format + $localResult = false; + + // Dot-atom characters are: 1*atext *("." 1*atext) + // atext: ALPHA / DIGIT / and "!", "#", "$", "%", "&", "'", "*", + // "+", "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~" + $atext = 'a-zA-Z0-9\x21\x23\x24\x25\x26\x27\x2a\x2b\x2d\x2f\x3d\x3f\x5e\x5f\x60\x7b\x7c\x7d\x7e'; + if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->_localPart)) { + $localResult = true; + } else { + // Try quoted string format + + // Quoted-string characters are: DQUOTE *([FWS] qtext/quoted-pair) [FWS] DQUOTE + // qtext: Non white space controls, and the rest of the US-ASCII characters not + // including "\" or the quote character + $noWsCtl = '\x01-\x08\x0b\x0c\x0e-\x1f\x7f'; + $qtext = $noWsCtl . '\x21\x23-\x5b\x5d-\x7e'; + $ws = '\x20\x09'; + if (preg_match('/^\x22([' . $ws . $qtext . '])*[$ws]?\x22$/', $this->_localPart)) { + $localResult = true; + } else { + $this->_error(self::DOT_ATOM); + $this->_error(self::QUOTED_STRING); + $this->_error(self::INVALID_LOCAL_PART); + } + } + + // If both parts valid, return true + if ($localResult && $hostnameResult && $length) { + return true; + } else { + return false; + } + } +} diff --git a/lib/zend/Zend/Validate/Exception.php b/lib/zend/Zend/Validate/Exception.php new file mode 100644 index 0000000000..c84c759194 --- /dev/null +++ b/lib/zend/Zend/Validate/Exception.php @@ -0,0 +1,37 @@ + "Too much files, maximum '%max%' are allowed but '%count%' are given", + self::TOO_LESS => "Too less files, minimum '%min%' are expected but '%count%' are given" + ); + + /** + * @var array Error message template variables + */ + protected $_messageVariables = array( + 'min' => '_min', + 'max' => '_max', + 'count' => '_count' + ); + + /** + * Minimum file count + * + * If null, there is no minimum file count + * + * @var integer + */ + protected $_min; + + /** + * Maximum file count + * + * If null, there is no maximum file count + * + * @var integer|null + */ + protected $_max; + + /** + * Actual filecount + * + * @var integer + */ + protected $_count; + + /** + * Internal file array + * @var array + */ + protected $_files; + + /** + * Sets validator options + * + * Min limits the file count, when used with max=null it is the maximum file count + * It also accepts an array with the keys 'min' and 'max' + * + * If $options is a integer, it will be used as maximum file count + * As Array is accepts the following keys: + * 'min': Minimum filecount + * 'max': Maximum filecount + * + * @param integer|array|Zend_Config $options Options for the adapter + * @return void + */ + public function __construct($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_string($options) || is_numeric($options)) { + $options = array('max' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception ('Invalid options to validator provided'); + } + + if (1 < func_num_args()) { +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple arguments are deprecated in favor of an array of named arguments', E_USER_NOTICE); + $options['min'] = func_get_arg(0); + $options['max'] = func_get_arg(1); + } + + if (isset($options['min'])) { + $this->setMin($options); + } + + if (isset($options['max'])) { + $this->setMax($options); + } + } + + /** + * Returns the minimum file count + * + * @return integer + */ + public function getMin() + { + return $this->_min; + } + + /** + * Sets the minimum file count + * + * @param integer|array $min The minimum file count + * @return Zend_Validate_File_Count Provides a fluent interface + * @throws Zend_Validate_Exception When min is greater than max + */ + public function setMin($min) + { + if (is_array($min) and isset($min['min'])) { + $min = $min['min']; + } + + if (!is_string($min) and !is_numeric($min)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception ('Invalid options to validator provided'); + } + + $min = (integer) $min; + if (($this->_max !== null) && ($min > $this->_max)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The minimum must be less than or equal to the maximum file count, but $min >" + . " {$this->_max}"); + } + + $this->_min = $min; + return $this; + } + + /** + * Returns the maximum file count + * + * @return integer + */ + public function getMax() + { + return $this->_max; + } + + /** + * Sets the maximum file count + * + * @param integer|array $max The maximum file count + * @return Zend_Validate_StringLength Provides a fluent interface + * @throws Zend_Validate_Exception When max is smaller than min + */ + public function setMax($max) + { + if (is_array($max) and isset($max['max'])) { + $max = $max['max']; + } + + if (!is_string($max) and !is_numeric($max)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception ('Invalid options to validator provided'); + } + + $max = (integer) $max; + if (($this->_min !== null) && ($max < $this->_min)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The maximum must be greater than or equal to the minimum file count, but " + . "$max < {$this->_min}"); + } + + $this->_max = $max; + return $this; + } + + /** + * Adds a file for validation + * + * @param string|array $file + */ + public function addFile($file) + { + if (is_string($file)) { + $file = array($file); + } + + if (is_array($file)) { + foreach ($file as $name) { + if (!isset($this->_files[$name]) && !empty($name)) { + $this->_files[$name] = $name; + } + } + } + + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the file count of all checked files is at least min and + * not bigger than max (when max is not null). Attention: When checking with set min you + * must give all files with the first call, otherwise you will get an false. + * + * @param string|array $value Filenames to check for count + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + $this->addFile($value); + $this->_count = count($this->_files); + if (($this->_max !== null) && ($this->_count > $this->_max)) { + return $this->_throw($file, self::TOO_MUCH); + } + + if (($this->_min !== null) && ($this->_count < $this->_min)) { + return $this->_throw($file, self::TOO_LESS); + } + + return true; + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function _throw($file, $errorType) + { + if ($file !== null) { + $this->_value = $file['name']; + } + + $this->_error($errorType); + return false; + } +} diff --git a/lib/zend/Zend/Validate/File/Crc32.php b/lib/zend/Zend/Validate/File/Crc32.php new file mode 100644 index 0000000000..0e6b7b3706 --- /dev/null +++ b/lib/zend/Zend/Validate/File/Crc32.php @@ -0,0 +1,179 @@ + "The file '%value%' does not match the given crc32 hashes", + self::NOT_DETECTED => "There was no crc32 hash detected for the given file", + self::NOT_FOUND => "The file '%value%' could not be found" + ); + + /** + * Hash of the file + * + * @var string + */ + protected $_hash; + + /** + * Sets validator options + * + * @param string|array|Zend_Config $options + * @return void + */ + public function __construct($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_scalar($options)) { + $options = array('hash1' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('Invalid options to validator provided'); + } + + $this->setCrc32($options); + } + + /** + * Returns all set crc32 hashes + * + * @return array + */ + public function getCrc32() + { + return $this->getHash(); + } + + /** + * Sets the crc32 hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function setHash($options) + { + if (!is_array($options)) { + $options = array($options); + } + + $options['algorithm'] = 'crc32'; + parent::setHash($options); + return $this; + } + + /** + * Sets the crc32 hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function setCrc32($options) + { + $this->setHash($options); + return $this; + } + + /** + * Adds the crc32 hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function addHash($options) + { + if (!is_array($options)) { + $options = array($options); + } + + $options['algorithm'] = 'crc32'; + parent::addHash($options); + return $this; + } + + /** + * Adds the crc32 hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function addCrc32($options) + { + $this->addHash($options); + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the given file confirms the set hash + * + * @param string $value Filename to check for hash + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_FOUND); + } + + $hashes = array_unique(array_keys($this->_hash)); + $filehash = hash_file('crc32', $value); + if ($filehash === false) { + return $this->_throw($file, self::NOT_DETECTED); + } + + foreach($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + + return $this->_throw($file, self::DOES_NOT_MATCH); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/Validate/File/ExcludeExtension.php b/lib/zend/Zend/Validate/File/ExcludeExtension.php new file mode 100644 index 0000000000..ebfa812912 --- /dev/null +++ b/lib/zend/Zend/Validate/File/ExcludeExtension.php @@ -0,0 +1,94 @@ + "The file '%value%' has a false extension", + self::NOT_FOUND => "The file '%value%' was not found" + ); + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the fileextension of $value is not included in the + * set extension list + * + * @param string $value Real file to check for extension + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_FOUND); + } + + if ($file !== null) { + $info['extension'] = substr($file['name'], strrpos($file['name'], '.') + 1); + } else { + $info = pathinfo($value); + } + + $extensions = $this->getExtension(); + + if ($this->_case and (!in_array($info['extension'], $extensions))) { + return true; + } else if (!$this->_case) { + $found = false; + foreach ($extensions as $extension) { + if (strtolower($extension) == strtolower($info['extension'])) { + $found = true; + } + } + + if (!$found) { + return true; + } + } + + return $this->_throw($file, self::FALSE_EXTENSION); + } +} diff --git a/lib/zend/Zend/Validate/File/ExcludeMimeType.php b/lib/zend/Zend/Validate/File/ExcludeMimeType.php new file mode 100644 index 0000000000..850aa9563e --- /dev/null +++ b/lib/zend/Zend/Validate/File/ExcludeMimeType.php @@ -0,0 +1,109 @@ + null, + 'name' => $value + ); + } + + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_READABLE); + } + + $mimefile = $this->getMagicFile(); + if (class_exists('finfo', false)) { + $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME; + if (!empty($mimefile)) { + $mime = new finfo($const, $mimefile); + } else { + $mime = new finfo($const); + } + + if ($mime !== false) { + $this->_type = $mime->file($value); + } + unset($mime); + } + + if (empty($this->_type)) { + if (function_exists('mime_content_type') && ini_get('mime_magic.magicfile')) { + $this->_type = mime_content_type($value); + } elseif ($this->_headerCheck) { + $this->_type = $file['type']; + } + } + + if (empty($this->_type)) { + return $this->_throw($file, self::NOT_DETECTED); + } + + $mimetype = $this->getMimeType(true); + if (in_array($this->_type, $mimetype)) { + return $this->_throw($file, self::FALSE_TYPE); + } + + $types = explode('/', $this->_type); + $types = array_merge($types, explode('-', $this->_type)); + foreach($mimetype as $mime) { + if (in_array($mime, $types)) { + return $this->_throw($file, self::FALSE_TYPE); + } + } + + return true; + } +} diff --git a/lib/zend/Zend/Validate/File/Exists.php b/lib/zend/Zend/Validate/File/Exists.php new file mode 100644 index 0000000000..0d97b7e1a5 --- /dev/null +++ b/lib/zend/Zend/Validate/File/Exists.php @@ -0,0 +1,203 @@ + "The file '%value%' does not exist" + ); + + /** + * Internal list of directories + * @var string + */ + protected $_directory = ''; + + /** + * @var array Error message template variables + */ + protected $_messageVariables = array( + 'directory' => '_directory' + ); + + /** + * Sets validator options + * + * @param string|array|Zend_Config $directory + * @return void + */ + public function __construct($directory = array()) + { + if ($directory instanceof Zend_Config) { + $directory = $directory->toArray(); + } else if (is_string($directory)) { + $directory = explode(',', $directory); + } else if (!is_array($directory)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception ('Invalid options to validator provided'); + } + + $this->setDirectory($directory); + } + + /** + * Returns the set file directories which are checked + * + * @param boolean $asArray Returns the values as array, when false an concated string is returned + * @return string + */ + public function getDirectory($asArray = false) + { + $asArray = (bool) $asArray; + $directory = (string) $this->_directory; + if ($asArray) { + $directory = explode(',', $directory); + } + + return $directory; + } + + /** + * Sets the file directory which will be checked + * + * @param string|array $directory The directories to validate + * @return Zend_Validate_File_Extension Provides a fluent interface + */ + public function setDirectory($directory) + { + $this->_directory = null; + $this->addDirectory($directory); + return $this; + } + + /** + * Adds the file directory which will be checked + * + * @param string|array $directory The directory to add for validation + * @return Zend_Validate_File_Extension Provides a fluent interface + */ + public function addDirectory($directory) + { + $directories = $this->getDirectory(true); + + if (is_string($directory)) { + $directory = explode(',', $directory); + } else if (!is_array($directory)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception ('Invalid options to validator provided'); + } + + foreach ($directory as $content) { + if (empty($content) || !is_string($content)) { + continue; + } + + $directories[] = trim($content); + } + $directories = array_unique($directories); + + // Sanity check to ensure no empty values + foreach ($directories as $key => $dir) { + if (empty($dir)) { + unset($directories[$key]); + } + } + + $this->_directory = implode(',', $directories); + + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the file already exists in the set directories + * + * @param string $value Real file to check for existance + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + $directories = $this->getDirectory(true); + if (($file !== null) and (!empty($file['destination']))) { + $directories[] = $file['destination']; + } else if (!isset($file['name'])) { + $file['name'] = $value; + } + + $check = false; + foreach ($directories as $directory) { + if (empty($directory)) { + continue; + } + + $check = true; + if (!file_exists($directory . DIRECTORY_SEPARATOR . $file['name'])) { + return $this->_throw($file, self::DOES_NOT_EXIST); + } + } + + if (!$check) { + return $this->_throw($file, self::DOES_NOT_EXIST); + } + + return true; + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function _throw($file, $errorType) + { + if ($file !== null) { + $this->_value = $file['name']; + } + + $this->_error($errorType); + return false; + } +} diff --git a/lib/zend/Zend/Validate/File/Extension.php b/lib/zend/Zend/Validate/File/Extension.php new file mode 100644 index 0000000000..279cdd45ab --- /dev/null +++ b/lib/zend/Zend/Validate/File/Extension.php @@ -0,0 +1,234 @@ + "The file '%value%' has a false extension", + self::NOT_FOUND => "The file '%value%' was not found" + ); + + /** + * Internal list of extensions + * @var string + */ + protected $_extension = ''; + + /** + * Validate case sensitive + * + * @var boolean + */ + protected $_case = false; + + /** + * @var array Error message template variables + */ + protected $_messageVariables = array( + 'extension' => '_extension' + ); + + /** + * Sets validator options + * + * @param string|array|Zend_Config $options + * @return void + */ + public function __construct($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + + if (1 < func_num_args()) { +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple arguments to constructor are deprecated in favor of options array', E_USER_NOTICE); + $case = func_get_arg(1); + $this->setCase($case); + } + + if (is_array($options) and isset($options['case'])) { + $this->setCase($options['case']); + unset($options['case']); + } + + $this->setExtension($options); + } + + /** + * Returns the case option + * + * @return boolean + */ + public function getCase() + { + return $this->_case; + } + + /** + * Sets the case to use + * + * @param boolean $case + * @return Zend_Validate_File_Extension Provides a fluent interface + */ + public function setCase($case) + { + $this->_case = (boolean) $case; + return $this; + } + + /** + * Returns the set file extension + * + * @return array + */ + public function getExtension() + { + $extension = explode(',', $this->_extension); + + return $extension; + } + + /** + * Sets the file extensions + * + * @param string|array $extension The extensions to validate + * @return Zend_Validate_File_Extension Provides a fluent interface + */ + public function setExtension($extension) + { + $this->_extension = null; + $this->addExtension($extension); + return $this; + } + + /** + * Adds the file extensions + * + * @param string|array $extension The extensions to add for validation + * @return Zend_Validate_File_Extension Provides a fluent interface + */ + public function addExtension($extension) + { + $extensions = $this->getExtension(); + if (is_string($extension)) { + $extension = explode(',', $extension); + } + + foreach ($extension as $content) { + if (empty($content) || !is_string($content)) { + continue; + } + + $extensions[] = trim($content); + } + $extensions = array_unique($extensions); + + // Sanity check to ensure no empty values + foreach ($extensions as $key => $ext) { + if (empty($ext)) { + unset($extensions[$key]); + } + } + + $this->_extension = implode(',', $extensions); + + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the fileextension of $value is included in the + * set extension list + * + * @param string $value Real file to check for extension + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_FOUND); + } + + if ($file !== null) { + $info['extension'] = substr($file['name'], strrpos($file['name'], '.') + 1); + } else { + $info = pathinfo($value); + } + + $extensions = $this->getExtension(); + + if ($this->_case && (in_array($info['extension'], $extensions))) { + return true; + } else if (!$this->getCase()) { + foreach ($extensions as $extension) { + if (strtolower($extension) == strtolower($info['extension'])) { + return true; + } + } + } + + return $this->_throw($file, self::FALSE_EXTENSION); + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function _throw($file, $errorType) + { + if (null !== $file) { + $this->_value = $file['name']; + } + + $this->_error($errorType); + return false; + } +} diff --git a/lib/zend/Zend/Validate/File/FilesSize.php b/lib/zend/Zend/Validate/File/FilesSize.php new file mode 100644 index 0000000000..076485fdd3 --- /dev/null +++ b/lib/zend/Zend/Validate/File/FilesSize.php @@ -0,0 +1,163 @@ + "All files in sum should have a maximum size of '%max%' but '%size%' were detected", + self::TOO_SMALL => "All files in sum should have a minimum size of '%min%' but '%size%' were detected", + self::NOT_READABLE => "One or more files can not be read" + ); + + /** + * Internal file array + * + * @var array + */ + protected $_files; + + /** + * Sets validator options + * + * Min limits the used diskspace for all files, when used with max=null it is the maximum filesize + * It also accepts an array with the keys 'min' and 'max' + * + * @param integer|array|Zend_Config $options Options for this validator + * @return void + */ + public function __construct($options) + { + $this->_files = array(); + $this->_setSize(0); + + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_scalar($options)) { + $options = array('max' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('Invalid options to validator provided'); + } + + if (1 < func_num_args()) { +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); + + $argv = func_get_args(); + array_shift($argv); + $options['max'] = array_shift($argv); + if (!empty($argv)) { + $options['bytestring'] = array_shift($argv); + } + } + + parent::__construct($options); + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the disk usage of all files is at least min and + * not bigger than max (when max is not null). + * + * @param string|array $value Real file to check for size + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + require_once 'Zend/Loader.php'; + if (is_string($value)) { + $value = array($value); + } + + $min = $this->getMin(true); + $max = $this->getMax(true); + $size = $this->_getSize(); + foreach ($value as $files) { + // Is file readable ? + if (!Zend_Loader::isReadable($files)) { + $this->_throw($file, self::NOT_READABLE); + continue; + } + + if (!isset($this->_files[$files])) { + $this->_files[$files] = $files; + } else { + // file already counted... do not count twice + continue; + } + + // limited to 2GB files + $size += @filesize($files); + $this->_setSize($size); + if (($max !== null) && ($max < $size)) { + if ($this->useByteString()) { + $this->setMax($this->_toByteString($max)); + $this->_throw($file, self::TOO_BIG); + $this->setMax($max); + } else { + $this->_throw($file, self::TOO_BIG); + } + } + } + + // Check that aggregate files are >= minimum size + if (($min !== null) && ($size < $min)) { + if ($this->useByteString()) { + $this->setMin($this->_toByteString($min)); + $this->_throw($file, self::TOO_SMALL); + $this->setMin($min); + } else { + $this->_throw($file, self::TOO_SMALL); + } + } + + if (count($this->_messages) > 0) { + return false; + } + + return true; + } +} diff --git a/lib/zend/Zend/Validate/File/Hash.php b/lib/zend/Zend/Validate/File/Hash.php new file mode 100644 index 0000000000..1e25858dc6 --- /dev/null +++ b/lib/zend/Zend/Validate/File/Hash.php @@ -0,0 +1,196 @@ + "The file '%value%' does not match the given hashes", + self::NOT_DETECTED => "There was no hash detected for the given file", + self::NOT_FOUND => "The file '%value%' could not be found" + ); + + /** + * Hash of the file + * + * @var string + */ + protected $_hash; + + /** + * Sets validator options + * + * @param string|array $options + * @return void + */ + public function __construct($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_scalar($options)) { + $options = array('hash1' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('Invalid options to validator provided'); + } + + if (1 < func_num_args()) { +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); + $options['algorithm'] = func_get_arg(1); + } + + $this->setHash($options); + } + + /** + * Returns the set hash values as array, the hash as key and the algorithm the value + * + * @return array + */ + public function getHash() + { + return $this->_hash; + } + + /** + * Sets the hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function setHash($options) + { + $this->_hash = null; + $this->addHash($options); + + return $this; + } + + /** + * Adds the hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function addHash($options) + { + if (is_string($options)) { + $options = array($options); + } else if (!is_array($options)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("False parameter given"); + } + + $known = hash_algos(); + if (!isset($options['algorithm'])) { + $algorithm = 'crc32'; + } else { + $algorithm = $options['algorithm']; + unset($options['algorithm']); + } + + if (!in_array($algorithm, $known)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("Unknown algorithm '{$algorithm}'"); + } + + foreach ($options as $value) { + $this->_hash[$value] = $algorithm; + } + + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the given file confirms the set hash + * + * @param string $value Filename to check for hash + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_FOUND); + } + + $algos = array_unique(array_values($this->_hash)); + $hashes = array_unique(array_keys($this->_hash)); + foreach ($algos as $algorithm) { + $filehash = hash_file($algorithm, $value); + if ($filehash === false) { + return $this->_throw($file, self::NOT_DETECTED); + } + + foreach($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + } + + return $this->_throw($file, self::DOES_NOT_MATCH); + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function _throw($file, $errorType) + { + if ($file !== null) { + $this->_value = $file['name']; + } + + $this->_error($errorType); + return false; + } +} diff --git a/lib/zend/Zend/Validate/File/ImageSize.php b/lib/zend/Zend/Validate/File/ImageSize.php new file mode 100644 index 0000000000..11728fe33d --- /dev/null +++ b/lib/zend/Zend/Validate/File/ImageSize.php @@ -0,0 +1,366 @@ + "Maximum allowed width for image '%value%' should be '%maxwidth%' but '%width%' detected", + self::WIDTH_TOO_SMALL => "Minimum expected width for image '%value%' should be '%minwidth%' but '%width%' detected", + self::HEIGHT_TOO_BIG => "Maximum allowed height for image '%value%' should be '%maxheight%' but '%height%' detected", + self::HEIGHT_TOO_SMALL => "Minimum expected height for image '%value%' should be '%minheight%' but '%height%' detected", + self::NOT_DETECTED => "The size of image '%value%' could not be detected", + self::NOT_READABLE => "The image '%value%' can not be read" + ); + + /** + * @var array Error message template variables + */ + protected $_messageVariables = array( + 'minwidth' => '_minwidth', + 'maxwidth' => '_maxwidth', + 'minheight' => '_minheight', + 'maxheight' => '_maxheight', + 'width' => '_width', + 'height' => '_height' + ); + + /** + * Minimum image width + * + * @var integer + */ + protected $_minwidth; + + /** + * Maximum image width + * + * @var integer + */ + protected $_maxwidth; + + /** + * Minimum image height + * + * @var integer + */ + protected $_minheight; + + /** + * Maximum image height + * + * @var integer + */ + protected $_maxheight; + + /** + * Detected width + * + * @var integer + */ + protected $_width; + + /** + * Detected height + * + * @var integer + */ + protected $_height; + + /** + * Sets validator options + * + * Accepts the following option keys: + * - minheight + * - minwidth + * - maxheight + * - maxwidth + * + * @param Zend_Config|array $options + * @return void + */ + public function __construct($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (1 < func_num_args()) { +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); + if (!is_array($options)) { + $options = array('minwidth' => $options); + } + $argv = func_get_args(); + array_shift($argv); + $options['minheight'] = array_shift($argv); + if (!empty($argv)) { + $options['maxwidth'] = array_shift($argv); + if (!empty($argv)) { + $options['maxheight'] = array_shift($argv); + } + } + } else if (!is_array($options)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception ('Invalid options to validator provided'); + } + + if (isset($options['minheight']) || isset($options['minwidth'])) { + $this->setImageMin($options); + } + + if (isset($options['maxheight']) || isset($options['maxwidth'])) { + $this->setImageMax($options); + } + } + + /** + * Returns the set minimum image sizes + * + * @return array + */ + public function getImageMin() + { + return array('minwidth' => $this->_minwidth, 'minheight' => $this->_minheight); + } + + /** + * Returns the set maximum image sizes + * + * @return array + */ + public function getImageMax() + { + return array('maxwidth' => $this->_maxwidth, 'maxheight' => $this->_maxheight); + } + + /** + * Returns the set image width sizes + * + * @return array + */ + public function getImageWidth() + { + return array('minwidth' => $this->_minwidth, 'maxwidth' => $this->_maxwidth); + } + + /** + * Returns the set image height sizes + * + * @return array + */ + public function getImageHeight() + { + return array('minheight' => $this->_minheight, 'maxheight' => $this->_maxheight); + } + + /** + * Sets the minimum image size + * + * @param array $options The minimum image dimensions + * @throws Zend_Validate_Exception When minwidth is greater than maxwidth + * @throws Zend_Validate_Exception When minheight is greater than maxheight + * @return Zend_Validate_File_ImageSize Provides a fluent interface + */ + public function setImageMin($options) + { + if (isset($options['minwidth'])) { + if (($this->_maxwidth !== null) and ($options['minwidth'] > $this->_maxwidth)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The minimum image width must be less than or equal to the " + . " maximum image width, but {$options['minwidth']} > {$this->_maxwidth}"); + } + } + + if (isset($options['maxheight'])) { + if (($this->_maxheight !== null) and ($options['minheight'] > $this->_maxheight)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The minimum image height must be less than or equal to the " + . " maximum image height, but {$options['minheight']} > {$this->_maxheight}"); + } + } + + if (isset($options['minwidth'])) { + $this->_minwidth = (int) $options['minwidth']; + } + + if (isset($options['minheight'])) { + $this->_minheight = (int) $options['minheight']; + } + + return $this; + } + + /** + * Sets the maximum image size + * + * @param array $options The maximum image dimensions + * @throws Zend_Validate_Exception When maxwidth is smaller than minwidth + * @throws Zend_Validate_Exception When maxheight is smaller than minheight + * @return Zend_Validate_StringLength Provides a fluent interface + */ + public function setImageMax($options) + { + if (isset($options['maxwidth'])) { + if (($this->_minwidth !== null) and ($options['maxwidth'] < $this->_minwidth)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The maximum image width must be greater than or equal to the " + . "minimum image width, but {$options['maxwidth']} < {$this->_minwidth}"); + } + } + + if (isset($options['maxheight'])) { + if (($this->_minheight !== null) and ($options['maxheight'] < $this->_minheight)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The maximum image height must be greater than or equal to the " + . "minimum image height, but {$options['maxheight']} < {$this->_minwidth}"); + } + } + + if (isset($options['maxwidth'])) { + $this->_maxwidth = (int) $options['maxwidth']; + } + + if (isset($options['maxheight'])) { + $this->_maxheight = (int) $options['maxheight']; + } + + return $this; + } + + /** + * Sets the mimimum and maximum image width + * + * @param array $options The image width dimensions + * @return Zend_Validate_File_ImageSize Provides a fluent interface + */ + public function setImageWidth($options) + { + $this->setImageMin($options); + $this->setImageMax($options); + + return $this; + } + + /** + * Sets the mimimum and maximum image height + * + * @param array $options The image height dimensions + * @return Zend_Validate_File_ImageSize Provides a fluent interface + */ + public function setImageHeight($options) + { + $this->setImageMin($options); + $this->setImageMax($options); + + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the imagesize of $value is at least min and + * not bigger than max + * + * @param string $value Real file to check for image size + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_READABLE); + } + + $size = @getimagesize($value); + $this->_setValue($file); + + if (empty($size) or ($size[0] === 0) or ($size[1] === 0)) { + return $this->_throw($file, self::NOT_DETECTED); + } + + $this->_width = $size[0]; + $this->_height = $size[1]; + if ($this->_width < $this->_minwidth) { + $this->_throw($file, self::WIDTH_TOO_SMALL); + } + + if (($this->_maxwidth !== null) and ($this->_maxwidth < $this->_width)) { + $this->_throw($file, self::WIDTH_TOO_BIG); + } + + if ($this->_height < $this->_minheight) { + $this->_throw($file, self::HEIGHT_TOO_SMALL); + } + + if (($this->_maxheight !== null) and ($this->_maxheight < $this->_height)) { + $this->_throw($file, self::HEIGHT_TOO_BIG); + } + + if (count($this->_messages) > 0) { + return false; + } + + return true; + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function _throw($file, $errorType) + { + if ($file !== null) { + $this->_value = $file['name']; + } + + $this->_error($errorType); + return false; + } +} diff --git a/lib/zend/Zend/Validate/File/IsCompressed.php b/lib/zend/Zend/Validate/File/IsCompressed.php new file mode 100644 index 0000000000..8c7cc98755 --- /dev/null +++ b/lib/zend/Zend/Validate/File/IsCompressed.php @@ -0,0 +1,86 @@ + "The file '%value%' is not compressed, '%type%' detected", + self::NOT_DETECTED => "The mimetype of file '%value%' has not been detected", + self::NOT_READABLE => "The file '%value%' can not be read" + ); + + /** + * Sets validator options + * + * @param string|array|Zend_Config $compression + * @return void + */ + public function __construct($mimetype = array()) + { + if ($mimetype instanceof Zend_Config) { + $mimetype = $mimetype->toArray(); + } else if (empty($mimetype)) { + $mimetype = array( + 'application/x-tar', + 'application/x-cpio', + 'application/x-debian-package', + 'application/x-archive', + 'application/x-arc', + 'application/x-arj', + 'application/x-lharc', + 'application/x-lha', + 'application/x-rar', + 'application/zip', + 'application/zoo', + 'application/x-eet', + 'application/x-java-pack200', + 'application/x-compress', + 'application/x-gzip', + 'application/x-bzip2' + ); + } + + $this->setMimeType($mimetype); + } +} diff --git a/lib/zend/Zend/Validate/File/IsImage.php b/lib/zend/Zend/Validate/File/IsImage.php new file mode 100644 index 0000000000..50136b3ef2 --- /dev/null +++ b/lib/zend/Zend/Validate/File/IsImage.php @@ -0,0 +1,90 @@ + "The file '%value%' is no image, '%type%' detected", + self::NOT_DETECTED => "The mimetype of file '%value%' has not been detected", + self::NOT_READABLE => "The file '%value%' can not be read" + ); + + /** + * Sets validator options + * + * @param string|array|Zend_Config $mimetype + * @return void + */ + public function __construct($mimetype = array()) + { + if ($mimetype instanceof Zend_Config) { + $mimetype = $mimetype->toArray(); + } else if (empty($mimetype)) { + $mimetype = array( + 'image/x-quicktime', + 'image/jp2', + 'image/x-xpmi', + 'image/x-portable-bitmap', + 'image/x-portable-greymap', + 'image/x-portable-pixmap', + 'image/x-niff', + 'image/tiff', + 'image/png', + 'image/x-unknown', + 'image/gif', + 'image/x-ms-bmp', + 'application/dicom', + 'image/vnd.adobe.photoshop', + 'image/vnd.djvu', + 'image/x-cpi', + 'image/jpeg', + 'image/x-ico', + 'image/x-coreldraw', + 'image/svg+xml' + ); + } + + $this->setMimeType($mimetype); + } +} diff --git a/lib/zend/Zend/Validate/File/Md5.php b/lib/zend/Zend/Validate/File/Md5.php new file mode 100644 index 0000000000..b5fba6338d --- /dev/null +++ b/lib/zend/Zend/Validate/File/Md5.php @@ -0,0 +1,183 @@ + "The file '%value%' does not match the given md5 hashes", + self::NOT_DETECTED => "There was no md5 hash detected for the given file", + self::NOT_FOUND => "The file '%value%' could not be found" + ); + + /** + * Hash of the file + * + * @var string + */ + protected $_hash; + + /** + * Sets validator options + * + * $hash is the hash we accept for the file $file + * + * @param string|array $options + * @return void + */ + public function __construct($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_scalar($options)) { + $options = array('hash1' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('Invalid options to validator provided'); + } + + $this->setMd5($options); + } + + /** + * Returns all set md5 hashes + * + * @return array + */ + public function getMd5() + { + return $this->getHash(); + } + + /** + * Sets the md5 hash for one or multiple files + * + * @param string|array $options + * @param string $algorithm (Deprecated) Algorithm to use, fixed to md5 + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function setHash($options) + { + if (!is_array($options)) { + $options = (array) $options; + } + + $options['algorithm'] = 'md5'; + parent::setHash($options); + return $this; + } + + /** + * Sets the md5 hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function setMd5($options) + { + $this->setHash($options); + return $this; + } + + /** + * Adds the md5 hash for one or multiple files + * + * @param string|array $options + * @param string $algorithm (Depreciated) Algorithm to use, fixed to md5 + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function addHash($options) + { + if (!is_array($options)) { + $options = (array) $options; + } + + $options['algorithm'] = 'md5'; + parent::addHash($options); + return $this; + } + + /** + * Adds the md5 hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function addMd5($options) + { + $this->addHash($options); + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the given file confirms the set hash + * + * @param string $value Filename to check for hash + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_FOUND); + } + + $hashes = array_unique(array_keys($this->_hash)); + $filehash = hash_file('md5', $value); + if ($filehash === false) { + return $this->_throw($file, self::NOT_DETECTED); + } + + foreach($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + + return $this->_throw($file, self::DOES_NOT_MATCH); + } +} diff --git a/lib/zend/Zend/Validate/File/MimeType.php b/lib/zend/Zend/Validate/File/MimeType.php new file mode 100644 index 0000000000..951a19ca3f --- /dev/null +++ b/lib/zend/Zend/Validate/File/MimeType.php @@ -0,0 +1,350 @@ + "The file '%value%' has a false mimetype of '%type%'", + self::NOT_DETECTED => "The mimetype of file '%value%' could not been detected", + self::NOT_READABLE => "The file '%value%' can not be read" + ); + + /** + * @var array + */ + protected $_messageVariables = array( + 'type' => '_type' + ); + + /** + * @var string + */ + protected $_type; + + /** + * Mimetypes + * + * If null, there is no mimetype + * + * @var string|null + */ + protected $_mimetype; + + /** + * Magicfile to use + * + * @var string|null + */ + protected $_magicfile; + + /** + * If no $_ENV['MAGIC'] is set, try and autodiscover it based on common locations + * @var array + */ + protected $_magicFiles = array( + '/usr/share/misc/magic', + '/usr/share/misc/magic.mime', + '/usr/share/misc/magic.mgc', + '/usr/share/mime/magic', + '/usr/share/mime/magic.mime', + '/usr/share/mime/magic.mgc', + '/usr/share/file/magic', + '/usr/share/file/magic.mime', + '/usr/share/file/magic.mgc', + ); + + /** + * Option to allow header check + * + * @var boolean + */ + protected $_headerCheck = false; + + /** + * Sets validator options + * + * Mimetype to accept + * + * @param string|array $mimetype MimeType + * @return void + */ + public function __construct($mimetype) + { + if ($mimetype instanceof Zend_Config) { + $mimetype = $mimetype->toArray(); + } elseif (is_string($mimetype)) { + $mimetype = explode(',', $mimetype); + } elseif (!is_array($mimetype)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("Invalid options to validator provided"); + } + + if (isset($mimetype['magicfile'])) { + $this->setMagicFile($mimetype['magicfile']); + } + + if (isset($mimetype['headerCheck'])) { + $this->enableHeaderCheck(true); + } + + $this->setMimeType($mimetype); + } + + /** + * Returns the actual set magicfile + * + * @return string + */ + public function getMagicFile() + { + if (null === $this->_magicfile && empty($_ENV['MAGIC'])) { + foreach ($this->_magicFiles as $file) { + if (file_exists($file)) { + $this->setMagicFile($file); + break; + } + } + } + return $this->_magicfile; + } + + /** + * Sets the magicfile to use + * if null, the MAGIC constant from php is used + * + * @param string $file + * @return Zend_Validate_File_MimeType Provides fluid interface + */ + public function setMagicFile($file) + { + if (empty($file)) { + $this->_magicfile = null; + } else if (!is_readable($file)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('The given magicfile can not be read'); + } else { + $this->_magicfile = (string) $file; + } + + return $this; + } + + /** + * Returns the Header Check option + * + * @return boolean + */ + public function getHeaderCheck() + { + return $this->_headerCheck; + } + + /** + * Defines if the http header should be used + * Note that this is unsave and therefor the default value is false + * + * @param boolean $checkHeader + * @return Zend_Validate_File_MimeType Provides fluid interface + */ + public function enableHeaderCheck($headerCheck = true) + { + $this->_headerCheck = (boolean) $headerCheck; + return $this; + } + + /** + * Returns the set mimetypes + * + * @param boolean $asArray Returns the values as array, when false an concated string is returned + * @return string|array + */ + public function getMimeType($asArray = false) + { + $asArray = (bool) $asArray; + $mimetype = (string) $this->_mimetype; + if ($asArray) { + $mimetype = explode(',', $mimetype); + } + + return $mimetype; + } + + /** + * Sets the mimetypes + * + * @param string|array $mimetype The mimetypes to validate + * @return Zend_Validate_File_Extension Provides a fluent interface + */ + public function setMimeType($mimetype) + { + $this->_mimetype = null; + $this->addMimeType($mimetype); + return $this; + } + + /** + * Adds the mimetypes + * + * @param string|array $mimetype The mimetypes to add for validation + * @return Zend_Validate_File_Extension Provides a fluent interface + */ + public function addMimeType($mimetype) + { + $mimetypes = $this->getMimeType(true); + + if (is_string($mimetype)) { + $mimetype = explode(',', $mimetype); + } elseif (!is_array($mimetype)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("Invalid options to validator provided"); + } + + if (isset($mimetype['magicfile'])) { + unset($mimetype['magicfile']); + } + + foreach ($mimetype as $content) { + if (empty($content) || !is_string($content)) { + continue; + } + $mimetypes[] = trim($content); + } + $mimetypes = array_unique($mimetypes); + + // Sanity check to ensure no empty values + foreach ($mimetypes as $key => $mt) { + if (empty($mt)) { + unset($mimetypes[$key]); + } + } + + $this->_mimetype = implode(',', $mimetypes); + + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if the mimetype of the file matches the given ones. Also parts + * of mimetypes can be checked. If you give for example "image" all image + * mime types will be accepted like "image/gif", "image/jpeg" and so on. + * + * @param string $value Real file to check for mimetype + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + if ($file === null) { + $file = array( + 'type' => null, + 'name' => $value + ); + } + + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_READABLE); + } + + $mimefile = $this->getMagicFile(); + if (class_exists('finfo', false)) { + $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME; + if (!empty($mimefile)) { + $mime = new finfo($const, $mimefile); + } else { + $mime = new finfo($const); + } + + if ($mime !== false) { + $this->_type = $mime->file($value); + } + unset($mime); + } + + if (empty($this->_type)) { + if (function_exists('mime_content_type') && ini_get('mime_magic.magicfile')) { + $this->_type = mime_content_type($value); + } elseif ($this->_headerCheck) { + $this->_type = $file['type']; + } + } + + if (empty($this->_type)) { + return $this->_throw($file, self::NOT_DETECTED); + } + + $mimetype = $this->getMimeType(true); + if (in_array($this->_type, $mimetype)) { + return true; + } + + $types = explode('/', $this->_type); + $types = array_merge($types, explode('-', $this->_type)); + foreach($mimetype as $mime) { + if (in_array($mime, $types)) { + return true; + } + } + + return $this->_throw($file, self::FALSE_TYPE); + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function _throw($file, $errorType) + { + $this->_value = $file['name']; + $this->_error($errorType); + return false; + } +} diff --git a/lib/zend/Zend/Validate/File/NotExists.php b/lib/zend/Zend/Validate/File/NotExists.php new file mode 100644 index 0000000000..354efb76c1 --- /dev/null +++ b/lib/zend/Zend/Validate/File/NotExists.php @@ -0,0 +1,84 @@ + "The file '%value%' does exist" + ); + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the file does not exist in the set destinations + * + * @param string $value Real file to check for + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + $directories = $this->getDirectory(true); + if (($file !== null) and (!empty($file['destination']))) { + $directories[] = $file['destination']; + } else if (!isset($file['name'])) { + $file['name'] = $value; + } + + foreach ($directories as $directory) { + if (empty($directory)) { + continue; + } + + $check = true; + if (file_exists($directory . DIRECTORY_SEPARATOR . $file['name'])) { + return $this->_throw($file, self::DOES_EXIST); + } + } + + if (!isset($check)) { + return $this->_throw($file, self::DOES_EXIST); + } + + return true; + } +} diff --git a/lib/zend/Zend/Validate/File/Sha1.php b/lib/zend/Zend/Validate/File/Sha1.php new file mode 100644 index 0000000000..f30b667723 --- /dev/null +++ b/lib/zend/Zend/Validate/File/Sha1.php @@ -0,0 +1,181 @@ + "The file '%value%' does not match the given sha1 hashes", + self::NOT_DETECTED => "There was no sha1 hash detected for the given file", + self::NOT_FOUND => "The file '%value%' could not be found" + ); + + /** + * Hash of the file + * + * @var string + */ + protected $_hash; + + /** + * Sets validator options + * + * $hash is the hash we accept for the file $file + * + * @param string|array $options + * @return void + */ + public function __construct($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_scalar($options)) { + $options = array('hash1' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('Invalid options to validator provided'); + } + + $this->setHash($options); + } + + /** + * Returns all set sha1 hashes + * + * @return array + */ + public function getSha1() + { + return $this->getHash(); + } + + /** + * Sets the sha1 hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function setHash($options) + { + if (!is_array($options)) { + $options = (array) $options; + } + + $options['algorithm'] = 'sha1'; + parent::setHash($options); + return $this; + } + + /** + * Sets the sha1 hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function setSha1($options) + { + $this->setHash($options); + return $this; + } + + /** + * Adds the sha1 hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function addHash($options) + { + if (!is_array($options)) { + $options = (array) $options; + } + + $options['algorithm'] = 'sha1'; + parent::addHash($options); + return $this; + } + + /** + * Adds the sha1 hash for one or multiple files + * + * @param string|array $options + * @return Zend_Validate_File_Hash Provides a fluent interface + */ + public function addSha1($options) + { + $this->addHash($options); + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the given file confirms the set hash + * + * @param string $value Filename to check for hash + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_FOUND); + } + + $hashes = array_unique(array_keys($this->_hash)); + $filehash = hash_file('sha1', $value); + if ($filehash === false) { + return $this->_throw($file, self::NOT_DETECTED); + } + + foreach ($hashes as $hash) { + if ($filehash === $hash) { + return true; + } + } + + return $this->_throw($file, self::DOES_NOT_MATCH); + } +} diff --git a/lib/zend/Zend/Validate/File/Size.php b/lib/zend/Zend/Validate/File/Size.php new file mode 100644 index 0000000000..00982b77dc --- /dev/null +++ b/lib/zend/Zend/Validate/File/Size.php @@ -0,0 +1,405 @@ + "Maximum allowed size for file '%value%' is '%max%' but '%size%' detected", + self::TOO_SMALL => "Minimum expected size for file '%value%' is '%min%' but '%size%' detected", + self::NOT_FOUND => "The file '%value%' could not be found" + ); + + /** + * @var array Error message template variables + */ + protected $_messageVariables = array( + 'min' => '_min', + 'max' => '_max', + 'size' => '_size', + ); + + /** + * Minimum filesize + * @var integer + */ + protected $_min; + + /** + * Maximum filesize + * + * If null, there is no maximum filesize + * + * @var integer|null + */ + protected $_max; + + /** + * Detected size + * + * @var integer + */ + protected $_size; + + /** + * Use bytestring ? + * + * @var boolean + */ + protected $_useByteString = true; + + /** + * Sets validator options + * + * If $options is a integer, it will be used as maximum filesize + * As Array is accepts the following keys: + * 'min': Minimum filesize + * 'max': Maximum filesize + * 'bytestring': Use bytestring or real size for messages + * + * @param integer|array $options Options for the adapter + */ + public function __construct($options) + { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_string($options) || is_numeric($options)) { + $options = array('max' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception ('Invalid options to validator provided'); + } + + if (1 < func_num_args()) { +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); + $argv = func_get_args(); + array_shift($argv); + $options['max'] = array_shift($argv); + if (!empty($argv)) { + $options['bytestring'] = array_shift($argv); + } + } + + if (isset($options['bytestring'])) { + $this->setUseByteString($options['bytestring']); + } + + if (isset($options['min'])) { + $this->setMin($options['min']); + } + + if (isset($options['max'])) { + $this->setMax($options['max']); + } + } + + /** + * Returns the minimum filesize + * + * @param boolean $byteString Use bytestring ? + * @return integer + */ + public function setUseByteString($byteString = true) + { + $this->_useByteString = (bool) $byteString; + return $this; + } + + /** + * Will bytestring be used? + * + * @return boolean + */ + public function useByteString() + { + return $this->_useByteString; + } + + /** + * Returns the minimum filesize + * + * @param bool $raw Whether or not to force return of the raw value (defaults off) + * @return integer|string + */ + public function getMin($raw = false) + { + $min = $this->_min; + if (!$raw && $this->useByteString()) { + $min = $this->_toByteString($min); + } + + return $min; + } + + /** + * Sets the minimum filesize + * + * @param integer $min The minimum filesize + * @throws Zend_Validate_Exception When min is greater than max + * @return Zend_Validate_File_Size Provides a fluent interface + */ + public function setMin($min) + { + if (!is_string($min) and !is_numeric($min)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception ('Invalid options to validator provided'); + } + + $min = (integer) $this->_fromByteString($min); + $max = $this->getMax(true); + if (($max !== null) && ($min > $max)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The minimum must be less than or equal to the maximum filesize, but $min >" + . " $max"); + } + + $this->_min = $min; + return $this; + } + + /** + * Returns the maximum filesize + * + * @param bool $raw Whether or not to force return of the raw value (defaults off) + * @return integer|string + */ + public function getMax($raw = false) + { + $max = $this->_max; + if (!$raw && $this->useByteString()) { + $max = $this->_toByteString($max); + } + + return $max; + } + + /** + * Sets the maximum filesize + * + * @param integer $max The maximum filesize + * @throws Zend_Validate_Exception When max is smaller than min + * @return Zend_Validate_StringLength Provides a fluent interface + */ + public function setMax($max) + { + if (!is_string($max) && !is_numeric($max)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception ('Invalid options to validator provided'); + } + + $max = (integer) $this->_fromByteString($max); + $min = $this->getMin(true); + if (($min !== null) && ($max < $min)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The maximum must be greater than or equal to the minimum filesize, but " + . "$max < $min"); + } + + $this->_max = $max; + return $this; + } + + /** + * Retrieve current detected file size + * + * @return int + */ + protected function _getSize() + { + return $this->_size; + } + + /** + * Set current size + * + * @param int $size + * @return Zend_Validate_File_Size + */ + protected function _setSize($size) + { + $this->_size = $size; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the filesize of $value is at least min and + * not bigger than max (when max is not null). + * + * @param string $value Real file to check for size + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_FOUND); + } + + // limited to 4GB files + $size = sprintf("%u", @filesize($value)); + + // Check to see if it's smaller than min size + $min = $this->getMin(true); + $max = $this->getMax(true); + if (($min !== null) && ($size < $min)) { + if ($this->useByteString()) { + $this->_min = $this->_toByteString($min); + $this->_size = $this->_toByteString($size); + $this->_throw($file, self::TOO_SMALL); + $this->_min = $min; + $this->_size = $size; + } else { + $this->_throw($file, self::TOO_SMALL); + } + } + + // Check to see if it's larger than max size + if (($max !== null) && ($max < $size)) { + if ($this->useByteString()) { + $this->_max = $this->_toByteString($max); + $this->_size = $this->_toByteString($size); + $this->_throw($file, self::TOO_BIG); + $this->_max = $max; + $this->_size = $size; + } else { + $this->_throw($file, self::TOO_BIG); + } + } + + if (count($this->_messages) > 0) { + return false; + } + + return true; + } + + /** + * Returns the formatted size + * + * @param integer $size + * @return string + */ + protected function _toByteString($size) + { + $sizes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); + for ($i=0; $size >= 1024 && $i < 9; $i++) { + $size /= 1024; + } + + return round($size, 2) . $sizes[$i]; + } + + /** + * Returns the unformatted size + * + * @param string $size + * @return integer + */ + protected function _fromByteString($size) + { + if (is_numeric($size)) { + return (integer) $size; + } + + $type = trim(substr($size, -2, 1)); + + $value = substr($size, 0, -1); + if (!is_numeric($value)) { + $value = substr($value, 0, -1); + } + + switch (strtoupper($type)) { + case 'Y': + $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024); + break; + case 'Z': + $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024); + break; + case 'E': + $value *= (1024 * 1024 * 1024 * 1024 * 1024 * 1024); + break; + case 'P': + $value *= (1024 * 1024 * 1024 * 1024 * 1024); + break; + case 'T': + $value *= (1024 * 1024 * 1024 * 1024); + break; + case 'G': + $value *= (1024 * 1024 * 1024); + break; + case 'M': + $value *= (1024 * 1024); + break; + case 'K': + $value *= 1024; + break; + default: + break; + } + + return $value; + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function _throw($file, $errorType) + { + if ($file !== null) { + $this->_value = $file['name']; + } + + $this->_error($errorType); + return false; + } +} diff --git a/lib/zend/Zend/Validate/File/Upload.php b/lib/zend/Zend/Validate/File/Upload.php new file mode 100644 index 0000000000..daec229cdd --- /dev/null +++ b/lib/zend/Zend/Validate/File/Upload.php @@ -0,0 +1,245 @@ + "The file '%value%' exceeds the defined ini size", + self::FORM_SIZE => "The file '%value%' exceeds the defined form size", + self::PARTIAL => "The file '%value%' was only partially uploaded", + self::NO_FILE => "The file '%value%' was not uploaded", + self::NO_TMP_DIR => "No temporary directory was found for the file '%value%'", + self::CANT_WRITE => "The file '%value%' can't be written", + self::EXTENSION => "The extension returned an error while uploading the file '%value%'", + self::ATTACK => "The file '%value%' was illegal uploaded, possible attack", + self::FILE_NOT_FOUND => "The file '%value%' was not found", + self::UNKNOWN => "Unknown error while uploading the file '%value%'" + ); + + /** + * Internal array of files + * @var array + */ + protected $_files = array(); + + /** + * Sets validator options + * + * The array $files must be given in syntax of Zend_File_Transfer to be checked + * If no files are given the $_FILES array will be used automatically. + * NOTE: This validator will only work with HTTP POST uploads! + * + * @param array|Zend_Config $files Array of files in syntax of Zend_File_Transfer + * @return void + */ + public function __construct($files = array()) + { + if ($files instanceof Zend_Config) { + $files = $files->toArray(); + } + + $this->setFiles($files); + } + + /** + * Returns the array of set files + * + * @param string $files (Optional) The file to return in detail + * @return array + * @throws Zend_Validate_Exception If file is not found + */ + public function getFiles($file = null) + { + if ($file !== null) { + $return = array(); + foreach ($this->_files as $name => $content) { + if ($name === $file) { + $return[$file] = $this->_files[$name]; + } + + if ($content['name'] === $file) { + $return[$name] = $this->_files[$name]; + } + } + + if (count($return) === 0) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The file '$file' was not found"); + } + + return $return; + } + + return $this->_files; + } + + /** + * Sets the files to be checked + * + * @param array $files The files to check in syntax of Zend_File_Transfer + * @return Zend_Validate_File_Upload Provides a fluent interface + */ + public function setFiles($files = array()) + { + if (count($files) === 0) { + $this->_files = $_FILES; + } else { + $this->_files = $files; + } + + foreach($this->_files as $file => $content) { + if (!isset($content['error'])) { + unset($this->_files[$file]); + } + } + + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the file was uploaded without errors + * + * @param string $value Single file to check for upload errors, when giving null the $_FILES array + * from initialization will be used + * @return boolean + */ + public function isValid($value, $file = null) + { + if (array_key_exists($value, $this->_files)) { + $files[$value] = $this->_files[$value]; + } else { + foreach ($this->_files as $file => $content) { + if (isset($content['name']) && ($content['name'] === $value)) { + $files[$file] = $this->_files[$file]; + } + + if (isset($content['tmp_name']) && ($content['tmp_name'] === $value)) { + $files[$file] = $this->_files[$file]; + } + } + } + + if (empty($files)) { + return $this->_throw($file, self::FILE_NOT_FOUND); + } + + foreach ($files as $file => $content) { + $this->_value = $file; + switch($content['error']) { + case 0: + if (!is_uploaded_file($content['tmp_name'])) { + $this->_throw($file, self::ATTACK); + } + break; + + case 1: + $this->_throw($file, self::INI_SIZE); + break; + + case 2: + $this->_throw($file, self::FORM_SIZE); + break; + + case 3: + $this->_throw($file, self::PARTIAL); + break; + + case 4: + $this->_throw($file, self::NO_FILE); + break; + + case 6: + $this->_throw($file, self::NO_TMP_DIR); + break; + + case 7: + $this->_throw($file, self::CANT_WRITE); + break; + + case 8: + $this->_throw($file, self::EXTENSION); + break; + + default: + $this->_throw($file, self::UNKNOWN); + break; + } + } + + if (count($this->_messages) > 0) { + return false; + } else { + return true; + } + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function _throw($file, $errorType) + { + if ($file !== null) { + if (is_array($file) and !empty($file['name'])) { + $this->_value = $file['name']; + } + } + + $this->_error($errorType); + return false; + } +} diff --git a/lib/zend/Zend/Validate/File/WordCount.php b/lib/zend/Zend/Validate/File/WordCount.php new file mode 100644 index 0000000000..652b8d2b97 --- /dev/null +++ b/lib/zend/Zend/Validate/File/WordCount.php @@ -0,0 +1,101 @@ + "Too much words, maximum '%max%' are allowed but '%count%' were counted", + self::TOO_LESS => "Too less words, minimum '%min%' are expected but '%count%' were counted", + self::NOT_FOUND => "The file '%value%' could not be found" + ); + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the counted words are at least min and + * not bigger than max (when max is not null). + * + * @param string $value Filename to check for word count + * @param array $file File data from Zend_File_Transfer + * @return boolean + */ + public function isValid($value, $file = null) + { + // Is file readable ? + require_once 'Zend/Loader.php'; + if (!Zend_Loader::isReadable($value)) { + return $this->_throw($file, self::NOT_FOUND); + } + + $content = file_get_contents($value); + $this->_count = str_word_count($content); + if (($this->_max !== null) && ($this->_count > $this->_max)) { + return $this->_throw($file, self::TOO_MUCH); + } + + if (($this->_min !== null) && ($this->_count < $this->_min)) { + return $this->_throw($file, self::TOO_LESS); + } + + return true; + } + + /** + * Throws an error of the given type + * + * @param string $file + * @param string $errorType + * @return false + */ + protected function _throw($file, $errorType) + { + if ($file !== null) { + $this->_value = $file['name']; + } + + $this->_error($errorType); + return false; + } +} diff --git a/lib/zend/Zend/Validate/Float.php b/lib/zend/Zend/Validate/Float.php new file mode 100644 index 0000000000..44b7d8367b --- /dev/null +++ b/lib/zend/Zend/Validate/Float.php @@ -0,0 +1,126 @@ + "Invalid type given, value should be float, string, or integer", + self::NOT_FLOAT => "'%value%' does not appear to be a float" + ); + + protected $_locale; + + /** + * Constructor for the float validator + * + * @param string|Zend_Locale $locale + */ + public function __construct($locale = null) + { + if ($locale !== null) { + $this->setLocale($locale); + } + } + + /** + * Returns the set locale + */ + public function getLocale() + { + return $this->_locale; + } + + /** + * Sets the locale to use + * + * @param string|Zend_Locale $locale + */ + public function setLocale($locale = null) + { + require_once 'Zend/Locale.php'; + $this->_locale = Zend_Locale::findLocale($locale); + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value is a floating-point value + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value) && !is_float($value)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue($value); + if ($this->_locale === null) { + $locale = localeconv(); + $valueFiltered = str_replace($locale['thousands_sep'], '', (string) $value); + $valueFiltered = str_replace($locale['decimal_point'], '.', $valueFiltered); + + if (strval(floatval($valueFiltered)) != $valueFiltered) { + $this->_error(self::NOT_FLOAT); + return false; + } + + } else { + try { + if (!Zend_Locale_Format::isFloat($value, array('locale' => 'en')) && + !Zend_Locale_Format::isFloat($value, array('locale' => $this->_locale))) { + $this->_error(self::NOT_FLOAT); + return false; + } + } catch (Zend_Locale_Exception $e) { + $this->_error(self::NOT_FLOAT); + return false; + } + } + + return true; + } +} diff --git a/lib/zend/Zend/Validate/GreaterThan.php b/lib/zend/Zend/Validate/GreaterThan.php new file mode 100644 index 0000000000..4f551c5aae --- /dev/null +++ b/lib/zend/Zend/Validate/GreaterThan.php @@ -0,0 +1,114 @@ + "'%value%' is not greater than '%min%'" + ); + + /** + * @var array + */ + protected $_messageVariables = array( + 'min' => '_min' + ); + + /** + * Minimum value + * + * @var mixed + */ + protected $_min; + + /** + * Sets validator options + * + * @param mixed $min + * @return void + */ + public function __construct($min) + { + $this->setMin($min); + } + + /** + * Returns the min option + * + * @return mixed + */ + public function getMin() + { + return $this->_min; + } + + /** + * Sets the min option + * + * @param mixed $min + * @return Zend_Validate_GreaterThan Provides a fluent interface + */ + public function setMin($min) + { + $this->_min = $min; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value is greater than min option + * + * @param mixed $value + * @return boolean + */ + public function isValid($value) + { + $this->_setValue($value); + + if ($this->_min >= $value) { + $this->_error(self::NOT_GREATER); + return false; + } + return true; + } + +} diff --git a/lib/zend/Zend/Validate/Hex.php b/lib/zend/Zend/Validate/Hex.php new file mode 100644 index 0000000000..462b8ff81b --- /dev/null +++ b/lib/zend/Zend/Validate/Hex.php @@ -0,0 +1,75 @@ + "Invalid type given, value should be a string", + self::NOT_HEX => "'%value%' has not only hexadecimal digit characters" + ); + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value contains only hexadecimal digit characters + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue($value); + if (!ctype_xdigit((string) $value)) { + $this->_error(self::NOT_HEX); + return false; + } + + return true; + } + +} diff --git a/lib/zend/Zend/Validate/Hostname.php b/lib/zend/Zend/Validate/Hostname.php index 2f6468e2bc..e12b531877 100644 --- a/lib/zend/Zend/Validate/Hostname.php +++ b/lib/zend/Zend/Validate/Hostname.php @@ -1,5 +1,4 @@ "Invalid type given, value should be a string", self::IP_ADDRESS_NOT_ALLOWED => "'%value%' appears to be an IP address, but IP addresses are not allowed", self::UNKNOWN_TLD => "'%value%' appears to be a DNS hostname but cannot match TLD against known list", self::INVALID_DASH => "'%value%' appears to be a DNS hostname but contains a dash (-) in an invalid position", @@ -74,7 +69,8 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract self::UNDECIPHERABLE_TLD => "'%value%' appears to be a DNS hostname but cannot extract TLD part", self::INVALID_HOSTNAME => "'%value%' does not match the expected structure for a DNS hostname", self::INVALID_LOCAL_NAME => "'%value%' does not appear to be a valid local network name", - self::LOCAL_NAME_NOT_ALLOWED => "'%value%' appears to be a local network name but local network names are not allowed" + self::LOCAL_NAME_NOT_ALLOWED => "'%value%' appears to be a local network name but local network names are not allowed", + self::CANNOT_DECODE_PUNYCODE => "'%value%' appears to be a DNS hostname but the given punycode notation cannot be decoded" ); /** @@ -125,52 +121,205 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract */ protected $_allow; - /** - * Bit field of CHECK constants; determines what additional hostname checks to make - * - * @var unknown_type - */ - // protected $_check; - /** * Array of valid top-level-domains * - * @var array * @see ftp://data.iana.org/TLD/tlds-alpha-by-domain.txt List of all TLDs by domain + * @see http://www.iana.org/domains/root/db/ Official list of supported TLDs + * @var array */ protected $_validTlds = array( - 'ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', - 'aq', 'ar', 'arpa', 'as', 'asia', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb', - 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bm', 'bn', 'bo', - 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cat', 'cc', 'cd', - 'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop', - 'cr', 'cu', 'cv', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', - 'dz', 'ec', 'edu', 'ee', 'eg', 'er', 'es', 'et', 'eu', 'fi', 'fj', - 'fk', 'fm', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', - 'gi', 'gl', 'gm', 'gn', 'gov', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', - 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', - 'im', 'in', 'info', 'int', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', - 'jo', 'jobs', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw', - 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', - 'lv', 'ly', 'ma', 'mc', 'md', 'me', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm', - 'mn', 'mo', 'mobi', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', - 'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net', 'nf', 'ng', - 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa', 'pe', - 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'pro', 'ps', 'pt', - 'pw', 'py', 'qa', 're', 'ro', 'rs', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', - 'se', 'sg', 'sh', 'si', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'sr', - 'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td', 'tel', 'tf', 'tg', 'th', 'tj', - 'tk', 'tl', 'tm', 'tn', 'to', 'tp', 'tr', 'travel', 'tt', 'tv', 'tw', - 'tz', 'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've', - 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'ye', 'yt', 'yu', 'za', 'zm', - 'zw' - ); + 'ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', 'arpa', + 'as', 'asia', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', + 'biz', 'bj', 'bm', 'bn', 'bo', 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cat', 'cc', + 'cd', 'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop', 'cr', 'cu', + 'cv', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec', 'edu', 'ee', 'eg', 'er', + 'es', 'et', 'eu', 'fi', 'fj', 'fk', 'fm', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', + 'gh', 'gi', 'gl', 'gm', 'gn', 'gov', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy', 'hk', + 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'info', 'int', 'io', 'iq', + 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jobs', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp', + 'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', 'lv', 'ly', + 'ma', 'mc', 'md', 'me', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'mp', + 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', + 'ne', 'net', 'nf', 'ng', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa', 'pe', + 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'pro', 'ps', 'pt', 'pw', 'py', 'qa', 're', + 'ro', 'rs', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sj', 'sk', 'sl', + 'sm', 'sn', 'so', 'sr', 'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td', 'tel', 'tf', 'tg', 'th', + 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'tp', 'tr', 'travel', 'tt', 'tv', 'tw', 'tz', 'ua', + 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 've', 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', + 'ye', 'yt', 'yu', 'za', 'zm', 'zw' + ); /** * @var string */ protected $_tld; + /** + * Array for valid Idns + * @see http://www.iana.org/domains/idn-tables/ Official list of supported IDN Chars + * (.AC) Ascension Island http://www.nic.ac/pdf/AC-IDN-Policy.pdf + * (.AR) Argentinia http://www.nic.ar/faqidn.html + * (.AS) American Samoa http://www.nic.as/idn/chars.cfm + * (.AT) Austria http://www.nic.at/en/service/technical_information/idn/charset_converter/ + * (.BIZ) International http://www.iana.org/domains/idn-tables/ + * (.BR) Brazil http://registro.br/faq/faq6.html + * (.BV) Bouvett Island http://www.norid.no/domeneregistrering/idn/idn_nyetegn.en.html + * (.CAT) Catalan http://www.iana.org/domains/idn-tables/tables/cat_ca_1.0.html + * (.CH) Switzerland https://nic.switch.ch/reg/ocView.action?res=EF6GW2JBPVTG67DLNIQXU234MN6SC33JNQQGI7L6#anhang1 + * (.CL) Chile http://www.iana.org/domains/idn-tables/tables/cl_latn_1.0.html + * (.COM) International http://www.verisign.com/information-services/naming-services/internationalized-domain-names/index.html + * (.DE) Germany http://www.denic.de/en/domains/idns/liste.html + * (.DK) Danmark http://www.dk-hostmaster.dk/index.php?id=151 + * (.ES) Spain https://www.nic.es/media/2008-05/1210147705287.pdf + * (.FI) Finland http://www.ficora.fi/en/index/palvelut/fiverkkotunnukset/aakkostenkaytto.html + * (.GR) Greece https://grweb.ics.forth.gr/CharacterTable1_en.jsp + * (.HU) Hungary http://www.domain.hu/domain/English/szabalyzat/szabalyzat.html + * (.INFO) International http://www.nic.info/info/idn + * (.IO) British Indian Ocean Territory http://www.nic.io/IO-IDN-Policy.pdf + * (.IR) Iran http://www.nic.ir/Allowable_Characters_dot-iran + * (.IS) Iceland http://www.isnic.is/domain/rules.php + * (.KR) Korea http://www.iana.org/domains/idn-tables/tables/kr_ko-kr_1.0.html + * (.LI) Liechtenstein https://nic.switch.ch/reg/ocView.action?res=EF6GW2JBPVTG67DLNIQXU234MN6SC33JNQQGI7L6#anhang1 + * (.LT) Lithuania http://www.domreg.lt/static/doc/public/idn_symbols-en.pdf + * (.MD) Moldova http://www.register.md/ + * (.MUSEUM) International http://www.iana.org/domains/idn-tables/tables/museum_latn_1.0.html + * (.NET) International http://www.verisign.com/information-services/naming-services/internationalized-domain-names/index.html + * (.NO) Norway http://www.norid.no/domeneregistrering/idn/idn_nyetegn.en.html + * (.NU) Niue http://www.worldnames.net/ + * (.ORG) International http://www.pir.org/index.php?db=content/FAQs&tbl=FAQs_Registrant&id=2 + * (.PE) Peru https://www.nic.pe/nuevas_politicas_faq_2.php + * (.PL) Poland http://www.dns.pl/IDN/allowed_character_sets.pdf + * (.PR) Puerto Rico http://www.nic.pr/idn_rules.asp + * (.PT) Portugal https://online.dns.pt/dns_2008/do?com=DS;8216320233;111;+PAGE(4000058)+K-CAT-CODIGO(C.125)+RCNT(100); + * (.RU) Russia http://www.iana.org/domains/idn-tables/tables/ru_ru-ru_1.0.html + * (.SA) Saudi Arabia http://www.iana.org/domains/idn-tables/tables/sa_ar_1.0.html + * (.SE) Sweden http://www.iis.se/english/IDN_campaignsite.shtml?lang=en + * (.SH) Saint Helena http://www.nic.sh/SH-IDN-Policy.pdf + * (.SJ) Svalbard and Jan Mayen http://www.norid.no/domeneregistrering/idn/idn_nyetegn.en.html + * (.TH) Thailand http://www.iana.org/domains/idn-tables/tables/th_th-th_1.0.html + * (.TM) Turkmenistan http://www.nic.tm/TM-IDN-Policy.pdf + * (.TR) Turkey https://www.nic.tr/index.php + * (.VE) Venice http://www.iana.org/domains/idn-tables/tables/ve_es_1.0.html + * (.VN) Vietnam http://www.vnnic.vn/english/5-6-300-2-2-04-20071115.htm#1.%20Introduction + * + * @var array + */ + protected $_validIdns = array( + 'AC' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēėęěĝġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśŝşšţťŧūŭůűųŵŷźżž]{1,63}$/iu'), + 'AR' => array(1 => '/^[\x{002d}0-9a-zà-ãç-êìíñ-õü]{1,63}$/iu'), + 'AS' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźż]{1,63}$/iu'), + 'AT' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿœšž]{1,63}$/iu'), + 'BIZ' => 'Hostname/Biz.php', + 'BR' => array(1 => '/^[\x{002d}0-9a-zà-ãçéíó-õúü]{1,63}$/iu'), + 'BV' => array(1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'), + 'CAT' => array(1 => '/^[\x{002d}0-9a-z·àç-éíïòóúü]{1,63}$/iu'), + 'CH' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'), + 'CL' => array(1 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu'), + 'CN' => 'Hostname/Cn.php', + 'COM' => 'Zend/Validate/Hostname/Com.php', + 'DE' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿăąāćĉčċďđĕěėęēğĝġģĥħĭĩįīıĵķĺľļłńňņŋŏőōœĸŕřŗśŝšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'), + 'DK' => array(1 => '/^[\x{002d}0-9a-zäéöü]{1,63}$/iu'), + 'ES' => array(1 => '/^[\x{002d}0-9a-zàáçèéíïñòóúü·]{1,63}$/iu'), + 'FI' => array(1 => '/^[\x{002d}0-9a-zäåö]{1,63}$/iu'), + 'GR' => array(1 => '/^[\x{002d}0-9a-zΆΈΉΊΌΎ-ΡΣ-ώἀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼῂῃῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲῳῴῶ-ῼ]{1,63}$/iu'), + 'HK' => 'Zend/Validate/Hostname/Cn.php', + 'HU' => array(1 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu'), + 'INFO'=> array(1 => '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-záæéíðóöúýþ]{1,63}$/iu', + 4 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu', + 5 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu', + 6 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu', + 7 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 8 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu'), + 'IO' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿăąāćĉčċďđĕěėęēğĝġģĥħĭĩįīıĵķĺľļłńňņŋŏőōœĸŕřŗśŝšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'), + 'IS' => array(1 => '/^[\x{002d}0-9a-záéýúíóþæöð]{1,63}$/iu'), + 'JP' => 'Zend/Validate/Hostname/Jp.php', + 'KR' => array(1 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu'), + 'LI' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'), + 'LT' => array(1 => '/^[\x{002d}0-9ąčęėįšųūž]{1,63}$/iu'), + 'MD' => array(1 => '/^[\x{002d}0-9ăâîşţ]{1,63}$/iu'), + 'MUSEUM' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćċčďđēėęěğġģħīįıķĺļľłńņňŋōőœŕŗřśşšţťŧūůűųŵŷźżžǎǐǒǔ\x{01E5}\x{01E7}\x{01E9}\x{01EF}ə\x{0292}ẁẃẅỳ]{1,63}$/iu'), + 'NET' => 'Zend/Validate/Hostname/Com.php', + 'NO' => array(1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'), + 'NU' => 'Zend/Validate/Hostname/Com.php', + 'ORG' => array(1 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-záäåæéëíðóöøúüýþ]{1,63}$/iu', + 4 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu', + 5 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu', + 6 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu', + 7 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu'), + 'PE' => array(1 => '/^[\x{002d}0-9a-zñáéíóúü]{1,63}$/iu'), + 'PL' => array(1 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu', + 2 => '/^[\x{002d}а-ик-ш\x{0450}ѓѕјљњќџ]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-zâîăşţ]{1,63}$/iu', + 4 => '/^[\x{002d}0-9а-яё\x{04C2}]{1,63}$/iu', + 5 => '/^[\x{002d}0-9a-zàáâèéêìíîòóôùúûċġħż]{1,63}$/iu', + 6 => '/^[\x{002d}0-9a-zàäåæéêòóôöøü]{1,63}$/iu', + 7 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 8 => '/^[\x{002d}0-9a-zàáâãçéêíòóôõúü]{1,63}$/iu', + 9 => '/^[\x{002d}0-9a-zâîăşţ]{1,63}$/iu', + 10=> '/^[\x{002d}0-9a-záäéíóôúýčďĺľňŕšťž]{1,63}$/iu', + 11=> '/^[\x{002d}0-9a-zçë]{1,63}$/iu', + 12=> '/^[\x{002d}0-9а-ик-шђјљњћџ]{1,63}$/iu', + 13=> '/^[\x{002d}0-9a-zćčđšž]{1,63}$/iu', + 14=> '/^[\x{002d}0-9a-zâçöûüğış]{1,63}$/iu', + 15=> '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu', + 16=> '/^[\x{002d}0-9a-zäõöüšž]{1,63}$/iu', + 17=> '/^[\x{002d}0-9a-zĉĝĥĵŝŭ]{1,63}$/iu', + 18=> '/^[\x{002d}0-9a-zâäéëîô]{1,63}$/iu', + 19=> '/^[\x{002d}0-9a-zàáâäåæçèéêëìíîïðñòôöøùúûüýćčłńřśš]{1,63}$/iu', + 20=> '/^[\x{002d}0-9a-zäåæõöøüšž]{1,63}$/iu', + 21=> '/^[\x{002d}0-9a-zàáçèéìíòóùú]{1,63}$/iu', + 22=> '/^[\x{002d}0-9a-zàáéíóöúüőű]{1,63}$/iu', + 23=> '/^[\x{002d}0-9ΐά-ώ]{1,63}$/iu', + 24=> '/^[\x{002d}0-9a-zàáâåæçèéêëðóôöøüþœ]{1,63}$/iu', + 25=> '/^[\x{002d}0-9a-záäéíóöúüýčďěňřšťůž]{1,63}$/iu', + 26=> '/^[\x{002d}0-9a-z·àçèéíïòóúü]{1,63}$/iu', + 27=> '/^[\x{002d}0-9а-ъьюя\x{0450}\x{045D}]{1,63}$/iu', + 28=> '/^[\x{002d}0-9а-яёіў]{1,63}$/iu', + 29=> '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu', + 30=> '/^[\x{002d}0-9a-záäåæéëíðóöøúüýþ]{1,63}$/iu', + 31=> '/^[\x{002d}0-9a-zàâæçèéêëîïñôùûüÿœ]{1,63}$/iu', + 32=> '/^[\x{002d}0-9а-щъыьэюяёєіїґ]{1,63}$/iu', + 33=> '/^[\x{002d}0-9א-ת]{1,63}$/iu'), + 'PR' => array(1 => '/^[\x{002d}0-9a-záéíóúñäëïüöâêîôûàèùæçœãõ]{1,63}$/iu'), + 'PT' => array(1 => '/^[\x{002d}0-9a-záàâãçéêíóôõú]{1,63}$/iu'), + 'RU' => array(1 => '/^[\x{002d}0-9а-яё]{1,63}$/iu'), + 'SA' => array(1 => '/^[\x{002d}.0-9\x{0621}-\x{063A}\x{0641}-\x{064A}\x{0660}-\x{0669}]{1,63}$/iu'), + 'SE' => array(1 => '/^[\x{002d}0-9a-zäåéöü]{1,63}$/iu'), + 'SH' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿăąāćĉčċďđĕěėęēğĝġģĥħĭĩįīıĵķĺľļłńňņŋŏőōœĸŕřŗśŝšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'), + 'SJ' => array(1 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'), + 'TH' => array(1 => '/^[\x{002d}0-9a-z\x{0E01}-\x{0E3A}\x{0E40}-\x{0E4D}\x{0E50}-\x{0E59}]{1,63}$/iu'), + 'TM' => array(1 => '/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēėęěĝġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśŝşšţťŧūŭůűųŵŷźżž]{1,63}$/iu'), + 'TW' => 'Zend/Validate/Hostname/Cn.php', + 'TR' => array(1 => '/^[\x{002d}0-9a-zğıüşöç]{1,63}$/iu'), + 'VE' => array(1 => '/^[\x{002d}0-9a-záéíóúüñ]{1,63}$/iu'), + 'VN' => array(1 => '/^[ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãèéêìíòóôõùúýĂăĐđĨĩŨũƠơƯư\x{1EA0}-\x{1EF9}]{1,63}$/iu'), + 'ایران' => array(1 => '/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'), + '中国' => 'Zend/Validate/Hostname/Cn.php', + '公司' => 'Zend/Validate/Hostname/Cn.php', + '网络' => 'Zend/Validate/Hostname/Cn.php' + ); + + protected $_idnLength = array( + 'BIZ' => array(5 => 17, 11 => 15, 12 => 20), + 'CN' => array(1 => 20), + 'COM' => array(3 => 17, 5 => 20), + 'HK' => array(1 => 15), + 'INFO'=> array(4 => 17), + 'KR' => array(1 => 17), + 'NET' => array(3 => 17, 5 => 20), + 'ORG' => array(6 => 17), + 'TW' => array(1 => 20), + 'ایران' => array(1 => 30), + '中国' => array(1 => 20), + '公司' => array(1 => 20), + '网络' => array(1 => 20), + ); + /** * Sets validator options * @@ -251,20 +400,6 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract $this->_validateTld = (bool) $allowed; } - /** - * Sets the check option - * - * @param integer $check - * @return Zend_Validate_Hostname Provides a fluent interface - */ - /* - public function setCheck($check) - { - $this->_check = $check; - return $this; - } - */ - /** * Defined by Zend_Validate_Interface * @@ -276,28 +411,37 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract */ public function isValid($value) { - $valueString = (string) $value; + if (!is_string($value)) { + $this->_error(self::INVALID); + return false; + } - $this->_setValue($valueString); + $this->_setValue($value); // Check input against IP address schema - if ($this->_ipValidator->setTranslator($this->getTranslator())->isValid($valueString)) { + if (preg_match('/^[0-9.a-e:.]*$/i', $value) && + $this->_ipValidator->setTranslator($this->getTranslator())->isValid($value)) { if (!($this->_allow & self::ALLOW_IP)) { $this->_error(self::IP_ADDRESS_NOT_ALLOWED); return false; - } else{ + } else { return true; } } // Check input against DNS hostname schema - $domainParts = explode('.', $valueString); - if ((count($domainParts) > 1) && (strlen($valueString) >= 4) && (strlen($valueString) <= 254)) { + $domainParts = explode('.', $value); + if ((count($domainParts) > 1) && (strlen($value) >= 4) && (strlen($value) <= 254)) { $status = false; + $origenc = iconv_get_encoding('internal_encoding'); + iconv_set_encoding('internal_encoding', 'UTF-8'); do { // First check TLD - if (preg_match('/([a-z]{2,10})$/i', end($domainParts), $matches)) { + $matches = array(); + if (preg_match('/([^.]{2,10})$/i', end($domainParts), $matches) || + (end($domainParts) == 'ایران') || (end($domainParts) == '中国') || + (end($domainParts) == '公司') || (end($domainParts) == '网络')) { reset($domainParts); @@ -318,52 +462,64 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract /** * Match against IDN hostnames + * Note: Keep label regex short to avoid issues with long patterns when matching IDN hostnames * @see Zend_Validate_Hostname_Interface */ - $labelChars = 'a-z0-9'; - $utf8 = false; - $classFile = 'Zend/Validate/Hostname/' . ucfirst($this->_tld) . '.php'; - if ($this->_validateIdn) { - if (Zend_Loader::isReadable($classFile)) { - - // Load additional characters - $className = 'Zend_Validate_Hostname_' . ucfirst($this->_tld); - Zend_Loader::loadClass($className); - $labelChars .= call_user_func(array($className, 'getCharacters')); - $utf8 = true; + $regexChars = array(0 => '/^[a-z0-9\x2d]{1,63}$/i'); + if ($this->_validateIdn && isset($this->_validIdns[strtoupper($this->_tld)])) { + if (is_string($this->_validIdns[strtoupper($this->_tld)])) { + $regexChars += include($this->_validIdns[strtoupper($this->_tld)]); + } else { + $regexChars += $this->_validIdns[strtoupper($this->_tld)]; } } - // Keep label regex short to avoid issues with long patterns when matching IDN hostnames - $regexLabel = '/^[' . $labelChars . '\x2d]{1,63}$/i'; - if ($utf8) { - $regexLabel .= 'u'; - } - // Check each hostname part $valid = true; foreach ($domainParts as $domainPart) { - // Check dash (-) does not start, end or appear in 3rd and 4th positions - if (strpos($domainPart, '-') === 0 || - (strlen($domainPart) > 2 && strpos($domainPart, '-', 2) == 2 && strpos($domainPart, '-', 3) == 3) || - strrpos($domainPart, '-') === strlen($domainPart) - 1) { + // Decode Punycode domainnames to IDN + if (strpos($domainPart, 'xn--') === 0) { + $domainPart = $this->decodePunycode(substr($domainPart, 4)); + if ($domainPart === false) { + return false; + } + } + // Check dash (-) does not start, end or appear in 3rd and 4th positions + if ((strpos($domainPart, '-') === 0) + || ((strlen($domainPart) > 2) && (strpos($domainPart, '-', 2) == 2) && (strpos($domainPart, '-', 3) == 3)) + || (strpos($domainPart, '-') === (strlen($domainPart) - 1))) { $this->_error(self::INVALID_DASH); $status = false; break 2; } // Check each domain part - $status = @preg_match($regexLabel, $domainPart); - if ($status === false) { - /** - * Regex error - * @see Zend_Validate_Exception - */ - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception('Internal error: DNS validation failed'); - } elseif ($status === 0) { + $check = false; + foreach($regexChars as $regexKey => $regexChar) { + $status = @preg_match($regexChar, $domainPart); + if ($status === false) { + iconv_set_encoding('internal_encoding', $origenc); + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('Internal error: DNS validation failed'); + } elseif ($status !== 0) { + $length = 63; + if (array_key_exists(strtoupper($this->_tld), $this->_idnLength) + && (array_key_exists($regexKey, $this->_idnLength[strtoupper($this->_tld)]))) { + $length = $this->_idnLength[strtoupper($this->_tld)]; + } + + if (iconv_strlen($domainPart, 'UTF-8') > $length) { + $this->_error(self::INVALID_HOSTNAME); + } else { + $check = true; + break 2; + } + } + } + + if (!$check) { $valid = false; } } @@ -381,6 +537,7 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract } } while (false); + iconv_set_encoding('internal_encoding', $origenc); // If the input passes as an Internet domain name, and domain names are allowed, then the hostname // passes validation if ($status && ($this->_allow & self::ALLOW_DNS)) { @@ -392,7 +549,7 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract // Check input against local network name schema; last chance to pass validation $regexLocal = '/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/'; - $status = @preg_match($regexLocal, $valueString); + $status = @preg_match($regexLocal, $value); if (false === $status) { /** * Regex error @@ -423,22 +580,99 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract } /** - * Throws an exception if a regex for $type does not exist + * Decodes a punycode encoded string to it's original utf8 string + * In case of a decoding failure the original string is returned * - * @param string $type - * @throws Zend_Validate_Exception - * @return Zend_Validate_Hostname Provides a fluent interface + * @param string $encoded Punycode encoded string to decode + * @return string */ - /* - protected function _checkRegexType($type) + protected function decodePunycode($encoded) { - if (!isset($this->_regex[$type])) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception("'$type' must be one of ('" . implode(', ', array_keys($this->_regex)) - . "')"); + $found = preg_match('/([^a-z0-9\x2d]{1,10})$/i', $encoded); + if (empty($encoded) || ($found > 0)) { + // no punycode encoded string, return as is + $this->_error(self::CANNOT_DECODE_PUNYCODE); + return false; + } + + $separator = strrpos($encoded, '-'); + if ($separator > 0) { + for ($x = 0; $x < $separator; ++$x) { + // prepare decoding matrix + $decoded[] = ord($encoded[$x]); + } + } else { + $this->_error(self::CANNOT_DECODE_PUNYCODE); + return false; } - return $this; - } - */ + $lengthd = count($decoded); + $lengthe = strlen($encoded); + + // decoding + $init = true; + $base = 72; + $index = 0; + $char = 0x80; + + for ($indexe = ($separator) ? ($separator + 1) : 0; $indexe < $lengthe; ++$lengthd) { + for ($old_index = $index, $pos = 1, $key = 36; 1 ; $key += 36) { + $hex = ord($encoded[$indexe++]); + $digit = ($hex - 48 < 10) ? $hex - 22 + : (($hex - 65 < 26) ? $hex - 65 + : (($hex - 97 < 26) ? $hex - 97 + : 36)); + + $index += $digit * $pos; + $tag = ($key <= $base) ? 1 : (($key >= $base + 26) ? 26 : ($key - $base)); + if ($digit < $tag) { + break; + } + + $pos = (int) ($pos * (36 - $tag)); + } + + $delta = intval($init ? (($index - $old_index) / 700) : (($index - $old_index) / 2)); + $delta += intval($delta / ($lengthd + 1)); + for ($key = 0; $delta > 910 / 2; $key += 36) { + $delta = intval($delta / 35); + } + + $base = intval($key + 36 * $delta / ($delta + 38)); + $init = false; + $char += (int) ($index / ($lengthd + 1)); + $index %= ($lengthd + 1); + if ($lengthd > 0) { + for ($i = $lengthd; $i > $index; $i--) { + $decoded[$i] = $decoded[($i - 1)]; + } + } + + $decoded[$index++] = $char; + } + + // convert decoded ucs4 to utf8 string + foreach ($decoded as $key => $value) { + if ($value < 128) { + $decoded[$key] = chr($value); + } elseif ($value < (1 << 11)) { + $decoded[$key] = chr(192 + ($value >> 6)); + $decoded[$key] .= chr(128 + ($value & 63)); + } elseif ($value < (1 << 16)) { + $decoded[$key] = chr(224 + ($value >> 12)); + $decoded[$key] .= chr(128 + (($value >> 6) & 63)); + $decoded[$key] .= chr(128 + ($value & 63)); + } elseif ($value < (1 << 21)) { + $decoded[$key] = chr(240 + ($value >> 18)); + $decoded[$key] .= chr(128 + (($value >> 12) & 63)); + $decoded[$key] .= chr(128 + (($value >> 6) & 63)); + $decoded[$key] .= chr(128 + ($value & 63)); + } else { + $this->_error(self::CANNOT_DECODE_PUNYCODE); + return false; + } + } + + return implode($decoded); + } } diff --git a/lib/zend/Zend/Validate/Hostname/Biz.php b/lib/zend/Zend/Validate/Hostname/Biz.php new file mode 100644 index 0000000000..de6b3326e7 --- /dev/null +++ b/lib/zend/Zend/Validate/Hostname/Biz.php @@ -0,0 +1,2917 @@ + '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu', + 2 => '/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu', + 4 => '/^[\x{002d}0-9a-záæéíðóöúýþ]{1,63}$/iu', + 5 => '/^[\x{AC00}-\x{D7A3}]{1,17}$/iu', + 6 => '/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu', + 7 => '/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu', + 8 => '/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu', + 9 => '/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu', + 10 => '/^[\x{002d}0-9a-záàâãçéêíóôõú]{1,63}$/iu', + 11 => '/^[\x{002d}0-9a-z\x{3005}-\x{3007}\x{3041}-\x{3093}\x{309D}\x{309E}\x{30A1}-\x{30F6}\x{30FC}' . +'\x{30FD}\x{30FE}\x{4E00}\x{4E01}\x{4E03}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' . +'\x{4E0B}\x{4E0D}\x{4E0E}\x{4E10}\x{4E11}\x{4E14}\x{4E15}\x{4E16}\x{4E17}' . +'\x{4E18}\x{4E19}\x{4E1E}\x{4E21}\x{4E26}\x{4E2A}\x{4E2D}\x{4E31}\x{4E32}' . +'\x{4E36}\x{4E38}\x{4E39}\x{4E3B}\x{4E3C}\x{4E3F}\x{4E42}\x{4E43}\x{4E45}' . +'\x{4E4B}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E55}\x{4E56}\x{4E57}\x{4E58}\x{4E59}' . +'\x{4E5D}\x{4E5E}\x{4E5F}\x{4E62}\x{4E71}\x{4E73}\x{4E7E}\x{4E80}\x{4E82}' . +'\x{4E85}\x{4E86}\x{4E88}\x{4E89}\x{4E8A}\x{4E8B}\x{4E8C}\x{4E8E}\x{4E91}' . +'\x{4E92}\x{4E94}\x{4E95}\x{4E98}\x{4E99}\x{4E9B}\x{4E9C}\x{4E9E}\x{4E9F}' . +'\x{4EA0}\x{4EA1}\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA8}\x{4EAB}\x{4EAC}' . +'\x{4EAD}\x{4EAE}\x{4EB0}\x{4EB3}\x{4EB6}\x{4EBA}\x{4EC0}\x{4EC1}\x{4EC2}' . +'\x{4EC4}\x{4EC6}\x{4EC7}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED4}' . +'\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE3}' . +'\x{4EE4}\x{4EE5}\x{4EED}\x{4EEE}\x{4EF0}\x{4EF2}\x{4EF6}\x{4EF7}\x{4EFB}' . +'\x{4F01}\x{4F09}\x{4F0A}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}\x{4F11}\x{4F1A}' . +'\x{4F1C}\x{4F1D}\x{4F2F}\x{4F30}\x{4F34}\x{4F36}\x{4F38}\x{4F3A}\x{4F3C}' . +'\x{4F3D}\x{4F43}\x{4F46}\x{4F47}\x{4F4D}\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}' . +'\x{4F53}\x{4F55}\x{4F57}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}' . +'\x{4F69}\x{4F6F}\x{4F70}\x{4F73}\x{4F75}\x{4F76}\x{4F7B}\x{4F7C}\x{4F7F}' . +'\x{4F83}\x{4F86}\x{4F88}\x{4F8B}\x{4F8D}\x{4F8F}\x{4F91}\x{4F96}\x{4F98}' . +'\x{4F9B}\x{4F9D}\x{4FA0}\x{4FA1}\x{4FAB}\x{4FAD}\x{4FAE}\x{4FAF}\x{4FB5}' . +'\x{4FB6}\x{4FBF}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FCA}\x{4FCE}\x{4FD0}\x{4FD1}' . +'\x{4FD4}\x{4FD7}\x{4FD8}\x{4FDA}\x{4FDB}\x{4FDD}\x{4FDF}\x{4FE1}\x{4FE3}' . +'\x{4FE4}\x{4FE5}\x{4FEE}\x{4FEF}\x{4FF3}\x{4FF5}\x{4FF6}\x{4FF8}\x{4FFA}' . +'\x{4FFE}\x{5005}\x{5006}\x{5009}\x{500B}\x{500D}\x{500F}\x{5011}\x{5012}' . +'\x{5014}\x{5016}\x{5019}\x{501A}\x{501F}\x{5021}\x{5023}\x{5024}\x{5025}' . +'\x{5026}\x{5028}\x{5029}\x{502A}\x{502B}\x{502C}\x{502D}\x{5036}\x{5039}' . +'\x{5043}\x{5047}\x{5048}\x{5049}\x{504F}\x{5050}\x{5055}\x{5056}\x{505A}' . +'\x{505C}\x{5065}\x{506C}\x{5072}\x{5074}\x{5075}\x{5076}\x{5078}\x{507D}' . +'\x{5080}\x{5085}\x{508D}\x{5091}\x{5098}\x{5099}\x{509A}\x{50AC}\x{50AD}' . +'\x{50B2}\x{50B3}\x{50B4}\x{50B5}\x{50B7}\x{50BE}\x{50C2}\x{50C5}\x{50C9}' . +'\x{50CA}\x{50CD}\x{50CF}\x{50D1}\x{50D5}\x{50D6}\x{50DA}\x{50DE}\x{50E3}' . +'\x{50E5}\x{50E7}\x{50ED}\x{50EE}\x{50F5}\x{50F9}\x{50FB}\x{5100}\x{5101}' . +'\x{5102}\x{5104}\x{5109}\x{5112}\x{5114}\x{5115}\x{5116}\x{5118}\x{511A}' . +'\x{511F}\x{5121}\x{512A}\x{5132}\x{5137}\x{513A}\x{513B}\x{513C}\x{513F}' . +'\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' . +'\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5152}\x{5154}\x{515A}\x{515C}' . +'\x{5162}\x{5165}\x{5168}\x{5169}\x{516A}\x{516B}\x{516C}\x{516D}\x{516E}' . +'\x{5171}\x{5175}\x{5176}\x{5177}\x{5178}\x{517C}\x{5180}\x{5182}\x{5185}' . +'\x{5186}\x{5189}\x{518A}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}' . +'\x{5193}\x{5195}\x{5196}\x{5197}\x{5199}\x{51A0}\x{51A2}\x{51A4}\x{51A5}' . +'\x{51A6}\x{51A8}\x{51A9}\x{51AA}\x{51AB}\x{51AC}\x{51B0}\x{51B1}\x{51B2}' . +'\x{51B3}\x{51B4}\x{51B5}\x{51B6}\x{51B7}\x{51BD}\x{51C4}\x{51C5}\x{51C6}' . +'\x{51C9}\x{51CB}\x{51CC}\x{51CD}\x{51D6}\x{51DB}\x{51DC}\x{51DD}\x{51E0}' . +'\x{51E1}\x{51E6}\x{51E7}\x{51E9}\x{51EA}\x{51ED}\x{51F0}\x{51F1}\x{51F5}' . +'\x{51F6}\x{51F8}\x{51F9}\x{51FA}\x{51FD}\x{51FE}\x{5200}\x{5203}\x{5204}' . +'\x{5206}\x{5207}\x{5208}\x{520A}\x{520B}\x{520E}\x{5211}\x{5214}\x{5217}' . +'\x{521D}\x{5224}\x{5225}\x{5227}\x{5229}\x{522A}\x{522E}\x{5230}\x{5233}' . +'\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{5243}\x{5244}\x{5247}' . +'\x{524A}\x{524B}\x{524C}\x{524D}\x{524F}\x{5254}\x{5256}\x{525B}\x{525E}' . +'\x{5263}\x{5264}\x{5265}\x{5269}\x{526A}\x{526F}\x{5270}\x{5271}\x{5272}' . +'\x{5273}\x{5274}\x{5275}\x{527D}\x{527F}\x{5283}\x{5287}\x{5288}\x{5289}' . +'\x{528D}\x{5291}\x{5292}\x{5294}\x{529B}\x{529F}\x{52A0}\x{52A3}\x{52A9}' . +'\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52B1}\x{52B4}\x{52B5}\x{52B9}\x{52BC}' . +'\x{52BE}\x{52C1}\x{52C3}\x{52C5}\x{52C7}\x{52C9}\x{52CD}\x{52D2}\x{52D5}' . +'\x{52D7}\x{52D8}\x{52D9}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}' . +'\x{52E4}\x{52E6}\x{52E7}\x{52F2}\x{52F3}\x{52F5}\x{52F8}\x{52F9}\x{52FA}' . +'\x{52FE}\x{52FF}\x{5301}\x{5302}\x{5305}\x{5306}\x{5308}\x{530D}\x{530F}' . +'\x{5310}\x{5315}\x{5316}\x{5317}\x{5319}\x{531A}\x{531D}\x{5320}\x{5321}' . +'\x{5323}\x{532A}\x{532F}\x{5331}\x{5333}\x{5338}\x{5339}\x{533A}\x{533B}' . +'\x{533F}\x{5340}\x{5341}\x{5343}\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}' . +'\x{534A}\x{534D}\x{5351}\x{5352}\x{5353}\x{5354}\x{5357}\x{5358}\x{535A}' . +'\x{535C}\x{535E}\x{5360}\x{5366}\x{5369}\x{536E}\x{536F}\x{5370}\x{5371}' . +'\x{5373}\x{5374}\x{5375}\x{5377}\x{5378}\x{537B}\x{537F}\x{5382}\x{5384}' . +'\x{5396}\x{5398}\x{539A}\x{539F}\x{53A0}\x{53A5}\x{53A6}\x{53A8}\x{53A9}' . +'\x{53AD}\x{53AE}\x{53B0}\x{53B3}\x{53B6}\x{53BB}\x{53C2}\x{53C3}\x{53C8}' . +'\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}\x{53D4}\x{53D6}\x{53D7}' . +'\x{53D9}\x{53DB}\x{53DF}\x{53E1}\x{53E2}\x{53E3}\x{53E4}\x{53E5}\x{53E8}' . +'\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}\x{53EF}\x{53F0}\x{53F1}' . +'\x{53F2}\x{53F3}\x{53F6}\x{53F7}\x{53F8}\x{53FA}\x{5401}\x{5403}\x{5404}' . +'\x{5408}\x{5409}\x{540A}\x{540B}\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}' . +'\x{5411}\x{541B}\x{541D}\x{541F}\x{5420}\x{5426}\x{5429}\x{542B}\x{542C}' . +'\x{542D}\x{542E}\x{5436}\x{5438}\x{5439}\x{543B}\x{543C}\x{543D}\x{543E}' . +'\x{5440}\x{5442}\x{5446}\x{5448}\x{5449}\x{544A}\x{544E}\x{5451}\x{545F}' . +'\x{5468}\x{546A}\x{5470}\x{5471}\x{5473}\x{5475}\x{5476}\x{5477}\x{547B}' . +'\x{547C}\x{547D}\x{5480}\x{5484}\x{5486}\x{548B}\x{548C}\x{548E}\x{548F}' . +'\x{5490}\x{5492}\x{54A2}\x{54A4}\x{54A5}\x{54A8}\x{54AB}\x{54AC}\x{54AF}' . +'\x{54B2}\x{54B3}\x{54B8}\x{54BC}\x{54BD}\x{54BE}\x{54C0}\x{54C1}\x{54C2}' . +'\x{54C4}\x{54C7}\x{54C8}\x{54C9}\x{54D8}\x{54E1}\x{54E2}\x{54E5}\x{54E6}' . +'\x{54E8}\x{54E9}\x{54ED}\x{54EE}\x{54F2}\x{54FA}\x{54FD}\x{5504}\x{5506}' . +'\x{5507}\x{550F}\x{5510}\x{5514}\x{5516}\x{552E}\x{552F}\x{5531}\x{5533}' . +'\x{5538}\x{5539}\x{553E}\x{5540}\x{5544}\x{5545}\x{5546}\x{554C}\x{554F}' . +'\x{5553}\x{5556}\x{5557}\x{555C}\x{555D}\x{5563}\x{557B}\x{557C}\x{557E}' . +'\x{5580}\x{5583}\x{5584}\x{5587}\x{5589}\x{558A}\x{558B}\x{5598}\x{5599}' . +'\x{559A}\x{559C}\x{559D}\x{559E}\x{559F}\x{55A7}\x{55A8}\x{55A9}\x{55AA}' . +'\x{55AB}\x{55AC}\x{55AE}\x{55B0}\x{55B6}\x{55C4}\x{55C5}\x{55C7}\x{55D4}' . +'\x{55DA}\x{55DC}\x{55DF}\x{55E3}\x{55E4}\x{55F7}\x{55F9}\x{55FD}\x{55FE}' . +'\x{5606}\x{5609}\x{5614}\x{5616}\x{5617}\x{5618}\x{561B}\x{5629}\x{562F}' . +'\x{5631}\x{5632}\x{5634}\x{5636}\x{5638}\x{5642}\x{564C}\x{564E}\x{5650}' . +'\x{565B}\x{5664}\x{5668}\x{566A}\x{566B}\x{566C}\x{5674}\x{5678}\x{567A}' . +'\x{5680}\x{5686}\x{5687}\x{568A}\x{568F}\x{5694}\x{56A0}\x{56A2}\x{56A5}' . +'\x{56AE}\x{56B4}\x{56B6}\x{56BC}\x{56C0}\x{56C1}\x{56C2}\x{56C3}\x{56C8}' . +'\x{56CE}\x{56D1}\x{56D3}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DE}\x{56E0}' . +'\x{56E3}\x{56EE}\x{56F0}\x{56F2}\x{56F3}\x{56F9}\x{56FA}\x{56FD}\x{56FF}' . +'\x{5700}\x{5703}\x{5704}\x{5708}\x{5709}\x{570B}\x{570D}\x{570F}\x{5712}' . +'\x{5713}\x{5716}\x{5718}\x{571C}\x{571F}\x{5726}\x{5727}\x{5728}\x{572D}' . +'\x{5730}\x{5737}\x{5738}\x{573B}\x{5740}\x{5742}\x{5747}\x{574A}\x{574E}' . +'\x{574F}\x{5750}\x{5751}\x{5761}\x{5764}\x{5766}\x{5769}\x{576A}\x{577F}' . +'\x{5782}\x{5788}\x{5789}\x{578B}\x{5793}\x{57A0}\x{57A2}\x{57A3}\x{57A4}' . +'\x{57AA}\x{57B0}\x{57B3}\x{57C0}\x{57C3}\x{57C6}\x{57CB}\x{57CE}\x{57D2}' . +'\x{57D3}\x{57D4}\x{57D6}\x{57DC}\x{57DF}\x{57E0}\x{57E3}\x{57F4}\x{57F7}' . +'\x{57F9}\x{57FA}\x{57FC}\x{5800}\x{5802}\x{5805}\x{5806}\x{580A}\x{580B}' . +'\x{5815}\x{5819}\x{581D}\x{5821}\x{5824}\x{582A}\x{582F}\x{5830}\x{5831}' . +'\x{5834}\x{5835}\x{583A}\x{583D}\x{5840}\x{5841}\x{584A}\x{584B}\x{5851}' . +'\x{5852}\x{5854}\x{5857}\x{5858}\x{5859}\x{585A}\x{585E}\x{5862}\x{5869}' . +'\x{586B}\x{5870}\x{5872}\x{5875}\x{5879}\x{587E}\x{5883}\x{5885}\x{5893}' . +'\x{5897}\x{589C}\x{589F}\x{58A8}\x{58AB}\x{58AE}\x{58B3}\x{58B8}\x{58B9}' . +'\x{58BA}\x{58BB}\x{58BE}\x{58C1}\x{58C5}\x{58C7}\x{58CA}\x{58CC}\x{58D1}' . +'\x{58D3}\x{58D5}\x{58D7}\x{58D8}\x{58D9}\x{58DC}\x{58DE}\x{58DF}\x{58E4}' . +'\x{58E5}\x{58EB}\x{58EC}\x{58EE}\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F7}' . +'\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{5902}\x{5909}\x{590A}\x{590F}' . +'\x{5910}\x{5915}\x{5916}\x{5918}\x{5919}\x{591A}\x{591B}\x{591C}\x{5922}' . +'\x{5925}\x{5927}\x{5929}\x{592A}\x{592B}\x{592C}\x{592D}\x{592E}\x{5931}' . +'\x{5932}\x{5937}\x{5938}\x{593E}\x{5944}\x{5947}\x{5948}\x{5949}\x{594E}' . +'\x{594F}\x{5950}\x{5951}\x{5954}\x{5955}\x{5957}\x{5958}\x{595A}\x{5960}' . +'\x{5962}\x{5965}\x{5967}\x{5968}\x{5969}\x{596A}\x{596C}\x{596E}\x{5973}' . +'\x{5974}\x{5978}\x{597D}\x{5981}\x{5982}\x{5983}\x{5984}\x{598A}\x{598D}' . +'\x{5993}\x{5996}\x{5999}\x{599B}\x{599D}\x{59A3}\x{59A5}\x{59A8}\x{59AC}' . +'\x{59B2}\x{59B9}\x{59BB}\x{59BE}\x{59C6}\x{59C9}\x{59CB}\x{59D0}\x{59D1}' . +'\x{59D3}\x{59D4}\x{59D9}\x{59DA}\x{59DC}\x{59E5}\x{59E6}\x{59E8}\x{59EA}' . +'\x{59EB}\x{59F6}\x{59FB}\x{59FF}\x{5A01}\x{5A03}\x{5A09}\x{5A11}\x{5A18}' . +'\x{5A1A}\x{5A1C}\x{5A1F}\x{5A20}\x{5A25}\x{5A29}\x{5A2F}\x{5A35}\x{5A36}' . +'\x{5A3C}\x{5A40}\x{5A41}\x{5A46}\x{5A49}\x{5A5A}\x{5A62}\x{5A66}\x{5A6A}' . +'\x{5A6C}\x{5A7F}\x{5A92}\x{5A9A}\x{5A9B}\x{5ABC}\x{5ABD}\x{5ABE}\x{5AC1}' . +'\x{5AC2}\x{5AC9}\x{5ACB}\x{5ACC}\x{5AD0}\x{5AD6}\x{5AD7}\x{5AE1}\x{5AE3}' . +'\x{5AE6}\x{5AE9}\x{5AFA}\x{5AFB}\x{5B09}\x{5B0B}\x{5B0C}\x{5B16}\x{5B22}' . +'\x{5B2A}\x{5B2C}\x{5B30}\x{5B32}\x{5B36}\x{5B3E}\x{5B40}\x{5B43}\x{5B45}' . +'\x{5B50}\x{5B51}\x{5B54}\x{5B55}\x{5B57}\x{5B58}\x{5B5A}\x{5B5B}\x{5B5C}' . +'\x{5B5D}\x{5B5F}\x{5B63}\x{5B64}\x{5B65}\x{5B66}\x{5B69}\x{5B6B}\x{5B70}' . +'\x{5B71}\x{5B73}\x{5B75}\x{5B78}\x{5B7A}\x{5B80}\x{5B83}\x{5B85}\x{5B87}' . +'\x{5B88}\x{5B89}\x{5B8B}\x{5B8C}\x{5B8D}\x{5B8F}\x{5B95}\x{5B97}\x{5B98}' . +'\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9F}\x{5BA2}\x{5BA3}\x{5BA4}' . +'\x{5BA5}\x{5BA6}\x{5BAE}\x{5BB0}\x{5BB3}\x{5BB4}\x{5BB5}\x{5BB6}\x{5BB8}' . +'\x{5BB9}\x{5BBF}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BC9}' . +'\x{5BCC}\x{5BD0}\x{5BD2}\x{5BD3}\x{5BD4}\x{5BDB}\x{5BDD}\x{5BDE}\x{5BDF}' . +'\x{5BE1}\x{5BE2}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}\x{5BE8}\x{5BE9}\x{5BEB}' . +'\x{5BEE}\x{5BF0}\x{5BF3}\x{5BF5}\x{5BF6}\x{5BF8}\x{5BFA}\x{5BFE}\x{5BFF}' . +'\x{5C01}\x{5C02}\x{5C04}\x{5C05}\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}' . +'\x{5C0B}\x{5C0D}\x{5C0E}\x{5C0F}\x{5C11}\x{5C13}\x{5C16}\x{5C1A}\x{5C20}' . +'\x{5C22}\x{5C24}\x{5C28}\x{5C2D}\x{5C31}\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}' . +'\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}\x{5C41}\x{5C45}\x{5C46}\x{5C48}' . +'\x{5C4A}\x{5C4B}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C53}\x{5C55}' . +'\x{5C5E}\x{5C60}\x{5C61}\x{5C64}\x{5C65}\x{5C6C}\x{5C6E}\x{5C6F}\x{5C71}' . +'\x{5C76}\x{5C79}\x{5C8C}\x{5C90}\x{5C91}\x{5C94}\x{5CA1}\x{5CA8}\x{5CA9}' . +'\x{5CAB}\x{5CAC}\x{5CB1}\x{5CB3}\x{5CB6}\x{5CB7}\x{5CB8}\x{5CBB}\x{5CBC}' . +'\x{5CBE}\x{5CC5}\x{5CC7}\x{5CD9}\x{5CE0}\x{5CE1}\x{5CE8}\x{5CE9}\x{5CEA}' . +'\x{5CED}\x{5CEF}\x{5CF0}\x{5CF6}\x{5CFA}\x{5CFB}\x{5CFD}\x{5D07}\x{5D0B}' . +'\x{5D0E}\x{5D11}\x{5D14}\x{5D15}\x{5D16}\x{5D17}\x{5D18}\x{5D19}\x{5D1A}' . +'\x{5D1B}\x{5D1F}\x{5D22}\x{5D29}\x{5D4B}\x{5D4C}\x{5D4E}\x{5D50}\x{5D52}' . +'\x{5D5C}\x{5D69}\x{5D6C}\x{5D6F}\x{5D73}\x{5D76}\x{5D82}\x{5D84}\x{5D87}' . +'\x{5D8B}\x{5D8C}\x{5D90}\x{5D9D}\x{5DA2}\x{5DAC}\x{5DAE}\x{5DB7}\x{5DBA}' . +'\x{5DBC}\x{5DBD}\x{5DC9}\x{5DCC}\x{5DCD}\x{5DD2}\x{5DD3}\x{5DD6}\x{5DDB}' . +'\x{5DDD}\x{5DDE}\x{5DE1}\x{5DE3}\x{5DE5}\x{5DE6}\x{5DE7}\x{5DE8}\x{5DEB}' . +'\x{5DEE}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DFB}\x{5DFD}' . +'\x{5DFE}\x{5E02}\x{5E03}\x{5E06}\x{5E0B}\x{5E0C}\x{5E11}\x{5E16}\x{5E19}' . +'\x{5E1A}\x{5E1B}\x{5E1D}\x{5E25}\x{5E2B}\x{5E2D}\x{5E2F}\x{5E30}\x{5E33}' . +'\x{5E36}\x{5E37}\x{5E38}\x{5E3D}\x{5E40}\x{5E43}\x{5E44}\x{5E45}\x{5E47}' . +'\x{5E4C}\x{5E4E}\x{5E54}\x{5E55}\x{5E57}\x{5E5F}\x{5E61}\x{5E62}\x{5E63}' . +'\x{5E64}\x{5E72}\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E78}\x{5E79}\x{5E7A}' . +'\x{5E7B}\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E81}\x{5E83}\x{5E84}\x{5E87}' . +'\x{5E8A}\x{5E8F}\x{5E95}\x{5E96}\x{5E97}\x{5E9A}\x{5E9C}\x{5EA0}\x{5EA6}' . +'\x{5EA7}\x{5EAB}\x{5EAD}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EC1}\x{5EC2}' . +'\x{5EC3}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECF}\x{5ED0}\x{5ED3}\x{5ED6}\x{5EDA}' . +'\x{5EDB}\x{5EDD}\x{5EDF}\x{5EE0}\x{5EE1}\x{5EE2}\x{5EE3}\x{5EE8}\x{5EE9}' . +'\x{5EEC}\x{5EF0}\x{5EF1}\x{5EF3}\x{5EF4}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}' . +'\x{5EFB}\x{5EFC}\x{5EFE}\x{5EFF}\x{5F01}\x{5F03}\x{5F04}\x{5F09}\x{5F0A}' . +'\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F10}\x{5F11}\x{5F13}\x{5F14}\x{5F15}' . +'\x{5F16}\x{5F17}\x{5F18}\x{5F1B}\x{5F1F}\x{5F25}\x{5F26}\x{5F27}\x{5F29}' . +'\x{5F2D}\x{5F2F}\x{5F31}\x{5F35}\x{5F37}\x{5F38}\x{5F3C}\x{5F3E}\x{5F41}' . +'\x{5F48}\x{5F4A}\x{5F4C}\x{5F4E}\x{5F51}\x{5F53}\x{5F56}\x{5F57}\x{5F59}' . +'\x{5F5C}\x{5F5D}\x{5F61}\x{5F62}\x{5F66}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}' . +'\x{5F6D}\x{5F70}\x{5F71}\x{5F73}\x{5F77}\x{5F79}\x{5F7C}\x{5F7F}\x{5F80}' . +'\x{5F81}\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F87}\x{5F88}\x{5F8A}\x{5F8B}' . +'\x{5F8C}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F97}\x{5F98}\x{5F99}\x{5F9E}' . +'\x{5FA0}\x{5FA1}\x{5FA8}\x{5FA9}\x{5FAA}\x{5FAD}\x{5FAE}\x{5FB3}\x{5FB4}' . +'\x{5FB9}\x{5FBC}\x{5FBD}\x{5FC3}\x{5FC5}\x{5FCC}\x{5FCD}\x{5FD6}\x{5FD7}' . +'\x{5FD8}\x{5FD9}\x{5FDC}\x{5FDD}\x{5FE0}\x{5FE4}\x{5FEB}\x{5FF0}\x{5FF1}' . +'\x{5FF5}\x{5FF8}\x{5FFB}\x{5FFD}\x{5FFF}\x{600E}\x{600F}\x{6010}\x{6012}' . +'\x{6015}\x{6016}\x{6019}\x{601B}\x{601C}\x{601D}\x{6020}\x{6021}\x{6025}' . +'\x{6026}\x{6027}\x{6028}\x{6029}\x{602A}\x{602B}\x{602F}\x{6031}\x{603A}' . +'\x{6041}\x{6042}\x{6043}\x{6046}\x{604A}\x{604B}\x{604D}\x{6050}\x{6052}' . +'\x{6055}\x{6059}\x{605A}\x{605F}\x{6060}\x{6062}\x{6063}\x{6064}\x{6065}' . +'\x{6068}\x{6069}\x{606A}\x{606B}\x{606C}\x{606D}\x{606F}\x{6070}\x{6075}' . +'\x{6077}\x{6081}\x{6083}\x{6084}\x{6089}\x{608B}\x{608C}\x{608D}\x{6092}' . +'\x{6094}\x{6096}\x{6097}\x{609A}\x{609B}\x{609F}\x{60A0}\x{60A3}\x{60A6}' . +'\x{60A7}\x{60A9}\x{60AA}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B8}' . +'\x{60BC}\x{60BD}\x{60C5}\x{60C6}\x{60C7}\x{60D1}\x{60D3}\x{60D8}\x{60DA}' . +'\x{60DC}\x{60DF}\x{60E0}\x{60E1}\x{60E3}\x{60E7}\x{60E8}\x{60F0}\x{60F1}' . +'\x{60F3}\x{60F4}\x{60F6}\x{60F7}\x{60F9}\x{60FA}\x{60FB}\x{6100}\x{6101}' . +'\x{6103}\x{6106}\x{6108}\x{6109}\x{610D}\x{610E}\x{610F}\x{6115}\x{611A}' . +'\x{611B}\x{611F}\x{6121}\x{6127}\x{6128}\x{612C}\x{6134}\x{613C}\x{613D}' . +'\x{613E}\x{613F}\x{6142}\x{6144}\x{6147}\x{6148}\x{614A}\x{614B}\x{614C}' . +'\x{614D}\x{614E}\x{6153}\x{6155}\x{6158}\x{6159}\x{615A}\x{615D}\x{615F}' . +'\x{6162}\x{6163}\x{6165}\x{6167}\x{6168}\x{616B}\x{616E}\x{616F}\x{6170}' . +'\x{6171}\x{6173}\x{6174}\x{6175}\x{6176}\x{6177}\x{617E}\x{6182}\x{6187}' . +'\x{618A}\x{618E}\x{6190}\x{6191}\x{6194}\x{6196}\x{6199}\x{619A}\x{61A4}' . +'\x{61A7}\x{61A9}\x{61AB}\x{61AC}\x{61AE}\x{61B2}\x{61B6}\x{61BA}\x{61BE}' . +'\x{61C3}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' . +'\x{61D0}\x{61E3}\x{61E6}\x{61F2}\x{61F4}\x{61F6}\x{61F7}\x{61F8}\x{61FA}' . +'\x{61FC}\x{61FD}\x{61FE}\x{61FF}\x{6200}\x{6208}\x{6209}\x{620A}\x{620C}' . +'\x{620D}\x{620E}\x{6210}\x{6211}\x{6212}\x{6214}\x{6216}\x{621A}\x{621B}' . +'\x{621D}\x{621E}\x{621F}\x{6221}\x{6226}\x{622A}\x{622E}\x{622F}\x{6230}' . +'\x{6232}\x{6233}\x{6234}\x{6238}\x{623B}\x{623F}\x{6240}\x{6241}\x{6247}' . +'\x{6248}\x{6249}\x{624B}\x{624D}\x{624E}\x{6253}\x{6255}\x{6258}\x{625B}' . +'\x{625E}\x{6260}\x{6263}\x{6268}\x{626E}\x{6271}\x{6276}\x{6279}\x{627C}' . +'\x{627E}\x{627F}\x{6280}\x{6282}\x{6283}\x{6284}\x{6289}\x{628A}\x{6291}' . +'\x{6292}\x{6293}\x{6294}\x{6295}\x{6296}\x{6297}\x{6298}\x{629B}\x{629C}' . +'\x{629E}\x{62AB}\x{62AC}\x{62B1}\x{62B5}\x{62B9}\x{62BB}\x{62BC}\x{62BD}' . +'\x{62C2}\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CC}\x{62CD}' . +'\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D7}\x{62D8}\x{62D9}' . +'\x{62DB}\x{62DC}\x{62DD}\x{62E0}\x{62E1}\x{62EC}\x{62ED}\x{62EE}\x{62EF}' . +'\x{62F1}\x{62F3}\x{62F5}\x{62F6}\x{62F7}\x{62FE}\x{62FF}\x{6301}\x{6302}' . +'\x{6307}\x{6308}\x{6309}\x{630C}\x{6311}\x{6319}\x{631F}\x{6327}\x{6328}' . +'\x{632B}\x{632F}\x{633A}\x{633D}\x{633E}\x{633F}\x{6349}\x{634C}\x{634D}' . +'\x{634F}\x{6350}\x{6355}\x{6357}\x{635C}\x{6367}\x{6368}\x{6369}\x{636B}' . +'\x{636E}\x{6372}\x{6376}\x{6377}\x{637A}\x{637B}\x{6380}\x{6383}\x{6388}' . +'\x{6389}\x{638C}\x{638E}\x{638F}\x{6392}\x{6396}\x{6398}\x{639B}\x{639F}' . +'\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A5}\x{63A7}\x{63A8}\x{63A9}\x{63AA}' . +'\x{63AB}\x{63AC}\x{63B2}\x{63B4}\x{63B5}\x{63BB}\x{63BE}\x{63C0}\x{63C3}' . +'\x{63C4}\x{63C6}\x{63C9}\x{63CF}\x{63D0}\x{63D2}\x{63D6}\x{63DA}\x{63DB}' . +'\x{63E1}\x{63E3}\x{63E9}\x{63EE}\x{63F4}\x{63F6}\x{63FA}\x{6406}\x{640D}' . +'\x{640F}\x{6413}\x{6416}\x{6417}\x{641C}\x{6426}\x{6428}\x{642C}\x{642D}' . +'\x{6434}\x{6436}\x{643A}\x{643E}\x{6442}\x{644E}\x{6458}\x{6467}\x{6469}' . +'\x{646F}\x{6476}\x{6478}\x{647A}\x{6483}\x{6488}\x{6492}\x{6493}\x{6495}' . +'\x{649A}\x{649E}\x{64A4}\x{64A5}\x{64A9}\x{64AB}\x{64AD}\x{64AE}\x{64B0}' . +'\x{64B2}\x{64B9}\x{64BB}\x{64BC}\x{64C1}\x{64C2}\x{64C5}\x{64C7}\x{64CD}' . +'\x{64D2}\x{64D4}\x{64D8}\x{64DA}\x{64E0}\x{64E1}\x{64E2}\x{64E3}\x{64E6}' . +'\x{64E7}\x{64EC}\x{64EF}\x{64F1}\x{64F2}\x{64F4}\x{64F6}\x{64FA}\x{64FD}' . +'\x{64FE}\x{6500}\x{6505}\x{6518}\x{651C}\x{651D}\x{6523}\x{6524}\x{652A}' . +'\x{652B}\x{652C}\x{652F}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}' . +'\x{653B}\x{653E}\x{653F}\x{6545}\x{6548}\x{654D}\x{654F}\x{6551}\x{6555}' . +'\x{6556}\x{6557}\x{6558}\x{6559}\x{655D}\x{655E}\x{6562}\x{6563}\x{6566}' . +'\x{656C}\x{6570}\x{6572}\x{6574}\x{6575}\x{6577}\x{6578}\x{6582}\x{6583}' . +'\x{6587}\x{6588}\x{6589}\x{658C}\x{658E}\x{6590}\x{6591}\x{6597}\x{6599}' . +'\x{659B}\x{659C}\x{659F}\x{65A1}\x{65A4}\x{65A5}\x{65A7}\x{65AB}\x{65AC}' . +'\x{65AD}\x{65AF}\x{65B0}\x{65B7}\x{65B9}\x{65BC}\x{65BD}\x{65C1}\x{65C3}' . +'\x{65C4}\x{65C5}\x{65C6}\x{65CB}\x{65CC}\x{65CF}\x{65D2}\x{65D7}\x{65D9}' . +'\x{65DB}\x{65E0}\x{65E1}\x{65E2}\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}' . +'\x{65EC}\x{65ED}\x{65F1}\x{65FA}\x{65FB}\x{6602}\x{6603}\x{6606}\x{6607}' . +'\x{660A}\x{660C}\x{660E}\x{660F}\x{6613}\x{6614}\x{661C}\x{661F}\x{6620}' . +'\x{6625}\x{6627}\x{6628}\x{662D}\x{662F}\x{6634}\x{6635}\x{6636}\x{663C}' . +'\x{663F}\x{6641}\x{6642}\x{6643}\x{6644}\x{6649}\x{664B}\x{664F}\x{6652}' . +'\x{665D}\x{665E}\x{665F}\x{6662}\x{6664}\x{6666}\x{6667}\x{6668}\x{6669}' . +'\x{666E}\x{666F}\x{6670}\x{6674}\x{6676}\x{667A}\x{6681}\x{6683}\x{6684}' . +'\x{6687}\x{6688}\x{6689}\x{668E}\x{6691}\x{6696}\x{6697}\x{6698}\x{669D}' . +'\x{66A2}\x{66A6}\x{66AB}\x{66AE}\x{66B4}\x{66B8}\x{66B9}\x{66BC}\x{66BE}' . +'\x{66C1}\x{66C4}\x{66C7}\x{66C9}\x{66D6}\x{66D9}\x{66DA}\x{66DC}\x{66DD}' . +'\x{66E0}\x{66E6}\x{66E9}\x{66F0}\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F7}' . +'\x{66F8}\x{66F9}\x{66FC}\x{66FD}\x{66FE}\x{66FF}\x{6700}\x{6703}\x{6708}' . +'\x{6709}\x{670B}\x{670D}\x{670F}\x{6714}\x{6715}\x{6716}\x{6717}\x{671B}' . +'\x{671D}\x{671E}\x{671F}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}' . +'\x{672D}\x{672E}\x{6731}\x{6734}\x{6736}\x{6737}\x{6738}\x{673A}\x{673D}' . +'\x{673F}\x{6741}\x{6746}\x{6749}\x{674E}\x{674F}\x{6750}\x{6751}\x{6753}' . +'\x{6756}\x{6759}\x{675C}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' . +'\x{6764}\x{6765}\x{676A}\x{676D}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}' . +'\x{6775}\x{6777}\x{677C}\x{677E}\x{677F}\x{6785}\x{6787}\x{6789}\x{678B}' . +'\x{678C}\x{6790}\x{6795}\x{6797}\x{679A}\x{679C}\x{679D}\x{67A0}\x{67A1}' . +'\x{67A2}\x{67A6}\x{67A9}\x{67AF}\x{67B3}\x{67B4}\x{67B6}\x{67B7}\x{67B8}' . +'\x{67B9}\x{67C1}\x{67C4}\x{67C6}\x{67CA}\x{67CE}\x{67CF}\x{67D0}\x{67D1}' . +'\x{67D3}\x{67D4}\x{67D8}\x{67DA}\x{67DD}\x{67DE}\x{67E2}\x{67E4}\x{67E7}' . +'\x{67E9}\x{67EC}\x{67EE}\x{67EF}\x{67F1}\x{67F3}\x{67F4}\x{67F5}\x{67FB}' . +'\x{67FE}\x{67FF}\x{6802}\x{6803}\x{6804}\x{6813}\x{6816}\x{6817}\x{681E}' . +'\x{6821}\x{6822}\x{6829}\x{682A}\x{682B}\x{6832}\x{6834}\x{6838}\x{6839}' . +'\x{683C}\x{683D}\x{6840}\x{6841}\x{6842}\x{6843}\x{6846}\x{6848}\x{684D}' . +'\x{684E}\x{6850}\x{6851}\x{6853}\x{6854}\x{6859}\x{685C}\x{685D}\x{685F}' . +'\x{6863}\x{6867}\x{6874}\x{6876}\x{6877}\x{687E}\x{687F}\x{6881}\x{6883}' . +'\x{6885}\x{688D}\x{688F}\x{6893}\x{6894}\x{6897}\x{689B}\x{689D}\x{689F}' . +'\x{68A0}\x{68A2}\x{68A6}\x{68A7}\x{68A8}\x{68AD}\x{68AF}\x{68B0}\x{68B1}' . +'\x{68B3}\x{68B5}\x{68B6}\x{68B9}\x{68BA}\x{68BC}\x{68C4}\x{68C6}\x{68C9}' . +'\x{68CA}\x{68CB}\x{68CD}\x{68D2}\x{68D4}\x{68D5}\x{68D7}\x{68D8}\x{68DA}' . +'\x{68DF}\x{68E0}\x{68E1}\x{68E3}\x{68E7}\x{68EE}\x{68EF}\x{68F2}\x{68F9}' . +'\x{68FA}\x{6900}\x{6901}\x{6904}\x{6905}\x{6908}\x{690B}\x{690C}\x{690D}' . +'\x{690E}\x{690F}\x{6912}\x{6919}\x{691A}\x{691B}\x{691C}\x{6921}\x{6922}' . +'\x{6923}\x{6925}\x{6926}\x{6928}\x{692A}\x{6930}\x{6934}\x{6936}\x{6939}' . +'\x{693D}\x{693F}\x{694A}\x{6953}\x{6954}\x{6955}\x{6959}\x{695A}\x{695C}' . +'\x{695D}\x{695E}\x{6960}\x{6961}\x{6962}\x{696A}\x{696B}\x{696D}\x{696E}' . +'\x{696F}\x{6973}\x{6974}\x{6975}\x{6977}\x{6978}\x{6979}\x{697C}\x{697D}' . +'\x{697E}\x{6981}\x{6982}\x{698A}\x{698E}\x{6991}\x{6994}\x{6995}\x{699B}' . +'\x{699C}\x{69A0}\x{69A7}\x{69AE}\x{69B1}\x{69B2}\x{69B4}\x{69BB}\x{69BE}' . +'\x{69BF}\x{69C1}\x{69C3}\x{69C7}\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}' . +'\x{69D0}\x{69D3}\x{69D8}\x{69D9}\x{69DD}\x{69DE}\x{69E7}\x{69E8}\x{69EB}' . +'\x{69ED}\x{69F2}\x{69F9}\x{69FB}\x{69FD}\x{69FF}\x{6A02}\x{6A05}\x{6A0A}' . +'\x{6A0B}\x{6A0C}\x{6A12}\x{6A13}\x{6A14}\x{6A17}\x{6A19}\x{6A1B}\x{6A1E}' . +'\x{6A1F}\x{6A21}\x{6A22}\x{6A23}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2E}\x{6A35}' . +'\x{6A36}\x{6A38}\x{6A39}\x{6A3A}\x{6A3D}\x{6A44}\x{6A47}\x{6A48}\x{6A4B}' . +'\x{6A58}\x{6A59}\x{6A5F}\x{6A61}\x{6A62}\x{6A66}\x{6A72}\x{6A78}\x{6A7F}' . +'\x{6A80}\x{6A84}\x{6A8D}\x{6A8E}\x{6A90}\x{6A97}\x{6A9C}\x{6AA0}\x{6AA2}' . +'\x{6AA3}\x{6AAA}\x{6AAC}\x{6AAE}\x{6AB3}\x{6AB8}\x{6ABB}\x{6AC1}\x{6AC2}' . +'\x{6AC3}\x{6AD1}\x{6AD3}\x{6ADA}\x{6ADB}\x{6ADE}\x{6ADF}\x{6AE8}\x{6AEA}' . +'\x{6AFA}\x{6AFB}\x{6B04}\x{6B05}\x{6B0A}\x{6B12}\x{6B16}\x{6B1D}\x{6B1F}' . +'\x{6B20}\x{6B21}\x{6B23}\x{6B27}\x{6B32}\x{6B37}\x{6B38}\x{6B39}\x{6B3A}' . +'\x{6B3D}\x{6B3E}\x{6B43}\x{6B47}\x{6B49}\x{6B4C}\x{6B4E}\x{6B50}\x{6B53}' . +'\x{6B54}\x{6B59}\x{6B5B}\x{6B5F}\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B66}' . +'\x{6B69}\x{6B6A}\x{6B6F}\x{6B73}\x{6B74}\x{6B78}\x{6B79}\x{6B7B}\x{6B7F}' . +'\x{6B80}\x{6B83}\x{6B84}\x{6B86}\x{6B89}\x{6B8A}\x{6B8B}\x{6B8D}\x{6B95}' . +'\x{6B96}\x{6B98}\x{6B9E}\x{6BA4}\x{6BAA}\x{6BAB}\x{6BAF}\x{6BB1}\x{6BB2}' . +'\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB7}\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBF}\x{6BC0}' . +'\x{6BC5}\x{6BC6}\x{6BCB}\x{6BCD}\x{6BCE}\x{6BD2}\x{6BD3}\x{6BD4}\x{6BD8}' . +'\x{6BDB}\x{6BDF}\x{6BEB}\x{6BEC}\x{6BEF}\x{6BF3}\x{6C08}\x{6C0F}\x{6C11}' . +'\x{6C13}\x{6C14}\x{6C17}\x{6C1B}\x{6C23}\x{6C24}\x{6C34}\x{6C37}\x{6C38}' . +'\x{6C3E}\x{6C40}\x{6C41}\x{6C42}\x{6C4E}\x{6C50}\x{6C55}\x{6C57}\x{6C5A}' . +'\x{6C5D}\x{6C5E}\x{6C5F}\x{6C60}\x{6C62}\x{6C68}\x{6C6A}\x{6C70}\x{6C72}' . +'\x{6C73}\x{6C7A}\x{6C7D}\x{6C7E}\x{6C81}\x{6C82}\x{6C83}\x{6C88}\x{6C8C}' . +'\x{6C8D}\x{6C90}\x{6C92}\x{6C93}\x{6C96}\x{6C99}\x{6C9A}\x{6C9B}\x{6CA1}' . +'\x{6CA2}\x{6CAB}\x{6CAE}\x{6CB1}\x{6CB3}\x{6CB8}\x{6CB9}\x{6CBA}\x{6CBB}' . +'\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC1}\x{6CC4}\x{6CC5}\x{6CC9}\x{6CCA}' . +'\x{6CCC}\x{6CD3}\x{6CD5}\x{6CD7}\x{6CD9}\x{6CDB}\x{6CDD}\x{6CE1}\x{6CE2}' . +'\x{6CE3}\x{6CE5}\x{6CE8}\x{6CEA}\x{6CEF}\x{6CF0}\x{6CF1}\x{6CF3}\x{6D0B}' . +'\x{6D0C}\x{6D12}\x{6D17}\x{6D19}\x{6D1B}\x{6D1E}\x{6D1F}\x{6D25}\x{6D29}' . +'\x{6D2A}\x{6D2B}\x{6D32}\x{6D33}\x{6D35}\x{6D36}\x{6D38}\x{6D3B}\x{6D3D}' . +'\x{6D3E}\x{6D41}\x{6D44}\x{6D45}\x{6D59}\x{6D5A}\x{6D5C}\x{6D63}\x{6D64}' . +'\x{6D66}\x{6D69}\x{6D6A}\x{6D6C}\x{6D6E}\x{6D74}\x{6D77}\x{6D78}\x{6D79}' . +'\x{6D85}\x{6D88}\x{6D8C}\x{6D8E}\x{6D93}\x{6D95}\x{6D99}\x{6D9B}\x{6D9C}' . +'\x{6DAF}\x{6DB2}\x{6DB5}\x{6DB8}\x{6DBC}\x{6DC0}\x{6DC5}\x{6DC6}\x{6DC7}' . +'\x{6DCB}\x{6DCC}\x{6DD1}\x{6DD2}\x{6DD5}\x{6DD8}\x{6DD9}\x{6DDE}\x{6DE1}' . +'\x{6DE4}\x{6DE6}\x{6DE8}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DEE}\x{6DF1}\x{6DF3}' . +'\x{6DF5}\x{6DF7}\x{6DF9}\x{6DFA}\x{6DFB}\x{6E05}\x{6E07}\x{6E08}\x{6E09}' . +'\x{6E0A}\x{6E0B}\x{6E13}\x{6E15}\x{6E19}\x{6E1A}\x{6E1B}\x{6E1D}\x{6E1F}' . +'\x{6E20}\x{6E21}\x{6E23}\x{6E24}\x{6E25}\x{6E26}\x{6E29}\x{6E2B}\x{6E2C}' . +'\x{6E2D}\x{6E2E}\x{6E2F}\x{6E38}\x{6E3A}\x{6E3E}\x{6E43}\x{6E4A}\x{6E4D}' . +'\x{6E4E}\x{6E56}\x{6E58}\x{6E5B}\x{6E5F}\x{6E67}\x{6E6B}\x{6E6E}\x{6E6F}' . +'\x{6E72}\x{6E76}\x{6E7E}\x{6E7F}\x{6E80}\x{6E82}\x{6E8C}\x{6E8F}\x{6E90}' . +'\x{6E96}\x{6E98}\x{6E9C}\x{6E9D}\x{6E9F}\x{6EA2}\x{6EA5}\x{6EAA}\x{6EAF}' . +'\x{6EB2}\x{6EB6}\x{6EB7}\x{6EBA}\x{6EBD}\x{6EC2}\x{6EC4}\x{6EC5}\x{6EC9}' . +'\x{6ECB}\x{6ECC}\x{6ED1}\x{6ED3}\x{6ED4}\x{6ED5}\x{6EDD}\x{6EDE}\x{6EEC}' . +'\x{6EEF}\x{6EF2}\x{6EF4}\x{6EF7}\x{6EF8}\x{6EFE}\x{6EFF}\x{6F01}\x{6F02}' . +'\x{6F06}\x{6F09}\x{6F0F}\x{6F11}\x{6F13}\x{6F14}\x{6F15}\x{6F20}\x{6F22}' . +'\x{6F23}\x{6F2B}\x{6F2C}\x{6F31}\x{6F32}\x{6F38}\x{6F3E}\x{6F3F}\x{6F41}' . +'\x{6F45}\x{6F54}\x{6F58}\x{6F5B}\x{6F5C}\x{6F5F}\x{6F64}\x{6F66}\x{6F6D}' . +'\x{6F6E}\x{6F6F}\x{6F70}\x{6F74}\x{6F78}\x{6F7A}\x{6F7C}\x{6F80}\x{6F81}' . +'\x{6F82}\x{6F84}\x{6F86}\x{6F8E}\x{6F91}\x{6F97}\x{6FA1}\x{6FA3}\x{6FA4}' . +'\x{6FAA}\x{6FB1}\x{6FB3}\x{6FB9}\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC6}' . +'\x{6FD4}\x{6FD5}\x{6FD8}\x{6FDB}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE4}\x{6FEB}' . +'\x{6FEC}\x{6FEE}\x{6FEF}\x{6FF1}\x{6FF3}\x{6FF6}\x{6FFA}\x{6FFE}\x{7001}' . +'\x{7009}\x{700B}\x{700F}\x{7011}\x{7015}\x{7018}\x{701A}\x{701B}\x{701D}' . +'\x{701E}\x{701F}\x{7026}\x{7027}\x{702C}\x{7030}\x{7032}\x{703E}\x{704C}' . +'\x{7051}\x{7058}\x{7063}\x{706B}\x{706F}\x{7070}\x{7078}\x{707C}\x{707D}' . +'\x{7089}\x{708A}\x{708E}\x{7092}\x{7099}\x{70AC}\x{70AD}\x{70AE}\x{70AF}' . +'\x{70B3}\x{70B8}\x{70B9}\x{70BA}\x{70C8}\x{70CB}\x{70CF}\x{70D9}\x{70DD}' . +'\x{70DF}\x{70F1}\x{70F9}\x{70FD}\x{7109}\x{7114}\x{7119}\x{711A}\x{711C}' . +'\x{7121}\x{7126}\x{7136}\x{713C}\x{7149}\x{714C}\x{714E}\x{7155}\x{7156}' . +'\x{7159}\x{7162}\x{7164}\x{7165}\x{7166}\x{7167}\x{7169}\x{716C}\x{716E}' . +'\x{717D}\x{7184}\x{7188}\x{718A}\x{718F}\x{7194}\x{7195}\x{7199}\x{719F}' . +'\x{71A8}\x{71AC}\x{71B1}\x{71B9}\x{71BE}\x{71C3}\x{71C8}\x{71C9}\x{71CE}' . +'\x{71D0}\x{71D2}\x{71D4}\x{71D5}\x{71D7}\x{71DF}\x{71E0}\x{71E5}\x{71E6}' . +'\x{71E7}\x{71EC}\x{71ED}\x{71EE}\x{71F5}\x{71F9}\x{71FB}\x{71FC}\x{71FF}' . +'\x{7206}\x{720D}\x{7210}\x{721B}\x{7228}\x{722A}\x{722C}\x{722D}\x{7230}' . +'\x{7232}\x{7235}\x{7236}\x{723A}\x{723B}\x{723C}\x{723D}\x{723E}\x{723F}' . +'\x{7240}\x{7246}\x{7247}\x{7248}\x{724B}\x{724C}\x{7252}\x{7258}\x{7259}' . +'\x{725B}\x{725D}\x{725F}\x{7261}\x{7262}\x{7267}\x{7269}\x{7272}\x{7274}' . +'\x{7279}\x{727D}\x{727E}\x{7280}\x{7281}\x{7282}\x{7287}\x{7292}\x{7296}' . +'\x{72A0}\x{72A2}\x{72A7}\x{72AC}\x{72AF}\x{72B2}\x{72B6}\x{72B9}\x{72C2}' . +'\x{72C3}\x{72C4}\x{72C6}\x{72CE}\x{72D0}\x{72D2}\x{72D7}\x{72D9}\x{72DB}' . +'\x{72E0}\x{72E1}\x{72E2}\x{72E9}\x{72EC}\x{72ED}\x{72F7}\x{72F8}\x{72F9}' . +'\x{72FC}\x{72FD}\x{730A}\x{7316}\x{7317}\x{731B}\x{731C}\x{731D}\x{731F}' . +'\x{7325}\x{7329}\x{732A}\x{732B}\x{732E}\x{732F}\x{7334}\x{7336}\x{7337}' . +'\x{733E}\x{733F}\x{7344}\x{7345}\x{734E}\x{734F}\x{7357}\x{7363}\x{7368}' . +'\x{736A}\x{7370}\x{7372}\x{7375}\x{7378}\x{737A}\x{737B}\x{7384}\x{7387}' . +'\x{7389}\x{738B}\x{7396}\x{73A9}\x{73B2}\x{73B3}\x{73BB}\x{73C0}\x{73C2}' . +'\x{73C8}\x{73CA}\x{73CD}\x{73CE}\x{73DE}\x{73E0}\x{73E5}\x{73EA}\x{73ED}' . +'\x{73EE}\x{73F1}\x{73F8}\x{73FE}\x{7403}\x{7405}\x{7406}\x{7409}\x{7422}' . +'\x{7425}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{743A}\x{743F}\x{7441}' . +'\x{7455}\x{7459}\x{745A}\x{745B}\x{745C}\x{745E}\x{745F}\x{7460}\x{7463}' . +'\x{7464}\x{7469}\x{746A}\x{746F}\x{7470}\x{7473}\x{7476}\x{747E}\x{7483}' . +'\x{748B}\x{749E}\x{74A2}\x{74A7}\x{74B0}\x{74BD}\x{74CA}\x{74CF}\x{74D4}' . +'\x{74DC}\x{74E0}\x{74E2}\x{74E3}\x{74E6}\x{74E7}\x{74E9}\x{74EE}\x{74F0}' . +'\x{74F1}\x{74F2}\x{74F6}\x{74F7}\x{74F8}\x{7503}\x{7504}\x{7505}\x{750C}' . +'\x{750D}\x{750E}\x{7511}\x{7513}\x{7515}\x{7518}\x{751A}\x{751C}\x{751E}' . +'\x{751F}\x{7523}\x{7525}\x{7526}\x{7528}\x{752B}\x{752C}\x{7530}\x{7531}' . +'\x{7532}\x{7533}\x{7537}\x{7538}\x{753A}\x{753B}\x{753C}\x{7544}\x{7546}' . +'\x{7549}\x{754A}\x{754B}\x{754C}\x{754D}\x{754F}\x{7551}\x{7554}\x{7559}' . +'\x{755A}\x{755B}\x{755C}\x{755D}\x{7560}\x{7562}\x{7564}\x{7565}\x{7566}' . +'\x{7567}\x{7569}\x{756A}\x{756B}\x{756D}\x{7570}\x{7573}\x{7574}\x{7576}' . +'\x{7577}\x{7578}\x{757F}\x{7582}\x{7586}\x{7587}\x{7589}\x{758A}\x{758B}' . +'\x{758E}\x{758F}\x{7591}\x{7594}\x{759A}\x{759D}\x{75A3}\x{75A5}\x{75AB}' . +'\x{75B1}\x{75B2}\x{75B3}\x{75B5}\x{75B8}\x{75B9}\x{75BC}\x{75BD}\x{75BE}' . +'\x{75C2}\x{75C3}\x{75C5}\x{75C7}\x{75CA}\x{75CD}\x{75D2}\x{75D4}\x{75D5}' . +'\x{75D8}\x{75D9}\x{75DB}\x{75DE}\x{75E2}\x{75E3}\x{75E9}\x{75F0}\x{75F2}' . +'\x{75F3}\x{75F4}\x{75FA}\x{75FC}\x{75FE}\x{75FF}\x{7601}\x{7609}\x{760B}' . +'\x{760D}\x{761F}\x{7620}\x{7621}\x{7622}\x{7624}\x{7627}\x{7630}\x{7634}' . +'\x{763B}\x{7642}\x{7646}\x{7647}\x{7648}\x{764C}\x{7652}\x{7656}\x{7658}' . +'\x{765C}\x{7661}\x{7662}\x{7667}\x{7668}\x{7669}\x{766A}\x{766C}\x{7670}' . +'\x{7672}\x{7676}\x{7678}\x{767A}\x{767B}\x{767C}\x{767D}\x{767E}\x{7680}' . +'\x{7683}\x{7684}\x{7686}\x{7687}\x{7688}\x{768B}\x{768E}\x{7690}\x{7693}' . +'\x{7696}\x{7699}\x{769A}\x{76AE}\x{76B0}\x{76B4}\x{76B7}\x{76B8}\x{76B9}' . +'\x{76BA}\x{76BF}\x{76C2}\x{76C3}\x{76C6}\x{76C8}\x{76CA}\x{76CD}\x{76D2}' . +'\x{76D6}\x{76D7}\x{76DB}\x{76DC}\x{76DE}\x{76DF}\x{76E1}\x{76E3}\x{76E4}' . +'\x{76E5}\x{76E7}\x{76EA}\x{76EE}\x{76F2}\x{76F4}\x{76F8}\x{76FB}\x{76FE}' . +'\x{7701}\x{7704}\x{7707}\x{7708}\x{7709}\x{770B}\x{770C}\x{771B}\x{771E}' . +'\x{771F}\x{7720}\x{7724}\x{7725}\x{7726}\x{7729}\x{7737}\x{7738}\x{773A}' . +'\x{773C}\x{7740}\x{7747}\x{775A}\x{775B}\x{7761}\x{7763}\x{7765}\x{7766}' . +'\x{7768}\x{776B}\x{7779}\x{777E}\x{777F}\x{778B}\x{778E}\x{7791}\x{779E}' . +'\x{77A0}\x{77A5}\x{77AC}\x{77AD}\x{77B0}\x{77B3}\x{77B6}\x{77B9}\x{77BB}' . +'\x{77BC}\x{77BD}\x{77BF}\x{77C7}\x{77CD}\x{77D7}\x{77DA}\x{77DB}\x{77DC}' . +'\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E9}\x{77ED}\x{77EE}\x{77EF}\x{77F3}' . +'\x{77FC}\x{7802}\x{780C}\x{7812}\x{7814}\x{7815}\x{7820}\x{7825}\x{7826}' . +'\x{7827}\x{7832}\x{7834}\x{783A}\x{783F}\x{7845}\x{785D}\x{786B}\x{786C}' . +'\x{786F}\x{7872}\x{7874}\x{787C}\x{7881}\x{7886}\x{7887}\x{788C}\x{788D}' . +'\x{788E}\x{7891}\x{7893}\x{7895}\x{7897}\x{789A}\x{78A3}\x{78A7}\x{78A9}' . +'\x{78AA}\x{78AF}\x{78B5}\x{78BA}\x{78BC}\x{78BE}\x{78C1}\x{78C5}\x{78C6}' . +'\x{78CA}\x{78CB}\x{78D0}\x{78D1}\x{78D4}\x{78DA}\x{78E7}\x{78E8}\x{78EC}' . +'\x{78EF}\x{78F4}\x{78FD}\x{7901}\x{7907}\x{790E}\x{7911}\x{7912}\x{7919}' . +'\x{7926}\x{792A}\x{792B}\x{792C}\x{793A}\x{793C}\x{793E}\x{7940}\x{7941}' . +'\x{7947}\x{7948}\x{7949}\x{7950}\x{7953}\x{7955}\x{7956}\x{7957}\x{795A}' . +'\x{795D}\x{795E}\x{795F}\x{7960}\x{7962}\x{7965}\x{7968}\x{796D}\x{7977}' . +'\x{797A}\x{797F}\x{7980}\x{7981}\x{7984}\x{7985}\x{798A}\x{798D}\x{798E}' . +'\x{798F}\x{799D}\x{79A6}\x{79A7}\x{79AA}\x{79AE}\x{79B0}\x{79B3}\x{79B9}' . +'\x{79BA}\x{79BD}\x{79BE}\x{79BF}\x{79C0}\x{79C1}\x{79C9}\x{79CB}\x{79D1}' . +'\x{79D2}\x{79D5}\x{79D8}\x{79DF}\x{79E1}\x{79E3}\x{79E4}\x{79E6}\x{79E7}' . +'\x{79E9}\x{79EC}\x{79F0}\x{79FB}\x{7A00}\x{7A08}\x{7A0B}\x{7A0D}\x{7A0E}' . +'\x{7A14}\x{7A17}\x{7A18}\x{7A19}\x{7A1A}\x{7A1C}\x{7A1F}\x{7A20}\x{7A2E}' . +'\x{7A31}\x{7A32}\x{7A37}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' . +'\x{7A42}\x{7A43}\x{7A46}\x{7A49}\x{7A4D}\x{7A4E}\x{7A4F}\x{7A50}\x{7A57}' . +'\x{7A61}\x{7A62}\x{7A63}\x{7A69}\x{7A6B}\x{7A70}\x{7A74}\x{7A76}\x{7A79}' . +'\x{7A7A}\x{7A7D}\x{7A7F}\x{7A81}\x{7A83}\x{7A84}\x{7A88}\x{7A92}\x{7A93}' . +'\x{7A95}\x{7A96}\x{7A97}\x{7A98}\x{7A9F}\x{7AA9}\x{7AAA}\x{7AAE}\x{7AAF}' . +'\x{7AB0}\x{7AB6}\x{7ABA}\x{7ABF}\x{7AC3}\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}' . +'\x{7ACA}\x{7ACB}\x{7ACD}\x{7ACF}\x{7AD2}\x{7AD3}\x{7AD5}\x{7AD9}\x{7ADA}' . +'\x{7ADC}\x{7ADD}\x{7ADF}\x{7AE0}\x{7AE1}\x{7AE2}\x{7AE3}\x{7AE5}\x{7AE6}' . +'\x{7AEA}\x{7AED}\x{7AEF}\x{7AF0}\x{7AF6}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFF}' . +'\x{7B02}\x{7B04}\x{7B06}\x{7B08}\x{7B0A}\x{7B0B}\x{7B0F}\x{7B11}\x{7B18}' . +'\x{7B19}\x{7B1B}\x{7B1E}\x{7B20}\x{7B25}\x{7B26}\x{7B28}\x{7B2C}\x{7B33}' . +'\x{7B35}\x{7B36}\x{7B39}\x{7B45}\x{7B46}\x{7B48}\x{7B49}\x{7B4B}\x{7B4C}' . +'\x{7B4D}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B56}\x{7B5D}\x{7B65}' . +'\x{7B67}\x{7B6C}\x{7B6E}\x{7B70}\x{7B71}\x{7B74}\x{7B75}\x{7B7A}\x{7B86}' . +'\x{7B87}\x{7B8B}\x{7B8D}\x{7B8F}\x{7B92}\x{7B94}\x{7B95}\x{7B97}\x{7B98}' . +'\x{7B99}\x{7B9A}\x{7B9C}\x{7B9D}\x{7B9F}\x{7BA1}\x{7BAA}\x{7BAD}\x{7BB1}' . +'\x{7BB4}\x{7BB8}\x{7BC0}\x{7BC1}\x{7BC4}\x{7BC6}\x{7BC7}\x{7BC9}\x{7BCB}' . +'\x{7BCC}\x{7BCF}\x{7BDD}\x{7BE0}\x{7BE4}\x{7BE5}\x{7BE6}\x{7BE9}\x{7BED}' . +'\x{7BF3}\x{7BF6}\x{7BF7}\x{7C00}\x{7C07}\x{7C0D}\x{7C11}\x{7C12}\x{7C13}' . +'\x{7C14}\x{7C17}\x{7C1F}\x{7C21}\x{7C23}\x{7C27}\x{7C2A}\x{7C2B}\x{7C37}' . +'\x{7C38}\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C43}\x{7C4C}\x{7C4D}\x{7C4F}' . +'\x{7C50}\x{7C54}\x{7C56}\x{7C58}\x{7C5F}\x{7C60}\x{7C64}\x{7C65}\x{7C6C}' . +'\x{7C73}\x{7C75}\x{7C7E}\x{7C81}\x{7C82}\x{7C83}\x{7C89}\x{7C8B}\x{7C8D}' . +'\x{7C90}\x{7C92}\x{7C95}\x{7C97}\x{7C98}\x{7C9B}\x{7C9F}\x{7CA1}\x{7CA2}' . +'\x{7CA4}\x{7CA5}\x{7CA7}\x{7CA8}\x{7CAB}\x{7CAD}\x{7CAE}\x{7CB1}\x{7CB2}' . +'\x{7CB3}\x{7CB9}\x{7CBD}\x{7CBE}\x{7CC0}\x{7CC2}\x{7CC5}\x{7CCA}\x{7CCE}' . +'\x{7CD2}\x{7CD6}\x{7CD8}\x{7CDC}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE7}' . +'\x{7CEF}\x{7CF2}\x{7CF4}\x{7CF6}\x{7CF8}\x{7CFA}\x{7CFB}\x{7CFE}\x{7D00}' . +'\x{7D02}\x{7D04}\x{7D05}\x{7D06}\x{7D0A}\x{7D0B}\x{7D0D}\x{7D10}\x{7D14}' . +'\x{7D15}\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D20}\x{7D21}' . +'\x{7D22}\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D32}\x{7D33}\x{7D35}' . +'\x{7D39}\x{7D3A}\x{7D3F}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}\x{7D4B}' . +'\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D56}\x{7D5B}\x{7D5E}\x{7D61}\x{7D62}' . +'\x{7D63}\x{7D66}\x{7D68}\x{7D6E}\x{7D71}\x{7D72}\x{7D73}\x{7D75}\x{7D76}' . +'\x{7D79}\x{7D7D}\x{7D89}\x{7D8F}\x{7D93}\x{7D99}\x{7D9A}\x{7D9B}\x{7D9C}' . +'\x{7D9F}\x{7DA2}\x{7DA3}\x{7DAB}\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}' . +'\x{7DB1}\x{7DB2}\x{7DB4}\x{7DB5}\x{7DB8}\x{7DBA}\x{7DBB}\x{7DBD}\x{7DBE}' . +'\x{7DBF}\x{7DC7}\x{7DCA}\x{7DCB}\x{7DCF}\x{7DD1}\x{7DD2}\x{7DD5}\x{7DD8}' . +'\x{7DDA}\x{7DDC}\x{7DDD}\x{7DDE}\x{7DE0}\x{7DE1}\x{7DE4}\x{7DE8}\x{7DE9}' . +'\x{7DEC}\x{7DEF}\x{7DF2}\x{7DF4}\x{7DFB}\x{7E01}\x{7E04}\x{7E05}\x{7E09}' . +'\x{7E0A}\x{7E0B}\x{7E12}\x{7E1B}\x{7E1E}\x{7E1F}\x{7E21}\x{7E22}\x{7E23}' . +'\x{7E26}\x{7E2B}\x{7E2E}\x{7E31}\x{7E32}\x{7E35}\x{7E37}\x{7E39}\x{7E3A}' . +'\x{7E3B}\x{7E3D}\x{7E3E}\x{7E41}\x{7E43}\x{7E46}\x{7E4A}\x{7E4B}\x{7E4D}' . +'\x{7E54}\x{7E55}\x{7E56}\x{7E59}\x{7E5A}\x{7E5D}\x{7E5E}\x{7E66}\x{7E67}' . +'\x{7E69}\x{7E6A}\x{7E6D}\x{7E70}\x{7E79}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7F}' . +'\x{7E82}\x{7E83}\x{7E88}\x{7E89}\x{7E8C}\x{7E8E}\x{7E8F}\x{7E90}\x{7E92}' . +'\x{7E93}\x{7E94}\x{7E96}\x{7E9B}\x{7E9C}\x{7F36}\x{7F38}\x{7F3A}\x{7F45}' . +'\x{7F4C}\x{7F4D}\x{7F4E}\x{7F50}\x{7F51}\x{7F54}\x{7F55}\x{7F58}\x{7F5F}' . +'\x{7F60}\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6E}\x{7F70}\x{7F72}' . +'\x{7F75}\x{7F77}\x{7F78}\x{7F79}\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}' . +'\x{7F88}\x{7F8A}\x{7F8C}\x{7F8E}\x{7F94}\x{7F9A}\x{7F9D}\x{7F9E}\x{7FA3}' . +'\x{7FA4}\x{7FA8}\x{7FA9}\x{7FAE}\x{7FAF}\x{7FB2}\x{7FB6}\x{7FB8}\x{7FB9}' . +'\x{7FBD}\x{7FC1}\x{7FC5}\x{7FC6}\x{7FCA}\x{7FCC}\x{7FD2}\x{7FD4}\x{7FD5}' . +'\x{7FE0}\x{7FE1}\x{7FE6}\x{7FE9}\x{7FEB}\x{7FF0}\x{7FF3}\x{7FF9}\x{7FFB}' . +'\x{7FFC}\x{8000}\x{8001}\x{8003}\x{8004}\x{8005}\x{8006}\x{800B}\x{800C}' . +'\x{8010}\x{8012}\x{8015}\x{8017}\x{8018}\x{8019}\x{801C}\x{8021}\x{8028}' . +'\x{8033}\x{8036}\x{803B}\x{803D}\x{803F}\x{8046}\x{804A}\x{8052}\x{8056}' . +'\x{8058}\x{805A}\x{805E}\x{805F}\x{8061}\x{8062}\x{8068}\x{806F}\x{8070}' . +'\x{8072}\x{8073}\x{8074}\x{8076}\x{8077}\x{8079}\x{807D}\x{807E}\x{807F}' . +'\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808B}\x{808C}\x{8093}\x{8096}' . +'\x{8098}\x{809A}\x{809B}\x{809D}\x{80A1}\x{80A2}\x{80A5}\x{80A9}\x{80AA}' . +'\x{80AC}\x{80AD}\x{80AF}\x{80B1}\x{80B2}\x{80B4}\x{80BA}\x{80C3}\x{80C4}' . +'\x{80C6}\x{80CC}\x{80CE}\x{80D6}\x{80D9}\x{80DA}\x{80DB}\x{80DD}\x{80DE}' . +'\x{80E1}\x{80E4}\x{80E5}\x{80EF}\x{80F1}\x{80F4}\x{80F8}\x{80FC}\x{80FD}' . +'\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{811A}\x{811B}' . +'\x{8123}\x{8129}\x{812F}\x{8131}\x{8133}\x{8139}\x{813E}\x{8146}\x{814B}' . +'\x{814E}\x{8150}\x{8151}\x{8153}\x{8154}\x{8155}\x{815F}\x{8165}\x{8166}' . +'\x{816B}\x{816E}\x{8170}\x{8171}\x{8174}\x{8178}\x{8179}\x{817A}\x{817F}' . +'\x{8180}\x{8182}\x{8183}\x{8188}\x{818A}\x{818F}\x{8193}\x{8195}\x{819A}' . +'\x{819C}\x{819D}\x{81A0}\x{81A3}\x{81A4}\x{81A8}\x{81A9}\x{81B0}\x{81B3}' . +'\x{81B5}\x{81B8}\x{81BA}\x{81BD}\x{81BE}\x{81BF}\x{81C0}\x{81C2}\x{81C6}' . +'\x{81C8}\x{81C9}\x{81CD}\x{81D1}\x{81D3}\x{81D8}\x{81D9}\x{81DA}\x{81DF}' . +'\x{81E0}\x{81E3}\x{81E5}\x{81E7}\x{81E8}\x{81EA}\x{81ED}\x{81F3}\x{81F4}' . +'\x{81FA}\x{81FB}\x{81FC}\x{81FE}\x{8201}\x{8202}\x{8205}\x{8207}\x{8208}' . +'\x{8209}\x{820A}\x{820C}\x{820D}\x{820E}\x{8210}\x{8212}\x{8216}\x{8217}' . +'\x{8218}\x{821B}\x{821C}\x{821E}\x{821F}\x{8229}\x{822A}\x{822B}\x{822C}' . +'\x{822E}\x{8233}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{8240}\x{8247}' . +'\x{8258}\x{8259}\x{825A}\x{825D}\x{825F}\x{8262}\x{8264}\x{8266}\x{8268}' . +'\x{826A}\x{826B}\x{826E}\x{826F}\x{8271}\x{8272}\x{8276}\x{8277}\x{8278}' . +'\x{827E}\x{828B}\x{828D}\x{8292}\x{8299}\x{829D}\x{829F}\x{82A5}\x{82A6}' . +'\x{82AB}\x{82AC}\x{82AD}\x{82AF}\x{82B1}\x{82B3}\x{82B8}\x{82B9}\x{82BB}' . +'\x{82BD}\x{82C5}\x{82D1}\x{82D2}\x{82D3}\x{82D4}\x{82D7}\x{82D9}\x{82DB}' . +'\x{82DC}\x{82DE}\x{82DF}\x{82E1}\x{82E3}\x{82E5}\x{82E6}\x{82E7}\x{82EB}' . +'\x{82F1}\x{82F3}\x{82F4}\x{82F9}\x{82FA}\x{82FB}\x{8302}\x{8303}\x{8304}' . +'\x{8305}\x{8306}\x{8309}\x{830E}\x{8316}\x{8317}\x{8318}\x{831C}\x{8323}' . +'\x{8328}\x{832B}\x{832F}\x{8331}\x{8332}\x{8334}\x{8335}\x{8336}\x{8338}' . +'\x{8339}\x{8340}\x{8345}\x{8349}\x{834A}\x{834F}\x{8350}\x{8352}\x{8358}' . +'\x{8373}\x{8375}\x{8377}\x{837B}\x{837C}\x{8385}\x{8387}\x{8389}\x{838A}' . +'\x{838E}\x{8393}\x{8396}\x{839A}\x{839E}\x{839F}\x{83A0}\x{83A2}\x{83A8}' . +'\x{83AA}\x{83AB}\x{83B1}\x{83B5}\x{83BD}\x{83C1}\x{83C5}\x{83CA}\x{83CC}' . +'\x{83CE}\x{83D3}\x{83D6}\x{83D8}\x{83DC}\x{83DF}\x{83E0}\x{83E9}\x{83EB}' . +'\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F4}\x{83F7}\x{83FB}\x{83FD}\x{8403}' . +'\x{8404}\x{8407}\x{840B}\x{840C}\x{840D}\x{840E}\x{8413}\x{8420}\x{8422}' . +'\x{8429}\x{842A}\x{842C}\x{8431}\x{8435}\x{8438}\x{843C}\x{843D}\x{8446}' . +'\x{8449}\x{844E}\x{8457}\x{845B}\x{8461}\x{8462}\x{8463}\x{8466}\x{8469}' . +'\x{846B}\x{846C}\x{846D}\x{846E}\x{846F}\x{8471}\x{8475}\x{8477}\x{8479}' . +'\x{847A}\x{8482}\x{8484}\x{848B}\x{8490}\x{8494}\x{8499}\x{849C}\x{849F}' . +'\x{84A1}\x{84AD}\x{84B2}\x{84B8}\x{84B9}\x{84BB}\x{84BC}\x{84BF}\x{84C1}' . +'\x{84C4}\x{84C6}\x{84C9}\x{84CA}\x{84CB}\x{84CD}\x{84D0}\x{84D1}\x{84D6}' . +'\x{84D9}\x{84DA}\x{84EC}\x{84EE}\x{84F4}\x{84FC}\x{84FF}\x{8500}\x{8506}' . +'\x{8511}\x{8513}\x{8514}\x{8515}\x{8517}\x{8518}\x{851A}\x{851F}\x{8521}' . +'\x{8526}\x{852C}\x{852D}\x{8535}\x{853D}\x{8540}\x{8541}\x{8543}\x{8548}' . +'\x{8549}\x{854A}\x{854B}\x{854E}\x{8555}\x{8557}\x{8558}\x{855A}\x{8563}' . +'\x{8568}\x{8569}\x{856A}\x{856D}\x{8577}\x{857E}\x{8580}\x{8584}\x{8587}' . +'\x{8588}\x{858A}\x{8590}\x{8591}\x{8594}\x{8597}\x{8599}\x{859B}\x{859C}' . +'\x{85A4}\x{85A6}\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AE}\x{85AF}' . +'\x{85B9}\x{85BA}\x{85C1}\x{85C9}\x{85CD}\x{85CF}\x{85D0}\x{85D5}\x{85DC}' . +'\x{85DD}\x{85E4}\x{85E5}\x{85E9}\x{85EA}\x{85F7}\x{85F9}\x{85FA}\x{85FB}' . +'\x{85FE}\x{8602}\x{8606}\x{8607}\x{860A}\x{860B}\x{8613}\x{8616}\x{8617}' . +'\x{861A}\x{8622}\x{862D}\x{862F}\x{8630}\x{863F}\x{864D}\x{864E}\x{8650}' . +'\x{8654}\x{8655}\x{865A}\x{865C}\x{865E}\x{865F}\x{8667}\x{866B}\x{8671}' . +'\x{8679}\x{867B}\x{868A}\x{868B}\x{868C}\x{8693}\x{8695}\x{86A3}\x{86A4}' . +'\x{86A9}\x{86AA}\x{86AB}\x{86AF}\x{86B0}\x{86B6}\x{86C4}\x{86C6}\x{86C7}' . +'\x{86C9}\x{86CB}\x{86CD}\x{86CE}\x{86D4}\x{86D9}\x{86DB}\x{86DE}\x{86DF}' . +'\x{86E4}\x{86E9}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F8}\x{86F9}\x{86FB}' . +'\x{86FE}\x{8700}\x{8702}\x{8703}\x{8706}\x{8708}\x{8709}\x{870A}\x{870D}' . +'\x{8711}\x{8712}\x{8718}\x{871A}\x{871C}\x{8725}\x{8729}\x{8734}\x{8737}' . +'\x{873B}\x{873F}\x{8749}\x{874B}\x{874C}\x{874E}\x{8753}\x{8755}\x{8757}' . +'\x{8759}\x{875F}\x{8760}\x{8763}\x{8766}\x{8768}\x{876A}\x{876E}\x{8774}' . +'\x{8776}\x{8778}\x{877F}\x{8782}\x{878D}\x{879F}\x{87A2}\x{87AB}\x{87AF}' . +'\x{87B3}\x{87BA}\x{87BB}\x{87BD}\x{87C0}\x{87C4}\x{87C6}\x{87C7}\x{87CB}' . +'\x{87D0}\x{87D2}\x{87E0}\x{87EF}\x{87F2}\x{87F6}\x{87F7}\x{87F9}\x{87FB}' . +'\x{87FE}\x{8805}\x{880D}\x{880E}\x{880F}\x{8811}\x{8815}\x{8816}\x{8821}' . +'\x{8822}\x{8823}\x{8827}\x{8831}\x{8836}\x{8839}\x{883B}\x{8840}\x{8842}' . +'\x{8844}\x{8846}\x{884C}\x{884D}\x{8852}\x{8853}\x{8857}\x{8859}\x{885B}' . +'\x{885D}\x{885E}\x{8861}\x{8862}\x{8863}\x{8868}\x{886B}\x{8870}\x{8872}' . +'\x{8875}\x{8877}\x{887D}\x{887E}\x{887F}\x{8881}\x{8882}\x{8888}\x{888B}' . +'\x{888D}\x{8892}\x{8896}\x{8897}\x{8899}\x{889E}\x{88A2}\x{88A4}\x{88AB}' . +'\x{88AE}\x{88B0}\x{88B1}\x{88B4}\x{88B5}\x{88B7}\x{88BF}\x{88C1}\x{88C2}' . +'\x{88C3}\x{88C4}\x{88C5}\x{88CF}\x{88D4}\x{88D5}\x{88D8}\x{88D9}\x{88DC}' . +'\x{88DD}\x{88DF}\x{88E1}\x{88E8}\x{88F2}\x{88F3}\x{88F4}\x{88F8}\x{88F9}' . +'\x{88FC}\x{88FD}\x{88FE}\x{8902}\x{8904}\x{8907}\x{890A}\x{890C}\x{8910}' . +'\x{8912}\x{8913}\x{891D}\x{891E}\x{8925}\x{892A}\x{892B}\x{8936}\x{8938}' . +'\x{893B}\x{8941}\x{8943}\x{8944}\x{894C}\x{894D}\x{8956}\x{895E}\x{895F}' . +'\x{8960}\x{8964}\x{8966}\x{896A}\x{896D}\x{896F}\x{8972}\x{8974}\x{8977}' . +'\x{897E}\x{897F}\x{8981}\x{8983}\x{8986}\x{8987}\x{8988}\x{898A}\x{898B}' . +'\x{898F}\x{8993}\x{8996}\x{8997}\x{8998}\x{899A}\x{89A1}\x{89A6}\x{89A7}' . +'\x{89A9}\x{89AA}\x{89AC}\x{89AF}\x{89B2}\x{89B3}\x{89BA}\x{89BD}\x{89BF}' . +'\x{89C0}\x{89D2}\x{89DA}\x{89DC}\x{89DD}\x{89E3}\x{89E6}\x{89E7}\x{89F4}' . +'\x{89F8}\x{8A00}\x{8A02}\x{8A03}\x{8A08}\x{8A0A}\x{8A0C}\x{8A0E}\x{8A10}' . +'\x{8A13}\x{8A16}\x{8A17}\x{8A18}\x{8A1B}\x{8A1D}\x{8A1F}\x{8A23}\x{8A25}' . +'\x{8A2A}\x{8A2D}\x{8A31}\x{8A33}\x{8A34}\x{8A36}\x{8A3A}\x{8A3B}\x{8A3C}' . +'\x{8A41}\x{8A46}\x{8A48}\x{8A50}\x{8A51}\x{8A52}\x{8A54}\x{8A55}\x{8A5B}' . +'\x{8A5E}\x{8A60}\x{8A62}\x{8A63}\x{8A66}\x{8A69}\x{8A6B}\x{8A6C}\x{8A6D}' . +'\x{8A6E}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A7C}\x{8A82}\x{8A84}\x{8A85}' . +'\x{8A87}\x{8A89}\x{8A8C}\x{8A8D}\x{8A91}\x{8A93}\x{8A95}\x{8A98}\x{8A9A}' . +'\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA8}\x{8AAC}' . +'\x{8AAD}\x{8AB0}\x{8AB2}\x{8AB9}\x{8ABC}\x{8ABF}\x{8AC2}\x{8AC4}\x{8AC7}' . +'\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACF}\x{8AD2}\x{8AD6}\x{8ADA}\x{8ADB}\x{8ADC}' . +'\x{8ADE}\x{8AE0}\x{8AE1}\x{8AE2}\x{8AE4}\x{8AE6}\x{8AE7}\x{8AEB}\x{8AED}' . +'\x{8AEE}\x{8AF1}\x{8AF3}\x{8AF7}\x{8AF8}\x{8AFA}\x{8AFE}\x{8B00}\x{8B01}' . +'\x{8B02}\x{8B04}\x{8B07}\x{8B0C}\x{8B0E}\x{8B10}\x{8B14}\x{8B16}\x{8B17}' . +'\x{8B19}\x{8B1A}\x{8B1B}\x{8B1D}\x{8B20}\x{8B21}\x{8B26}\x{8B28}\x{8B2B}' . +'\x{8B2C}\x{8B33}\x{8B39}\x{8B3E}\x{8B41}\x{8B49}\x{8B4C}\x{8B4E}\x{8B4F}' . +'\x{8B56}\x{8B58}\x{8B5A}\x{8B5B}\x{8B5C}\x{8B5F}\x{8B66}\x{8B6B}\x{8B6C}' . +'\x{8B6F}\x{8B70}\x{8B71}\x{8B72}\x{8B74}\x{8B77}\x{8B7D}\x{8B80}\x{8B83}' . +'\x{8B8A}\x{8B8C}\x{8B8E}\x{8B90}\x{8B92}\x{8B93}\x{8B96}\x{8B99}\x{8B9A}' . +'\x{8C37}\x{8C3A}\x{8C3F}\x{8C41}\x{8C46}\x{8C48}\x{8C4A}\x{8C4C}\x{8C4E}' . +'\x{8C50}\x{8C55}\x{8C5A}\x{8C61}\x{8C62}\x{8C6A}\x{8C6B}\x{8C6C}\x{8C78}' . +'\x{8C79}\x{8C7A}\x{8C7C}\x{8C82}\x{8C85}\x{8C89}\x{8C8A}\x{8C8C}\x{8C8D}' . +'\x{8C8E}\x{8C94}\x{8C98}\x{8C9D}\x{8C9E}\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA7}' . +'\x{8CA8}\x{8CA9}\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}' . +'\x{8CB2}\x{8CB3}\x{8CB4}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CBB}\x{8CBC}\x{8CBD}' . +'\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}\x{8CC7}\x{8CC8}\x{8CCA}' . +'\x{8CCD}\x{8CCE}\x{8CD1}\x{8CD3}\x{8CDA}\x{8CDB}\x{8CDC}\x{8CDE}\x{8CE0}' . +'\x{8CE2}\x{8CE3}\x{8CE4}\x{8CE6}\x{8CEA}\x{8CED}\x{8CFA}\x{8CFB}\x{8CFC}' . +'\x{8CFD}\x{8D04}\x{8D05}\x{8D07}\x{8D08}\x{8D0A}\x{8D0B}\x{8D0D}\x{8D0F}' . +'\x{8D10}\x{8D13}\x{8D14}\x{8D16}\x{8D64}\x{8D66}\x{8D67}\x{8D6B}\x{8D6D}' . +'\x{8D70}\x{8D71}\x{8D73}\x{8D74}\x{8D77}\x{8D81}\x{8D85}\x{8D8A}\x{8D99}' . +'\x{8DA3}\x{8DA8}\x{8DB3}\x{8DBA}\x{8DBE}\x{8DC2}\x{8DCB}\x{8DCC}\x{8DCF}' . +'\x{8DD6}\x{8DDA}\x{8DDB}\x{8DDD}\x{8DDF}\x{8DE1}\x{8DE3}\x{8DE8}\x{8DEA}' . +'\x{8DEB}\x{8DEF}\x{8DF3}\x{8DF5}\x{8DFC}\x{8DFF}\x{8E08}\x{8E09}\x{8E0A}' . +'\x{8E0F}\x{8E10}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E2A}\x{8E30}\x{8E34}\x{8E35}' . +'\x{8E42}\x{8E44}\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4C}\x{8E50}\x{8E55}' . +'\x{8E59}\x{8E5F}\x{8E60}\x{8E63}\x{8E64}\x{8E72}\x{8E74}\x{8E76}\x{8E7C}' . +'\x{8E81}\x{8E84}\x{8E85}\x{8E87}\x{8E8A}\x{8E8B}\x{8E8D}\x{8E91}\x{8E93}' . +'\x{8E94}\x{8E99}\x{8EA1}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAF}\x{8EB0}\x{8EB1}' . +'\x{8EBE}\x{8EC5}\x{8EC6}\x{8EC8}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ED2}' . +'\x{8EDB}\x{8EDF}\x{8EE2}\x{8EE3}\x{8EEB}\x{8EF8}\x{8EFB}\x{8EFC}\x{8EFD}' . +'\x{8EFE}\x{8F03}\x{8F05}\x{8F09}\x{8F0A}\x{8F0C}\x{8F12}\x{8F13}\x{8F14}' . +'\x{8F15}\x{8F19}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1F}\x{8F26}\x{8F29}\x{8F2A}' . +'\x{8F2F}\x{8F33}\x{8F38}\x{8F39}\x{8F3B}\x{8F3E}\x{8F3F}\x{8F42}\x{8F44}' . +'\x{8F45}\x{8F46}\x{8F49}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F57}\x{8F5C}\x{8F5F}' . +'\x{8F61}\x{8F62}\x{8F63}\x{8F64}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA3}' . +'\x{8FA7}\x{8FA8}\x{8FAD}\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB7}' . +'\x{8FBA}\x{8FBB}\x{8FBC}\x{8FBF}\x{8FC2}\x{8FC4}\x{8FC5}\x{8FCE}\x{8FD1}' . +'\x{8FD4}\x{8FDA}\x{8FE2}\x{8FE5}\x{8FE6}\x{8FE9}\x{8FEA}\x{8FEB}\x{8FED}' . +'\x{8FEF}\x{8FF0}\x{8FF4}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}\x{8FFD}\x{9000}' . +'\x{9001}\x{9003}\x{9005}\x{9006}\x{900B}\x{900D}\x{900E}\x{900F}\x{9010}' . +'\x{9011}\x{9013}\x{9014}\x{9015}\x{9016}\x{9017}\x{9019}\x{901A}\x{901D}' . +'\x{901E}\x{901F}\x{9020}\x{9021}\x{9022}\x{9023}\x{9027}\x{902E}\x{9031}' . +'\x{9032}\x{9035}\x{9036}\x{9038}\x{9039}\x{903C}\x{903E}\x{9041}\x{9042}' . +'\x{9045}\x{9047}\x{9049}\x{904A}\x{904B}\x{904D}\x{904E}\x{904F}\x{9050}' . +'\x{9051}\x{9052}\x{9053}\x{9054}\x{9055}\x{9056}\x{9058}\x{9059}\x{905C}' . +'\x{905E}\x{9060}\x{9061}\x{9063}\x{9065}\x{9068}\x{9069}\x{906D}\x{906E}' . +'\x{906F}\x{9072}\x{9075}\x{9076}\x{9077}\x{9078}\x{907A}\x{907C}\x{907D}' . +'\x{907F}\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9087}\x{9089}\x{908A}' . +'\x{908F}\x{9091}\x{90A3}\x{90A6}\x{90A8}\x{90AA}\x{90AF}\x{90B1}\x{90B5}' . +'\x{90B8}\x{90C1}\x{90CA}\x{90CE}\x{90DB}\x{90E1}\x{90E2}\x{90E4}\x{90E8}' . +'\x{90ED}\x{90F5}\x{90F7}\x{90FD}\x{9102}\x{9112}\x{9119}\x{912D}\x{9130}' . +'\x{9132}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}\x{914E}\x{9152}\x{9154}' . +'\x{9156}\x{9158}\x{9162}\x{9163}\x{9165}\x{9169}\x{916A}\x{916C}\x{9172}' . +'\x{9173}\x{9175}\x{9177}\x{9178}\x{9182}\x{9187}\x{9189}\x{918B}\x{918D}' . +'\x{9190}\x{9192}\x{9197}\x{919C}\x{91A2}\x{91A4}\x{91AA}\x{91AB}\x{91AF}' . +'\x{91B4}\x{91B5}\x{91B8}\x{91BA}\x{91C0}\x{91C1}\x{91C6}\x{91C7}\x{91C8}' . +'\x{91C9}\x{91CB}\x{91CC}\x{91CD}\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D6}' . +'\x{91D8}\x{91DB}\x{91DC}\x{91DD}\x{91DF}\x{91E1}\x{91E3}\x{91E6}\x{91E7}' . +'\x{91F5}\x{91F6}\x{91FC}\x{91FF}\x{920D}\x{920E}\x{9211}\x{9214}\x{9215}' . +'\x{921E}\x{9229}\x{922C}\x{9234}\x{9237}\x{923F}\x{9244}\x{9245}\x{9248}' . +'\x{9249}\x{924B}\x{9250}\x{9257}\x{925A}\x{925B}\x{925E}\x{9262}\x{9264}' . +'\x{9266}\x{9271}\x{927E}\x{9280}\x{9283}\x{9285}\x{9291}\x{9293}\x{9295}' . +'\x{9296}\x{9298}\x{929A}\x{929B}\x{929C}\x{92AD}\x{92B7}\x{92B9}\x{92CF}' . +'\x{92D2}\x{92E4}\x{92E9}\x{92EA}\x{92ED}\x{92F2}\x{92F3}\x{92F8}\x{92FA}' . +'\x{92FC}\x{9306}\x{930F}\x{9310}\x{9318}\x{9319}\x{931A}\x{9320}\x{9322}' . +'\x{9323}\x{9326}\x{9328}\x{932B}\x{932C}\x{932E}\x{932F}\x{9332}\x{9335}' . +'\x{933A}\x{933B}\x{9344}\x{934B}\x{934D}\x{9354}\x{9356}\x{935B}\x{935C}' . +'\x{9360}\x{936C}\x{936E}\x{9375}\x{937C}\x{937E}\x{938C}\x{9394}\x{9396}' . +'\x{9397}\x{939A}\x{93A7}\x{93AC}\x{93AD}\x{93AE}\x{93B0}\x{93B9}\x{93C3}' . +'\x{93C8}\x{93D0}\x{93D1}\x{93D6}\x{93D7}\x{93D8}\x{93DD}\x{93E1}\x{93E4}' . +'\x{93E5}\x{93E8}\x{9403}\x{9407}\x{9410}\x{9413}\x{9414}\x{9418}\x{9419}' . +'\x{941A}\x{9421}\x{942B}\x{9435}\x{9436}\x{9438}\x{943A}\x{9441}\x{9444}' . +'\x{9451}\x{9452}\x{9453}\x{945A}\x{945B}\x{945E}\x{9460}\x{9462}\x{946A}' . +'\x{9470}\x{9475}\x{9477}\x{947C}\x{947D}\x{947E}\x{947F}\x{9481}\x{9577}' . +'\x{9580}\x{9582}\x{9583}\x{9587}\x{9589}\x{958A}\x{958B}\x{958F}\x{9591}' . +'\x{9593}\x{9594}\x{9596}\x{9598}\x{9599}\x{95A0}\x{95A2}\x{95A3}\x{95A4}' . +'\x{95A5}\x{95A7}\x{95A8}\x{95AD}\x{95B2}\x{95B9}\x{95BB}\x{95BC}\x{95BE}' . +'\x{95C3}\x{95C7}\x{95CA}\x{95CC}\x{95CD}\x{95D4}\x{95D5}\x{95D6}\x{95D8}' . +'\x{95DC}\x{95E1}\x{95E2}\x{95E5}\x{961C}\x{9621}\x{9628}\x{962A}\x{962E}' . +'\x{962F}\x{9632}\x{963B}\x{963F}\x{9640}\x{9642}\x{9644}\x{964B}\x{964C}' . +'\x{964D}\x{964F}\x{9650}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9662}' . +'\x{9663}\x{9664}\x{9665}\x{9666}\x{966A}\x{966C}\x{9670}\x{9672}\x{9673}' . +'\x{9675}\x{9676}\x{9677}\x{9678}\x{967A}\x{967D}\x{9685}\x{9686}\x{9688}' . +'\x{968A}\x{968B}\x{968D}\x{968E}\x{968F}\x{9694}\x{9695}\x{9697}\x{9698}' . +'\x{9699}\x{969B}\x{969C}\x{96A0}\x{96A3}\x{96A7}\x{96A8}\x{96AA}\x{96B0}' . +'\x{96B1}\x{96B2}\x{96B4}\x{96B6}\x{96B7}\x{96B8}\x{96B9}\x{96BB}\x{96BC}' . +'\x{96C0}\x{96C1}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C9}\x{96CB}\x{96CC}' . +'\x{96CD}\x{96CE}\x{96D1}\x{96D5}\x{96D6}\x{96D9}\x{96DB}\x{96DC}\x{96E2}' . +'\x{96E3}\x{96E8}\x{96EA}\x{96EB}\x{96F0}\x{96F2}\x{96F6}\x{96F7}\x{96F9}' . +'\x{96FB}\x{9700}\x{9704}\x{9706}\x{9707}\x{9708}\x{970A}\x{970D}\x{970E}' . +'\x{970F}\x{9711}\x{9713}\x{9716}\x{9719}\x{971C}\x{971E}\x{9724}\x{9727}' . +'\x{972A}\x{9730}\x{9732}\x{9738}\x{9739}\x{973D}\x{973E}\x{9742}\x{9744}' . +'\x{9746}\x{9748}\x{9749}\x{9752}\x{9756}\x{9759}\x{975C}\x{975E}\x{9760}' . +'\x{9761}\x{9762}\x{9764}\x{9766}\x{9768}\x{9769}\x{976B}\x{976D}\x{9771}' . +'\x{9774}\x{9779}\x{977A}\x{977C}\x{9781}\x{9784}\x{9785}\x{9786}\x{978B}' . +'\x{978D}\x{978F}\x{9790}\x{9798}\x{979C}\x{97A0}\x{97A3}\x{97A6}\x{97A8}' . +'\x{97AB}\x{97AD}\x{97B3}\x{97B4}\x{97C3}\x{97C6}\x{97C8}\x{97CB}\x{97D3}' . +'\x{97DC}\x{97ED}\x{97EE}\x{97F2}\x{97F3}\x{97F5}\x{97F6}\x{97FB}\x{97FF}' . +'\x{9801}\x{9802}\x{9803}\x{9805}\x{9806}\x{9808}\x{980C}\x{980F}\x{9810}' . +'\x{9811}\x{9812}\x{9813}\x{9817}\x{9818}\x{981A}\x{9821}\x{9824}\x{982C}' . +'\x{982D}\x{9834}\x{9837}\x{9838}\x{983B}\x{983C}\x{983D}\x{9846}\x{984B}' . +'\x{984C}\x{984D}\x{984E}\x{984F}\x{9854}\x{9855}\x{9858}\x{985B}\x{985E}' . +'\x{9867}\x{986B}\x{986F}\x{9870}\x{9871}\x{9873}\x{9874}\x{98A8}\x{98AA}' . +'\x{98AF}\x{98B1}\x{98B6}\x{98C3}\x{98C4}\x{98C6}\x{98DB}\x{98DC}\x{98DF}' . +'\x{98E2}\x{98E9}\x{98EB}\x{98ED}\x{98EE}\x{98EF}\x{98F2}\x{98F4}\x{98FC}' . +'\x{98FD}\x{98FE}\x{9903}\x{9905}\x{9909}\x{990A}\x{990C}\x{9910}\x{9912}' . +'\x{9913}\x{9914}\x{9918}\x{991D}\x{991E}\x{9920}\x{9921}\x{9924}\x{9928}' . +'\x{992C}\x{992E}\x{993D}\x{993E}\x{9942}\x{9945}\x{9949}\x{994B}\x{994C}' . +'\x{9950}\x{9951}\x{9952}\x{9955}\x{9957}\x{9996}\x{9997}\x{9998}\x{9999}' . +'\x{99A5}\x{99A8}\x{99AC}\x{99AD}\x{99AE}\x{99B3}\x{99B4}\x{99BC}\x{99C1}' . +'\x{99C4}\x{99C5}\x{99C6}\x{99C8}\x{99D0}\x{99D1}\x{99D2}\x{99D5}\x{99D8}' . +'\x{99DB}\x{99DD}\x{99DF}\x{99E2}\x{99ED}\x{99EE}\x{99F1}\x{99F2}\x{99F8}' . +'\x{99FB}\x{99FF}\x{9A01}\x{9A05}\x{9A0E}\x{9A0F}\x{9A12}\x{9A13}\x{9A19}' . +'\x{9A28}\x{9A2B}\x{9A30}\x{9A37}\x{9A3E}\x{9A40}\x{9A42}\x{9A43}\x{9A45}' . +'\x{9A4D}\x{9A55}\x{9A57}\x{9A5A}\x{9A5B}\x{9A5F}\x{9A62}\x{9A64}\x{9A65}' . +'\x{9A69}\x{9A6A}\x{9A6B}\x{9AA8}\x{9AAD}\x{9AB0}\x{9AB8}\x{9ABC}\x{9AC0}' . +'\x{9AC4}\x{9ACF}\x{9AD1}\x{9AD3}\x{9AD4}\x{9AD8}\x{9ADE}\x{9ADF}\x{9AE2}' . +'\x{9AE3}\x{9AE6}\x{9AEA}\x{9AEB}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF4}' . +'\x{9AF7}\x{9AFB}\x{9B06}\x{9B18}\x{9B1A}\x{9B1F}\x{9B22}\x{9B23}\x{9B25}' . +'\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2E}\x{9B2F}\x{9B31}\x{9B32}\x{9B3B}' . +'\x{9B3C}\x{9B41}\x{9B42}\x{9B43}\x{9B44}\x{9B45}\x{9B4D}\x{9B4E}\x{9B4F}' . +'\x{9B51}\x{9B54}\x{9B58}\x{9B5A}\x{9B6F}\x{9B74}\x{9B83}\x{9B8E}\x{9B91}' . +'\x{9B92}\x{9B93}\x{9B96}\x{9B97}\x{9B9F}\x{9BA0}\x{9BA8}\x{9BAA}\x{9BAB}' . +'\x{9BAD}\x{9BAE}\x{9BB4}\x{9BB9}\x{9BC0}\x{9BC6}\x{9BC9}\x{9BCA}\x{9BCF}' . +'\x{9BD1}\x{9BD2}\x{9BD4}\x{9BD6}\x{9BDB}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}' . +'\x{9BE8}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF5}\x{9C04}\x{9C06}\x{9C08}\x{9C09}' . +'\x{9C0A}\x{9C0C}\x{9C0D}\x{9C10}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C1B}' . +'\x{9C21}\x{9C24}\x{9C25}\x{9C2D}\x{9C2E}\x{9C2F}\x{9C30}\x{9C32}\x{9C39}' . +'\x{9C3A}\x{9C3B}\x{9C3E}\x{9C46}\x{9C47}\x{9C48}\x{9C52}\x{9C57}\x{9C5A}' . +'\x{9C60}\x{9C67}\x{9C76}\x{9C78}\x{9CE5}\x{9CE7}\x{9CE9}\x{9CEB}\x{9CEC}' . +'\x{9CF0}\x{9CF3}\x{9CF4}\x{9CF6}\x{9D03}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' . +'\x{9D0E}\x{9D12}\x{9D15}\x{9D1B}\x{9D1F}\x{9D23}\x{9D26}\x{9D28}\x{9D2A}' . +'\x{9D2B}\x{9D2C}\x{9D3B}\x{9D3E}\x{9D3F}\x{9D41}\x{9D44}\x{9D46}\x{9D48}' . +'\x{9D50}\x{9D51}\x{9D59}\x{9D5C}\x{9D5D}\x{9D5E}\x{9D60}\x{9D61}\x{9D64}' . +'\x{9D6C}\x{9D6F}\x{9D72}\x{9D7A}\x{9D87}\x{9D89}\x{9D8F}\x{9D9A}\x{9DA4}' . +'\x{9DA9}\x{9DAB}\x{9DAF}\x{9DB2}\x{9DB4}\x{9DB8}\x{9DBA}\x{9DBB}\x{9DC1}' . +'\x{9DC2}\x{9DC4}\x{9DC6}\x{9DCF}\x{9DD3}\x{9DD9}\x{9DE6}\x{9DED}\x{9DEF}' . +'\x{9DF2}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFD}\x{9E1A}\x{9E1B}\x{9E1E}\x{9E75}' . +'\x{9E78}\x{9E79}\x{9E7D}\x{9E7F}\x{9E81}\x{9E88}\x{9E8B}\x{9E8C}\x{9E91}' . +'\x{9E92}\x{9E93}\x{9E95}\x{9E97}\x{9E9D}\x{9E9F}\x{9EA5}\x{9EA6}\x{9EA9}' . +'\x{9EAA}\x{9EAD}\x{9EB8}\x{9EB9}\x{9EBA}\x{9EBB}\x{9EBC}\x{9EBE}\x{9EBF}' . +'\x{9EC4}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED2}\x{9ED4}\x{9ED8}' . +'\x{9ED9}\x{9EDB}\x{9EDC}\x{9EDD}\x{9EDE}\x{9EE0}\x{9EE5}\x{9EE8}\x{9EEF}' . +'\x{9EF4}\x{9EF6}\x{9EF7}\x{9EF9}\x{9EFB}\x{9EFC}\x{9EFD}\x{9F07}\x{9F08}' . +'\x{9F0E}\x{9F13}\x{9F15}\x{9F20}\x{9F21}\x{9F2C}\x{9F3B}\x{9F3E}\x{9F4A}' . +'\x{9F4B}\x{9F4E}\x{9F4F}\x{9F52}\x{9F54}\x{9F5F}\x{9F60}\x{9F61}\x{9F62}' . +'\x{9F63}\x{9F66}\x{9F67}\x{9F6A}\x{9F6C}\x{9F72}\x{9F76}\x{9F77}\x{9F8D}' . +'\x{9F95}\x{9F9C}\x{9F9D}\x{9FA0}]{1,15}$/iu', + 12 => '/^[\x{002d}0-9a-z\x{3447}\x{3473}\x{359E}\x{360E}\x{361A}\x{3918}\x{396E}\x{39CF}\x{39D0}' . +'\x{39DF}\x{3A73}\x{3B4E}\x{3C6E}\x{3CE0}\x{4056}\x{415F}\x{4337}\x{43AC}' . +'\x{43B1}\x{43DD}\x{44D6}\x{464C}\x{4661}\x{4723}\x{4729}\x{477C}\x{478D}' . +'\x{4947}\x{497A}\x{497D}\x{4982}\x{4983}\x{4985}\x{4986}\x{499B}\x{499F}' . +'\x{49B6}\x{49B7}\x{4C77}\x{4C9F}\x{4CA0}\x{4CA1}\x{4CA2}\x{4CA3}\x{4D13}' . +'\x{4D14}\x{4D15}\x{4D16}\x{4D17}\x{4D18}\x{4D19}\x{4DAE}\x{4E00}\x{4E01}' . +'\x{4E02}\x{4E03}\x{4E04}\x{4E05}\x{4E06}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' . +'\x{4E0B}\x{4E0C}\x{4E0D}\x{4E0E}\x{4E0F}\x{4E10}\x{4E11}\x{4E13}\x{4E14}' . +'\x{4E15}\x{4E16}\x{4E17}\x{4E18}\x{4E19}\x{4E1A}\x{4E1B}\x{4E1C}\x{4E1D}' . +'\x{4E1E}\x{4E1F}\x{4E20}\x{4E21}\x{4E22}\x{4E23}\x{4E24}\x{4E25}\x{4E26}' . +'\x{4E27}\x{4E28}\x{4E2A}\x{4E2B}\x{4E2C}\x{4E2D}\x{4E2E}\x{4E2F}\x{4E30}' . +'\x{4E31}\x{4E32}\x{4E33}\x{4E34}\x{4E35}\x{4E36}\x{4E37}\x{4E38}\x{4E39}' . +'\x{4E3A}\x{4E3B}\x{4E3C}\x{4E3D}\x{4E3E}\x{4E3F}\x{4E40}\x{4E41}\x{4E42}' . +'\x{4E43}\x{4E44}\x{4E45}\x{4E46}\x{4E47}\x{4E48}\x{4E49}\x{4E4A}\x{4E4B}' . +'\x{4E4C}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E50}\x{4E51}\x{4E52}\x{4E53}\x{4E54}' . +'\x{4E56}\x{4E57}\x{4E58}\x{4E59}\x{4E5A}\x{4E5B}\x{4E5C}\x{4E5D}\x{4E5E}' . +'\x{4E5F}\x{4E60}\x{4E61}\x{4E62}\x{4E63}\x{4E64}\x{4E65}\x{4E66}\x{4E67}' . +'\x{4E69}\x{4E6A}\x{4E6B}\x{4E6C}\x{4E6D}\x{4E6E}\x{4E6F}\x{4E70}\x{4E71}' . +'\x{4E72}\x{4E73}\x{4E74}\x{4E75}\x{4E76}\x{4E77}\x{4E78}\x{4E7A}\x{4E7B}' . +'\x{4E7C}\x{4E7D}\x{4E7E}\x{4E7F}\x{4E80}\x{4E81}\x{4E82}\x{4E83}\x{4E84}' . +'\x{4E85}\x{4E86}\x{4E87}\x{4E88}\x{4E89}\x{4E8B}\x{4E8C}\x{4E8D}\x{4E8E}' . +'\x{4E8F}\x{4E90}\x{4E91}\x{4E92}\x{4E93}\x{4E94}\x{4E95}\x{4E97}\x{4E98}' . +'\x{4E99}\x{4E9A}\x{4E9B}\x{4E9C}\x{4E9D}\x{4E9E}\x{4E9F}\x{4EA0}\x{4EA1}' . +'\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA7}\x{4EA8}\x{4EA9}\x{4EAA}\x{4EAB}' . +'\x{4EAC}\x{4EAD}\x{4EAE}\x{4EAF}\x{4EB0}\x{4EB1}\x{4EB2}\x{4EB3}\x{4EB4}' . +'\x{4EB5}\x{4EB6}\x{4EB7}\x{4EB8}\x{4EB9}\x{4EBA}\x{4EBB}\x{4EBD}\x{4EBE}' . +'\x{4EBF}\x{4EC0}\x{4EC1}\x{4EC2}\x{4EC3}\x{4EC4}\x{4EC5}\x{4EC6}\x{4EC7}' . +'\x{4EC8}\x{4EC9}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED0}\x{4ED1}' . +'\x{4ED2}\x{4ED3}\x{4ED4}\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDA}' . +'\x{4EDB}\x{4EDC}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE0}\x{4EE1}\x{4EE2}\x{4EE3}' . +'\x{4EE4}\x{4EE5}\x{4EE6}\x{4EE8}\x{4EE9}\x{4EEA}\x{4EEB}\x{4EEC}\x{4EEF}' . +'\x{4EF0}\x{4EF1}\x{4EF2}\x{4EF3}\x{4EF4}\x{4EF5}\x{4EF6}\x{4EF7}\x{4EFB}' . +'\x{4EFD}\x{4EFF}\x{4F00}\x{4F01}\x{4F02}\x{4F03}\x{4F04}\x{4F05}\x{4F06}' . +'\x{4F08}\x{4F09}\x{4F0A}\x{4F0B}\x{4F0C}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}' . +'\x{4F11}\x{4F12}\x{4F13}\x{4F14}\x{4F15}\x{4F17}\x{4F18}\x{4F19}\x{4F1A}' . +'\x{4F1B}\x{4F1C}\x{4F1D}\x{4F1E}\x{4F1F}\x{4F20}\x{4F21}\x{4F22}\x{4F23}' . +'\x{4F24}\x{4F25}\x{4F26}\x{4F27}\x{4F29}\x{4F2A}\x{4F2B}\x{4F2C}\x{4F2D}' . +'\x{4F2E}\x{4F2F}\x{4F30}\x{4F32}\x{4F33}\x{4F34}\x{4F36}\x{4F38}\x{4F39}' . +'\x{4F3A}\x{4F3B}\x{4F3C}\x{4F3D}\x{4F3E}\x{4F3F}\x{4F41}\x{4F42}\x{4F43}' . +'\x{4F45}\x{4F46}\x{4F47}\x{4F48}\x{4F49}\x{4F4A}\x{4F4B}\x{4F4C}\x{4F4D}' . +'\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}\x{4F52}\x{4F53}\x{4F54}\x{4F55}\x{4F56}' . +'\x{4F57}\x{4F58}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}\x{4F5F}' . +'\x{4F60}\x{4F61}\x{4F62}\x{4F63}\x{4F64}\x{4F65}\x{4F66}\x{4F67}\x{4F68}' . +'\x{4F69}\x{4F6A}\x{4F6B}\x{4F6C}\x{4F6D}\x{4F6E}\x{4F6F}\x{4F70}\x{4F72}' . +'\x{4F73}\x{4F74}\x{4F75}\x{4F76}\x{4F77}\x{4F78}\x{4F79}\x{4F7A}\x{4F7B}' . +'\x{4F7C}\x{4F7D}\x{4F7E}\x{4F7F}\x{4F80}\x{4F81}\x{4F82}\x{4F83}\x{4F84}' . +'\x{4F85}\x{4F86}\x{4F87}\x{4F88}\x{4F89}\x{4F8A}\x{4F8B}\x{4F8D}\x{4F8F}' . +'\x{4F90}\x{4F91}\x{4F92}\x{4F93}\x{4F94}\x{4F95}\x{4F96}\x{4F97}\x{4F98}' . +'\x{4F99}\x{4F9A}\x{4F9B}\x{4F9C}\x{4F9D}\x{4F9E}\x{4F9F}\x{4FA0}\x{4FA1}' . +'\x{4FA3}\x{4FA4}\x{4FA5}\x{4FA6}\x{4FA7}\x{4FA8}\x{4FA9}\x{4FAA}\x{4FAB}' . +'\x{4FAC}\x{4FAE}\x{4FAF}\x{4FB0}\x{4FB1}\x{4FB2}\x{4FB3}\x{4FB4}\x{4FB5}' . +'\x{4FB6}\x{4FB7}\x{4FB8}\x{4FB9}\x{4FBA}\x{4FBB}\x{4FBC}\x{4FBE}\x{4FBF}' . +'\x{4FC0}\x{4FC1}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FC5}\x{4FC7}\x{4FC9}\x{4FCA}' . +'\x{4FCB}\x{4FCD}\x{4FCE}\x{4FCF}\x{4FD0}\x{4FD1}\x{4FD2}\x{4FD3}\x{4FD4}' . +'\x{4FD5}\x{4FD6}\x{4FD7}\x{4FD8}\x{4FD9}\x{4FDA}\x{4FDB}\x{4FDC}\x{4FDD}' . +'\x{4FDE}\x{4FDF}\x{4FE0}\x{4FE1}\x{4FE3}\x{4FE4}\x{4FE5}\x{4FE6}\x{4FE7}' . +'\x{4FE8}\x{4FE9}\x{4FEA}\x{4FEB}\x{4FEC}\x{4FED}\x{4FEE}\x{4FEF}\x{4FF0}' . +'\x{4FF1}\x{4FF2}\x{4FF3}\x{4FF4}\x{4FF5}\x{4FF6}\x{4FF7}\x{4FF8}\x{4FF9}' . +'\x{4FFA}\x{4FFB}\x{4FFE}\x{4FFF}\x{5000}\x{5001}\x{5002}\x{5003}\x{5004}' . +'\x{5005}\x{5006}\x{5007}\x{5008}\x{5009}\x{500A}\x{500B}\x{500C}\x{500D}' . +'\x{500E}\x{500F}\x{5011}\x{5012}\x{5013}\x{5014}\x{5015}\x{5016}\x{5017}' . +'\x{5018}\x{5019}\x{501A}\x{501B}\x{501C}\x{501D}\x{501E}\x{501F}\x{5020}' . +'\x{5021}\x{5022}\x{5023}\x{5024}\x{5025}\x{5026}\x{5027}\x{5028}\x{5029}' . +'\x{502A}\x{502B}\x{502C}\x{502D}\x{502E}\x{502F}\x{5030}\x{5031}\x{5032}' . +'\x{5033}\x{5035}\x{5036}\x{5037}\x{5039}\x{503A}\x{503B}\x{503C}\x{503E}' . +'\x{503F}\x{5040}\x{5041}\x{5043}\x{5044}\x{5045}\x{5046}\x{5047}\x{5048}' . +'\x{5049}\x{504A}\x{504B}\x{504C}\x{504D}\x{504E}\x{504F}\x{5051}\x{5053}' . +'\x{5054}\x{5055}\x{5056}\x{5057}\x{5059}\x{505A}\x{505B}\x{505C}\x{505D}' . +'\x{505E}\x{505F}\x{5060}\x{5061}\x{5062}\x{5063}\x{5064}\x{5065}\x{5066}' . +'\x{5067}\x{5068}\x{5069}\x{506A}\x{506B}\x{506C}\x{506D}\x{506E}\x{506F}' . +'\x{5070}\x{5071}\x{5072}\x{5073}\x{5074}\x{5075}\x{5076}\x{5077}\x{5078}' . +'\x{5079}\x{507A}\x{507B}\x{507D}\x{507E}\x{507F}\x{5080}\x{5082}\x{5083}' . +'\x{5084}\x{5085}\x{5086}\x{5087}\x{5088}\x{5089}\x{508A}\x{508B}\x{508C}' . +'\x{508D}\x{508E}\x{508F}\x{5090}\x{5091}\x{5092}\x{5094}\x{5095}\x{5096}' . +'\x{5098}\x{5099}\x{509A}\x{509B}\x{509C}\x{509D}\x{509E}\x{50A2}\x{50A3}' . +'\x{50A4}\x{50A5}\x{50A6}\x{50A7}\x{50A8}\x{50A9}\x{50AA}\x{50AB}\x{50AC}' . +'\x{50AD}\x{50AE}\x{50AF}\x{50B0}\x{50B1}\x{50B2}\x{50B3}\x{50B4}\x{50B5}' . +'\x{50B6}\x{50B7}\x{50B8}\x{50BA}\x{50BB}\x{50BC}\x{50BD}\x{50BE}\x{50BF}' . +'\x{50C0}\x{50C1}\x{50C2}\x{50C4}\x{50C5}\x{50C6}\x{50C7}\x{50C8}\x{50C9}' . +'\x{50CA}\x{50CB}\x{50CC}\x{50CD}\x{50CE}\x{50CF}\x{50D0}\x{50D1}\x{50D2}' . +'\x{50D3}\x{50D4}\x{50D5}\x{50D6}\x{50D7}\x{50D9}\x{50DA}\x{50DB}\x{50DC}' . +'\x{50DD}\x{50DE}\x{50E0}\x{50E3}\x{50E4}\x{50E5}\x{50E6}\x{50E7}\x{50E8}' . +'\x{50E9}\x{50EA}\x{50EC}\x{50ED}\x{50EE}\x{50EF}\x{50F0}\x{50F1}\x{50F2}' . +'\x{50F3}\x{50F5}\x{50F6}\x{50F8}\x{50F9}\x{50FA}\x{50FB}\x{50FC}\x{50FD}' . +'\x{50FE}\x{50FF}\x{5100}\x{5101}\x{5102}\x{5103}\x{5104}\x{5105}\x{5106}' . +'\x{5107}\x{5108}\x{5109}\x{510A}\x{510B}\x{510C}\x{510D}\x{510E}\x{510F}' . +'\x{5110}\x{5111}\x{5112}\x{5113}\x{5114}\x{5115}\x{5116}\x{5117}\x{5118}' . +'\x{5119}\x{511A}\x{511C}\x{511D}\x{511E}\x{511F}\x{5120}\x{5121}\x{5122}' . +'\x{5123}\x{5124}\x{5125}\x{5126}\x{5127}\x{5129}\x{512A}\x{512C}\x{512D}' . +'\x{512E}\x{512F}\x{5130}\x{5131}\x{5132}\x{5133}\x{5134}\x{5135}\x{5136}' . +'\x{5137}\x{5138}\x{5139}\x{513A}\x{513B}\x{513C}\x{513D}\x{513E}\x{513F}' . +'\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' . +'\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5151}\x{5152}\x{5154}\x{5155}' . +'\x{5156}\x{5157}\x{5159}\x{515A}\x{515B}\x{515C}\x{515D}\x{515E}\x{515F}' . +'\x{5161}\x{5162}\x{5163}\x{5165}\x{5166}\x{5167}\x{5168}\x{5169}\x{516A}' . +'\x{516B}\x{516C}\x{516D}\x{516E}\x{516F}\x{5170}\x{5171}\x{5173}\x{5174}' . +'\x{5175}\x{5176}\x{5177}\x{5178}\x{5179}\x{517A}\x{517B}\x{517C}\x{517D}' . +'\x{517F}\x{5180}\x{5181}\x{5182}\x{5185}\x{5186}\x{5187}\x{5188}\x{5189}' . +'\x{518A}\x{518B}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}\x{5193}' . +'\x{5194}\x{5195}\x{5196}\x{5197}\x{5198}\x{5199}\x{519A}\x{519B}\x{519C}' . +'\x{519D}\x{519E}\x{519F}\x{51A0}\x{51A2}\x{51A4}\x{51A5}\x{51A6}\x{51A7}' . +'\x{51A8}\x{51AA}\x{51AB}\x{51AC}\x{51AE}\x{51AF}\x{51B0}\x{51B1}\x{51B2}' . +'\x{51B3}\x{51B5}\x{51B6}\x{51B7}\x{51B9}\x{51BB}\x{51BC}\x{51BD}\x{51BE}' . +'\x{51BF}\x{51C0}\x{51C1}\x{51C3}\x{51C4}\x{51C5}\x{51C6}\x{51C7}\x{51C8}' . +'\x{51C9}\x{51CA}\x{51CB}\x{51CC}\x{51CD}\x{51CE}\x{51CF}\x{51D0}\x{51D1}' . +'\x{51D4}\x{51D5}\x{51D6}\x{51D7}\x{51D8}\x{51D9}\x{51DA}\x{51DB}\x{51DC}' . +'\x{51DD}\x{51DE}\x{51E0}\x{51E1}\x{51E2}\x{51E3}\x{51E4}\x{51E5}\x{51E7}' . +'\x{51E8}\x{51E9}\x{51EA}\x{51EB}\x{51ED}\x{51EF}\x{51F0}\x{51F1}\x{51F3}' . +'\x{51F4}\x{51F5}\x{51F6}\x{51F7}\x{51F8}\x{51F9}\x{51FA}\x{51FB}\x{51FC}' . +'\x{51FD}\x{51FE}\x{51FF}\x{5200}\x{5201}\x{5202}\x{5203}\x{5204}\x{5205}' . +'\x{5206}\x{5207}\x{5208}\x{5209}\x{520A}\x{520B}\x{520C}\x{520D}\x{520E}' . +'\x{520F}\x{5210}\x{5211}\x{5212}\x{5213}\x{5214}\x{5215}\x{5216}\x{5217}' . +'\x{5218}\x{5219}\x{521A}\x{521B}\x{521C}\x{521D}\x{521E}\x{521F}\x{5220}' . +'\x{5221}\x{5222}\x{5223}\x{5224}\x{5225}\x{5226}\x{5228}\x{5229}\x{522A}' . +'\x{522B}\x{522C}\x{522D}\x{522E}\x{522F}\x{5230}\x{5231}\x{5232}\x{5233}' . +'\x{5234}\x{5235}\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{523C}' . +'\x{523D}\x{523E}\x{523F}\x{5240}\x{5241}\x{5242}\x{5243}\x{5244}\x{5245}' . +'\x{5246}\x{5247}\x{5248}\x{5249}\x{524A}\x{524B}\x{524C}\x{524D}\x{524E}' . +'\x{5250}\x{5251}\x{5252}\x{5254}\x{5255}\x{5256}\x{5257}\x{5258}\x{5259}' . +'\x{525A}\x{525B}\x{525C}\x{525D}\x{525E}\x{525F}\x{5260}\x{5261}\x{5262}' . +'\x{5263}\x{5264}\x{5265}\x{5267}\x{5268}\x{5269}\x{526A}\x{526B}\x{526C}' . +'\x{526D}\x{526E}\x{526F}\x{5270}\x{5272}\x{5273}\x{5274}\x{5275}\x{5276}' . +'\x{5277}\x{5278}\x{527A}\x{527B}\x{527C}\x{527D}\x{527E}\x{527F}\x{5280}' . +'\x{5281}\x{5282}\x{5283}\x{5284}\x{5286}\x{5287}\x{5288}\x{5289}\x{528A}' . +'\x{528B}\x{528C}\x{528D}\x{528F}\x{5290}\x{5291}\x{5292}\x{5293}\x{5294}' . +'\x{5295}\x{5296}\x{5297}\x{5298}\x{5299}\x{529A}\x{529B}\x{529C}\x{529D}' . +'\x{529E}\x{529F}\x{52A0}\x{52A1}\x{52A2}\x{52A3}\x{52A5}\x{52A6}\x{52A7}' . +'\x{52A8}\x{52A9}\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52AE}\x{52AF}\x{52B0}' . +'\x{52B1}\x{52B2}\x{52B3}\x{52B4}\x{52B5}\x{52B6}\x{52B7}\x{52B8}\x{52B9}' . +'\x{52BA}\x{52BB}\x{52BC}\x{52BD}\x{52BE}\x{52BF}\x{52C0}\x{52C1}\x{52C2}' . +'\x{52C3}\x{52C6}\x{52C7}\x{52C9}\x{52CA}\x{52CB}\x{52CD}\x{52CF}\x{52D0}' . +'\x{52D2}\x{52D3}\x{52D5}\x{52D6}\x{52D7}\x{52D8}\x{52D9}\x{52DA}\x{52DB}' . +'\x{52DC}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}\x{52E4}\x{52E6}' . +'\x{52E7}\x{52E8}\x{52E9}\x{52EA}\x{52EB}\x{52EC}\x{52ED}\x{52EF}\x{52F0}' . +'\x{52F1}\x{52F2}\x{52F3}\x{52F4}\x{52F5}\x{52F6}\x{52F7}\x{52F8}\x{52F9}' . +'\x{52FA}\x{52FB}\x{52FC}\x{52FD}\x{52FE}\x{52FF}\x{5300}\x{5301}\x{5302}' . +'\x{5305}\x{5306}\x{5307}\x{5308}\x{5309}\x{530A}\x{530B}\x{530C}\x{530D}' . +'\x{530E}\x{530F}\x{5310}\x{5311}\x{5312}\x{5313}\x{5314}\x{5315}\x{5316}' . +'\x{5317}\x{5319}\x{531A}\x{531C}\x{531D}\x{531F}\x{5320}\x{5321}\x{5322}' . +'\x{5323}\x{5324}\x{5325}\x{5326}\x{5328}\x{532A}\x{532B}\x{532C}\x{532D}' . +'\x{532E}\x{532F}\x{5330}\x{5331}\x{5333}\x{5334}\x{5337}\x{5339}\x{533A}' . +'\x{533B}\x{533C}\x{533D}\x{533E}\x{533F}\x{5340}\x{5341}\x{5343}\x{5344}' . +'\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}\x{534A}\x{534B}\x{534C}\x{534D}' . +'\x{534E}\x{534F}\x{5350}\x{5351}\x{5352}\x{5353}\x{5354}\x{5355}\x{5356}' . +'\x{5357}\x{5358}\x{5359}\x{535A}\x{535C}\x{535E}\x{535F}\x{5360}\x{5361}' . +'\x{5362}\x{5363}\x{5364}\x{5365}\x{5366}\x{5367}\x{5369}\x{536B}\x{536C}' . +'\x{536E}\x{536F}\x{5370}\x{5371}\x{5372}\x{5373}\x{5374}\x{5375}\x{5376}' . +'\x{5377}\x{5378}\x{5379}\x{537A}\x{537B}\x{537C}\x{537D}\x{537E}\x{537F}' . +'\x{5381}\x{5382}\x{5383}\x{5384}\x{5385}\x{5386}\x{5387}\x{5388}\x{5389}' . +'\x{538A}\x{538B}\x{538C}\x{538D}\x{538E}\x{538F}\x{5390}\x{5391}\x{5392}' . +'\x{5393}\x{5394}\x{5395}\x{5396}\x{5397}\x{5398}\x{5399}\x{539A}\x{539B}' . +'\x{539C}\x{539D}\x{539E}\x{539F}\x{53A0}\x{53A2}\x{53A3}\x{53A4}\x{53A5}' . +'\x{53A6}\x{53A7}\x{53A8}\x{53A9}\x{53AC}\x{53AD}\x{53AE}\x{53B0}\x{53B1}' . +'\x{53B2}\x{53B3}\x{53B4}\x{53B5}\x{53B6}\x{53B7}\x{53B8}\x{53B9}\x{53BB}' . +'\x{53BC}\x{53BD}\x{53BE}\x{53BF}\x{53C0}\x{53C1}\x{53C2}\x{53C3}\x{53C4}' . +'\x{53C6}\x{53C7}\x{53C8}\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}' . +'\x{53D0}\x{53D1}\x{53D2}\x{53D3}\x{53D4}\x{53D5}\x{53D6}\x{53D7}\x{53D8}' . +'\x{53D9}\x{53DB}\x{53DC}\x{53DF}\x{53E0}\x{53E1}\x{53E2}\x{53E3}\x{53E4}' . +'\x{53E5}\x{53E6}\x{53E8}\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}' . +'\x{53EF}\x{53F0}\x{53F1}\x{53F2}\x{53F3}\x{53F4}\x{53F5}\x{53F6}\x{53F7}' . +'\x{53F8}\x{53F9}\x{53FA}\x{53FB}\x{53FC}\x{53FD}\x{53FE}\x{5401}\x{5402}' . +'\x{5403}\x{5404}\x{5405}\x{5406}\x{5407}\x{5408}\x{5409}\x{540A}\x{540B}' . +'\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}\x{5411}\x{5412}\x{5413}\x{5414}' . +'\x{5415}\x{5416}\x{5417}\x{5418}\x{5419}\x{541B}\x{541C}\x{541D}\x{541E}' . +'\x{541F}\x{5420}\x{5421}\x{5423}\x{5424}\x{5425}\x{5426}\x{5427}\x{5428}' . +'\x{5429}\x{542A}\x{542B}\x{542C}\x{542D}\x{542E}\x{542F}\x{5430}\x{5431}' . +'\x{5432}\x{5433}\x{5434}\x{5435}\x{5436}\x{5437}\x{5438}\x{5439}\x{543A}' . +'\x{543B}\x{543C}\x{543D}\x{543E}\x{543F}\x{5440}\x{5441}\x{5442}\x{5443}' . +'\x{5444}\x{5445}\x{5446}\x{5447}\x{5448}\x{5449}\x{544A}\x{544B}\x{544D}' . +'\x{544E}\x{544F}\x{5450}\x{5451}\x{5452}\x{5453}\x{5454}\x{5455}\x{5456}' . +'\x{5457}\x{5458}\x{5459}\x{545A}\x{545B}\x{545C}\x{545E}\x{545F}\x{5460}' . +'\x{5461}\x{5462}\x{5463}\x{5464}\x{5465}\x{5466}\x{5467}\x{5468}\x{546A}' . +'\x{546B}\x{546C}\x{546D}\x{546E}\x{546F}\x{5470}\x{5471}\x{5472}\x{5473}' . +'\x{5474}\x{5475}\x{5476}\x{5477}\x{5478}\x{5479}\x{547A}\x{547B}\x{547C}' . +'\x{547D}\x{547E}\x{547F}\x{5480}\x{5481}\x{5482}\x{5483}\x{5484}\x{5485}' . +'\x{5486}\x{5487}\x{5488}\x{5489}\x{548B}\x{548C}\x{548D}\x{548E}\x{548F}' . +'\x{5490}\x{5491}\x{5492}\x{5493}\x{5494}\x{5495}\x{5496}\x{5497}\x{5498}' . +'\x{5499}\x{549A}\x{549B}\x{549C}\x{549D}\x{549E}\x{549F}\x{54A0}\x{54A1}' . +'\x{54A2}\x{54A3}\x{54A4}\x{54A5}\x{54A6}\x{54A7}\x{54A8}\x{54A9}\x{54AA}' . +'\x{54AB}\x{54AC}\x{54AD}\x{54AE}\x{54AF}\x{54B0}\x{54B1}\x{54B2}\x{54B3}' . +'\x{54B4}\x{54B6}\x{54B7}\x{54B8}\x{54B9}\x{54BA}\x{54BB}\x{54BC}\x{54BD}' . +'\x{54BE}\x{54BF}\x{54C0}\x{54C1}\x{54C2}\x{54C3}\x{54C4}\x{54C5}\x{54C6}' . +'\x{54C7}\x{54C8}\x{54C9}\x{54CA}\x{54CB}\x{54CC}\x{54CD}\x{54CE}\x{54CF}' . +'\x{54D0}\x{54D1}\x{54D2}\x{54D3}\x{54D4}\x{54D5}\x{54D6}\x{54D7}\x{54D8}' . +'\x{54D9}\x{54DA}\x{54DB}\x{54DC}\x{54DD}\x{54DE}\x{54DF}\x{54E0}\x{54E1}' . +'\x{54E2}\x{54E3}\x{54E4}\x{54E5}\x{54E6}\x{54E7}\x{54E8}\x{54E9}\x{54EA}' . +'\x{54EB}\x{54EC}\x{54ED}\x{54EE}\x{54EF}\x{54F0}\x{54F1}\x{54F2}\x{54F3}' . +'\x{54F4}\x{54F5}\x{54F7}\x{54F8}\x{54F9}\x{54FA}\x{54FB}\x{54FC}\x{54FD}' . +'\x{54FE}\x{54FF}\x{5500}\x{5501}\x{5502}\x{5503}\x{5504}\x{5505}\x{5506}' . +'\x{5507}\x{5508}\x{5509}\x{550A}\x{550B}\x{550C}\x{550D}\x{550E}\x{550F}' . +'\x{5510}\x{5511}\x{5512}\x{5513}\x{5514}\x{5516}\x{5517}\x{551A}\x{551B}' . +'\x{551C}\x{551D}\x{551E}\x{551F}\x{5520}\x{5521}\x{5522}\x{5523}\x{5524}' . +'\x{5525}\x{5526}\x{5527}\x{5528}\x{5529}\x{552A}\x{552B}\x{552C}\x{552D}' . +'\x{552E}\x{552F}\x{5530}\x{5531}\x{5532}\x{5533}\x{5534}\x{5535}\x{5536}' . +'\x{5537}\x{5538}\x{5539}\x{553A}\x{553B}\x{553C}\x{553D}\x{553E}\x{553F}' . +'\x{5540}\x{5541}\x{5542}\x{5543}\x{5544}\x{5545}\x{5546}\x{5548}\x{5549}' . +'\x{554A}\x{554B}\x{554C}\x{554D}\x{554E}\x{554F}\x{5550}\x{5551}\x{5552}' . +'\x{5553}\x{5554}\x{5555}\x{5556}\x{5557}\x{5558}\x{5559}\x{555A}\x{555B}' . +'\x{555C}\x{555D}\x{555E}\x{555F}\x{5561}\x{5562}\x{5563}\x{5564}\x{5565}' . +'\x{5566}\x{5567}\x{5568}\x{5569}\x{556A}\x{556B}\x{556C}\x{556D}\x{556E}' . +'\x{556F}\x{5570}\x{5571}\x{5572}\x{5573}\x{5574}\x{5575}\x{5576}\x{5577}' . +'\x{5578}\x{5579}\x{557B}\x{557C}\x{557D}\x{557E}\x{557F}\x{5580}\x{5581}' . +'\x{5582}\x{5583}\x{5584}\x{5585}\x{5586}\x{5587}\x{5588}\x{5589}\x{558A}' . +'\x{558B}\x{558C}\x{558D}\x{558E}\x{558F}\x{5590}\x{5591}\x{5592}\x{5593}' . +'\x{5594}\x{5595}\x{5596}\x{5597}\x{5598}\x{5599}\x{559A}\x{559B}\x{559C}' . +'\x{559D}\x{559E}\x{559F}\x{55A0}\x{55A1}\x{55A2}\x{55A3}\x{55A4}\x{55A5}' . +'\x{55A6}\x{55A7}\x{55A8}\x{55A9}\x{55AA}\x{55AB}\x{55AC}\x{55AD}\x{55AE}' . +'\x{55AF}\x{55B0}\x{55B1}\x{55B2}\x{55B3}\x{55B4}\x{55B5}\x{55B6}\x{55B7}' . +'\x{55B8}\x{55B9}\x{55BA}\x{55BB}\x{55BC}\x{55BD}\x{55BE}\x{55BF}\x{55C0}' . +'\x{55C1}\x{55C2}\x{55C3}\x{55C4}\x{55C5}\x{55C6}\x{55C7}\x{55C8}\x{55C9}' . +'\x{55CA}\x{55CB}\x{55CC}\x{55CD}\x{55CE}\x{55CF}\x{55D0}\x{55D1}\x{55D2}' . +'\x{55D3}\x{55D4}\x{55D5}\x{55D6}\x{55D7}\x{55D8}\x{55D9}\x{55DA}\x{55DB}' . +'\x{55DC}\x{55DD}\x{55DE}\x{55DF}\x{55E1}\x{55E2}\x{55E3}\x{55E4}\x{55E5}' . +'\x{55E6}\x{55E7}\x{55E8}\x{55E9}\x{55EA}\x{55EB}\x{55EC}\x{55ED}\x{55EE}' . +'\x{55EF}\x{55F0}\x{55F1}\x{55F2}\x{55F3}\x{55F4}\x{55F5}\x{55F6}\x{55F7}' . +'\x{55F9}\x{55FA}\x{55FB}\x{55FC}\x{55FD}\x{55FE}\x{55FF}\x{5600}\x{5601}' . +'\x{5602}\x{5603}\x{5604}\x{5606}\x{5607}\x{5608}\x{5609}\x{560C}\x{560D}' . +'\x{560E}\x{560F}\x{5610}\x{5611}\x{5612}\x{5613}\x{5614}\x{5615}\x{5616}' . +'\x{5617}\x{5618}\x{5619}\x{561A}\x{561B}\x{561C}\x{561D}\x{561E}\x{561F}' . +'\x{5621}\x{5622}\x{5623}\x{5624}\x{5625}\x{5626}\x{5627}\x{5628}\x{5629}' . +'\x{562A}\x{562C}\x{562D}\x{562E}\x{562F}\x{5630}\x{5631}\x{5632}\x{5633}' . +'\x{5634}\x{5635}\x{5636}\x{5638}\x{5639}\x{563A}\x{563B}\x{563D}\x{563E}' . +'\x{563F}\x{5640}\x{5641}\x{5642}\x{5643}\x{5645}\x{5646}\x{5647}\x{5648}' . +'\x{5649}\x{564A}\x{564C}\x{564D}\x{564E}\x{564F}\x{5650}\x{5652}\x{5653}' . +'\x{5654}\x{5655}\x{5657}\x{5658}\x{5659}\x{565A}\x{565B}\x{565C}\x{565D}' . +'\x{565E}\x{5660}\x{5662}\x{5663}\x{5664}\x{5665}\x{5666}\x{5667}\x{5668}' . +'\x{5669}\x{566A}\x{566B}\x{566C}\x{566D}\x{566E}\x{566F}\x{5670}\x{5671}' . +'\x{5672}\x{5673}\x{5674}\x{5676}\x{5677}\x{5678}\x{5679}\x{567A}\x{567B}' . +'\x{567C}\x{567E}\x{567F}\x{5680}\x{5681}\x{5682}\x{5683}\x{5684}\x{5685}' . +'\x{5686}\x{5687}\x{568A}\x{568C}\x{568D}\x{568E}\x{568F}\x{5690}\x{5691}' . +'\x{5692}\x{5693}\x{5694}\x{5695}\x{5697}\x{5698}\x{5699}\x{569A}\x{569B}' . +'\x{569C}\x{569D}\x{569F}\x{56A0}\x{56A1}\x{56A3}\x{56A4}\x{56A5}\x{56A6}' . +'\x{56A7}\x{56A8}\x{56A9}\x{56AA}\x{56AB}\x{56AC}\x{56AD}\x{56AE}\x{56AF}' . +'\x{56B0}\x{56B1}\x{56B2}\x{56B3}\x{56B4}\x{56B5}\x{56B6}\x{56B7}\x{56B8}' . +'\x{56B9}\x{56BB}\x{56BC}\x{56BD}\x{56BE}\x{56BF}\x{56C0}\x{56C1}\x{56C2}' . +'\x{56C3}\x{56C4}\x{56C5}\x{56C6}\x{56C7}\x{56C8}\x{56C9}\x{56CA}\x{56CB}' . +'\x{56CC}\x{56CD}\x{56CE}\x{56D0}\x{56D1}\x{56D2}\x{56D3}\x{56D4}\x{56D5}' . +'\x{56D6}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DC}\x{56DD}\x{56DE}\x{56DF}' . +'\x{56E0}\x{56E1}\x{56E2}\x{56E3}\x{56E4}\x{56E5}\x{56E7}\x{56E8}\x{56E9}' . +'\x{56EA}\x{56EB}\x{56EC}\x{56ED}\x{56EE}\x{56EF}\x{56F0}\x{56F1}\x{56F2}' . +'\x{56F3}\x{56F4}\x{56F5}\x{56F7}\x{56F9}\x{56FA}\x{56FD}\x{56FE}\x{56FF}' . +'\x{5700}\x{5701}\x{5702}\x{5703}\x{5704}\x{5706}\x{5707}\x{5708}\x{5709}' . +'\x{570A}\x{570B}\x{570C}\x{570D}\x{570E}\x{570F}\x{5710}\x{5712}\x{5713}' . +'\x{5714}\x{5715}\x{5716}\x{5718}\x{5719}\x{571A}\x{571B}\x{571C}\x{571D}' . +'\x{571E}\x{571F}\x{5720}\x{5722}\x{5723}\x{5725}\x{5726}\x{5727}\x{5728}' . +'\x{5729}\x{572A}\x{572B}\x{572C}\x{572D}\x{572E}\x{572F}\x{5730}\x{5731}' . +'\x{5732}\x{5733}\x{5734}\x{5735}\x{5736}\x{5737}\x{5738}\x{5739}\x{573A}' . +'\x{573B}\x{573C}\x{573E}\x{573F}\x{5740}\x{5741}\x{5742}\x{5744}\x{5745}' . +'\x{5746}\x{5747}\x{5749}\x{574A}\x{574B}\x{574C}\x{574D}\x{574E}\x{574F}' . +'\x{5750}\x{5751}\x{5752}\x{5753}\x{5754}\x{5757}\x{5759}\x{575A}\x{575B}' . +'\x{575C}\x{575D}\x{575E}\x{575F}\x{5760}\x{5761}\x{5762}\x{5764}\x{5765}' . +'\x{5766}\x{5767}\x{5768}\x{5769}\x{576A}\x{576B}\x{576C}\x{576D}\x{576F}' . +'\x{5770}\x{5771}\x{5772}\x{5773}\x{5774}\x{5775}\x{5776}\x{5777}\x{5779}' . +'\x{577A}\x{577B}\x{577C}\x{577D}\x{577E}\x{577F}\x{5780}\x{5782}\x{5783}' . +'\x{5784}\x{5785}\x{5786}\x{5788}\x{5789}\x{578A}\x{578B}\x{578C}\x{578D}' . +'\x{578E}\x{578F}\x{5790}\x{5791}\x{5792}\x{5793}\x{5794}\x{5795}\x{5797}' . +'\x{5798}\x{5799}\x{579A}\x{579B}\x{579C}\x{579D}\x{579E}\x{579F}\x{57A0}' . +'\x{57A1}\x{57A2}\x{57A3}\x{57A4}\x{57A5}\x{57A6}\x{57A7}\x{57A9}\x{57AA}' . +'\x{57AB}\x{57AC}\x{57AD}\x{57AE}\x{57AF}\x{57B0}\x{57B1}\x{57B2}\x{57B3}' . +'\x{57B4}\x{57B5}\x{57B6}\x{57B7}\x{57B8}\x{57B9}\x{57BA}\x{57BB}\x{57BC}' . +'\x{57BD}\x{57BE}\x{57BF}\x{57C0}\x{57C1}\x{57C2}\x{57C3}\x{57C4}\x{57C5}' . +'\x{57C6}\x{57C7}\x{57C8}\x{57C9}\x{57CB}\x{57CC}\x{57CD}\x{57CE}\x{57CF}' . +'\x{57D0}\x{57D2}\x{57D3}\x{57D4}\x{57D5}\x{57D6}\x{57D8}\x{57D9}\x{57DA}' . +'\x{57DC}\x{57DD}\x{57DF}\x{57E0}\x{57E1}\x{57E2}\x{57E3}\x{57E4}\x{57E5}' . +'\x{57E6}\x{57E7}\x{57E8}\x{57E9}\x{57EA}\x{57EB}\x{57EC}\x{57ED}\x{57EE}' . +'\x{57EF}\x{57F0}\x{57F1}\x{57F2}\x{57F3}\x{57F4}\x{57F5}\x{57F6}\x{57F7}' . +'\x{57F8}\x{57F9}\x{57FA}\x{57FB}\x{57FC}\x{57FD}\x{57FE}\x{57FF}\x{5800}' . +'\x{5801}\x{5802}\x{5803}\x{5804}\x{5805}\x{5806}\x{5807}\x{5808}\x{5809}' . +'\x{580A}\x{580B}\x{580C}\x{580D}\x{580E}\x{580F}\x{5810}\x{5811}\x{5812}' . +'\x{5813}\x{5814}\x{5815}\x{5816}\x{5819}\x{581A}\x{581B}\x{581C}\x{581D}' . +'\x{581E}\x{581F}\x{5820}\x{5821}\x{5822}\x{5823}\x{5824}\x{5825}\x{5826}' . +'\x{5827}\x{5828}\x{5829}\x{582A}\x{582B}\x{582C}\x{582D}\x{582E}\x{582F}' . +'\x{5830}\x{5831}\x{5832}\x{5833}\x{5834}\x{5835}\x{5836}\x{5837}\x{5838}' . +'\x{5839}\x{583A}\x{583B}\x{583C}\x{583D}\x{583E}\x{583F}\x{5840}\x{5842}' . +'\x{5843}\x{5844}\x{5845}\x{5846}\x{5847}\x{5848}\x{5849}\x{584A}\x{584B}' . +'\x{584C}\x{584D}\x{584E}\x{584F}\x{5851}\x{5852}\x{5853}\x{5854}\x{5855}' . +'\x{5857}\x{5858}\x{5859}\x{585A}\x{585B}\x{585C}\x{585D}\x{585E}\x{585F}' . +'\x{5861}\x{5862}\x{5863}\x{5864}\x{5865}\x{5868}\x{5869}\x{586A}\x{586B}' . +'\x{586C}\x{586D}\x{586E}\x{586F}\x{5870}\x{5871}\x{5872}\x{5873}\x{5874}' . +'\x{5875}\x{5876}\x{5878}\x{5879}\x{587A}\x{587B}\x{587C}\x{587D}\x{587E}' . +'\x{587F}\x{5880}\x{5881}\x{5882}\x{5883}\x{5884}\x{5885}\x{5886}\x{5887}' . +'\x{5888}\x{5889}\x{588A}\x{588B}\x{588C}\x{588D}\x{588E}\x{588F}\x{5890}' . +'\x{5891}\x{5892}\x{5893}\x{5894}\x{5896}\x{5897}\x{5898}\x{5899}\x{589A}' . +'\x{589B}\x{589C}\x{589D}\x{589E}\x{589F}\x{58A0}\x{58A1}\x{58A2}\x{58A3}' . +'\x{58A4}\x{58A5}\x{58A6}\x{58A7}\x{58A8}\x{58A9}\x{58AB}\x{58AC}\x{58AD}' . +'\x{58AE}\x{58AF}\x{58B0}\x{58B1}\x{58B2}\x{58B3}\x{58B4}\x{58B7}\x{58B8}' . +'\x{58B9}\x{58BA}\x{58BB}\x{58BC}\x{58BD}\x{58BE}\x{58BF}\x{58C1}\x{58C2}' . +'\x{58C5}\x{58C6}\x{58C7}\x{58C8}\x{58C9}\x{58CA}\x{58CB}\x{58CE}\x{58CF}' . +'\x{58D1}\x{58D2}\x{58D3}\x{58D4}\x{58D5}\x{58D6}\x{58D7}\x{58D8}\x{58D9}' . +'\x{58DA}\x{58DB}\x{58DD}\x{58DE}\x{58DF}\x{58E0}\x{58E2}\x{58E3}\x{58E4}' . +'\x{58E5}\x{58E7}\x{58E8}\x{58E9}\x{58EA}\x{58EB}\x{58EC}\x{58ED}\x{58EE}' . +'\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F3}\x{58F4}\x{58F6}\x{58F7}\x{58F8}' . +'\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{58FE}\x{58FF}\x{5900}\x{5902}' . +'\x{5903}\x{5904}\x{5906}\x{5907}\x{5909}\x{590A}\x{590B}\x{590C}\x{590D}' . +'\x{590E}\x{590F}\x{5910}\x{5912}\x{5914}\x{5915}\x{5916}\x{5917}\x{5918}' . +'\x{5919}\x{591A}\x{591B}\x{591C}\x{591D}\x{591E}\x{591F}\x{5920}\x{5921}' . +'\x{5922}\x{5924}\x{5925}\x{5926}\x{5927}\x{5928}\x{5929}\x{592A}\x{592B}' . +'\x{592C}\x{592D}\x{592E}\x{592F}\x{5930}\x{5931}\x{5932}\x{5934}\x{5935}' . +'\x{5937}\x{5938}\x{5939}\x{593A}\x{593B}\x{593C}\x{593D}\x{593E}\x{593F}' . +'\x{5940}\x{5941}\x{5942}\x{5943}\x{5944}\x{5945}\x{5946}\x{5947}\x{5948}' . +'\x{5949}\x{594A}\x{594B}\x{594C}\x{594D}\x{594E}\x{594F}\x{5950}\x{5951}' . +'\x{5952}\x{5953}\x{5954}\x{5955}\x{5956}\x{5957}\x{5958}\x{595A}\x{595C}' . +'\x{595D}\x{595E}\x{595F}\x{5960}\x{5961}\x{5962}\x{5963}\x{5964}\x{5965}' . +'\x{5966}\x{5967}\x{5968}\x{5969}\x{596A}\x{596B}\x{596C}\x{596D}\x{596E}' . +'\x{596F}\x{5970}\x{5971}\x{5972}\x{5973}\x{5974}\x{5975}\x{5976}\x{5977}' . +'\x{5978}\x{5979}\x{597A}\x{597B}\x{597C}\x{597D}\x{597E}\x{597F}\x{5980}' . +'\x{5981}\x{5982}\x{5983}\x{5984}\x{5985}\x{5986}\x{5987}\x{5988}\x{5989}' . +'\x{598A}\x{598B}\x{598C}\x{598D}\x{598E}\x{598F}\x{5990}\x{5991}\x{5992}' . +'\x{5993}\x{5994}\x{5995}\x{5996}\x{5997}\x{5998}\x{5999}\x{599A}\x{599C}' . +'\x{599D}\x{599E}\x{599F}\x{59A0}\x{59A1}\x{59A2}\x{59A3}\x{59A4}\x{59A5}' . +'\x{59A6}\x{59A7}\x{59A8}\x{59A9}\x{59AA}\x{59AB}\x{59AC}\x{59AD}\x{59AE}' . +'\x{59AF}\x{59B0}\x{59B1}\x{59B2}\x{59B3}\x{59B4}\x{59B5}\x{59B6}\x{59B8}' . +'\x{59B9}\x{59BA}\x{59BB}\x{59BC}\x{59BD}\x{59BE}\x{59BF}\x{59C0}\x{59C1}' . +'\x{59C2}\x{59C3}\x{59C4}\x{59C5}\x{59C6}\x{59C7}\x{59C8}\x{59C9}\x{59CA}' . +'\x{59CB}\x{59CC}\x{59CD}\x{59CE}\x{59CF}\x{59D0}\x{59D1}\x{59D2}\x{59D3}' . +'\x{59D4}\x{59D5}\x{59D6}\x{59D7}\x{59D8}\x{59D9}\x{59DA}\x{59DB}\x{59DC}' . +'\x{59DD}\x{59DE}\x{59DF}\x{59E0}\x{59E1}\x{59E2}\x{59E3}\x{59E4}\x{59E5}' . +'\x{59E6}\x{59E8}\x{59E9}\x{59EA}\x{59EB}\x{59EC}\x{59ED}\x{59EE}\x{59EF}' . +'\x{59F0}\x{59F1}\x{59F2}\x{59F3}\x{59F4}\x{59F5}\x{59F6}\x{59F7}\x{59F8}' . +'\x{59F9}\x{59FA}\x{59FB}\x{59FC}\x{59FD}\x{59FE}\x{59FF}\x{5A00}\x{5A01}' . +'\x{5A02}\x{5A03}\x{5A04}\x{5A05}\x{5A06}\x{5A07}\x{5A08}\x{5A09}\x{5A0A}' . +'\x{5A0B}\x{5A0C}\x{5A0D}\x{5A0E}\x{5A0F}\x{5A10}\x{5A11}\x{5A12}\x{5A13}' . +'\x{5A14}\x{5A15}\x{5A16}\x{5A17}\x{5A18}\x{5A19}\x{5A1A}\x{5A1B}\x{5A1C}' . +'\x{5A1D}\x{5A1E}\x{5A1F}\x{5A20}\x{5A21}\x{5A22}\x{5A23}\x{5A25}\x{5A27}' . +'\x{5A28}\x{5A29}\x{5A2A}\x{5A2B}\x{5A2D}\x{5A2E}\x{5A2F}\x{5A31}\x{5A32}' . +'\x{5A33}\x{5A34}\x{5A35}\x{5A36}\x{5A37}\x{5A38}\x{5A39}\x{5A3A}\x{5A3B}' . +'\x{5A3C}\x{5A3D}\x{5A3E}\x{5A3F}\x{5A40}\x{5A41}\x{5A42}\x{5A43}\x{5A44}' . +'\x{5A45}\x{5A46}\x{5A47}\x{5A48}\x{5A49}\x{5A4A}\x{5A4B}\x{5A4C}\x{5A4D}' . +'\x{5A4E}\x{5A4F}\x{5A50}\x{5A51}\x{5A52}\x{5A53}\x{5A55}\x{5A56}\x{5A57}' . +'\x{5A58}\x{5A5A}\x{5A5B}\x{5A5C}\x{5A5D}\x{5A5E}\x{5A5F}\x{5A60}\x{5A61}' . +'\x{5A62}\x{5A63}\x{5A64}\x{5A65}\x{5A66}\x{5A67}\x{5A68}\x{5A69}\x{5A6A}' . +'\x{5A6B}\x{5A6C}\x{5A6D}\x{5A6E}\x{5A70}\x{5A72}\x{5A73}\x{5A74}\x{5A75}' . +'\x{5A76}\x{5A77}\x{5A78}\x{5A79}\x{5A7A}\x{5A7B}\x{5A7C}\x{5A7D}\x{5A7E}' . +'\x{5A7F}\x{5A80}\x{5A81}\x{5A82}\x{5A83}\x{5A84}\x{5A85}\x{5A86}\x{5A88}' . +'\x{5A89}\x{5A8A}\x{5A8B}\x{5A8C}\x{5A8E}\x{5A8F}\x{5A90}\x{5A91}\x{5A92}' . +'\x{5A93}\x{5A94}\x{5A95}\x{5A96}\x{5A97}\x{5A98}\x{5A99}\x{5A9A}\x{5A9B}' . +'\x{5A9C}\x{5A9D}\x{5A9E}\x{5A9F}\x{5AA0}\x{5AA1}\x{5AA2}\x{5AA3}\x{5AA4}' . +'\x{5AA5}\x{5AA6}\x{5AA7}\x{5AA8}\x{5AA9}\x{5AAA}\x{5AAC}\x{5AAD}\x{5AAE}' . +'\x{5AAF}\x{5AB0}\x{5AB1}\x{5AB2}\x{5AB3}\x{5AB4}\x{5AB5}\x{5AB6}\x{5AB7}' . +'\x{5AB8}\x{5AB9}\x{5ABA}\x{5ABB}\x{5ABC}\x{5ABD}\x{5ABE}\x{5ABF}\x{5AC0}' . +'\x{5AC1}\x{5AC2}\x{5AC3}\x{5AC4}\x{5AC5}\x{5AC6}\x{5AC7}\x{5AC8}\x{5AC9}' . +'\x{5ACA}\x{5ACB}\x{5ACC}\x{5ACD}\x{5ACE}\x{5ACF}\x{5AD1}\x{5AD2}\x{5AD4}' . +'\x{5AD5}\x{5AD6}\x{5AD7}\x{5AD8}\x{5AD9}\x{5ADA}\x{5ADB}\x{5ADC}\x{5ADD}' . +'\x{5ADE}\x{5ADF}\x{5AE0}\x{5AE1}\x{5AE2}\x{5AE3}\x{5AE4}\x{5AE5}\x{5AE6}' . +'\x{5AE7}\x{5AE8}\x{5AE9}\x{5AEA}\x{5AEB}\x{5AEC}\x{5AED}\x{5AEE}\x{5AF1}' . +'\x{5AF2}\x{5AF3}\x{5AF4}\x{5AF5}\x{5AF6}\x{5AF7}\x{5AF8}\x{5AF9}\x{5AFA}' . +'\x{5AFB}\x{5AFC}\x{5AFD}\x{5AFE}\x{5AFF}\x{5B00}\x{5B01}\x{5B02}\x{5B03}' . +'\x{5B04}\x{5B05}\x{5B06}\x{5B07}\x{5B08}\x{5B09}\x{5B0B}\x{5B0C}\x{5B0E}' . +'\x{5B0F}\x{5B10}\x{5B11}\x{5B12}\x{5B13}\x{5B14}\x{5B15}\x{5B16}\x{5B17}' . +'\x{5B18}\x{5B19}\x{5B1A}\x{5B1B}\x{5B1C}\x{5B1D}\x{5B1E}\x{5B1F}\x{5B20}' . +'\x{5B21}\x{5B22}\x{5B23}\x{5B24}\x{5B25}\x{5B26}\x{5B27}\x{5B28}\x{5B29}' . +'\x{5B2A}\x{5B2B}\x{5B2C}\x{5B2D}\x{5B2E}\x{5B2F}\x{5B30}\x{5B31}\x{5B32}' . +'\x{5B33}\x{5B34}\x{5B35}\x{5B36}\x{5B37}\x{5B38}\x{5B3A}\x{5B3B}\x{5B3C}' . +'\x{5B3D}\x{5B3E}\x{5B3F}\x{5B40}\x{5B41}\x{5B42}\x{5B43}\x{5B44}\x{5B45}' . +'\x{5B47}\x{5B48}\x{5B49}\x{5B4A}\x{5B4B}\x{5B4C}\x{5B4D}\x{5B4E}\x{5B50}' . +'\x{5B51}\x{5B53}\x{5B54}\x{5B55}\x{5B56}\x{5B57}\x{5B58}\x{5B59}\x{5B5A}' . +'\x{5B5B}\x{5B5C}\x{5B5D}\x{5B5E}\x{5B5F}\x{5B62}\x{5B63}\x{5B64}\x{5B65}' . +'\x{5B66}\x{5B67}\x{5B68}\x{5B69}\x{5B6A}\x{5B6B}\x{5B6C}\x{5B6D}\x{5B6E}' . +'\x{5B70}\x{5B71}\x{5B72}\x{5B73}\x{5B74}\x{5B75}\x{5B76}\x{5B77}\x{5B78}' . +'\x{5B7A}\x{5B7B}\x{5B7C}\x{5B7D}\x{5B7F}\x{5B80}\x{5B81}\x{5B82}\x{5B83}' . +'\x{5B84}\x{5B85}\x{5B87}\x{5B88}\x{5B89}\x{5B8A}\x{5B8B}\x{5B8C}\x{5B8D}' . +'\x{5B8E}\x{5B8F}\x{5B91}\x{5B92}\x{5B93}\x{5B94}\x{5B95}\x{5B96}\x{5B97}' . +'\x{5B98}\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9E}\x{5B9F}\x{5BA0}' . +'\x{5BA1}\x{5BA2}\x{5BA3}\x{5BA4}\x{5BA5}\x{5BA6}\x{5BA7}\x{5BA8}\x{5BAA}' . +'\x{5BAB}\x{5BAC}\x{5BAD}\x{5BAE}\x{5BAF}\x{5BB0}\x{5BB1}\x{5BB3}\x{5BB4}' . +'\x{5BB5}\x{5BB6}\x{5BB8}\x{5BB9}\x{5BBA}\x{5BBB}\x{5BBD}\x{5BBE}\x{5BBF}' . +'\x{5BC0}\x{5BC1}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BCA}' . +'\x{5BCB}\x{5BCC}\x{5BCD}\x{5BCE}\x{5BCF}\x{5BD0}\x{5BD1}\x{5BD2}\x{5BD3}' . +'\x{5BD4}\x{5BD5}\x{5BD6}\x{5BD8}\x{5BD9}\x{5BDB}\x{5BDC}\x{5BDD}\x{5BDE}' . +'\x{5BDF}\x{5BE0}\x{5BE1}\x{5BE2}\x{5BE3}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}' . +'\x{5BE8}\x{5BE9}\x{5BEA}\x{5BEB}\x{5BEC}\x{5BED}\x{5BEE}\x{5BEF}\x{5BF0}' . +'\x{5BF1}\x{5BF2}\x{5BF3}\x{5BF4}\x{5BF5}\x{5BF6}\x{5BF7}\x{5BF8}\x{5BF9}' . +'\x{5BFA}\x{5BFB}\x{5BFC}\x{5BFD}\x{5BFF}\x{5C01}\x{5C03}\x{5C04}\x{5C05}' . +'\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}\x{5C0B}\x{5C0C}\x{5C0D}\x{5C0E}' . +'\x{5C0F}\x{5C10}\x{5C11}\x{5C12}\x{5C13}\x{5C14}\x{5C15}\x{5C16}\x{5C17}' . +'\x{5C18}\x{5C19}\x{5C1A}\x{5C1C}\x{5C1D}\x{5C1E}\x{5C1F}\x{5C20}\x{5C21}' . +'\x{5C22}\x{5C24}\x{5C25}\x{5C27}\x{5C28}\x{5C2A}\x{5C2B}\x{5C2C}\x{5C2D}' . +'\x{5C2E}\x{5C2F}\x{5C30}\x{5C31}\x{5C32}\x{5C33}\x{5C34}\x{5C35}\x{5C37}' . +'\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}' . +'\x{5C41}\x{5C42}\x{5C43}\x{5C44}\x{5C45}\x{5C46}\x{5C47}\x{5C48}\x{5C49}' . +'\x{5C4A}\x{5C4B}\x{5C4C}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C52}' . +'\x{5C53}\x{5C54}\x{5C55}\x{5C56}\x{5C57}\x{5C58}\x{5C59}\x{5C5B}\x{5C5C}' . +'\x{5C5D}\x{5C5E}\x{5C5F}\x{5C60}\x{5C61}\x{5C62}\x{5C63}\x{5C64}\x{5C65}' . +'\x{5C66}\x{5C67}\x{5C68}\x{5C69}\x{5C6A}\x{5C6B}\x{5C6C}\x{5C6D}\x{5C6E}' . +'\x{5C6F}\x{5C70}\x{5C71}\x{5C72}\x{5C73}\x{5C74}\x{5C75}\x{5C76}\x{5C77}' . +'\x{5C78}\x{5C79}\x{5C7A}\x{5C7B}\x{5C7C}\x{5C7D}\x{5C7E}\x{5C7F}\x{5C80}' . +'\x{5C81}\x{5C82}\x{5C83}\x{5C84}\x{5C86}\x{5C87}\x{5C88}\x{5C89}\x{5C8A}' . +'\x{5C8B}\x{5C8C}\x{5C8D}\x{5C8E}\x{5C8F}\x{5C90}\x{5C91}\x{5C92}\x{5C93}' . +'\x{5C94}\x{5C95}\x{5C96}\x{5C97}\x{5C98}\x{5C99}\x{5C9A}\x{5C9B}\x{5C9C}' . +'\x{5C9D}\x{5C9E}\x{5C9F}\x{5CA0}\x{5CA1}\x{5CA2}\x{5CA3}\x{5CA4}\x{5CA5}' . +'\x{5CA6}\x{5CA7}\x{5CA8}\x{5CA9}\x{5CAA}\x{5CAB}\x{5CAC}\x{5CAD}\x{5CAE}' . +'\x{5CAF}\x{5CB0}\x{5CB1}\x{5CB2}\x{5CB3}\x{5CB5}\x{5CB6}\x{5CB7}\x{5CB8}' . +'\x{5CBA}\x{5CBB}\x{5CBC}\x{5CBD}\x{5CBE}\x{5CBF}\x{5CC1}\x{5CC2}\x{5CC3}' . +'\x{5CC4}\x{5CC5}\x{5CC6}\x{5CC7}\x{5CC8}\x{5CC9}\x{5CCA}\x{5CCB}\x{5CCC}' . +'\x{5CCD}\x{5CCE}\x{5CCF}\x{5CD0}\x{5CD1}\x{5CD2}\x{5CD3}\x{5CD4}\x{5CD6}' . +'\x{5CD7}\x{5CD8}\x{5CD9}\x{5CDA}\x{5CDB}\x{5CDC}\x{5CDE}\x{5CDF}\x{5CE0}' . +'\x{5CE1}\x{5CE2}\x{5CE3}\x{5CE4}\x{5CE5}\x{5CE6}\x{5CE7}\x{5CE8}\x{5CE9}' . +'\x{5CEA}\x{5CEB}\x{5CEC}\x{5CED}\x{5CEE}\x{5CEF}\x{5CF0}\x{5CF1}\x{5CF2}' . +'\x{5CF3}\x{5CF4}\x{5CF6}\x{5CF7}\x{5CF8}\x{5CF9}\x{5CFA}\x{5CFB}\x{5CFC}' . +'\x{5CFD}\x{5CFE}\x{5CFF}\x{5D00}\x{5D01}\x{5D02}\x{5D03}\x{5D04}\x{5D05}' . +'\x{5D06}\x{5D07}\x{5D08}\x{5D09}\x{5D0A}\x{5D0B}\x{5D0C}\x{5D0D}\x{5D0E}' . +'\x{5D0F}\x{5D10}\x{5D11}\x{5D12}\x{5D13}\x{5D14}\x{5D15}\x{5D16}\x{5D17}' . +'\x{5D18}\x{5D19}\x{5D1A}\x{5D1B}\x{5D1C}\x{5D1D}\x{5D1E}\x{5D1F}\x{5D20}' . +'\x{5D21}\x{5D22}\x{5D23}\x{5D24}\x{5D25}\x{5D26}\x{5D27}\x{5D28}\x{5D29}' . +'\x{5D2A}\x{5D2C}\x{5D2D}\x{5D2E}\x{5D30}\x{5D31}\x{5D32}\x{5D33}\x{5D34}' . +'\x{5D35}\x{5D36}\x{5D37}\x{5D38}\x{5D39}\x{5D3A}\x{5D3C}\x{5D3D}\x{5D3E}' . +'\x{5D3F}\x{5D40}\x{5D41}\x{5D42}\x{5D43}\x{5D44}\x{5D45}\x{5D46}\x{5D47}' . +'\x{5D48}\x{5D49}\x{5D4A}\x{5D4B}\x{5D4C}\x{5D4D}\x{5D4E}\x{5D4F}\x{5D50}' . +'\x{5D51}\x{5D52}\x{5D54}\x{5D55}\x{5D56}\x{5D58}\x{5D59}\x{5D5A}\x{5D5B}' . +'\x{5D5D}\x{5D5E}\x{5D5F}\x{5D61}\x{5D62}\x{5D63}\x{5D64}\x{5D65}\x{5D66}' . +'\x{5D67}\x{5D68}\x{5D69}\x{5D6A}\x{5D6B}\x{5D6C}\x{5D6D}\x{5D6E}\x{5D6F}' . +'\x{5D70}\x{5D71}\x{5D72}\x{5D73}\x{5D74}\x{5D75}\x{5D76}\x{5D77}\x{5D78}' . +'\x{5D79}\x{5D7A}\x{5D7B}\x{5D7C}\x{5D7D}\x{5D7E}\x{5D7F}\x{5D80}\x{5D81}' . +'\x{5D82}\x{5D84}\x{5D85}\x{5D86}\x{5D87}\x{5D88}\x{5D89}\x{5D8A}\x{5D8B}' . +'\x{5D8C}\x{5D8D}\x{5D8E}\x{5D8F}\x{5D90}\x{5D91}\x{5D92}\x{5D93}\x{5D94}' . +'\x{5D95}\x{5D97}\x{5D98}\x{5D99}\x{5D9A}\x{5D9B}\x{5D9C}\x{5D9D}\x{5D9E}' . +'\x{5D9F}\x{5DA0}\x{5DA1}\x{5DA2}\x{5DA5}\x{5DA6}\x{5DA7}\x{5DA8}\x{5DA9}' . +'\x{5DAA}\x{5DAC}\x{5DAD}\x{5DAE}\x{5DAF}\x{5DB0}\x{5DB1}\x{5DB2}\x{5DB4}' . +'\x{5DB5}\x{5DB6}\x{5DB7}\x{5DB8}\x{5DBA}\x{5DBB}\x{5DBC}\x{5DBD}\x{5DBE}' . +'\x{5DBF}\x{5DC0}\x{5DC1}\x{5DC2}\x{5DC3}\x{5DC5}\x{5DC6}\x{5DC7}\x{5DC8}' . +'\x{5DC9}\x{5DCA}\x{5DCB}\x{5DCC}\x{5DCD}\x{5DCE}\x{5DCF}\x{5DD0}\x{5DD1}' . +'\x{5DD2}\x{5DD3}\x{5DD4}\x{5DD5}\x{5DD6}\x{5DD8}\x{5DD9}\x{5DDB}\x{5DDD}' . +'\x{5DDE}\x{5DDF}\x{5DE0}\x{5DE1}\x{5DE2}\x{5DE3}\x{5DE4}\x{5DE5}\x{5DE6}' . +'\x{5DE7}\x{5DE8}\x{5DE9}\x{5DEA}\x{5DEB}\x{5DEC}\x{5DED}\x{5DEE}\x{5DEF}' . +'\x{5DF0}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DF8}\x{5DF9}' . +'\x{5DFA}\x{5DFB}\x{5DFC}\x{5DFD}\x{5DFE}\x{5DFF}\x{5E00}\x{5E01}\x{5E02}' . +'\x{5E03}\x{5E04}\x{5E05}\x{5E06}\x{5E07}\x{5E08}\x{5E09}\x{5E0A}\x{5E0B}' . +'\x{5E0C}\x{5E0D}\x{5E0E}\x{5E0F}\x{5E10}\x{5E11}\x{5E13}\x{5E14}\x{5E15}' . +'\x{5E16}\x{5E17}\x{5E18}\x{5E19}\x{5E1A}\x{5E1B}\x{5E1C}\x{5E1D}\x{5E1E}' . +'\x{5E1F}\x{5E20}\x{5E21}\x{5E22}\x{5E23}\x{5E24}\x{5E25}\x{5E26}\x{5E27}' . +'\x{5E28}\x{5E29}\x{5E2A}\x{5E2B}\x{5E2C}\x{5E2D}\x{5E2E}\x{5E2F}\x{5E30}' . +'\x{5E31}\x{5E32}\x{5E33}\x{5E34}\x{5E35}\x{5E36}\x{5E37}\x{5E38}\x{5E39}' . +'\x{5E3A}\x{5E3B}\x{5E3C}\x{5E3D}\x{5E3E}\x{5E40}\x{5E41}\x{5E42}\x{5E43}' . +'\x{5E44}\x{5E45}\x{5E46}\x{5E47}\x{5E49}\x{5E4A}\x{5E4B}\x{5E4C}\x{5E4D}' . +'\x{5E4E}\x{5E4F}\x{5E50}\x{5E52}\x{5E53}\x{5E54}\x{5E55}\x{5E56}\x{5E57}' . +'\x{5E58}\x{5E59}\x{5E5A}\x{5E5B}\x{5E5C}\x{5E5D}\x{5E5E}\x{5E5F}\x{5E60}' . +'\x{5E61}\x{5E62}\x{5E63}\x{5E64}\x{5E65}\x{5E66}\x{5E67}\x{5E68}\x{5E69}' . +'\x{5E6A}\x{5E6B}\x{5E6C}\x{5E6D}\x{5E6E}\x{5E6F}\x{5E70}\x{5E71}\x{5E72}' . +'\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E77}\x{5E78}\x{5E79}\x{5E7A}\x{5E7B}' . +'\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E80}\x{5E81}\x{5E82}\x{5E83}\x{5E84}' . +'\x{5E85}\x{5E86}\x{5E87}\x{5E88}\x{5E89}\x{5E8A}\x{5E8B}\x{5E8C}\x{5E8D}' . +'\x{5E8E}\x{5E8F}\x{5E90}\x{5E91}\x{5E93}\x{5E94}\x{5E95}\x{5E96}\x{5E97}' . +'\x{5E98}\x{5E99}\x{5E9A}\x{5E9B}\x{5E9C}\x{5E9D}\x{5E9E}\x{5E9F}\x{5EA0}' . +'\x{5EA1}\x{5EA2}\x{5EA3}\x{5EA4}\x{5EA5}\x{5EA6}\x{5EA7}\x{5EA8}\x{5EA9}' . +'\x{5EAA}\x{5EAB}\x{5EAC}\x{5EAD}\x{5EAE}\x{5EAF}\x{5EB0}\x{5EB1}\x{5EB2}' . +'\x{5EB3}\x{5EB4}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EB9}\x{5EBB}\x{5EBC}' . +'\x{5EBD}\x{5EBE}\x{5EBF}\x{5EC1}\x{5EC2}\x{5EC3}\x{5EC4}\x{5EC5}\x{5EC6}' . +'\x{5EC7}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECB}\x{5ECC}\x{5ECD}\x{5ECE}\x{5ECF}' . +'\x{5ED0}\x{5ED1}\x{5ED2}\x{5ED3}\x{5ED4}\x{5ED5}\x{5ED6}\x{5ED7}\x{5ED8}' . +'\x{5ED9}\x{5EDA}\x{5EDB}\x{5EDC}\x{5EDD}\x{5EDE}\x{5EDF}\x{5EE0}\x{5EE1}' . +'\x{5EE2}\x{5EE3}\x{5EE4}\x{5EE5}\x{5EE6}\x{5EE7}\x{5EE8}\x{5EE9}\x{5EEA}' . +'\x{5EEC}\x{5EED}\x{5EEE}\x{5EEF}\x{5EF0}\x{5EF1}\x{5EF2}\x{5EF3}\x{5EF4}' . +'\x{5EF5}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}\x{5EFB}\x{5EFC}\x{5EFD}\x{5EFE}' . +'\x{5EFF}\x{5F00}\x{5F01}\x{5F02}\x{5F03}\x{5F04}\x{5F05}\x{5F06}\x{5F07}' . +'\x{5F08}\x{5F0A}\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F11}\x{5F12}\x{5F13}' . +'\x{5F14}\x{5F15}\x{5F16}\x{5F17}\x{5F18}\x{5F19}\x{5F1A}\x{5F1B}\x{5F1C}' . +'\x{5F1D}\x{5F1E}\x{5F1F}\x{5F20}\x{5F21}\x{5F22}\x{5F23}\x{5F24}\x{5F25}' . +'\x{5F26}\x{5F27}\x{5F28}\x{5F29}\x{5F2A}\x{5F2B}\x{5F2C}\x{5F2D}\x{5F2E}' . +'\x{5F2F}\x{5F30}\x{5F31}\x{5F32}\x{5F33}\x{5F34}\x{5F35}\x{5F36}\x{5F37}' . +'\x{5F38}\x{5F39}\x{5F3A}\x{5F3C}\x{5F3E}\x{5F3F}\x{5F40}\x{5F41}\x{5F42}' . +'\x{5F43}\x{5F44}\x{5F45}\x{5F46}\x{5F47}\x{5F48}\x{5F49}\x{5F4A}\x{5F4B}' . +'\x{5F4C}\x{5F4D}\x{5F4E}\x{5F4F}\x{5F50}\x{5F51}\x{5F52}\x{5F53}\x{5F54}' . +'\x{5F55}\x{5F56}\x{5F57}\x{5F58}\x{5F59}\x{5F5A}\x{5F5B}\x{5F5C}\x{5F5D}' . +'\x{5F5E}\x{5F5F}\x{5F60}\x{5F61}\x{5F62}\x{5F63}\x{5F64}\x{5F65}\x{5F66}' . +'\x{5F67}\x{5F68}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}\x{5F6D}\x{5F6E}\x{5F6F}' . +'\x{5F70}\x{5F71}\x{5F72}\x{5F73}\x{5F74}\x{5F75}\x{5F76}\x{5F77}\x{5F78}' . +'\x{5F79}\x{5F7A}\x{5F7B}\x{5F7C}\x{5F7D}\x{5F7E}\x{5F7F}\x{5F80}\x{5F81}' . +'\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F86}\x{5F87}\x{5F88}\x{5F89}\x{5F8A}' . +'\x{5F8B}\x{5F8C}\x{5F8D}\x{5F8E}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F94}' . +'\x{5F95}\x{5F96}\x{5F97}\x{5F98}\x{5F99}\x{5F9B}\x{5F9C}\x{5F9D}\x{5F9E}' . +'\x{5F9F}\x{5FA0}\x{5FA1}\x{5FA2}\x{5FA5}\x{5FA6}\x{5FA7}\x{5FA8}\x{5FA9}' . +'\x{5FAA}\x{5FAB}\x{5FAC}\x{5FAD}\x{5FAE}\x{5FAF}\x{5FB1}\x{5FB2}\x{5FB3}' . +'\x{5FB4}\x{5FB5}\x{5FB6}\x{5FB7}\x{5FB8}\x{5FB9}\x{5FBA}\x{5FBB}\x{5FBC}' . +'\x{5FBD}\x{5FBE}\x{5FBF}\x{5FC0}\x{5FC1}\x{5FC3}\x{5FC4}\x{5FC5}\x{5FC6}' . +'\x{5FC7}\x{5FC8}\x{5FC9}\x{5FCA}\x{5FCB}\x{5FCC}\x{5FCD}\x{5FCF}\x{5FD0}' . +'\x{5FD1}\x{5FD2}\x{5FD3}\x{5FD4}\x{5FD5}\x{5FD6}\x{5FD7}\x{5FD8}\x{5FD9}' . +'\x{5FDA}\x{5FDC}\x{5FDD}\x{5FDE}\x{5FE0}\x{5FE1}\x{5FE3}\x{5FE4}\x{5FE5}' . +'\x{5FE6}\x{5FE7}\x{5FE8}\x{5FE9}\x{5FEA}\x{5FEB}\x{5FED}\x{5FEE}\x{5FEF}' . +'\x{5FF0}\x{5FF1}\x{5FF2}\x{5FF3}\x{5FF4}\x{5FF5}\x{5FF6}\x{5FF7}\x{5FF8}' . +'\x{5FF9}\x{5FFA}\x{5FFB}\x{5FFD}\x{5FFE}\x{5FFF}\x{6000}\x{6001}\x{6002}' . +'\x{6003}\x{6004}\x{6005}\x{6006}\x{6007}\x{6008}\x{6009}\x{600A}\x{600B}' . +'\x{600C}\x{600D}\x{600E}\x{600F}\x{6010}\x{6011}\x{6012}\x{6013}\x{6014}' . +'\x{6015}\x{6016}\x{6017}\x{6018}\x{6019}\x{601A}\x{601B}\x{601C}\x{601D}' . +'\x{601E}\x{601F}\x{6020}\x{6021}\x{6022}\x{6024}\x{6025}\x{6026}\x{6027}' . +'\x{6028}\x{6029}\x{602A}\x{602B}\x{602C}\x{602D}\x{602E}\x{602F}\x{6030}' . +'\x{6031}\x{6032}\x{6033}\x{6034}\x{6035}\x{6036}\x{6037}\x{6038}\x{6039}' . +'\x{603A}\x{603B}\x{603C}\x{603D}\x{603E}\x{603F}\x{6040}\x{6041}\x{6042}' . +'\x{6043}\x{6044}\x{6045}\x{6046}\x{6047}\x{6048}\x{6049}\x{604A}\x{604B}' . +'\x{604C}\x{604D}\x{604E}\x{604F}\x{6050}\x{6051}\x{6052}\x{6053}\x{6054}' . +'\x{6055}\x{6057}\x{6058}\x{6059}\x{605A}\x{605B}\x{605C}\x{605D}\x{605E}' . +'\x{605F}\x{6062}\x{6063}\x{6064}\x{6065}\x{6066}\x{6067}\x{6068}\x{6069}' . +'\x{606A}\x{606B}\x{606C}\x{606D}\x{606E}\x{606F}\x{6070}\x{6072}\x{6073}' . +'\x{6075}\x{6076}\x{6077}\x{6078}\x{6079}\x{607A}\x{607B}\x{607C}\x{607D}' . +'\x{607E}\x{607F}\x{6080}\x{6081}\x{6082}\x{6083}\x{6084}\x{6085}\x{6086}' . +'\x{6087}\x{6088}\x{6089}\x{608A}\x{608B}\x{608C}\x{608D}\x{608E}\x{608F}' . +'\x{6090}\x{6092}\x{6094}\x{6095}\x{6096}\x{6097}\x{6098}\x{6099}\x{609A}' . +'\x{609B}\x{609C}\x{609D}\x{609E}\x{609F}\x{60A0}\x{60A1}\x{60A2}\x{60A3}' . +'\x{60A4}\x{60A6}\x{60A7}\x{60A8}\x{60AA}\x{60AB}\x{60AC}\x{60AD}\x{60AE}' . +'\x{60AF}\x{60B0}\x{60B1}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B7}' . +'\x{60B8}\x{60B9}\x{60BA}\x{60BB}\x{60BC}\x{60BD}\x{60BE}\x{60BF}\x{60C0}' . +'\x{60C1}\x{60C2}\x{60C3}\x{60C4}\x{60C5}\x{60C6}\x{60C7}\x{60C8}\x{60C9}' . +'\x{60CA}\x{60CB}\x{60CC}\x{60CD}\x{60CE}\x{60CF}\x{60D0}\x{60D1}\x{60D3}' . +'\x{60D4}\x{60D5}\x{60D7}\x{60D8}\x{60D9}\x{60DA}\x{60DB}\x{60DC}\x{60DD}' . +'\x{60DF}\x{60E0}\x{60E1}\x{60E2}\x{60E4}\x{60E6}\x{60E7}\x{60E8}\x{60E9}' . +'\x{60EA}\x{60EB}\x{60EC}\x{60ED}\x{60EE}\x{60EF}\x{60F0}\x{60F1}\x{60F2}' . +'\x{60F3}\x{60F4}\x{60F5}\x{60F6}\x{60F7}\x{60F8}\x{60F9}\x{60FA}\x{60FB}' . +'\x{60FC}\x{60FE}\x{60FF}\x{6100}\x{6101}\x{6103}\x{6104}\x{6105}\x{6106}' . +'\x{6108}\x{6109}\x{610A}\x{610B}\x{610C}\x{610D}\x{610E}\x{610F}\x{6110}' . +'\x{6112}\x{6113}\x{6114}\x{6115}\x{6116}\x{6117}\x{6118}\x{6119}\x{611A}' . +'\x{611B}\x{611C}\x{611D}\x{611F}\x{6120}\x{6122}\x{6123}\x{6124}\x{6125}' . +'\x{6126}\x{6127}\x{6128}\x{6129}\x{612A}\x{612B}\x{612C}\x{612D}\x{612E}' . +'\x{612F}\x{6130}\x{6132}\x{6134}\x{6136}\x{6137}\x{613A}\x{613B}\x{613C}' . +'\x{613D}\x{613E}\x{613F}\x{6140}\x{6141}\x{6142}\x{6143}\x{6144}\x{6145}' . +'\x{6146}\x{6147}\x{6148}\x{6149}\x{614A}\x{614B}\x{614C}\x{614D}\x{614E}' . +'\x{614F}\x{6150}\x{6151}\x{6152}\x{6153}\x{6154}\x{6155}\x{6156}\x{6157}' . +'\x{6158}\x{6159}\x{615A}\x{615B}\x{615C}\x{615D}\x{615E}\x{615F}\x{6161}' . +'\x{6162}\x{6163}\x{6164}\x{6165}\x{6166}\x{6167}\x{6168}\x{6169}\x{616A}' . +'\x{616B}\x{616C}\x{616D}\x{616E}\x{6170}\x{6171}\x{6172}\x{6173}\x{6174}' . +'\x{6175}\x{6176}\x{6177}\x{6178}\x{6179}\x{617A}\x{617C}\x{617E}\x{6180}' . +'\x{6181}\x{6182}\x{6183}\x{6184}\x{6185}\x{6187}\x{6188}\x{6189}\x{618A}' . +'\x{618B}\x{618C}\x{618D}\x{618E}\x{618F}\x{6190}\x{6191}\x{6192}\x{6193}' . +'\x{6194}\x{6195}\x{6196}\x{6198}\x{6199}\x{619A}\x{619B}\x{619D}\x{619E}' . +'\x{619F}\x{61A0}\x{61A1}\x{61A2}\x{61A3}\x{61A4}\x{61A5}\x{61A6}\x{61A7}' . +'\x{61A8}\x{61A9}\x{61AA}\x{61AB}\x{61AC}\x{61AD}\x{61AE}\x{61AF}\x{61B0}' . +'\x{61B1}\x{61B2}\x{61B3}\x{61B4}\x{61B5}\x{61B6}\x{61B7}\x{61B8}\x{61BA}' . +'\x{61BC}\x{61BD}\x{61BE}\x{61BF}\x{61C0}\x{61C1}\x{61C2}\x{61C3}\x{61C4}' . +'\x{61C5}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' . +'\x{61CE}\x{61CF}\x{61D0}\x{61D1}\x{61D2}\x{61D4}\x{61D6}\x{61D7}\x{61D8}' . +'\x{61D9}\x{61DA}\x{61DB}\x{61DC}\x{61DD}\x{61DE}\x{61DF}\x{61E0}\x{61E1}' . +'\x{61E2}\x{61E3}\x{61E4}\x{61E5}\x{61E6}\x{61E7}\x{61E8}\x{61E9}\x{61EA}' . +'\x{61EB}\x{61ED}\x{61EE}\x{61F0}\x{61F1}\x{61F2}\x{61F3}\x{61F5}\x{61F6}' . +'\x{61F7}\x{61F8}\x{61F9}\x{61FA}\x{61FB}\x{61FC}\x{61FD}\x{61FE}\x{61FF}' . +'\x{6200}\x{6201}\x{6202}\x{6203}\x{6204}\x{6206}\x{6207}\x{6208}\x{6209}' . +'\x{620A}\x{620B}\x{620C}\x{620D}\x{620E}\x{620F}\x{6210}\x{6211}\x{6212}' . +'\x{6213}\x{6214}\x{6215}\x{6216}\x{6217}\x{6218}\x{6219}\x{621A}\x{621B}' . +'\x{621C}\x{621D}\x{621E}\x{621F}\x{6220}\x{6221}\x{6222}\x{6223}\x{6224}' . +'\x{6225}\x{6226}\x{6227}\x{6228}\x{6229}\x{622A}\x{622B}\x{622C}\x{622D}' . +'\x{622E}\x{622F}\x{6230}\x{6231}\x{6232}\x{6233}\x{6234}\x{6236}\x{6237}' . +'\x{6238}\x{623A}\x{623B}\x{623C}\x{623D}\x{623E}\x{623F}\x{6240}\x{6241}' . +'\x{6242}\x{6243}\x{6244}\x{6245}\x{6246}\x{6247}\x{6248}\x{6249}\x{624A}' . +'\x{624B}\x{624C}\x{624D}\x{624E}\x{624F}\x{6250}\x{6251}\x{6252}\x{6253}' . +'\x{6254}\x{6255}\x{6256}\x{6258}\x{6259}\x{625A}\x{625B}\x{625C}\x{625D}' . +'\x{625E}\x{625F}\x{6260}\x{6261}\x{6262}\x{6263}\x{6264}\x{6265}\x{6266}' . +'\x{6267}\x{6268}\x{6269}\x{626A}\x{626B}\x{626C}\x{626D}\x{626E}\x{626F}' . +'\x{6270}\x{6271}\x{6272}\x{6273}\x{6274}\x{6275}\x{6276}\x{6277}\x{6278}' . +'\x{6279}\x{627A}\x{627B}\x{627C}\x{627D}\x{627E}\x{627F}\x{6280}\x{6281}' . +'\x{6283}\x{6284}\x{6285}\x{6286}\x{6287}\x{6288}\x{6289}\x{628A}\x{628B}' . +'\x{628C}\x{628E}\x{628F}\x{6290}\x{6291}\x{6292}\x{6293}\x{6294}\x{6295}' . +'\x{6296}\x{6297}\x{6298}\x{6299}\x{629A}\x{629B}\x{629C}\x{629E}\x{629F}' . +'\x{62A0}\x{62A1}\x{62A2}\x{62A3}\x{62A4}\x{62A5}\x{62A7}\x{62A8}\x{62A9}' . +'\x{62AA}\x{62AB}\x{62AC}\x{62AD}\x{62AE}\x{62AF}\x{62B0}\x{62B1}\x{62B2}' . +'\x{62B3}\x{62B4}\x{62B5}\x{62B6}\x{62B7}\x{62B8}\x{62B9}\x{62BA}\x{62BB}' . +'\x{62BC}\x{62BD}\x{62BE}\x{62BF}\x{62C0}\x{62C1}\x{62C2}\x{62C3}\x{62C4}' . +'\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CB}\x{62CC}\x{62CD}' . +'\x{62CE}\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D5}\x{62D6}' . +'\x{62D7}\x{62D8}\x{62D9}\x{62DA}\x{62DB}\x{62DC}\x{62DD}\x{62DF}\x{62E0}' . +'\x{62E1}\x{62E2}\x{62E3}\x{62E4}\x{62E5}\x{62E6}\x{62E7}\x{62E8}\x{62E9}' . +'\x{62EB}\x{62EC}\x{62ED}\x{62EE}\x{62EF}\x{62F0}\x{62F1}\x{62F2}\x{62F3}' . +'\x{62F4}\x{62F5}\x{62F6}\x{62F7}\x{62F8}\x{62F9}\x{62FA}\x{62FB}\x{62FC}' . +'\x{62FD}\x{62FE}\x{62FF}\x{6300}\x{6301}\x{6302}\x{6303}\x{6304}\x{6305}' . +'\x{6306}\x{6307}\x{6308}\x{6309}\x{630B}\x{630C}\x{630D}\x{630E}\x{630F}' . +'\x{6310}\x{6311}\x{6312}\x{6313}\x{6314}\x{6315}\x{6316}\x{6318}\x{6319}' . +'\x{631A}\x{631B}\x{631C}\x{631D}\x{631E}\x{631F}\x{6320}\x{6321}\x{6322}' . +'\x{6323}\x{6324}\x{6325}\x{6326}\x{6327}\x{6328}\x{6329}\x{632A}\x{632B}' . +'\x{632C}\x{632D}\x{632E}\x{632F}\x{6330}\x{6332}\x{6333}\x{6334}\x{6336}' . +'\x{6338}\x{6339}\x{633A}\x{633B}\x{633C}\x{633D}\x{633E}\x{6340}\x{6341}' . +'\x{6342}\x{6343}\x{6344}\x{6345}\x{6346}\x{6347}\x{6348}\x{6349}\x{634A}' . +'\x{634B}\x{634C}\x{634D}\x{634E}\x{634F}\x{6350}\x{6351}\x{6352}\x{6353}' . +'\x{6354}\x{6355}\x{6356}\x{6357}\x{6358}\x{6359}\x{635A}\x{635C}\x{635D}' . +'\x{635E}\x{635F}\x{6360}\x{6361}\x{6362}\x{6363}\x{6364}\x{6365}\x{6366}' . +'\x{6367}\x{6368}\x{6369}\x{636A}\x{636B}\x{636C}\x{636D}\x{636E}\x{636F}' . +'\x{6370}\x{6371}\x{6372}\x{6373}\x{6374}\x{6375}\x{6376}\x{6377}\x{6378}' . +'\x{6379}\x{637A}\x{637B}\x{637C}\x{637D}\x{637E}\x{6380}\x{6381}\x{6382}' . +'\x{6383}\x{6384}\x{6385}\x{6386}\x{6387}\x{6388}\x{6389}\x{638A}\x{638C}' . +'\x{638D}\x{638E}\x{638F}\x{6390}\x{6391}\x{6392}\x{6394}\x{6395}\x{6396}' . +'\x{6397}\x{6398}\x{6399}\x{639A}\x{639B}\x{639C}\x{639D}\x{639E}\x{639F}' . +'\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A4}\x{63A5}\x{63A6}\x{63A7}\x{63A8}' . +'\x{63A9}\x{63AA}\x{63AB}\x{63AC}\x{63AD}\x{63AE}\x{63AF}\x{63B0}\x{63B1}' . +'\x{63B2}\x{63B3}\x{63B4}\x{63B5}\x{63B6}\x{63B7}\x{63B8}\x{63B9}\x{63BA}' . +'\x{63BC}\x{63BD}\x{63BE}\x{63BF}\x{63C0}\x{63C1}\x{63C2}\x{63C3}\x{63C4}' . +'\x{63C5}\x{63C6}\x{63C7}\x{63C8}\x{63C9}\x{63CA}\x{63CB}\x{63CC}\x{63CD}' . +'\x{63CE}\x{63CF}\x{63D0}\x{63D2}\x{63D3}\x{63D4}\x{63D5}\x{63D6}\x{63D7}' . +'\x{63D8}\x{63D9}\x{63DA}\x{63DB}\x{63DC}\x{63DD}\x{63DE}\x{63DF}\x{63E0}' . +'\x{63E1}\x{63E2}\x{63E3}\x{63E4}\x{63E5}\x{63E6}\x{63E7}\x{63E8}\x{63E9}' . +'\x{63EA}\x{63EB}\x{63EC}\x{63ED}\x{63EE}\x{63EF}\x{63F0}\x{63F1}\x{63F2}' . +'\x{63F3}\x{63F4}\x{63F5}\x{63F6}\x{63F7}\x{63F8}\x{63F9}\x{63FA}\x{63FB}' . +'\x{63FC}\x{63FD}\x{63FE}\x{63FF}\x{6400}\x{6401}\x{6402}\x{6403}\x{6404}' . +'\x{6405}\x{6406}\x{6408}\x{6409}\x{640A}\x{640B}\x{640C}\x{640D}\x{640E}' . +'\x{640F}\x{6410}\x{6411}\x{6412}\x{6413}\x{6414}\x{6415}\x{6416}\x{6417}' . +'\x{6418}\x{6419}\x{641A}\x{641B}\x{641C}\x{641D}\x{641E}\x{641F}\x{6420}' . +'\x{6421}\x{6422}\x{6423}\x{6424}\x{6425}\x{6426}\x{6427}\x{6428}\x{6429}' . +'\x{642A}\x{642B}\x{642C}\x{642D}\x{642E}\x{642F}\x{6430}\x{6431}\x{6432}' . +'\x{6433}\x{6434}\x{6435}\x{6436}\x{6437}\x{6438}\x{6439}\x{643A}\x{643D}' . +'\x{643E}\x{643F}\x{6440}\x{6441}\x{6443}\x{6444}\x{6445}\x{6446}\x{6447}' . +'\x{6448}\x{644A}\x{644B}\x{644C}\x{644D}\x{644E}\x{644F}\x{6450}\x{6451}' . +'\x{6452}\x{6453}\x{6454}\x{6455}\x{6456}\x{6457}\x{6458}\x{6459}\x{645B}' . +'\x{645C}\x{645D}\x{645E}\x{645F}\x{6460}\x{6461}\x{6462}\x{6463}\x{6464}' . +'\x{6465}\x{6466}\x{6467}\x{6468}\x{6469}\x{646A}\x{646B}\x{646C}\x{646D}' . +'\x{646E}\x{646F}\x{6470}\x{6471}\x{6472}\x{6473}\x{6474}\x{6475}\x{6476}' . +'\x{6477}\x{6478}\x{6479}\x{647A}\x{647B}\x{647C}\x{647D}\x{647F}\x{6480}' . +'\x{6481}\x{6482}\x{6483}\x{6484}\x{6485}\x{6487}\x{6488}\x{6489}\x{648A}' . +'\x{648B}\x{648C}\x{648D}\x{648E}\x{648F}\x{6490}\x{6491}\x{6492}\x{6493}' . +'\x{6494}\x{6495}\x{6496}\x{6497}\x{6498}\x{6499}\x{649A}\x{649B}\x{649C}' . +'\x{649D}\x{649E}\x{649F}\x{64A0}\x{64A2}\x{64A3}\x{64A4}\x{64A5}\x{64A6}' . +'\x{64A7}\x{64A8}\x{64A9}\x{64AA}\x{64AB}\x{64AC}\x{64AD}\x{64AE}\x{64B0}' . +'\x{64B1}\x{64B2}\x{64B3}\x{64B4}\x{64B5}\x{64B7}\x{64B8}\x{64B9}\x{64BA}' . +'\x{64BB}\x{64BC}\x{64BD}\x{64BE}\x{64BF}\x{64C0}\x{64C1}\x{64C2}\x{64C3}' . +'\x{64C4}\x{64C5}\x{64C6}\x{64C7}\x{64C9}\x{64CA}\x{64CB}\x{64CC}\x{64CD}' . +'\x{64CE}\x{64CF}\x{64D0}\x{64D1}\x{64D2}\x{64D3}\x{64D4}\x{64D6}\x{64D7}' . +'\x{64D8}\x{64D9}\x{64DA}\x{64DB}\x{64DC}\x{64DD}\x{64DE}\x{64DF}\x{64E0}' . +'\x{64E2}\x{64E3}\x{64E4}\x{64E6}\x{64E7}\x{64E8}\x{64E9}\x{64EA}\x{64EB}' . +'\x{64EC}\x{64ED}\x{64EF}\x{64F0}\x{64F1}\x{64F2}\x{64F3}\x{64F4}\x{64F6}' . +'\x{64F7}\x{64F8}\x{64FA}\x{64FB}\x{64FC}\x{64FD}\x{64FE}\x{64FF}\x{6500}' . +'\x{6501}\x{6503}\x{6504}\x{6505}\x{6506}\x{6507}\x{6508}\x{6509}\x{650B}' . +'\x{650C}\x{650D}\x{650E}\x{650F}\x{6510}\x{6511}\x{6512}\x{6513}\x{6514}' . +'\x{6515}\x{6516}\x{6517}\x{6518}\x{6519}\x{651A}\x{651B}\x{651C}\x{651D}' . +'\x{651E}\x{6520}\x{6521}\x{6522}\x{6523}\x{6524}\x{6525}\x{6526}\x{6527}' . +'\x{6529}\x{652A}\x{652B}\x{652C}\x{652D}\x{652E}\x{652F}\x{6530}\x{6531}' . +'\x{6532}\x{6533}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}\x{653A}' . +'\x{653B}\x{653C}\x{653D}\x{653E}\x{653F}\x{6541}\x{6543}\x{6544}\x{6545}' . +'\x{6546}\x{6547}\x{6548}\x{6549}\x{654A}\x{654B}\x{654C}\x{654D}\x{654E}' . +'\x{654F}\x{6550}\x{6551}\x{6552}\x{6553}\x{6554}\x{6555}\x{6556}\x{6557}' . +'\x{6558}\x{6559}\x{655B}\x{655C}\x{655D}\x{655E}\x{6560}\x{6561}\x{6562}' . +'\x{6563}\x{6564}\x{6565}\x{6566}\x{6567}\x{6568}\x{6569}\x{656A}\x{656B}' . +'\x{656C}\x{656E}\x{656F}\x{6570}\x{6571}\x{6572}\x{6573}\x{6574}\x{6575}' . +'\x{6576}\x{6577}\x{6578}\x{6579}\x{657A}\x{657B}\x{657C}\x{657E}\x{657F}' . +'\x{6580}\x{6581}\x{6582}\x{6583}\x{6584}\x{6585}\x{6586}\x{6587}\x{6588}' . +'\x{6589}\x{658B}\x{658C}\x{658D}\x{658E}\x{658F}\x{6590}\x{6591}\x{6592}' . +'\x{6593}\x{6594}\x{6595}\x{6596}\x{6597}\x{6598}\x{6599}\x{659B}\x{659C}' . +'\x{659D}\x{659E}\x{659F}\x{65A0}\x{65A1}\x{65A2}\x{65A3}\x{65A4}\x{65A5}' . +'\x{65A6}\x{65A7}\x{65A8}\x{65A9}\x{65AA}\x{65AB}\x{65AC}\x{65AD}\x{65AE}' . +'\x{65AF}\x{65B0}\x{65B1}\x{65B2}\x{65B3}\x{65B4}\x{65B6}\x{65B7}\x{65B8}' . +'\x{65B9}\x{65BA}\x{65BB}\x{65BC}\x{65BD}\x{65BF}\x{65C0}\x{65C1}\x{65C2}' . +'\x{65C3}\x{65C4}\x{65C5}\x{65C6}\x{65C7}\x{65CA}\x{65CB}\x{65CC}\x{65CD}' . +'\x{65CE}\x{65CF}\x{65D0}\x{65D2}\x{65D3}\x{65D4}\x{65D5}\x{65D6}\x{65D7}' . +'\x{65DA}\x{65DB}\x{65DD}\x{65DE}\x{65DF}\x{65E0}\x{65E1}\x{65E2}\x{65E3}' . +'\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}\x{65EB}\x{65EC}\x{65ED}\x{65EE}' . +'\x{65EF}\x{65F0}\x{65F1}\x{65F2}\x{65F3}\x{65F4}\x{65F5}\x{65F6}\x{65F7}' . +'\x{65F8}\x{65FA}\x{65FB}\x{65FC}\x{65FD}\x{6600}\x{6601}\x{6602}\x{6603}' . +'\x{6604}\x{6605}\x{6606}\x{6607}\x{6608}\x{6609}\x{660A}\x{660B}\x{660C}' . +'\x{660D}\x{660E}\x{660F}\x{6610}\x{6611}\x{6612}\x{6613}\x{6614}\x{6615}' . +'\x{6616}\x{6618}\x{6619}\x{661A}\x{661B}\x{661C}\x{661D}\x{661F}\x{6620}' . +'\x{6621}\x{6622}\x{6623}\x{6624}\x{6625}\x{6626}\x{6627}\x{6628}\x{6629}' . +'\x{662A}\x{662B}\x{662D}\x{662E}\x{662F}\x{6630}\x{6631}\x{6632}\x{6633}' . +'\x{6634}\x{6635}\x{6636}\x{6639}\x{663A}\x{663C}\x{663D}\x{663E}\x{6640}' . +'\x{6641}\x{6642}\x{6643}\x{6644}\x{6645}\x{6646}\x{6647}\x{6649}\x{664A}' . +'\x{664B}\x{664C}\x{664E}\x{664F}\x{6650}\x{6651}\x{6652}\x{6653}\x{6654}' . +'\x{6655}\x{6656}\x{6657}\x{6658}\x{6659}\x{665A}\x{665B}\x{665C}\x{665D}' . +'\x{665E}\x{665F}\x{6661}\x{6662}\x{6664}\x{6665}\x{6666}\x{6668}\x{6669}' . +'\x{666A}\x{666B}\x{666C}\x{666D}\x{666E}\x{666F}\x{6670}\x{6671}\x{6672}' . +'\x{6673}\x{6674}\x{6675}\x{6676}\x{6677}\x{6678}\x{6679}\x{667A}\x{667B}' . +'\x{667C}\x{667D}\x{667E}\x{667F}\x{6680}\x{6681}\x{6682}\x{6683}\x{6684}' . +'\x{6685}\x{6686}\x{6687}\x{6688}\x{6689}\x{668A}\x{668B}\x{668C}\x{668D}' . +'\x{668E}\x{668F}\x{6690}\x{6691}\x{6693}\x{6694}\x{6695}\x{6696}\x{6697}' . +'\x{6698}\x{6699}\x{669A}\x{669B}\x{669D}\x{669F}\x{66A0}\x{66A1}\x{66A2}' . +'\x{66A3}\x{66A4}\x{66A5}\x{66A6}\x{66A7}\x{66A8}\x{66A9}\x{66AA}\x{66AB}' . +'\x{66AE}\x{66AF}\x{66B0}\x{66B1}\x{66B2}\x{66B3}\x{66B4}\x{66B5}\x{66B6}' . +'\x{66B7}\x{66B8}\x{66B9}\x{66BA}\x{66BB}\x{66BC}\x{66BD}\x{66BE}\x{66BF}' . +'\x{66C0}\x{66C1}\x{66C2}\x{66C3}\x{66C4}\x{66C5}\x{66C6}\x{66C7}\x{66C8}' . +'\x{66C9}\x{66CA}\x{66CB}\x{66CC}\x{66CD}\x{66CE}\x{66CF}\x{66D1}\x{66D2}' . +'\x{66D4}\x{66D5}\x{66D6}\x{66D8}\x{66D9}\x{66DA}\x{66DB}\x{66DC}\x{66DD}' . +'\x{66DE}\x{66E0}\x{66E1}\x{66E2}\x{66E3}\x{66E4}\x{66E5}\x{66E6}\x{66E7}' . +'\x{66E8}\x{66E9}\x{66EA}\x{66EB}\x{66EC}\x{66ED}\x{66EE}\x{66F0}\x{66F1}' . +'\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F6}\x{66F7}\x{66F8}\x{66F9}\x{66FA}' . +'\x{66FB}\x{66FC}\x{66FE}\x{66FF}\x{6700}\x{6701}\x{6703}\x{6704}\x{6705}' . +'\x{6706}\x{6708}\x{6709}\x{670A}\x{670B}\x{670C}\x{670D}\x{670E}\x{670F}' . +'\x{6710}\x{6711}\x{6712}\x{6713}\x{6714}\x{6715}\x{6716}\x{6717}\x{6718}' . +'\x{671A}\x{671B}\x{671C}\x{671D}\x{671E}\x{671F}\x{6720}\x{6721}\x{6722}' . +'\x{6723}\x{6725}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}\x{672D}' . +'\x{672E}\x{672F}\x{6730}\x{6731}\x{6732}\x{6733}\x{6734}\x{6735}\x{6736}' . +'\x{6737}\x{6738}\x{6739}\x{673A}\x{673B}\x{673C}\x{673D}\x{673E}\x{673F}' . +'\x{6740}\x{6741}\x{6742}\x{6743}\x{6744}\x{6745}\x{6746}\x{6747}\x{6748}' . +'\x{6749}\x{674A}\x{674B}\x{674C}\x{674D}\x{674E}\x{674F}\x{6750}\x{6751}' . +'\x{6752}\x{6753}\x{6754}\x{6755}\x{6756}\x{6757}\x{6758}\x{6759}\x{675A}' . +'\x{675B}\x{675C}\x{675D}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' . +'\x{6764}\x{6765}\x{6766}\x{6768}\x{6769}\x{676A}\x{676B}\x{676C}\x{676D}' . +'\x{676E}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}\x{6774}\x{6775}\x{6776}' . +'\x{6777}\x{6778}\x{6779}\x{677A}\x{677B}\x{677C}\x{677D}\x{677E}\x{677F}' . +'\x{6780}\x{6781}\x{6782}\x{6783}\x{6784}\x{6785}\x{6786}\x{6787}\x{6789}' . +'\x{678A}\x{678B}\x{678C}\x{678D}\x{678E}\x{678F}\x{6790}\x{6791}\x{6792}' . +'\x{6793}\x{6794}\x{6795}\x{6797}\x{6798}\x{6799}\x{679A}\x{679B}\x{679C}' . +'\x{679D}\x{679E}\x{679F}\x{67A0}\x{67A1}\x{67A2}\x{67A3}\x{67A4}\x{67A5}' . +'\x{67A6}\x{67A7}\x{67A8}\x{67AA}\x{67AB}\x{67AC}\x{67AD}\x{67AE}\x{67AF}' . +'\x{67B0}\x{67B1}\x{67B2}\x{67B3}\x{67B4}\x{67B5}\x{67B6}\x{67B7}\x{67B8}' . +'\x{67B9}\x{67BA}\x{67BB}\x{67BC}\x{67BE}\x{67C0}\x{67C1}\x{67C2}\x{67C3}' . +'\x{67C4}\x{67C5}\x{67C6}\x{67C7}\x{67C8}\x{67C9}\x{67CA}\x{67CB}\x{67CC}' . +'\x{67CD}\x{67CE}\x{67CF}\x{67D0}\x{67D1}\x{67D2}\x{67D3}\x{67D4}\x{67D6}' . +'\x{67D8}\x{67D9}\x{67DA}\x{67DB}\x{67DC}\x{67DD}\x{67DE}\x{67DF}\x{67E0}' . +'\x{67E1}\x{67E2}\x{67E3}\x{67E4}\x{67E5}\x{67E6}\x{67E7}\x{67E8}\x{67E9}' . +'\x{67EA}\x{67EB}\x{67EC}\x{67ED}\x{67EE}\x{67EF}\x{67F0}\x{67F1}\x{67F2}' . +'\x{67F3}\x{67F4}\x{67F5}\x{67F6}\x{67F7}\x{67F8}\x{67FA}\x{67FB}\x{67FC}' . +'\x{67FD}\x{67FE}\x{67FF}\x{6800}\x{6802}\x{6803}\x{6804}\x{6805}\x{6806}' . +'\x{6807}\x{6808}\x{6809}\x{680A}\x{680B}\x{680C}\x{680D}\x{680E}\x{680F}' . +'\x{6810}\x{6811}\x{6812}\x{6813}\x{6814}\x{6816}\x{6817}\x{6818}\x{6819}' . +'\x{681A}\x{681B}\x{681C}\x{681D}\x{681F}\x{6820}\x{6821}\x{6822}\x{6823}' . +'\x{6824}\x{6825}\x{6826}\x{6828}\x{6829}\x{682A}\x{682B}\x{682C}\x{682D}' . +'\x{682E}\x{682F}\x{6831}\x{6832}\x{6833}\x{6834}\x{6835}\x{6836}\x{6837}' . +'\x{6838}\x{6839}\x{683A}\x{683B}\x{683C}\x{683D}\x{683E}\x{683F}\x{6840}' . +'\x{6841}\x{6842}\x{6843}\x{6844}\x{6845}\x{6846}\x{6847}\x{6848}\x{6849}' . +'\x{684A}\x{684B}\x{684C}\x{684D}\x{684E}\x{684F}\x{6850}\x{6851}\x{6852}' . +'\x{6853}\x{6854}\x{6855}\x{6856}\x{6857}\x{685B}\x{685D}\x{6860}\x{6861}' . +'\x{6862}\x{6863}\x{6864}\x{6865}\x{6866}\x{6867}\x{6868}\x{6869}\x{686A}' . +'\x{686B}\x{686C}\x{686D}\x{686E}\x{686F}\x{6870}\x{6871}\x{6872}\x{6873}' . +'\x{6874}\x{6875}\x{6876}\x{6877}\x{6878}\x{6879}\x{687B}\x{687C}\x{687D}' . +'\x{687E}\x{687F}\x{6880}\x{6881}\x{6882}\x{6883}\x{6884}\x{6885}\x{6886}' . +'\x{6887}\x{6888}\x{6889}\x{688A}\x{688B}\x{688C}\x{688D}\x{688E}\x{688F}' . +'\x{6890}\x{6891}\x{6892}\x{6893}\x{6894}\x{6896}\x{6897}\x{6898}\x{689A}' . +'\x{689B}\x{689C}\x{689D}\x{689E}\x{689F}\x{68A0}\x{68A1}\x{68A2}\x{68A3}' . +'\x{68A4}\x{68A6}\x{68A7}\x{68A8}\x{68A9}\x{68AA}\x{68AB}\x{68AC}\x{68AD}' . +'\x{68AE}\x{68AF}\x{68B0}\x{68B1}\x{68B2}\x{68B3}\x{68B4}\x{68B5}\x{68B6}' . +'\x{68B7}\x{68B9}\x{68BB}\x{68BC}\x{68BD}\x{68BE}\x{68BF}\x{68C0}\x{68C1}' . +'\x{68C2}\x{68C4}\x{68C6}\x{68C7}\x{68C8}\x{68C9}\x{68CA}\x{68CB}\x{68CC}' . +'\x{68CD}\x{68CE}\x{68CF}\x{68D0}\x{68D1}\x{68D2}\x{68D3}\x{68D4}\x{68D5}' . +'\x{68D6}\x{68D7}\x{68D8}\x{68DA}\x{68DB}\x{68DC}\x{68DD}\x{68DE}\x{68DF}' . +'\x{68E0}\x{68E1}\x{68E3}\x{68E4}\x{68E6}\x{68E7}\x{68E8}\x{68E9}\x{68EA}' . +'\x{68EB}\x{68EC}\x{68ED}\x{68EE}\x{68EF}\x{68F0}\x{68F1}\x{68F2}\x{68F3}' . +'\x{68F4}\x{68F5}\x{68F6}\x{68F7}\x{68F8}\x{68F9}\x{68FA}\x{68FB}\x{68FC}' . +'\x{68FD}\x{68FE}\x{68FF}\x{6901}\x{6902}\x{6903}\x{6904}\x{6905}\x{6906}' . +'\x{6907}\x{6908}\x{690A}\x{690B}\x{690C}\x{690D}\x{690E}\x{690F}\x{6910}' . +'\x{6911}\x{6912}\x{6913}\x{6914}\x{6915}\x{6916}\x{6917}\x{6918}\x{6919}' . +'\x{691A}\x{691B}\x{691C}\x{691D}\x{691E}\x{691F}\x{6920}\x{6921}\x{6922}' . +'\x{6923}\x{6924}\x{6925}\x{6926}\x{6927}\x{6928}\x{6929}\x{692A}\x{692B}' . +'\x{692C}\x{692D}\x{692E}\x{692F}\x{6930}\x{6931}\x{6932}\x{6933}\x{6934}' . +'\x{6935}\x{6936}\x{6937}\x{6938}\x{6939}\x{693A}\x{693B}\x{693C}\x{693D}' . +'\x{693F}\x{6940}\x{6941}\x{6942}\x{6943}\x{6944}\x{6945}\x{6946}\x{6947}' . +'\x{6948}\x{6949}\x{694A}\x{694B}\x{694C}\x{694E}\x{694F}\x{6950}\x{6951}' . +'\x{6952}\x{6953}\x{6954}\x{6955}\x{6956}\x{6957}\x{6958}\x{6959}\x{695A}' . +'\x{695B}\x{695C}\x{695D}\x{695E}\x{695F}\x{6960}\x{6961}\x{6962}\x{6963}' . +'\x{6964}\x{6965}\x{6966}\x{6967}\x{6968}\x{6969}\x{696A}\x{696B}\x{696C}' . +'\x{696D}\x{696E}\x{696F}\x{6970}\x{6971}\x{6972}\x{6973}\x{6974}\x{6975}' . +'\x{6976}\x{6977}\x{6978}\x{6979}\x{697A}\x{697B}\x{697C}\x{697D}\x{697E}' . +'\x{697F}\x{6980}\x{6981}\x{6982}\x{6983}\x{6984}\x{6985}\x{6986}\x{6987}' . +'\x{6988}\x{6989}\x{698A}\x{698B}\x{698C}\x{698D}\x{698E}\x{698F}\x{6990}' . +'\x{6991}\x{6992}\x{6993}\x{6994}\x{6995}\x{6996}\x{6997}\x{6998}\x{6999}' . +'\x{699A}\x{699B}\x{699C}\x{699D}\x{699E}\x{69A0}\x{69A1}\x{69A3}\x{69A4}' . +'\x{69A5}\x{69A6}\x{69A7}\x{69A8}\x{69A9}\x{69AA}\x{69AB}\x{69AC}\x{69AD}' . +'\x{69AE}\x{69AF}\x{69B0}\x{69B1}\x{69B2}\x{69B3}\x{69B4}\x{69B5}\x{69B6}' . +'\x{69B7}\x{69B8}\x{69B9}\x{69BA}\x{69BB}\x{69BC}\x{69BD}\x{69BE}\x{69BF}' . +'\x{69C1}\x{69C2}\x{69C3}\x{69C4}\x{69C5}\x{69C6}\x{69C7}\x{69C8}\x{69C9}' . +'\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}\x{69CF}\x{69D0}\x{69D3}\x{69D4}' . +'\x{69D8}\x{69D9}\x{69DA}\x{69DB}\x{69DC}\x{69DD}\x{69DE}\x{69DF}\x{69E0}' . +'\x{69E1}\x{69E2}\x{69E3}\x{69E4}\x{69E5}\x{69E6}\x{69E7}\x{69E8}\x{69E9}' . +'\x{69EA}\x{69EB}\x{69EC}\x{69ED}\x{69EE}\x{69EF}\x{69F0}\x{69F1}\x{69F2}' . +'\x{69F3}\x{69F4}\x{69F5}\x{69F6}\x{69F7}\x{69F8}\x{69FA}\x{69FB}\x{69FC}' . +'\x{69FD}\x{69FE}\x{69FF}\x{6A00}\x{6A01}\x{6A02}\x{6A04}\x{6A05}\x{6A06}' . +'\x{6A07}\x{6A08}\x{6A09}\x{6A0A}\x{6A0B}\x{6A0D}\x{6A0E}\x{6A0F}\x{6A10}' . +'\x{6A11}\x{6A12}\x{6A13}\x{6A14}\x{6A15}\x{6A16}\x{6A17}\x{6A18}\x{6A19}' . +'\x{6A1A}\x{6A1B}\x{6A1D}\x{6A1E}\x{6A1F}\x{6A20}\x{6A21}\x{6A22}\x{6A23}' . +'\x{6A25}\x{6A26}\x{6A27}\x{6A28}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2C}\x{6A2D}' . +'\x{6A2E}\x{6A2F}\x{6A30}\x{6A31}\x{6A32}\x{6A33}\x{6A34}\x{6A35}\x{6A36}' . +'\x{6A38}\x{6A39}\x{6A3A}\x{6A3B}\x{6A3C}\x{6A3D}\x{6A3E}\x{6A3F}\x{6A40}' . +'\x{6A41}\x{6A42}\x{6A43}\x{6A44}\x{6A45}\x{6A46}\x{6A47}\x{6A48}\x{6A49}' . +'\x{6A4B}\x{6A4C}\x{6A4D}\x{6A4E}\x{6A4F}\x{6A50}\x{6A51}\x{6A52}\x{6A54}' . +'\x{6A55}\x{6A56}\x{6A57}\x{6A58}\x{6A59}\x{6A5A}\x{6A5B}\x{6A5D}\x{6A5E}' . +'\x{6A5F}\x{6A60}\x{6A61}\x{6A62}\x{6A63}\x{6A64}\x{6A65}\x{6A66}\x{6A67}' . +'\x{6A68}\x{6A69}\x{6A6A}\x{6A6B}\x{6A6C}\x{6A6D}\x{6A6F}\x{6A71}\x{6A72}' . +'\x{6A73}\x{6A74}\x{6A75}\x{6A76}\x{6A77}\x{6A78}\x{6A79}\x{6A7A}\x{6A7B}' . +'\x{6A7C}\x{6A7D}\x{6A7E}\x{6A7F}\x{6A80}\x{6A81}\x{6A82}\x{6A83}\x{6A84}' . +'\x{6A85}\x{6A87}\x{6A88}\x{6A89}\x{6A8B}\x{6A8C}\x{6A8D}\x{6A8E}\x{6A90}' . +'\x{6A91}\x{6A92}\x{6A93}\x{6A94}\x{6A95}\x{6A96}\x{6A97}\x{6A98}\x{6A9A}' . +'\x{6A9B}\x{6A9C}\x{6A9E}\x{6A9F}\x{6AA0}\x{6AA1}\x{6AA2}\x{6AA3}\x{6AA4}' . +'\x{6AA5}\x{6AA6}\x{6AA7}\x{6AA8}\x{6AA9}\x{6AAB}\x{6AAC}\x{6AAD}\x{6AAE}' . +'\x{6AAF}\x{6AB0}\x{6AB2}\x{6AB3}\x{6AB4}\x{6AB5}\x{6AB6}\x{6AB7}\x{6AB8}' . +'\x{6AB9}\x{6ABA}\x{6ABB}\x{6ABC}\x{6ABD}\x{6ABF}\x{6AC1}\x{6AC2}\x{6AC3}' . +'\x{6AC5}\x{6AC6}\x{6AC7}\x{6ACA}\x{6ACB}\x{6ACC}\x{6ACD}\x{6ACE}\x{6ACF}' . +'\x{6AD0}\x{6AD1}\x{6AD2}\x{6AD3}\x{6AD4}\x{6AD5}\x{6AD6}\x{6AD7}\x{6AD9}' . +'\x{6ADA}\x{6ADB}\x{6ADC}\x{6ADD}\x{6ADE}\x{6ADF}\x{6AE0}\x{6AE1}\x{6AE2}' . +'\x{6AE3}\x{6AE4}\x{6AE5}\x{6AE6}\x{6AE7}\x{6AE8}\x{6AEA}\x{6AEB}\x{6AEC}' . +'\x{6AED}\x{6AEE}\x{6AEF}\x{6AF0}\x{6AF1}\x{6AF2}\x{6AF3}\x{6AF4}\x{6AF5}' . +'\x{6AF6}\x{6AF7}\x{6AF8}\x{6AF9}\x{6AFA}\x{6AFB}\x{6AFC}\x{6AFD}\x{6AFE}' . +'\x{6AFF}\x{6B00}\x{6B01}\x{6B02}\x{6B03}\x{6B04}\x{6B05}\x{6B06}\x{6B07}' . +'\x{6B08}\x{6B09}\x{6B0A}\x{6B0B}\x{6B0C}\x{6B0D}\x{6B0F}\x{6B10}\x{6B11}' . +'\x{6B12}\x{6B13}\x{6B14}\x{6B15}\x{6B16}\x{6B17}\x{6B18}\x{6B19}\x{6B1A}' . +'\x{6B1C}\x{6B1D}\x{6B1E}\x{6B1F}\x{6B20}\x{6B21}\x{6B22}\x{6B23}\x{6B24}' . +'\x{6B25}\x{6B26}\x{6B27}\x{6B28}\x{6B29}\x{6B2A}\x{6B2B}\x{6B2C}\x{6B2D}' . +'\x{6B2F}\x{6B30}\x{6B31}\x{6B32}\x{6B33}\x{6B34}\x{6B36}\x{6B37}\x{6B38}' . +'\x{6B39}\x{6B3A}\x{6B3B}\x{6B3C}\x{6B3D}\x{6B3E}\x{6B3F}\x{6B41}\x{6B42}' . +'\x{6B43}\x{6B44}\x{6B45}\x{6B46}\x{6B47}\x{6B48}\x{6B49}\x{6B4A}\x{6B4B}' . +'\x{6B4C}\x{6B4D}\x{6B4E}\x{6B4F}\x{6B50}\x{6B51}\x{6B52}\x{6B53}\x{6B54}' . +'\x{6B55}\x{6B56}\x{6B59}\x{6B5A}\x{6B5B}\x{6B5C}\x{6B5E}\x{6B5F}\x{6B60}' . +'\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B65}\x{6B66}\x{6B67}\x{6B69}\x{6B6A}' . +'\x{6B6B}\x{6B6D}\x{6B6F}\x{6B70}\x{6B72}\x{6B73}\x{6B74}\x{6B76}\x{6B77}' . +'\x{6B78}\x{6B79}\x{6B7A}\x{6B7B}\x{6B7C}\x{6B7E}\x{6B7F}\x{6B80}\x{6B81}' . +'\x{6B82}\x{6B83}\x{6B84}\x{6B85}\x{6B86}\x{6B87}\x{6B88}\x{6B89}\x{6B8A}' . +'\x{6B8B}\x{6B8C}\x{6B8D}\x{6B8E}\x{6B8F}\x{6B90}\x{6B91}\x{6B92}\x{6B93}' . +'\x{6B94}\x{6B95}\x{6B96}\x{6B97}\x{6B98}\x{6B99}\x{6B9A}\x{6B9B}\x{6B9C}' . +'\x{6B9D}\x{6B9E}\x{6B9F}\x{6BA0}\x{6BA1}\x{6BA2}\x{6BA3}\x{6BA4}\x{6BA5}' . +'\x{6BA6}\x{6BA7}\x{6BA8}\x{6BA9}\x{6BAA}\x{6BAB}\x{6BAC}\x{6BAD}\x{6BAE}' . +'\x{6BAF}\x{6BB0}\x{6BB2}\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB6}\x{6BB7}\x{6BB9}' . +'\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBD}\x{6BBE}\x{6BBF}\x{6BC0}\x{6BC1}\x{6BC2}' . +'\x{6BC3}\x{6BC4}\x{6BC5}\x{6BC6}\x{6BC7}\x{6BC8}\x{6BC9}\x{6BCA}\x{6BCB}' . +'\x{6BCC}\x{6BCD}\x{6BCE}\x{6BCF}\x{6BD0}\x{6BD1}\x{6BD2}\x{6BD3}\x{6BD4}' . +'\x{6BD5}\x{6BD6}\x{6BD7}\x{6BD8}\x{6BD9}\x{6BDA}\x{6BDB}\x{6BDC}\x{6BDD}' . +'\x{6BDE}\x{6BDF}\x{6BE0}\x{6BE1}\x{6BE2}\x{6BE3}\x{6BE4}\x{6BE5}\x{6BE6}' . +'\x{6BE7}\x{6BE8}\x{6BEA}\x{6BEB}\x{6BEC}\x{6BED}\x{6BEE}\x{6BEF}\x{6BF0}' . +'\x{6BF2}\x{6BF3}\x{6BF5}\x{6BF6}\x{6BF7}\x{6BF8}\x{6BF9}\x{6BFB}\x{6BFC}' . +'\x{6BFD}\x{6BFE}\x{6BFF}\x{6C00}\x{6C01}\x{6C02}\x{6C03}\x{6C04}\x{6C05}' . +'\x{6C06}\x{6C07}\x{6C08}\x{6C09}\x{6C0B}\x{6C0C}\x{6C0D}\x{6C0E}\x{6C0F}' . +'\x{6C10}\x{6C11}\x{6C12}\x{6C13}\x{6C14}\x{6C15}\x{6C16}\x{6C18}\x{6C19}' . +'\x{6C1A}\x{6C1B}\x{6C1D}\x{6C1E}\x{6C1F}\x{6C20}\x{6C21}\x{6C22}\x{6C23}' . +'\x{6C24}\x{6C25}\x{6C26}\x{6C27}\x{6C28}\x{6C29}\x{6C2A}\x{6C2B}\x{6C2C}' . +'\x{6C2E}\x{6C2F}\x{6C30}\x{6C31}\x{6C32}\x{6C33}\x{6C34}\x{6C35}\x{6C36}' . +'\x{6C37}\x{6C38}\x{6C3A}\x{6C3B}\x{6C3D}\x{6C3E}\x{6C3F}\x{6C40}\x{6C41}' . +'\x{6C42}\x{6C43}\x{6C44}\x{6C46}\x{6C47}\x{6C48}\x{6C49}\x{6C4A}\x{6C4B}' . +'\x{6C4C}\x{6C4D}\x{6C4E}\x{6C4F}\x{6C50}\x{6C51}\x{6C52}\x{6C53}\x{6C54}' . +'\x{6C55}\x{6C56}\x{6C57}\x{6C58}\x{6C59}\x{6C5A}\x{6C5B}\x{6C5C}\x{6C5D}' . +'\x{6C5E}\x{6C5F}\x{6C60}\x{6C61}\x{6C62}\x{6C63}\x{6C64}\x{6C65}\x{6C66}' . +'\x{6C67}\x{6C68}\x{6C69}\x{6C6A}\x{6C6B}\x{6C6D}\x{6C6F}\x{6C70}\x{6C71}' . +'\x{6C72}\x{6C73}\x{6C74}\x{6C75}\x{6C76}\x{6C77}\x{6C78}\x{6C79}\x{6C7A}' . +'\x{6C7B}\x{6C7C}\x{6C7D}\x{6C7E}\x{6C7F}\x{6C80}\x{6C81}\x{6C82}\x{6C83}' . +'\x{6C84}\x{6C85}\x{6C86}\x{6C87}\x{6C88}\x{6C89}\x{6C8A}\x{6C8B}\x{6C8C}' . +'\x{6C8D}\x{6C8E}\x{6C8F}\x{6C90}\x{6C91}\x{6C92}\x{6C93}\x{6C94}\x{6C95}' . +'\x{6C96}\x{6C97}\x{6C98}\x{6C99}\x{6C9A}\x{6C9B}\x{6C9C}\x{6C9D}\x{6C9E}' . +'\x{6C9F}\x{6CA1}\x{6CA2}\x{6CA3}\x{6CA4}\x{6CA5}\x{6CA6}\x{6CA7}\x{6CA8}' . +'\x{6CA9}\x{6CAA}\x{6CAB}\x{6CAC}\x{6CAD}\x{6CAE}\x{6CAF}\x{6CB0}\x{6CB1}' . +'\x{6CB2}\x{6CB3}\x{6CB4}\x{6CB5}\x{6CB6}\x{6CB7}\x{6CB8}\x{6CB9}\x{6CBA}' . +'\x{6CBB}\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC0}\x{6CC1}\x{6CC2}\x{6CC3}' . +'\x{6CC4}\x{6CC5}\x{6CC6}\x{6CC7}\x{6CC8}\x{6CC9}\x{6CCA}\x{6CCB}\x{6CCC}' . +'\x{6CCD}\x{6CCE}\x{6CCF}\x{6CD0}\x{6CD1}\x{6CD2}\x{6CD3}\x{6CD4}\x{6CD5}' . +'\x{6CD6}\x{6CD7}\x{6CD9}\x{6CDA}\x{6CDB}\x{6CDC}\x{6CDD}\x{6CDE}\x{6CDF}' . +'\x{6CE0}\x{6CE1}\x{6CE2}\x{6CE3}\x{6CE4}\x{6CE5}\x{6CE6}\x{6CE7}\x{6CE8}' . +'\x{6CE9}\x{6CEA}\x{6CEB}\x{6CEC}\x{6CED}\x{6CEE}\x{6CEF}\x{6CF0}\x{6CF1}' . +'\x{6CF2}\x{6CF3}\x{6CF5}\x{6CF6}\x{6CF7}\x{6CF8}\x{6CF9}\x{6CFA}\x{6CFB}' . +'\x{6CFC}\x{6CFD}\x{6CFE}\x{6CFF}\x{6D00}\x{6D01}\x{6D03}\x{6D04}\x{6D05}' . +'\x{6D06}\x{6D07}\x{6D08}\x{6D09}\x{6D0A}\x{6D0B}\x{6D0C}\x{6D0D}\x{6D0E}' . +'\x{6D0F}\x{6D10}\x{6D11}\x{6D12}\x{6D13}\x{6D14}\x{6D15}\x{6D16}\x{6D17}' . +'\x{6D18}\x{6D19}\x{6D1A}\x{6D1B}\x{6D1D}\x{6D1E}\x{6D1F}\x{6D20}\x{6D21}' . +'\x{6D22}\x{6D23}\x{6D25}\x{6D26}\x{6D27}\x{6D28}\x{6D29}\x{6D2A}\x{6D2B}' . +'\x{6D2C}\x{6D2D}\x{6D2E}\x{6D2F}\x{6D30}\x{6D31}\x{6D32}\x{6D33}\x{6D34}' . +'\x{6D35}\x{6D36}\x{6D37}\x{6D38}\x{6D39}\x{6D3A}\x{6D3B}\x{6D3C}\x{6D3D}' . +'\x{6D3E}\x{6D3F}\x{6D40}\x{6D41}\x{6D42}\x{6D43}\x{6D44}\x{6D45}\x{6D46}' . +'\x{6D47}\x{6D48}\x{6D49}\x{6D4A}\x{6D4B}\x{6D4C}\x{6D4D}\x{6D4E}\x{6D4F}' . +'\x{6D50}\x{6D51}\x{6D52}\x{6D53}\x{6D54}\x{6D55}\x{6D56}\x{6D57}\x{6D58}' . +'\x{6D59}\x{6D5A}\x{6D5B}\x{6D5C}\x{6D5D}\x{6D5E}\x{6D5F}\x{6D60}\x{6D61}' . +'\x{6D62}\x{6D63}\x{6D64}\x{6D65}\x{6D66}\x{6D67}\x{6D68}\x{6D69}\x{6D6A}' . +'\x{6D6B}\x{6D6C}\x{6D6D}\x{6D6E}\x{6D6F}\x{6D70}\x{6D72}\x{6D73}\x{6D74}' . +'\x{6D75}\x{6D76}\x{6D77}\x{6D78}\x{6D79}\x{6D7A}\x{6D7B}\x{6D7C}\x{6D7D}' . +'\x{6D7E}\x{6D7F}\x{6D80}\x{6D82}\x{6D83}\x{6D84}\x{6D85}\x{6D86}\x{6D87}' . +'\x{6D88}\x{6D89}\x{6D8A}\x{6D8B}\x{6D8C}\x{6D8D}\x{6D8E}\x{6D8F}\x{6D90}' . +'\x{6D91}\x{6D92}\x{6D93}\x{6D94}\x{6D95}\x{6D97}\x{6D98}\x{6D99}\x{6D9A}' . +'\x{6D9B}\x{6D9D}\x{6D9E}\x{6D9F}\x{6DA0}\x{6DA1}\x{6DA2}\x{6DA3}\x{6DA4}' . +'\x{6DA5}\x{6DA6}\x{6DA7}\x{6DA8}\x{6DA9}\x{6DAA}\x{6DAB}\x{6DAC}\x{6DAD}' . +'\x{6DAE}\x{6DAF}\x{6DB2}\x{6DB3}\x{6DB4}\x{6DB5}\x{6DB7}\x{6DB8}\x{6DB9}' . +'\x{6DBA}\x{6DBB}\x{6DBC}\x{6DBD}\x{6DBE}\x{6DBF}\x{6DC0}\x{6DC1}\x{6DC2}' . +'\x{6DC3}\x{6DC4}\x{6DC5}\x{6DC6}\x{6DC7}\x{6DC8}\x{6DC9}\x{6DCA}\x{6DCB}' . +'\x{6DCC}\x{6DCD}\x{6DCE}\x{6DCF}\x{6DD0}\x{6DD1}\x{6DD2}\x{6DD3}\x{6DD4}' . +'\x{6DD5}\x{6DD6}\x{6DD7}\x{6DD8}\x{6DD9}\x{6DDA}\x{6DDB}\x{6DDC}\x{6DDD}' . +'\x{6DDE}\x{6DDF}\x{6DE0}\x{6DE1}\x{6DE2}\x{6DE3}\x{6DE4}\x{6DE5}\x{6DE6}' . +'\x{6DE7}\x{6DE8}\x{6DE9}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DED}\x{6DEE}\x{6DEF}' . +'\x{6DF0}\x{6DF1}\x{6DF2}\x{6DF3}\x{6DF4}\x{6DF5}\x{6DF6}\x{6DF7}\x{6DF8}' . +'\x{6DF9}\x{6DFA}\x{6DFB}\x{6DFC}\x{6DFD}\x{6E00}\x{6E03}\x{6E04}\x{6E05}' . +'\x{6E07}\x{6E08}\x{6E09}\x{6E0A}\x{6E0B}\x{6E0C}\x{6E0D}\x{6E0E}\x{6E0F}' . +'\x{6E10}\x{6E11}\x{6E14}\x{6E15}\x{6E16}\x{6E17}\x{6E19}\x{6E1A}\x{6E1B}' . +'\x{6E1C}\x{6E1D}\x{6E1E}\x{6E1F}\x{6E20}\x{6E21}\x{6E22}\x{6E23}\x{6E24}' . +'\x{6E25}\x{6E26}\x{6E27}\x{6E28}\x{6E29}\x{6E2B}\x{6E2C}\x{6E2D}\x{6E2E}' . +'\x{6E2F}\x{6E30}\x{6E31}\x{6E32}\x{6E33}\x{6E34}\x{6E35}\x{6E36}\x{6E37}' . +'\x{6E38}\x{6E39}\x{6E3A}\x{6E3B}\x{6E3C}\x{6E3D}\x{6E3E}\x{6E3F}\x{6E40}' . +'\x{6E41}\x{6E42}\x{6E43}\x{6E44}\x{6E45}\x{6E46}\x{6E47}\x{6E48}\x{6E49}' . +'\x{6E4A}\x{6E4B}\x{6E4D}\x{6E4E}\x{6E4F}\x{6E50}\x{6E51}\x{6E52}\x{6E53}' . +'\x{6E54}\x{6E55}\x{6E56}\x{6E57}\x{6E58}\x{6E59}\x{6E5A}\x{6E5B}\x{6E5C}' . +'\x{6E5D}\x{6E5E}\x{6E5F}\x{6E60}\x{6E61}\x{6E62}\x{6E63}\x{6E64}\x{6E65}' . +'\x{6E66}\x{6E67}\x{6E68}\x{6E69}\x{6E6A}\x{6E6B}\x{6E6D}\x{6E6E}\x{6E6F}' . +'\x{6E70}\x{6E71}\x{6E72}\x{6E73}\x{6E74}\x{6E75}\x{6E77}\x{6E78}\x{6E79}' . +'\x{6E7E}\x{6E7F}\x{6E80}\x{6E81}\x{6E82}\x{6E83}\x{6E84}\x{6E85}\x{6E86}' . +'\x{6E87}\x{6E88}\x{6E89}\x{6E8A}\x{6E8D}\x{6E8E}\x{6E8F}\x{6E90}\x{6E91}' . +'\x{6E92}\x{6E93}\x{6E94}\x{6E96}\x{6E97}\x{6E98}\x{6E99}\x{6E9A}\x{6E9B}' . +'\x{6E9C}\x{6E9D}\x{6E9E}\x{6E9F}\x{6EA0}\x{6EA1}\x{6EA2}\x{6EA3}\x{6EA4}' . +'\x{6EA5}\x{6EA6}\x{6EA7}\x{6EA8}\x{6EA9}\x{6EAA}\x{6EAB}\x{6EAC}\x{6EAD}' . +'\x{6EAE}\x{6EAF}\x{6EB0}\x{6EB1}\x{6EB2}\x{6EB3}\x{6EB4}\x{6EB5}\x{6EB6}' . +'\x{6EB7}\x{6EB8}\x{6EB9}\x{6EBA}\x{6EBB}\x{6EBC}\x{6EBD}\x{6EBE}\x{6EBF}' . +'\x{6EC0}\x{6EC1}\x{6EC2}\x{6EC3}\x{6EC4}\x{6EC5}\x{6EC6}\x{6EC7}\x{6EC8}' . +'\x{6EC9}\x{6ECA}\x{6ECB}\x{6ECC}\x{6ECD}\x{6ECE}\x{6ECF}\x{6ED0}\x{6ED1}' . +'\x{6ED2}\x{6ED3}\x{6ED4}\x{6ED5}\x{6ED6}\x{6ED7}\x{6ED8}\x{6ED9}\x{6EDA}' . +'\x{6EDC}\x{6EDE}\x{6EDF}\x{6EE0}\x{6EE1}\x{6EE2}\x{6EE4}\x{6EE5}\x{6EE6}' . +'\x{6EE7}\x{6EE8}\x{6EE9}\x{6EEA}\x{6EEB}\x{6EEC}\x{6EED}\x{6EEE}\x{6EEF}' . +'\x{6EF0}\x{6EF1}\x{6EF2}\x{6EF3}\x{6EF4}\x{6EF5}\x{6EF6}\x{6EF7}\x{6EF8}' . +'\x{6EF9}\x{6EFA}\x{6EFB}\x{6EFC}\x{6EFD}\x{6EFE}\x{6EFF}\x{6F00}\x{6F01}' . +'\x{6F02}\x{6F03}\x{6F05}\x{6F06}\x{6F07}\x{6F08}\x{6F09}\x{6F0A}\x{6F0C}' . +'\x{6F0D}\x{6F0E}\x{6F0F}\x{6F10}\x{6F11}\x{6F12}\x{6F13}\x{6F14}\x{6F15}' . +'\x{6F16}\x{6F17}\x{6F18}\x{6F19}\x{6F1A}\x{6F1B}\x{6F1C}\x{6F1D}\x{6F1E}' . +'\x{6F1F}\x{6F20}\x{6F21}\x{6F22}\x{6F23}\x{6F24}\x{6F25}\x{6F26}\x{6F27}' . +'\x{6F28}\x{6F29}\x{6F2A}\x{6F2B}\x{6F2C}\x{6F2D}\x{6F2E}\x{6F2F}\x{6F30}' . +'\x{6F31}\x{6F32}\x{6F33}\x{6F34}\x{6F35}\x{6F36}\x{6F37}\x{6F38}\x{6F39}' . +'\x{6F3A}\x{6F3B}\x{6F3C}\x{6F3D}\x{6F3E}\x{6F3F}\x{6F40}\x{6F41}\x{6F43}' . +'\x{6F44}\x{6F45}\x{6F46}\x{6F47}\x{6F49}\x{6F4B}\x{6F4C}\x{6F4D}\x{6F4E}' . +'\x{6F4F}\x{6F50}\x{6F51}\x{6F52}\x{6F53}\x{6F54}\x{6F55}\x{6F56}\x{6F57}' . +'\x{6F58}\x{6F59}\x{6F5A}\x{6F5B}\x{6F5C}\x{6F5D}\x{6F5E}\x{6F5F}\x{6F60}' . +'\x{6F61}\x{6F62}\x{6F63}\x{6F64}\x{6F65}\x{6F66}\x{6F67}\x{6F68}\x{6F69}' . +'\x{6F6A}\x{6F6B}\x{6F6C}\x{6F6D}\x{6F6E}\x{6F6F}\x{6F70}\x{6F71}\x{6F72}' . +'\x{6F73}\x{6F74}\x{6F75}\x{6F76}\x{6F77}\x{6F78}\x{6F7A}\x{6F7B}\x{6F7C}' . +'\x{6F7D}\x{6F7E}\x{6F7F}\x{6F80}\x{6F81}\x{6F82}\x{6F83}\x{6F84}\x{6F85}' . +'\x{6F86}\x{6F87}\x{6F88}\x{6F89}\x{6F8A}\x{6F8B}\x{6F8C}\x{6F8D}\x{6F8E}' . +'\x{6F8F}\x{6F90}\x{6F91}\x{6F92}\x{6F93}\x{6F94}\x{6F95}\x{6F96}\x{6F97}' . +'\x{6F99}\x{6F9B}\x{6F9C}\x{6F9D}\x{6F9E}\x{6FA0}\x{6FA1}\x{6FA2}\x{6FA3}' . +'\x{6FA4}\x{6FA5}\x{6FA6}\x{6FA7}\x{6FA8}\x{6FA9}\x{6FAA}\x{6FAB}\x{6FAC}' . +'\x{6FAD}\x{6FAE}\x{6FAF}\x{6FB0}\x{6FB1}\x{6FB2}\x{6FB3}\x{6FB4}\x{6FB5}' . +'\x{6FB6}\x{6FB8}\x{6FB9}\x{6FBA}\x{6FBB}\x{6FBC}\x{6FBD}\x{6FBE}\x{6FBF}' . +'\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC4}\x{6FC6}\x{6FC7}\x{6FC8}\x{6FC9}' . +'\x{6FCA}\x{6FCB}\x{6FCC}\x{6FCD}\x{6FCE}\x{6FCF}\x{6FD1}\x{6FD2}\x{6FD4}' . +'\x{6FD5}\x{6FD6}\x{6FD7}\x{6FD8}\x{6FD9}\x{6FDA}\x{6FDB}\x{6FDC}\x{6FDD}' . +'\x{6FDE}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE2}\x{6FE3}\x{6FE4}\x{6FE5}\x{6FE6}' . +'\x{6FE7}\x{6FE8}\x{6FE9}\x{6FEA}\x{6FEB}\x{6FEC}\x{6FED}\x{6FEE}\x{6FEF}' . +'\x{6FF0}\x{6FF1}\x{6FF2}\x{6FF3}\x{6FF4}\x{6FF6}\x{6FF7}\x{6FF8}\x{6FF9}' . +'\x{6FFA}\x{6FFB}\x{6FFC}\x{6FFE}\x{6FFF}\x{7000}\x{7001}\x{7002}\x{7003}' . +'\x{7004}\x{7005}\x{7006}\x{7007}\x{7008}\x{7009}\x{700A}\x{700B}\x{700C}' . +'\x{700D}\x{700E}\x{700F}\x{7011}\x{7012}\x{7014}\x{7015}\x{7016}\x{7017}' . +'\x{7018}\x{7019}\x{701A}\x{701B}\x{701C}\x{701D}\x{701F}\x{7020}\x{7021}' . +'\x{7022}\x{7023}\x{7024}\x{7025}\x{7026}\x{7027}\x{7028}\x{7029}\x{702A}' . +'\x{702B}\x{702C}\x{702D}\x{702E}\x{702F}\x{7030}\x{7031}\x{7032}\x{7033}' . +'\x{7034}\x{7035}\x{7036}\x{7037}\x{7038}\x{7039}\x{703A}\x{703B}\x{703C}' . +'\x{703D}\x{703E}\x{703F}\x{7040}\x{7041}\x{7042}\x{7043}\x{7044}\x{7045}' . +'\x{7046}\x{7048}\x{7049}\x{704A}\x{704C}\x{704D}\x{704F}\x{7050}\x{7051}' . +'\x{7052}\x{7053}\x{7054}\x{7055}\x{7056}\x{7057}\x{7058}\x{7059}\x{705A}' . +'\x{705B}\x{705C}\x{705D}\x{705E}\x{705F}\x{7060}\x{7061}\x{7062}\x{7063}' . +'\x{7064}\x{7065}\x{7066}\x{7067}\x{7068}\x{7069}\x{706A}\x{706B}\x{706C}' . +'\x{706D}\x{706E}\x{706F}\x{7070}\x{7071}\x{7074}\x{7075}\x{7076}\x{7077}' . +'\x{7078}\x{7079}\x{707A}\x{707C}\x{707D}\x{707E}\x{707F}\x{7080}\x{7082}' . +'\x{7083}\x{7084}\x{7085}\x{7086}\x{7087}\x{7088}\x{7089}\x{708A}\x{708B}' . +'\x{708C}\x{708E}\x{708F}\x{7090}\x{7091}\x{7092}\x{7093}\x{7094}\x{7095}' . +'\x{7096}\x{7098}\x{7099}\x{709A}\x{709C}\x{709D}\x{709E}\x{709F}\x{70A0}' . +'\x{70A1}\x{70A2}\x{70A3}\x{70A4}\x{70A5}\x{70A6}\x{70A7}\x{70A8}\x{70A9}' . +'\x{70AB}\x{70AC}\x{70AD}\x{70AE}\x{70AF}\x{70B0}\x{70B1}\x{70B3}\x{70B4}' . +'\x{70B5}\x{70B7}\x{70B8}\x{70B9}\x{70BA}\x{70BB}\x{70BC}\x{70BD}\x{70BE}' . +'\x{70BF}\x{70C0}\x{70C1}\x{70C2}\x{70C3}\x{70C4}\x{70C5}\x{70C6}\x{70C7}' . +'\x{70C8}\x{70C9}\x{70CA}\x{70CB}\x{70CC}\x{70CD}\x{70CE}\x{70CF}\x{70D0}' . +'\x{70D1}\x{70D2}\x{70D3}\x{70D4}\x{70D6}\x{70D7}\x{70D8}\x{70D9}\x{70DA}' . +'\x{70DB}\x{70DC}\x{70DD}\x{70DE}\x{70DF}\x{70E0}\x{70E1}\x{70E2}\x{70E3}' . +'\x{70E4}\x{70E5}\x{70E6}\x{70E7}\x{70E8}\x{70E9}\x{70EA}\x{70EB}\x{70EC}' . +'\x{70ED}\x{70EE}\x{70EF}\x{70F0}\x{70F1}\x{70F2}\x{70F3}\x{70F4}\x{70F5}' . +'\x{70F6}\x{70F7}\x{70F8}\x{70F9}\x{70FA}\x{70FB}\x{70FC}\x{70FD}\x{70FF}' . +'\x{7100}\x{7101}\x{7102}\x{7103}\x{7104}\x{7105}\x{7106}\x{7107}\x{7109}' . +'\x{710A}\x{710B}\x{710C}\x{710D}\x{710E}\x{710F}\x{7110}\x{7111}\x{7112}' . +'\x{7113}\x{7115}\x{7116}\x{7117}\x{7118}\x{7119}\x{711A}\x{711B}\x{711C}' . +'\x{711D}\x{711E}\x{711F}\x{7120}\x{7121}\x{7122}\x{7123}\x{7125}\x{7126}' . +'\x{7127}\x{7128}\x{7129}\x{712A}\x{712B}\x{712C}\x{712D}\x{712E}\x{712F}' . +'\x{7130}\x{7131}\x{7132}\x{7135}\x{7136}\x{7137}\x{7138}\x{7139}\x{713A}' . +'\x{713B}\x{713D}\x{713E}\x{713F}\x{7140}\x{7141}\x{7142}\x{7143}\x{7144}' . +'\x{7145}\x{7146}\x{7147}\x{7148}\x{7149}\x{714A}\x{714B}\x{714C}\x{714D}' . +'\x{714E}\x{714F}\x{7150}\x{7151}\x{7152}\x{7153}\x{7154}\x{7156}\x{7158}' . +'\x{7159}\x{715A}\x{715B}\x{715C}\x{715D}\x{715E}\x{715F}\x{7160}\x{7161}' . +'\x{7162}\x{7163}\x{7164}\x{7165}\x{7166}\x{7167}\x{7168}\x{7169}\x{716A}' . +'\x{716C}\x{716E}\x{716F}\x{7170}\x{7171}\x{7172}\x{7173}\x{7174}\x{7175}' . +'\x{7176}\x{7177}\x{7178}\x{7179}\x{717A}\x{717B}\x{717C}\x{717D}\x{717E}' . +'\x{717F}\x{7180}\x{7181}\x{7182}\x{7183}\x{7184}\x{7185}\x{7186}\x{7187}' . +'\x{7188}\x{7189}\x{718A}\x{718B}\x{718C}\x{718E}\x{718F}\x{7190}\x{7191}' . +'\x{7192}\x{7193}\x{7194}\x{7195}\x{7197}\x{7198}\x{7199}\x{719A}\x{719B}' . +'\x{719C}\x{719D}\x{719E}\x{719F}\x{71A0}\x{71A1}\x{71A2}\x{71A3}\x{71A4}' . +'\x{71A5}\x{71A7}\x{71A8}\x{71A9}\x{71AA}\x{71AC}\x{71AD}\x{71AE}\x{71AF}' . +'\x{71B0}\x{71B1}\x{71B2}\x{71B3}\x{71B4}\x{71B5}\x{71B7}\x{71B8}\x{71B9}' . +'\x{71BA}\x{71BB}\x{71BC}\x{71BD}\x{71BE}\x{71BF}\x{71C0}\x{71C1}\x{71C2}' . +'\x{71C3}\x{71C4}\x{71C5}\x{71C6}\x{71C7}\x{71C8}\x{71C9}\x{71CA}\x{71CB}' . +'\x{71CD}\x{71CE}\x{71CF}\x{71D0}\x{71D1}\x{71D2}\x{71D4}\x{71D5}\x{71D6}' . +'\x{71D7}\x{71D8}\x{71D9}\x{71DA}\x{71DB}\x{71DC}\x{71DD}\x{71DE}\x{71DF}' . +'\x{71E0}\x{71E1}\x{71E2}\x{71E3}\x{71E4}\x{71E5}\x{71E6}\x{71E7}\x{71E8}' . +'\x{71E9}\x{71EA}\x{71EB}\x{71EC}\x{71ED}\x{71EE}\x{71EF}\x{71F0}\x{71F1}' . +'\x{71F2}\x{71F4}\x{71F5}\x{71F6}\x{71F7}\x{71F8}\x{71F9}\x{71FB}\x{71FC}' . +'\x{71FD}\x{71FE}\x{71FF}\x{7201}\x{7202}\x{7203}\x{7204}\x{7205}\x{7206}' . +'\x{7207}\x{7208}\x{7209}\x{720A}\x{720C}\x{720D}\x{720E}\x{720F}\x{7210}' . +'\x{7212}\x{7213}\x{7214}\x{7216}\x{7218}\x{7219}\x{721A}\x{721B}\x{721C}' . +'\x{721D}\x{721E}\x{721F}\x{7221}\x{7222}\x{7223}\x{7226}\x{7227}\x{7228}' . +'\x{7229}\x{722A}\x{722B}\x{722C}\x{722D}\x{722E}\x{7230}\x{7231}\x{7232}' . +'\x{7233}\x{7235}\x{7236}\x{7237}\x{7238}\x{7239}\x{723A}\x{723B}\x{723C}' . +'\x{723D}\x{723E}\x{723F}\x{7240}\x{7241}\x{7242}\x{7243}\x{7244}\x{7246}' . +'\x{7247}\x{7248}\x{7249}\x{724A}\x{724B}\x{724C}\x{724D}\x{724F}\x{7251}' . +'\x{7252}\x{7253}\x{7254}\x{7256}\x{7257}\x{7258}\x{7259}\x{725A}\x{725B}' . +'\x{725C}\x{725D}\x{725E}\x{725F}\x{7260}\x{7261}\x{7262}\x{7263}\x{7264}' . +'\x{7265}\x{7266}\x{7267}\x{7268}\x{7269}\x{726A}\x{726B}\x{726C}\x{726D}' . +'\x{726E}\x{726F}\x{7270}\x{7271}\x{7272}\x{7273}\x{7274}\x{7275}\x{7276}' . +'\x{7277}\x{7278}\x{7279}\x{727A}\x{727B}\x{727C}\x{727D}\x{727E}\x{727F}' . +'\x{7280}\x{7281}\x{7282}\x{7283}\x{7284}\x{7285}\x{7286}\x{7287}\x{7288}' . +'\x{7289}\x{728A}\x{728B}\x{728C}\x{728D}\x{728E}\x{728F}\x{7290}\x{7291}' . +'\x{7292}\x{7293}\x{7294}\x{7295}\x{7296}\x{7297}\x{7298}\x{7299}\x{729A}' . +'\x{729B}\x{729C}\x{729D}\x{729E}\x{729F}\x{72A1}\x{72A2}\x{72A3}\x{72A4}' . +'\x{72A5}\x{72A6}\x{72A7}\x{72A8}\x{72A9}\x{72AA}\x{72AC}\x{72AD}\x{72AE}' . +'\x{72AF}\x{72B0}\x{72B1}\x{72B2}\x{72B3}\x{72B4}\x{72B5}\x{72B6}\x{72B7}' . +'\x{72B8}\x{72B9}\x{72BA}\x{72BB}\x{72BC}\x{72BD}\x{72BF}\x{72C0}\x{72C1}' . +'\x{72C2}\x{72C3}\x{72C4}\x{72C5}\x{72C6}\x{72C7}\x{72C8}\x{72C9}\x{72CA}' . +'\x{72CB}\x{72CC}\x{72CD}\x{72CE}\x{72CF}\x{72D0}\x{72D1}\x{72D2}\x{72D3}' . +'\x{72D4}\x{72D5}\x{72D6}\x{72D7}\x{72D8}\x{72D9}\x{72DA}\x{72DB}\x{72DC}' . +'\x{72DD}\x{72DE}\x{72DF}\x{72E0}\x{72E1}\x{72E2}\x{72E3}\x{72E4}\x{72E5}' . +'\x{72E6}\x{72E7}\x{72E8}\x{72E9}\x{72EA}\x{72EB}\x{72EC}\x{72ED}\x{72EE}' . +'\x{72EF}\x{72F0}\x{72F1}\x{72F2}\x{72F3}\x{72F4}\x{72F5}\x{72F6}\x{72F7}' . +'\x{72F8}\x{72F9}\x{72FA}\x{72FB}\x{72FC}\x{72FD}\x{72FE}\x{72FF}\x{7300}' . +'\x{7301}\x{7303}\x{7304}\x{7305}\x{7306}\x{7307}\x{7308}\x{7309}\x{730A}' . +'\x{730B}\x{730C}\x{730D}\x{730E}\x{730F}\x{7311}\x{7312}\x{7313}\x{7314}' . +'\x{7315}\x{7316}\x{7317}\x{7318}\x{7319}\x{731A}\x{731B}\x{731C}\x{731D}' . +'\x{731E}\x{7320}\x{7321}\x{7322}\x{7323}\x{7324}\x{7325}\x{7326}\x{7327}' . +'\x{7329}\x{732A}\x{732B}\x{732C}\x{732D}\x{732E}\x{7330}\x{7331}\x{7332}' . +'\x{7333}\x{7334}\x{7335}\x{7336}\x{7337}\x{7338}\x{7339}\x{733A}\x{733B}' . +'\x{733C}\x{733D}\x{733E}\x{733F}\x{7340}\x{7341}\x{7342}\x{7343}\x{7344}' . +'\x{7345}\x{7346}\x{7347}\x{7348}\x{7349}\x{734A}\x{734B}\x{734C}\x{734D}' . +'\x{734E}\x{7350}\x{7351}\x{7352}\x{7354}\x{7355}\x{7356}\x{7357}\x{7358}' . +'\x{7359}\x{735A}\x{735B}\x{735C}\x{735D}\x{735E}\x{735F}\x{7360}\x{7361}' . +'\x{7362}\x{7364}\x{7365}\x{7366}\x{7367}\x{7368}\x{7369}\x{736A}\x{736B}' . +'\x{736C}\x{736D}\x{736E}\x{736F}\x{7370}\x{7371}\x{7372}\x{7373}\x{7374}' . +'\x{7375}\x{7376}\x{7377}\x{7378}\x{7379}\x{737A}\x{737B}\x{737C}\x{737D}' . +'\x{737E}\x{737F}\x{7380}\x{7381}\x{7382}\x{7383}\x{7384}\x{7385}\x{7386}' . +'\x{7387}\x{7388}\x{7389}\x{738A}\x{738B}\x{738C}\x{738D}\x{738E}\x{738F}' . +'\x{7390}\x{7391}\x{7392}\x{7393}\x{7394}\x{7395}\x{7396}\x{7397}\x{7398}' . +'\x{7399}\x{739A}\x{739B}\x{739D}\x{739E}\x{739F}\x{73A0}\x{73A1}\x{73A2}' . +'\x{73A3}\x{73A4}\x{73A5}\x{73A6}\x{73A7}\x{73A8}\x{73A9}\x{73AA}\x{73AB}' . +'\x{73AC}\x{73AD}\x{73AE}\x{73AF}\x{73B0}\x{73B1}\x{73B2}\x{73B3}\x{73B4}' . +'\x{73B5}\x{73B6}\x{73B7}\x{73B8}\x{73B9}\x{73BA}\x{73BB}\x{73BC}\x{73BD}' . +'\x{73BE}\x{73BF}\x{73C0}\x{73C2}\x{73C3}\x{73C4}\x{73C5}\x{73C6}\x{73C7}' . +'\x{73C8}\x{73C9}\x{73CA}\x{73CB}\x{73CC}\x{73CD}\x{73CE}\x{73CF}\x{73D0}' . +'\x{73D1}\x{73D2}\x{73D3}\x{73D4}\x{73D5}\x{73D6}\x{73D7}\x{73D8}\x{73D9}' . +'\x{73DA}\x{73DB}\x{73DC}\x{73DD}\x{73DE}\x{73DF}\x{73E0}\x{73E2}\x{73E3}' . +'\x{73E5}\x{73E6}\x{73E7}\x{73E8}\x{73E9}\x{73EA}\x{73EB}\x{73EC}\x{73ED}' . +'\x{73EE}\x{73EF}\x{73F0}\x{73F1}\x{73F2}\x{73F4}\x{73F5}\x{73F6}\x{73F7}' . +'\x{73F8}\x{73F9}\x{73FA}\x{73FC}\x{73FD}\x{73FE}\x{73FF}\x{7400}\x{7401}' . +'\x{7402}\x{7403}\x{7404}\x{7405}\x{7406}\x{7407}\x{7408}\x{7409}\x{740A}' . +'\x{740B}\x{740C}\x{740D}\x{740E}\x{740F}\x{7410}\x{7411}\x{7412}\x{7413}' . +'\x{7414}\x{7415}\x{7416}\x{7417}\x{7419}\x{741A}\x{741B}\x{741C}\x{741D}' . +'\x{741E}\x{741F}\x{7420}\x{7421}\x{7422}\x{7423}\x{7424}\x{7425}\x{7426}' . +'\x{7427}\x{7428}\x{7429}\x{742A}\x{742B}\x{742C}\x{742D}\x{742E}\x{742F}' . +'\x{7430}\x{7431}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{7437}\x{7438}' . +'\x{743A}\x{743B}\x{743C}\x{743D}\x{743F}\x{7440}\x{7441}\x{7442}\x{7443}' . +'\x{7444}\x{7445}\x{7446}\x{7448}\x{744A}\x{744B}\x{744C}\x{744D}\x{744E}' . +'\x{744F}\x{7450}\x{7451}\x{7452}\x{7453}\x{7454}\x{7455}\x{7456}\x{7457}' . +'\x{7459}\x{745A}\x{745B}\x{745C}\x{745D}\x{745E}\x{745F}\x{7461}\x{7462}' . +'\x{7463}\x{7464}\x{7465}\x{7466}\x{7467}\x{7468}\x{7469}\x{746A}\x{746B}' . +'\x{746C}\x{746D}\x{746E}\x{746F}\x{7470}\x{7471}\x{7472}\x{7473}\x{7474}' . +'\x{7475}\x{7476}\x{7477}\x{7478}\x{7479}\x{747A}\x{747C}\x{747D}\x{747E}' . +'\x{747F}\x{7480}\x{7481}\x{7482}\x{7483}\x{7485}\x{7486}\x{7487}\x{7488}' . +'\x{7489}\x{748A}\x{748B}\x{748C}\x{748D}\x{748E}\x{748F}\x{7490}\x{7491}' . +'\x{7492}\x{7493}\x{7494}\x{7495}\x{7497}\x{7498}\x{7499}\x{749A}\x{749B}' . +'\x{749C}\x{749E}\x{749F}\x{74A0}\x{74A1}\x{74A3}\x{74A4}\x{74A5}\x{74A6}' . +'\x{74A7}\x{74A8}\x{74A9}\x{74AA}\x{74AB}\x{74AC}\x{74AD}\x{74AE}\x{74AF}' . +'\x{74B0}\x{74B1}\x{74B2}\x{74B3}\x{74B4}\x{74B5}\x{74B6}\x{74B7}\x{74B8}' . +'\x{74B9}\x{74BA}\x{74BB}\x{74BC}\x{74BD}\x{74BE}\x{74BF}\x{74C0}\x{74C1}' . +'\x{74C2}\x{74C3}\x{74C4}\x{74C5}\x{74C6}\x{74CA}\x{74CB}\x{74CD}\x{74CE}' . +'\x{74CF}\x{74D0}\x{74D1}\x{74D2}\x{74D3}\x{74D4}\x{74D5}\x{74D6}\x{74D7}' . +'\x{74D8}\x{74D9}\x{74DA}\x{74DB}\x{74DC}\x{74DD}\x{74DE}\x{74DF}\x{74E0}' . +'\x{74E1}\x{74E2}\x{74E3}\x{74E4}\x{74E5}\x{74E6}\x{74E7}\x{74E8}\x{74E9}' . +'\x{74EA}\x{74EC}\x{74ED}\x{74EE}\x{74EF}\x{74F0}\x{74F1}\x{74F2}\x{74F3}' . +'\x{74F4}\x{74F5}\x{74F6}\x{74F7}\x{74F8}\x{74F9}\x{74FA}\x{74FB}\x{74FC}' . +'\x{74FD}\x{74FE}\x{74FF}\x{7500}\x{7501}\x{7502}\x{7503}\x{7504}\x{7505}' . +'\x{7506}\x{7507}\x{7508}\x{7509}\x{750A}\x{750B}\x{750C}\x{750D}\x{750F}' . +'\x{7510}\x{7511}\x{7512}\x{7513}\x{7514}\x{7515}\x{7516}\x{7517}\x{7518}' . +'\x{7519}\x{751A}\x{751B}\x{751C}\x{751D}\x{751E}\x{751F}\x{7521}\x{7522}' . +'\x{7523}\x{7524}\x{7525}\x{7526}\x{7527}\x{7528}\x{7529}\x{752A}\x{752B}' . +'\x{752C}\x{752D}\x{752E}\x{752F}\x{7530}\x{7531}\x{7532}\x{7533}\x{7535}' . +'\x{7536}\x{7537}\x{7538}\x{7539}\x{753A}\x{753B}\x{753C}\x{753D}\x{753E}' . +'\x{753F}\x{7540}\x{7542}\x{7543}\x{7544}\x{7545}\x{7546}\x{7547}\x{7548}' . +'\x{7549}\x{754B}\x{754C}\x{754D}\x{754E}\x{754F}\x{7550}\x{7551}\x{7553}' . +'\x{7554}\x{7556}\x{7557}\x{7558}\x{7559}\x{755A}\x{755B}\x{755C}\x{755D}' . +'\x{755F}\x{7560}\x{7562}\x{7563}\x{7564}\x{7565}\x{7566}\x{7567}\x{7568}' . +'\x{7569}\x{756A}\x{756B}\x{756C}\x{756D}\x{756E}\x{756F}\x{7570}\x{7572}' . +'\x{7574}\x{7575}\x{7576}\x{7577}\x{7578}\x{7579}\x{757C}\x{757D}\x{757E}' . +'\x{757F}\x{7580}\x{7581}\x{7582}\x{7583}\x{7584}\x{7586}\x{7587}\x{7588}' . +'\x{7589}\x{758A}\x{758B}\x{758C}\x{758D}\x{758F}\x{7590}\x{7591}\x{7592}' . +'\x{7593}\x{7594}\x{7595}\x{7596}\x{7597}\x{7598}\x{7599}\x{759A}\x{759B}' . +'\x{759C}\x{759D}\x{759E}\x{759F}\x{75A0}\x{75A1}\x{75A2}\x{75A3}\x{75A4}' . +'\x{75A5}\x{75A6}\x{75A7}\x{75A8}\x{75AA}\x{75AB}\x{75AC}\x{75AD}\x{75AE}' . +'\x{75AF}\x{75B0}\x{75B1}\x{75B2}\x{75B3}\x{75B4}\x{75B5}\x{75B6}\x{75B8}' . +'\x{75B9}\x{75BA}\x{75BB}\x{75BC}\x{75BD}\x{75BE}\x{75BF}\x{75C0}\x{75C1}' . +'\x{75C2}\x{75C3}\x{75C4}\x{75C5}\x{75C6}\x{75C7}\x{75C8}\x{75C9}\x{75CA}' . +'\x{75CB}\x{75CC}\x{75CD}\x{75CE}\x{75CF}\x{75D0}\x{75D1}\x{75D2}\x{75D3}' . +'\x{75D4}\x{75D5}\x{75D6}\x{75D7}\x{75D8}\x{75D9}\x{75DA}\x{75DB}\x{75DD}' . +'\x{75DE}\x{75DF}\x{75E0}\x{75E1}\x{75E2}\x{75E3}\x{75E4}\x{75E5}\x{75E6}' . +'\x{75E7}\x{75E8}\x{75EA}\x{75EB}\x{75EC}\x{75ED}\x{75EF}\x{75F0}\x{75F1}' . +'\x{75F2}\x{75F3}\x{75F4}\x{75F5}\x{75F6}\x{75F7}\x{75F8}\x{75F9}\x{75FA}' . +'\x{75FB}\x{75FC}\x{75FD}\x{75FE}\x{75FF}\x{7600}\x{7601}\x{7602}\x{7603}' . +'\x{7604}\x{7605}\x{7606}\x{7607}\x{7608}\x{7609}\x{760A}\x{760B}\x{760C}' . +'\x{760D}\x{760E}\x{760F}\x{7610}\x{7611}\x{7612}\x{7613}\x{7614}\x{7615}' . +'\x{7616}\x{7617}\x{7618}\x{7619}\x{761A}\x{761B}\x{761C}\x{761D}\x{761E}' . +'\x{761F}\x{7620}\x{7621}\x{7622}\x{7623}\x{7624}\x{7625}\x{7626}\x{7627}' . +'\x{7628}\x{7629}\x{762A}\x{762B}\x{762D}\x{762E}\x{762F}\x{7630}\x{7631}' . +'\x{7632}\x{7633}\x{7634}\x{7635}\x{7636}\x{7637}\x{7638}\x{7639}\x{763A}' . +'\x{763B}\x{763C}\x{763D}\x{763E}\x{763F}\x{7640}\x{7641}\x{7642}\x{7643}' . +'\x{7646}\x{7647}\x{7648}\x{7649}\x{764A}\x{764B}\x{764C}\x{764D}\x{764F}' . +'\x{7650}\x{7652}\x{7653}\x{7654}\x{7656}\x{7657}\x{7658}\x{7659}\x{765A}' . +'\x{765B}\x{765C}\x{765D}\x{765E}\x{765F}\x{7660}\x{7661}\x{7662}\x{7663}' . +'\x{7664}\x{7665}\x{7666}\x{7667}\x{7668}\x{7669}\x{766A}\x{766B}\x{766C}' . +'\x{766D}\x{766E}\x{766F}\x{7670}\x{7671}\x{7672}\x{7674}\x{7675}\x{7676}' . +'\x{7677}\x{7678}\x{7679}\x{767B}\x{767C}\x{767D}\x{767E}\x{767F}\x{7680}' . +'\x{7681}\x{7682}\x{7683}\x{7684}\x{7685}\x{7686}\x{7687}\x{7688}\x{7689}' . +'\x{768A}\x{768B}\x{768C}\x{768E}\x{768F}\x{7690}\x{7691}\x{7692}\x{7693}' . +'\x{7694}\x{7695}\x{7696}\x{7697}\x{7698}\x{7699}\x{769A}\x{769B}\x{769C}' . +'\x{769D}\x{769E}\x{769F}\x{76A0}\x{76A3}\x{76A4}\x{76A6}\x{76A7}\x{76A9}' . +'\x{76AA}\x{76AB}\x{76AC}\x{76AD}\x{76AE}\x{76AF}\x{76B0}\x{76B1}\x{76B2}' . +'\x{76B4}\x{76B5}\x{76B7}\x{76B8}\x{76BA}\x{76BB}\x{76BC}\x{76BD}\x{76BE}' . +'\x{76BF}\x{76C0}\x{76C2}\x{76C3}\x{76C4}\x{76C5}\x{76C6}\x{76C7}\x{76C8}' . +'\x{76C9}\x{76CA}\x{76CD}\x{76CE}\x{76CF}\x{76D0}\x{76D1}\x{76D2}\x{76D3}' . +'\x{76D4}\x{76D5}\x{76D6}\x{76D7}\x{76D8}\x{76DA}\x{76DB}\x{76DC}\x{76DD}' . +'\x{76DE}\x{76DF}\x{76E0}\x{76E1}\x{76E2}\x{76E3}\x{76E4}\x{76E5}\x{76E6}' . +'\x{76E7}\x{76E8}\x{76E9}\x{76EA}\x{76EC}\x{76ED}\x{76EE}\x{76EF}\x{76F0}' . +'\x{76F1}\x{76F2}\x{76F3}\x{76F4}\x{76F5}\x{76F6}\x{76F7}\x{76F8}\x{76F9}' . +'\x{76FA}\x{76FB}\x{76FC}\x{76FD}\x{76FE}\x{76FF}\x{7701}\x{7703}\x{7704}' . +'\x{7705}\x{7706}\x{7707}\x{7708}\x{7709}\x{770A}\x{770B}\x{770C}\x{770D}' . +'\x{770F}\x{7710}\x{7711}\x{7712}\x{7713}\x{7714}\x{7715}\x{7716}\x{7717}' . +'\x{7718}\x{7719}\x{771A}\x{771B}\x{771C}\x{771D}\x{771E}\x{771F}\x{7720}' . +'\x{7722}\x{7723}\x{7725}\x{7726}\x{7727}\x{7728}\x{7729}\x{772A}\x{772C}' . +'\x{772D}\x{772E}\x{772F}\x{7730}\x{7731}\x{7732}\x{7733}\x{7734}\x{7735}' . +'\x{7736}\x{7737}\x{7738}\x{7739}\x{773A}\x{773B}\x{773C}\x{773D}\x{773E}' . +'\x{7740}\x{7741}\x{7743}\x{7744}\x{7745}\x{7746}\x{7747}\x{7748}\x{7749}' . +'\x{774A}\x{774B}\x{774C}\x{774D}\x{774E}\x{774F}\x{7750}\x{7751}\x{7752}' . +'\x{7753}\x{7754}\x{7755}\x{7756}\x{7757}\x{7758}\x{7759}\x{775A}\x{775B}' . +'\x{775C}\x{775D}\x{775E}\x{775F}\x{7760}\x{7761}\x{7762}\x{7763}\x{7765}' . +'\x{7766}\x{7767}\x{7768}\x{7769}\x{776A}\x{776B}\x{776C}\x{776D}\x{776E}' . +'\x{776F}\x{7770}\x{7771}\x{7772}\x{7773}\x{7774}\x{7775}\x{7776}\x{7777}' . +'\x{7778}\x{7779}\x{777A}\x{777B}\x{777C}\x{777D}\x{777E}\x{777F}\x{7780}' . +'\x{7781}\x{7782}\x{7783}\x{7784}\x{7785}\x{7786}\x{7787}\x{7788}\x{7789}' . +'\x{778A}\x{778B}\x{778C}\x{778D}\x{778E}\x{778F}\x{7790}\x{7791}\x{7792}' . +'\x{7793}\x{7794}\x{7795}\x{7797}\x{7798}\x{7799}\x{779A}\x{779B}\x{779C}' . +'\x{779D}\x{779E}\x{779F}\x{77A0}\x{77A1}\x{77A2}\x{77A3}\x{77A5}\x{77A6}' . +'\x{77A7}\x{77A8}\x{77A9}\x{77AA}\x{77AB}\x{77AC}\x{77AD}\x{77AE}\x{77AF}' . +'\x{77B0}\x{77B1}\x{77B2}\x{77B3}\x{77B4}\x{77B5}\x{77B6}\x{77B7}\x{77B8}' . +'\x{77B9}\x{77BA}\x{77BB}\x{77BC}\x{77BD}\x{77BF}\x{77C0}\x{77C2}\x{77C3}' . +'\x{77C4}\x{77C5}\x{77C6}\x{77C7}\x{77C8}\x{77C9}\x{77CA}\x{77CB}\x{77CC}' . +'\x{77CD}\x{77CE}\x{77CF}\x{77D0}\x{77D1}\x{77D3}\x{77D4}\x{77D5}\x{77D6}' . +'\x{77D7}\x{77D8}\x{77D9}\x{77DA}\x{77DB}\x{77DC}\x{77DE}\x{77DF}\x{77E0}' . +'\x{77E1}\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E8}\x{77E9}\x{77EA}\x{77EB}' . +'\x{77EC}\x{77ED}\x{77EE}\x{77EF}\x{77F0}\x{77F1}\x{77F2}\x{77F3}\x{77F6}' . +'\x{77F7}\x{77F8}\x{77F9}\x{77FA}\x{77FB}\x{77FC}\x{77FD}\x{77FE}\x{77FF}' . +'\x{7800}\x{7801}\x{7802}\x{7803}\x{7804}\x{7805}\x{7806}\x{7808}\x{7809}' . +'\x{780A}\x{780B}\x{780C}\x{780D}\x{780E}\x{780F}\x{7810}\x{7811}\x{7812}' . +'\x{7813}\x{7814}\x{7815}\x{7816}\x{7817}\x{7818}\x{7819}\x{781A}\x{781B}' . +'\x{781C}\x{781D}\x{781E}\x{781F}\x{7820}\x{7821}\x{7822}\x{7823}\x{7825}' . +'\x{7826}\x{7827}\x{7828}\x{7829}\x{782A}\x{782B}\x{782C}\x{782D}\x{782E}' . +'\x{782F}\x{7830}\x{7831}\x{7832}\x{7833}\x{7834}\x{7835}\x{7837}\x{7838}' . +'\x{7839}\x{783A}\x{783B}\x{783C}\x{783D}\x{783E}\x{7840}\x{7841}\x{7843}' . +'\x{7844}\x{7845}\x{7847}\x{7848}\x{7849}\x{784A}\x{784C}\x{784D}\x{784E}' . +'\x{7850}\x{7851}\x{7852}\x{7853}\x{7854}\x{7855}\x{7856}\x{7857}\x{7858}' . +'\x{7859}\x{785A}\x{785B}\x{785C}\x{785D}\x{785E}\x{785F}\x{7860}\x{7861}' . +'\x{7862}\x{7863}\x{7864}\x{7865}\x{7866}\x{7867}\x{7868}\x{7869}\x{786A}' . +'\x{786B}\x{786C}\x{786D}\x{786E}\x{786F}\x{7870}\x{7871}\x{7872}\x{7873}' . +'\x{7874}\x{7875}\x{7877}\x{7878}\x{7879}\x{787A}\x{787B}\x{787C}\x{787D}' . +'\x{787E}\x{787F}\x{7880}\x{7881}\x{7882}\x{7883}\x{7884}\x{7885}\x{7886}' . +'\x{7887}\x{7889}\x{788A}\x{788B}\x{788C}\x{788D}\x{788E}\x{788F}\x{7890}' . +'\x{7891}\x{7892}\x{7893}\x{7894}\x{7895}\x{7896}\x{7897}\x{7898}\x{7899}' . +'\x{789A}\x{789B}\x{789C}\x{789D}\x{789E}\x{789F}\x{78A0}\x{78A1}\x{78A2}' . +'\x{78A3}\x{78A4}\x{78A5}\x{78A6}\x{78A7}\x{78A8}\x{78A9}\x{78AA}\x{78AB}' . +'\x{78AC}\x{78AD}\x{78AE}\x{78AF}\x{78B0}\x{78B1}\x{78B2}\x{78B3}\x{78B4}' . +'\x{78B5}\x{78B6}\x{78B7}\x{78B8}\x{78B9}\x{78BA}\x{78BB}\x{78BC}\x{78BD}' . +'\x{78BE}\x{78BF}\x{78C0}\x{78C1}\x{78C3}\x{78C4}\x{78C5}\x{78C6}\x{78C8}' . +'\x{78C9}\x{78CA}\x{78CB}\x{78CC}\x{78CD}\x{78CE}\x{78CF}\x{78D0}\x{78D1}' . +'\x{78D3}\x{78D4}\x{78D5}\x{78D6}\x{78D7}\x{78D8}\x{78D9}\x{78DA}\x{78DB}' . +'\x{78DC}\x{78DD}\x{78DE}\x{78DF}\x{78E0}\x{78E1}\x{78E2}\x{78E3}\x{78E4}' . +'\x{78E5}\x{78E6}\x{78E7}\x{78E8}\x{78E9}\x{78EA}\x{78EB}\x{78EC}\x{78ED}' . +'\x{78EE}\x{78EF}\x{78F1}\x{78F2}\x{78F3}\x{78F4}\x{78F5}\x{78F6}\x{78F7}' . +'\x{78F9}\x{78FA}\x{78FB}\x{78FC}\x{78FD}\x{78FE}\x{78FF}\x{7901}\x{7902}' . +'\x{7903}\x{7904}\x{7905}\x{7906}\x{7907}\x{7909}\x{790A}\x{790B}\x{790C}' . +'\x{790E}\x{790F}\x{7910}\x{7911}\x{7912}\x{7913}\x{7914}\x{7916}\x{7917}' . +'\x{7918}\x{7919}\x{791A}\x{791B}\x{791C}\x{791D}\x{791E}\x{7921}\x{7922}' . +'\x{7923}\x{7924}\x{7925}\x{7926}\x{7927}\x{7928}\x{7929}\x{792A}\x{792B}' . +'\x{792C}\x{792D}\x{792E}\x{792F}\x{7930}\x{7931}\x{7933}\x{7934}\x{7935}' . +'\x{7937}\x{7938}\x{7939}\x{793A}\x{793B}\x{793C}\x{793D}\x{793E}\x{793F}' . +'\x{7940}\x{7941}\x{7942}\x{7943}\x{7944}\x{7945}\x{7946}\x{7947}\x{7948}' . +'\x{7949}\x{794A}\x{794B}\x{794C}\x{794D}\x{794E}\x{794F}\x{7950}\x{7951}' . +'\x{7952}\x{7953}\x{7954}\x{7955}\x{7956}\x{7957}\x{7958}\x{795A}\x{795B}' . +'\x{795C}\x{795D}\x{795E}\x{795F}\x{7960}\x{7961}\x{7962}\x{7963}\x{7964}' . +'\x{7965}\x{7966}\x{7967}\x{7968}\x{7969}\x{796A}\x{796B}\x{796D}\x{796F}' . +'\x{7970}\x{7971}\x{7972}\x{7973}\x{7974}\x{7977}\x{7978}\x{7979}\x{797A}' . +'\x{797B}\x{797C}\x{797D}\x{797E}\x{797F}\x{7980}\x{7981}\x{7982}\x{7983}' . +'\x{7984}\x{7985}\x{7988}\x{7989}\x{798A}\x{798B}\x{798C}\x{798D}\x{798E}' . +'\x{798F}\x{7990}\x{7991}\x{7992}\x{7993}\x{7994}\x{7995}\x{7996}\x{7997}' . +'\x{7998}\x{7999}\x{799A}\x{799B}\x{799C}\x{799F}\x{79A0}\x{79A1}\x{79A2}' . +'\x{79A3}\x{79A4}\x{79A5}\x{79A6}\x{79A7}\x{79A8}\x{79AA}\x{79AB}\x{79AC}' . +'\x{79AD}\x{79AE}\x{79AF}\x{79B0}\x{79B1}\x{79B2}\x{79B3}\x{79B4}\x{79B5}' . +'\x{79B6}\x{79B7}\x{79B8}\x{79B9}\x{79BA}\x{79BB}\x{79BD}\x{79BE}\x{79BF}' . +'\x{79C0}\x{79C1}\x{79C2}\x{79C3}\x{79C5}\x{79C6}\x{79C8}\x{79C9}\x{79CA}' . +'\x{79CB}\x{79CD}\x{79CE}\x{79CF}\x{79D0}\x{79D1}\x{79D2}\x{79D3}\x{79D5}' . +'\x{79D6}\x{79D8}\x{79D9}\x{79DA}\x{79DB}\x{79DC}\x{79DD}\x{79DE}\x{79DF}' . +'\x{79E0}\x{79E1}\x{79E2}\x{79E3}\x{79E4}\x{79E5}\x{79E6}\x{79E7}\x{79E8}' . +'\x{79E9}\x{79EA}\x{79EB}\x{79EC}\x{79ED}\x{79EE}\x{79EF}\x{79F0}\x{79F1}' . +'\x{79F2}\x{79F3}\x{79F4}\x{79F5}\x{79F6}\x{79F7}\x{79F8}\x{79F9}\x{79FA}' . +'\x{79FB}\x{79FC}\x{79FD}\x{79FE}\x{79FF}\x{7A00}\x{7A02}\x{7A03}\x{7A04}' . +'\x{7A05}\x{7A06}\x{7A08}\x{7A0A}\x{7A0B}\x{7A0C}\x{7A0D}\x{7A0E}\x{7A0F}' . +'\x{7A10}\x{7A11}\x{7A12}\x{7A13}\x{7A14}\x{7A15}\x{7A16}\x{7A17}\x{7A18}' . +'\x{7A19}\x{7A1A}\x{7A1B}\x{7A1C}\x{7A1D}\x{7A1E}\x{7A1F}\x{7A20}\x{7A21}' . +'\x{7A22}\x{7A23}\x{7A24}\x{7A25}\x{7A26}\x{7A27}\x{7A28}\x{7A29}\x{7A2A}' . +'\x{7A2B}\x{7A2D}\x{7A2E}\x{7A2F}\x{7A30}\x{7A31}\x{7A32}\x{7A33}\x{7A34}' . +'\x{7A35}\x{7A37}\x{7A39}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' . +'\x{7A41}\x{7A42}\x{7A43}\x{7A44}\x{7A45}\x{7A46}\x{7A47}\x{7A48}\x{7A49}' . +'\x{7A4A}\x{7A4B}\x{7A4C}\x{7A4D}\x{7A4E}\x{7A50}\x{7A51}\x{7A52}\x{7A53}' . +'\x{7A54}\x{7A55}\x{7A56}\x{7A57}\x{7A58}\x{7A59}\x{7A5A}\x{7A5B}\x{7A5C}' . +'\x{7A5D}\x{7A5E}\x{7A5F}\x{7A60}\x{7A61}\x{7A62}\x{7A65}\x{7A66}\x{7A67}' . +'\x{7A68}\x{7A69}\x{7A6B}\x{7A6C}\x{7A6D}\x{7A6E}\x{7A70}\x{7A71}\x{7A72}' . +'\x{7A73}\x{7A74}\x{7A75}\x{7A76}\x{7A77}\x{7A78}\x{7A79}\x{7A7A}\x{7A7B}' . +'\x{7A7C}\x{7A7D}\x{7A7E}\x{7A7F}\x{7A80}\x{7A81}\x{7A83}\x{7A84}\x{7A85}' . +'\x{7A86}\x{7A87}\x{7A88}\x{7A89}\x{7A8A}\x{7A8B}\x{7A8C}\x{7A8D}\x{7A8E}' . +'\x{7A8F}\x{7A90}\x{7A91}\x{7A92}\x{7A93}\x{7A94}\x{7A95}\x{7A96}\x{7A97}' . +'\x{7A98}\x{7A99}\x{7A9C}\x{7A9D}\x{7A9E}\x{7A9F}\x{7AA0}\x{7AA1}\x{7AA2}' . +'\x{7AA3}\x{7AA4}\x{7AA5}\x{7AA6}\x{7AA7}\x{7AA8}\x{7AA9}\x{7AAA}\x{7AAB}' . +'\x{7AAC}\x{7AAD}\x{7AAE}\x{7AAF}\x{7AB0}\x{7AB1}\x{7AB2}\x{7AB3}\x{7AB4}' . +'\x{7AB5}\x{7AB6}\x{7AB7}\x{7AB8}\x{7ABA}\x{7ABE}\x{7ABF}\x{7AC0}\x{7AC1}' . +'\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}\x{7AC9}\x{7ACA}\x{7ACB}\x{7ACC}\x{7ACD}' . +'\x{7ACE}\x{7ACF}\x{7AD0}\x{7AD1}\x{7AD2}\x{7AD3}\x{7AD4}\x{7AD5}\x{7AD6}' . +'\x{7AD8}\x{7AD9}\x{7ADB}\x{7ADC}\x{7ADD}\x{7ADE}\x{7ADF}\x{7AE0}\x{7AE1}' . +'\x{7AE2}\x{7AE3}\x{7AE4}\x{7AE5}\x{7AE6}\x{7AE7}\x{7AE8}\x{7AEA}\x{7AEB}' . +'\x{7AEC}\x{7AED}\x{7AEE}\x{7AEF}\x{7AF0}\x{7AF1}\x{7AF2}\x{7AF3}\x{7AF4}' . +'\x{7AF6}\x{7AF7}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFB}\x{7AFD}\x{7AFE}\x{7AFF}' . +'\x{7B00}\x{7B01}\x{7B02}\x{7B03}\x{7B04}\x{7B05}\x{7B06}\x{7B08}\x{7B09}' . +'\x{7B0A}\x{7B0B}\x{7B0C}\x{7B0D}\x{7B0E}\x{7B0F}\x{7B10}\x{7B11}\x{7B12}' . +'\x{7B13}\x{7B14}\x{7B15}\x{7B16}\x{7B17}\x{7B18}\x{7B19}\x{7B1A}\x{7B1B}' . +'\x{7B1C}\x{7B1D}\x{7B1E}\x{7B20}\x{7B21}\x{7B22}\x{7B23}\x{7B24}\x{7B25}' . +'\x{7B26}\x{7B28}\x{7B2A}\x{7B2B}\x{7B2C}\x{7B2D}\x{7B2E}\x{7B2F}\x{7B30}' . +'\x{7B31}\x{7B32}\x{7B33}\x{7B34}\x{7B35}\x{7B36}\x{7B37}\x{7B38}\x{7B39}' . +'\x{7B3A}\x{7B3B}\x{7B3C}\x{7B3D}\x{7B3E}\x{7B3F}\x{7B40}\x{7B41}\x{7B43}' . +'\x{7B44}\x{7B45}\x{7B46}\x{7B47}\x{7B48}\x{7B49}\x{7B4A}\x{7B4B}\x{7B4C}' . +'\x{7B4D}\x{7B4E}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B55}\x{7B56}' . +'\x{7B57}\x{7B58}\x{7B59}\x{7B5A}\x{7B5B}\x{7B5C}\x{7B5D}\x{7B5E}\x{7B5F}' . +'\x{7B60}\x{7B61}\x{7B62}\x{7B63}\x{7B64}\x{7B65}\x{7B66}\x{7B67}\x{7B68}' . +'\x{7B69}\x{7B6A}\x{7B6B}\x{7B6C}\x{7B6D}\x{7B6E}\x{7B70}\x{7B71}\x{7B72}' . +'\x{7B73}\x{7B74}\x{7B75}\x{7B76}\x{7B77}\x{7B78}\x{7B79}\x{7B7B}\x{7B7C}' . +'\x{7B7D}\x{7B7E}\x{7B7F}\x{7B80}\x{7B81}\x{7B82}\x{7B83}\x{7B84}\x{7B85}' . +'\x{7B87}\x{7B88}\x{7B89}\x{7B8A}\x{7B8B}\x{7B8C}\x{7B8D}\x{7B8E}\x{7B8F}' . +'\x{7B90}\x{7B91}\x{7B93}\x{7B94}\x{7B95}\x{7B96}\x{7B97}\x{7B98}\x{7B99}' . +'\x{7B9A}\x{7B9B}\x{7B9C}\x{7B9D}\x{7B9E}\x{7B9F}\x{7BA0}\x{7BA1}\x{7BA2}' . +'\x{7BA4}\x{7BA6}\x{7BA7}\x{7BA8}\x{7BA9}\x{7BAA}\x{7BAB}\x{7BAC}\x{7BAD}' . +'\x{7BAE}\x{7BAF}\x{7BB1}\x{7BB3}\x{7BB4}\x{7BB5}\x{7BB6}\x{7BB7}\x{7BB8}' . +'\x{7BB9}\x{7BBA}\x{7BBB}\x{7BBC}\x{7BBD}\x{7BBE}\x{7BBF}\x{7BC0}\x{7BC1}' . +'\x{7BC2}\x{7BC3}\x{7BC4}\x{7BC5}\x{7BC6}\x{7BC7}\x{7BC8}\x{7BC9}\x{7BCA}' . +'\x{7BCB}\x{7BCC}\x{7BCD}\x{7BCE}\x{7BD0}\x{7BD1}\x{7BD2}\x{7BD3}\x{7BD4}' . +'\x{7BD5}\x{7BD6}\x{7BD7}\x{7BD8}\x{7BD9}\x{7BDA}\x{7BDB}\x{7BDC}\x{7BDD}' . +'\x{7BDE}\x{7BDF}\x{7BE0}\x{7BE1}\x{7BE2}\x{7BE3}\x{7BE4}\x{7BE5}\x{7BE6}' . +'\x{7BE7}\x{7BE8}\x{7BE9}\x{7BEA}\x{7BEB}\x{7BEC}\x{7BED}\x{7BEE}\x{7BEF}' . +'\x{7BF0}\x{7BF1}\x{7BF2}\x{7BF3}\x{7BF4}\x{7BF5}\x{7BF6}\x{7BF7}\x{7BF8}' . +'\x{7BF9}\x{7BFB}\x{7BFC}\x{7BFD}\x{7BFE}\x{7BFF}\x{7C00}\x{7C01}\x{7C02}' . +'\x{7C03}\x{7C04}\x{7C05}\x{7C06}\x{7C07}\x{7C08}\x{7C09}\x{7C0A}\x{7C0B}' . +'\x{7C0C}\x{7C0D}\x{7C0E}\x{7C0F}\x{7C10}\x{7C11}\x{7C12}\x{7C13}\x{7C15}' . +'\x{7C16}\x{7C17}\x{7C18}\x{7C19}\x{7C1A}\x{7C1C}\x{7C1D}\x{7C1E}\x{7C1F}' . +'\x{7C20}\x{7C21}\x{7C22}\x{7C23}\x{7C24}\x{7C25}\x{7C26}\x{7C27}\x{7C28}' . +'\x{7C29}\x{7C2A}\x{7C2B}\x{7C2C}\x{7C2D}\x{7C30}\x{7C31}\x{7C32}\x{7C33}' . +'\x{7C34}\x{7C35}\x{7C36}\x{7C37}\x{7C38}\x{7C39}\x{7C3A}\x{7C3B}\x{7C3C}' . +'\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C41}\x{7C42}\x{7C43}\x{7C44}\x{7C45}' . +'\x{7C46}\x{7C47}\x{7C48}\x{7C49}\x{7C4A}\x{7C4B}\x{7C4C}\x{7C4D}\x{7C4E}' . +'\x{7C50}\x{7C51}\x{7C53}\x{7C54}\x{7C56}\x{7C57}\x{7C58}\x{7C59}\x{7C5A}' . +'\x{7C5B}\x{7C5C}\x{7C5E}\x{7C5F}\x{7C60}\x{7C61}\x{7C62}\x{7C63}\x{7C64}' . +'\x{7C65}\x{7C66}\x{7C67}\x{7C68}\x{7C69}\x{7C6A}\x{7C6B}\x{7C6C}\x{7C6D}' . +'\x{7C6E}\x{7C6F}\x{7C70}\x{7C71}\x{7C72}\x{7C73}\x{7C74}\x{7C75}\x{7C77}' . +'\x{7C78}\x{7C79}\x{7C7A}\x{7C7B}\x{7C7C}\x{7C7D}\x{7C7E}\x{7C7F}\x{7C80}' . +'\x{7C81}\x{7C82}\x{7C84}\x{7C85}\x{7C86}\x{7C88}\x{7C89}\x{7C8A}\x{7C8B}' . +'\x{7C8C}\x{7C8D}\x{7C8E}\x{7C8F}\x{7C90}\x{7C91}\x{7C92}\x{7C94}\x{7C95}' . +'\x{7C96}\x{7C97}\x{7C98}\x{7C99}\x{7C9B}\x{7C9C}\x{7C9D}\x{7C9E}\x{7C9F}' . +'\x{7CA0}\x{7CA1}\x{7CA2}\x{7CA3}\x{7CA4}\x{7CA5}\x{7CA6}\x{7CA7}\x{7CA8}' . +'\x{7CA9}\x{7CAA}\x{7CAD}\x{7CAE}\x{7CAF}\x{7CB0}\x{7CB1}\x{7CB2}\x{7CB3}' . +'\x{7CB4}\x{7CB5}\x{7CB6}\x{7CB7}\x{7CB8}\x{7CB9}\x{7CBA}\x{7CBB}\x{7CBC}' . +'\x{7CBD}\x{7CBE}\x{7CBF}\x{7CC0}\x{7CC1}\x{7CC2}\x{7CC3}\x{7CC4}\x{7CC5}' . +'\x{7CC6}\x{7CC7}\x{7CC8}\x{7CC9}\x{7CCA}\x{7CCB}\x{7CCC}\x{7CCD}\x{7CCE}' . +'\x{7CCF}\x{7CD0}\x{7CD1}\x{7CD2}\x{7CD4}\x{7CD5}\x{7CD6}\x{7CD7}\x{7CD8}' . +'\x{7CD9}\x{7CDC}\x{7CDD}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE4}\x{7CE7}' . +'\x{7CE8}\x{7CE9}\x{7CEA}\x{7CEB}\x{7CEC}\x{7CED}\x{7CEE}\x{7CEF}\x{7CF0}' . +'\x{7CF1}\x{7CF2}\x{7CF3}\x{7CF4}\x{7CF5}\x{7CF6}\x{7CF7}\x{7CF8}\x{7CF9}' . +'\x{7CFA}\x{7CFB}\x{7CFD}\x{7CFE}\x{7D00}\x{7D01}\x{7D02}\x{7D03}\x{7D04}' . +'\x{7D05}\x{7D06}\x{7D07}\x{7D08}\x{7D09}\x{7D0A}\x{7D0B}\x{7D0C}\x{7D0D}' . +'\x{7D0E}\x{7D0F}\x{7D10}\x{7D11}\x{7D12}\x{7D13}\x{7D14}\x{7D15}\x{7D16}' . +'\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D1D}\x{7D1E}\x{7D1F}' . +'\x{7D20}\x{7D21}\x{7D22}\x{7D24}\x{7D25}\x{7D26}\x{7D27}\x{7D28}\x{7D29}' . +'\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D31}\x{7D32}\x{7D33}\x{7D34}' . +'\x{7D35}\x{7D36}\x{7D37}\x{7D38}\x{7D39}\x{7D3A}\x{7D3B}\x{7D3C}\x{7D3D}' . +'\x{7D3E}\x{7D3F}\x{7D40}\x{7D41}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}' . +'\x{7D47}\x{7D49}\x{7D4A}\x{7D4B}\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D51}' . +'\x{7D52}\x{7D53}\x{7D54}\x{7D55}\x{7D56}\x{7D57}\x{7D58}\x{7D59}\x{7D5B}' . +'\x{7D5C}\x{7D5D}\x{7D5E}\x{7D5F}\x{7D60}\x{7D61}\x{7D62}\x{7D63}\x{7D65}' . +'\x{7D66}\x{7D67}\x{7D68}\x{7D69}\x{7D6A}\x{7D6B}\x{7D6C}\x{7D6D}\x{7D6E}' . +'\x{7D6F}\x{7D70}\x{7D71}\x{7D72}\x{7D73}\x{7D74}\x{7D75}\x{7D76}\x{7D77}' . +'\x{7D79}\x{7D7A}\x{7D7B}\x{7D7C}\x{7D7D}\x{7D7E}\x{7D7F}\x{7D80}\x{7D81}' . +'\x{7D83}\x{7D84}\x{7D85}\x{7D86}\x{7D87}\x{7D88}\x{7D89}\x{7D8A}\x{7D8B}' . +'\x{7D8C}\x{7D8D}\x{7D8E}\x{7D8F}\x{7D90}\x{7D91}\x{7D92}\x{7D93}\x{7D94}' . +'\x{7D96}\x{7D97}\x{7D99}\x{7D9B}\x{7D9C}\x{7D9D}\x{7D9E}\x{7D9F}\x{7DA0}' . +'\x{7DA1}\x{7DA2}\x{7DA3}\x{7DA5}\x{7DA6}\x{7DA7}\x{7DA9}\x{7DAA}\x{7DAB}' . +'\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}\x{7DB1}\x{7DB2}\x{7DB3}\x{7DB4}' . +'\x{7DB5}\x{7DB6}\x{7DB7}\x{7DB8}\x{7DB9}\x{7DBA}\x{7DBB}\x{7DBC}\x{7DBD}' . +'\x{7DBE}\x{7DBF}\x{7DC0}\x{7DC1}\x{7DC2}\x{7DC3}\x{7DC4}\x{7DC5}\x{7DC6}' . +'\x{7DC7}\x{7DC8}\x{7DC9}\x{7DCA}\x{7DCB}\x{7DCC}\x{7DCE}\x{7DCF}\x{7DD0}' . +'\x{7DD1}\x{7DD2}\x{7DD4}\x{7DD5}\x{7DD6}\x{7DD7}\x{7DD8}\x{7DD9}\x{7DDA}' . +'\x{7DDB}\x{7DDD}\x{7DDE}\x{7DDF}\x{7DE0}\x{7DE1}\x{7DE2}\x{7DE3}\x{7DE6}' . +'\x{7DE7}\x{7DE8}\x{7DE9}\x{7DEA}\x{7DEC}\x{7DED}\x{7DEE}\x{7DEF}\x{7DF0}' . +'\x{7DF1}\x{7DF2}\x{7DF3}\x{7DF4}\x{7DF5}\x{7DF6}\x{7DF7}\x{7DF8}\x{7DF9}' . +'\x{7DFA}\x{7DFB}\x{7DFC}\x{7E00}\x{7E01}\x{7E02}\x{7E03}\x{7E04}\x{7E05}' . +'\x{7E06}\x{7E07}\x{7E08}\x{7E09}\x{7E0A}\x{7E0B}\x{7E0C}\x{7E0D}\x{7E0E}' . +'\x{7E0F}\x{7E10}\x{7E11}\x{7E12}\x{7E13}\x{7E14}\x{7E15}\x{7E16}\x{7E17}' . +'\x{7E19}\x{7E1A}\x{7E1B}\x{7E1C}\x{7E1D}\x{7E1E}\x{7E1F}\x{7E20}\x{7E21}' . +'\x{7E22}\x{7E23}\x{7E24}\x{7E25}\x{7E26}\x{7E27}\x{7E28}\x{7E29}\x{7E2A}' . +'\x{7E2B}\x{7E2C}\x{7E2D}\x{7E2E}\x{7E2F}\x{7E30}\x{7E31}\x{7E32}\x{7E33}' . +'\x{7E34}\x{7E35}\x{7E36}\x{7E37}\x{7E38}\x{7E39}\x{7E3A}\x{7E3B}\x{7E3C}' . +'\x{7E3D}\x{7E3E}\x{7E3F}\x{7E40}\x{7E41}\x{7E42}\x{7E43}\x{7E44}\x{7E45}' . +'\x{7E46}\x{7E47}\x{7E48}\x{7E49}\x{7E4C}\x{7E4D}\x{7E4E}\x{7E4F}\x{7E50}' . +'\x{7E51}\x{7E52}\x{7E53}\x{7E54}\x{7E55}\x{7E56}\x{7E57}\x{7E58}\x{7E59}' . +'\x{7E5A}\x{7E5C}\x{7E5D}\x{7E5E}\x{7E5F}\x{7E60}\x{7E61}\x{7E62}\x{7E63}' . +'\x{7E65}\x{7E66}\x{7E67}\x{7E68}\x{7E69}\x{7E6A}\x{7E6B}\x{7E6C}\x{7E6D}' . +'\x{7E6E}\x{7E6F}\x{7E70}\x{7E71}\x{7E72}\x{7E73}\x{7E74}\x{7E75}\x{7E76}' . +'\x{7E77}\x{7E78}\x{7E79}\x{7E7A}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7E}\x{7E7F}' . +'\x{7E80}\x{7E81}\x{7E82}\x{7E83}\x{7E84}\x{7E85}\x{7E86}\x{7E87}\x{7E88}' . +'\x{7E89}\x{7E8A}\x{7E8B}\x{7E8C}\x{7E8D}\x{7E8E}\x{7E8F}\x{7E90}\x{7E91}' . +'\x{7E92}\x{7E93}\x{7E94}\x{7E95}\x{7E96}\x{7E97}\x{7E98}\x{7E99}\x{7E9A}' . +'\x{7E9B}\x{7E9C}\x{7E9E}\x{7E9F}\x{7EA0}\x{7EA1}\x{7EA2}\x{7EA3}\x{7EA4}' . +'\x{7EA5}\x{7EA6}\x{7EA7}\x{7EA8}\x{7EA9}\x{7EAA}\x{7EAB}\x{7EAC}\x{7EAD}' . +'\x{7EAE}\x{7EAF}\x{7EB0}\x{7EB1}\x{7EB2}\x{7EB3}\x{7EB4}\x{7EB5}\x{7EB6}' . +'\x{7EB7}\x{7EB8}\x{7EB9}\x{7EBA}\x{7EBB}\x{7EBC}\x{7EBD}\x{7EBE}\x{7EBF}' . +'\x{7EC0}\x{7EC1}\x{7EC2}\x{7EC3}\x{7EC4}\x{7EC5}\x{7EC6}\x{7EC7}\x{7EC8}' . +'\x{7EC9}\x{7ECA}\x{7ECB}\x{7ECC}\x{7ECD}\x{7ECE}\x{7ECF}\x{7ED0}\x{7ED1}' . +'\x{7ED2}\x{7ED3}\x{7ED4}\x{7ED5}\x{7ED6}\x{7ED7}\x{7ED8}\x{7ED9}\x{7EDA}' . +'\x{7EDB}\x{7EDC}\x{7EDD}\x{7EDE}\x{7EDF}\x{7EE0}\x{7EE1}\x{7EE2}\x{7EE3}' . +'\x{7EE4}\x{7EE5}\x{7EE6}\x{7EE7}\x{7EE8}\x{7EE9}\x{7EEA}\x{7EEB}\x{7EEC}' . +'\x{7EED}\x{7EEE}\x{7EEF}\x{7EF0}\x{7EF1}\x{7EF2}\x{7EF3}\x{7EF4}\x{7EF5}' . +'\x{7EF6}\x{7EF7}\x{7EF8}\x{7EF9}\x{7EFA}\x{7EFB}\x{7EFC}\x{7EFD}\x{7EFE}' . +'\x{7EFF}\x{7F00}\x{7F01}\x{7F02}\x{7F03}\x{7F04}\x{7F05}\x{7F06}\x{7F07}' . +'\x{7F08}\x{7F09}\x{7F0A}\x{7F0B}\x{7F0C}\x{7F0D}\x{7F0E}\x{7F0F}\x{7F10}' . +'\x{7F11}\x{7F12}\x{7F13}\x{7F14}\x{7F15}\x{7F16}\x{7F17}\x{7F18}\x{7F19}' . +'\x{7F1A}\x{7F1B}\x{7F1C}\x{7F1D}\x{7F1E}\x{7F1F}\x{7F20}\x{7F21}\x{7F22}' . +'\x{7F23}\x{7F24}\x{7F25}\x{7F26}\x{7F27}\x{7F28}\x{7F29}\x{7F2A}\x{7F2B}' . +'\x{7F2C}\x{7F2D}\x{7F2E}\x{7F2F}\x{7F30}\x{7F31}\x{7F32}\x{7F33}\x{7F34}' . +'\x{7F35}\x{7F36}\x{7F37}\x{7F38}\x{7F39}\x{7F3A}\x{7F3D}\x{7F3E}\x{7F3F}' . +'\x{7F40}\x{7F42}\x{7F43}\x{7F44}\x{7F45}\x{7F47}\x{7F48}\x{7F49}\x{7F4A}' . +'\x{7F4B}\x{7F4C}\x{7F4D}\x{7F4E}\x{7F4F}\x{7F50}\x{7F51}\x{7F52}\x{7F53}' . +'\x{7F54}\x{7F55}\x{7F56}\x{7F57}\x{7F58}\x{7F5A}\x{7F5B}\x{7F5C}\x{7F5D}' . +'\x{7F5E}\x{7F5F}\x{7F60}\x{7F61}\x{7F62}\x{7F63}\x{7F64}\x{7F65}\x{7F66}' . +'\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6C}\x{7F6D}\x{7F6E}\x{7F6F}' . +'\x{7F70}\x{7F71}\x{7F72}\x{7F73}\x{7F74}\x{7F75}\x{7F76}\x{7F77}\x{7F78}' . +'\x{7F79}\x{7F7A}\x{7F7B}\x{7F7C}\x{7F7D}\x{7F7E}\x{7F7F}\x{7F80}\x{7F81}' . +'\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}\x{7F88}\x{7F89}\x{7F8A}\x{7F8B}' . +'\x{7F8C}\x{7F8D}\x{7F8E}\x{7F8F}\x{7F91}\x{7F92}\x{7F93}\x{7F94}\x{7F95}' . +'\x{7F96}\x{7F98}\x{7F9A}\x{7F9B}\x{7F9C}\x{7F9D}\x{7F9E}\x{7F9F}\x{7FA0}' . +'\x{7FA1}\x{7FA2}\x{7FA3}\x{7FA4}\x{7FA5}\x{7FA6}\x{7FA7}\x{7FA8}\x{7FA9}' . +'\x{7FAA}\x{7FAB}\x{7FAC}\x{7FAD}\x{7FAE}\x{7FAF}\x{7FB0}\x{7FB1}\x{7FB2}' . +'\x{7FB3}\x{7FB5}\x{7FB6}\x{7FB7}\x{7FB8}\x{7FB9}\x{7FBA}\x{7FBB}\x{7FBC}' . +'\x{7FBD}\x{7FBE}\x{7FBF}\x{7FC0}\x{7FC1}\x{7FC2}\x{7FC3}\x{7FC4}\x{7FC5}' . +'\x{7FC6}\x{7FC7}\x{7FC8}\x{7FC9}\x{7FCA}\x{7FCB}\x{7FCC}\x{7FCD}\x{7FCE}' . +'\x{7FCF}\x{7FD0}\x{7FD1}\x{7FD2}\x{7FD3}\x{7FD4}\x{7FD5}\x{7FD7}\x{7FD8}' . +'\x{7FD9}\x{7FDA}\x{7FDB}\x{7FDC}\x{7FDE}\x{7FDF}\x{7FE0}\x{7FE1}\x{7FE2}' . +'\x{7FE3}\x{7FE5}\x{7FE6}\x{7FE7}\x{7FE8}\x{7FE9}\x{7FEA}\x{7FEB}\x{7FEC}' . +'\x{7FED}\x{7FEE}\x{7FEF}\x{7FF0}\x{7FF1}\x{7FF2}\x{7FF3}\x{7FF4}\x{7FF5}' . +'\x{7FF6}\x{7FF7}\x{7FF8}\x{7FF9}\x{7FFA}\x{7FFB}\x{7FFC}\x{7FFD}\x{7FFE}' . +'\x{7FFF}\x{8000}\x{8001}\x{8002}\x{8003}\x{8004}\x{8005}\x{8006}\x{8007}' . +'\x{8008}\x{8009}\x{800B}\x{800C}\x{800D}\x{800E}\x{800F}\x{8010}\x{8011}' . +'\x{8012}\x{8013}\x{8014}\x{8015}\x{8016}\x{8017}\x{8018}\x{8019}\x{801A}' . +'\x{801B}\x{801C}\x{801D}\x{801E}\x{801F}\x{8020}\x{8021}\x{8022}\x{8023}' . +'\x{8024}\x{8025}\x{8026}\x{8027}\x{8028}\x{8029}\x{802A}\x{802B}\x{802C}' . +'\x{802D}\x{802E}\x{8030}\x{8031}\x{8032}\x{8033}\x{8034}\x{8035}\x{8036}' . +'\x{8037}\x{8038}\x{8039}\x{803A}\x{803B}\x{803D}\x{803E}\x{803F}\x{8041}' . +'\x{8042}\x{8043}\x{8044}\x{8045}\x{8046}\x{8047}\x{8048}\x{8049}\x{804A}' . +'\x{804B}\x{804C}\x{804D}\x{804E}\x{804F}\x{8050}\x{8051}\x{8052}\x{8053}' . +'\x{8054}\x{8055}\x{8056}\x{8057}\x{8058}\x{8059}\x{805A}\x{805B}\x{805C}' . +'\x{805D}\x{805E}\x{805F}\x{8060}\x{8061}\x{8062}\x{8063}\x{8064}\x{8065}' . +'\x{8067}\x{8068}\x{8069}\x{806A}\x{806B}\x{806C}\x{806D}\x{806E}\x{806F}' . +'\x{8070}\x{8071}\x{8072}\x{8073}\x{8074}\x{8075}\x{8076}\x{8077}\x{8078}' . +'\x{8079}\x{807A}\x{807B}\x{807C}\x{807D}\x{807E}\x{807F}\x{8080}\x{8081}' . +'\x{8082}\x{8083}\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808A}\x{808B}' . +'\x{808C}\x{808D}\x{808F}\x{8090}\x{8091}\x{8092}\x{8093}\x{8095}\x{8096}' . +'\x{8097}\x{8098}\x{8099}\x{809A}\x{809B}\x{809C}\x{809D}\x{809E}\x{809F}' . +'\x{80A0}\x{80A1}\x{80A2}\x{80A3}\x{80A4}\x{80A5}\x{80A9}\x{80AA}\x{80AB}' . +'\x{80AD}\x{80AE}\x{80AF}\x{80B0}\x{80B1}\x{80B2}\x{80B4}\x{80B5}\x{80B6}' . +'\x{80B7}\x{80B8}\x{80BA}\x{80BB}\x{80BC}\x{80BD}\x{80BE}\x{80BF}\x{80C0}' . +'\x{80C1}\x{80C2}\x{80C3}\x{80C4}\x{80C5}\x{80C6}\x{80C7}\x{80C8}\x{80C9}' . +'\x{80CA}\x{80CB}\x{80CC}\x{80CD}\x{80CE}\x{80CF}\x{80D0}\x{80D1}\x{80D2}' . +'\x{80D3}\x{80D4}\x{80D5}\x{80D6}\x{80D7}\x{80D8}\x{80D9}\x{80DA}\x{80DB}' . +'\x{80DC}\x{80DD}\x{80DE}\x{80E0}\x{80E1}\x{80E2}\x{80E3}\x{80E4}\x{80E5}' . +'\x{80E6}\x{80E7}\x{80E8}\x{80E9}\x{80EA}\x{80EB}\x{80EC}\x{80ED}\x{80EE}' . +'\x{80EF}\x{80F0}\x{80F1}\x{80F2}\x{80F3}\x{80F4}\x{80F5}\x{80F6}\x{80F7}' . +'\x{80F8}\x{80F9}\x{80FA}\x{80FB}\x{80FC}\x{80FD}\x{80FE}\x{80FF}\x{8100}' . +'\x{8101}\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{810B}' . +'\x{810C}\x{810D}\x{810E}\x{810F}\x{8110}\x{8111}\x{8112}\x{8113}\x{8114}' . +'\x{8115}\x{8116}\x{8118}\x{8119}\x{811A}\x{811B}\x{811C}\x{811D}\x{811E}' . +'\x{811F}\x{8120}\x{8121}\x{8122}\x{8123}\x{8124}\x{8125}\x{8126}\x{8127}' . +'\x{8128}\x{8129}\x{812A}\x{812B}\x{812C}\x{812D}\x{812E}\x{812F}\x{8130}' . +'\x{8131}\x{8132}\x{8136}\x{8137}\x{8138}\x{8139}\x{813A}\x{813B}\x{813C}' . +'\x{813D}\x{813E}\x{813F}\x{8140}\x{8141}\x{8142}\x{8143}\x{8144}\x{8145}' . +'\x{8146}\x{8147}\x{8148}\x{8149}\x{814A}\x{814B}\x{814C}\x{814D}\x{814E}' . +'\x{814F}\x{8150}\x{8151}\x{8152}\x{8153}\x{8154}\x{8155}\x{8156}\x{8157}' . +'\x{8158}\x{8159}\x{815A}\x{815B}\x{815C}\x{815D}\x{815E}\x{8160}\x{8161}' . +'\x{8162}\x{8163}\x{8164}\x{8165}\x{8166}\x{8167}\x{8168}\x{8169}\x{816A}' . +'\x{816B}\x{816C}\x{816D}\x{816E}\x{816F}\x{8170}\x{8171}\x{8172}\x{8173}' . +'\x{8174}\x{8175}\x{8176}\x{8177}\x{8178}\x{8179}\x{817A}\x{817B}\x{817C}' . +'\x{817D}\x{817E}\x{817F}\x{8180}\x{8181}\x{8182}\x{8183}\x{8185}\x{8186}' . +'\x{8187}\x{8188}\x{8189}\x{818A}\x{818B}\x{818C}\x{818D}\x{818E}\x{818F}' . +'\x{8191}\x{8192}\x{8193}\x{8194}\x{8195}\x{8197}\x{8198}\x{8199}\x{819A}' . +'\x{819B}\x{819C}\x{819D}\x{819E}\x{819F}\x{81A0}\x{81A1}\x{81A2}\x{81A3}' . +'\x{81A4}\x{81A5}\x{81A6}\x{81A7}\x{81A8}\x{81A9}\x{81AA}\x{81AB}\x{81AC}' . +'\x{81AD}\x{81AE}\x{81AF}\x{81B0}\x{81B1}\x{81B2}\x{81B3}\x{81B4}\x{81B5}' . +'\x{81B6}\x{81B7}\x{81B8}\x{81B9}\x{81BA}\x{81BB}\x{81BC}\x{81BD}\x{81BE}' . +'\x{81BF}\x{81C0}\x{81C1}\x{81C2}\x{81C3}\x{81C4}\x{81C5}\x{81C6}\x{81C7}' . +'\x{81C8}\x{81C9}\x{81CA}\x{81CC}\x{81CD}\x{81CE}\x{81CF}\x{81D0}\x{81D1}' . +'\x{81D2}\x{81D4}\x{81D5}\x{81D6}\x{81D7}\x{81D8}\x{81D9}\x{81DA}\x{81DB}' . +'\x{81DC}\x{81DD}\x{81DE}\x{81DF}\x{81E0}\x{81E1}\x{81E2}\x{81E3}\x{81E5}' . +'\x{81E6}\x{81E7}\x{81E8}\x{81E9}\x{81EA}\x{81EB}\x{81EC}\x{81ED}\x{81EE}' . +'\x{81F1}\x{81F2}\x{81F3}\x{81F4}\x{81F5}\x{81F6}\x{81F7}\x{81F8}\x{81F9}' . +'\x{81FA}\x{81FB}\x{81FC}\x{81FD}\x{81FE}\x{81FF}\x{8200}\x{8201}\x{8202}' . +'\x{8203}\x{8204}\x{8205}\x{8206}\x{8207}\x{8208}\x{8209}\x{820A}\x{820B}' . +'\x{820C}\x{820D}\x{820E}\x{820F}\x{8210}\x{8211}\x{8212}\x{8214}\x{8215}' . +'\x{8216}\x{8218}\x{8219}\x{821A}\x{821B}\x{821C}\x{821D}\x{821E}\x{821F}' . +'\x{8220}\x{8221}\x{8222}\x{8223}\x{8225}\x{8226}\x{8227}\x{8228}\x{8229}' . +'\x{822A}\x{822B}\x{822C}\x{822D}\x{822F}\x{8230}\x{8231}\x{8232}\x{8233}' . +'\x{8234}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{823A}\x{823B}\x{823C}' . +'\x{823D}\x{823E}\x{823F}\x{8240}\x{8242}\x{8243}\x{8244}\x{8245}\x{8246}' . +'\x{8247}\x{8248}\x{8249}\x{824A}\x{824B}\x{824C}\x{824D}\x{824E}\x{824F}' . +'\x{8250}\x{8251}\x{8252}\x{8253}\x{8254}\x{8255}\x{8256}\x{8257}\x{8258}' . +'\x{8259}\x{825A}\x{825B}\x{825C}\x{825D}\x{825E}\x{825F}\x{8260}\x{8261}' . +'\x{8263}\x{8264}\x{8266}\x{8267}\x{8268}\x{8269}\x{826A}\x{826B}\x{826C}' . +'\x{826D}\x{826E}\x{826F}\x{8270}\x{8271}\x{8272}\x{8273}\x{8274}\x{8275}' . +'\x{8276}\x{8277}\x{8278}\x{8279}\x{827A}\x{827B}\x{827C}\x{827D}\x{827E}' . +'\x{827F}\x{8280}\x{8281}\x{8282}\x{8283}\x{8284}\x{8285}\x{8286}\x{8287}' . +'\x{8288}\x{8289}\x{828A}\x{828B}\x{828D}\x{828E}\x{828F}\x{8290}\x{8291}' . +'\x{8292}\x{8293}\x{8294}\x{8295}\x{8296}\x{8297}\x{8298}\x{8299}\x{829A}' . +'\x{829B}\x{829C}\x{829D}\x{829E}\x{829F}\x{82A0}\x{82A1}\x{82A2}\x{82A3}' . +'\x{82A4}\x{82A5}\x{82A6}\x{82A7}\x{82A8}\x{82A9}\x{82AA}\x{82AB}\x{82AC}' . +'\x{82AD}\x{82AE}\x{82AF}\x{82B0}\x{82B1}\x{82B3}\x{82B4}\x{82B5}\x{82B6}' . +'\x{82B7}\x{82B8}\x{82B9}\x{82BA}\x{82BB}\x{82BC}\x{82BD}\x{82BE}\x{82BF}' . +'\x{82C0}\x{82C1}\x{82C2}\x{82C3}\x{82C4}\x{82C5}\x{82C6}\x{82C7}\x{82C8}' . +'\x{82C9}\x{82CA}\x{82CB}\x{82CC}\x{82CD}\x{82CE}\x{82CF}\x{82D0}\x{82D1}' . +'\x{82D2}\x{82D3}\x{82D4}\x{82D5}\x{82D6}\x{82D7}\x{82D8}\x{82D9}\x{82DA}' . +'\x{82DB}\x{82DC}\x{82DD}\x{82DE}\x{82DF}\x{82E0}\x{82E1}\x{82E3}\x{82E4}' . +'\x{82E5}\x{82E6}\x{82E7}\x{82E8}\x{82E9}\x{82EA}\x{82EB}\x{82EC}\x{82ED}' . +'\x{82EE}\x{82EF}\x{82F0}\x{82F1}\x{82F2}\x{82F3}\x{82F4}\x{82F5}\x{82F6}' . +'\x{82F7}\x{82F8}\x{82F9}\x{82FA}\x{82FB}\x{82FD}\x{82FE}\x{82FF}\x{8300}' . +'\x{8301}\x{8302}\x{8303}\x{8304}\x{8305}\x{8306}\x{8307}\x{8308}\x{8309}' . +'\x{830B}\x{830C}\x{830D}\x{830E}\x{830F}\x{8311}\x{8312}\x{8313}\x{8314}' . +'\x{8315}\x{8316}\x{8317}\x{8318}\x{8319}\x{831A}\x{831B}\x{831C}\x{831D}' . +'\x{831E}\x{831F}\x{8320}\x{8321}\x{8322}\x{8323}\x{8324}\x{8325}\x{8326}' . +'\x{8327}\x{8328}\x{8329}\x{832A}\x{832B}\x{832C}\x{832D}\x{832E}\x{832F}' . +'\x{8331}\x{8332}\x{8333}\x{8334}\x{8335}\x{8336}\x{8337}\x{8338}\x{8339}' . +'\x{833A}\x{833B}\x{833C}\x{833D}\x{833E}\x{833F}\x{8340}\x{8341}\x{8342}' . +'\x{8343}\x{8344}\x{8345}\x{8346}\x{8347}\x{8348}\x{8349}\x{834A}\x{834B}' . +'\x{834C}\x{834D}\x{834E}\x{834F}\x{8350}\x{8351}\x{8352}\x{8353}\x{8354}' . +'\x{8356}\x{8357}\x{8358}\x{8359}\x{835A}\x{835B}\x{835C}\x{835D}\x{835E}' . +'\x{835F}\x{8360}\x{8361}\x{8362}\x{8363}\x{8364}\x{8365}\x{8366}\x{8367}' . +'\x{8368}\x{8369}\x{836A}\x{836B}\x{836C}\x{836D}\x{836E}\x{836F}\x{8370}' . +'\x{8371}\x{8372}\x{8373}\x{8374}\x{8375}\x{8376}\x{8377}\x{8378}\x{8379}' . +'\x{837A}\x{837B}\x{837C}\x{837D}\x{837E}\x{837F}\x{8380}\x{8381}\x{8382}' . +'\x{8383}\x{8384}\x{8385}\x{8386}\x{8387}\x{8388}\x{8389}\x{838A}\x{838B}' . +'\x{838C}\x{838D}\x{838E}\x{838F}\x{8390}\x{8391}\x{8392}\x{8393}\x{8394}' . +'\x{8395}\x{8396}\x{8397}\x{8398}\x{8399}\x{839A}\x{839B}\x{839C}\x{839D}' . +'\x{839E}\x{83A0}\x{83A1}\x{83A2}\x{83A3}\x{83A4}\x{83A5}\x{83A6}\x{83A7}' . +'\x{83A8}\x{83A9}\x{83AA}\x{83AB}\x{83AC}\x{83AD}\x{83AE}\x{83AF}\x{83B0}' . +'\x{83B1}\x{83B2}\x{83B3}\x{83B4}\x{83B6}\x{83B7}\x{83B8}\x{83B9}\x{83BA}' . +'\x{83BB}\x{83BC}\x{83BD}\x{83BF}\x{83C0}\x{83C1}\x{83C2}\x{83C3}\x{83C4}' . +'\x{83C5}\x{83C6}\x{83C7}\x{83C8}\x{83C9}\x{83CA}\x{83CB}\x{83CC}\x{83CD}' . +'\x{83CE}\x{83CF}\x{83D0}\x{83D1}\x{83D2}\x{83D3}\x{83D4}\x{83D5}\x{83D6}' . +'\x{83D7}\x{83D8}\x{83D9}\x{83DA}\x{83DB}\x{83DC}\x{83DD}\x{83DE}\x{83DF}' . +'\x{83E0}\x{83E1}\x{83E2}\x{83E3}\x{83E4}\x{83E5}\x{83E7}\x{83E8}\x{83E9}' . +'\x{83EA}\x{83EB}\x{83EC}\x{83EE}\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F3}' . +'\x{83F4}\x{83F5}\x{83F6}\x{83F7}\x{83F8}\x{83F9}\x{83FA}\x{83FB}\x{83FC}' . +'\x{83FD}\x{83FE}\x{83FF}\x{8400}\x{8401}\x{8402}\x{8403}\x{8404}\x{8405}' . +'\x{8406}\x{8407}\x{8408}\x{8409}\x{840A}\x{840B}\x{840C}\x{840D}\x{840E}' . +'\x{840F}\x{8410}\x{8411}\x{8412}\x{8413}\x{8415}\x{8418}\x{8419}\x{841A}' . +'\x{841B}\x{841C}\x{841D}\x{841E}\x{8421}\x{8422}\x{8423}\x{8424}\x{8425}' . +'\x{8426}\x{8427}\x{8428}\x{8429}\x{842A}\x{842B}\x{842C}\x{842D}\x{842E}' . +'\x{842F}\x{8430}\x{8431}\x{8432}\x{8433}\x{8434}\x{8435}\x{8436}\x{8437}' . +'\x{8438}\x{8439}\x{843A}\x{843B}\x{843C}\x{843D}\x{843E}\x{843F}\x{8440}' . +'\x{8441}\x{8442}\x{8443}\x{8444}\x{8445}\x{8446}\x{8447}\x{8448}\x{8449}' . +'\x{844A}\x{844B}\x{844C}\x{844D}\x{844E}\x{844F}\x{8450}\x{8451}\x{8452}' . +'\x{8453}\x{8454}\x{8455}\x{8456}\x{8457}\x{8459}\x{845A}\x{845B}\x{845C}' . +'\x{845D}\x{845E}\x{845F}\x{8460}\x{8461}\x{8462}\x{8463}\x{8464}\x{8465}' . +'\x{8466}\x{8467}\x{8468}\x{8469}\x{846A}\x{846B}\x{846C}\x{846D}\x{846E}' . +'\x{846F}\x{8470}\x{8471}\x{8472}\x{8473}\x{8474}\x{8475}\x{8476}\x{8477}' . +'\x{8478}\x{8479}\x{847A}\x{847B}\x{847C}\x{847D}\x{847E}\x{847F}\x{8480}' . +'\x{8481}\x{8482}\x{8484}\x{8485}\x{8486}\x{8487}\x{8488}\x{8489}\x{848A}' . +'\x{848B}\x{848C}\x{848D}\x{848E}\x{848F}\x{8490}\x{8491}\x{8492}\x{8493}' . +'\x{8494}\x{8496}\x{8497}\x{8498}\x{8499}\x{849A}\x{849B}\x{849C}\x{849D}' . +'\x{849E}\x{849F}\x{84A0}\x{84A1}\x{84A2}\x{84A3}\x{84A4}\x{84A5}\x{84A6}' . +'\x{84A7}\x{84A8}\x{84A9}\x{84AA}\x{84AB}\x{84AC}\x{84AE}\x{84AF}\x{84B0}' . +'\x{84B1}\x{84B2}\x{84B3}\x{84B4}\x{84B5}\x{84B6}\x{84B8}\x{84B9}\x{84BA}' . +'\x{84BB}\x{84BC}\x{84BD}\x{84BE}\x{84BF}\x{84C0}\x{84C1}\x{84C2}\x{84C4}' . +'\x{84C5}\x{84C6}\x{84C7}\x{84C8}\x{84C9}\x{84CA}\x{84CB}\x{84CC}\x{84CD}' . +'\x{84CE}\x{84CF}\x{84D0}\x{84D1}\x{84D2}\x{84D3}\x{84D4}\x{84D5}\x{84D6}' . +'\x{84D7}\x{84D8}\x{84D9}\x{84DB}\x{84DC}\x{84DD}\x{84DE}\x{84DF}\x{84E0}' . +'\x{84E1}\x{84E2}\x{84E3}\x{84E4}\x{84E5}\x{84E6}\x{84E7}\x{84E8}\x{84E9}' . +'\x{84EA}\x{84EB}\x{84EC}\x{84EE}\x{84EF}\x{84F0}\x{84F1}\x{84F2}\x{84F3}' . +'\x{84F4}\x{84F5}\x{84F6}\x{84F7}\x{84F8}\x{84F9}\x{84FA}\x{84FB}\x{84FC}' . +'\x{84FD}\x{84FE}\x{84FF}\x{8500}\x{8501}\x{8502}\x{8503}\x{8504}\x{8506}' . +'\x{8507}\x{8508}\x{8509}\x{850A}\x{850B}\x{850C}\x{850D}\x{850E}\x{850F}' . +'\x{8511}\x{8512}\x{8513}\x{8514}\x{8515}\x{8516}\x{8517}\x{8518}\x{8519}' . +'\x{851A}\x{851B}\x{851C}\x{851D}\x{851E}\x{851F}\x{8520}\x{8521}\x{8522}' . +'\x{8523}\x{8524}\x{8525}\x{8526}\x{8527}\x{8528}\x{8529}\x{852A}\x{852B}' . +'\x{852C}\x{852D}\x{852E}\x{852F}\x{8530}\x{8531}\x{8534}\x{8535}\x{8536}' . +'\x{8537}\x{8538}\x{8539}\x{853A}\x{853B}\x{853C}\x{853D}\x{853E}\x{853F}' . +'\x{8540}\x{8541}\x{8542}\x{8543}\x{8544}\x{8545}\x{8546}\x{8547}\x{8548}' . +'\x{8549}\x{854A}\x{854B}\x{854D}\x{854E}\x{854F}\x{8551}\x{8552}\x{8553}' . +'\x{8554}\x{8555}\x{8556}\x{8557}\x{8558}\x{8559}\x{855A}\x{855B}\x{855C}' . +'\x{855D}\x{855E}\x{855F}\x{8560}\x{8561}\x{8562}\x{8563}\x{8564}\x{8565}' . +'\x{8566}\x{8567}\x{8568}\x{8569}\x{856A}\x{856B}\x{856C}\x{856D}\x{856E}' . +'\x{856F}\x{8570}\x{8571}\x{8572}\x{8573}\x{8574}\x{8575}\x{8576}\x{8577}' . +'\x{8578}\x{8579}\x{857A}\x{857B}\x{857C}\x{857D}\x{857E}\x{8580}\x{8581}' . +'\x{8582}\x{8583}\x{8584}\x{8585}\x{8586}\x{8587}\x{8588}\x{8589}\x{858A}' . +'\x{858B}\x{858C}\x{858D}\x{858E}\x{858F}\x{8590}\x{8591}\x{8592}\x{8594}' . +'\x{8595}\x{8596}\x{8598}\x{8599}\x{859A}\x{859B}\x{859C}\x{859D}\x{859E}' . +'\x{859F}\x{85A0}\x{85A1}\x{85A2}\x{85A3}\x{85A4}\x{85A5}\x{85A6}\x{85A7}' . +'\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AD}\x{85AE}\x{85AF}\x{85B0}' . +'\x{85B1}\x{85B3}\x{85B4}\x{85B5}\x{85B6}\x{85B7}\x{85B8}\x{85B9}\x{85BA}' . +'\x{85BC}\x{85BD}\x{85BE}\x{85BF}\x{85C0}\x{85C1}\x{85C2}\x{85C3}\x{85C4}' . +'\x{85C5}\x{85C6}\x{85C7}\x{85C8}\x{85C9}\x{85CA}\x{85CB}\x{85CD}\x{85CE}' . +'\x{85CF}\x{85D0}\x{85D1}\x{85D2}\x{85D3}\x{85D4}\x{85D5}\x{85D6}\x{85D7}' . +'\x{85D8}\x{85D9}\x{85DA}\x{85DB}\x{85DC}\x{85DD}\x{85DE}\x{85DF}\x{85E0}' . +'\x{85E1}\x{85E2}\x{85E3}\x{85E4}\x{85E5}\x{85E6}\x{85E7}\x{85E8}\x{85E9}' . +'\x{85EA}\x{85EB}\x{85EC}\x{85ED}\x{85EF}\x{85F0}\x{85F1}\x{85F2}\x{85F4}' . +'\x{85F5}\x{85F6}\x{85F7}\x{85F8}\x{85F9}\x{85FA}\x{85FB}\x{85FD}\x{85FE}' . +'\x{85FF}\x{8600}\x{8601}\x{8602}\x{8604}\x{8605}\x{8606}\x{8607}\x{8608}' . +'\x{8609}\x{860A}\x{860B}\x{860C}\x{860F}\x{8611}\x{8612}\x{8613}\x{8614}' . +'\x{8616}\x{8617}\x{8618}\x{8619}\x{861A}\x{861B}\x{861C}\x{861E}\x{861F}' . +'\x{8620}\x{8621}\x{8622}\x{8623}\x{8624}\x{8625}\x{8626}\x{8627}\x{8628}' . +'\x{8629}\x{862A}\x{862B}\x{862C}\x{862D}\x{862E}\x{862F}\x{8630}\x{8631}' . +'\x{8632}\x{8633}\x{8634}\x{8635}\x{8636}\x{8638}\x{8639}\x{863A}\x{863B}' . +'\x{863C}\x{863D}\x{863E}\x{863F}\x{8640}\x{8641}\x{8642}\x{8643}\x{8644}' . +'\x{8645}\x{8646}\x{8647}\x{8648}\x{8649}\x{864A}\x{864B}\x{864C}\x{864D}' . +'\x{864E}\x{864F}\x{8650}\x{8651}\x{8652}\x{8653}\x{8654}\x{8655}\x{8656}' . +'\x{8658}\x{8659}\x{865A}\x{865B}\x{865C}\x{865D}\x{865E}\x{865F}\x{8660}' . +'\x{8661}\x{8662}\x{8663}\x{8664}\x{8665}\x{8666}\x{8667}\x{8668}\x{8669}' . +'\x{866A}\x{866B}\x{866C}\x{866D}\x{866E}\x{866F}\x{8670}\x{8671}\x{8672}' . +'\x{8673}\x{8674}\x{8676}\x{8677}\x{8678}\x{8679}\x{867A}\x{867B}\x{867C}' . +'\x{867D}\x{867E}\x{867F}\x{8680}\x{8681}\x{8682}\x{8683}\x{8684}\x{8685}' . +'\x{8686}\x{8687}\x{8688}\x{868A}\x{868B}\x{868C}\x{868D}\x{868E}\x{868F}' . +'\x{8690}\x{8691}\x{8693}\x{8694}\x{8695}\x{8696}\x{8697}\x{8698}\x{8699}' . +'\x{869A}\x{869B}\x{869C}\x{869D}\x{869E}\x{869F}\x{86A1}\x{86A2}\x{86A3}' . +'\x{86A4}\x{86A5}\x{86A7}\x{86A8}\x{86A9}\x{86AA}\x{86AB}\x{86AC}\x{86AD}' . +'\x{86AE}\x{86AF}\x{86B0}\x{86B1}\x{86B2}\x{86B3}\x{86B4}\x{86B5}\x{86B6}' . +'\x{86B7}\x{86B8}\x{86B9}\x{86BA}\x{86BB}\x{86BC}\x{86BD}\x{86BE}\x{86BF}' . +'\x{86C0}\x{86C1}\x{86C2}\x{86C3}\x{86C4}\x{86C5}\x{86C6}\x{86C7}\x{86C8}' . +'\x{86C9}\x{86CA}\x{86CB}\x{86CC}\x{86CE}\x{86CF}\x{86D0}\x{86D1}\x{86D2}' . +'\x{86D3}\x{86D4}\x{86D6}\x{86D7}\x{86D8}\x{86D9}\x{86DA}\x{86DB}\x{86DC}' . +'\x{86DD}\x{86DE}\x{86DF}\x{86E1}\x{86E2}\x{86E3}\x{86E4}\x{86E5}\x{86E6}' . +'\x{86E8}\x{86E9}\x{86EA}\x{86EB}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F0}' . +'\x{86F1}\x{86F2}\x{86F3}\x{86F4}\x{86F5}\x{86F6}\x{86F7}\x{86F8}\x{86F9}' . +'\x{86FA}\x{86FB}\x{86FC}\x{86FE}\x{86FF}\x{8700}\x{8701}\x{8702}\x{8703}' . +'\x{8704}\x{8705}\x{8706}\x{8707}\x{8708}\x{8709}\x{870A}\x{870B}\x{870C}' . +'\x{870D}\x{870E}\x{870F}\x{8710}\x{8711}\x{8712}\x{8713}\x{8714}\x{8715}' . +'\x{8716}\x{8717}\x{8718}\x{8719}\x{871A}\x{871B}\x{871C}\x{871E}\x{871F}' . +'\x{8720}\x{8721}\x{8722}\x{8723}\x{8724}\x{8725}\x{8726}\x{8727}\x{8728}' . +'\x{8729}\x{872A}\x{872B}\x{872C}\x{872D}\x{872E}\x{8730}\x{8731}\x{8732}' . +'\x{8733}\x{8734}\x{8735}\x{8736}\x{8737}\x{8738}\x{8739}\x{873A}\x{873B}' . +'\x{873C}\x{873E}\x{873F}\x{8740}\x{8741}\x{8742}\x{8743}\x{8744}\x{8746}' . +'\x{8747}\x{8748}\x{8749}\x{874A}\x{874C}\x{874D}\x{874E}\x{874F}\x{8750}' . +'\x{8751}\x{8752}\x{8753}\x{8754}\x{8755}\x{8756}\x{8757}\x{8758}\x{8759}' . +'\x{875A}\x{875B}\x{875C}\x{875D}\x{875E}\x{875F}\x{8760}\x{8761}\x{8762}' . +'\x{8763}\x{8764}\x{8765}\x{8766}\x{8767}\x{8768}\x{8769}\x{876A}\x{876B}' . +'\x{876C}\x{876D}\x{876E}\x{876F}\x{8770}\x{8772}\x{8773}\x{8774}\x{8775}' . +'\x{8776}\x{8777}\x{8778}\x{8779}\x{877A}\x{877B}\x{877C}\x{877D}\x{877E}' . +'\x{8780}\x{8781}\x{8782}\x{8783}\x{8784}\x{8785}\x{8786}\x{8787}\x{8788}' . +'\x{8789}\x{878A}\x{878B}\x{878C}\x{878D}\x{878F}\x{8790}\x{8791}\x{8792}' . +'\x{8793}\x{8794}\x{8795}\x{8796}\x{8797}\x{8798}\x{879A}\x{879B}\x{879C}' . +'\x{879D}\x{879E}\x{879F}\x{87A0}\x{87A1}\x{87A2}\x{87A3}\x{87A4}\x{87A5}' . +'\x{87A6}\x{87A7}\x{87A8}\x{87A9}\x{87AA}\x{87AB}\x{87AC}\x{87AD}\x{87AE}' . +'\x{87AF}\x{87B0}\x{87B1}\x{87B2}\x{87B3}\x{87B4}\x{87B5}\x{87B6}\x{87B7}' . +'\x{87B8}\x{87B9}\x{87BA}\x{87BB}\x{87BC}\x{87BD}\x{87BE}\x{87BF}\x{87C0}' . +'\x{87C1}\x{87C2}\x{87C3}\x{87C4}\x{87C5}\x{87C6}\x{87C7}\x{87C8}\x{87C9}' . +'\x{87CA}\x{87CB}\x{87CC}\x{87CD}\x{87CE}\x{87CF}\x{87D0}\x{87D1}\x{87D2}' . +'\x{87D3}\x{87D4}\x{87D5}\x{87D6}\x{87D7}\x{87D8}\x{87D9}\x{87DB}\x{87DC}' . +'\x{87DD}\x{87DE}\x{87DF}\x{87E0}\x{87E1}\x{87E2}\x{87E3}\x{87E4}\x{87E5}' . +'\x{87E6}\x{87E7}\x{87E8}\x{87E9}\x{87EA}\x{87EB}\x{87EC}\x{87ED}\x{87EE}' . +'\x{87EF}\x{87F1}\x{87F2}\x{87F3}\x{87F4}\x{87F5}\x{87F6}\x{87F7}\x{87F8}' . +'\x{87F9}\x{87FA}\x{87FB}\x{87FC}\x{87FD}\x{87FE}\x{87FF}\x{8800}\x{8801}' . +'\x{8802}\x{8803}\x{8804}\x{8805}\x{8806}\x{8808}\x{8809}\x{880A}\x{880B}' . +'\x{880C}\x{880D}\x{880E}\x{880F}\x{8810}\x{8811}\x{8813}\x{8814}\x{8815}' . +'\x{8816}\x{8817}\x{8818}\x{8819}\x{881A}\x{881B}\x{881C}\x{881D}\x{881E}' . +'\x{881F}\x{8820}\x{8821}\x{8822}\x{8823}\x{8824}\x{8825}\x{8826}\x{8827}' . +'\x{8828}\x{8829}\x{882A}\x{882B}\x{882C}\x{882E}\x{882F}\x{8830}\x{8831}' . +'\x{8832}\x{8833}\x{8834}\x{8835}\x{8836}\x{8837}\x{8838}\x{8839}\x{883B}' . +'\x{883C}\x{883D}\x{883E}\x{883F}\x{8840}\x{8841}\x{8842}\x{8843}\x{8844}' . +'\x{8845}\x{8846}\x{8848}\x{8849}\x{884A}\x{884B}\x{884C}\x{884D}\x{884E}' . +'\x{884F}\x{8850}\x{8851}\x{8852}\x{8853}\x{8854}\x{8855}\x{8856}\x{8857}' . +'\x{8859}\x{885A}\x{885B}\x{885D}\x{885E}\x{8860}\x{8861}\x{8862}\x{8863}' . +'\x{8864}\x{8865}\x{8866}\x{8867}\x{8868}\x{8869}\x{886A}\x{886B}\x{886C}' . +'\x{886D}\x{886E}\x{886F}\x{8870}\x{8871}\x{8872}\x{8873}\x{8874}\x{8875}' . +'\x{8876}\x{8877}\x{8878}\x{8879}\x{887B}\x{887C}\x{887D}\x{887E}\x{887F}' . +'\x{8880}\x{8881}\x{8882}\x{8883}\x{8884}\x{8885}\x{8886}\x{8887}\x{8888}' . +'\x{8889}\x{888A}\x{888B}\x{888C}\x{888D}\x{888E}\x{888F}\x{8890}\x{8891}' . +'\x{8892}\x{8893}\x{8894}\x{8895}\x{8896}\x{8897}\x{8898}\x{8899}\x{889A}' . +'\x{889B}\x{889C}\x{889D}\x{889E}\x{889F}\x{88A0}\x{88A1}\x{88A2}\x{88A3}' . +'\x{88A4}\x{88A5}\x{88A6}\x{88A7}\x{88A8}\x{88A9}\x{88AA}\x{88AB}\x{88AC}' . +'\x{88AD}\x{88AE}\x{88AF}\x{88B0}\x{88B1}\x{88B2}\x{88B3}\x{88B4}\x{88B6}' . +'\x{88B7}\x{88B8}\x{88B9}\x{88BA}\x{88BB}\x{88BC}\x{88BD}\x{88BE}\x{88BF}' . +'\x{88C0}\x{88C1}\x{88C2}\x{88C3}\x{88C4}\x{88C5}\x{88C6}\x{88C7}\x{88C8}' . +'\x{88C9}\x{88CA}\x{88CB}\x{88CC}\x{88CD}\x{88CE}\x{88CF}\x{88D0}\x{88D1}' . +'\x{88D2}\x{88D3}\x{88D4}\x{88D5}\x{88D6}\x{88D7}\x{88D8}\x{88D9}\x{88DA}' . +'\x{88DB}\x{88DC}\x{88DD}\x{88DE}\x{88DF}\x{88E0}\x{88E1}\x{88E2}\x{88E3}' . +'\x{88E4}\x{88E5}\x{88E7}\x{88E8}\x{88EA}\x{88EB}\x{88EC}\x{88EE}\x{88EF}' . +'\x{88F0}\x{88F1}\x{88F2}\x{88F3}\x{88F4}\x{88F5}\x{88F6}\x{88F7}\x{88F8}' . +'\x{88F9}\x{88FA}\x{88FB}\x{88FC}\x{88FD}\x{88FE}\x{88FF}\x{8900}\x{8901}' . +'\x{8902}\x{8904}\x{8905}\x{8906}\x{8907}\x{8908}\x{8909}\x{890A}\x{890B}' . +'\x{890C}\x{890D}\x{890E}\x{8910}\x{8911}\x{8912}\x{8913}\x{8914}\x{8915}' . +'\x{8916}\x{8917}\x{8918}\x{8919}\x{891A}\x{891B}\x{891C}\x{891D}\x{891E}' . +'\x{891F}\x{8920}\x{8921}\x{8922}\x{8923}\x{8925}\x{8926}\x{8927}\x{8928}' . +'\x{8929}\x{892A}\x{892B}\x{892C}\x{892D}\x{892E}\x{892F}\x{8930}\x{8931}' . +'\x{8932}\x{8933}\x{8934}\x{8935}\x{8936}\x{8937}\x{8938}\x{8939}\x{893A}' . +'\x{893B}\x{893C}\x{893D}\x{893E}\x{893F}\x{8940}\x{8941}\x{8942}\x{8943}' . +'\x{8944}\x{8945}\x{8946}\x{8947}\x{8948}\x{8949}\x{894A}\x{894B}\x{894C}' . +'\x{894E}\x{894F}\x{8950}\x{8951}\x{8952}\x{8953}\x{8954}\x{8955}\x{8956}' . +'\x{8957}\x{8958}\x{8959}\x{895A}\x{895B}\x{895C}\x{895D}\x{895E}\x{895F}' . +'\x{8960}\x{8961}\x{8962}\x{8963}\x{8964}\x{8966}\x{8967}\x{8968}\x{8969}' . +'\x{896A}\x{896B}\x{896C}\x{896D}\x{896E}\x{896F}\x{8970}\x{8971}\x{8972}' . +'\x{8973}\x{8974}\x{8976}\x{8977}\x{8978}\x{8979}\x{897A}\x{897B}\x{897C}' . +'\x{897E}\x{897F}\x{8980}\x{8981}\x{8982}\x{8983}\x{8984}\x{8985}\x{8986}' . +'\x{8987}\x{8988}\x{8989}\x{898A}\x{898B}\x{898C}\x{898E}\x{898F}\x{8991}' . +'\x{8992}\x{8993}\x{8995}\x{8996}\x{8997}\x{8998}\x{899A}\x{899B}\x{899C}' . +'\x{899D}\x{899E}\x{899F}\x{89A0}\x{89A1}\x{89A2}\x{89A3}\x{89A4}\x{89A5}' . +'\x{89A6}\x{89A7}\x{89A8}\x{89AA}\x{89AB}\x{89AC}\x{89AD}\x{89AE}\x{89AF}' . +'\x{89B1}\x{89B2}\x{89B3}\x{89B5}\x{89B6}\x{89B7}\x{89B8}\x{89B9}\x{89BA}' . +'\x{89BD}\x{89BE}\x{89BF}\x{89C0}\x{89C1}\x{89C2}\x{89C3}\x{89C4}\x{89C5}' . +'\x{89C6}\x{89C7}\x{89C8}\x{89C9}\x{89CA}\x{89CB}\x{89CC}\x{89CD}\x{89CE}' . +'\x{89CF}\x{89D0}\x{89D1}\x{89D2}\x{89D3}\x{89D4}\x{89D5}\x{89D6}\x{89D7}' . +'\x{89D8}\x{89D9}\x{89DA}\x{89DB}\x{89DC}\x{89DD}\x{89DE}\x{89DF}\x{89E0}' . +'\x{89E1}\x{89E2}\x{89E3}\x{89E4}\x{89E5}\x{89E6}\x{89E7}\x{89E8}\x{89E9}' . +'\x{89EA}\x{89EB}\x{89EC}\x{89ED}\x{89EF}\x{89F0}\x{89F1}\x{89F2}\x{89F3}' . +'\x{89F4}\x{89F6}\x{89F7}\x{89F8}\x{89FA}\x{89FB}\x{89FC}\x{89FE}\x{89FF}' . +'\x{8A00}\x{8A01}\x{8A02}\x{8A03}\x{8A04}\x{8A07}\x{8A08}\x{8A09}\x{8A0A}' . +'\x{8A0B}\x{8A0C}\x{8A0D}\x{8A0E}\x{8A0F}\x{8A10}\x{8A11}\x{8A12}\x{8A13}' . +'\x{8A15}\x{8A16}\x{8A17}\x{8A18}\x{8A1A}\x{8A1B}\x{8A1C}\x{8A1D}\x{8A1E}' . +'\x{8A1F}\x{8A22}\x{8A23}\x{8A24}\x{8A25}\x{8A26}\x{8A27}\x{8A28}\x{8A29}' . +'\x{8A2A}\x{8A2C}\x{8A2D}\x{8A2E}\x{8A2F}\x{8A30}\x{8A31}\x{8A32}\x{8A34}' . +'\x{8A35}\x{8A36}\x{8A37}\x{8A38}\x{8A39}\x{8A3A}\x{8A3B}\x{8A3C}\x{8A3E}' . +'\x{8A3F}\x{8A40}\x{8A41}\x{8A42}\x{8A43}\x{8A44}\x{8A45}\x{8A46}\x{8A47}' . +'\x{8A48}\x{8A49}\x{8A4A}\x{8A4C}\x{8A4D}\x{8A4E}\x{8A4F}\x{8A50}\x{8A51}' . +'\x{8A52}\x{8A53}\x{8A54}\x{8A55}\x{8A56}\x{8A57}\x{8A58}\x{8A59}\x{8A5A}' . +'\x{8A5B}\x{8A5C}\x{8A5D}\x{8A5E}\x{8A5F}\x{8A60}\x{8A61}\x{8A62}\x{8A63}' . +'\x{8A65}\x{8A66}\x{8A67}\x{8A68}\x{8A69}\x{8A6A}\x{8A6B}\x{8A6C}\x{8A6D}' . +'\x{8A6E}\x{8A6F}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A74}\x{8A75}\x{8A76}' . +'\x{8A77}\x{8A79}\x{8A7A}\x{8A7B}\x{8A7C}\x{8A7E}\x{8A7F}\x{8A80}\x{8A81}' . +'\x{8A82}\x{8A83}\x{8A84}\x{8A85}\x{8A86}\x{8A87}\x{8A89}\x{8A8A}\x{8A8B}' . +'\x{8A8C}\x{8A8D}\x{8A8E}\x{8A8F}\x{8A90}\x{8A91}\x{8A92}\x{8A93}\x{8A94}' . +'\x{8A95}\x{8A96}\x{8A97}\x{8A98}\x{8A99}\x{8A9A}\x{8A9B}\x{8A9C}\x{8A9D}' . +'\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA2}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA7}' . +'\x{8AA8}\x{8AA9}\x{8AAA}\x{8AAB}\x{8AAC}\x{8AAE}\x{8AB0}\x{8AB1}\x{8AB2}' . +'\x{8AB3}\x{8AB4}\x{8AB5}\x{8AB6}\x{8AB8}\x{8AB9}\x{8ABA}\x{8ABB}\x{8ABC}' . +'\x{8ABD}\x{8ABE}\x{8ABF}\x{8AC0}\x{8AC1}\x{8AC2}\x{8AC3}\x{8AC4}\x{8AC5}' . +'\x{8AC6}\x{8AC7}\x{8AC8}\x{8AC9}\x{8ACA}\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACE}' . +'\x{8ACF}\x{8AD1}\x{8AD2}\x{8AD3}\x{8AD4}\x{8AD5}\x{8AD6}\x{8AD7}\x{8AD8}' . +'\x{8AD9}\x{8ADA}\x{8ADB}\x{8ADC}\x{8ADD}\x{8ADE}\x{8ADF}\x{8AE0}\x{8AE1}' . +'\x{8AE2}\x{8AE3}\x{8AE4}\x{8AE5}\x{8AE6}\x{8AE7}\x{8AE8}\x{8AE9}\x{8AEA}' . +'\x{8AEB}\x{8AED}\x{8AEE}\x{8AEF}\x{8AF0}\x{8AF1}\x{8AF2}\x{8AF3}\x{8AF4}' . +'\x{8AF5}\x{8AF6}\x{8AF7}\x{8AF8}\x{8AF9}\x{8AFA}\x{8AFB}\x{8AFC}\x{8AFD}' . +'\x{8AFE}\x{8AFF}\x{8B00}\x{8B01}\x{8B02}\x{8B03}\x{8B04}\x{8B05}\x{8B06}' . +'\x{8B07}\x{8B08}\x{8B09}\x{8B0A}\x{8B0B}\x{8B0D}\x{8B0E}\x{8B0F}\x{8B10}' . +'\x{8B11}\x{8B12}\x{8B13}\x{8B14}\x{8B15}\x{8B16}\x{8B17}\x{8B18}\x{8B19}' . +'\x{8B1A}\x{8B1B}\x{8B1C}\x{8B1D}\x{8B1E}\x{8B1F}\x{8B20}\x{8B21}\x{8B22}' . +'\x{8B23}\x{8B24}\x{8B25}\x{8B26}\x{8B27}\x{8B28}\x{8B2A}\x{8B2B}\x{8B2C}' . +'\x{8B2D}\x{8B2E}\x{8B2F}\x{8B30}\x{8B31}\x{8B33}\x{8B34}\x{8B35}\x{8B36}' . +'\x{8B37}\x{8B39}\x{8B3A}\x{8B3B}\x{8B3C}\x{8B3D}\x{8B3E}\x{8B40}\x{8B41}' . +'\x{8B42}\x{8B43}\x{8B44}\x{8B45}\x{8B46}\x{8B47}\x{8B48}\x{8B49}\x{8B4A}' . +'\x{8B4B}\x{8B4C}\x{8B4D}\x{8B4E}\x{8B4F}\x{8B50}\x{8B51}\x{8B52}\x{8B53}' . +'\x{8B54}\x{8B55}\x{8B56}\x{8B57}\x{8B58}\x{8B59}\x{8B5A}\x{8B5B}\x{8B5C}' . +'\x{8B5D}\x{8B5E}\x{8B5F}\x{8B60}\x{8B63}\x{8B64}\x{8B65}\x{8B66}\x{8B67}' . +'\x{8B68}\x{8B6A}\x{8B6B}\x{8B6C}\x{8B6D}\x{8B6E}\x{8B6F}\x{8B70}\x{8B71}' . +'\x{8B73}\x{8B74}\x{8B76}\x{8B77}\x{8B78}\x{8B79}\x{8B7A}\x{8B7B}\x{8B7D}' . +'\x{8B7E}\x{8B7F}\x{8B80}\x{8B82}\x{8B83}\x{8B84}\x{8B85}\x{8B86}\x{8B88}' . +'\x{8B89}\x{8B8A}\x{8B8B}\x{8B8C}\x{8B8E}\x{8B90}\x{8B91}\x{8B92}\x{8B93}' . +'\x{8B94}\x{8B95}\x{8B96}\x{8B97}\x{8B98}\x{8B99}\x{8B9A}\x{8B9C}\x{8B9D}' . +'\x{8B9E}\x{8B9F}\x{8BA0}\x{8BA1}\x{8BA2}\x{8BA3}\x{8BA4}\x{8BA5}\x{8BA6}' . +'\x{8BA7}\x{8BA8}\x{8BA9}\x{8BAA}\x{8BAB}\x{8BAC}\x{8BAD}\x{8BAE}\x{8BAF}' . +'\x{8BB0}\x{8BB1}\x{8BB2}\x{8BB3}\x{8BB4}\x{8BB5}\x{8BB6}\x{8BB7}\x{8BB8}' . +'\x{8BB9}\x{8BBA}\x{8BBB}\x{8BBC}\x{8BBD}\x{8BBE}\x{8BBF}\x{8BC0}\x{8BC1}' . +'\x{8BC2}\x{8BC3}\x{8BC4}\x{8BC5}\x{8BC6}\x{8BC7}\x{8BC8}\x{8BC9}\x{8BCA}' . +'\x{8BCB}\x{8BCC}\x{8BCD}\x{8BCE}\x{8BCF}\x{8BD0}\x{8BD1}\x{8BD2}\x{8BD3}' . +'\x{8BD4}\x{8BD5}\x{8BD6}\x{8BD7}\x{8BD8}\x{8BD9}\x{8BDA}\x{8BDB}\x{8BDC}' . +'\x{8BDD}\x{8BDE}\x{8BDF}\x{8BE0}\x{8BE1}\x{8BE2}\x{8BE3}\x{8BE4}\x{8BE5}' . +'\x{8BE6}\x{8BE7}\x{8BE8}\x{8BE9}\x{8BEA}\x{8BEB}\x{8BEC}\x{8BED}\x{8BEE}' . +'\x{8BEF}\x{8BF0}\x{8BF1}\x{8BF2}\x{8BF3}\x{8BF4}\x{8BF5}\x{8BF6}\x{8BF7}' . +'\x{8BF8}\x{8BF9}\x{8BFA}\x{8BFB}\x{8BFC}\x{8BFD}\x{8BFE}\x{8BFF}\x{8C00}' . +'\x{8C01}\x{8C02}\x{8C03}\x{8C04}\x{8C05}\x{8C06}\x{8C07}\x{8C08}\x{8C09}' . +'\x{8C0A}\x{8C0B}\x{8C0C}\x{8C0D}\x{8C0E}\x{8C0F}\x{8C10}\x{8C11}\x{8C12}' . +'\x{8C13}\x{8C14}\x{8C15}\x{8C16}\x{8C17}\x{8C18}\x{8C19}\x{8C1A}\x{8C1B}' . +'\x{8C1C}\x{8C1D}\x{8C1E}\x{8C1F}\x{8C20}\x{8C21}\x{8C22}\x{8C23}\x{8C24}' . +'\x{8C25}\x{8C26}\x{8C27}\x{8C28}\x{8C29}\x{8C2A}\x{8C2B}\x{8C2C}\x{8C2D}' . +'\x{8C2E}\x{8C2F}\x{8C30}\x{8C31}\x{8C32}\x{8C33}\x{8C34}\x{8C35}\x{8C36}' . +'\x{8C37}\x{8C39}\x{8C3A}\x{8C3B}\x{8C3C}\x{8C3D}\x{8C3E}\x{8C3F}\x{8C41}' . +'\x{8C42}\x{8C43}\x{8C45}\x{8C46}\x{8C47}\x{8C48}\x{8C49}\x{8C4A}\x{8C4B}' . +'\x{8C4C}\x{8C4D}\x{8C4E}\x{8C4F}\x{8C50}\x{8C54}\x{8C55}\x{8C56}\x{8C57}' . +'\x{8C59}\x{8C5A}\x{8C5B}\x{8C5C}\x{8C5D}\x{8C5E}\x{8C5F}\x{8C60}\x{8C61}' . +'\x{8C62}\x{8C63}\x{8C64}\x{8C65}\x{8C66}\x{8C67}\x{8C68}\x{8C69}\x{8C6A}' . +'\x{8C6B}\x{8C6C}\x{8C6D}\x{8C6E}\x{8C6F}\x{8C70}\x{8C71}\x{8C72}\x{8C73}' . +'\x{8C75}\x{8C76}\x{8C77}\x{8C78}\x{8C79}\x{8C7A}\x{8C7B}\x{8C7D}\x{8C7E}' . +'\x{8C80}\x{8C81}\x{8C82}\x{8C84}\x{8C85}\x{8C86}\x{8C88}\x{8C89}\x{8C8A}' . +'\x{8C8C}\x{8C8D}\x{8C8F}\x{8C90}\x{8C91}\x{8C92}\x{8C93}\x{8C94}\x{8C95}' . +'\x{8C96}\x{8C97}\x{8C98}\x{8C99}\x{8C9A}\x{8C9C}\x{8C9D}\x{8C9E}\x{8C9F}' . +'\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA3}\x{8CA4}\x{8CA5}\x{8CA7}\x{8CA8}\x{8CA9}' . +'\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}\x{8CB1}\x{8CB2}' . +'\x{8CB3}\x{8CB4}\x{8CB5}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CB9}\x{8CBA}\x{8CBB}' . +'\x{8CBC}\x{8CBD}\x{8CBE}\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}' . +'\x{8CC5}\x{8CC6}\x{8CC7}\x{8CC8}\x{8CC9}\x{8CCA}\x{8CCC}\x{8CCE}\x{8CCF}' . +'\x{8CD0}\x{8CD1}\x{8CD2}\x{8CD3}\x{8CD4}\x{8CD5}\x{8CD7}\x{8CD9}\x{8CDA}' . +'\x{8CDB}\x{8CDC}\x{8CDD}\x{8CDE}\x{8CDF}\x{8CE0}\x{8CE1}\x{8CE2}\x{8CE3}' . +'\x{8CE4}\x{8CE5}\x{8CE6}\x{8CE7}\x{8CE8}\x{8CEA}\x{8CEB}\x{8CEC}\x{8CED}' . +'\x{8CEE}\x{8CEF}\x{8CF0}\x{8CF1}\x{8CF2}\x{8CF3}\x{8CF4}\x{8CF5}\x{8CF6}' . +'\x{8CF8}\x{8CF9}\x{8CFA}\x{8CFB}\x{8CFC}\x{8CFD}\x{8CFE}\x{8CFF}\x{8D00}' . +'\x{8D02}\x{8D03}\x{8D04}\x{8D05}\x{8D06}\x{8D07}\x{8D08}\x{8D09}\x{8D0A}' . +'\x{8D0B}\x{8D0C}\x{8D0D}\x{8D0E}\x{8D0F}\x{8D10}\x{8D13}\x{8D14}\x{8D15}' . +'\x{8D16}\x{8D17}\x{8D18}\x{8D19}\x{8D1A}\x{8D1B}\x{8D1C}\x{8D1D}\x{8D1E}' . +'\x{8D1F}\x{8D20}\x{8D21}\x{8D22}\x{8D23}\x{8D24}\x{8D25}\x{8D26}\x{8D27}' . +'\x{8D28}\x{8D29}\x{8D2A}\x{8D2B}\x{8D2C}\x{8D2D}\x{8D2E}\x{8D2F}\x{8D30}' . +'\x{8D31}\x{8D32}\x{8D33}\x{8D34}\x{8D35}\x{8D36}\x{8D37}\x{8D38}\x{8D39}' . +'\x{8D3A}\x{8D3B}\x{8D3C}\x{8D3D}\x{8D3E}\x{8D3F}\x{8D40}\x{8D41}\x{8D42}' . +'\x{8D43}\x{8D44}\x{8D45}\x{8D46}\x{8D47}\x{8D48}\x{8D49}\x{8D4A}\x{8D4B}' . +'\x{8D4C}\x{8D4D}\x{8D4E}\x{8D4F}\x{8D50}\x{8D51}\x{8D52}\x{8D53}\x{8D54}' . +'\x{8D55}\x{8D56}\x{8D57}\x{8D58}\x{8D59}\x{8D5A}\x{8D5B}\x{8D5C}\x{8D5D}' . +'\x{8D5E}\x{8D5F}\x{8D60}\x{8D61}\x{8D62}\x{8D63}\x{8D64}\x{8D65}\x{8D66}' . +'\x{8D67}\x{8D68}\x{8D69}\x{8D6A}\x{8D6B}\x{8D6C}\x{8D6D}\x{8D6E}\x{8D6F}' . +'\x{8D70}\x{8D71}\x{8D72}\x{8D73}\x{8D74}\x{8D75}\x{8D76}\x{8D77}\x{8D78}' . +'\x{8D79}\x{8D7A}\x{8D7B}\x{8D7D}\x{8D7E}\x{8D7F}\x{8D80}\x{8D81}\x{8D82}' . +'\x{8D83}\x{8D84}\x{8D85}\x{8D86}\x{8D87}\x{8D88}\x{8D89}\x{8D8A}\x{8D8B}' . +'\x{8D8C}\x{8D8D}\x{8D8E}\x{8D8F}\x{8D90}\x{8D91}\x{8D92}\x{8D93}\x{8D94}' . +'\x{8D95}\x{8D96}\x{8D97}\x{8D98}\x{8D99}\x{8D9A}\x{8D9B}\x{8D9C}\x{8D9D}' . +'\x{8D9E}\x{8D9F}\x{8DA0}\x{8DA1}\x{8DA2}\x{8DA3}\x{8DA4}\x{8DA5}\x{8DA7}' . +'\x{8DA8}\x{8DA9}\x{8DAA}\x{8DAB}\x{8DAC}\x{8DAD}\x{8DAE}\x{8DAF}\x{8DB0}' . +'\x{8DB1}\x{8DB2}\x{8DB3}\x{8DB4}\x{8DB5}\x{8DB6}\x{8DB7}\x{8DB8}\x{8DB9}' . +'\x{8DBA}\x{8DBB}\x{8DBC}\x{8DBD}\x{8DBE}\x{8DBF}\x{8DC1}\x{8DC2}\x{8DC3}' . +'\x{8DC4}\x{8DC5}\x{8DC6}\x{8DC7}\x{8DC8}\x{8DC9}\x{8DCA}\x{8DCB}\x{8DCC}' . +'\x{8DCD}\x{8DCE}\x{8DCF}\x{8DD0}\x{8DD1}\x{8DD2}\x{8DD3}\x{8DD4}\x{8DD5}' . +'\x{8DD6}\x{8DD7}\x{8DD8}\x{8DD9}\x{8DDA}\x{8DDB}\x{8DDC}\x{8DDD}\x{8DDE}' . +'\x{8DDF}\x{8DE0}\x{8DE1}\x{8DE2}\x{8DE3}\x{8DE4}\x{8DE6}\x{8DE7}\x{8DE8}' . +'\x{8DE9}\x{8DEA}\x{8DEB}\x{8DEC}\x{8DED}\x{8DEE}\x{8DEF}\x{8DF0}\x{8DF1}' . +'\x{8DF2}\x{8DF3}\x{8DF4}\x{8DF5}\x{8DF6}\x{8DF7}\x{8DF8}\x{8DF9}\x{8DFA}' . +'\x{8DFB}\x{8DFC}\x{8DFD}\x{8DFE}\x{8DFF}\x{8E00}\x{8E02}\x{8E03}\x{8E04}' . +'\x{8E05}\x{8E06}\x{8E07}\x{8E08}\x{8E09}\x{8E0A}\x{8E0C}\x{8E0D}\x{8E0E}' . +'\x{8E0F}\x{8E10}\x{8E11}\x{8E12}\x{8E13}\x{8E14}\x{8E15}\x{8E16}\x{8E17}' . +'\x{8E18}\x{8E19}\x{8E1A}\x{8E1B}\x{8E1C}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E20}' . +'\x{8E21}\x{8E22}\x{8E23}\x{8E24}\x{8E25}\x{8E26}\x{8E27}\x{8E28}\x{8E29}' . +'\x{8E2A}\x{8E2B}\x{8E2C}\x{8E2D}\x{8E2E}\x{8E2F}\x{8E30}\x{8E31}\x{8E33}' . +'\x{8E34}\x{8E35}\x{8E36}\x{8E37}\x{8E38}\x{8E39}\x{8E3A}\x{8E3B}\x{8E3C}' . +'\x{8E3D}\x{8E3E}\x{8E3F}\x{8E40}\x{8E41}\x{8E42}\x{8E43}\x{8E44}\x{8E45}' . +'\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4B}\x{8E4C}\x{8E4D}\x{8E4E}\x{8E50}' . +'\x{8E51}\x{8E52}\x{8E53}\x{8E54}\x{8E55}\x{8E56}\x{8E57}\x{8E58}\x{8E59}' . +'\x{8E5A}\x{8E5B}\x{8E5C}\x{8E5D}\x{8E5E}\x{8E5F}\x{8E60}\x{8E61}\x{8E62}' . +'\x{8E63}\x{8E64}\x{8E65}\x{8E66}\x{8E67}\x{8E68}\x{8E69}\x{8E6A}\x{8E6B}' . +'\x{8E6C}\x{8E6D}\x{8E6F}\x{8E70}\x{8E71}\x{8E72}\x{8E73}\x{8E74}\x{8E76}' . +'\x{8E78}\x{8E7A}\x{8E7B}\x{8E7C}\x{8E7D}\x{8E7E}\x{8E7F}\x{8E80}\x{8E81}' . +'\x{8E82}\x{8E83}\x{8E84}\x{8E85}\x{8E86}\x{8E87}\x{8E88}\x{8E89}\x{8E8A}' . +'\x{8E8B}\x{8E8C}\x{8E8D}\x{8E8E}\x{8E8F}\x{8E90}\x{8E91}\x{8E92}\x{8E93}' . +'\x{8E94}\x{8E95}\x{8E96}\x{8E97}\x{8E98}\x{8E9A}\x{8E9C}\x{8E9D}\x{8E9E}' . +'\x{8E9F}\x{8EA0}\x{8EA1}\x{8EA3}\x{8EA4}\x{8EA5}\x{8EA6}\x{8EA7}\x{8EA8}' . +'\x{8EA9}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAD}\x{8EAE}\x{8EAF}\x{8EB0}\x{8EB1}' . +'\x{8EB2}\x{8EB4}\x{8EB5}\x{8EB8}\x{8EB9}\x{8EBA}\x{8EBB}\x{8EBC}\x{8EBD}' . +'\x{8EBE}\x{8EBF}\x{8EC0}\x{8EC2}\x{8EC3}\x{8EC5}\x{8EC6}\x{8EC7}\x{8EC8}' . +'\x{8EC9}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ECE}\x{8ECF}\x{8ED0}\x{8ED1}' . +'\x{8ED2}\x{8ED3}\x{8ED4}\x{8ED5}\x{8ED6}\x{8ED7}\x{8ED8}\x{8EDA}\x{8EDB}' . +'\x{8EDC}\x{8EDD}\x{8EDE}\x{8EDF}\x{8EE0}\x{8EE1}\x{8EE4}\x{8EE5}\x{8EE6}' . +'\x{8EE7}\x{8EE8}\x{8EE9}\x{8EEA}\x{8EEB}\x{8EEC}\x{8EED}\x{8EEE}\x{8EEF}' . +'\x{8EF1}\x{8EF2}\x{8EF3}\x{8EF4}\x{8EF5}\x{8EF6}\x{8EF7}\x{8EF8}\x{8EF9}' . +'\x{8EFA}\x{8EFB}\x{8EFC}\x{8EFD}\x{8EFE}\x{8EFF}\x{8F00}\x{8F01}\x{8F02}' . +'\x{8F03}\x{8F04}\x{8F05}\x{8F06}\x{8F07}\x{8F08}\x{8F09}\x{8F0A}\x{8F0B}' . +'\x{8F0D}\x{8F0E}\x{8F10}\x{8F11}\x{8F12}\x{8F13}\x{8F14}\x{8F15}\x{8F16}' . +'\x{8F17}\x{8F18}\x{8F1A}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1E}\x{8F1F}\x{8F20}' . +'\x{8F21}\x{8F22}\x{8F23}\x{8F24}\x{8F25}\x{8F26}\x{8F27}\x{8F28}\x{8F29}' . +'\x{8F2A}\x{8F2B}\x{8F2C}\x{8F2E}\x{8F2F}\x{8F30}\x{8F31}\x{8F32}\x{8F33}' . +'\x{8F34}\x{8F35}\x{8F36}\x{8F37}\x{8F38}\x{8F39}\x{8F3B}\x{8F3C}\x{8F3D}' . +'\x{8F3E}\x{8F3F}\x{8F40}\x{8F42}\x{8F43}\x{8F44}\x{8F45}\x{8F46}\x{8F47}' . +'\x{8F48}\x{8F49}\x{8F4A}\x{8F4B}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F4F}\x{8F50}' . +'\x{8F51}\x{8F52}\x{8F53}\x{8F54}\x{8F55}\x{8F56}\x{8F57}\x{8F58}\x{8F59}' . +'\x{8F5A}\x{8F5B}\x{8F5D}\x{8F5E}\x{8F5F}\x{8F60}\x{8F61}\x{8F62}\x{8F63}' . +'\x{8F64}\x{8F65}\x{8F66}\x{8F67}\x{8F68}\x{8F69}\x{8F6A}\x{8F6B}\x{8F6C}' . +'\x{8F6D}\x{8F6E}\x{8F6F}\x{8F70}\x{8F71}\x{8F72}\x{8F73}\x{8F74}\x{8F75}' . +'\x{8F76}\x{8F77}\x{8F78}\x{8F79}\x{8F7A}\x{8F7B}\x{8F7C}\x{8F7D}\x{8F7E}' . +'\x{8F7F}\x{8F80}\x{8F81}\x{8F82}\x{8F83}\x{8F84}\x{8F85}\x{8F86}\x{8F87}' . +'\x{8F88}\x{8F89}\x{8F8A}\x{8F8B}\x{8F8C}\x{8F8D}\x{8F8E}\x{8F8F}\x{8F90}' . +'\x{8F91}\x{8F92}\x{8F93}\x{8F94}\x{8F95}\x{8F96}\x{8F97}\x{8F98}\x{8F99}' . +'\x{8F9A}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA0}\x{8FA1}\x{8FA2}\x{8FA3}' . +'\x{8FA5}\x{8FA6}\x{8FA7}\x{8FA8}\x{8FA9}\x{8FAA}\x{8FAB}\x{8FAC}\x{8FAD}' . +'\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB4}\x{8FB5}\x{8FB6}\x{8FB7}' . +'\x{8FB8}\x{8FB9}\x{8FBB}\x{8FBC}\x{8FBD}\x{8FBE}\x{8FBF}\x{8FC0}\x{8FC1}' . +'\x{8FC2}\x{8FC4}\x{8FC5}\x{8FC6}\x{8FC7}\x{8FC8}\x{8FC9}\x{8FCB}\x{8FCC}' . +'\x{8FCD}\x{8FCE}\x{8FCF}\x{8FD0}\x{8FD1}\x{8FD2}\x{8FD3}\x{8FD4}\x{8FD5}' . +'\x{8FD6}\x{8FD7}\x{8FD8}\x{8FD9}\x{8FDA}\x{8FDB}\x{8FDC}\x{8FDD}\x{8FDE}' . +'\x{8FDF}\x{8FE0}\x{8FE1}\x{8FE2}\x{8FE3}\x{8FE4}\x{8FE5}\x{8FE6}\x{8FE8}' . +'\x{8FE9}\x{8FEA}\x{8FEB}\x{8FEC}\x{8FED}\x{8FEE}\x{8FEF}\x{8FF0}\x{8FF1}' . +'\x{8FF2}\x{8FF3}\x{8FF4}\x{8FF5}\x{8FF6}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}' . +'\x{8FFB}\x{8FFC}\x{8FFD}\x{8FFE}\x{8FFF}\x{9000}\x{9001}\x{9002}\x{9003}' . +'\x{9004}\x{9005}\x{9006}\x{9007}\x{9008}\x{9009}\x{900A}\x{900B}\x{900C}' . +'\x{900D}\x{900F}\x{9010}\x{9011}\x{9012}\x{9013}\x{9014}\x{9015}\x{9016}' . +'\x{9017}\x{9018}\x{9019}\x{901A}\x{901B}\x{901C}\x{901D}\x{901E}\x{901F}' . +'\x{9020}\x{9021}\x{9022}\x{9023}\x{9024}\x{9025}\x{9026}\x{9027}\x{9028}' . +'\x{9029}\x{902B}\x{902D}\x{902E}\x{902F}\x{9030}\x{9031}\x{9032}\x{9033}' . +'\x{9034}\x{9035}\x{9036}\x{9038}\x{903A}\x{903B}\x{903C}\x{903D}\x{903E}' . +'\x{903F}\x{9041}\x{9042}\x{9043}\x{9044}\x{9045}\x{9047}\x{9048}\x{9049}' . +'\x{904A}\x{904B}\x{904C}\x{904D}\x{904E}\x{904F}\x{9050}\x{9051}\x{9052}' . +'\x{9053}\x{9054}\x{9055}\x{9056}\x{9057}\x{9058}\x{9059}\x{905A}\x{905B}' . +'\x{905C}\x{905D}\x{905E}\x{905F}\x{9060}\x{9061}\x{9062}\x{9063}\x{9064}' . +'\x{9065}\x{9066}\x{9067}\x{9068}\x{9069}\x{906A}\x{906B}\x{906C}\x{906D}' . +'\x{906E}\x{906F}\x{9070}\x{9071}\x{9072}\x{9073}\x{9074}\x{9075}\x{9076}' . +'\x{9077}\x{9078}\x{9079}\x{907A}\x{907B}\x{907C}\x{907D}\x{907E}\x{907F}' . +'\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9085}\x{9086}\x{9087}\x{9088}' . +'\x{9089}\x{908A}\x{908B}\x{908C}\x{908D}\x{908E}\x{908F}\x{9090}\x{9091}' . +'\x{9092}\x{9093}\x{9094}\x{9095}\x{9096}\x{9097}\x{9098}\x{9099}\x{909A}' . +'\x{909B}\x{909C}\x{909D}\x{909E}\x{909F}\x{90A0}\x{90A1}\x{90A2}\x{90A3}' . +'\x{90A4}\x{90A5}\x{90A6}\x{90A7}\x{90A8}\x{90A9}\x{90AA}\x{90AC}\x{90AD}' . +'\x{90AE}\x{90AF}\x{90B0}\x{90B1}\x{90B2}\x{90B3}\x{90B4}\x{90B5}\x{90B6}' . +'\x{90B7}\x{90B8}\x{90B9}\x{90BA}\x{90BB}\x{90BC}\x{90BD}\x{90BE}\x{90BF}' . +'\x{90C0}\x{90C1}\x{90C2}\x{90C3}\x{90C4}\x{90C5}\x{90C6}\x{90C7}\x{90C8}' . +'\x{90C9}\x{90CA}\x{90CB}\x{90CE}\x{90CF}\x{90D0}\x{90D1}\x{90D3}\x{90D4}' . +'\x{90D5}\x{90D6}\x{90D7}\x{90D8}\x{90D9}\x{90DA}\x{90DB}\x{90DC}\x{90DD}' . +'\x{90DE}\x{90DF}\x{90E0}\x{90E1}\x{90E2}\x{90E3}\x{90E4}\x{90E5}\x{90E6}' . +'\x{90E7}\x{90E8}\x{90E9}\x{90EA}\x{90EB}\x{90EC}\x{90ED}\x{90EE}\x{90EF}' . +'\x{90F0}\x{90F1}\x{90F2}\x{90F3}\x{90F4}\x{90F5}\x{90F7}\x{90F8}\x{90F9}' . +'\x{90FA}\x{90FB}\x{90FC}\x{90FD}\x{90FE}\x{90FF}\x{9100}\x{9101}\x{9102}' . +'\x{9103}\x{9104}\x{9105}\x{9106}\x{9107}\x{9108}\x{9109}\x{910B}\x{910C}' . +'\x{910D}\x{910E}\x{910F}\x{9110}\x{9111}\x{9112}\x{9113}\x{9114}\x{9115}' . +'\x{9116}\x{9117}\x{9118}\x{9119}\x{911A}\x{911B}\x{911C}\x{911D}\x{911E}' . +'\x{911F}\x{9120}\x{9121}\x{9122}\x{9123}\x{9124}\x{9125}\x{9126}\x{9127}' . +'\x{9128}\x{9129}\x{912A}\x{912B}\x{912C}\x{912D}\x{912E}\x{912F}\x{9130}' . +'\x{9131}\x{9132}\x{9133}\x{9134}\x{9135}\x{9136}\x{9137}\x{9138}\x{9139}' . +'\x{913A}\x{913B}\x{913E}\x{913F}\x{9140}\x{9141}\x{9142}\x{9143}\x{9144}' . +'\x{9145}\x{9146}\x{9147}\x{9148}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}' . +'\x{914E}\x{914F}\x{9150}\x{9151}\x{9152}\x{9153}\x{9154}\x{9155}\x{9156}' . +'\x{9157}\x{9158}\x{915A}\x{915B}\x{915C}\x{915D}\x{915E}\x{915F}\x{9160}' . +'\x{9161}\x{9162}\x{9163}\x{9164}\x{9165}\x{9166}\x{9167}\x{9168}\x{9169}' . +'\x{916A}\x{916B}\x{916C}\x{916D}\x{916E}\x{916F}\x{9170}\x{9171}\x{9172}' . +'\x{9173}\x{9174}\x{9175}\x{9176}\x{9177}\x{9178}\x{9179}\x{917A}\x{917C}' . +'\x{917D}\x{917E}\x{917F}\x{9180}\x{9181}\x{9182}\x{9183}\x{9184}\x{9185}' . +'\x{9186}\x{9187}\x{9188}\x{9189}\x{918A}\x{918B}\x{918C}\x{918D}\x{918E}' . +'\x{918F}\x{9190}\x{9191}\x{9192}\x{9193}\x{9194}\x{9196}\x{9199}\x{919A}' . +'\x{919B}\x{919C}\x{919D}\x{919E}\x{919F}\x{91A0}\x{91A1}\x{91A2}\x{91A3}' . +'\x{91A5}\x{91A6}\x{91A7}\x{91A8}\x{91AA}\x{91AB}\x{91AC}\x{91AD}\x{91AE}' . +'\x{91AF}\x{91B0}\x{91B1}\x{91B2}\x{91B3}\x{91B4}\x{91B5}\x{91B6}\x{91B7}' . +'\x{91B9}\x{91BA}\x{91BB}\x{91BC}\x{91BD}\x{91BE}\x{91C0}\x{91C1}\x{91C2}' . +'\x{91C3}\x{91C5}\x{91C6}\x{91C7}\x{91C9}\x{91CA}\x{91CB}\x{91CC}\x{91CD}' . +'\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D2}\x{91D3}\x{91D4}\x{91D5}\x{91D7}' . +'\x{91D8}\x{91D9}\x{91DA}\x{91DB}\x{91DC}\x{91DD}\x{91DE}\x{91DF}\x{91E2}' . +'\x{91E3}\x{91E4}\x{91E5}\x{91E6}\x{91E7}\x{91E8}\x{91E9}\x{91EA}\x{91EB}' . +'\x{91EC}\x{91ED}\x{91EE}\x{91F0}\x{91F1}\x{91F2}\x{91F3}\x{91F4}\x{91F5}' . +'\x{91F7}\x{91F8}\x{91F9}\x{91FA}\x{91FB}\x{91FD}\x{91FE}\x{91FF}\x{9200}' . +'\x{9201}\x{9202}\x{9203}\x{9204}\x{9205}\x{9206}\x{9207}\x{9208}\x{9209}' . +'\x{920A}\x{920B}\x{920C}\x{920D}\x{920E}\x{920F}\x{9210}\x{9211}\x{9212}' . +'\x{9214}\x{9215}\x{9216}\x{9217}\x{9218}\x{9219}\x{921A}\x{921B}\x{921C}' . +'\x{921D}\x{921E}\x{9220}\x{9221}\x{9223}\x{9224}\x{9225}\x{9226}\x{9227}' . +'\x{9228}\x{9229}\x{922A}\x{922B}\x{922D}\x{922E}\x{922F}\x{9230}\x{9231}' . +'\x{9232}\x{9233}\x{9234}\x{9235}\x{9236}\x{9237}\x{9238}\x{9239}\x{923A}' . +'\x{923B}\x{923C}\x{923D}\x{923E}\x{923F}\x{9240}\x{9241}\x{9242}\x{9245}' . +'\x{9246}\x{9247}\x{9248}\x{9249}\x{924A}\x{924B}\x{924C}\x{924D}\x{924E}' . +'\x{924F}\x{9250}\x{9251}\x{9252}\x{9253}\x{9254}\x{9255}\x{9256}\x{9257}' . +'\x{9258}\x{9259}\x{925A}\x{925B}\x{925C}\x{925D}\x{925E}\x{925F}\x{9260}' . +'\x{9261}\x{9262}\x{9263}\x{9264}\x{9265}\x{9266}\x{9267}\x{9268}\x{926B}' . +'\x{926C}\x{926D}\x{926E}\x{926F}\x{9270}\x{9272}\x{9273}\x{9274}\x{9275}' . +'\x{9276}\x{9277}\x{9278}\x{9279}\x{927A}\x{927B}\x{927C}\x{927D}\x{927E}' . +'\x{927F}\x{9280}\x{9282}\x{9283}\x{9285}\x{9286}\x{9287}\x{9288}\x{9289}' . +'\x{928A}\x{928B}\x{928C}\x{928D}\x{928E}\x{928F}\x{9290}\x{9291}\x{9292}' . +'\x{9293}\x{9294}\x{9295}\x{9296}\x{9297}\x{9298}\x{9299}\x{929A}\x{929B}' . +'\x{929C}\x{929D}\x{929F}\x{92A0}\x{92A1}\x{92A2}\x{92A3}\x{92A4}\x{92A5}' . +'\x{92A6}\x{92A7}\x{92A8}\x{92A9}\x{92AA}\x{92AB}\x{92AC}\x{92AD}\x{92AE}' . +'\x{92AF}\x{92B0}\x{92B1}\x{92B2}\x{92B3}\x{92B4}\x{92B5}\x{92B6}\x{92B7}' . +'\x{92B8}\x{92B9}\x{92BA}\x{92BB}\x{92BC}\x{92BE}\x{92BF}\x{92C0}\x{92C1}' . +'\x{92C2}\x{92C3}\x{92C4}\x{92C5}\x{92C6}\x{92C7}\x{92C8}\x{92C9}\x{92CA}' . +'\x{92CB}\x{92CC}\x{92CD}\x{92CE}\x{92CF}\x{92D0}\x{92D1}\x{92D2}\x{92D3}' . +'\x{92D5}\x{92D6}\x{92D7}\x{92D8}\x{92D9}\x{92DA}\x{92DC}\x{92DD}\x{92DE}' . +'\x{92DF}\x{92E0}\x{92E1}\x{92E3}\x{92E4}\x{92E5}\x{92E6}\x{92E7}\x{92E8}' . +'\x{92E9}\x{92EA}\x{92EB}\x{92EC}\x{92ED}\x{92EE}\x{92EF}\x{92F0}\x{92F1}' . +'\x{92F2}\x{92F3}\x{92F4}\x{92F5}\x{92F6}\x{92F7}\x{92F8}\x{92F9}\x{92FA}' . +'\x{92FB}\x{92FC}\x{92FD}\x{92FE}\x{92FF}\x{9300}\x{9301}\x{9302}\x{9303}' . +'\x{9304}\x{9305}\x{9306}\x{9307}\x{9308}\x{9309}\x{930A}\x{930B}\x{930C}' . +'\x{930D}\x{930E}\x{930F}\x{9310}\x{9311}\x{9312}\x{9313}\x{9314}\x{9315}' . +'\x{9316}\x{9317}\x{9318}\x{9319}\x{931A}\x{931B}\x{931D}\x{931E}\x{931F}' . +'\x{9320}\x{9321}\x{9322}\x{9323}\x{9324}\x{9325}\x{9326}\x{9327}\x{9328}' . +'\x{9329}\x{932A}\x{932B}\x{932D}\x{932E}\x{932F}\x{9332}\x{9333}\x{9334}' . +'\x{9335}\x{9336}\x{9337}\x{9338}\x{9339}\x{933A}\x{933B}\x{933C}\x{933D}' . +'\x{933E}\x{933F}\x{9340}\x{9341}\x{9342}\x{9343}\x{9344}\x{9345}\x{9346}' . +'\x{9347}\x{9348}\x{9349}\x{934A}\x{934B}\x{934C}\x{934D}\x{934E}\x{934F}' . +'\x{9350}\x{9351}\x{9352}\x{9353}\x{9354}\x{9355}\x{9356}\x{9357}\x{9358}' . +'\x{9359}\x{935A}\x{935B}\x{935C}\x{935D}\x{935E}\x{935F}\x{9360}\x{9361}' . +'\x{9363}\x{9364}\x{9365}\x{9366}\x{9367}\x{9369}\x{936A}\x{936C}\x{936D}' . +'\x{936E}\x{9370}\x{9371}\x{9372}\x{9374}\x{9375}\x{9376}\x{9377}\x{9379}' . +'\x{937A}\x{937B}\x{937C}\x{937D}\x{937E}\x{9380}\x{9382}\x{9383}\x{9384}' . +'\x{9385}\x{9386}\x{9387}\x{9388}\x{9389}\x{938A}\x{938C}\x{938D}\x{938E}' . +'\x{938F}\x{9390}\x{9391}\x{9392}\x{9393}\x{9394}\x{9395}\x{9396}\x{9397}' . +'\x{9398}\x{9399}\x{939A}\x{939B}\x{939D}\x{939E}\x{939F}\x{93A1}\x{93A2}' . +'\x{93A3}\x{93A4}\x{93A5}\x{93A6}\x{93A7}\x{93A8}\x{93A9}\x{93AA}\x{93AC}' . +'\x{93AD}\x{93AE}\x{93AF}\x{93B0}\x{93B1}\x{93B2}\x{93B3}\x{93B4}\x{93B5}' . +'\x{93B6}\x{93B7}\x{93B8}\x{93B9}\x{93BA}\x{93BC}\x{93BD}\x{93BE}\x{93BF}' . +'\x{93C0}\x{93C1}\x{93C2}\x{93C3}\x{93C4}\x{93C5}\x{93C6}\x{93C7}\x{93C8}' . +'\x{93C9}\x{93CA}\x{93CB}\x{93CC}\x{93CD}\x{93CE}\x{93CF}\x{93D0}\x{93D1}' . +'\x{93D2}\x{93D3}\x{93D4}\x{93D5}\x{93D6}\x{93D7}\x{93D8}\x{93D9}\x{93DA}' . +'\x{93DB}\x{93DC}\x{93DD}\x{93DE}\x{93DF}\x{93E1}\x{93E2}\x{93E3}\x{93E4}' . +'\x{93E6}\x{93E7}\x{93E8}\x{93E9}\x{93EA}\x{93EB}\x{93EC}\x{93ED}\x{93EE}' . +'\x{93EF}\x{93F0}\x{93F1}\x{93F2}\x{93F4}\x{93F5}\x{93F6}\x{93F7}\x{93F8}' . +'\x{93F9}\x{93FA}\x{93FB}\x{93FC}\x{93FD}\x{93FE}\x{93FF}\x{9400}\x{9401}' . +'\x{9403}\x{9404}\x{9405}\x{9406}\x{9407}\x{9408}\x{9409}\x{940A}\x{940B}' . +'\x{940C}\x{940D}\x{940E}\x{940F}\x{9410}\x{9411}\x{9412}\x{9413}\x{9414}' . +'\x{9415}\x{9416}\x{9418}\x{9419}\x{941B}\x{941D}\x{9420}\x{9422}\x{9423}' . +'\x{9425}\x{9426}\x{9427}\x{9428}\x{9429}\x{942A}\x{942B}\x{942C}\x{942D}' . +'\x{942E}\x{942F}\x{9430}\x{9431}\x{9432}\x{9433}\x{9434}\x{9435}\x{9436}' . +'\x{9437}\x{9438}\x{9439}\x{943A}\x{943B}\x{943C}\x{943D}\x{943E}\x{943F}' . +'\x{9440}\x{9441}\x{9442}\x{9444}\x{9445}\x{9446}\x{9447}\x{9448}\x{9449}' . +'\x{944A}\x{944B}\x{944C}\x{944D}\x{944F}\x{9450}\x{9451}\x{9452}\x{9453}' . +'\x{9454}\x{9455}\x{9456}\x{9457}\x{9458}\x{9459}\x{945B}\x{945C}\x{945D}' . +'\x{945E}\x{945F}\x{9460}\x{9461}\x{9462}\x{9463}\x{9464}\x{9465}\x{9466}' . +'\x{9467}\x{9468}\x{9469}\x{946A}\x{946B}\x{946D}\x{946E}\x{946F}\x{9470}' . +'\x{9471}\x{9472}\x{9473}\x{9474}\x{9475}\x{9476}\x{9477}\x{9478}\x{9479}' . +'\x{947A}\x{947C}\x{947D}\x{947E}\x{947F}\x{9480}\x{9481}\x{9482}\x{9483}' . +'\x{9484}\x{9485}\x{9486}\x{9487}\x{9488}\x{9489}\x{948A}\x{948B}\x{948C}' . +'\x{948D}\x{948E}\x{948F}\x{9490}\x{9491}\x{9492}\x{9493}\x{9494}\x{9495}' . +'\x{9496}\x{9497}\x{9498}\x{9499}\x{949A}\x{949B}\x{949C}\x{949D}\x{949E}' . +'\x{949F}\x{94A0}\x{94A1}\x{94A2}\x{94A3}\x{94A4}\x{94A5}\x{94A6}\x{94A7}' . +'\x{94A8}\x{94A9}\x{94AA}\x{94AB}\x{94AC}\x{94AD}\x{94AE}\x{94AF}\x{94B0}' . +'\x{94B1}\x{94B2}\x{94B3}\x{94B4}\x{94B5}\x{94B6}\x{94B7}\x{94B8}\x{94B9}' . +'\x{94BA}\x{94BB}\x{94BC}\x{94BD}\x{94BE}\x{94BF}\x{94C0}\x{94C1}\x{94C2}' . +'\x{94C3}\x{94C4}\x{94C5}\x{94C6}\x{94C7}\x{94C8}\x{94C9}\x{94CA}\x{94CB}' . +'\x{94CC}\x{94CD}\x{94CE}\x{94CF}\x{94D0}\x{94D1}\x{94D2}\x{94D3}\x{94D4}' . +'\x{94D5}\x{94D6}\x{94D7}\x{94D8}\x{94D9}\x{94DA}\x{94DB}\x{94DC}\x{94DD}' . +'\x{94DE}\x{94DF}\x{94E0}\x{94E1}\x{94E2}\x{94E3}\x{94E4}\x{94E5}\x{94E6}' . +'\x{94E7}\x{94E8}\x{94E9}\x{94EA}\x{94EB}\x{94EC}\x{94ED}\x{94EE}\x{94EF}' . +'\x{94F0}\x{94F1}\x{94F2}\x{94F3}\x{94F4}\x{94F5}\x{94F6}\x{94F7}\x{94F8}' . +'\x{94F9}\x{94FA}\x{94FB}\x{94FC}\x{94FD}\x{94FE}\x{94FF}\x{9500}\x{9501}' . +'\x{9502}\x{9503}\x{9504}\x{9505}\x{9506}\x{9507}\x{9508}\x{9509}\x{950A}' . +'\x{950B}\x{950C}\x{950D}\x{950E}\x{950F}\x{9510}\x{9511}\x{9512}\x{9513}' . +'\x{9514}\x{9515}\x{9516}\x{9517}\x{9518}\x{9519}\x{951A}\x{951B}\x{951C}' . +'\x{951D}\x{951E}\x{951F}\x{9520}\x{9521}\x{9522}\x{9523}\x{9524}\x{9525}' . +'\x{9526}\x{9527}\x{9528}\x{9529}\x{952A}\x{952B}\x{952C}\x{952D}\x{952E}' . +'\x{952F}\x{9530}\x{9531}\x{9532}\x{9533}\x{9534}\x{9535}\x{9536}\x{9537}' . +'\x{9538}\x{9539}\x{953A}\x{953B}\x{953C}\x{953D}\x{953E}\x{953F}\x{9540}' . +'\x{9541}\x{9542}\x{9543}\x{9544}\x{9545}\x{9546}\x{9547}\x{9548}\x{9549}' . +'\x{954A}\x{954B}\x{954C}\x{954D}\x{954E}\x{954F}\x{9550}\x{9551}\x{9552}' . +'\x{9553}\x{9554}\x{9555}\x{9556}\x{9557}\x{9558}\x{9559}\x{955A}\x{955B}' . +'\x{955C}\x{955D}\x{955E}\x{955F}\x{9560}\x{9561}\x{9562}\x{9563}\x{9564}' . +'\x{9565}\x{9566}\x{9567}\x{9568}\x{9569}\x{956A}\x{956B}\x{956C}\x{956D}' . +'\x{956E}\x{956F}\x{9570}\x{9571}\x{9572}\x{9573}\x{9574}\x{9575}\x{9576}' . +'\x{9577}\x{957A}\x{957B}\x{957C}\x{957D}\x{957F}\x{9580}\x{9581}\x{9582}' . +'\x{9583}\x{9584}\x{9586}\x{9587}\x{9588}\x{9589}\x{958A}\x{958B}\x{958C}' . +'\x{958D}\x{958E}\x{958F}\x{9590}\x{9591}\x{9592}\x{9593}\x{9594}\x{9595}' . +'\x{9596}\x{9598}\x{9599}\x{959A}\x{959B}\x{959C}\x{959D}\x{959E}\x{959F}' . +'\x{95A1}\x{95A2}\x{95A3}\x{95A4}\x{95A5}\x{95A6}\x{95A7}\x{95A8}\x{95A9}' . +'\x{95AA}\x{95AB}\x{95AC}\x{95AD}\x{95AE}\x{95AF}\x{95B0}\x{95B1}\x{95B2}' . +'\x{95B5}\x{95B6}\x{95B7}\x{95B9}\x{95BA}\x{95BB}\x{95BC}\x{95BD}\x{95BE}' . +'\x{95BF}\x{95C0}\x{95C2}\x{95C3}\x{95C4}\x{95C5}\x{95C6}\x{95C7}\x{95C8}' . +'\x{95C9}\x{95CA}\x{95CB}\x{95CC}\x{95CD}\x{95CE}\x{95CF}\x{95D0}\x{95D1}' . +'\x{95D2}\x{95D3}\x{95D4}\x{95D5}\x{95D6}\x{95D7}\x{95D8}\x{95DA}\x{95DB}' . +'\x{95DC}\x{95DE}\x{95DF}\x{95E0}\x{95E1}\x{95E2}\x{95E3}\x{95E4}\x{95E5}' . +'\x{95E6}\x{95E7}\x{95E8}\x{95E9}\x{95EA}\x{95EB}\x{95EC}\x{95ED}\x{95EE}' . +'\x{95EF}\x{95F0}\x{95F1}\x{95F2}\x{95F3}\x{95F4}\x{95F5}\x{95F6}\x{95F7}' . +'\x{95F8}\x{95F9}\x{95FA}\x{95FB}\x{95FC}\x{95FD}\x{95FE}\x{95FF}\x{9600}' . +'\x{9601}\x{9602}\x{9603}\x{9604}\x{9605}\x{9606}\x{9607}\x{9608}\x{9609}' . +'\x{960A}\x{960B}\x{960C}\x{960D}\x{960E}\x{960F}\x{9610}\x{9611}\x{9612}' . +'\x{9613}\x{9614}\x{9615}\x{9616}\x{9617}\x{9618}\x{9619}\x{961A}\x{961B}' . +'\x{961C}\x{961D}\x{961E}\x{961F}\x{9620}\x{9621}\x{9622}\x{9623}\x{9624}' . +'\x{9627}\x{9628}\x{962A}\x{962B}\x{962C}\x{962D}\x{962E}\x{962F}\x{9630}' . +'\x{9631}\x{9632}\x{9633}\x{9634}\x{9635}\x{9636}\x{9637}\x{9638}\x{9639}' . +'\x{963A}\x{963B}\x{963C}\x{963D}\x{963F}\x{9640}\x{9641}\x{9642}\x{9643}' . +'\x{9644}\x{9645}\x{9646}\x{9647}\x{9648}\x{9649}\x{964A}\x{964B}\x{964C}' . +'\x{964D}\x{964E}\x{964F}\x{9650}\x{9651}\x{9652}\x{9653}\x{9654}\x{9655}' . +'\x{9658}\x{9659}\x{965A}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9660}' . +'\x{9661}\x{9662}\x{9663}\x{9664}\x{9666}\x{9667}\x{9668}\x{9669}\x{966A}' . +'\x{966B}\x{966C}\x{966D}\x{966E}\x{966F}\x{9670}\x{9671}\x{9672}\x{9673}' . +'\x{9674}\x{9675}\x{9676}\x{9677}\x{9678}\x{967C}\x{967D}\x{967E}\x{9680}' . +'\x{9683}\x{9684}\x{9685}\x{9686}\x{9687}\x{9688}\x{9689}\x{968A}\x{968B}' . +'\x{968D}\x{968E}\x{968F}\x{9690}\x{9691}\x{9692}\x{9693}\x{9694}\x{9695}' . +'\x{9697}\x{9698}\x{9699}\x{969B}\x{969C}\x{969E}\x{96A0}\x{96A1}\x{96A2}' . +'\x{96A3}\x{96A4}\x{96A5}\x{96A6}\x{96A7}\x{96A8}\x{96A9}\x{96AA}\x{96AC}' . +'\x{96AD}\x{96AE}\x{96B0}\x{96B1}\x{96B3}\x{96B4}\x{96B6}\x{96B7}\x{96B8}' . +'\x{96B9}\x{96BA}\x{96BB}\x{96BC}\x{96BD}\x{96BE}\x{96BF}\x{96C0}\x{96C1}' . +'\x{96C2}\x{96C3}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C8}\x{96C9}\x{96CA}' . +'\x{96CB}\x{96CC}\x{96CD}\x{96CE}\x{96CF}\x{96D0}\x{96D1}\x{96D2}\x{96D3}' . +'\x{96D4}\x{96D5}\x{96D6}\x{96D7}\x{96D8}\x{96D9}\x{96DA}\x{96DB}\x{96DC}' . +'\x{96DD}\x{96DE}\x{96DF}\x{96E0}\x{96E1}\x{96E2}\x{96E3}\x{96E5}\x{96E8}' . +'\x{96E9}\x{96EA}\x{96EB}\x{96EC}\x{96ED}\x{96EE}\x{96EF}\x{96F0}\x{96F1}' . +'\x{96F2}\x{96F3}\x{96F4}\x{96F5}\x{96F6}\x{96F7}\x{96F8}\x{96F9}\x{96FA}' . +'\x{96FB}\x{96FD}\x{96FE}\x{96FF}\x{9700}\x{9701}\x{9702}\x{9703}\x{9704}' . +'\x{9705}\x{9706}\x{9707}\x{9708}\x{9709}\x{970A}\x{970B}\x{970C}\x{970D}' . +'\x{970E}\x{970F}\x{9710}\x{9711}\x{9712}\x{9713}\x{9715}\x{9716}\x{9718}' . +'\x{9719}\x{971C}\x{971D}\x{971E}\x{971F}\x{9720}\x{9721}\x{9722}\x{9723}' . +'\x{9724}\x{9725}\x{9726}\x{9727}\x{9728}\x{9729}\x{972A}\x{972B}\x{972C}' . +'\x{972D}\x{972E}\x{972F}\x{9730}\x{9731}\x{9732}\x{9735}\x{9736}\x{9738}' . +'\x{9739}\x{973A}\x{973B}\x{973C}\x{973D}\x{973E}\x{973F}\x{9742}\x{9743}' . +'\x{9744}\x{9745}\x{9746}\x{9747}\x{9748}\x{9749}\x{974A}\x{974B}\x{974C}' . +'\x{974E}\x{974F}\x{9750}\x{9751}\x{9752}\x{9753}\x{9754}\x{9755}\x{9756}' . +'\x{9758}\x{9759}\x{975A}\x{975B}\x{975C}\x{975D}\x{975E}\x{975F}\x{9760}' . +'\x{9761}\x{9762}\x{9765}\x{9766}\x{9767}\x{9768}\x{9769}\x{976A}\x{976B}' . +'\x{976C}\x{976D}\x{976E}\x{976F}\x{9770}\x{9772}\x{9773}\x{9774}\x{9776}' . +'\x{9777}\x{9778}\x{9779}\x{977A}\x{977B}\x{977C}\x{977D}\x{977E}\x{977F}' . +'\x{9780}\x{9781}\x{9782}\x{9783}\x{9784}\x{9785}\x{9786}\x{9788}\x{978A}' . +'\x{978B}\x{978C}\x{978D}\x{978E}\x{978F}\x{9790}\x{9791}\x{9792}\x{9793}' . +'\x{9794}\x{9795}\x{9796}\x{9797}\x{9798}\x{9799}\x{979A}\x{979C}\x{979D}' . +'\x{979E}\x{979F}\x{97A0}\x{97A1}\x{97A2}\x{97A3}\x{97A4}\x{97A5}\x{97A6}' . +'\x{97A7}\x{97A8}\x{97AA}\x{97AB}\x{97AC}\x{97AD}\x{97AE}\x{97AF}\x{97B2}' . +'\x{97B3}\x{97B4}\x{97B6}\x{97B7}\x{97B8}\x{97B9}\x{97BA}\x{97BB}\x{97BC}' . +'\x{97BD}\x{97BF}\x{97C1}\x{97C2}\x{97C3}\x{97C4}\x{97C5}\x{97C6}\x{97C7}' . +'\x{97C8}\x{97C9}\x{97CA}\x{97CB}\x{97CC}\x{97CD}\x{97CE}\x{97CF}\x{97D0}' . +'\x{97D1}\x{97D3}\x{97D4}\x{97D5}\x{97D6}\x{97D7}\x{97D8}\x{97D9}\x{97DA}' . +'\x{97DB}\x{97DC}\x{97DD}\x{97DE}\x{97DF}\x{97E0}\x{97E1}\x{97E2}\x{97E3}' . +'\x{97E4}\x{97E5}\x{97E6}\x{97E7}\x{97E8}\x{97E9}\x{97EA}\x{97EB}\x{97EC}' . +'\x{97ED}\x{97EE}\x{97EF}\x{97F0}\x{97F1}\x{97F2}\x{97F3}\x{97F4}\x{97F5}' . +'\x{97F6}\x{97F7}\x{97F8}\x{97F9}\x{97FA}\x{97FB}\x{97FD}\x{97FE}\x{97FF}' . +'\x{9800}\x{9801}\x{9802}\x{9803}\x{9804}\x{9805}\x{9806}\x{9807}\x{9808}' . +'\x{9809}\x{980A}\x{980B}\x{980C}\x{980D}\x{980E}\x{980F}\x{9810}\x{9811}' . +'\x{9812}\x{9813}\x{9814}\x{9815}\x{9816}\x{9817}\x{9818}\x{9819}\x{981A}' . +'\x{981B}\x{981C}\x{981D}\x{981E}\x{9820}\x{9821}\x{9822}\x{9823}\x{9824}' . +'\x{9826}\x{9827}\x{9828}\x{9829}\x{982B}\x{982D}\x{982E}\x{982F}\x{9830}' . +'\x{9831}\x{9832}\x{9834}\x{9835}\x{9836}\x{9837}\x{9838}\x{9839}\x{983B}' . +'\x{983C}\x{983D}\x{983F}\x{9840}\x{9841}\x{9843}\x{9844}\x{9845}\x{9846}' . +'\x{9848}\x{9849}\x{984A}\x{984C}\x{984D}\x{984E}\x{984F}\x{9850}\x{9851}' . +'\x{9852}\x{9853}\x{9854}\x{9855}\x{9857}\x{9858}\x{9859}\x{985A}\x{985B}' . +'\x{985C}\x{985D}\x{985E}\x{985F}\x{9860}\x{9861}\x{9862}\x{9863}\x{9864}' . +'\x{9865}\x{9867}\x{9869}\x{986A}\x{986B}\x{986C}\x{986D}\x{986E}\x{986F}' . +'\x{9870}\x{9871}\x{9872}\x{9873}\x{9874}\x{9875}\x{9876}\x{9877}\x{9878}' . +'\x{9879}\x{987A}\x{987B}\x{987C}\x{987D}\x{987E}\x{987F}\x{9880}\x{9881}' . +'\x{9882}\x{9883}\x{9884}\x{9885}\x{9886}\x{9887}\x{9888}\x{9889}\x{988A}' . +'\x{988B}\x{988C}\x{988D}\x{988E}\x{988F}\x{9890}\x{9891}\x{9892}\x{9893}' . +'\x{9894}\x{9895}\x{9896}\x{9897}\x{9898}\x{9899}\x{989A}\x{989B}\x{989C}' . +'\x{989D}\x{989E}\x{989F}\x{98A0}\x{98A1}\x{98A2}\x{98A3}\x{98A4}\x{98A5}' . +'\x{98A6}\x{98A7}\x{98A8}\x{98A9}\x{98AA}\x{98AB}\x{98AC}\x{98AD}\x{98AE}' . +'\x{98AF}\x{98B0}\x{98B1}\x{98B2}\x{98B3}\x{98B4}\x{98B5}\x{98B6}\x{98B8}' . +'\x{98B9}\x{98BA}\x{98BB}\x{98BC}\x{98BD}\x{98BE}\x{98BF}\x{98C0}\x{98C1}' . +'\x{98C2}\x{98C3}\x{98C4}\x{98C5}\x{98C6}\x{98C8}\x{98C9}\x{98CB}\x{98CC}' . +'\x{98CD}\x{98CE}\x{98CF}\x{98D0}\x{98D1}\x{98D2}\x{98D3}\x{98D4}\x{98D5}' . +'\x{98D6}\x{98D7}\x{98D8}\x{98D9}\x{98DA}\x{98DB}\x{98DC}\x{98DD}\x{98DE}' . +'\x{98DF}\x{98E0}\x{98E2}\x{98E3}\x{98E5}\x{98E6}\x{98E7}\x{98E8}\x{98E9}' . +'\x{98EA}\x{98EB}\x{98ED}\x{98EF}\x{98F0}\x{98F2}\x{98F3}\x{98F4}\x{98F5}' . +'\x{98F6}\x{98F7}\x{98F9}\x{98FA}\x{98FC}\x{98FD}\x{98FE}\x{98FF}\x{9900}' . +'\x{9901}\x{9902}\x{9903}\x{9904}\x{9905}\x{9906}\x{9907}\x{9908}\x{9909}' . +'\x{990A}\x{990B}\x{990C}\x{990D}\x{990E}\x{990F}\x{9910}\x{9911}\x{9912}' . +'\x{9913}\x{9914}\x{9915}\x{9916}\x{9917}\x{9918}\x{991A}\x{991B}\x{991C}' . +'\x{991D}\x{991E}\x{991F}\x{9920}\x{9921}\x{9922}\x{9923}\x{9924}\x{9925}' . +'\x{9926}\x{9927}\x{9928}\x{9929}\x{992A}\x{992B}\x{992C}\x{992D}\x{992E}' . +'\x{992F}\x{9930}\x{9931}\x{9932}\x{9933}\x{9934}\x{9935}\x{9936}\x{9937}' . +'\x{9938}\x{9939}\x{993A}\x{993C}\x{993D}\x{993E}\x{993F}\x{9940}\x{9941}' . +'\x{9942}\x{9943}\x{9945}\x{9946}\x{9947}\x{9948}\x{9949}\x{994A}\x{994B}' . +'\x{994C}\x{994E}\x{994F}\x{9950}\x{9951}\x{9952}\x{9953}\x{9954}\x{9955}' . +'\x{9956}\x{9957}\x{9958}\x{9959}\x{995B}\x{995C}\x{995E}\x{995F}\x{9960}' . +'\x{9961}\x{9962}\x{9963}\x{9964}\x{9965}\x{9966}\x{9967}\x{9968}\x{9969}' . +'\x{996A}\x{996B}\x{996C}\x{996D}\x{996E}\x{996F}\x{9970}\x{9971}\x{9972}' . +'\x{9973}\x{9974}\x{9975}\x{9976}\x{9977}\x{9978}\x{9979}\x{997A}\x{997B}' . +'\x{997C}\x{997D}\x{997E}\x{997F}\x{9980}\x{9981}\x{9982}\x{9983}\x{9984}' . +'\x{9985}\x{9986}\x{9987}\x{9988}\x{9989}\x{998A}\x{998B}\x{998C}\x{998D}' . +'\x{998E}\x{998F}\x{9990}\x{9991}\x{9992}\x{9993}\x{9994}\x{9995}\x{9996}' . +'\x{9997}\x{9998}\x{9999}\x{999A}\x{999B}\x{999C}\x{999D}\x{999E}\x{999F}' . +'\x{99A0}\x{99A1}\x{99A2}\x{99A3}\x{99A4}\x{99A5}\x{99A6}\x{99A7}\x{99A8}' . +'\x{99A9}\x{99AA}\x{99AB}\x{99AC}\x{99AD}\x{99AE}\x{99AF}\x{99B0}\x{99B1}' . +'\x{99B2}\x{99B3}\x{99B4}\x{99B5}\x{99B6}\x{99B7}\x{99B8}\x{99B9}\x{99BA}' . +'\x{99BB}\x{99BC}\x{99BD}\x{99BE}\x{99C0}\x{99C1}\x{99C2}\x{99C3}\x{99C4}' . +'\x{99C6}\x{99C7}\x{99C8}\x{99C9}\x{99CA}\x{99CB}\x{99CC}\x{99CD}\x{99CE}' . +'\x{99CF}\x{99D0}\x{99D1}\x{99D2}\x{99D3}\x{99D4}\x{99D5}\x{99D6}\x{99D7}' . +'\x{99D8}\x{99D9}\x{99DA}\x{99DB}\x{99DC}\x{99DD}\x{99DE}\x{99DF}\x{99E1}' . +'\x{99E2}\x{99E3}\x{99E4}\x{99E5}\x{99E7}\x{99E8}\x{99E9}\x{99EA}\x{99EC}' . +'\x{99ED}\x{99EE}\x{99EF}\x{99F0}\x{99F1}\x{99F2}\x{99F3}\x{99F4}\x{99F6}' . +'\x{99F7}\x{99F8}\x{99F9}\x{99FA}\x{99FB}\x{99FC}\x{99FD}\x{99FE}\x{99FF}' . +'\x{9A00}\x{9A01}\x{9A02}\x{9A03}\x{9A04}\x{9A05}\x{9A06}\x{9A07}\x{9A08}' . +'\x{9A09}\x{9A0A}\x{9A0B}\x{9A0C}\x{9A0D}\x{9A0E}\x{9A0F}\x{9A11}\x{9A14}' . +'\x{9A15}\x{9A16}\x{9A19}\x{9A1A}\x{9A1B}\x{9A1C}\x{9A1D}\x{9A1E}\x{9A1F}' . +'\x{9A20}\x{9A21}\x{9A22}\x{9A23}\x{9A24}\x{9A25}\x{9A26}\x{9A27}\x{9A29}' . +'\x{9A2A}\x{9A2B}\x{9A2C}\x{9A2D}\x{9A2E}\x{9A2F}\x{9A30}\x{9A31}\x{9A32}' . +'\x{9A33}\x{9A34}\x{9A35}\x{9A36}\x{9A37}\x{9A38}\x{9A39}\x{9A3A}\x{9A3C}' . +'\x{9A3D}\x{9A3E}\x{9A3F}\x{9A40}\x{9A41}\x{9A42}\x{9A43}\x{9A44}\x{9A45}' . +'\x{9A46}\x{9A47}\x{9A48}\x{9A49}\x{9A4A}\x{9A4B}\x{9A4C}\x{9A4D}\x{9A4E}' . +'\x{9A4F}\x{9A50}\x{9A52}\x{9A53}\x{9A54}\x{9A55}\x{9A56}\x{9A57}\x{9A59}' . +'\x{9A5A}\x{9A5B}\x{9A5C}\x{9A5E}\x{9A5F}\x{9A60}\x{9A61}\x{9A62}\x{9A64}' . +'\x{9A65}\x{9A66}\x{9A67}\x{9A68}\x{9A69}\x{9A6A}\x{9A6B}\x{9A6C}\x{9A6D}' . +'\x{9A6E}\x{9A6F}\x{9A70}\x{9A71}\x{9A72}\x{9A73}\x{9A74}\x{9A75}\x{9A76}' . +'\x{9A77}\x{9A78}\x{9A79}\x{9A7A}\x{9A7B}\x{9A7C}\x{9A7D}\x{9A7E}\x{9A7F}' . +'\x{9A80}\x{9A81}\x{9A82}\x{9A83}\x{9A84}\x{9A85}\x{9A86}\x{9A87}\x{9A88}' . +'\x{9A89}\x{9A8A}\x{9A8B}\x{9A8C}\x{9A8D}\x{9A8E}\x{9A8F}\x{9A90}\x{9A91}' . +'\x{9A92}\x{9A93}\x{9A94}\x{9A95}\x{9A96}\x{9A97}\x{9A98}\x{9A99}\x{9A9A}' . +'\x{9A9B}\x{9A9C}\x{9A9D}\x{9A9E}\x{9A9F}\x{9AA0}\x{9AA1}\x{9AA2}\x{9AA3}' . +'\x{9AA4}\x{9AA5}\x{9AA6}\x{9AA7}\x{9AA8}\x{9AAA}\x{9AAB}\x{9AAC}\x{9AAD}' . +'\x{9AAE}\x{9AAF}\x{9AB0}\x{9AB1}\x{9AB2}\x{9AB3}\x{9AB4}\x{9AB5}\x{9AB6}' . +'\x{9AB7}\x{9AB8}\x{9AB9}\x{9ABA}\x{9ABB}\x{9ABC}\x{9ABE}\x{9ABF}\x{9AC0}' . +'\x{9AC1}\x{9AC2}\x{9AC3}\x{9AC4}\x{9AC5}\x{9AC6}\x{9AC7}\x{9AC9}\x{9ACA}' . +'\x{9ACB}\x{9ACC}\x{9ACD}\x{9ACE}\x{9ACF}\x{9AD0}\x{9AD1}\x{9AD2}\x{9AD3}' . +'\x{9AD4}\x{9AD5}\x{9AD6}\x{9AD8}\x{9AD9}\x{9ADA}\x{9ADB}\x{9ADC}\x{9ADD}' . +'\x{9ADE}\x{9ADF}\x{9AE1}\x{9AE2}\x{9AE3}\x{9AE5}\x{9AE6}\x{9AE7}\x{9AEA}' . +'\x{9AEB}\x{9AEC}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF2}\x{9AF3}\x{9AF4}' . +'\x{9AF5}\x{9AF6}\x{9AF7}\x{9AF8}\x{9AF9}\x{9AFA}\x{9AFB}\x{9AFC}\x{9AFD}' . +'\x{9AFE}\x{9AFF}\x{9B01}\x{9B03}\x{9B04}\x{9B05}\x{9B06}\x{9B07}\x{9B08}' . +'\x{9B0A}\x{9B0B}\x{9B0C}\x{9B0D}\x{9B0E}\x{9B0F}\x{9B10}\x{9B11}\x{9B12}' . +'\x{9B13}\x{9B15}\x{9B16}\x{9B17}\x{9B18}\x{9B19}\x{9B1A}\x{9B1C}\x{9B1D}' . +'\x{9B1E}\x{9B1F}\x{9B20}\x{9B21}\x{9B22}\x{9B23}\x{9B24}\x{9B25}\x{9B26}' . +'\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2B}\x{9B2C}\x{9B2D}\x{9B2E}\x{9B2F}' . +'\x{9B30}\x{9B31}\x{9B32}\x{9B33}\x{9B35}\x{9B36}\x{9B37}\x{9B38}\x{9B39}' . +'\x{9B3A}\x{9B3B}\x{9B3C}\x{9B3E}\x{9B3F}\x{9B41}\x{9B42}\x{9B43}\x{9B44}' . +'\x{9B45}\x{9B46}\x{9B47}\x{9B48}\x{9B49}\x{9B4A}\x{9B4B}\x{9B4C}\x{9B4D}' . +'\x{9B4E}\x{9B4F}\x{9B51}\x{9B52}\x{9B53}\x{9B54}\x{9B55}\x{9B56}\x{9B58}' . +'\x{9B59}\x{9B5A}\x{9B5B}\x{9B5C}\x{9B5D}\x{9B5E}\x{9B5F}\x{9B60}\x{9B61}' . +'\x{9B63}\x{9B64}\x{9B65}\x{9B66}\x{9B67}\x{9B68}\x{9B69}\x{9B6A}\x{9B6B}' . +'\x{9B6C}\x{9B6D}\x{9B6E}\x{9B6F}\x{9B70}\x{9B71}\x{9B73}\x{9B74}\x{9B75}' . +'\x{9B76}\x{9B77}\x{9B78}\x{9B79}\x{9B7A}\x{9B7B}\x{9B7C}\x{9B7D}\x{9B7E}' . +'\x{9B7F}\x{9B80}\x{9B81}\x{9B82}\x{9B83}\x{9B84}\x{9B85}\x{9B86}\x{9B87}' . +'\x{9B88}\x{9B8A}\x{9B8B}\x{9B8D}\x{9B8E}\x{9B8F}\x{9B90}\x{9B91}\x{9B92}' . +'\x{9B93}\x{9B94}\x{9B95}\x{9B96}\x{9B97}\x{9B98}\x{9B9A}\x{9B9B}\x{9B9C}' . +'\x{9B9D}\x{9B9E}\x{9B9F}\x{9BA0}\x{9BA1}\x{9BA2}\x{9BA3}\x{9BA4}\x{9BA5}' . +'\x{9BA6}\x{9BA7}\x{9BA8}\x{9BA9}\x{9BAA}\x{9BAB}\x{9BAC}\x{9BAD}\x{9BAE}' . +'\x{9BAF}\x{9BB0}\x{9BB1}\x{9BB2}\x{9BB3}\x{9BB4}\x{9BB5}\x{9BB6}\x{9BB7}' . +'\x{9BB8}\x{9BB9}\x{9BBA}\x{9BBB}\x{9BBC}\x{9BBD}\x{9BBE}\x{9BBF}\x{9BC0}' . +'\x{9BC1}\x{9BC3}\x{9BC4}\x{9BC5}\x{9BC6}\x{9BC7}\x{9BC8}\x{9BC9}\x{9BCA}' . +'\x{9BCB}\x{9BCC}\x{9BCD}\x{9BCE}\x{9BCF}\x{9BD0}\x{9BD1}\x{9BD2}\x{9BD3}' . +'\x{9BD4}\x{9BD5}\x{9BD6}\x{9BD7}\x{9BD8}\x{9BD9}\x{9BDA}\x{9BDB}\x{9BDC}' . +'\x{9BDD}\x{9BDE}\x{9BDF}\x{9BE0}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}\x{9BE5}' . +'\x{9BE6}\x{9BE7}\x{9BE8}\x{9BE9}\x{9BEA}\x{9BEB}\x{9BEC}\x{9BED}\x{9BEE}' . +'\x{9BEF}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF3}\x{9BF4}\x{9BF5}\x{9BF7}\x{9BF8}' . +'\x{9BF9}\x{9BFA}\x{9BFB}\x{9BFC}\x{9BFD}\x{9BFE}\x{9BFF}\x{9C02}\x{9C05}' . +'\x{9C06}\x{9C07}\x{9C08}\x{9C09}\x{9C0A}\x{9C0B}\x{9C0C}\x{9C0D}\x{9C0E}' . +'\x{9C0F}\x{9C10}\x{9C11}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C16}\x{9C17}' . +'\x{9C18}\x{9C19}\x{9C1A}\x{9C1B}\x{9C1C}\x{9C1D}\x{9C1E}\x{9C1F}\x{9C20}' . +'\x{9C21}\x{9C22}\x{9C23}\x{9C24}\x{9C25}\x{9C26}\x{9C27}\x{9C28}\x{9C29}' . +'\x{9C2A}\x{9C2B}\x{9C2C}\x{9C2D}\x{9C2F}\x{9C30}\x{9C31}\x{9C32}\x{9C33}' . +'\x{9C34}\x{9C35}\x{9C36}\x{9C37}\x{9C38}\x{9C39}\x{9C3A}\x{9C3B}\x{9C3C}' . +'\x{9C3D}\x{9C3E}\x{9C3F}\x{9C40}\x{9C41}\x{9C43}\x{9C44}\x{9C45}\x{9C46}' . +'\x{9C47}\x{9C48}\x{9C49}\x{9C4A}\x{9C4B}\x{9C4C}\x{9C4D}\x{9C4E}\x{9C50}' . +'\x{9C52}\x{9C53}\x{9C54}\x{9C55}\x{9C56}\x{9C57}\x{9C58}\x{9C59}\x{9C5A}' . +'\x{9C5B}\x{9C5C}\x{9C5D}\x{9C5E}\x{9C5F}\x{9C60}\x{9C62}\x{9C63}\x{9C65}' . +'\x{9C66}\x{9C67}\x{9C68}\x{9C69}\x{9C6A}\x{9C6B}\x{9C6C}\x{9C6D}\x{9C6E}' . +'\x{9C6F}\x{9C70}\x{9C71}\x{9C72}\x{9C73}\x{9C74}\x{9C75}\x{9C77}\x{9C78}' . +'\x{9C79}\x{9C7A}\x{9C7C}\x{9C7D}\x{9C7E}\x{9C7F}\x{9C80}\x{9C81}\x{9C82}' . +'\x{9C83}\x{9C84}\x{9C85}\x{9C86}\x{9C87}\x{9C88}\x{9C89}\x{9C8A}\x{9C8B}' . +'\x{9C8C}\x{9C8D}\x{9C8E}\x{9C8F}\x{9C90}\x{9C91}\x{9C92}\x{9C93}\x{9C94}' . +'\x{9C95}\x{9C96}\x{9C97}\x{9C98}\x{9C99}\x{9C9A}\x{9C9B}\x{9C9C}\x{9C9D}' . +'\x{9C9E}\x{9C9F}\x{9CA0}\x{9CA1}\x{9CA2}\x{9CA3}\x{9CA4}\x{9CA5}\x{9CA6}' . +'\x{9CA7}\x{9CA8}\x{9CA9}\x{9CAA}\x{9CAB}\x{9CAC}\x{9CAD}\x{9CAE}\x{9CAF}' . +'\x{9CB0}\x{9CB1}\x{9CB2}\x{9CB3}\x{9CB4}\x{9CB5}\x{9CB6}\x{9CB7}\x{9CB8}' . +'\x{9CB9}\x{9CBA}\x{9CBB}\x{9CBC}\x{9CBD}\x{9CBE}\x{9CBF}\x{9CC0}\x{9CC1}' . +'\x{9CC2}\x{9CC3}\x{9CC4}\x{9CC5}\x{9CC6}\x{9CC7}\x{9CC8}\x{9CC9}\x{9CCA}' . +'\x{9CCB}\x{9CCC}\x{9CCD}\x{9CCE}\x{9CCF}\x{9CD0}\x{9CD1}\x{9CD2}\x{9CD3}' . +'\x{9CD4}\x{9CD5}\x{9CD6}\x{9CD7}\x{9CD8}\x{9CD9}\x{9CDA}\x{9CDB}\x{9CDC}' . +'\x{9CDD}\x{9CDE}\x{9CDF}\x{9CE0}\x{9CE1}\x{9CE2}\x{9CE3}\x{9CE4}\x{9CE5}' . +'\x{9CE6}\x{9CE7}\x{9CE8}\x{9CE9}\x{9CEA}\x{9CEB}\x{9CEC}\x{9CED}\x{9CEE}' . +'\x{9CEF}\x{9CF0}\x{9CF1}\x{9CF2}\x{9CF3}\x{9CF4}\x{9CF5}\x{9CF6}\x{9CF7}' . +'\x{9CF8}\x{9CF9}\x{9CFA}\x{9CFB}\x{9CFC}\x{9CFD}\x{9CFE}\x{9CFF}\x{9D00}' . +'\x{9D01}\x{9D02}\x{9D03}\x{9D04}\x{9D05}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' . +'\x{9D0A}\x{9D0B}\x{9D0F}\x{9D10}\x{9D12}\x{9D13}\x{9D14}\x{9D15}\x{9D16}' . +'\x{9D17}\x{9D18}\x{9D19}\x{9D1A}\x{9D1B}\x{9D1C}\x{9D1D}\x{9D1E}\x{9D1F}' . +'\x{9D20}\x{9D21}\x{9D22}\x{9D23}\x{9D24}\x{9D25}\x{9D26}\x{9D28}\x{9D29}' . +'\x{9D2B}\x{9D2D}\x{9D2E}\x{9D2F}\x{9D30}\x{9D31}\x{9D32}\x{9D33}\x{9D34}' . +'\x{9D36}\x{9D37}\x{9D38}\x{9D39}\x{9D3A}\x{9D3B}\x{9D3D}\x{9D3E}\x{9D3F}' . +'\x{9D40}\x{9D41}\x{9D42}\x{9D43}\x{9D45}\x{9D46}\x{9D47}\x{9D48}\x{9D49}' . +'\x{9D4A}\x{9D4B}\x{9D4C}\x{9D4D}\x{9D4E}\x{9D4F}\x{9D50}\x{9D51}\x{9D52}' . +'\x{9D53}\x{9D54}\x{9D55}\x{9D56}\x{9D57}\x{9D58}\x{9D59}\x{9D5A}\x{9D5B}' . +'\x{9D5C}\x{9D5D}\x{9D5E}\x{9D5F}\x{9D60}\x{9D61}\x{9D62}\x{9D63}\x{9D64}' . +'\x{9D65}\x{9D66}\x{9D67}\x{9D68}\x{9D69}\x{9D6A}\x{9D6B}\x{9D6C}\x{9D6E}' . +'\x{9D6F}\x{9D70}\x{9D71}\x{9D72}\x{9D73}\x{9D74}\x{9D75}\x{9D76}\x{9D77}' . +'\x{9D78}\x{9D79}\x{9D7A}\x{9D7B}\x{9D7C}\x{9D7D}\x{9D7E}\x{9D7F}\x{9D80}' . +'\x{9D81}\x{9D82}\x{9D83}\x{9D84}\x{9D85}\x{9D86}\x{9D87}\x{9D88}\x{9D89}' . +'\x{9D8A}\x{9D8B}\x{9D8C}\x{9D8D}\x{9D8E}\x{9D90}\x{9D91}\x{9D92}\x{9D93}' . +'\x{9D94}\x{9D96}\x{9D97}\x{9D98}\x{9D99}\x{9D9A}\x{9D9B}\x{9D9C}\x{9D9D}' . +'\x{9D9E}\x{9D9F}\x{9DA0}\x{9DA1}\x{9DA2}\x{9DA3}\x{9DA4}\x{9DA5}\x{9DA6}' . +'\x{9DA7}\x{9DA8}\x{9DA9}\x{9DAA}\x{9DAB}\x{9DAC}\x{9DAD}\x{9DAF}\x{9DB0}' . +'\x{9DB1}\x{9DB2}\x{9DB3}\x{9DB4}\x{9DB5}\x{9DB6}\x{9DB7}\x{9DB8}\x{9DB9}' . +'\x{9DBA}\x{9DBB}\x{9DBC}\x{9DBE}\x{9DBF}\x{9DC1}\x{9DC2}\x{9DC3}\x{9DC4}' . +'\x{9DC5}\x{9DC7}\x{9DC8}\x{9DC9}\x{9DCA}\x{9DCB}\x{9DCC}\x{9DCD}\x{9DCE}' . +'\x{9DCF}\x{9DD0}\x{9DD1}\x{9DD2}\x{9DD3}\x{9DD4}\x{9DD5}\x{9DD6}\x{9DD7}' . +'\x{9DD8}\x{9DD9}\x{9DDA}\x{9DDB}\x{9DDC}\x{9DDD}\x{9DDE}\x{9DDF}\x{9DE0}' . +'\x{9DE1}\x{9DE2}\x{9DE3}\x{9DE4}\x{9DE5}\x{9DE6}\x{9DE7}\x{9DE8}\x{9DE9}' . +'\x{9DEB}\x{9DEC}\x{9DED}\x{9DEE}\x{9DEF}\x{9DF0}\x{9DF1}\x{9DF2}\x{9DF3}' . +'\x{9DF4}\x{9DF5}\x{9DF6}\x{9DF7}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFB}\x{9DFD}' . +'\x{9DFE}\x{9DFF}\x{9E00}\x{9E01}\x{9E02}\x{9E03}\x{9E04}\x{9E05}\x{9E06}' . +'\x{9E07}\x{9E08}\x{9E09}\x{9E0A}\x{9E0B}\x{9E0C}\x{9E0D}\x{9E0F}\x{9E10}' . +'\x{9E11}\x{9E12}\x{9E13}\x{9E14}\x{9E15}\x{9E17}\x{9E18}\x{9E19}\x{9E1A}' . +'\x{9E1B}\x{9E1D}\x{9E1E}\x{9E1F}\x{9E20}\x{9E21}\x{9E22}\x{9E23}\x{9E24}' . +'\x{9E25}\x{9E26}\x{9E27}\x{9E28}\x{9E29}\x{9E2A}\x{9E2B}\x{9E2C}\x{9E2D}' . +'\x{9E2E}\x{9E2F}\x{9E30}\x{9E31}\x{9E32}\x{9E33}\x{9E34}\x{9E35}\x{9E36}' . +'\x{9E37}\x{9E38}\x{9E39}\x{9E3A}\x{9E3B}\x{9E3C}\x{9E3D}\x{9E3E}\x{9E3F}' . +'\x{9E40}\x{9E41}\x{9E42}\x{9E43}\x{9E44}\x{9E45}\x{9E46}\x{9E47}\x{9E48}' . +'\x{9E49}\x{9E4A}\x{9E4B}\x{9E4C}\x{9E4D}\x{9E4E}\x{9E4F}\x{9E50}\x{9E51}' . +'\x{9E52}\x{9E53}\x{9E54}\x{9E55}\x{9E56}\x{9E57}\x{9E58}\x{9E59}\x{9E5A}' . +'\x{9E5B}\x{9E5C}\x{9E5D}\x{9E5E}\x{9E5F}\x{9E60}\x{9E61}\x{9E62}\x{9E63}' . +'\x{9E64}\x{9E65}\x{9E66}\x{9E67}\x{9E68}\x{9E69}\x{9E6A}\x{9E6B}\x{9E6C}' . +'\x{9E6D}\x{9E6E}\x{9E6F}\x{9E70}\x{9E71}\x{9E72}\x{9E73}\x{9E74}\x{9E75}' . +'\x{9E76}\x{9E77}\x{9E79}\x{9E7A}\x{9E7C}\x{9E7D}\x{9E7E}\x{9E7F}\x{9E80}' . +'\x{9E81}\x{9E82}\x{9E83}\x{9E84}\x{9E85}\x{9E86}\x{9E87}\x{9E88}\x{9E89}' . +'\x{9E8A}\x{9E8B}\x{9E8C}\x{9E8D}\x{9E8E}\x{9E91}\x{9E92}\x{9E93}\x{9E94}' . +'\x{9E96}\x{9E97}\x{9E99}\x{9E9A}\x{9E9B}\x{9E9C}\x{9E9D}\x{9E9F}\x{9EA0}' . +'\x{9EA1}\x{9EA3}\x{9EA4}\x{9EA5}\x{9EA6}\x{9EA7}\x{9EA8}\x{9EA9}\x{9EAA}' . +'\x{9EAD}\x{9EAE}\x{9EAF}\x{9EB0}\x{9EB2}\x{9EB3}\x{9EB4}\x{9EB5}\x{9EB6}' . +'\x{9EB7}\x{9EB8}\x{9EBB}\x{9EBC}\x{9EBD}\x{9EBE}\x{9EBF}\x{9EC0}\x{9EC1}' . +'\x{9EC2}\x{9EC3}\x{9EC4}\x{9EC5}\x{9EC6}\x{9EC7}\x{9EC8}\x{9EC9}\x{9ECA}' . +'\x{9ECB}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED1}\x{9ED2}\x{9ED3}' . +'\x{9ED4}\x{9ED5}\x{9ED6}\x{9ED7}\x{9ED8}\x{9ED9}\x{9EDA}\x{9EDB}\x{9EDC}' . +'\x{9EDD}\x{9EDE}\x{9EDF}\x{9EE0}\x{9EE1}\x{9EE2}\x{9EE3}\x{9EE4}\x{9EE5}' . +'\x{9EE6}\x{9EE7}\x{9EE8}\x{9EE9}\x{9EEA}\x{9EEB}\x{9EED}\x{9EEE}\x{9EEF}' . +'\x{9EF0}\x{9EF2}\x{9EF3}\x{9EF4}\x{9EF5}\x{9EF6}\x{9EF7}\x{9EF8}\x{9EF9}' . +'\x{9EFA}\x{9EFB}\x{9EFC}\x{9EFD}\x{9EFE}\x{9EFF}\x{9F00}\x{9F01}\x{9F02}' . +'\x{9F04}\x{9F05}\x{9F06}\x{9F07}\x{9F08}\x{9F09}\x{9F0A}\x{9F0B}\x{9F0C}' . +'\x{9F0D}\x{9F0E}\x{9F0F}\x{9F10}\x{9F12}\x{9F13}\x{9F15}\x{9F16}\x{9F17}' . +'\x{9F18}\x{9F19}\x{9F1A}\x{9F1B}\x{9F1C}\x{9F1D}\x{9F1E}\x{9F1F}\x{9F20}' . +'\x{9F22}\x{9F23}\x{9F24}\x{9F25}\x{9F27}\x{9F28}\x{9F29}\x{9F2A}\x{9F2B}' . +'\x{9F2C}\x{9F2D}\x{9F2E}\x{9F2F}\x{9F30}\x{9F31}\x{9F32}\x{9F33}\x{9F34}' . +'\x{9F35}\x{9F36}\x{9F37}\x{9F38}\x{9F39}\x{9F3A}\x{9F3B}\x{9F3C}\x{9F3D}' . +'\x{9F3E}\x{9F3F}\x{9F40}\x{9F41}\x{9F42}\x{9F43}\x{9F44}\x{9F46}\x{9F47}' . +'\x{9F48}\x{9F49}\x{9F4A}\x{9F4B}\x{9F4C}\x{9F4D}\x{9F4E}\x{9F4F}\x{9F50}' . +'\x{9F51}\x{9F52}\x{9F54}\x{9F55}\x{9F56}\x{9F57}\x{9F58}\x{9F59}\x{9F5A}' . +'\x{9F5B}\x{9F5C}\x{9F5D}\x{9F5E}\x{9F5F}\x{9F60}\x{9F61}\x{9F63}\x{9F64}' . +'\x{9F65}\x{9F66}\x{9F67}\x{9F68}\x{9F69}\x{9F6A}\x{9F6B}\x{9F6C}\x{9F6E}' . +'\x{9F6F}\x{9F70}\x{9F71}\x{9F72}\x{9F73}\x{9F74}\x{9F75}\x{9F76}\x{9F77}' . +'\x{9F78}\x{9F79}\x{9F7A}\x{9F7B}\x{9F7C}\x{9F7D}\x{9F7E}\x{9F7F}\x{9F80}' . +'\x{9F81}\x{9F82}\x{9F83}\x{9F84}\x{9F85}\x{9F86}\x{9F87}\x{9F88}\x{9F89}' . +'\x{9F8A}\x{9F8B}\x{9F8C}\x{9F8D}\x{9F8E}\x{9F8F}\x{9F90}\x{9F91}\x{9F92}' . +'\x{9F93}\x{9F94}\x{9F95}\x{9F96}\x{9F97}\x{9F98}\x{9F99}\x{9F9A}\x{9F9B}' . +'\x{9F9C}\x{9F9D}\x{9F9E}\x{9F9F}\x{9FA0}\x{9FA2}\x{9FA4}\x{9FA5}]{1,20}$/iu'); diff --git a/lib/zend/Zend/Validate/Hostname/Cn.php b/lib/zend/Zend/Validate/Hostname/Cn.php new file mode 100644 index 0000000000..db87d172c1 --- /dev/null +++ b/lib/zend/Zend/Validate/Hostname/Cn.php @@ -0,0 +1,2199 @@ + '/^[\x{002d}0-9a-z\x{3447}\x{3473}\x{359E}\x{360E}\x{361A}\x{3918}\x{396E}\x{39CF}\x{39D0}' . +'\x{39DF}\x{3A73}\x{3B4E}\x{3C6E}\x{3CE0}\x{4056}\x{415F}\x{4337}\x{43AC}' . +'\x{43B1}\x{43DD}\x{44D6}\x{464C}\x{4661}\x{4723}\x{4729}\x{477C}\x{478D}' . +'\x{4947}\x{497A}\x{497D}\x{4982}\x{4983}\x{4985}\x{4986}\x{499B}\x{499F}' . +'\x{49B6}\x{49B7}\x{4C77}\x{4C9F}\x{4CA0}\x{4CA1}\x{4CA2}\x{4CA3}\x{4D13}' . +'\x{4D14}\x{4D15}\x{4D16}\x{4D17}\x{4D18}\x{4D19}\x{4DAE}\x{4E00}\x{4E01}' . +'\x{4E02}\x{4E03}\x{4E04}\x{4E05}\x{4E06}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' . +'\x{4E0B}\x{4E0C}\x{4E0D}\x{4E0E}\x{4E0F}\x{4E10}\x{4E11}\x{4E13}\x{4E14}' . +'\x{4E15}\x{4E16}\x{4E17}\x{4E18}\x{4E19}\x{4E1A}\x{4E1B}\x{4E1C}\x{4E1D}' . +'\x{4E1E}\x{4E1F}\x{4E20}\x{4E21}\x{4E22}\x{4E23}\x{4E24}\x{4E25}\x{4E26}' . +'\x{4E27}\x{4E28}\x{4E2A}\x{4E2B}\x{4E2C}\x{4E2D}\x{4E2E}\x{4E2F}\x{4E30}' . +'\x{4E31}\x{4E32}\x{4E33}\x{4E34}\x{4E35}\x{4E36}\x{4E37}\x{4E38}\x{4E39}' . +'\x{4E3A}\x{4E3B}\x{4E3C}\x{4E3D}\x{4E3E}\x{4E3F}\x{4E40}\x{4E41}\x{4E42}' . +'\x{4E43}\x{4E44}\x{4E45}\x{4E46}\x{4E47}\x{4E48}\x{4E49}\x{4E4A}\x{4E4B}' . +'\x{4E4C}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E50}\x{4E51}\x{4E52}\x{4E53}\x{4E54}' . +'\x{4E56}\x{4E57}\x{4E58}\x{4E59}\x{4E5A}\x{4E5B}\x{4E5C}\x{4E5D}\x{4E5E}' . +'\x{4E5F}\x{4E60}\x{4E61}\x{4E62}\x{4E63}\x{4E64}\x{4E65}\x{4E66}\x{4E67}' . +'\x{4E69}\x{4E6A}\x{4E6B}\x{4E6C}\x{4E6D}\x{4E6E}\x{4E6F}\x{4E70}\x{4E71}' . +'\x{4E72}\x{4E73}\x{4E74}\x{4E75}\x{4E76}\x{4E77}\x{4E78}\x{4E7A}\x{4E7B}' . +'\x{4E7C}\x{4E7D}\x{4E7E}\x{4E7F}\x{4E80}\x{4E81}\x{4E82}\x{4E83}\x{4E84}' . +'\x{4E85}\x{4E86}\x{4E87}\x{4E88}\x{4E89}\x{4E8B}\x{4E8C}\x{4E8D}\x{4E8E}' . +'\x{4E8F}\x{4E90}\x{4E91}\x{4E92}\x{4E93}\x{4E94}\x{4E95}\x{4E97}\x{4E98}' . +'\x{4E99}\x{4E9A}\x{4E9B}\x{4E9C}\x{4E9D}\x{4E9E}\x{4E9F}\x{4EA0}\x{4EA1}' . +'\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA7}\x{4EA8}\x{4EA9}\x{4EAA}\x{4EAB}' . +'\x{4EAC}\x{4EAD}\x{4EAE}\x{4EAF}\x{4EB0}\x{4EB1}\x{4EB2}\x{4EB3}\x{4EB4}' . +'\x{4EB5}\x{4EB6}\x{4EB7}\x{4EB8}\x{4EB9}\x{4EBA}\x{4EBB}\x{4EBD}\x{4EBE}' . +'\x{4EBF}\x{4EC0}\x{4EC1}\x{4EC2}\x{4EC3}\x{4EC4}\x{4EC5}\x{4EC6}\x{4EC7}' . +'\x{4EC8}\x{4EC9}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED0}\x{4ED1}' . +'\x{4ED2}\x{4ED3}\x{4ED4}\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDA}' . +'\x{4EDB}\x{4EDC}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE0}\x{4EE1}\x{4EE2}\x{4EE3}' . +'\x{4EE4}\x{4EE5}\x{4EE6}\x{4EE8}\x{4EE9}\x{4EEA}\x{4EEB}\x{4EEC}\x{4EEF}' . +'\x{4EF0}\x{4EF1}\x{4EF2}\x{4EF3}\x{4EF4}\x{4EF5}\x{4EF6}\x{4EF7}\x{4EFB}' . +'\x{4EFD}\x{4EFF}\x{4F00}\x{4F01}\x{4F02}\x{4F03}\x{4F04}\x{4F05}\x{4F06}' . +'\x{4F08}\x{4F09}\x{4F0A}\x{4F0B}\x{4F0C}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}' . +'\x{4F11}\x{4F12}\x{4F13}\x{4F14}\x{4F15}\x{4F17}\x{4F18}\x{4F19}\x{4F1A}' . +'\x{4F1B}\x{4F1C}\x{4F1D}\x{4F1E}\x{4F1F}\x{4F20}\x{4F21}\x{4F22}\x{4F23}' . +'\x{4F24}\x{4F25}\x{4F26}\x{4F27}\x{4F29}\x{4F2A}\x{4F2B}\x{4F2C}\x{4F2D}' . +'\x{4F2E}\x{4F2F}\x{4F30}\x{4F32}\x{4F33}\x{4F34}\x{4F36}\x{4F38}\x{4F39}' . +'\x{4F3A}\x{4F3B}\x{4F3C}\x{4F3D}\x{4F3E}\x{4F3F}\x{4F41}\x{4F42}\x{4F43}' . +'\x{4F45}\x{4F46}\x{4F47}\x{4F48}\x{4F49}\x{4F4A}\x{4F4B}\x{4F4C}\x{4F4D}' . +'\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}\x{4F52}\x{4F53}\x{4F54}\x{4F55}\x{4F56}' . +'\x{4F57}\x{4F58}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}\x{4F5F}' . +'\x{4F60}\x{4F61}\x{4F62}\x{4F63}\x{4F64}\x{4F65}\x{4F66}\x{4F67}\x{4F68}' . +'\x{4F69}\x{4F6A}\x{4F6B}\x{4F6C}\x{4F6D}\x{4F6E}\x{4F6F}\x{4F70}\x{4F72}' . +'\x{4F73}\x{4F74}\x{4F75}\x{4F76}\x{4F77}\x{4F78}\x{4F79}\x{4F7A}\x{4F7B}' . +'\x{4F7C}\x{4F7D}\x{4F7E}\x{4F7F}\x{4F80}\x{4F81}\x{4F82}\x{4F83}\x{4F84}' . +'\x{4F85}\x{4F86}\x{4F87}\x{4F88}\x{4F89}\x{4F8A}\x{4F8B}\x{4F8D}\x{4F8F}' . +'\x{4F90}\x{4F91}\x{4F92}\x{4F93}\x{4F94}\x{4F95}\x{4F96}\x{4F97}\x{4F98}' . +'\x{4F99}\x{4F9A}\x{4F9B}\x{4F9C}\x{4F9D}\x{4F9E}\x{4F9F}\x{4FA0}\x{4FA1}' . +'\x{4FA3}\x{4FA4}\x{4FA5}\x{4FA6}\x{4FA7}\x{4FA8}\x{4FA9}\x{4FAA}\x{4FAB}' . +'\x{4FAC}\x{4FAE}\x{4FAF}\x{4FB0}\x{4FB1}\x{4FB2}\x{4FB3}\x{4FB4}\x{4FB5}' . +'\x{4FB6}\x{4FB7}\x{4FB8}\x{4FB9}\x{4FBA}\x{4FBB}\x{4FBC}\x{4FBE}\x{4FBF}' . +'\x{4FC0}\x{4FC1}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FC5}\x{4FC7}\x{4FC9}\x{4FCA}' . +'\x{4FCB}\x{4FCD}\x{4FCE}\x{4FCF}\x{4FD0}\x{4FD1}\x{4FD2}\x{4FD3}\x{4FD4}' . +'\x{4FD5}\x{4FD6}\x{4FD7}\x{4FD8}\x{4FD9}\x{4FDA}\x{4FDB}\x{4FDC}\x{4FDD}' . +'\x{4FDE}\x{4FDF}\x{4FE0}\x{4FE1}\x{4FE3}\x{4FE4}\x{4FE5}\x{4FE6}\x{4FE7}' . +'\x{4FE8}\x{4FE9}\x{4FEA}\x{4FEB}\x{4FEC}\x{4FED}\x{4FEE}\x{4FEF}\x{4FF0}' . +'\x{4FF1}\x{4FF2}\x{4FF3}\x{4FF4}\x{4FF5}\x{4FF6}\x{4FF7}\x{4FF8}\x{4FF9}' . +'\x{4FFA}\x{4FFB}\x{4FFE}\x{4FFF}\x{5000}\x{5001}\x{5002}\x{5003}\x{5004}' . +'\x{5005}\x{5006}\x{5007}\x{5008}\x{5009}\x{500A}\x{500B}\x{500C}\x{500D}' . +'\x{500E}\x{500F}\x{5011}\x{5012}\x{5013}\x{5014}\x{5015}\x{5016}\x{5017}' . +'\x{5018}\x{5019}\x{501A}\x{501B}\x{501C}\x{501D}\x{501E}\x{501F}\x{5020}' . +'\x{5021}\x{5022}\x{5023}\x{5024}\x{5025}\x{5026}\x{5027}\x{5028}\x{5029}' . +'\x{502A}\x{502B}\x{502C}\x{502D}\x{502E}\x{502F}\x{5030}\x{5031}\x{5032}' . +'\x{5033}\x{5035}\x{5036}\x{5037}\x{5039}\x{503A}\x{503B}\x{503C}\x{503E}' . +'\x{503F}\x{5040}\x{5041}\x{5043}\x{5044}\x{5045}\x{5046}\x{5047}\x{5048}' . +'\x{5049}\x{504A}\x{504B}\x{504C}\x{504D}\x{504E}\x{504F}\x{5051}\x{5053}' . +'\x{5054}\x{5055}\x{5056}\x{5057}\x{5059}\x{505A}\x{505B}\x{505C}\x{505D}' . +'\x{505E}\x{505F}\x{5060}\x{5061}\x{5062}\x{5063}\x{5064}\x{5065}\x{5066}' . +'\x{5067}\x{5068}\x{5069}\x{506A}\x{506B}\x{506C}\x{506D}\x{506E}\x{506F}' . +'\x{5070}\x{5071}\x{5072}\x{5073}\x{5074}\x{5075}\x{5076}\x{5077}\x{5078}' . +'\x{5079}\x{507A}\x{507B}\x{507D}\x{507E}\x{507F}\x{5080}\x{5082}\x{5083}' . +'\x{5084}\x{5085}\x{5086}\x{5087}\x{5088}\x{5089}\x{508A}\x{508B}\x{508C}' . +'\x{508D}\x{508E}\x{508F}\x{5090}\x{5091}\x{5092}\x{5094}\x{5095}\x{5096}' . +'\x{5098}\x{5099}\x{509A}\x{509B}\x{509C}\x{509D}\x{509E}\x{50A2}\x{50A3}' . +'\x{50A4}\x{50A5}\x{50A6}\x{50A7}\x{50A8}\x{50A9}\x{50AA}\x{50AB}\x{50AC}' . +'\x{50AD}\x{50AE}\x{50AF}\x{50B0}\x{50B1}\x{50B2}\x{50B3}\x{50B4}\x{50B5}' . +'\x{50B6}\x{50B7}\x{50B8}\x{50BA}\x{50BB}\x{50BC}\x{50BD}\x{50BE}\x{50BF}' . +'\x{50C0}\x{50C1}\x{50C2}\x{50C4}\x{50C5}\x{50C6}\x{50C7}\x{50C8}\x{50C9}' . +'\x{50CA}\x{50CB}\x{50CC}\x{50CD}\x{50CE}\x{50CF}\x{50D0}\x{50D1}\x{50D2}' . +'\x{50D3}\x{50D4}\x{50D5}\x{50D6}\x{50D7}\x{50D9}\x{50DA}\x{50DB}\x{50DC}' . +'\x{50DD}\x{50DE}\x{50E0}\x{50E3}\x{50E4}\x{50E5}\x{50E6}\x{50E7}\x{50E8}' . +'\x{50E9}\x{50EA}\x{50EC}\x{50ED}\x{50EE}\x{50EF}\x{50F0}\x{50F1}\x{50F2}' . +'\x{50F3}\x{50F5}\x{50F6}\x{50F8}\x{50F9}\x{50FA}\x{50FB}\x{50FC}\x{50FD}' . +'\x{50FE}\x{50FF}\x{5100}\x{5101}\x{5102}\x{5103}\x{5104}\x{5105}\x{5106}' . +'\x{5107}\x{5108}\x{5109}\x{510A}\x{510B}\x{510C}\x{510D}\x{510E}\x{510F}' . +'\x{5110}\x{5111}\x{5112}\x{5113}\x{5114}\x{5115}\x{5116}\x{5117}\x{5118}' . +'\x{5119}\x{511A}\x{511C}\x{511D}\x{511E}\x{511F}\x{5120}\x{5121}\x{5122}' . +'\x{5123}\x{5124}\x{5125}\x{5126}\x{5127}\x{5129}\x{512A}\x{512C}\x{512D}' . +'\x{512E}\x{512F}\x{5130}\x{5131}\x{5132}\x{5133}\x{5134}\x{5135}\x{5136}' . +'\x{5137}\x{5138}\x{5139}\x{513A}\x{513B}\x{513C}\x{513D}\x{513E}\x{513F}' . +'\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' . +'\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5151}\x{5152}\x{5154}\x{5155}' . +'\x{5156}\x{5157}\x{5159}\x{515A}\x{515B}\x{515C}\x{515D}\x{515E}\x{515F}' . +'\x{5161}\x{5162}\x{5163}\x{5165}\x{5166}\x{5167}\x{5168}\x{5169}\x{516A}' . +'\x{516B}\x{516C}\x{516D}\x{516E}\x{516F}\x{5170}\x{5171}\x{5173}\x{5174}' . +'\x{5175}\x{5176}\x{5177}\x{5178}\x{5179}\x{517A}\x{517B}\x{517C}\x{517D}' . +'\x{517F}\x{5180}\x{5181}\x{5182}\x{5185}\x{5186}\x{5187}\x{5188}\x{5189}' . +'\x{518A}\x{518B}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}\x{5193}' . +'\x{5194}\x{5195}\x{5196}\x{5197}\x{5198}\x{5199}\x{519A}\x{519B}\x{519C}' . +'\x{519D}\x{519E}\x{519F}\x{51A0}\x{51A2}\x{51A4}\x{51A5}\x{51A6}\x{51A7}' . +'\x{51A8}\x{51AA}\x{51AB}\x{51AC}\x{51AE}\x{51AF}\x{51B0}\x{51B1}\x{51B2}' . +'\x{51B3}\x{51B5}\x{51B6}\x{51B7}\x{51B9}\x{51BB}\x{51BC}\x{51BD}\x{51BE}' . +'\x{51BF}\x{51C0}\x{51C1}\x{51C3}\x{51C4}\x{51C5}\x{51C6}\x{51C7}\x{51C8}' . +'\x{51C9}\x{51CA}\x{51CB}\x{51CC}\x{51CD}\x{51CE}\x{51CF}\x{51D0}\x{51D1}' . +'\x{51D4}\x{51D5}\x{51D6}\x{51D7}\x{51D8}\x{51D9}\x{51DA}\x{51DB}\x{51DC}' . +'\x{51DD}\x{51DE}\x{51E0}\x{51E1}\x{51E2}\x{51E3}\x{51E4}\x{51E5}\x{51E7}' . +'\x{51E8}\x{51E9}\x{51EA}\x{51EB}\x{51ED}\x{51EF}\x{51F0}\x{51F1}\x{51F3}' . +'\x{51F4}\x{51F5}\x{51F6}\x{51F7}\x{51F8}\x{51F9}\x{51FA}\x{51FB}\x{51FC}' . +'\x{51FD}\x{51FE}\x{51FF}\x{5200}\x{5201}\x{5202}\x{5203}\x{5204}\x{5205}' . +'\x{5206}\x{5207}\x{5208}\x{5209}\x{520A}\x{520B}\x{520C}\x{520D}\x{520E}' . +'\x{520F}\x{5210}\x{5211}\x{5212}\x{5213}\x{5214}\x{5215}\x{5216}\x{5217}' . +'\x{5218}\x{5219}\x{521A}\x{521B}\x{521C}\x{521D}\x{521E}\x{521F}\x{5220}' . +'\x{5221}\x{5222}\x{5223}\x{5224}\x{5225}\x{5226}\x{5228}\x{5229}\x{522A}' . +'\x{522B}\x{522C}\x{522D}\x{522E}\x{522F}\x{5230}\x{5231}\x{5232}\x{5233}' . +'\x{5234}\x{5235}\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{523C}' . +'\x{523D}\x{523E}\x{523F}\x{5240}\x{5241}\x{5242}\x{5243}\x{5244}\x{5245}' . +'\x{5246}\x{5247}\x{5248}\x{5249}\x{524A}\x{524B}\x{524C}\x{524D}\x{524E}' . +'\x{5250}\x{5251}\x{5252}\x{5254}\x{5255}\x{5256}\x{5257}\x{5258}\x{5259}' . +'\x{525A}\x{525B}\x{525C}\x{525D}\x{525E}\x{525F}\x{5260}\x{5261}\x{5262}' . +'\x{5263}\x{5264}\x{5265}\x{5267}\x{5268}\x{5269}\x{526A}\x{526B}\x{526C}' . +'\x{526D}\x{526E}\x{526F}\x{5270}\x{5272}\x{5273}\x{5274}\x{5275}\x{5276}' . +'\x{5277}\x{5278}\x{527A}\x{527B}\x{527C}\x{527D}\x{527E}\x{527F}\x{5280}' . +'\x{5281}\x{5282}\x{5283}\x{5284}\x{5286}\x{5287}\x{5288}\x{5289}\x{528A}' . +'\x{528B}\x{528C}\x{528D}\x{528F}\x{5290}\x{5291}\x{5292}\x{5293}\x{5294}' . +'\x{5295}\x{5296}\x{5297}\x{5298}\x{5299}\x{529A}\x{529B}\x{529C}\x{529D}' . +'\x{529E}\x{529F}\x{52A0}\x{52A1}\x{52A2}\x{52A3}\x{52A5}\x{52A6}\x{52A7}' . +'\x{52A8}\x{52A9}\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52AE}\x{52AF}\x{52B0}' . +'\x{52B1}\x{52B2}\x{52B3}\x{52B4}\x{52B5}\x{52B6}\x{52B7}\x{52B8}\x{52B9}' . +'\x{52BA}\x{52BB}\x{52BC}\x{52BD}\x{52BE}\x{52BF}\x{52C0}\x{52C1}\x{52C2}' . +'\x{52C3}\x{52C6}\x{52C7}\x{52C9}\x{52CA}\x{52CB}\x{52CD}\x{52CF}\x{52D0}' . +'\x{52D2}\x{52D3}\x{52D5}\x{52D6}\x{52D7}\x{52D8}\x{52D9}\x{52DA}\x{52DB}' . +'\x{52DC}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}\x{52E4}\x{52E6}' . +'\x{52E7}\x{52E8}\x{52E9}\x{52EA}\x{52EB}\x{52EC}\x{52ED}\x{52EF}\x{52F0}' . +'\x{52F1}\x{52F2}\x{52F3}\x{52F4}\x{52F5}\x{52F6}\x{52F7}\x{52F8}\x{52F9}' . +'\x{52FA}\x{52FB}\x{52FC}\x{52FD}\x{52FE}\x{52FF}\x{5300}\x{5301}\x{5302}' . +'\x{5305}\x{5306}\x{5307}\x{5308}\x{5309}\x{530A}\x{530B}\x{530C}\x{530D}' . +'\x{530E}\x{530F}\x{5310}\x{5311}\x{5312}\x{5313}\x{5314}\x{5315}\x{5316}' . +'\x{5317}\x{5319}\x{531A}\x{531C}\x{531D}\x{531F}\x{5320}\x{5321}\x{5322}' . +'\x{5323}\x{5324}\x{5325}\x{5326}\x{5328}\x{532A}\x{532B}\x{532C}\x{532D}' . +'\x{532E}\x{532F}\x{5330}\x{5331}\x{5333}\x{5334}\x{5337}\x{5339}\x{533A}' . +'\x{533B}\x{533C}\x{533D}\x{533E}\x{533F}\x{5340}\x{5341}\x{5343}\x{5344}' . +'\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}\x{534A}\x{534B}\x{534C}\x{534D}' . +'\x{534E}\x{534F}\x{5350}\x{5351}\x{5352}\x{5353}\x{5354}\x{5355}\x{5356}' . +'\x{5357}\x{5358}\x{5359}\x{535A}\x{535C}\x{535E}\x{535F}\x{5360}\x{5361}' . +'\x{5362}\x{5363}\x{5364}\x{5365}\x{5366}\x{5367}\x{5369}\x{536B}\x{536C}' . +'\x{536E}\x{536F}\x{5370}\x{5371}\x{5372}\x{5373}\x{5374}\x{5375}\x{5376}' . +'\x{5377}\x{5378}\x{5379}\x{537A}\x{537B}\x{537C}\x{537D}\x{537E}\x{537F}' . +'\x{5381}\x{5382}\x{5383}\x{5384}\x{5385}\x{5386}\x{5387}\x{5388}\x{5389}' . +'\x{538A}\x{538B}\x{538C}\x{538D}\x{538E}\x{538F}\x{5390}\x{5391}\x{5392}' . +'\x{5393}\x{5394}\x{5395}\x{5396}\x{5397}\x{5398}\x{5399}\x{539A}\x{539B}' . +'\x{539C}\x{539D}\x{539E}\x{539F}\x{53A0}\x{53A2}\x{53A3}\x{53A4}\x{53A5}' . +'\x{53A6}\x{53A7}\x{53A8}\x{53A9}\x{53AC}\x{53AD}\x{53AE}\x{53B0}\x{53B1}' . +'\x{53B2}\x{53B3}\x{53B4}\x{53B5}\x{53B6}\x{53B7}\x{53B8}\x{53B9}\x{53BB}' . +'\x{53BC}\x{53BD}\x{53BE}\x{53BF}\x{53C0}\x{53C1}\x{53C2}\x{53C3}\x{53C4}' . +'\x{53C6}\x{53C7}\x{53C8}\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}' . +'\x{53D0}\x{53D1}\x{53D2}\x{53D3}\x{53D4}\x{53D5}\x{53D6}\x{53D7}\x{53D8}' . +'\x{53D9}\x{53DB}\x{53DC}\x{53DF}\x{53E0}\x{53E1}\x{53E2}\x{53E3}\x{53E4}' . +'\x{53E5}\x{53E6}\x{53E8}\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}' . +'\x{53EF}\x{53F0}\x{53F1}\x{53F2}\x{53F3}\x{53F4}\x{53F5}\x{53F6}\x{53F7}' . +'\x{53F8}\x{53F9}\x{53FA}\x{53FB}\x{53FC}\x{53FD}\x{53FE}\x{5401}\x{5402}' . +'\x{5403}\x{5404}\x{5405}\x{5406}\x{5407}\x{5408}\x{5409}\x{540A}\x{540B}' . +'\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}\x{5411}\x{5412}\x{5413}\x{5414}' . +'\x{5415}\x{5416}\x{5417}\x{5418}\x{5419}\x{541B}\x{541C}\x{541D}\x{541E}' . +'\x{541F}\x{5420}\x{5421}\x{5423}\x{5424}\x{5425}\x{5426}\x{5427}\x{5428}' . +'\x{5429}\x{542A}\x{542B}\x{542C}\x{542D}\x{542E}\x{542F}\x{5430}\x{5431}' . +'\x{5432}\x{5433}\x{5434}\x{5435}\x{5436}\x{5437}\x{5438}\x{5439}\x{543A}' . +'\x{543B}\x{543C}\x{543D}\x{543E}\x{543F}\x{5440}\x{5441}\x{5442}\x{5443}' . +'\x{5444}\x{5445}\x{5446}\x{5447}\x{5448}\x{5449}\x{544A}\x{544B}\x{544D}' . +'\x{544E}\x{544F}\x{5450}\x{5451}\x{5452}\x{5453}\x{5454}\x{5455}\x{5456}' . +'\x{5457}\x{5458}\x{5459}\x{545A}\x{545B}\x{545C}\x{545E}\x{545F}\x{5460}' . +'\x{5461}\x{5462}\x{5463}\x{5464}\x{5465}\x{5466}\x{5467}\x{5468}\x{546A}' . +'\x{546B}\x{546C}\x{546D}\x{546E}\x{546F}\x{5470}\x{5471}\x{5472}\x{5473}' . +'\x{5474}\x{5475}\x{5476}\x{5477}\x{5478}\x{5479}\x{547A}\x{547B}\x{547C}' . +'\x{547D}\x{547E}\x{547F}\x{5480}\x{5481}\x{5482}\x{5483}\x{5484}\x{5485}' . +'\x{5486}\x{5487}\x{5488}\x{5489}\x{548B}\x{548C}\x{548D}\x{548E}\x{548F}' . +'\x{5490}\x{5491}\x{5492}\x{5493}\x{5494}\x{5495}\x{5496}\x{5497}\x{5498}' . +'\x{5499}\x{549A}\x{549B}\x{549C}\x{549D}\x{549E}\x{549F}\x{54A0}\x{54A1}' . +'\x{54A2}\x{54A3}\x{54A4}\x{54A5}\x{54A6}\x{54A7}\x{54A8}\x{54A9}\x{54AA}' . +'\x{54AB}\x{54AC}\x{54AD}\x{54AE}\x{54AF}\x{54B0}\x{54B1}\x{54B2}\x{54B3}' . +'\x{54B4}\x{54B6}\x{54B7}\x{54B8}\x{54B9}\x{54BA}\x{54BB}\x{54BC}\x{54BD}' . +'\x{54BE}\x{54BF}\x{54C0}\x{54C1}\x{54C2}\x{54C3}\x{54C4}\x{54C5}\x{54C6}' . +'\x{54C7}\x{54C8}\x{54C9}\x{54CA}\x{54CB}\x{54CC}\x{54CD}\x{54CE}\x{54CF}' . +'\x{54D0}\x{54D1}\x{54D2}\x{54D3}\x{54D4}\x{54D5}\x{54D6}\x{54D7}\x{54D8}' . +'\x{54D9}\x{54DA}\x{54DB}\x{54DC}\x{54DD}\x{54DE}\x{54DF}\x{54E0}\x{54E1}' . +'\x{54E2}\x{54E3}\x{54E4}\x{54E5}\x{54E6}\x{54E7}\x{54E8}\x{54E9}\x{54EA}' . +'\x{54EB}\x{54EC}\x{54ED}\x{54EE}\x{54EF}\x{54F0}\x{54F1}\x{54F2}\x{54F3}' . +'\x{54F4}\x{54F5}\x{54F7}\x{54F8}\x{54F9}\x{54FA}\x{54FB}\x{54FC}\x{54FD}' . +'\x{54FE}\x{54FF}\x{5500}\x{5501}\x{5502}\x{5503}\x{5504}\x{5505}\x{5506}' . +'\x{5507}\x{5508}\x{5509}\x{550A}\x{550B}\x{550C}\x{550D}\x{550E}\x{550F}' . +'\x{5510}\x{5511}\x{5512}\x{5513}\x{5514}\x{5516}\x{5517}\x{551A}\x{551B}' . +'\x{551C}\x{551D}\x{551E}\x{551F}\x{5520}\x{5521}\x{5522}\x{5523}\x{5524}' . +'\x{5525}\x{5526}\x{5527}\x{5528}\x{5529}\x{552A}\x{552B}\x{552C}\x{552D}' . +'\x{552E}\x{552F}\x{5530}\x{5531}\x{5532}\x{5533}\x{5534}\x{5535}\x{5536}' . +'\x{5537}\x{5538}\x{5539}\x{553A}\x{553B}\x{553C}\x{553D}\x{553E}\x{553F}' . +'\x{5540}\x{5541}\x{5542}\x{5543}\x{5544}\x{5545}\x{5546}\x{5548}\x{5549}' . +'\x{554A}\x{554B}\x{554C}\x{554D}\x{554E}\x{554F}\x{5550}\x{5551}\x{5552}' . +'\x{5553}\x{5554}\x{5555}\x{5556}\x{5557}\x{5558}\x{5559}\x{555A}\x{555B}' . +'\x{555C}\x{555D}\x{555E}\x{555F}\x{5561}\x{5562}\x{5563}\x{5564}\x{5565}' . +'\x{5566}\x{5567}\x{5568}\x{5569}\x{556A}\x{556B}\x{556C}\x{556D}\x{556E}' . +'\x{556F}\x{5570}\x{5571}\x{5572}\x{5573}\x{5574}\x{5575}\x{5576}\x{5577}' . +'\x{5578}\x{5579}\x{557B}\x{557C}\x{557D}\x{557E}\x{557F}\x{5580}\x{5581}' . +'\x{5582}\x{5583}\x{5584}\x{5585}\x{5586}\x{5587}\x{5588}\x{5589}\x{558A}' . +'\x{558B}\x{558C}\x{558D}\x{558E}\x{558F}\x{5590}\x{5591}\x{5592}\x{5593}' . +'\x{5594}\x{5595}\x{5596}\x{5597}\x{5598}\x{5599}\x{559A}\x{559B}\x{559C}' . +'\x{559D}\x{559E}\x{559F}\x{55A0}\x{55A1}\x{55A2}\x{55A3}\x{55A4}\x{55A5}' . +'\x{55A6}\x{55A7}\x{55A8}\x{55A9}\x{55AA}\x{55AB}\x{55AC}\x{55AD}\x{55AE}' . +'\x{55AF}\x{55B0}\x{55B1}\x{55B2}\x{55B3}\x{55B4}\x{55B5}\x{55B6}\x{55B7}' . +'\x{55B8}\x{55B9}\x{55BA}\x{55BB}\x{55BC}\x{55BD}\x{55BE}\x{55BF}\x{55C0}' . +'\x{55C1}\x{55C2}\x{55C3}\x{55C4}\x{55C5}\x{55C6}\x{55C7}\x{55C8}\x{55C9}' . +'\x{55CA}\x{55CB}\x{55CC}\x{55CD}\x{55CE}\x{55CF}\x{55D0}\x{55D1}\x{55D2}' . +'\x{55D3}\x{55D4}\x{55D5}\x{55D6}\x{55D7}\x{55D8}\x{55D9}\x{55DA}\x{55DB}' . +'\x{55DC}\x{55DD}\x{55DE}\x{55DF}\x{55E1}\x{55E2}\x{55E3}\x{55E4}\x{55E5}' . +'\x{55E6}\x{55E7}\x{55E8}\x{55E9}\x{55EA}\x{55EB}\x{55EC}\x{55ED}\x{55EE}' . +'\x{55EF}\x{55F0}\x{55F1}\x{55F2}\x{55F3}\x{55F4}\x{55F5}\x{55F6}\x{55F7}' . +'\x{55F9}\x{55FA}\x{55FB}\x{55FC}\x{55FD}\x{55FE}\x{55FF}\x{5600}\x{5601}' . +'\x{5602}\x{5603}\x{5604}\x{5606}\x{5607}\x{5608}\x{5609}\x{560C}\x{560D}' . +'\x{560E}\x{560F}\x{5610}\x{5611}\x{5612}\x{5613}\x{5614}\x{5615}\x{5616}' . +'\x{5617}\x{5618}\x{5619}\x{561A}\x{561B}\x{561C}\x{561D}\x{561E}\x{561F}' . +'\x{5621}\x{5622}\x{5623}\x{5624}\x{5625}\x{5626}\x{5627}\x{5628}\x{5629}' . +'\x{562A}\x{562C}\x{562D}\x{562E}\x{562F}\x{5630}\x{5631}\x{5632}\x{5633}' . +'\x{5634}\x{5635}\x{5636}\x{5638}\x{5639}\x{563A}\x{563B}\x{563D}\x{563E}' . +'\x{563F}\x{5640}\x{5641}\x{5642}\x{5643}\x{5645}\x{5646}\x{5647}\x{5648}' . +'\x{5649}\x{564A}\x{564C}\x{564D}\x{564E}\x{564F}\x{5650}\x{5652}\x{5653}' . +'\x{5654}\x{5655}\x{5657}\x{5658}\x{5659}\x{565A}\x{565B}\x{565C}\x{565D}' . +'\x{565E}\x{5660}\x{5662}\x{5663}\x{5664}\x{5665}\x{5666}\x{5667}\x{5668}' . +'\x{5669}\x{566A}\x{566B}\x{566C}\x{566D}\x{566E}\x{566F}\x{5670}\x{5671}' . +'\x{5672}\x{5673}\x{5674}\x{5676}\x{5677}\x{5678}\x{5679}\x{567A}\x{567B}' . +'\x{567C}\x{567E}\x{567F}\x{5680}\x{5681}\x{5682}\x{5683}\x{5684}\x{5685}' . +'\x{5686}\x{5687}\x{568A}\x{568C}\x{568D}\x{568E}\x{568F}\x{5690}\x{5691}' . +'\x{5692}\x{5693}\x{5694}\x{5695}\x{5697}\x{5698}\x{5699}\x{569A}\x{569B}' . +'\x{569C}\x{569D}\x{569F}\x{56A0}\x{56A1}\x{56A3}\x{56A4}\x{56A5}\x{56A6}' . +'\x{56A7}\x{56A8}\x{56A9}\x{56AA}\x{56AB}\x{56AC}\x{56AD}\x{56AE}\x{56AF}' . +'\x{56B0}\x{56B1}\x{56B2}\x{56B3}\x{56B4}\x{56B5}\x{56B6}\x{56B7}\x{56B8}' . +'\x{56B9}\x{56BB}\x{56BC}\x{56BD}\x{56BE}\x{56BF}\x{56C0}\x{56C1}\x{56C2}' . +'\x{56C3}\x{56C4}\x{56C5}\x{56C6}\x{56C7}\x{56C8}\x{56C9}\x{56CA}\x{56CB}' . +'\x{56CC}\x{56CD}\x{56CE}\x{56D0}\x{56D1}\x{56D2}\x{56D3}\x{56D4}\x{56D5}' . +'\x{56D6}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DC}\x{56DD}\x{56DE}\x{56DF}' . +'\x{56E0}\x{56E1}\x{56E2}\x{56E3}\x{56E4}\x{56E5}\x{56E7}\x{56E8}\x{56E9}' . +'\x{56EA}\x{56EB}\x{56EC}\x{56ED}\x{56EE}\x{56EF}\x{56F0}\x{56F1}\x{56F2}' . +'\x{56F3}\x{56F4}\x{56F5}\x{56F7}\x{56F9}\x{56FA}\x{56FD}\x{56FE}\x{56FF}' . +'\x{5700}\x{5701}\x{5702}\x{5703}\x{5704}\x{5706}\x{5707}\x{5708}\x{5709}' . +'\x{570A}\x{570B}\x{570C}\x{570D}\x{570E}\x{570F}\x{5710}\x{5712}\x{5713}' . +'\x{5714}\x{5715}\x{5716}\x{5718}\x{5719}\x{571A}\x{571B}\x{571C}\x{571D}' . +'\x{571E}\x{571F}\x{5720}\x{5722}\x{5723}\x{5725}\x{5726}\x{5727}\x{5728}' . +'\x{5729}\x{572A}\x{572B}\x{572C}\x{572D}\x{572E}\x{572F}\x{5730}\x{5731}' . +'\x{5732}\x{5733}\x{5734}\x{5735}\x{5736}\x{5737}\x{5738}\x{5739}\x{573A}' . +'\x{573B}\x{573C}\x{573E}\x{573F}\x{5740}\x{5741}\x{5742}\x{5744}\x{5745}' . +'\x{5746}\x{5747}\x{5749}\x{574A}\x{574B}\x{574C}\x{574D}\x{574E}\x{574F}' . +'\x{5750}\x{5751}\x{5752}\x{5753}\x{5754}\x{5757}\x{5759}\x{575A}\x{575B}' . +'\x{575C}\x{575D}\x{575E}\x{575F}\x{5760}\x{5761}\x{5762}\x{5764}\x{5765}' . +'\x{5766}\x{5767}\x{5768}\x{5769}\x{576A}\x{576B}\x{576C}\x{576D}\x{576F}' . +'\x{5770}\x{5771}\x{5772}\x{5773}\x{5774}\x{5775}\x{5776}\x{5777}\x{5779}' . +'\x{577A}\x{577B}\x{577C}\x{577D}\x{577E}\x{577F}\x{5780}\x{5782}\x{5783}' . +'\x{5784}\x{5785}\x{5786}\x{5788}\x{5789}\x{578A}\x{578B}\x{578C}\x{578D}' . +'\x{578E}\x{578F}\x{5790}\x{5791}\x{5792}\x{5793}\x{5794}\x{5795}\x{5797}' . +'\x{5798}\x{5799}\x{579A}\x{579B}\x{579C}\x{579D}\x{579E}\x{579F}\x{57A0}' . +'\x{57A1}\x{57A2}\x{57A3}\x{57A4}\x{57A5}\x{57A6}\x{57A7}\x{57A9}\x{57AA}' . +'\x{57AB}\x{57AC}\x{57AD}\x{57AE}\x{57AF}\x{57B0}\x{57B1}\x{57B2}\x{57B3}' . +'\x{57B4}\x{57B5}\x{57B6}\x{57B7}\x{57B8}\x{57B9}\x{57BA}\x{57BB}\x{57BC}' . +'\x{57BD}\x{57BE}\x{57BF}\x{57C0}\x{57C1}\x{57C2}\x{57C3}\x{57C4}\x{57C5}' . +'\x{57C6}\x{57C7}\x{57C8}\x{57C9}\x{57CB}\x{57CC}\x{57CD}\x{57CE}\x{57CF}' . +'\x{57D0}\x{57D2}\x{57D3}\x{57D4}\x{57D5}\x{57D6}\x{57D8}\x{57D9}\x{57DA}' . +'\x{57DC}\x{57DD}\x{57DF}\x{57E0}\x{57E1}\x{57E2}\x{57E3}\x{57E4}\x{57E5}' . +'\x{57E6}\x{57E7}\x{57E8}\x{57E9}\x{57EA}\x{57EB}\x{57EC}\x{57ED}\x{57EE}' . +'\x{57EF}\x{57F0}\x{57F1}\x{57F2}\x{57F3}\x{57F4}\x{57F5}\x{57F6}\x{57F7}' . +'\x{57F8}\x{57F9}\x{57FA}\x{57FB}\x{57FC}\x{57FD}\x{57FE}\x{57FF}\x{5800}' . +'\x{5801}\x{5802}\x{5803}\x{5804}\x{5805}\x{5806}\x{5807}\x{5808}\x{5809}' . +'\x{580A}\x{580B}\x{580C}\x{580D}\x{580E}\x{580F}\x{5810}\x{5811}\x{5812}' . +'\x{5813}\x{5814}\x{5815}\x{5816}\x{5819}\x{581A}\x{581B}\x{581C}\x{581D}' . +'\x{581E}\x{581F}\x{5820}\x{5821}\x{5822}\x{5823}\x{5824}\x{5825}\x{5826}' . +'\x{5827}\x{5828}\x{5829}\x{582A}\x{582B}\x{582C}\x{582D}\x{582E}\x{582F}' . +'\x{5830}\x{5831}\x{5832}\x{5833}\x{5834}\x{5835}\x{5836}\x{5837}\x{5838}' . +'\x{5839}\x{583A}\x{583B}\x{583C}\x{583D}\x{583E}\x{583F}\x{5840}\x{5842}' . +'\x{5843}\x{5844}\x{5845}\x{5846}\x{5847}\x{5848}\x{5849}\x{584A}\x{584B}' . +'\x{584C}\x{584D}\x{584E}\x{584F}\x{5851}\x{5852}\x{5853}\x{5854}\x{5855}' . +'\x{5857}\x{5858}\x{5859}\x{585A}\x{585B}\x{585C}\x{585D}\x{585E}\x{585F}' . +'\x{5861}\x{5862}\x{5863}\x{5864}\x{5865}\x{5868}\x{5869}\x{586A}\x{586B}' . +'\x{586C}\x{586D}\x{586E}\x{586F}\x{5870}\x{5871}\x{5872}\x{5873}\x{5874}' . +'\x{5875}\x{5876}\x{5878}\x{5879}\x{587A}\x{587B}\x{587C}\x{587D}\x{587E}' . +'\x{587F}\x{5880}\x{5881}\x{5882}\x{5883}\x{5884}\x{5885}\x{5886}\x{5887}' . +'\x{5888}\x{5889}\x{588A}\x{588B}\x{588C}\x{588D}\x{588E}\x{588F}\x{5890}' . +'\x{5891}\x{5892}\x{5893}\x{5894}\x{5896}\x{5897}\x{5898}\x{5899}\x{589A}' . +'\x{589B}\x{589C}\x{589D}\x{589E}\x{589F}\x{58A0}\x{58A1}\x{58A2}\x{58A3}' . +'\x{58A4}\x{58A5}\x{58A6}\x{58A7}\x{58A8}\x{58A9}\x{58AB}\x{58AC}\x{58AD}' . +'\x{58AE}\x{58AF}\x{58B0}\x{58B1}\x{58B2}\x{58B3}\x{58B4}\x{58B7}\x{58B8}' . +'\x{58B9}\x{58BA}\x{58BB}\x{58BC}\x{58BD}\x{58BE}\x{58BF}\x{58C1}\x{58C2}' . +'\x{58C5}\x{58C6}\x{58C7}\x{58C8}\x{58C9}\x{58CA}\x{58CB}\x{58CE}\x{58CF}' . +'\x{58D1}\x{58D2}\x{58D3}\x{58D4}\x{58D5}\x{58D6}\x{58D7}\x{58D8}\x{58D9}' . +'\x{58DA}\x{58DB}\x{58DD}\x{58DE}\x{58DF}\x{58E0}\x{58E2}\x{58E3}\x{58E4}' . +'\x{58E5}\x{58E7}\x{58E8}\x{58E9}\x{58EA}\x{58EB}\x{58EC}\x{58ED}\x{58EE}' . +'\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F3}\x{58F4}\x{58F6}\x{58F7}\x{58F8}' . +'\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{58FE}\x{58FF}\x{5900}\x{5902}' . +'\x{5903}\x{5904}\x{5906}\x{5907}\x{5909}\x{590A}\x{590B}\x{590C}\x{590D}' . +'\x{590E}\x{590F}\x{5910}\x{5912}\x{5914}\x{5915}\x{5916}\x{5917}\x{5918}' . +'\x{5919}\x{591A}\x{591B}\x{591C}\x{591D}\x{591E}\x{591F}\x{5920}\x{5921}' . +'\x{5922}\x{5924}\x{5925}\x{5926}\x{5927}\x{5928}\x{5929}\x{592A}\x{592B}' . +'\x{592C}\x{592D}\x{592E}\x{592F}\x{5930}\x{5931}\x{5932}\x{5934}\x{5935}' . +'\x{5937}\x{5938}\x{5939}\x{593A}\x{593B}\x{593C}\x{593D}\x{593E}\x{593F}' . +'\x{5940}\x{5941}\x{5942}\x{5943}\x{5944}\x{5945}\x{5946}\x{5947}\x{5948}' . +'\x{5949}\x{594A}\x{594B}\x{594C}\x{594D}\x{594E}\x{594F}\x{5950}\x{5951}' . +'\x{5952}\x{5953}\x{5954}\x{5955}\x{5956}\x{5957}\x{5958}\x{595A}\x{595C}' . +'\x{595D}\x{595E}\x{595F}\x{5960}\x{5961}\x{5962}\x{5963}\x{5964}\x{5965}' . +'\x{5966}\x{5967}\x{5968}\x{5969}\x{596A}\x{596B}\x{596C}\x{596D}\x{596E}' . +'\x{596F}\x{5970}\x{5971}\x{5972}\x{5973}\x{5974}\x{5975}\x{5976}\x{5977}' . +'\x{5978}\x{5979}\x{597A}\x{597B}\x{597C}\x{597D}\x{597E}\x{597F}\x{5980}' . +'\x{5981}\x{5982}\x{5983}\x{5984}\x{5985}\x{5986}\x{5987}\x{5988}\x{5989}' . +'\x{598A}\x{598B}\x{598C}\x{598D}\x{598E}\x{598F}\x{5990}\x{5991}\x{5992}' . +'\x{5993}\x{5994}\x{5995}\x{5996}\x{5997}\x{5998}\x{5999}\x{599A}\x{599C}' . +'\x{599D}\x{599E}\x{599F}\x{59A0}\x{59A1}\x{59A2}\x{59A3}\x{59A4}\x{59A5}' . +'\x{59A6}\x{59A7}\x{59A8}\x{59A9}\x{59AA}\x{59AB}\x{59AC}\x{59AD}\x{59AE}' . +'\x{59AF}\x{59B0}\x{59B1}\x{59B2}\x{59B3}\x{59B4}\x{59B5}\x{59B6}\x{59B8}' . +'\x{59B9}\x{59BA}\x{59BB}\x{59BC}\x{59BD}\x{59BE}\x{59BF}\x{59C0}\x{59C1}' . +'\x{59C2}\x{59C3}\x{59C4}\x{59C5}\x{59C6}\x{59C7}\x{59C8}\x{59C9}\x{59CA}' . +'\x{59CB}\x{59CC}\x{59CD}\x{59CE}\x{59CF}\x{59D0}\x{59D1}\x{59D2}\x{59D3}' . +'\x{59D4}\x{59D5}\x{59D6}\x{59D7}\x{59D8}\x{59D9}\x{59DA}\x{59DB}\x{59DC}' . +'\x{59DD}\x{59DE}\x{59DF}\x{59E0}\x{59E1}\x{59E2}\x{59E3}\x{59E4}\x{59E5}' . +'\x{59E6}\x{59E8}\x{59E9}\x{59EA}\x{59EB}\x{59EC}\x{59ED}\x{59EE}\x{59EF}' . +'\x{59F0}\x{59F1}\x{59F2}\x{59F3}\x{59F4}\x{59F5}\x{59F6}\x{59F7}\x{59F8}' . +'\x{59F9}\x{59FA}\x{59FB}\x{59FC}\x{59FD}\x{59FE}\x{59FF}\x{5A00}\x{5A01}' . +'\x{5A02}\x{5A03}\x{5A04}\x{5A05}\x{5A06}\x{5A07}\x{5A08}\x{5A09}\x{5A0A}' . +'\x{5A0B}\x{5A0C}\x{5A0D}\x{5A0E}\x{5A0F}\x{5A10}\x{5A11}\x{5A12}\x{5A13}' . +'\x{5A14}\x{5A15}\x{5A16}\x{5A17}\x{5A18}\x{5A19}\x{5A1A}\x{5A1B}\x{5A1C}' . +'\x{5A1D}\x{5A1E}\x{5A1F}\x{5A20}\x{5A21}\x{5A22}\x{5A23}\x{5A25}\x{5A27}' . +'\x{5A28}\x{5A29}\x{5A2A}\x{5A2B}\x{5A2D}\x{5A2E}\x{5A2F}\x{5A31}\x{5A32}' . +'\x{5A33}\x{5A34}\x{5A35}\x{5A36}\x{5A37}\x{5A38}\x{5A39}\x{5A3A}\x{5A3B}' . +'\x{5A3C}\x{5A3D}\x{5A3E}\x{5A3F}\x{5A40}\x{5A41}\x{5A42}\x{5A43}\x{5A44}' . +'\x{5A45}\x{5A46}\x{5A47}\x{5A48}\x{5A49}\x{5A4A}\x{5A4B}\x{5A4C}\x{5A4D}' . +'\x{5A4E}\x{5A4F}\x{5A50}\x{5A51}\x{5A52}\x{5A53}\x{5A55}\x{5A56}\x{5A57}' . +'\x{5A58}\x{5A5A}\x{5A5B}\x{5A5C}\x{5A5D}\x{5A5E}\x{5A5F}\x{5A60}\x{5A61}' . +'\x{5A62}\x{5A63}\x{5A64}\x{5A65}\x{5A66}\x{5A67}\x{5A68}\x{5A69}\x{5A6A}' . +'\x{5A6B}\x{5A6C}\x{5A6D}\x{5A6E}\x{5A70}\x{5A72}\x{5A73}\x{5A74}\x{5A75}' . +'\x{5A76}\x{5A77}\x{5A78}\x{5A79}\x{5A7A}\x{5A7B}\x{5A7C}\x{5A7D}\x{5A7E}' . +'\x{5A7F}\x{5A80}\x{5A81}\x{5A82}\x{5A83}\x{5A84}\x{5A85}\x{5A86}\x{5A88}' . +'\x{5A89}\x{5A8A}\x{5A8B}\x{5A8C}\x{5A8E}\x{5A8F}\x{5A90}\x{5A91}\x{5A92}' . +'\x{5A93}\x{5A94}\x{5A95}\x{5A96}\x{5A97}\x{5A98}\x{5A99}\x{5A9A}\x{5A9B}' . +'\x{5A9C}\x{5A9D}\x{5A9E}\x{5A9F}\x{5AA0}\x{5AA1}\x{5AA2}\x{5AA3}\x{5AA4}' . +'\x{5AA5}\x{5AA6}\x{5AA7}\x{5AA8}\x{5AA9}\x{5AAA}\x{5AAC}\x{5AAD}\x{5AAE}' . +'\x{5AAF}\x{5AB0}\x{5AB1}\x{5AB2}\x{5AB3}\x{5AB4}\x{5AB5}\x{5AB6}\x{5AB7}' . +'\x{5AB8}\x{5AB9}\x{5ABA}\x{5ABB}\x{5ABC}\x{5ABD}\x{5ABE}\x{5ABF}\x{5AC0}' . +'\x{5AC1}\x{5AC2}\x{5AC3}\x{5AC4}\x{5AC5}\x{5AC6}\x{5AC7}\x{5AC8}\x{5AC9}' . +'\x{5ACA}\x{5ACB}\x{5ACC}\x{5ACD}\x{5ACE}\x{5ACF}\x{5AD1}\x{5AD2}\x{5AD4}' . +'\x{5AD5}\x{5AD6}\x{5AD7}\x{5AD8}\x{5AD9}\x{5ADA}\x{5ADB}\x{5ADC}\x{5ADD}' . +'\x{5ADE}\x{5ADF}\x{5AE0}\x{5AE1}\x{5AE2}\x{5AE3}\x{5AE4}\x{5AE5}\x{5AE6}' . +'\x{5AE7}\x{5AE8}\x{5AE9}\x{5AEA}\x{5AEB}\x{5AEC}\x{5AED}\x{5AEE}\x{5AF1}' . +'\x{5AF2}\x{5AF3}\x{5AF4}\x{5AF5}\x{5AF6}\x{5AF7}\x{5AF8}\x{5AF9}\x{5AFA}' . +'\x{5AFB}\x{5AFC}\x{5AFD}\x{5AFE}\x{5AFF}\x{5B00}\x{5B01}\x{5B02}\x{5B03}' . +'\x{5B04}\x{5B05}\x{5B06}\x{5B07}\x{5B08}\x{5B09}\x{5B0B}\x{5B0C}\x{5B0E}' . +'\x{5B0F}\x{5B10}\x{5B11}\x{5B12}\x{5B13}\x{5B14}\x{5B15}\x{5B16}\x{5B17}' . +'\x{5B18}\x{5B19}\x{5B1A}\x{5B1B}\x{5B1C}\x{5B1D}\x{5B1E}\x{5B1F}\x{5B20}' . +'\x{5B21}\x{5B22}\x{5B23}\x{5B24}\x{5B25}\x{5B26}\x{5B27}\x{5B28}\x{5B29}' . +'\x{5B2A}\x{5B2B}\x{5B2C}\x{5B2D}\x{5B2E}\x{5B2F}\x{5B30}\x{5B31}\x{5B32}' . +'\x{5B33}\x{5B34}\x{5B35}\x{5B36}\x{5B37}\x{5B38}\x{5B3A}\x{5B3B}\x{5B3C}' . +'\x{5B3D}\x{5B3E}\x{5B3F}\x{5B40}\x{5B41}\x{5B42}\x{5B43}\x{5B44}\x{5B45}' . +'\x{5B47}\x{5B48}\x{5B49}\x{5B4A}\x{5B4B}\x{5B4C}\x{5B4D}\x{5B4E}\x{5B50}' . +'\x{5B51}\x{5B53}\x{5B54}\x{5B55}\x{5B56}\x{5B57}\x{5B58}\x{5B59}\x{5B5A}' . +'\x{5B5B}\x{5B5C}\x{5B5D}\x{5B5E}\x{5B5F}\x{5B62}\x{5B63}\x{5B64}\x{5B65}' . +'\x{5B66}\x{5B67}\x{5B68}\x{5B69}\x{5B6A}\x{5B6B}\x{5B6C}\x{5B6D}\x{5B6E}' . +'\x{5B70}\x{5B71}\x{5B72}\x{5B73}\x{5B74}\x{5B75}\x{5B76}\x{5B77}\x{5B78}' . +'\x{5B7A}\x{5B7B}\x{5B7C}\x{5B7D}\x{5B7F}\x{5B80}\x{5B81}\x{5B82}\x{5B83}' . +'\x{5B84}\x{5B85}\x{5B87}\x{5B88}\x{5B89}\x{5B8A}\x{5B8B}\x{5B8C}\x{5B8D}' . +'\x{5B8E}\x{5B8F}\x{5B91}\x{5B92}\x{5B93}\x{5B94}\x{5B95}\x{5B96}\x{5B97}' . +'\x{5B98}\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9E}\x{5B9F}\x{5BA0}' . +'\x{5BA1}\x{5BA2}\x{5BA3}\x{5BA4}\x{5BA5}\x{5BA6}\x{5BA7}\x{5BA8}\x{5BAA}' . +'\x{5BAB}\x{5BAC}\x{5BAD}\x{5BAE}\x{5BAF}\x{5BB0}\x{5BB1}\x{5BB3}\x{5BB4}' . +'\x{5BB5}\x{5BB6}\x{5BB8}\x{5BB9}\x{5BBA}\x{5BBB}\x{5BBD}\x{5BBE}\x{5BBF}' . +'\x{5BC0}\x{5BC1}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BCA}' . +'\x{5BCB}\x{5BCC}\x{5BCD}\x{5BCE}\x{5BCF}\x{5BD0}\x{5BD1}\x{5BD2}\x{5BD3}' . +'\x{5BD4}\x{5BD5}\x{5BD6}\x{5BD8}\x{5BD9}\x{5BDB}\x{5BDC}\x{5BDD}\x{5BDE}' . +'\x{5BDF}\x{5BE0}\x{5BE1}\x{5BE2}\x{5BE3}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}' . +'\x{5BE8}\x{5BE9}\x{5BEA}\x{5BEB}\x{5BEC}\x{5BED}\x{5BEE}\x{5BEF}\x{5BF0}' . +'\x{5BF1}\x{5BF2}\x{5BF3}\x{5BF4}\x{5BF5}\x{5BF6}\x{5BF7}\x{5BF8}\x{5BF9}' . +'\x{5BFA}\x{5BFB}\x{5BFC}\x{5BFD}\x{5BFF}\x{5C01}\x{5C03}\x{5C04}\x{5C05}' . +'\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}\x{5C0B}\x{5C0C}\x{5C0D}\x{5C0E}' . +'\x{5C0F}\x{5C10}\x{5C11}\x{5C12}\x{5C13}\x{5C14}\x{5C15}\x{5C16}\x{5C17}' . +'\x{5C18}\x{5C19}\x{5C1A}\x{5C1C}\x{5C1D}\x{5C1E}\x{5C1F}\x{5C20}\x{5C21}' . +'\x{5C22}\x{5C24}\x{5C25}\x{5C27}\x{5C28}\x{5C2A}\x{5C2B}\x{5C2C}\x{5C2D}' . +'\x{5C2E}\x{5C2F}\x{5C30}\x{5C31}\x{5C32}\x{5C33}\x{5C34}\x{5C35}\x{5C37}' . +'\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}' . +'\x{5C41}\x{5C42}\x{5C43}\x{5C44}\x{5C45}\x{5C46}\x{5C47}\x{5C48}\x{5C49}' . +'\x{5C4A}\x{5C4B}\x{5C4C}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C52}' . +'\x{5C53}\x{5C54}\x{5C55}\x{5C56}\x{5C57}\x{5C58}\x{5C59}\x{5C5B}\x{5C5C}' . +'\x{5C5D}\x{5C5E}\x{5C5F}\x{5C60}\x{5C61}\x{5C62}\x{5C63}\x{5C64}\x{5C65}' . +'\x{5C66}\x{5C67}\x{5C68}\x{5C69}\x{5C6A}\x{5C6B}\x{5C6C}\x{5C6D}\x{5C6E}' . +'\x{5C6F}\x{5C70}\x{5C71}\x{5C72}\x{5C73}\x{5C74}\x{5C75}\x{5C76}\x{5C77}' . +'\x{5C78}\x{5C79}\x{5C7A}\x{5C7B}\x{5C7C}\x{5C7D}\x{5C7E}\x{5C7F}\x{5C80}' . +'\x{5C81}\x{5C82}\x{5C83}\x{5C84}\x{5C86}\x{5C87}\x{5C88}\x{5C89}\x{5C8A}' . +'\x{5C8B}\x{5C8C}\x{5C8D}\x{5C8E}\x{5C8F}\x{5C90}\x{5C91}\x{5C92}\x{5C93}' . +'\x{5C94}\x{5C95}\x{5C96}\x{5C97}\x{5C98}\x{5C99}\x{5C9A}\x{5C9B}\x{5C9C}' . +'\x{5C9D}\x{5C9E}\x{5C9F}\x{5CA0}\x{5CA1}\x{5CA2}\x{5CA3}\x{5CA4}\x{5CA5}' . +'\x{5CA6}\x{5CA7}\x{5CA8}\x{5CA9}\x{5CAA}\x{5CAB}\x{5CAC}\x{5CAD}\x{5CAE}' . +'\x{5CAF}\x{5CB0}\x{5CB1}\x{5CB2}\x{5CB3}\x{5CB5}\x{5CB6}\x{5CB7}\x{5CB8}' . +'\x{5CBA}\x{5CBB}\x{5CBC}\x{5CBD}\x{5CBE}\x{5CBF}\x{5CC1}\x{5CC2}\x{5CC3}' . +'\x{5CC4}\x{5CC5}\x{5CC6}\x{5CC7}\x{5CC8}\x{5CC9}\x{5CCA}\x{5CCB}\x{5CCC}' . +'\x{5CCD}\x{5CCE}\x{5CCF}\x{5CD0}\x{5CD1}\x{5CD2}\x{5CD3}\x{5CD4}\x{5CD6}' . +'\x{5CD7}\x{5CD8}\x{5CD9}\x{5CDA}\x{5CDB}\x{5CDC}\x{5CDE}\x{5CDF}\x{5CE0}' . +'\x{5CE1}\x{5CE2}\x{5CE3}\x{5CE4}\x{5CE5}\x{5CE6}\x{5CE7}\x{5CE8}\x{5CE9}' . +'\x{5CEA}\x{5CEB}\x{5CEC}\x{5CED}\x{5CEE}\x{5CEF}\x{5CF0}\x{5CF1}\x{5CF2}' . +'\x{5CF3}\x{5CF4}\x{5CF6}\x{5CF7}\x{5CF8}\x{5CF9}\x{5CFA}\x{5CFB}\x{5CFC}' . +'\x{5CFD}\x{5CFE}\x{5CFF}\x{5D00}\x{5D01}\x{5D02}\x{5D03}\x{5D04}\x{5D05}' . +'\x{5D06}\x{5D07}\x{5D08}\x{5D09}\x{5D0A}\x{5D0B}\x{5D0C}\x{5D0D}\x{5D0E}' . +'\x{5D0F}\x{5D10}\x{5D11}\x{5D12}\x{5D13}\x{5D14}\x{5D15}\x{5D16}\x{5D17}' . +'\x{5D18}\x{5D19}\x{5D1A}\x{5D1B}\x{5D1C}\x{5D1D}\x{5D1E}\x{5D1F}\x{5D20}' . +'\x{5D21}\x{5D22}\x{5D23}\x{5D24}\x{5D25}\x{5D26}\x{5D27}\x{5D28}\x{5D29}' . +'\x{5D2A}\x{5D2C}\x{5D2D}\x{5D2E}\x{5D30}\x{5D31}\x{5D32}\x{5D33}\x{5D34}' . +'\x{5D35}\x{5D36}\x{5D37}\x{5D38}\x{5D39}\x{5D3A}\x{5D3C}\x{5D3D}\x{5D3E}' . +'\x{5D3F}\x{5D40}\x{5D41}\x{5D42}\x{5D43}\x{5D44}\x{5D45}\x{5D46}\x{5D47}' . +'\x{5D48}\x{5D49}\x{5D4A}\x{5D4B}\x{5D4C}\x{5D4D}\x{5D4E}\x{5D4F}\x{5D50}' . +'\x{5D51}\x{5D52}\x{5D54}\x{5D55}\x{5D56}\x{5D58}\x{5D59}\x{5D5A}\x{5D5B}' . +'\x{5D5D}\x{5D5E}\x{5D5F}\x{5D61}\x{5D62}\x{5D63}\x{5D64}\x{5D65}\x{5D66}' . +'\x{5D67}\x{5D68}\x{5D69}\x{5D6A}\x{5D6B}\x{5D6C}\x{5D6D}\x{5D6E}\x{5D6F}' . +'\x{5D70}\x{5D71}\x{5D72}\x{5D73}\x{5D74}\x{5D75}\x{5D76}\x{5D77}\x{5D78}' . +'\x{5D79}\x{5D7A}\x{5D7B}\x{5D7C}\x{5D7D}\x{5D7E}\x{5D7F}\x{5D80}\x{5D81}' . +'\x{5D82}\x{5D84}\x{5D85}\x{5D86}\x{5D87}\x{5D88}\x{5D89}\x{5D8A}\x{5D8B}' . +'\x{5D8C}\x{5D8D}\x{5D8E}\x{5D8F}\x{5D90}\x{5D91}\x{5D92}\x{5D93}\x{5D94}' . +'\x{5D95}\x{5D97}\x{5D98}\x{5D99}\x{5D9A}\x{5D9B}\x{5D9C}\x{5D9D}\x{5D9E}' . +'\x{5D9F}\x{5DA0}\x{5DA1}\x{5DA2}\x{5DA5}\x{5DA6}\x{5DA7}\x{5DA8}\x{5DA9}' . +'\x{5DAA}\x{5DAC}\x{5DAD}\x{5DAE}\x{5DAF}\x{5DB0}\x{5DB1}\x{5DB2}\x{5DB4}' . +'\x{5DB5}\x{5DB6}\x{5DB7}\x{5DB8}\x{5DBA}\x{5DBB}\x{5DBC}\x{5DBD}\x{5DBE}' . +'\x{5DBF}\x{5DC0}\x{5DC1}\x{5DC2}\x{5DC3}\x{5DC5}\x{5DC6}\x{5DC7}\x{5DC8}' . +'\x{5DC9}\x{5DCA}\x{5DCB}\x{5DCC}\x{5DCD}\x{5DCE}\x{5DCF}\x{5DD0}\x{5DD1}' . +'\x{5DD2}\x{5DD3}\x{5DD4}\x{5DD5}\x{5DD6}\x{5DD8}\x{5DD9}\x{5DDB}\x{5DDD}' . +'\x{5DDE}\x{5DDF}\x{5DE0}\x{5DE1}\x{5DE2}\x{5DE3}\x{5DE4}\x{5DE5}\x{5DE6}' . +'\x{5DE7}\x{5DE8}\x{5DE9}\x{5DEA}\x{5DEB}\x{5DEC}\x{5DED}\x{5DEE}\x{5DEF}' . +'\x{5DF0}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DF8}\x{5DF9}' . +'\x{5DFA}\x{5DFB}\x{5DFC}\x{5DFD}\x{5DFE}\x{5DFF}\x{5E00}\x{5E01}\x{5E02}' . +'\x{5E03}\x{5E04}\x{5E05}\x{5E06}\x{5E07}\x{5E08}\x{5E09}\x{5E0A}\x{5E0B}' . +'\x{5E0C}\x{5E0D}\x{5E0E}\x{5E0F}\x{5E10}\x{5E11}\x{5E13}\x{5E14}\x{5E15}' . +'\x{5E16}\x{5E17}\x{5E18}\x{5E19}\x{5E1A}\x{5E1B}\x{5E1C}\x{5E1D}\x{5E1E}' . +'\x{5E1F}\x{5E20}\x{5E21}\x{5E22}\x{5E23}\x{5E24}\x{5E25}\x{5E26}\x{5E27}' . +'\x{5E28}\x{5E29}\x{5E2A}\x{5E2B}\x{5E2C}\x{5E2D}\x{5E2E}\x{5E2F}\x{5E30}' . +'\x{5E31}\x{5E32}\x{5E33}\x{5E34}\x{5E35}\x{5E36}\x{5E37}\x{5E38}\x{5E39}' . +'\x{5E3A}\x{5E3B}\x{5E3C}\x{5E3D}\x{5E3E}\x{5E40}\x{5E41}\x{5E42}\x{5E43}' . +'\x{5E44}\x{5E45}\x{5E46}\x{5E47}\x{5E49}\x{5E4A}\x{5E4B}\x{5E4C}\x{5E4D}' . +'\x{5E4E}\x{5E4F}\x{5E50}\x{5E52}\x{5E53}\x{5E54}\x{5E55}\x{5E56}\x{5E57}' . +'\x{5E58}\x{5E59}\x{5E5A}\x{5E5B}\x{5E5C}\x{5E5D}\x{5E5E}\x{5E5F}\x{5E60}' . +'\x{5E61}\x{5E62}\x{5E63}\x{5E64}\x{5E65}\x{5E66}\x{5E67}\x{5E68}\x{5E69}' . +'\x{5E6A}\x{5E6B}\x{5E6C}\x{5E6D}\x{5E6E}\x{5E6F}\x{5E70}\x{5E71}\x{5E72}' . +'\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E77}\x{5E78}\x{5E79}\x{5E7A}\x{5E7B}' . +'\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E80}\x{5E81}\x{5E82}\x{5E83}\x{5E84}' . +'\x{5E85}\x{5E86}\x{5E87}\x{5E88}\x{5E89}\x{5E8A}\x{5E8B}\x{5E8C}\x{5E8D}' . +'\x{5E8E}\x{5E8F}\x{5E90}\x{5E91}\x{5E93}\x{5E94}\x{5E95}\x{5E96}\x{5E97}' . +'\x{5E98}\x{5E99}\x{5E9A}\x{5E9B}\x{5E9C}\x{5E9D}\x{5E9E}\x{5E9F}\x{5EA0}' . +'\x{5EA1}\x{5EA2}\x{5EA3}\x{5EA4}\x{5EA5}\x{5EA6}\x{5EA7}\x{5EA8}\x{5EA9}' . +'\x{5EAA}\x{5EAB}\x{5EAC}\x{5EAD}\x{5EAE}\x{5EAF}\x{5EB0}\x{5EB1}\x{5EB2}' . +'\x{5EB3}\x{5EB4}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EB9}\x{5EBB}\x{5EBC}' . +'\x{5EBD}\x{5EBE}\x{5EBF}\x{5EC1}\x{5EC2}\x{5EC3}\x{5EC4}\x{5EC5}\x{5EC6}' . +'\x{5EC7}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECB}\x{5ECC}\x{5ECD}\x{5ECE}\x{5ECF}' . +'\x{5ED0}\x{5ED1}\x{5ED2}\x{5ED3}\x{5ED4}\x{5ED5}\x{5ED6}\x{5ED7}\x{5ED8}' . +'\x{5ED9}\x{5EDA}\x{5EDB}\x{5EDC}\x{5EDD}\x{5EDE}\x{5EDF}\x{5EE0}\x{5EE1}' . +'\x{5EE2}\x{5EE3}\x{5EE4}\x{5EE5}\x{5EE6}\x{5EE7}\x{5EE8}\x{5EE9}\x{5EEA}' . +'\x{5EEC}\x{5EED}\x{5EEE}\x{5EEF}\x{5EF0}\x{5EF1}\x{5EF2}\x{5EF3}\x{5EF4}' . +'\x{5EF5}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}\x{5EFB}\x{5EFC}\x{5EFD}\x{5EFE}' . +'\x{5EFF}\x{5F00}\x{5F01}\x{5F02}\x{5F03}\x{5F04}\x{5F05}\x{5F06}\x{5F07}' . +'\x{5F08}\x{5F0A}\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F11}\x{5F12}\x{5F13}' . +'\x{5F14}\x{5F15}\x{5F16}\x{5F17}\x{5F18}\x{5F19}\x{5F1A}\x{5F1B}\x{5F1C}' . +'\x{5F1D}\x{5F1E}\x{5F1F}\x{5F20}\x{5F21}\x{5F22}\x{5F23}\x{5F24}\x{5F25}' . +'\x{5F26}\x{5F27}\x{5F28}\x{5F29}\x{5F2A}\x{5F2B}\x{5F2C}\x{5F2D}\x{5F2E}' . +'\x{5F2F}\x{5F30}\x{5F31}\x{5F32}\x{5F33}\x{5F34}\x{5F35}\x{5F36}\x{5F37}' . +'\x{5F38}\x{5F39}\x{5F3A}\x{5F3C}\x{5F3E}\x{5F3F}\x{5F40}\x{5F41}\x{5F42}' . +'\x{5F43}\x{5F44}\x{5F45}\x{5F46}\x{5F47}\x{5F48}\x{5F49}\x{5F4A}\x{5F4B}' . +'\x{5F4C}\x{5F4D}\x{5F4E}\x{5F4F}\x{5F50}\x{5F51}\x{5F52}\x{5F53}\x{5F54}' . +'\x{5F55}\x{5F56}\x{5F57}\x{5F58}\x{5F59}\x{5F5A}\x{5F5B}\x{5F5C}\x{5F5D}' . +'\x{5F5E}\x{5F5F}\x{5F60}\x{5F61}\x{5F62}\x{5F63}\x{5F64}\x{5F65}\x{5F66}' . +'\x{5F67}\x{5F68}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}\x{5F6D}\x{5F6E}\x{5F6F}' . +'\x{5F70}\x{5F71}\x{5F72}\x{5F73}\x{5F74}\x{5F75}\x{5F76}\x{5F77}\x{5F78}' . +'\x{5F79}\x{5F7A}\x{5F7B}\x{5F7C}\x{5F7D}\x{5F7E}\x{5F7F}\x{5F80}\x{5F81}' . +'\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F86}\x{5F87}\x{5F88}\x{5F89}\x{5F8A}' . +'\x{5F8B}\x{5F8C}\x{5F8D}\x{5F8E}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F94}' . +'\x{5F95}\x{5F96}\x{5F97}\x{5F98}\x{5F99}\x{5F9B}\x{5F9C}\x{5F9D}\x{5F9E}' . +'\x{5F9F}\x{5FA0}\x{5FA1}\x{5FA2}\x{5FA5}\x{5FA6}\x{5FA7}\x{5FA8}\x{5FA9}' . +'\x{5FAA}\x{5FAB}\x{5FAC}\x{5FAD}\x{5FAE}\x{5FAF}\x{5FB1}\x{5FB2}\x{5FB3}' . +'\x{5FB4}\x{5FB5}\x{5FB6}\x{5FB7}\x{5FB8}\x{5FB9}\x{5FBA}\x{5FBB}\x{5FBC}' . +'\x{5FBD}\x{5FBE}\x{5FBF}\x{5FC0}\x{5FC1}\x{5FC3}\x{5FC4}\x{5FC5}\x{5FC6}' . +'\x{5FC7}\x{5FC8}\x{5FC9}\x{5FCA}\x{5FCB}\x{5FCC}\x{5FCD}\x{5FCF}\x{5FD0}' . +'\x{5FD1}\x{5FD2}\x{5FD3}\x{5FD4}\x{5FD5}\x{5FD6}\x{5FD7}\x{5FD8}\x{5FD9}' . +'\x{5FDA}\x{5FDC}\x{5FDD}\x{5FDE}\x{5FE0}\x{5FE1}\x{5FE3}\x{5FE4}\x{5FE5}' . +'\x{5FE6}\x{5FE7}\x{5FE8}\x{5FE9}\x{5FEA}\x{5FEB}\x{5FED}\x{5FEE}\x{5FEF}' . +'\x{5FF0}\x{5FF1}\x{5FF2}\x{5FF3}\x{5FF4}\x{5FF5}\x{5FF6}\x{5FF7}\x{5FF8}' . +'\x{5FF9}\x{5FFA}\x{5FFB}\x{5FFD}\x{5FFE}\x{5FFF}\x{6000}\x{6001}\x{6002}' . +'\x{6003}\x{6004}\x{6005}\x{6006}\x{6007}\x{6008}\x{6009}\x{600A}\x{600B}' . +'\x{600C}\x{600D}\x{600E}\x{600F}\x{6010}\x{6011}\x{6012}\x{6013}\x{6014}' . +'\x{6015}\x{6016}\x{6017}\x{6018}\x{6019}\x{601A}\x{601B}\x{601C}\x{601D}' . +'\x{601E}\x{601F}\x{6020}\x{6021}\x{6022}\x{6024}\x{6025}\x{6026}\x{6027}' . +'\x{6028}\x{6029}\x{602A}\x{602B}\x{602C}\x{602D}\x{602E}\x{602F}\x{6030}' . +'\x{6031}\x{6032}\x{6033}\x{6034}\x{6035}\x{6036}\x{6037}\x{6038}\x{6039}' . +'\x{603A}\x{603B}\x{603C}\x{603D}\x{603E}\x{603F}\x{6040}\x{6041}\x{6042}' . +'\x{6043}\x{6044}\x{6045}\x{6046}\x{6047}\x{6048}\x{6049}\x{604A}\x{604B}' . +'\x{604C}\x{604D}\x{604E}\x{604F}\x{6050}\x{6051}\x{6052}\x{6053}\x{6054}' . +'\x{6055}\x{6057}\x{6058}\x{6059}\x{605A}\x{605B}\x{605C}\x{605D}\x{605E}' . +'\x{605F}\x{6062}\x{6063}\x{6064}\x{6065}\x{6066}\x{6067}\x{6068}\x{6069}' . +'\x{606A}\x{606B}\x{606C}\x{606D}\x{606E}\x{606F}\x{6070}\x{6072}\x{6073}' . +'\x{6075}\x{6076}\x{6077}\x{6078}\x{6079}\x{607A}\x{607B}\x{607C}\x{607D}' . +'\x{607E}\x{607F}\x{6080}\x{6081}\x{6082}\x{6083}\x{6084}\x{6085}\x{6086}' . +'\x{6087}\x{6088}\x{6089}\x{608A}\x{608B}\x{608C}\x{608D}\x{608E}\x{608F}' . +'\x{6090}\x{6092}\x{6094}\x{6095}\x{6096}\x{6097}\x{6098}\x{6099}\x{609A}' . +'\x{609B}\x{609C}\x{609D}\x{609E}\x{609F}\x{60A0}\x{60A1}\x{60A2}\x{60A3}' . +'\x{60A4}\x{60A6}\x{60A7}\x{60A8}\x{60AA}\x{60AB}\x{60AC}\x{60AD}\x{60AE}' . +'\x{60AF}\x{60B0}\x{60B1}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B7}' . +'\x{60B8}\x{60B9}\x{60BA}\x{60BB}\x{60BC}\x{60BD}\x{60BE}\x{60BF}\x{60C0}' . +'\x{60C1}\x{60C2}\x{60C3}\x{60C4}\x{60C5}\x{60C6}\x{60C7}\x{60C8}\x{60C9}' . +'\x{60CA}\x{60CB}\x{60CC}\x{60CD}\x{60CE}\x{60CF}\x{60D0}\x{60D1}\x{60D3}' . +'\x{60D4}\x{60D5}\x{60D7}\x{60D8}\x{60D9}\x{60DA}\x{60DB}\x{60DC}\x{60DD}' . +'\x{60DF}\x{60E0}\x{60E1}\x{60E2}\x{60E4}\x{60E6}\x{60E7}\x{60E8}\x{60E9}' . +'\x{60EA}\x{60EB}\x{60EC}\x{60ED}\x{60EE}\x{60EF}\x{60F0}\x{60F1}\x{60F2}' . +'\x{60F3}\x{60F4}\x{60F5}\x{60F6}\x{60F7}\x{60F8}\x{60F9}\x{60FA}\x{60FB}' . +'\x{60FC}\x{60FE}\x{60FF}\x{6100}\x{6101}\x{6103}\x{6104}\x{6105}\x{6106}' . +'\x{6108}\x{6109}\x{610A}\x{610B}\x{610C}\x{610D}\x{610E}\x{610F}\x{6110}' . +'\x{6112}\x{6113}\x{6114}\x{6115}\x{6116}\x{6117}\x{6118}\x{6119}\x{611A}' . +'\x{611B}\x{611C}\x{611D}\x{611F}\x{6120}\x{6122}\x{6123}\x{6124}\x{6125}' . +'\x{6126}\x{6127}\x{6128}\x{6129}\x{612A}\x{612B}\x{612C}\x{612D}\x{612E}' . +'\x{612F}\x{6130}\x{6132}\x{6134}\x{6136}\x{6137}\x{613A}\x{613B}\x{613C}' . +'\x{613D}\x{613E}\x{613F}\x{6140}\x{6141}\x{6142}\x{6143}\x{6144}\x{6145}' . +'\x{6146}\x{6147}\x{6148}\x{6149}\x{614A}\x{614B}\x{614C}\x{614D}\x{614E}' . +'\x{614F}\x{6150}\x{6151}\x{6152}\x{6153}\x{6154}\x{6155}\x{6156}\x{6157}' . +'\x{6158}\x{6159}\x{615A}\x{615B}\x{615C}\x{615D}\x{615E}\x{615F}\x{6161}' . +'\x{6162}\x{6163}\x{6164}\x{6165}\x{6166}\x{6167}\x{6168}\x{6169}\x{616A}' . +'\x{616B}\x{616C}\x{616D}\x{616E}\x{6170}\x{6171}\x{6172}\x{6173}\x{6174}' . +'\x{6175}\x{6176}\x{6177}\x{6178}\x{6179}\x{617A}\x{617C}\x{617E}\x{6180}' . +'\x{6181}\x{6182}\x{6183}\x{6184}\x{6185}\x{6187}\x{6188}\x{6189}\x{618A}' . +'\x{618B}\x{618C}\x{618D}\x{618E}\x{618F}\x{6190}\x{6191}\x{6192}\x{6193}' . +'\x{6194}\x{6195}\x{6196}\x{6198}\x{6199}\x{619A}\x{619B}\x{619D}\x{619E}' . +'\x{619F}\x{61A0}\x{61A1}\x{61A2}\x{61A3}\x{61A4}\x{61A5}\x{61A6}\x{61A7}' . +'\x{61A8}\x{61A9}\x{61AA}\x{61AB}\x{61AC}\x{61AD}\x{61AE}\x{61AF}\x{61B0}' . +'\x{61B1}\x{61B2}\x{61B3}\x{61B4}\x{61B5}\x{61B6}\x{61B7}\x{61B8}\x{61BA}' . +'\x{61BC}\x{61BD}\x{61BE}\x{61BF}\x{61C0}\x{61C1}\x{61C2}\x{61C3}\x{61C4}' . +'\x{61C5}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' . +'\x{61CE}\x{61CF}\x{61D0}\x{61D1}\x{61D2}\x{61D4}\x{61D6}\x{61D7}\x{61D8}' . +'\x{61D9}\x{61DA}\x{61DB}\x{61DC}\x{61DD}\x{61DE}\x{61DF}\x{61E0}\x{61E1}' . +'\x{61E2}\x{61E3}\x{61E4}\x{61E5}\x{61E6}\x{61E7}\x{61E8}\x{61E9}\x{61EA}' . +'\x{61EB}\x{61ED}\x{61EE}\x{61F0}\x{61F1}\x{61F2}\x{61F3}\x{61F5}\x{61F6}' . +'\x{61F7}\x{61F8}\x{61F9}\x{61FA}\x{61FB}\x{61FC}\x{61FD}\x{61FE}\x{61FF}' . +'\x{6200}\x{6201}\x{6202}\x{6203}\x{6204}\x{6206}\x{6207}\x{6208}\x{6209}' . +'\x{620A}\x{620B}\x{620C}\x{620D}\x{620E}\x{620F}\x{6210}\x{6211}\x{6212}' . +'\x{6213}\x{6214}\x{6215}\x{6216}\x{6217}\x{6218}\x{6219}\x{621A}\x{621B}' . +'\x{621C}\x{621D}\x{621E}\x{621F}\x{6220}\x{6221}\x{6222}\x{6223}\x{6224}' . +'\x{6225}\x{6226}\x{6227}\x{6228}\x{6229}\x{622A}\x{622B}\x{622C}\x{622D}' . +'\x{622E}\x{622F}\x{6230}\x{6231}\x{6232}\x{6233}\x{6234}\x{6236}\x{6237}' . +'\x{6238}\x{623A}\x{623B}\x{623C}\x{623D}\x{623E}\x{623F}\x{6240}\x{6241}' . +'\x{6242}\x{6243}\x{6244}\x{6245}\x{6246}\x{6247}\x{6248}\x{6249}\x{624A}' . +'\x{624B}\x{624C}\x{624D}\x{624E}\x{624F}\x{6250}\x{6251}\x{6252}\x{6253}' . +'\x{6254}\x{6255}\x{6256}\x{6258}\x{6259}\x{625A}\x{625B}\x{625C}\x{625D}' . +'\x{625E}\x{625F}\x{6260}\x{6261}\x{6262}\x{6263}\x{6264}\x{6265}\x{6266}' . +'\x{6267}\x{6268}\x{6269}\x{626A}\x{626B}\x{626C}\x{626D}\x{626E}\x{626F}' . +'\x{6270}\x{6271}\x{6272}\x{6273}\x{6274}\x{6275}\x{6276}\x{6277}\x{6278}' . +'\x{6279}\x{627A}\x{627B}\x{627C}\x{627D}\x{627E}\x{627F}\x{6280}\x{6281}' . +'\x{6283}\x{6284}\x{6285}\x{6286}\x{6287}\x{6288}\x{6289}\x{628A}\x{628B}' . +'\x{628C}\x{628E}\x{628F}\x{6290}\x{6291}\x{6292}\x{6293}\x{6294}\x{6295}' . +'\x{6296}\x{6297}\x{6298}\x{6299}\x{629A}\x{629B}\x{629C}\x{629E}\x{629F}' . +'\x{62A0}\x{62A1}\x{62A2}\x{62A3}\x{62A4}\x{62A5}\x{62A7}\x{62A8}\x{62A9}' . +'\x{62AA}\x{62AB}\x{62AC}\x{62AD}\x{62AE}\x{62AF}\x{62B0}\x{62B1}\x{62B2}' . +'\x{62B3}\x{62B4}\x{62B5}\x{62B6}\x{62B7}\x{62B8}\x{62B9}\x{62BA}\x{62BB}' . +'\x{62BC}\x{62BD}\x{62BE}\x{62BF}\x{62C0}\x{62C1}\x{62C2}\x{62C3}\x{62C4}' . +'\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CB}\x{62CC}\x{62CD}' . +'\x{62CE}\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D5}\x{62D6}' . +'\x{62D7}\x{62D8}\x{62D9}\x{62DA}\x{62DB}\x{62DC}\x{62DD}\x{62DF}\x{62E0}' . +'\x{62E1}\x{62E2}\x{62E3}\x{62E4}\x{62E5}\x{62E6}\x{62E7}\x{62E8}\x{62E9}' . +'\x{62EB}\x{62EC}\x{62ED}\x{62EE}\x{62EF}\x{62F0}\x{62F1}\x{62F2}\x{62F3}' . +'\x{62F4}\x{62F5}\x{62F6}\x{62F7}\x{62F8}\x{62F9}\x{62FA}\x{62FB}\x{62FC}' . +'\x{62FD}\x{62FE}\x{62FF}\x{6300}\x{6301}\x{6302}\x{6303}\x{6304}\x{6305}' . +'\x{6306}\x{6307}\x{6308}\x{6309}\x{630B}\x{630C}\x{630D}\x{630E}\x{630F}' . +'\x{6310}\x{6311}\x{6312}\x{6313}\x{6314}\x{6315}\x{6316}\x{6318}\x{6319}' . +'\x{631A}\x{631B}\x{631C}\x{631D}\x{631E}\x{631F}\x{6320}\x{6321}\x{6322}' . +'\x{6323}\x{6324}\x{6325}\x{6326}\x{6327}\x{6328}\x{6329}\x{632A}\x{632B}' . +'\x{632C}\x{632D}\x{632E}\x{632F}\x{6330}\x{6332}\x{6333}\x{6334}\x{6336}' . +'\x{6338}\x{6339}\x{633A}\x{633B}\x{633C}\x{633D}\x{633E}\x{6340}\x{6341}' . +'\x{6342}\x{6343}\x{6344}\x{6345}\x{6346}\x{6347}\x{6348}\x{6349}\x{634A}' . +'\x{634B}\x{634C}\x{634D}\x{634E}\x{634F}\x{6350}\x{6351}\x{6352}\x{6353}' . +'\x{6354}\x{6355}\x{6356}\x{6357}\x{6358}\x{6359}\x{635A}\x{635C}\x{635D}' . +'\x{635E}\x{635F}\x{6360}\x{6361}\x{6362}\x{6363}\x{6364}\x{6365}\x{6366}' . +'\x{6367}\x{6368}\x{6369}\x{636A}\x{636B}\x{636C}\x{636D}\x{636E}\x{636F}' . +'\x{6370}\x{6371}\x{6372}\x{6373}\x{6374}\x{6375}\x{6376}\x{6377}\x{6378}' . +'\x{6379}\x{637A}\x{637B}\x{637C}\x{637D}\x{637E}\x{6380}\x{6381}\x{6382}' . +'\x{6383}\x{6384}\x{6385}\x{6386}\x{6387}\x{6388}\x{6389}\x{638A}\x{638C}' . +'\x{638D}\x{638E}\x{638F}\x{6390}\x{6391}\x{6392}\x{6394}\x{6395}\x{6396}' . +'\x{6397}\x{6398}\x{6399}\x{639A}\x{639B}\x{639C}\x{639D}\x{639E}\x{639F}' . +'\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A4}\x{63A5}\x{63A6}\x{63A7}\x{63A8}' . +'\x{63A9}\x{63AA}\x{63AB}\x{63AC}\x{63AD}\x{63AE}\x{63AF}\x{63B0}\x{63B1}' . +'\x{63B2}\x{63B3}\x{63B4}\x{63B5}\x{63B6}\x{63B7}\x{63B8}\x{63B9}\x{63BA}' . +'\x{63BC}\x{63BD}\x{63BE}\x{63BF}\x{63C0}\x{63C1}\x{63C2}\x{63C3}\x{63C4}' . +'\x{63C5}\x{63C6}\x{63C7}\x{63C8}\x{63C9}\x{63CA}\x{63CB}\x{63CC}\x{63CD}' . +'\x{63CE}\x{63CF}\x{63D0}\x{63D2}\x{63D3}\x{63D4}\x{63D5}\x{63D6}\x{63D7}' . +'\x{63D8}\x{63D9}\x{63DA}\x{63DB}\x{63DC}\x{63DD}\x{63DE}\x{63DF}\x{63E0}' . +'\x{63E1}\x{63E2}\x{63E3}\x{63E4}\x{63E5}\x{63E6}\x{63E7}\x{63E8}\x{63E9}' . +'\x{63EA}\x{63EB}\x{63EC}\x{63ED}\x{63EE}\x{63EF}\x{63F0}\x{63F1}\x{63F2}' . +'\x{63F3}\x{63F4}\x{63F5}\x{63F6}\x{63F7}\x{63F8}\x{63F9}\x{63FA}\x{63FB}' . +'\x{63FC}\x{63FD}\x{63FE}\x{63FF}\x{6400}\x{6401}\x{6402}\x{6403}\x{6404}' . +'\x{6405}\x{6406}\x{6408}\x{6409}\x{640A}\x{640B}\x{640C}\x{640D}\x{640E}' . +'\x{640F}\x{6410}\x{6411}\x{6412}\x{6413}\x{6414}\x{6415}\x{6416}\x{6417}' . +'\x{6418}\x{6419}\x{641A}\x{641B}\x{641C}\x{641D}\x{641E}\x{641F}\x{6420}' . +'\x{6421}\x{6422}\x{6423}\x{6424}\x{6425}\x{6426}\x{6427}\x{6428}\x{6429}' . +'\x{642A}\x{642B}\x{642C}\x{642D}\x{642E}\x{642F}\x{6430}\x{6431}\x{6432}' . +'\x{6433}\x{6434}\x{6435}\x{6436}\x{6437}\x{6438}\x{6439}\x{643A}\x{643D}' . +'\x{643E}\x{643F}\x{6440}\x{6441}\x{6443}\x{6444}\x{6445}\x{6446}\x{6447}' . +'\x{6448}\x{644A}\x{644B}\x{644C}\x{644D}\x{644E}\x{644F}\x{6450}\x{6451}' . +'\x{6452}\x{6453}\x{6454}\x{6455}\x{6456}\x{6457}\x{6458}\x{6459}\x{645B}' . +'\x{645C}\x{645D}\x{645E}\x{645F}\x{6460}\x{6461}\x{6462}\x{6463}\x{6464}' . +'\x{6465}\x{6466}\x{6467}\x{6468}\x{6469}\x{646A}\x{646B}\x{646C}\x{646D}' . +'\x{646E}\x{646F}\x{6470}\x{6471}\x{6472}\x{6473}\x{6474}\x{6475}\x{6476}' . +'\x{6477}\x{6478}\x{6479}\x{647A}\x{647B}\x{647C}\x{647D}\x{647F}\x{6480}' . +'\x{6481}\x{6482}\x{6483}\x{6484}\x{6485}\x{6487}\x{6488}\x{6489}\x{648A}' . +'\x{648B}\x{648C}\x{648D}\x{648E}\x{648F}\x{6490}\x{6491}\x{6492}\x{6493}' . +'\x{6494}\x{6495}\x{6496}\x{6497}\x{6498}\x{6499}\x{649A}\x{649B}\x{649C}' . +'\x{649D}\x{649E}\x{649F}\x{64A0}\x{64A2}\x{64A3}\x{64A4}\x{64A5}\x{64A6}' . +'\x{64A7}\x{64A8}\x{64A9}\x{64AA}\x{64AB}\x{64AC}\x{64AD}\x{64AE}\x{64B0}' . +'\x{64B1}\x{64B2}\x{64B3}\x{64B4}\x{64B5}\x{64B7}\x{64B8}\x{64B9}\x{64BA}' . +'\x{64BB}\x{64BC}\x{64BD}\x{64BE}\x{64BF}\x{64C0}\x{64C1}\x{64C2}\x{64C3}' . +'\x{64C4}\x{64C5}\x{64C6}\x{64C7}\x{64C9}\x{64CA}\x{64CB}\x{64CC}\x{64CD}' . +'\x{64CE}\x{64CF}\x{64D0}\x{64D1}\x{64D2}\x{64D3}\x{64D4}\x{64D6}\x{64D7}' . +'\x{64D8}\x{64D9}\x{64DA}\x{64DB}\x{64DC}\x{64DD}\x{64DE}\x{64DF}\x{64E0}' . +'\x{64E2}\x{64E3}\x{64E4}\x{64E6}\x{64E7}\x{64E8}\x{64E9}\x{64EA}\x{64EB}' . +'\x{64EC}\x{64ED}\x{64EF}\x{64F0}\x{64F1}\x{64F2}\x{64F3}\x{64F4}\x{64F6}' . +'\x{64F7}\x{64F8}\x{64FA}\x{64FB}\x{64FC}\x{64FD}\x{64FE}\x{64FF}\x{6500}' . +'\x{6501}\x{6503}\x{6504}\x{6505}\x{6506}\x{6507}\x{6508}\x{6509}\x{650B}' . +'\x{650C}\x{650D}\x{650E}\x{650F}\x{6510}\x{6511}\x{6512}\x{6513}\x{6514}' . +'\x{6515}\x{6516}\x{6517}\x{6518}\x{6519}\x{651A}\x{651B}\x{651C}\x{651D}' . +'\x{651E}\x{6520}\x{6521}\x{6522}\x{6523}\x{6524}\x{6525}\x{6526}\x{6527}' . +'\x{6529}\x{652A}\x{652B}\x{652C}\x{652D}\x{652E}\x{652F}\x{6530}\x{6531}' . +'\x{6532}\x{6533}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}\x{653A}' . +'\x{653B}\x{653C}\x{653D}\x{653E}\x{653F}\x{6541}\x{6543}\x{6544}\x{6545}' . +'\x{6546}\x{6547}\x{6548}\x{6549}\x{654A}\x{654B}\x{654C}\x{654D}\x{654E}' . +'\x{654F}\x{6550}\x{6551}\x{6552}\x{6553}\x{6554}\x{6555}\x{6556}\x{6557}' . +'\x{6558}\x{6559}\x{655B}\x{655C}\x{655D}\x{655E}\x{6560}\x{6561}\x{6562}' . +'\x{6563}\x{6564}\x{6565}\x{6566}\x{6567}\x{6568}\x{6569}\x{656A}\x{656B}' . +'\x{656C}\x{656E}\x{656F}\x{6570}\x{6571}\x{6572}\x{6573}\x{6574}\x{6575}' . +'\x{6576}\x{6577}\x{6578}\x{6579}\x{657A}\x{657B}\x{657C}\x{657E}\x{657F}' . +'\x{6580}\x{6581}\x{6582}\x{6583}\x{6584}\x{6585}\x{6586}\x{6587}\x{6588}' . +'\x{6589}\x{658B}\x{658C}\x{658D}\x{658E}\x{658F}\x{6590}\x{6591}\x{6592}' . +'\x{6593}\x{6594}\x{6595}\x{6596}\x{6597}\x{6598}\x{6599}\x{659B}\x{659C}' . +'\x{659D}\x{659E}\x{659F}\x{65A0}\x{65A1}\x{65A2}\x{65A3}\x{65A4}\x{65A5}' . +'\x{65A6}\x{65A7}\x{65A8}\x{65A9}\x{65AA}\x{65AB}\x{65AC}\x{65AD}\x{65AE}' . +'\x{65AF}\x{65B0}\x{65B1}\x{65B2}\x{65B3}\x{65B4}\x{65B6}\x{65B7}\x{65B8}' . +'\x{65B9}\x{65BA}\x{65BB}\x{65BC}\x{65BD}\x{65BF}\x{65C0}\x{65C1}\x{65C2}' . +'\x{65C3}\x{65C4}\x{65C5}\x{65C6}\x{65C7}\x{65CA}\x{65CB}\x{65CC}\x{65CD}' . +'\x{65CE}\x{65CF}\x{65D0}\x{65D2}\x{65D3}\x{65D4}\x{65D5}\x{65D6}\x{65D7}' . +'\x{65DA}\x{65DB}\x{65DD}\x{65DE}\x{65DF}\x{65E0}\x{65E1}\x{65E2}\x{65E3}' . +'\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}\x{65EB}\x{65EC}\x{65ED}\x{65EE}' . +'\x{65EF}\x{65F0}\x{65F1}\x{65F2}\x{65F3}\x{65F4}\x{65F5}\x{65F6}\x{65F7}' . +'\x{65F8}\x{65FA}\x{65FB}\x{65FC}\x{65FD}\x{6600}\x{6601}\x{6602}\x{6603}' . +'\x{6604}\x{6605}\x{6606}\x{6607}\x{6608}\x{6609}\x{660A}\x{660B}\x{660C}' . +'\x{660D}\x{660E}\x{660F}\x{6610}\x{6611}\x{6612}\x{6613}\x{6614}\x{6615}' . +'\x{6616}\x{6618}\x{6619}\x{661A}\x{661B}\x{661C}\x{661D}\x{661F}\x{6620}' . +'\x{6621}\x{6622}\x{6623}\x{6624}\x{6625}\x{6626}\x{6627}\x{6628}\x{6629}' . +'\x{662A}\x{662B}\x{662D}\x{662E}\x{662F}\x{6630}\x{6631}\x{6632}\x{6633}' . +'\x{6634}\x{6635}\x{6636}\x{6639}\x{663A}\x{663C}\x{663D}\x{663E}\x{6640}' . +'\x{6641}\x{6642}\x{6643}\x{6644}\x{6645}\x{6646}\x{6647}\x{6649}\x{664A}' . +'\x{664B}\x{664C}\x{664E}\x{664F}\x{6650}\x{6651}\x{6652}\x{6653}\x{6654}' . +'\x{6655}\x{6656}\x{6657}\x{6658}\x{6659}\x{665A}\x{665B}\x{665C}\x{665D}' . +'\x{665E}\x{665F}\x{6661}\x{6662}\x{6664}\x{6665}\x{6666}\x{6668}\x{6669}' . +'\x{666A}\x{666B}\x{666C}\x{666D}\x{666E}\x{666F}\x{6670}\x{6671}\x{6672}' . +'\x{6673}\x{6674}\x{6675}\x{6676}\x{6677}\x{6678}\x{6679}\x{667A}\x{667B}' . +'\x{667C}\x{667D}\x{667E}\x{667F}\x{6680}\x{6681}\x{6682}\x{6683}\x{6684}' . +'\x{6685}\x{6686}\x{6687}\x{6688}\x{6689}\x{668A}\x{668B}\x{668C}\x{668D}' . +'\x{668E}\x{668F}\x{6690}\x{6691}\x{6693}\x{6694}\x{6695}\x{6696}\x{6697}' . +'\x{6698}\x{6699}\x{669A}\x{669B}\x{669D}\x{669F}\x{66A0}\x{66A1}\x{66A2}' . +'\x{66A3}\x{66A4}\x{66A5}\x{66A6}\x{66A7}\x{66A8}\x{66A9}\x{66AA}\x{66AB}' . +'\x{66AE}\x{66AF}\x{66B0}\x{66B1}\x{66B2}\x{66B3}\x{66B4}\x{66B5}\x{66B6}' . +'\x{66B7}\x{66B8}\x{66B9}\x{66BA}\x{66BB}\x{66BC}\x{66BD}\x{66BE}\x{66BF}' . +'\x{66C0}\x{66C1}\x{66C2}\x{66C3}\x{66C4}\x{66C5}\x{66C6}\x{66C7}\x{66C8}' . +'\x{66C9}\x{66CA}\x{66CB}\x{66CC}\x{66CD}\x{66CE}\x{66CF}\x{66D1}\x{66D2}' . +'\x{66D4}\x{66D5}\x{66D6}\x{66D8}\x{66D9}\x{66DA}\x{66DB}\x{66DC}\x{66DD}' . +'\x{66DE}\x{66E0}\x{66E1}\x{66E2}\x{66E3}\x{66E4}\x{66E5}\x{66E6}\x{66E7}' . +'\x{66E8}\x{66E9}\x{66EA}\x{66EB}\x{66EC}\x{66ED}\x{66EE}\x{66F0}\x{66F1}' . +'\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F6}\x{66F7}\x{66F8}\x{66F9}\x{66FA}' . +'\x{66FB}\x{66FC}\x{66FE}\x{66FF}\x{6700}\x{6701}\x{6703}\x{6704}\x{6705}' . +'\x{6706}\x{6708}\x{6709}\x{670A}\x{670B}\x{670C}\x{670D}\x{670E}\x{670F}' . +'\x{6710}\x{6711}\x{6712}\x{6713}\x{6714}\x{6715}\x{6716}\x{6717}\x{6718}' . +'\x{671A}\x{671B}\x{671C}\x{671D}\x{671E}\x{671F}\x{6720}\x{6721}\x{6722}' . +'\x{6723}\x{6725}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}\x{672D}' . +'\x{672E}\x{672F}\x{6730}\x{6731}\x{6732}\x{6733}\x{6734}\x{6735}\x{6736}' . +'\x{6737}\x{6738}\x{6739}\x{673A}\x{673B}\x{673C}\x{673D}\x{673E}\x{673F}' . +'\x{6740}\x{6741}\x{6742}\x{6743}\x{6744}\x{6745}\x{6746}\x{6747}\x{6748}' . +'\x{6749}\x{674A}\x{674B}\x{674C}\x{674D}\x{674E}\x{674F}\x{6750}\x{6751}' . +'\x{6752}\x{6753}\x{6754}\x{6755}\x{6756}\x{6757}\x{6758}\x{6759}\x{675A}' . +'\x{675B}\x{675C}\x{675D}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' . +'\x{6764}\x{6765}\x{6766}\x{6768}\x{6769}\x{676A}\x{676B}\x{676C}\x{676D}' . +'\x{676E}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}\x{6774}\x{6775}\x{6776}' . +'\x{6777}\x{6778}\x{6779}\x{677A}\x{677B}\x{677C}\x{677D}\x{677E}\x{677F}' . +'\x{6780}\x{6781}\x{6782}\x{6783}\x{6784}\x{6785}\x{6786}\x{6787}\x{6789}' . +'\x{678A}\x{678B}\x{678C}\x{678D}\x{678E}\x{678F}\x{6790}\x{6791}\x{6792}' . +'\x{6793}\x{6794}\x{6795}\x{6797}\x{6798}\x{6799}\x{679A}\x{679B}\x{679C}' . +'\x{679D}\x{679E}\x{679F}\x{67A0}\x{67A1}\x{67A2}\x{67A3}\x{67A4}\x{67A5}' . +'\x{67A6}\x{67A7}\x{67A8}\x{67AA}\x{67AB}\x{67AC}\x{67AD}\x{67AE}\x{67AF}' . +'\x{67B0}\x{67B1}\x{67B2}\x{67B3}\x{67B4}\x{67B5}\x{67B6}\x{67B7}\x{67B8}' . +'\x{67B9}\x{67BA}\x{67BB}\x{67BC}\x{67BE}\x{67C0}\x{67C1}\x{67C2}\x{67C3}' . +'\x{67C4}\x{67C5}\x{67C6}\x{67C7}\x{67C8}\x{67C9}\x{67CA}\x{67CB}\x{67CC}' . +'\x{67CD}\x{67CE}\x{67CF}\x{67D0}\x{67D1}\x{67D2}\x{67D3}\x{67D4}\x{67D6}' . +'\x{67D8}\x{67D9}\x{67DA}\x{67DB}\x{67DC}\x{67DD}\x{67DE}\x{67DF}\x{67E0}' . +'\x{67E1}\x{67E2}\x{67E3}\x{67E4}\x{67E5}\x{67E6}\x{67E7}\x{67E8}\x{67E9}' . +'\x{67EA}\x{67EB}\x{67EC}\x{67ED}\x{67EE}\x{67EF}\x{67F0}\x{67F1}\x{67F2}' . +'\x{67F3}\x{67F4}\x{67F5}\x{67F6}\x{67F7}\x{67F8}\x{67FA}\x{67FB}\x{67FC}' . +'\x{67FD}\x{67FE}\x{67FF}\x{6800}\x{6802}\x{6803}\x{6804}\x{6805}\x{6806}' . +'\x{6807}\x{6808}\x{6809}\x{680A}\x{680B}\x{680C}\x{680D}\x{680E}\x{680F}' . +'\x{6810}\x{6811}\x{6812}\x{6813}\x{6814}\x{6816}\x{6817}\x{6818}\x{6819}' . +'\x{681A}\x{681B}\x{681C}\x{681D}\x{681F}\x{6820}\x{6821}\x{6822}\x{6823}' . +'\x{6824}\x{6825}\x{6826}\x{6828}\x{6829}\x{682A}\x{682B}\x{682C}\x{682D}' . +'\x{682E}\x{682F}\x{6831}\x{6832}\x{6833}\x{6834}\x{6835}\x{6836}\x{6837}' . +'\x{6838}\x{6839}\x{683A}\x{683B}\x{683C}\x{683D}\x{683E}\x{683F}\x{6840}' . +'\x{6841}\x{6842}\x{6843}\x{6844}\x{6845}\x{6846}\x{6847}\x{6848}\x{6849}' . +'\x{684A}\x{684B}\x{684C}\x{684D}\x{684E}\x{684F}\x{6850}\x{6851}\x{6852}' . +'\x{6853}\x{6854}\x{6855}\x{6856}\x{6857}\x{685B}\x{685D}\x{6860}\x{6861}' . +'\x{6862}\x{6863}\x{6864}\x{6865}\x{6866}\x{6867}\x{6868}\x{6869}\x{686A}' . +'\x{686B}\x{686C}\x{686D}\x{686E}\x{686F}\x{6870}\x{6871}\x{6872}\x{6873}' . +'\x{6874}\x{6875}\x{6876}\x{6877}\x{6878}\x{6879}\x{687B}\x{687C}\x{687D}' . +'\x{687E}\x{687F}\x{6880}\x{6881}\x{6882}\x{6883}\x{6884}\x{6885}\x{6886}' . +'\x{6887}\x{6888}\x{6889}\x{688A}\x{688B}\x{688C}\x{688D}\x{688E}\x{688F}' . +'\x{6890}\x{6891}\x{6892}\x{6893}\x{6894}\x{6896}\x{6897}\x{6898}\x{689A}' . +'\x{689B}\x{689C}\x{689D}\x{689E}\x{689F}\x{68A0}\x{68A1}\x{68A2}\x{68A3}' . +'\x{68A4}\x{68A6}\x{68A7}\x{68A8}\x{68A9}\x{68AA}\x{68AB}\x{68AC}\x{68AD}' . +'\x{68AE}\x{68AF}\x{68B0}\x{68B1}\x{68B2}\x{68B3}\x{68B4}\x{68B5}\x{68B6}' . +'\x{68B7}\x{68B9}\x{68BB}\x{68BC}\x{68BD}\x{68BE}\x{68BF}\x{68C0}\x{68C1}' . +'\x{68C2}\x{68C4}\x{68C6}\x{68C7}\x{68C8}\x{68C9}\x{68CA}\x{68CB}\x{68CC}' . +'\x{68CD}\x{68CE}\x{68CF}\x{68D0}\x{68D1}\x{68D2}\x{68D3}\x{68D4}\x{68D5}' . +'\x{68D6}\x{68D7}\x{68D8}\x{68DA}\x{68DB}\x{68DC}\x{68DD}\x{68DE}\x{68DF}' . +'\x{68E0}\x{68E1}\x{68E3}\x{68E4}\x{68E6}\x{68E7}\x{68E8}\x{68E9}\x{68EA}' . +'\x{68EB}\x{68EC}\x{68ED}\x{68EE}\x{68EF}\x{68F0}\x{68F1}\x{68F2}\x{68F3}' . +'\x{68F4}\x{68F5}\x{68F6}\x{68F7}\x{68F8}\x{68F9}\x{68FA}\x{68FB}\x{68FC}' . +'\x{68FD}\x{68FE}\x{68FF}\x{6901}\x{6902}\x{6903}\x{6904}\x{6905}\x{6906}' . +'\x{6907}\x{6908}\x{690A}\x{690B}\x{690C}\x{690D}\x{690E}\x{690F}\x{6910}' . +'\x{6911}\x{6912}\x{6913}\x{6914}\x{6915}\x{6916}\x{6917}\x{6918}\x{6919}' . +'\x{691A}\x{691B}\x{691C}\x{691D}\x{691E}\x{691F}\x{6920}\x{6921}\x{6922}' . +'\x{6923}\x{6924}\x{6925}\x{6926}\x{6927}\x{6928}\x{6929}\x{692A}\x{692B}' . +'\x{692C}\x{692D}\x{692E}\x{692F}\x{6930}\x{6931}\x{6932}\x{6933}\x{6934}' . +'\x{6935}\x{6936}\x{6937}\x{6938}\x{6939}\x{693A}\x{693B}\x{693C}\x{693D}' . +'\x{693F}\x{6940}\x{6941}\x{6942}\x{6943}\x{6944}\x{6945}\x{6946}\x{6947}' . +'\x{6948}\x{6949}\x{694A}\x{694B}\x{694C}\x{694E}\x{694F}\x{6950}\x{6951}' . +'\x{6952}\x{6953}\x{6954}\x{6955}\x{6956}\x{6957}\x{6958}\x{6959}\x{695A}' . +'\x{695B}\x{695C}\x{695D}\x{695E}\x{695F}\x{6960}\x{6961}\x{6962}\x{6963}' . +'\x{6964}\x{6965}\x{6966}\x{6967}\x{6968}\x{6969}\x{696A}\x{696B}\x{696C}' . +'\x{696D}\x{696E}\x{696F}\x{6970}\x{6971}\x{6972}\x{6973}\x{6974}\x{6975}' . +'\x{6976}\x{6977}\x{6978}\x{6979}\x{697A}\x{697B}\x{697C}\x{697D}\x{697E}' . +'\x{697F}\x{6980}\x{6981}\x{6982}\x{6983}\x{6984}\x{6985}\x{6986}\x{6987}' . +'\x{6988}\x{6989}\x{698A}\x{698B}\x{698C}\x{698D}\x{698E}\x{698F}\x{6990}' . +'\x{6991}\x{6992}\x{6993}\x{6994}\x{6995}\x{6996}\x{6997}\x{6998}\x{6999}' . +'\x{699A}\x{699B}\x{699C}\x{699D}\x{699E}\x{69A0}\x{69A1}\x{69A3}\x{69A4}' . +'\x{69A5}\x{69A6}\x{69A7}\x{69A8}\x{69A9}\x{69AA}\x{69AB}\x{69AC}\x{69AD}' . +'\x{69AE}\x{69AF}\x{69B0}\x{69B1}\x{69B2}\x{69B3}\x{69B4}\x{69B5}\x{69B6}' . +'\x{69B7}\x{69B8}\x{69B9}\x{69BA}\x{69BB}\x{69BC}\x{69BD}\x{69BE}\x{69BF}' . +'\x{69C1}\x{69C2}\x{69C3}\x{69C4}\x{69C5}\x{69C6}\x{69C7}\x{69C8}\x{69C9}' . +'\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}\x{69CF}\x{69D0}\x{69D3}\x{69D4}' . +'\x{69D8}\x{69D9}\x{69DA}\x{69DB}\x{69DC}\x{69DD}\x{69DE}\x{69DF}\x{69E0}' . +'\x{69E1}\x{69E2}\x{69E3}\x{69E4}\x{69E5}\x{69E6}\x{69E7}\x{69E8}\x{69E9}' . +'\x{69EA}\x{69EB}\x{69EC}\x{69ED}\x{69EE}\x{69EF}\x{69F0}\x{69F1}\x{69F2}' . +'\x{69F3}\x{69F4}\x{69F5}\x{69F6}\x{69F7}\x{69F8}\x{69FA}\x{69FB}\x{69FC}' . +'\x{69FD}\x{69FE}\x{69FF}\x{6A00}\x{6A01}\x{6A02}\x{6A04}\x{6A05}\x{6A06}' . +'\x{6A07}\x{6A08}\x{6A09}\x{6A0A}\x{6A0B}\x{6A0D}\x{6A0E}\x{6A0F}\x{6A10}' . +'\x{6A11}\x{6A12}\x{6A13}\x{6A14}\x{6A15}\x{6A16}\x{6A17}\x{6A18}\x{6A19}' . +'\x{6A1A}\x{6A1B}\x{6A1D}\x{6A1E}\x{6A1F}\x{6A20}\x{6A21}\x{6A22}\x{6A23}' . +'\x{6A25}\x{6A26}\x{6A27}\x{6A28}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2C}\x{6A2D}' . +'\x{6A2E}\x{6A2F}\x{6A30}\x{6A31}\x{6A32}\x{6A33}\x{6A34}\x{6A35}\x{6A36}' . +'\x{6A38}\x{6A39}\x{6A3A}\x{6A3B}\x{6A3C}\x{6A3D}\x{6A3E}\x{6A3F}\x{6A40}' . +'\x{6A41}\x{6A42}\x{6A43}\x{6A44}\x{6A45}\x{6A46}\x{6A47}\x{6A48}\x{6A49}' . +'\x{6A4B}\x{6A4C}\x{6A4D}\x{6A4E}\x{6A4F}\x{6A50}\x{6A51}\x{6A52}\x{6A54}' . +'\x{6A55}\x{6A56}\x{6A57}\x{6A58}\x{6A59}\x{6A5A}\x{6A5B}\x{6A5D}\x{6A5E}' . +'\x{6A5F}\x{6A60}\x{6A61}\x{6A62}\x{6A63}\x{6A64}\x{6A65}\x{6A66}\x{6A67}' . +'\x{6A68}\x{6A69}\x{6A6A}\x{6A6B}\x{6A6C}\x{6A6D}\x{6A6F}\x{6A71}\x{6A72}' . +'\x{6A73}\x{6A74}\x{6A75}\x{6A76}\x{6A77}\x{6A78}\x{6A79}\x{6A7A}\x{6A7B}' . +'\x{6A7C}\x{6A7D}\x{6A7E}\x{6A7F}\x{6A80}\x{6A81}\x{6A82}\x{6A83}\x{6A84}' . +'\x{6A85}\x{6A87}\x{6A88}\x{6A89}\x{6A8B}\x{6A8C}\x{6A8D}\x{6A8E}\x{6A90}' . +'\x{6A91}\x{6A92}\x{6A93}\x{6A94}\x{6A95}\x{6A96}\x{6A97}\x{6A98}\x{6A9A}' . +'\x{6A9B}\x{6A9C}\x{6A9E}\x{6A9F}\x{6AA0}\x{6AA1}\x{6AA2}\x{6AA3}\x{6AA4}' . +'\x{6AA5}\x{6AA6}\x{6AA7}\x{6AA8}\x{6AA9}\x{6AAB}\x{6AAC}\x{6AAD}\x{6AAE}' . +'\x{6AAF}\x{6AB0}\x{6AB2}\x{6AB3}\x{6AB4}\x{6AB5}\x{6AB6}\x{6AB7}\x{6AB8}' . +'\x{6AB9}\x{6ABA}\x{6ABB}\x{6ABC}\x{6ABD}\x{6ABF}\x{6AC1}\x{6AC2}\x{6AC3}' . +'\x{6AC5}\x{6AC6}\x{6AC7}\x{6ACA}\x{6ACB}\x{6ACC}\x{6ACD}\x{6ACE}\x{6ACF}' . +'\x{6AD0}\x{6AD1}\x{6AD2}\x{6AD3}\x{6AD4}\x{6AD5}\x{6AD6}\x{6AD7}\x{6AD9}' . +'\x{6ADA}\x{6ADB}\x{6ADC}\x{6ADD}\x{6ADE}\x{6ADF}\x{6AE0}\x{6AE1}\x{6AE2}' . +'\x{6AE3}\x{6AE4}\x{6AE5}\x{6AE6}\x{6AE7}\x{6AE8}\x{6AEA}\x{6AEB}\x{6AEC}' . +'\x{6AED}\x{6AEE}\x{6AEF}\x{6AF0}\x{6AF1}\x{6AF2}\x{6AF3}\x{6AF4}\x{6AF5}' . +'\x{6AF6}\x{6AF7}\x{6AF8}\x{6AF9}\x{6AFA}\x{6AFB}\x{6AFC}\x{6AFD}\x{6AFE}' . +'\x{6AFF}\x{6B00}\x{6B01}\x{6B02}\x{6B03}\x{6B04}\x{6B05}\x{6B06}\x{6B07}' . +'\x{6B08}\x{6B09}\x{6B0A}\x{6B0B}\x{6B0C}\x{6B0D}\x{6B0F}\x{6B10}\x{6B11}' . +'\x{6B12}\x{6B13}\x{6B14}\x{6B15}\x{6B16}\x{6B17}\x{6B18}\x{6B19}\x{6B1A}' . +'\x{6B1C}\x{6B1D}\x{6B1E}\x{6B1F}\x{6B20}\x{6B21}\x{6B22}\x{6B23}\x{6B24}' . +'\x{6B25}\x{6B26}\x{6B27}\x{6B28}\x{6B29}\x{6B2A}\x{6B2B}\x{6B2C}\x{6B2D}' . +'\x{6B2F}\x{6B30}\x{6B31}\x{6B32}\x{6B33}\x{6B34}\x{6B36}\x{6B37}\x{6B38}' . +'\x{6B39}\x{6B3A}\x{6B3B}\x{6B3C}\x{6B3D}\x{6B3E}\x{6B3F}\x{6B41}\x{6B42}' . +'\x{6B43}\x{6B44}\x{6B45}\x{6B46}\x{6B47}\x{6B48}\x{6B49}\x{6B4A}\x{6B4B}' . +'\x{6B4C}\x{6B4D}\x{6B4E}\x{6B4F}\x{6B50}\x{6B51}\x{6B52}\x{6B53}\x{6B54}' . +'\x{6B55}\x{6B56}\x{6B59}\x{6B5A}\x{6B5B}\x{6B5C}\x{6B5E}\x{6B5F}\x{6B60}' . +'\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B65}\x{6B66}\x{6B67}\x{6B69}\x{6B6A}' . +'\x{6B6B}\x{6B6D}\x{6B6F}\x{6B70}\x{6B72}\x{6B73}\x{6B74}\x{6B76}\x{6B77}' . +'\x{6B78}\x{6B79}\x{6B7A}\x{6B7B}\x{6B7C}\x{6B7E}\x{6B7F}\x{6B80}\x{6B81}' . +'\x{6B82}\x{6B83}\x{6B84}\x{6B85}\x{6B86}\x{6B87}\x{6B88}\x{6B89}\x{6B8A}' . +'\x{6B8B}\x{6B8C}\x{6B8D}\x{6B8E}\x{6B8F}\x{6B90}\x{6B91}\x{6B92}\x{6B93}' . +'\x{6B94}\x{6B95}\x{6B96}\x{6B97}\x{6B98}\x{6B99}\x{6B9A}\x{6B9B}\x{6B9C}' . +'\x{6B9D}\x{6B9E}\x{6B9F}\x{6BA0}\x{6BA1}\x{6BA2}\x{6BA3}\x{6BA4}\x{6BA5}' . +'\x{6BA6}\x{6BA7}\x{6BA8}\x{6BA9}\x{6BAA}\x{6BAB}\x{6BAC}\x{6BAD}\x{6BAE}' . +'\x{6BAF}\x{6BB0}\x{6BB2}\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB6}\x{6BB7}\x{6BB9}' . +'\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBD}\x{6BBE}\x{6BBF}\x{6BC0}\x{6BC1}\x{6BC2}' . +'\x{6BC3}\x{6BC4}\x{6BC5}\x{6BC6}\x{6BC7}\x{6BC8}\x{6BC9}\x{6BCA}\x{6BCB}' . +'\x{6BCC}\x{6BCD}\x{6BCE}\x{6BCF}\x{6BD0}\x{6BD1}\x{6BD2}\x{6BD3}\x{6BD4}' . +'\x{6BD5}\x{6BD6}\x{6BD7}\x{6BD8}\x{6BD9}\x{6BDA}\x{6BDB}\x{6BDC}\x{6BDD}' . +'\x{6BDE}\x{6BDF}\x{6BE0}\x{6BE1}\x{6BE2}\x{6BE3}\x{6BE4}\x{6BE5}\x{6BE6}' . +'\x{6BE7}\x{6BE8}\x{6BEA}\x{6BEB}\x{6BEC}\x{6BED}\x{6BEE}\x{6BEF}\x{6BF0}' . +'\x{6BF2}\x{6BF3}\x{6BF5}\x{6BF6}\x{6BF7}\x{6BF8}\x{6BF9}\x{6BFB}\x{6BFC}' . +'\x{6BFD}\x{6BFE}\x{6BFF}\x{6C00}\x{6C01}\x{6C02}\x{6C03}\x{6C04}\x{6C05}' . +'\x{6C06}\x{6C07}\x{6C08}\x{6C09}\x{6C0B}\x{6C0C}\x{6C0D}\x{6C0E}\x{6C0F}' . +'\x{6C10}\x{6C11}\x{6C12}\x{6C13}\x{6C14}\x{6C15}\x{6C16}\x{6C18}\x{6C19}' . +'\x{6C1A}\x{6C1B}\x{6C1D}\x{6C1E}\x{6C1F}\x{6C20}\x{6C21}\x{6C22}\x{6C23}' . +'\x{6C24}\x{6C25}\x{6C26}\x{6C27}\x{6C28}\x{6C29}\x{6C2A}\x{6C2B}\x{6C2C}' . +'\x{6C2E}\x{6C2F}\x{6C30}\x{6C31}\x{6C32}\x{6C33}\x{6C34}\x{6C35}\x{6C36}' . +'\x{6C37}\x{6C38}\x{6C3A}\x{6C3B}\x{6C3D}\x{6C3E}\x{6C3F}\x{6C40}\x{6C41}' . +'\x{6C42}\x{6C43}\x{6C44}\x{6C46}\x{6C47}\x{6C48}\x{6C49}\x{6C4A}\x{6C4B}' . +'\x{6C4C}\x{6C4D}\x{6C4E}\x{6C4F}\x{6C50}\x{6C51}\x{6C52}\x{6C53}\x{6C54}' . +'\x{6C55}\x{6C56}\x{6C57}\x{6C58}\x{6C59}\x{6C5A}\x{6C5B}\x{6C5C}\x{6C5D}' . +'\x{6C5E}\x{6C5F}\x{6C60}\x{6C61}\x{6C62}\x{6C63}\x{6C64}\x{6C65}\x{6C66}' . +'\x{6C67}\x{6C68}\x{6C69}\x{6C6A}\x{6C6B}\x{6C6D}\x{6C6F}\x{6C70}\x{6C71}' . +'\x{6C72}\x{6C73}\x{6C74}\x{6C75}\x{6C76}\x{6C77}\x{6C78}\x{6C79}\x{6C7A}' . +'\x{6C7B}\x{6C7C}\x{6C7D}\x{6C7E}\x{6C7F}\x{6C80}\x{6C81}\x{6C82}\x{6C83}' . +'\x{6C84}\x{6C85}\x{6C86}\x{6C87}\x{6C88}\x{6C89}\x{6C8A}\x{6C8B}\x{6C8C}' . +'\x{6C8D}\x{6C8E}\x{6C8F}\x{6C90}\x{6C91}\x{6C92}\x{6C93}\x{6C94}\x{6C95}' . +'\x{6C96}\x{6C97}\x{6C98}\x{6C99}\x{6C9A}\x{6C9B}\x{6C9C}\x{6C9D}\x{6C9E}' . +'\x{6C9F}\x{6CA1}\x{6CA2}\x{6CA3}\x{6CA4}\x{6CA5}\x{6CA6}\x{6CA7}\x{6CA8}' . +'\x{6CA9}\x{6CAA}\x{6CAB}\x{6CAC}\x{6CAD}\x{6CAE}\x{6CAF}\x{6CB0}\x{6CB1}' . +'\x{6CB2}\x{6CB3}\x{6CB4}\x{6CB5}\x{6CB6}\x{6CB7}\x{6CB8}\x{6CB9}\x{6CBA}' . +'\x{6CBB}\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC0}\x{6CC1}\x{6CC2}\x{6CC3}' . +'\x{6CC4}\x{6CC5}\x{6CC6}\x{6CC7}\x{6CC8}\x{6CC9}\x{6CCA}\x{6CCB}\x{6CCC}' . +'\x{6CCD}\x{6CCE}\x{6CCF}\x{6CD0}\x{6CD1}\x{6CD2}\x{6CD3}\x{6CD4}\x{6CD5}' . +'\x{6CD6}\x{6CD7}\x{6CD9}\x{6CDA}\x{6CDB}\x{6CDC}\x{6CDD}\x{6CDE}\x{6CDF}' . +'\x{6CE0}\x{6CE1}\x{6CE2}\x{6CE3}\x{6CE4}\x{6CE5}\x{6CE6}\x{6CE7}\x{6CE8}' . +'\x{6CE9}\x{6CEA}\x{6CEB}\x{6CEC}\x{6CED}\x{6CEE}\x{6CEF}\x{6CF0}\x{6CF1}' . +'\x{6CF2}\x{6CF3}\x{6CF5}\x{6CF6}\x{6CF7}\x{6CF8}\x{6CF9}\x{6CFA}\x{6CFB}' . +'\x{6CFC}\x{6CFD}\x{6CFE}\x{6CFF}\x{6D00}\x{6D01}\x{6D03}\x{6D04}\x{6D05}' . +'\x{6D06}\x{6D07}\x{6D08}\x{6D09}\x{6D0A}\x{6D0B}\x{6D0C}\x{6D0D}\x{6D0E}' . +'\x{6D0F}\x{6D10}\x{6D11}\x{6D12}\x{6D13}\x{6D14}\x{6D15}\x{6D16}\x{6D17}' . +'\x{6D18}\x{6D19}\x{6D1A}\x{6D1B}\x{6D1D}\x{6D1E}\x{6D1F}\x{6D20}\x{6D21}' . +'\x{6D22}\x{6D23}\x{6D25}\x{6D26}\x{6D27}\x{6D28}\x{6D29}\x{6D2A}\x{6D2B}' . +'\x{6D2C}\x{6D2D}\x{6D2E}\x{6D2F}\x{6D30}\x{6D31}\x{6D32}\x{6D33}\x{6D34}' . +'\x{6D35}\x{6D36}\x{6D37}\x{6D38}\x{6D39}\x{6D3A}\x{6D3B}\x{6D3C}\x{6D3D}' . +'\x{6D3E}\x{6D3F}\x{6D40}\x{6D41}\x{6D42}\x{6D43}\x{6D44}\x{6D45}\x{6D46}' . +'\x{6D47}\x{6D48}\x{6D49}\x{6D4A}\x{6D4B}\x{6D4C}\x{6D4D}\x{6D4E}\x{6D4F}' . +'\x{6D50}\x{6D51}\x{6D52}\x{6D53}\x{6D54}\x{6D55}\x{6D56}\x{6D57}\x{6D58}' . +'\x{6D59}\x{6D5A}\x{6D5B}\x{6D5C}\x{6D5D}\x{6D5E}\x{6D5F}\x{6D60}\x{6D61}' . +'\x{6D62}\x{6D63}\x{6D64}\x{6D65}\x{6D66}\x{6D67}\x{6D68}\x{6D69}\x{6D6A}' . +'\x{6D6B}\x{6D6C}\x{6D6D}\x{6D6E}\x{6D6F}\x{6D70}\x{6D72}\x{6D73}\x{6D74}' . +'\x{6D75}\x{6D76}\x{6D77}\x{6D78}\x{6D79}\x{6D7A}\x{6D7B}\x{6D7C}\x{6D7D}' . +'\x{6D7E}\x{6D7F}\x{6D80}\x{6D82}\x{6D83}\x{6D84}\x{6D85}\x{6D86}\x{6D87}' . +'\x{6D88}\x{6D89}\x{6D8A}\x{6D8B}\x{6D8C}\x{6D8D}\x{6D8E}\x{6D8F}\x{6D90}' . +'\x{6D91}\x{6D92}\x{6D93}\x{6D94}\x{6D95}\x{6D97}\x{6D98}\x{6D99}\x{6D9A}' . +'\x{6D9B}\x{6D9D}\x{6D9E}\x{6D9F}\x{6DA0}\x{6DA1}\x{6DA2}\x{6DA3}\x{6DA4}' . +'\x{6DA5}\x{6DA6}\x{6DA7}\x{6DA8}\x{6DA9}\x{6DAA}\x{6DAB}\x{6DAC}\x{6DAD}' . +'\x{6DAE}\x{6DAF}\x{6DB2}\x{6DB3}\x{6DB4}\x{6DB5}\x{6DB7}\x{6DB8}\x{6DB9}' . +'\x{6DBA}\x{6DBB}\x{6DBC}\x{6DBD}\x{6DBE}\x{6DBF}\x{6DC0}\x{6DC1}\x{6DC2}' . +'\x{6DC3}\x{6DC4}\x{6DC5}\x{6DC6}\x{6DC7}\x{6DC8}\x{6DC9}\x{6DCA}\x{6DCB}' . +'\x{6DCC}\x{6DCD}\x{6DCE}\x{6DCF}\x{6DD0}\x{6DD1}\x{6DD2}\x{6DD3}\x{6DD4}' . +'\x{6DD5}\x{6DD6}\x{6DD7}\x{6DD8}\x{6DD9}\x{6DDA}\x{6DDB}\x{6DDC}\x{6DDD}' . +'\x{6DDE}\x{6DDF}\x{6DE0}\x{6DE1}\x{6DE2}\x{6DE3}\x{6DE4}\x{6DE5}\x{6DE6}' . +'\x{6DE7}\x{6DE8}\x{6DE9}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DED}\x{6DEE}\x{6DEF}' . +'\x{6DF0}\x{6DF1}\x{6DF2}\x{6DF3}\x{6DF4}\x{6DF5}\x{6DF6}\x{6DF7}\x{6DF8}' . +'\x{6DF9}\x{6DFA}\x{6DFB}\x{6DFC}\x{6DFD}\x{6E00}\x{6E03}\x{6E04}\x{6E05}' . +'\x{6E07}\x{6E08}\x{6E09}\x{6E0A}\x{6E0B}\x{6E0C}\x{6E0D}\x{6E0E}\x{6E0F}' . +'\x{6E10}\x{6E11}\x{6E14}\x{6E15}\x{6E16}\x{6E17}\x{6E19}\x{6E1A}\x{6E1B}' . +'\x{6E1C}\x{6E1D}\x{6E1E}\x{6E1F}\x{6E20}\x{6E21}\x{6E22}\x{6E23}\x{6E24}' . +'\x{6E25}\x{6E26}\x{6E27}\x{6E28}\x{6E29}\x{6E2B}\x{6E2C}\x{6E2D}\x{6E2E}' . +'\x{6E2F}\x{6E30}\x{6E31}\x{6E32}\x{6E33}\x{6E34}\x{6E35}\x{6E36}\x{6E37}' . +'\x{6E38}\x{6E39}\x{6E3A}\x{6E3B}\x{6E3C}\x{6E3D}\x{6E3E}\x{6E3F}\x{6E40}' . +'\x{6E41}\x{6E42}\x{6E43}\x{6E44}\x{6E45}\x{6E46}\x{6E47}\x{6E48}\x{6E49}' . +'\x{6E4A}\x{6E4B}\x{6E4D}\x{6E4E}\x{6E4F}\x{6E50}\x{6E51}\x{6E52}\x{6E53}' . +'\x{6E54}\x{6E55}\x{6E56}\x{6E57}\x{6E58}\x{6E59}\x{6E5A}\x{6E5B}\x{6E5C}' . +'\x{6E5D}\x{6E5E}\x{6E5F}\x{6E60}\x{6E61}\x{6E62}\x{6E63}\x{6E64}\x{6E65}' . +'\x{6E66}\x{6E67}\x{6E68}\x{6E69}\x{6E6A}\x{6E6B}\x{6E6D}\x{6E6E}\x{6E6F}' . +'\x{6E70}\x{6E71}\x{6E72}\x{6E73}\x{6E74}\x{6E75}\x{6E77}\x{6E78}\x{6E79}' . +'\x{6E7E}\x{6E7F}\x{6E80}\x{6E81}\x{6E82}\x{6E83}\x{6E84}\x{6E85}\x{6E86}' . +'\x{6E87}\x{6E88}\x{6E89}\x{6E8A}\x{6E8D}\x{6E8E}\x{6E8F}\x{6E90}\x{6E91}' . +'\x{6E92}\x{6E93}\x{6E94}\x{6E96}\x{6E97}\x{6E98}\x{6E99}\x{6E9A}\x{6E9B}' . +'\x{6E9C}\x{6E9D}\x{6E9E}\x{6E9F}\x{6EA0}\x{6EA1}\x{6EA2}\x{6EA3}\x{6EA4}' . +'\x{6EA5}\x{6EA6}\x{6EA7}\x{6EA8}\x{6EA9}\x{6EAA}\x{6EAB}\x{6EAC}\x{6EAD}' . +'\x{6EAE}\x{6EAF}\x{6EB0}\x{6EB1}\x{6EB2}\x{6EB3}\x{6EB4}\x{6EB5}\x{6EB6}' . +'\x{6EB7}\x{6EB8}\x{6EB9}\x{6EBA}\x{6EBB}\x{6EBC}\x{6EBD}\x{6EBE}\x{6EBF}' . +'\x{6EC0}\x{6EC1}\x{6EC2}\x{6EC3}\x{6EC4}\x{6EC5}\x{6EC6}\x{6EC7}\x{6EC8}' . +'\x{6EC9}\x{6ECA}\x{6ECB}\x{6ECC}\x{6ECD}\x{6ECE}\x{6ECF}\x{6ED0}\x{6ED1}' . +'\x{6ED2}\x{6ED3}\x{6ED4}\x{6ED5}\x{6ED6}\x{6ED7}\x{6ED8}\x{6ED9}\x{6EDA}' . +'\x{6EDC}\x{6EDE}\x{6EDF}\x{6EE0}\x{6EE1}\x{6EE2}\x{6EE4}\x{6EE5}\x{6EE6}' . +'\x{6EE7}\x{6EE8}\x{6EE9}\x{6EEA}\x{6EEB}\x{6EEC}\x{6EED}\x{6EEE}\x{6EEF}' . +'\x{6EF0}\x{6EF1}\x{6EF2}\x{6EF3}\x{6EF4}\x{6EF5}\x{6EF6}\x{6EF7}\x{6EF8}' . +'\x{6EF9}\x{6EFA}\x{6EFB}\x{6EFC}\x{6EFD}\x{6EFE}\x{6EFF}\x{6F00}\x{6F01}' . +'\x{6F02}\x{6F03}\x{6F05}\x{6F06}\x{6F07}\x{6F08}\x{6F09}\x{6F0A}\x{6F0C}' . +'\x{6F0D}\x{6F0E}\x{6F0F}\x{6F10}\x{6F11}\x{6F12}\x{6F13}\x{6F14}\x{6F15}' . +'\x{6F16}\x{6F17}\x{6F18}\x{6F19}\x{6F1A}\x{6F1B}\x{6F1C}\x{6F1D}\x{6F1E}' . +'\x{6F1F}\x{6F20}\x{6F21}\x{6F22}\x{6F23}\x{6F24}\x{6F25}\x{6F26}\x{6F27}' . +'\x{6F28}\x{6F29}\x{6F2A}\x{6F2B}\x{6F2C}\x{6F2D}\x{6F2E}\x{6F2F}\x{6F30}' . +'\x{6F31}\x{6F32}\x{6F33}\x{6F34}\x{6F35}\x{6F36}\x{6F37}\x{6F38}\x{6F39}' . +'\x{6F3A}\x{6F3B}\x{6F3C}\x{6F3D}\x{6F3E}\x{6F3F}\x{6F40}\x{6F41}\x{6F43}' . +'\x{6F44}\x{6F45}\x{6F46}\x{6F47}\x{6F49}\x{6F4B}\x{6F4C}\x{6F4D}\x{6F4E}' . +'\x{6F4F}\x{6F50}\x{6F51}\x{6F52}\x{6F53}\x{6F54}\x{6F55}\x{6F56}\x{6F57}' . +'\x{6F58}\x{6F59}\x{6F5A}\x{6F5B}\x{6F5C}\x{6F5D}\x{6F5E}\x{6F5F}\x{6F60}' . +'\x{6F61}\x{6F62}\x{6F63}\x{6F64}\x{6F65}\x{6F66}\x{6F67}\x{6F68}\x{6F69}' . +'\x{6F6A}\x{6F6B}\x{6F6C}\x{6F6D}\x{6F6E}\x{6F6F}\x{6F70}\x{6F71}\x{6F72}' . +'\x{6F73}\x{6F74}\x{6F75}\x{6F76}\x{6F77}\x{6F78}\x{6F7A}\x{6F7B}\x{6F7C}' . +'\x{6F7D}\x{6F7E}\x{6F7F}\x{6F80}\x{6F81}\x{6F82}\x{6F83}\x{6F84}\x{6F85}' . +'\x{6F86}\x{6F87}\x{6F88}\x{6F89}\x{6F8A}\x{6F8B}\x{6F8C}\x{6F8D}\x{6F8E}' . +'\x{6F8F}\x{6F90}\x{6F91}\x{6F92}\x{6F93}\x{6F94}\x{6F95}\x{6F96}\x{6F97}' . +'\x{6F99}\x{6F9B}\x{6F9C}\x{6F9D}\x{6F9E}\x{6FA0}\x{6FA1}\x{6FA2}\x{6FA3}' . +'\x{6FA4}\x{6FA5}\x{6FA6}\x{6FA7}\x{6FA8}\x{6FA9}\x{6FAA}\x{6FAB}\x{6FAC}' . +'\x{6FAD}\x{6FAE}\x{6FAF}\x{6FB0}\x{6FB1}\x{6FB2}\x{6FB3}\x{6FB4}\x{6FB5}' . +'\x{6FB6}\x{6FB8}\x{6FB9}\x{6FBA}\x{6FBB}\x{6FBC}\x{6FBD}\x{6FBE}\x{6FBF}' . +'\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC4}\x{6FC6}\x{6FC7}\x{6FC8}\x{6FC9}' . +'\x{6FCA}\x{6FCB}\x{6FCC}\x{6FCD}\x{6FCE}\x{6FCF}\x{6FD1}\x{6FD2}\x{6FD4}' . +'\x{6FD5}\x{6FD6}\x{6FD7}\x{6FD8}\x{6FD9}\x{6FDA}\x{6FDB}\x{6FDC}\x{6FDD}' . +'\x{6FDE}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE2}\x{6FE3}\x{6FE4}\x{6FE5}\x{6FE6}' . +'\x{6FE7}\x{6FE8}\x{6FE9}\x{6FEA}\x{6FEB}\x{6FEC}\x{6FED}\x{6FEE}\x{6FEF}' . +'\x{6FF0}\x{6FF1}\x{6FF2}\x{6FF3}\x{6FF4}\x{6FF6}\x{6FF7}\x{6FF8}\x{6FF9}' . +'\x{6FFA}\x{6FFB}\x{6FFC}\x{6FFE}\x{6FFF}\x{7000}\x{7001}\x{7002}\x{7003}' . +'\x{7004}\x{7005}\x{7006}\x{7007}\x{7008}\x{7009}\x{700A}\x{700B}\x{700C}' . +'\x{700D}\x{700E}\x{700F}\x{7011}\x{7012}\x{7014}\x{7015}\x{7016}\x{7017}' . +'\x{7018}\x{7019}\x{701A}\x{701B}\x{701C}\x{701D}\x{701F}\x{7020}\x{7021}' . +'\x{7022}\x{7023}\x{7024}\x{7025}\x{7026}\x{7027}\x{7028}\x{7029}\x{702A}' . +'\x{702B}\x{702C}\x{702D}\x{702E}\x{702F}\x{7030}\x{7031}\x{7032}\x{7033}' . +'\x{7034}\x{7035}\x{7036}\x{7037}\x{7038}\x{7039}\x{703A}\x{703B}\x{703C}' . +'\x{703D}\x{703E}\x{703F}\x{7040}\x{7041}\x{7042}\x{7043}\x{7044}\x{7045}' . +'\x{7046}\x{7048}\x{7049}\x{704A}\x{704C}\x{704D}\x{704F}\x{7050}\x{7051}' . +'\x{7052}\x{7053}\x{7054}\x{7055}\x{7056}\x{7057}\x{7058}\x{7059}\x{705A}' . +'\x{705B}\x{705C}\x{705D}\x{705E}\x{705F}\x{7060}\x{7061}\x{7062}\x{7063}' . +'\x{7064}\x{7065}\x{7066}\x{7067}\x{7068}\x{7069}\x{706A}\x{706B}\x{706C}' . +'\x{706D}\x{706E}\x{706F}\x{7070}\x{7071}\x{7074}\x{7075}\x{7076}\x{7077}' . +'\x{7078}\x{7079}\x{707A}\x{707C}\x{707D}\x{707E}\x{707F}\x{7080}\x{7082}' . +'\x{7083}\x{7084}\x{7085}\x{7086}\x{7087}\x{7088}\x{7089}\x{708A}\x{708B}' . +'\x{708C}\x{708E}\x{708F}\x{7090}\x{7091}\x{7092}\x{7093}\x{7094}\x{7095}' . +'\x{7096}\x{7098}\x{7099}\x{709A}\x{709C}\x{709D}\x{709E}\x{709F}\x{70A0}' . +'\x{70A1}\x{70A2}\x{70A3}\x{70A4}\x{70A5}\x{70A6}\x{70A7}\x{70A8}\x{70A9}' . +'\x{70AB}\x{70AC}\x{70AD}\x{70AE}\x{70AF}\x{70B0}\x{70B1}\x{70B3}\x{70B4}' . +'\x{70B5}\x{70B7}\x{70B8}\x{70B9}\x{70BA}\x{70BB}\x{70BC}\x{70BD}\x{70BE}' . +'\x{70BF}\x{70C0}\x{70C1}\x{70C2}\x{70C3}\x{70C4}\x{70C5}\x{70C6}\x{70C7}' . +'\x{70C8}\x{70C9}\x{70CA}\x{70CB}\x{70CC}\x{70CD}\x{70CE}\x{70CF}\x{70D0}' . +'\x{70D1}\x{70D2}\x{70D3}\x{70D4}\x{70D6}\x{70D7}\x{70D8}\x{70D9}\x{70DA}' . +'\x{70DB}\x{70DC}\x{70DD}\x{70DE}\x{70DF}\x{70E0}\x{70E1}\x{70E2}\x{70E3}' . +'\x{70E4}\x{70E5}\x{70E6}\x{70E7}\x{70E8}\x{70E9}\x{70EA}\x{70EB}\x{70EC}' . +'\x{70ED}\x{70EE}\x{70EF}\x{70F0}\x{70F1}\x{70F2}\x{70F3}\x{70F4}\x{70F5}' . +'\x{70F6}\x{70F7}\x{70F8}\x{70F9}\x{70FA}\x{70FB}\x{70FC}\x{70FD}\x{70FF}' . +'\x{7100}\x{7101}\x{7102}\x{7103}\x{7104}\x{7105}\x{7106}\x{7107}\x{7109}' . +'\x{710A}\x{710B}\x{710C}\x{710D}\x{710E}\x{710F}\x{7110}\x{7111}\x{7112}' . +'\x{7113}\x{7115}\x{7116}\x{7117}\x{7118}\x{7119}\x{711A}\x{711B}\x{711C}' . +'\x{711D}\x{711E}\x{711F}\x{7120}\x{7121}\x{7122}\x{7123}\x{7125}\x{7126}' . +'\x{7127}\x{7128}\x{7129}\x{712A}\x{712B}\x{712C}\x{712D}\x{712E}\x{712F}' . +'\x{7130}\x{7131}\x{7132}\x{7135}\x{7136}\x{7137}\x{7138}\x{7139}\x{713A}' . +'\x{713B}\x{713D}\x{713E}\x{713F}\x{7140}\x{7141}\x{7142}\x{7143}\x{7144}' . +'\x{7145}\x{7146}\x{7147}\x{7148}\x{7149}\x{714A}\x{714B}\x{714C}\x{714D}' . +'\x{714E}\x{714F}\x{7150}\x{7151}\x{7152}\x{7153}\x{7154}\x{7156}\x{7158}' . +'\x{7159}\x{715A}\x{715B}\x{715C}\x{715D}\x{715E}\x{715F}\x{7160}\x{7161}' . +'\x{7162}\x{7163}\x{7164}\x{7165}\x{7166}\x{7167}\x{7168}\x{7169}\x{716A}' . +'\x{716C}\x{716E}\x{716F}\x{7170}\x{7171}\x{7172}\x{7173}\x{7174}\x{7175}' . +'\x{7176}\x{7177}\x{7178}\x{7179}\x{717A}\x{717B}\x{717C}\x{717D}\x{717E}' . +'\x{717F}\x{7180}\x{7181}\x{7182}\x{7183}\x{7184}\x{7185}\x{7186}\x{7187}' . +'\x{7188}\x{7189}\x{718A}\x{718B}\x{718C}\x{718E}\x{718F}\x{7190}\x{7191}' . +'\x{7192}\x{7193}\x{7194}\x{7195}\x{7197}\x{7198}\x{7199}\x{719A}\x{719B}' . +'\x{719C}\x{719D}\x{719E}\x{719F}\x{71A0}\x{71A1}\x{71A2}\x{71A3}\x{71A4}' . +'\x{71A5}\x{71A7}\x{71A8}\x{71A9}\x{71AA}\x{71AC}\x{71AD}\x{71AE}\x{71AF}' . +'\x{71B0}\x{71B1}\x{71B2}\x{71B3}\x{71B4}\x{71B5}\x{71B7}\x{71B8}\x{71B9}' . +'\x{71BA}\x{71BB}\x{71BC}\x{71BD}\x{71BE}\x{71BF}\x{71C0}\x{71C1}\x{71C2}' . +'\x{71C3}\x{71C4}\x{71C5}\x{71C6}\x{71C7}\x{71C8}\x{71C9}\x{71CA}\x{71CB}' . +'\x{71CD}\x{71CE}\x{71CF}\x{71D0}\x{71D1}\x{71D2}\x{71D4}\x{71D5}\x{71D6}' . +'\x{71D7}\x{71D8}\x{71D9}\x{71DA}\x{71DB}\x{71DC}\x{71DD}\x{71DE}\x{71DF}' . +'\x{71E0}\x{71E1}\x{71E2}\x{71E3}\x{71E4}\x{71E5}\x{71E6}\x{71E7}\x{71E8}' . +'\x{71E9}\x{71EA}\x{71EB}\x{71EC}\x{71ED}\x{71EE}\x{71EF}\x{71F0}\x{71F1}' . +'\x{71F2}\x{71F4}\x{71F5}\x{71F6}\x{71F7}\x{71F8}\x{71F9}\x{71FB}\x{71FC}' . +'\x{71FD}\x{71FE}\x{71FF}\x{7201}\x{7202}\x{7203}\x{7204}\x{7205}\x{7206}' . +'\x{7207}\x{7208}\x{7209}\x{720A}\x{720C}\x{720D}\x{720E}\x{720F}\x{7210}' . +'\x{7212}\x{7213}\x{7214}\x{7216}\x{7218}\x{7219}\x{721A}\x{721B}\x{721C}' . +'\x{721D}\x{721E}\x{721F}\x{7221}\x{7222}\x{7223}\x{7226}\x{7227}\x{7228}' . +'\x{7229}\x{722A}\x{722B}\x{722C}\x{722D}\x{722E}\x{7230}\x{7231}\x{7232}' . +'\x{7233}\x{7235}\x{7236}\x{7237}\x{7238}\x{7239}\x{723A}\x{723B}\x{723C}' . +'\x{723D}\x{723E}\x{723F}\x{7240}\x{7241}\x{7242}\x{7243}\x{7244}\x{7246}' . +'\x{7247}\x{7248}\x{7249}\x{724A}\x{724B}\x{724C}\x{724D}\x{724F}\x{7251}' . +'\x{7252}\x{7253}\x{7254}\x{7256}\x{7257}\x{7258}\x{7259}\x{725A}\x{725B}' . +'\x{725C}\x{725D}\x{725E}\x{725F}\x{7260}\x{7261}\x{7262}\x{7263}\x{7264}' . +'\x{7265}\x{7266}\x{7267}\x{7268}\x{7269}\x{726A}\x{726B}\x{726C}\x{726D}' . +'\x{726E}\x{726F}\x{7270}\x{7271}\x{7272}\x{7273}\x{7274}\x{7275}\x{7276}' . +'\x{7277}\x{7278}\x{7279}\x{727A}\x{727B}\x{727C}\x{727D}\x{727E}\x{727F}' . +'\x{7280}\x{7281}\x{7282}\x{7283}\x{7284}\x{7285}\x{7286}\x{7287}\x{7288}' . +'\x{7289}\x{728A}\x{728B}\x{728C}\x{728D}\x{728E}\x{728F}\x{7290}\x{7291}' . +'\x{7292}\x{7293}\x{7294}\x{7295}\x{7296}\x{7297}\x{7298}\x{7299}\x{729A}' . +'\x{729B}\x{729C}\x{729D}\x{729E}\x{729F}\x{72A1}\x{72A2}\x{72A3}\x{72A4}' . +'\x{72A5}\x{72A6}\x{72A7}\x{72A8}\x{72A9}\x{72AA}\x{72AC}\x{72AD}\x{72AE}' . +'\x{72AF}\x{72B0}\x{72B1}\x{72B2}\x{72B3}\x{72B4}\x{72B5}\x{72B6}\x{72B7}' . +'\x{72B8}\x{72B9}\x{72BA}\x{72BB}\x{72BC}\x{72BD}\x{72BF}\x{72C0}\x{72C1}' . +'\x{72C2}\x{72C3}\x{72C4}\x{72C5}\x{72C6}\x{72C7}\x{72C8}\x{72C9}\x{72CA}' . +'\x{72CB}\x{72CC}\x{72CD}\x{72CE}\x{72CF}\x{72D0}\x{72D1}\x{72D2}\x{72D3}' . +'\x{72D4}\x{72D5}\x{72D6}\x{72D7}\x{72D8}\x{72D9}\x{72DA}\x{72DB}\x{72DC}' . +'\x{72DD}\x{72DE}\x{72DF}\x{72E0}\x{72E1}\x{72E2}\x{72E3}\x{72E4}\x{72E5}' . +'\x{72E6}\x{72E7}\x{72E8}\x{72E9}\x{72EA}\x{72EB}\x{72EC}\x{72ED}\x{72EE}' . +'\x{72EF}\x{72F0}\x{72F1}\x{72F2}\x{72F3}\x{72F4}\x{72F5}\x{72F6}\x{72F7}' . +'\x{72F8}\x{72F9}\x{72FA}\x{72FB}\x{72FC}\x{72FD}\x{72FE}\x{72FF}\x{7300}' . +'\x{7301}\x{7303}\x{7304}\x{7305}\x{7306}\x{7307}\x{7308}\x{7309}\x{730A}' . +'\x{730B}\x{730C}\x{730D}\x{730E}\x{730F}\x{7311}\x{7312}\x{7313}\x{7314}' . +'\x{7315}\x{7316}\x{7317}\x{7318}\x{7319}\x{731A}\x{731B}\x{731C}\x{731D}' . +'\x{731E}\x{7320}\x{7321}\x{7322}\x{7323}\x{7324}\x{7325}\x{7326}\x{7327}' . +'\x{7329}\x{732A}\x{732B}\x{732C}\x{732D}\x{732E}\x{7330}\x{7331}\x{7332}' . +'\x{7333}\x{7334}\x{7335}\x{7336}\x{7337}\x{7338}\x{7339}\x{733A}\x{733B}' . +'\x{733C}\x{733D}\x{733E}\x{733F}\x{7340}\x{7341}\x{7342}\x{7343}\x{7344}' . +'\x{7345}\x{7346}\x{7347}\x{7348}\x{7349}\x{734A}\x{734B}\x{734C}\x{734D}' . +'\x{734E}\x{7350}\x{7351}\x{7352}\x{7354}\x{7355}\x{7356}\x{7357}\x{7358}' . +'\x{7359}\x{735A}\x{735B}\x{735C}\x{735D}\x{735E}\x{735F}\x{7360}\x{7361}' . +'\x{7362}\x{7364}\x{7365}\x{7366}\x{7367}\x{7368}\x{7369}\x{736A}\x{736B}' . +'\x{736C}\x{736D}\x{736E}\x{736F}\x{7370}\x{7371}\x{7372}\x{7373}\x{7374}' . +'\x{7375}\x{7376}\x{7377}\x{7378}\x{7379}\x{737A}\x{737B}\x{737C}\x{737D}' . +'\x{737E}\x{737F}\x{7380}\x{7381}\x{7382}\x{7383}\x{7384}\x{7385}\x{7386}' . +'\x{7387}\x{7388}\x{7389}\x{738A}\x{738B}\x{738C}\x{738D}\x{738E}\x{738F}' . +'\x{7390}\x{7391}\x{7392}\x{7393}\x{7394}\x{7395}\x{7396}\x{7397}\x{7398}' . +'\x{7399}\x{739A}\x{739B}\x{739D}\x{739E}\x{739F}\x{73A0}\x{73A1}\x{73A2}' . +'\x{73A3}\x{73A4}\x{73A5}\x{73A6}\x{73A7}\x{73A8}\x{73A9}\x{73AA}\x{73AB}' . +'\x{73AC}\x{73AD}\x{73AE}\x{73AF}\x{73B0}\x{73B1}\x{73B2}\x{73B3}\x{73B4}' . +'\x{73B5}\x{73B6}\x{73B7}\x{73B8}\x{73B9}\x{73BA}\x{73BB}\x{73BC}\x{73BD}' . +'\x{73BE}\x{73BF}\x{73C0}\x{73C2}\x{73C3}\x{73C4}\x{73C5}\x{73C6}\x{73C7}' . +'\x{73C8}\x{73C9}\x{73CA}\x{73CB}\x{73CC}\x{73CD}\x{73CE}\x{73CF}\x{73D0}' . +'\x{73D1}\x{73D2}\x{73D3}\x{73D4}\x{73D5}\x{73D6}\x{73D7}\x{73D8}\x{73D9}' . +'\x{73DA}\x{73DB}\x{73DC}\x{73DD}\x{73DE}\x{73DF}\x{73E0}\x{73E2}\x{73E3}' . +'\x{73E5}\x{73E6}\x{73E7}\x{73E8}\x{73E9}\x{73EA}\x{73EB}\x{73EC}\x{73ED}' . +'\x{73EE}\x{73EF}\x{73F0}\x{73F1}\x{73F2}\x{73F4}\x{73F5}\x{73F6}\x{73F7}' . +'\x{73F8}\x{73F9}\x{73FA}\x{73FC}\x{73FD}\x{73FE}\x{73FF}\x{7400}\x{7401}' . +'\x{7402}\x{7403}\x{7404}\x{7405}\x{7406}\x{7407}\x{7408}\x{7409}\x{740A}' . +'\x{740B}\x{740C}\x{740D}\x{740E}\x{740F}\x{7410}\x{7411}\x{7412}\x{7413}' . +'\x{7414}\x{7415}\x{7416}\x{7417}\x{7419}\x{741A}\x{741B}\x{741C}\x{741D}' . +'\x{741E}\x{741F}\x{7420}\x{7421}\x{7422}\x{7423}\x{7424}\x{7425}\x{7426}' . +'\x{7427}\x{7428}\x{7429}\x{742A}\x{742B}\x{742C}\x{742D}\x{742E}\x{742F}' . +'\x{7430}\x{7431}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{7437}\x{7438}' . +'\x{743A}\x{743B}\x{743C}\x{743D}\x{743F}\x{7440}\x{7441}\x{7442}\x{7443}' . +'\x{7444}\x{7445}\x{7446}\x{7448}\x{744A}\x{744B}\x{744C}\x{744D}\x{744E}' . +'\x{744F}\x{7450}\x{7451}\x{7452}\x{7453}\x{7454}\x{7455}\x{7456}\x{7457}' . +'\x{7459}\x{745A}\x{745B}\x{745C}\x{745D}\x{745E}\x{745F}\x{7461}\x{7462}' . +'\x{7463}\x{7464}\x{7465}\x{7466}\x{7467}\x{7468}\x{7469}\x{746A}\x{746B}' . +'\x{746C}\x{746D}\x{746E}\x{746F}\x{7470}\x{7471}\x{7472}\x{7473}\x{7474}' . +'\x{7475}\x{7476}\x{7477}\x{7478}\x{7479}\x{747A}\x{747C}\x{747D}\x{747E}' . +'\x{747F}\x{7480}\x{7481}\x{7482}\x{7483}\x{7485}\x{7486}\x{7487}\x{7488}' . +'\x{7489}\x{748A}\x{748B}\x{748C}\x{748D}\x{748E}\x{748F}\x{7490}\x{7491}' . +'\x{7492}\x{7493}\x{7494}\x{7495}\x{7497}\x{7498}\x{7499}\x{749A}\x{749B}' . +'\x{749C}\x{749E}\x{749F}\x{74A0}\x{74A1}\x{74A3}\x{74A4}\x{74A5}\x{74A6}' . +'\x{74A7}\x{74A8}\x{74A9}\x{74AA}\x{74AB}\x{74AC}\x{74AD}\x{74AE}\x{74AF}' . +'\x{74B0}\x{74B1}\x{74B2}\x{74B3}\x{74B4}\x{74B5}\x{74B6}\x{74B7}\x{74B8}' . +'\x{74B9}\x{74BA}\x{74BB}\x{74BC}\x{74BD}\x{74BE}\x{74BF}\x{74C0}\x{74C1}' . +'\x{74C2}\x{74C3}\x{74C4}\x{74C5}\x{74C6}\x{74CA}\x{74CB}\x{74CD}\x{74CE}' . +'\x{74CF}\x{74D0}\x{74D1}\x{74D2}\x{74D3}\x{74D4}\x{74D5}\x{74D6}\x{74D7}' . +'\x{74D8}\x{74D9}\x{74DA}\x{74DB}\x{74DC}\x{74DD}\x{74DE}\x{74DF}\x{74E0}' . +'\x{74E1}\x{74E2}\x{74E3}\x{74E4}\x{74E5}\x{74E6}\x{74E7}\x{74E8}\x{74E9}' . +'\x{74EA}\x{74EC}\x{74ED}\x{74EE}\x{74EF}\x{74F0}\x{74F1}\x{74F2}\x{74F3}' . +'\x{74F4}\x{74F5}\x{74F6}\x{74F7}\x{74F8}\x{74F9}\x{74FA}\x{74FB}\x{74FC}' . +'\x{74FD}\x{74FE}\x{74FF}\x{7500}\x{7501}\x{7502}\x{7503}\x{7504}\x{7505}' . +'\x{7506}\x{7507}\x{7508}\x{7509}\x{750A}\x{750B}\x{750C}\x{750D}\x{750F}' . +'\x{7510}\x{7511}\x{7512}\x{7513}\x{7514}\x{7515}\x{7516}\x{7517}\x{7518}' . +'\x{7519}\x{751A}\x{751B}\x{751C}\x{751D}\x{751E}\x{751F}\x{7521}\x{7522}' . +'\x{7523}\x{7524}\x{7525}\x{7526}\x{7527}\x{7528}\x{7529}\x{752A}\x{752B}' . +'\x{752C}\x{752D}\x{752E}\x{752F}\x{7530}\x{7531}\x{7532}\x{7533}\x{7535}' . +'\x{7536}\x{7537}\x{7538}\x{7539}\x{753A}\x{753B}\x{753C}\x{753D}\x{753E}' . +'\x{753F}\x{7540}\x{7542}\x{7543}\x{7544}\x{7545}\x{7546}\x{7547}\x{7548}' . +'\x{7549}\x{754B}\x{754C}\x{754D}\x{754E}\x{754F}\x{7550}\x{7551}\x{7553}' . +'\x{7554}\x{7556}\x{7557}\x{7558}\x{7559}\x{755A}\x{755B}\x{755C}\x{755D}' . +'\x{755F}\x{7560}\x{7562}\x{7563}\x{7564}\x{7565}\x{7566}\x{7567}\x{7568}' . +'\x{7569}\x{756A}\x{756B}\x{756C}\x{756D}\x{756E}\x{756F}\x{7570}\x{7572}' . +'\x{7574}\x{7575}\x{7576}\x{7577}\x{7578}\x{7579}\x{757C}\x{757D}\x{757E}' . +'\x{757F}\x{7580}\x{7581}\x{7582}\x{7583}\x{7584}\x{7586}\x{7587}\x{7588}' . +'\x{7589}\x{758A}\x{758B}\x{758C}\x{758D}\x{758F}\x{7590}\x{7591}\x{7592}' . +'\x{7593}\x{7594}\x{7595}\x{7596}\x{7597}\x{7598}\x{7599}\x{759A}\x{759B}' . +'\x{759C}\x{759D}\x{759E}\x{759F}\x{75A0}\x{75A1}\x{75A2}\x{75A3}\x{75A4}' . +'\x{75A5}\x{75A6}\x{75A7}\x{75A8}\x{75AA}\x{75AB}\x{75AC}\x{75AD}\x{75AE}' . +'\x{75AF}\x{75B0}\x{75B1}\x{75B2}\x{75B3}\x{75B4}\x{75B5}\x{75B6}\x{75B8}' . +'\x{75B9}\x{75BA}\x{75BB}\x{75BC}\x{75BD}\x{75BE}\x{75BF}\x{75C0}\x{75C1}' . +'\x{75C2}\x{75C3}\x{75C4}\x{75C5}\x{75C6}\x{75C7}\x{75C8}\x{75C9}\x{75CA}' . +'\x{75CB}\x{75CC}\x{75CD}\x{75CE}\x{75CF}\x{75D0}\x{75D1}\x{75D2}\x{75D3}' . +'\x{75D4}\x{75D5}\x{75D6}\x{75D7}\x{75D8}\x{75D9}\x{75DA}\x{75DB}\x{75DD}' . +'\x{75DE}\x{75DF}\x{75E0}\x{75E1}\x{75E2}\x{75E3}\x{75E4}\x{75E5}\x{75E6}' . +'\x{75E7}\x{75E8}\x{75EA}\x{75EB}\x{75EC}\x{75ED}\x{75EF}\x{75F0}\x{75F1}' . +'\x{75F2}\x{75F3}\x{75F4}\x{75F5}\x{75F6}\x{75F7}\x{75F8}\x{75F9}\x{75FA}' . +'\x{75FB}\x{75FC}\x{75FD}\x{75FE}\x{75FF}\x{7600}\x{7601}\x{7602}\x{7603}' . +'\x{7604}\x{7605}\x{7606}\x{7607}\x{7608}\x{7609}\x{760A}\x{760B}\x{760C}' . +'\x{760D}\x{760E}\x{760F}\x{7610}\x{7611}\x{7612}\x{7613}\x{7614}\x{7615}' . +'\x{7616}\x{7617}\x{7618}\x{7619}\x{761A}\x{761B}\x{761C}\x{761D}\x{761E}' . +'\x{761F}\x{7620}\x{7621}\x{7622}\x{7623}\x{7624}\x{7625}\x{7626}\x{7627}' . +'\x{7628}\x{7629}\x{762A}\x{762B}\x{762D}\x{762E}\x{762F}\x{7630}\x{7631}' . +'\x{7632}\x{7633}\x{7634}\x{7635}\x{7636}\x{7637}\x{7638}\x{7639}\x{763A}' . +'\x{763B}\x{763C}\x{763D}\x{763E}\x{763F}\x{7640}\x{7641}\x{7642}\x{7643}' . +'\x{7646}\x{7647}\x{7648}\x{7649}\x{764A}\x{764B}\x{764C}\x{764D}\x{764F}' . +'\x{7650}\x{7652}\x{7653}\x{7654}\x{7656}\x{7657}\x{7658}\x{7659}\x{765A}' . +'\x{765B}\x{765C}\x{765D}\x{765E}\x{765F}\x{7660}\x{7661}\x{7662}\x{7663}' . +'\x{7664}\x{7665}\x{7666}\x{7667}\x{7668}\x{7669}\x{766A}\x{766B}\x{766C}' . +'\x{766D}\x{766E}\x{766F}\x{7670}\x{7671}\x{7672}\x{7674}\x{7675}\x{7676}' . +'\x{7677}\x{7678}\x{7679}\x{767B}\x{767C}\x{767D}\x{767E}\x{767F}\x{7680}' . +'\x{7681}\x{7682}\x{7683}\x{7684}\x{7685}\x{7686}\x{7687}\x{7688}\x{7689}' . +'\x{768A}\x{768B}\x{768C}\x{768E}\x{768F}\x{7690}\x{7691}\x{7692}\x{7693}' . +'\x{7694}\x{7695}\x{7696}\x{7697}\x{7698}\x{7699}\x{769A}\x{769B}\x{769C}' . +'\x{769D}\x{769E}\x{769F}\x{76A0}\x{76A3}\x{76A4}\x{76A6}\x{76A7}\x{76A9}' . +'\x{76AA}\x{76AB}\x{76AC}\x{76AD}\x{76AE}\x{76AF}\x{76B0}\x{76B1}\x{76B2}' . +'\x{76B4}\x{76B5}\x{76B7}\x{76B8}\x{76BA}\x{76BB}\x{76BC}\x{76BD}\x{76BE}' . +'\x{76BF}\x{76C0}\x{76C2}\x{76C3}\x{76C4}\x{76C5}\x{76C6}\x{76C7}\x{76C8}' . +'\x{76C9}\x{76CA}\x{76CD}\x{76CE}\x{76CF}\x{76D0}\x{76D1}\x{76D2}\x{76D3}' . +'\x{76D4}\x{76D5}\x{76D6}\x{76D7}\x{76D8}\x{76DA}\x{76DB}\x{76DC}\x{76DD}' . +'\x{76DE}\x{76DF}\x{76E0}\x{76E1}\x{76E2}\x{76E3}\x{76E4}\x{76E5}\x{76E6}' . +'\x{76E7}\x{76E8}\x{76E9}\x{76EA}\x{76EC}\x{76ED}\x{76EE}\x{76EF}\x{76F0}' . +'\x{76F1}\x{76F2}\x{76F3}\x{76F4}\x{76F5}\x{76F6}\x{76F7}\x{76F8}\x{76F9}' . +'\x{76FA}\x{76FB}\x{76FC}\x{76FD}\x{76FE}\x{76FF}\x{7701}\x{7703}\x{7704}' . +'\x{7705}\x{7706}\x{7707}\x{7708}\x{7709}\x{770A}\x{770B}\x{770C}\x{770D}' . +'\x{770F}\x{7710}\x{7711}\x{7712}\x{7713}\x{7714}\x{7715}\x{7716}\x{7717}' . +'\x{7718}\x{7719}\x{771A}\x{771B}\x{771C}\x{771D}\x{771E}\x{771F}\x{7720}' . +'\x{7722}\x{7723}\x{7725}\x{7726}\x{7727}\x{7728}\x{7729}\x{772A}\x{772C}' . +'\x{772D}\x{772E}\x{772F}\x{7730}\x{7731}\x{7732}\x{7733}\x{7734}\x{7735}' . +'\x{7736}\x{7737}\x{7738}\x{7739}\x{773A}\x{773B}\x{773C}\x{773D}\x{773E}' . +'\x{7740}\x{7741}\x{7743}\x{7744}\x{7745}\x{7746}\x{7747}\x{7748}\x{7749}' . +'\x{774A}\x{774B}\x{774C}\x{774D}\x{774E}\x{774F}\x{7750}\x{7751}\x{7752}' . +'\x{7753}\x{7754}\x{7755}\x{7756}\x{7757}\x{7758}\x{7759}\x{775A}\x{775B}' . +'\x{775C}\x{775D}\x{775E}\x{775F}\x{7760}\x{7761}\x{7762}\x{7763}\x{7765}' . +'\x{7766}\x{7767}\x{7768}\x{7769}\x{776A}\x{776B}\x{776C}\x{776D}\x{776E}' . +'\x{776F}\x{7770}\x{7771}\x{7772}\x{7773}\x{7774}\x{7775}\x{7776}\x{7777}' . +'\x{7778}\x{7779}\x{777A}\x{777B}\x{777C}\x{777D}\x{777E}\x{777F}\x{7780}' . +'\x{7781}\x{7782}\x{7783}\x{7784}\x{7785}\x{7786}\x{7787}\x{7788}\x{7789}' . +'\x{778A}\x{778B}\x{778C}\x{778D}\x{778E}\x{778F}\x{7790}\x{7791}\x{7792}' . +'\x{7793}\x{7794}\x{7795}\x{7797}\x{7798}\x{7799}\x{779A}\x{779B}\x{779C}' . +'\x{779D}\x{779E}\x{779F}\x{77A0}\x{77A1}\x{77A2}\x{77A3}\x{77A5}\x{77A6}' . +'\x{77A7}\x{77A8}\x{77A9}\x{77AA}\x{77AB}\x{77AC}\x{77AD}\x{77AE}\x{77AF}' . +'\x{77B0}\x{77B1}\x{77B2}\x{77B3}\x{77B4}\x{77B5}\x{77B6}\x{77B7}\x{77B8}' . +'\x{77B9}\x{77BA}\x{77BB}\x{77BC}\x{77BD}\x{77BF}\x{77C0}\x{77C2}\x{77C3}' . +'\x{77C4}\x{77C5}\x{77C6}\x{77C7}\x{77C8}\x{77C9}\x{77CA}\x{77CB}\x{77CC}' . +'\x{77CD}\x{77CE}\x{77CF}\x{77D0}\x{77D1}\x{77D3}\x{77D4}\x{77D5}\x{77D6}' . +'\x{77D7}\x{77D8}\x{77D9}\x{77DA}\x{77DB}\x{77DC}\x{77DE}\x{77DF}\x{77E0}' . +'\x{77E1}\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E8}\x{77E9}\x{77EA}\x{77EB}' . +'\x{77EC}\x{77ED}\x{77EE}\x{77EF}\x{77F0}\x{77F1}\x{77F2}\x{77F3}\x{77F6}' . +'\x{77F7}\x{77F8}\x{77F9}\x{77FA}\x{77FB}\x{77FC}\x{77FD}\x{77FE}\x{77FF}' . +'\x{7800}\x{7801}\x{7802}\x{7803}\x{7804}\x{7805}\x{7806}\x{7808}\x{7809}' . +'\x{780A}\x{780B}\x{780C}\x{780D}\x{780E}\x{780F}\x{7810}\x{7811}\x{7812}' . +'\x{7813}\x{7814}\x{7815}\x{7816}\x{7817}\x{7818}\x{7819}\x{781A}\x{781B}' . +'\x{781C}\x{781D}\x{781E}\x{781F}\x{7820}\x{7821}\x{7822}\x{7823}\x{7825}' . +'\x{7826}\x{7827}\x{7828}\x{7829}\x{782A}\x{782B}\x{782C}\x{782D}\x{782E}' . +'\x{782F}\x{7830}\x{7831}\x{7832}\x{7833}\x{7834}\x{7835}\x{7837}\x{7838}' . +'\x{7839}\x{783A}\x{783B}\x{783C}\x{783D}\x{783E}\x{7840}\x{7841}\x{7843}' . +'\x{7844}\x{7845}\x{7847}\x{7848}\x{7849}\x{784A}\x{784C}\x{784D}\x{784E}' . +'\x{7850}\x{7851}\x{7852}\x{7853}\x{7854}\x{7855}\x{7856}\x{7857}\x{7858}' . +'\x{7859}\x{785A}\x{785B}\x{785C}\x{785D}\x{785E}\x{785F}\x{7860}\x{7861}' . +'\x{7862}\x{7863}\x{7864}\x{7865}\x{7866}\x{7867}\x{7868}\x{7869}\x{786A}' . +'\x{786B}\x{786C}\x{786D}\x{786E}\x{786F}\x{7870}\x{7871}\x{7872}\x{7873}' . +'\x{7874}\x{7875}\x{7877}\x{7878}\x{7879}\x{787A}\x{787B}\x{787C}\x{787D}' . +'\x{787E}\x{787F}\x{7880}\x{7881}\x{7882}\x{7883}\x{7884}\x{7885}\x{7886}' . +'\x{7887}\x{7889}\x{788A}\x{788B}\x{788C}\x{788D}\x{788E}\x{788F}\x{7890}' . +'\x{7891}\x{7892}\x{7893}\x{7894}\x{7895}\x{7896}\x{7897}\x{7898}\x{7899}' . +'\x{789A}\x{789B}\x{789C}\x{789D}\x{789E}\x{789F}\x{78A0}\x{78A1}\x{78A2}' . +'\x{78A3}\x{78A4}\x{78A5}\x{78A6}\x{78A7}\x{78A8}\x{78A9}\x{78AA}\x{78AB}' . +'\x{78AC}\x{78AD}\x{78AE}\x{78AF}\x{78B0}\x{78B1}\x{78B2}\x{78B3}\x{78B4}' . +'\x{78B5}\x{78B6}\x{78B7}\x{78B8}\x{78B9}\x{78BA}\x{78BB}\x{78BC}\x{78BD}' . +'\x{78BE}\x{78BF}\x{78C0}\x{78C1}\x{78C3}\x{78C4}\x{78C5}\x{78C6}\x{78C8}' . +'\x{78C9}\x{78CA}\x{78CB}\x{78CC}\x{78CD}\x{78CE}\x{78CF}\x{78D0}\x{78D1}' . +'\x{78D3}\x{78D4}\x{78D5}\x{78D6}\x{78D7}\x{78D8}\x{78D9}\x{78DA}\x{78DB}' . +'\x{78DC}\x{78DD}\x{78DE}\x{78DF}\x{78E0}\x{78E1}\x{78E2}\x{78E3}\x{78E4}' . +'\x{78E5}\x{78E6}\x{78E7}\x{78E8}\x{78E9}\x{78EA}\x{78EB}\x{78EC}\x{78ED}' . +'\x{78EE}\x{78EF}\x{78F1}\x{78F2}\x{78F3}\x{78F4}\x{78F5}\x{78F6}\x{78F7}' . +'\x{78F9}\x{78FA}\x{78FB}\x{78FC}\x{78FD}\x{78FE}\x{78FF}\x{7901}\x{7902}' . +'\x{7903}\x{7904}\x{7905}\x{7906}\x{7907}\x{7909}\x{790A}\x{790B}\x{790C}' . +'\x{790E}\x{790F}\x{7910}\x{7911}\x{7912}\x{7913}\x{7914}\x{7916}\x{7917}' . +'\x{7918}\x{7919}\x{791A}\x{791B}\x{791C}\x{791D}\x{791E}\x{7921}\x{7922}' . +'\x{7923}\x{7924}\x{7925}\x{7926}\x{7927}\x{7928}\x{7929}\x{792A}\x{792B}' . +'\x{792C}\x{792D}\x{792E}\x{792F}\x{7930}\x{7931}\x{7933}\x{7934}\x{7935}' . +'\x{7937}\x{7938}\x{7939}\x{793A}\x{793B}\x{793C}\x{793D}\x{793E}\x{793F}' . +'\x{7940}\x{7941}\x{7942}\x{7943}\x{7944}\x{7945}\x{7946}\x{7947}\x{7948}' . +'\x{7949}\x{794A}\x{794B}\x{794C}\x{794D}\x{794E}\x{794F}\x{7950}\x{7951}' . +'\x{7952}\x{7953}\x{7954}\x{7955}\x{7956}\x{7957}\x{7958}\x{795A}\x{795B}' . +'\x{795C}\x{795D}\x{795E}\x{795F}\x{7960}\x{7961}\x{7962}\x{7963}\x{7964}' . +'\x{7965}\x{7966}\x{7967}\x{7968}\x{7969}\x{796A}\x{796B}\x{796D}\x{796F}' . +'\x{7970}\x{7971}\x{7972}\x{7973}\x{7974}\x{7977}\x{7978}\x{7979}\x{797A}' . +'\x{797B}\x{797C}\x{797D}\x{797E}\x{797F}\x{7980}\x{7981}\x{7982}\x{7983}' . +'\x{7984}\x{7985}\x{7988}\x{7989}\x{798A}\x{798B}\x{798C}\x{798D}\x{798E}' . +'\x{798F}\x{7990}\x{7991}\x{7992}\x{7993}\x{7994}\x{7995}\x{7996}\x{7997}' . +'\x{7998}\x{7999}\x{799A}\x{799B}\x{799C}\x{799F}\x{79A0}\x{79A1}\x{79A2}' . +'\x{79A3}\x{79A4}\x{79A5}\x{79A6}\x{79A7}\x{79A8}\x{79AA}\x{79AB}\x{79AC}' . +'\x{79AD}\x{79AE}\x{79AF}\x{79B0}\x{79B1}\x{79B2}\x{79B3}\x{79B4}\x{79B5}' . +'\x{79B6}\x{79B7}\x{79B8}\x{79B9}\x{79BA}\x{79BB}\x{79BD}\x{79BE}\x{79BF}' . +'\x{79C0}\x{79C1}\x{79C2}\x{79C3}\x{79C5}\x{79C6}\x{79C8}\x{79C9}\x{79CA}' . +'\x{79CB}\x{79CD}\x{79CE}\x{79CF}\x{79D0}\x{79D1}\x{79D2}\x{79D3}\x{79D5}' . +'\x{79D6}\x{79D8}\x{79D9}\x{79DA}\x{79DB}\x{79DC}\x{79DD}\x{79DE}\x{79DF}' . +'\x{79E0}\x{79E1}\x{79E2}\x{79E3}\x{79E4}\x{79E5}\x{79E6}\x{79E7}\x{79E8}' . +'\x{79E9}\x{79EA}\x{79EB}\x{79EC}\x{79ED}\x{79EE}\x{79EF}\x{79F0}\x{79F1}' . +'\x{79F2}\x{79F3}\x{79F4}\x{79F5}\x{79F6}\x{79F7}\x{79F8}\x{79F9}\x{79FA}' . +'\x{79FB}\x{79FC}\x{79FD}\x{79FE}\x{79FF}\x{7A00}\x{7A02}\x{7A03}\x{7A04}' . +'\x{7A05}\x{7A06}\x{7A08}\x{7A0A}\x{7A0B}\x{7A0C}\x{7A0D}\x{7A0E}\x{7A0F}' . +'\x{7A10}\x{7A11}\x{7A12}\x{7A13}\x{7A14}\x{7A15}\x{7A16}\x{7A17}\x{7A18}' . +'\x{7A19}\x{7A1A}\x{7A1B}\x{7A1C}\x{7A1D}\x{7A1E}\x{7A1F}\x{7A20}\x{7A21}' . +'\x{7A22}\x{7A23}\x{7A24}\x{7A25}\x{7A26}\x{7A27}\x{7A28}\x{7A29}\x{7A2A}' . +'\x{7A2B}\x{7A2D}\x{7A2E}\x{7A2F}\x{7A30}\x{7A31}\x{7A32}\x{7A33}\x{7A34}' . +'\x{7A35}\x{7A37}\x{7A39}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' . +'\x{7A41}\x{7A42}\x{7A43}\x{7A44}\x{7A45}\x{7A46}\x{7A47}\x{7A48}\x{7A49}' . +'\x{7A4A}\x{7A4B}\x{7A4C}\x{7A4D}\x{7A4E}\x{7A50}\x{7A51}\x{7A52}\x{7A53}' . +'\x{7A54}\x{7A55}\x{7A56}\x{7A57}\x{7A58}\x{7A59}\x{7A5A}\x{7A5B}\x{7A5C}' . +'\x{7A5D}\x{7A5E}\x{7A5F}\x{7A60}\x{7A61}\x{7A62}\x{7A65}\x{7A66}\x{7A67}' . +'\x{7A68}\x{7A69}\x{7A6B}\x{7A6C}\x{7A6D}\x{7A6E}\x{7A70}\x{7A71}\x{7A72}' . +'\x{7A73}\x{7A74}\x{7A75}\x{7A76}\x{7A77}\x{7A78}\x{7A79}\x{7A7A}\x{7A7B}' . +'\x{7A7C}\x{7A7D}\x{7A7E}\x{7A7F}\x{7A80}\x{7A81}\x{7A83}\x{7A84}\x{7A85}' . +'\x{7A86}\x{7A87}\x{7A88}\x{7A89}\x{7A8A}\x{7A8B}\x{7A8C}\x{7A8D}\x{7A8E}' . +'\x{7A8F}\x{7A90}\x{7A91}\x{7A92}\x{7A93}\x{7A94}\x{7A95}\x{7A96}\x{7A97}' . +'\x{7A98}\x{7A99}\x{7A9C}\x{7A9D}\x{7A9E}\x{7A9F}\x{7AA0}\x{7AA1}\x{7AA2}' . +'\x{7AA3}\x{7AA4}\x{7AA5}\x{7AA6}\x{7AA7}\x{7AA8}\x{7AA9}\x{7AAA}\x{7AAB}' . +'\x{7AAC}\x{7AAD}\x{7AAE}\x{7AAF}\x{7AB0}\x{7AB1}\x{7AB2}\x{7AB3}\x{7AB4}' . +'\x{7AB5}\x{7AB6}\x{7AB7}\x{7AB8}\x{7ABA}\x{7ABE}\x{7ABF}\x{7AC0}\x{7AC1}' . +'\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}\x{7AC9}\x{7ACA}\x{7ACB}\x{7ACC}\x{7ACD}' . +'\x{7ACE}\x{7ACF}\x{7AD0}\x{7AD1}\x{7AD2}\x{7AD3}\x{7AD4}\x{7AD5}\x{7AD6}' . +'\x{7AD8}\x{7AD9}\x{7ADB}\x{7ADC}\x{7ADD}\x{7ADE}\x{7ADF}\x{7AE0}\x{7AE1}' . +'\x{7AE2}\x{7AE3}\x{7AE4}\x{7AE5}\x{7AE6}\x{7AE7}\x{7AE8}\x{7AEA}\x{7AEB}' . +'\x{7AEC}\x{7AED}\x{7AEE}\x{7AEF}\x{7AF0}\x{7AF1}\x{7AF2}\x{7AF3}\x{7AF4}' . +'\x{7AF6}\x{7AF7}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFB}\x{7AFD}\x{7AFE}\x{7AFF}' . +'\x{7B00}\x{7B01}\x{7B02}\x{7B03}\x{7B04}\x{7B05}\x{7B06}\x{7B08}\x{7B09}' . +'\x{7B0A}\x{7B0B}\x{7B0C}\x{7B0D}\x{7B0E}\x{7B0F}\x{7B10}\x{7B11}\x{7B12}' . +'\x{7B13}\x{7B14}\x{7B15}\x{7B16}\x{7B17}\x{7B18}\x{7B19}\x{7B1A}\x{7B1B}' . +'\x{7B1C}\x{7B1D}\x{7B1E}\x{7B20}\x{7B21}\x{7B22}\x{7B23}\x{7B24}\x{7B25}' . +'\x{7B26}\x{7B28}\x{7B2A}\x{7B2B}\x{7B2C}\x{7B2D}\x{7B2E}\x{7B2F}\x{7B30}' . +'\x{7B31}\x{7B32}\x{7B33}\x{7B34}\x{7B35}\x{7B36}\x{7B37}\x{7B38}\x{7B39}' . +'\x{7B3A}\x{7B3B}\x{7B3C}\x{7B3D}\x{7B3E}\x{7B3F}\x{7B40}\x{7B41}\x{7B43}' . +'\x{7B44}\x{7B45}\x{7B46}\x{7B47}\x{7B48}\x{7B49}\x{7B4A}\x{7B4B}\x{7B4C}' . +'\x{7B4D}\x{7B4E}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B55}\x{7B56}' . +'\x{7B57}\x{7B58}\x{7B59}\x{7B5A}\x{7B5B}\x{7B5C}\x{7B5D}\x{7B5E}\x{7B5F}' . +'\x{7B60}\x{7B61}\x{7B62}\x{7B63}\x{7B64}\x{7B65}\x{7B66}\x{7B67}\x{7B68}' . +'\x{7B69}\x{7B6A}\x{7B6B}\x{7B6C}\x{7B6D}\x{7B6E}\x{7B70}\x{7B71}\x{7B72}' . +'\x{7B73}\x{7B74}\x{7B75}\x{7B76}\x{7B77}\x{7B78}\x{7B79}\x{7B7B}\x{7B7C}' . +'\x{7B7D}\x{7B7E}\x{7B7F}\x{7B80}\x{7B81}\x{7B82}\x{7B83}\x{7B84}\x{7B85}' . +'\x{7B87}\x{7B88}\x{7B89}\x{7B8A}\x{7B8B}\x{7B8C}\x{7B8D}\x{7B8E}\x{7B8F}' . +'\x{7B90}\x{7B91}\x{7B93}\x{7B94}\x{7B95}\x{7B96}\x{7B97}\x{7B98}\x{7B99}' . +'\x{7B9A}\x{7B9B}\x{7B9C}\x{7B9D}\x{7B9E}\x{7B9F}\x{7BA0}\x{7BA1}\x{7BA2}' . +'\x{7BA4}\x{7BA6}\x{7BA7}\x{7BA8}\x{7BA9}\x{7BAA}\x{7BAB}\x{7BAC}\x{7BAD}' . +'\x{7BAE}\x{7BAF}\x{7BB1}\x{7BB3}\x{7BB4}\x{7BB5}\x{7BB6}\x{7BB7}\x{7BB8}' . +'\x{7BB9}\x{7BBA}\x{7BBB}\x{7BBC}\x{7BBD}\x{7BBE}\x{7BBF}\x{7BC0}\x{7BC1}' . +'\x{7BC2}\x{7BC3}\x{7BC4}\x{7BC5}\x{7BC6}\x{7BC7}\x{7BC8}\x{7BC9}\x{7BCA}' . +'\x{7BCB}\x{7BCC}\x{7BCD}\x{7BCE}\x{7BD0}\x{7BD1}\x{7BD2}\x{7BD3}\x{7BD4}' . +'\x{7BD5}\x{7BD6}\x{7BD7}\x{7BD8}\x{7BD9}\x{7BDA}\x{7BDB}\x{7BDC}\x{7BDD}' . +'\x{7BDE}\x{7BDF}\x{7BE0}\x{7BE1}\x{7BE2}\x{7BE3}\x{7BE4}\x{7BE5}\x{7BE6}' . +'\x{7BE7}\x{7BE8}\x{7BE9}\x{7BEA}\x{7BEB}\x{7BEC}\x{7BED}\x{7BEE}\x{7BEF}' . +'\x{7BF0}\x{7BF1}\x{7BF2}\x{7BF3}\x{7BF4}\x{7BF5}\x{7BF6}\x{7BF7}\x{7BF8}' . +'\x{7BF9}\x{7BFB}\x{7BFC}\x{7BFD}\x{7BFE}\x{7BFF}\x{7C00}\x{7C01}\x{7C02}' . +'\x{7C03}\x{7C04}\x{7C05}\x{7C06}\x{7C07}\x{7C08}\x{7C09}\x{7C0A}\x{7C0B}' . +'\x{7C0C}\x{7C0D}\x{7C0E}\x{7C0F}\x{7C10}\x{7C11}\x{7C12}\x{7C13}\x{7C15}' . +'\x{7C16}\x{7C17}\x{7C18}\x{7C19}\x{7C1A}\x{7C1C}\x{7C1D}\x{7C1E}\x{7C1F}' . +'\x{7C20}\x{7C21}\x{7C22}\x{7C23}\x{7C24}\x{7C25}\x{7C26}\x{7C27}\x{7C28}' . +'\x{7C29}\x{7C2A}\x{7C2B}\x{7C2C}\x{7C2D}\x{7C30}\x{7C31}\x{7C32}\x{7C33}' . +'\x{7C34}\x{7C35}\x{7C36}\x{7C37}\x{7C38}\x{7C39}\x{7C3A}\x{7C3B}\x{7C3C}' . +'\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C41}\x{7C42}\x{7C43}\x{7C44}\x{7C45}' . +'\x{7C46}\x{7C47}\x{7C48}\x{7C49}\x{7C4A}\x{7C4B}\x{7C4C}\x{7C4D}\x{7C4E}' . +'\x{7C50}\x{7C51}\x{7C53}\x{7C54}\x{7C56}\x{7C57}\x{7C58}\x{7C59}\x{7C5A}' . +'\x{7C5B}\x{7C5C}\x{7C5E}\x{7C5F}\x{7C60}\x{7C61}\x{7C62}\x{7C63}\x{7C64}' . +'\x{7C65}\x{7C66}\x{7C67}\x{7C68}\x{7C69}\x{7C6A}\x{7C6B}\x{7C6C}\x{7C6D}' . +'\x{7C6E}\x{7C6F}\x{7C70}\x{7C71}\x{7C72}\x{7C73}\x{7C74}\x{7C75}\x{7C77}' . +'\x{7C78}\x{7C79}\x{7C7A}\x{7C7B}\x{7C7C}\x{7C7D}\x{7C7E}\x{7C7F}\x{7C80}' . +'\x{7C81}\x{7C82}\x{7C84}\x{7C85}\x{7C86}\x{7C88}\x{7C89}\x{7C8A}\x{7C8B}' . +'\x{7C8C}\x{7C8D}\x{7C8E}\x{7C8F}\x{7C90}\x{7C91}\x{7C92}\x{7C94}\x{7C95}' . +'\x{7C96}\x{7C97}\x{7C98}\x{7C99}\x{7C9B}\x{7C9C}\x{7C9D}\x{7C9E}\x{7C9F}' . +'\x{7CA0}\x{7CA1}\x{7CA2}\x{7CA3}\x{7CA4}\x{7CA5}\x{7CA6}\x{7CA7}\x{7CA8}' . +'\x{7CA9}\x{7CAA}\x{7CAD}\x{7CAE}\x{7CAF}\x{7CB0}\x{7CB1}\x{7CB2}\x{7CB3}' . +'\x{7CB4}\x{7CB5}\x{7CB6}\x{7CB7}\x{7CB8}\x{7CB9}\x{7CBA}\x{7CBB}\x{7CBC}' . +'\x{7CBD}\x{7CBE}\x{7CBF}\x{7CC0}\x{7CC1}\x{7CC2}\x{7CC3}\x{7CC4}\x{7CC5}' . +'\x{7CC6}\x{7CC7}\x{7CC8}\x{7CC9}\x{7CCA}\x{7CCB}\x{7CCC}\x{7CCD}\x{7CCE}' . +'\x{7CCF}\x{7CD0}\x{7CD1}\x{7CD2}\x{7CD4}\x{7CD5}\x{7CD6}\x{7CD7}\x{7CD8}' . +'\x{7CD9}\x{7CDC}\x{7CDD}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE4}\x{7CE7}' . +'\x{7CE8}\x{7CE9}\x{7CEA}\x{7CEB}\x{7CEC}\x{7CED}\x{7CEE}\x{7CEF}\x{7CF0}' . +'\x{7CF1}\x{7CF2}\x{7CF3}\x{7CF4}\x{7CF5}\x{7CF6}\x{7CF7}\x{7CF8}\x{7CF9}' . +'\x{7CFA}\x{7CFB}\x{7CFD}\x{7CFE}\x{7D00}\x{7D01}\x{7D02}\x{7D03}\x{7D04}' . +'\x{7D05}\x{7D06}\x{7D07}\x{7D08}\x{7D09}\x{7D0A}\x{7D0B}\x{7D0C}\x{7D0D}' . +'\x{7D0E}\x{7D0F}\x{7D10}\x{7D11}\x{7D12}\x{7D13}\x{7D14}\x{7D15}\x{7D16}' . +'\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D1D}\x{7D1E}\x{7D1F}' . +'\x{7D20}\x{7D21}\x{7D22}\x{7D24}\x{7D25}\x{7D26}\x{7D27}\x{7D28}\x{7D29}' . +'\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D31}\x{7D32}\x{7D33}\x{7D34}' . +'\x{7D35}\x{7D36}\x{7D37}\x{7D38}\x{7D39}\x{7D3A}\x{7D3B}\x{7D3C}\x{7D3D}' . +'\x{7D3E}\x{7D3F}\x{7D40}\x{7D41}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}' . +'\x{7D47}\x{7D49}\x{7D4A}\x{7D4B}\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D51}' . +'\x{7D52}\x{7D53}\x{7D54}\x{7D55}\x{7D56}\x{7D57}\x{7D58}\x{7D59}\x{7D5B}' . +'\x{7D5C}\x{7D5D}\x{7D5E}\x{7D5F}\x{7D60}\x{7D61}\x{7D62}\x{7D63}\x{7D65}' . +'\x{7D66}\x{7D67}\x{7D68}\x{7D69}\x{7D6A}\x{7D6B}\x{7D6C}\x{7D6D}\x{7D6E}' . +'\x{7D6F}\x{7D70}\x{7D71}\x{7D72}\x{7D73}\x{7D74}\x{7D75}\x{7D76}\x{7D77}' . +'\x{7D79}\x{7D7A}\x{7D7B}\x{7D7C}\x{7D7D}\x{7D7E}\x{7D7F}\x{7D80}\x{7D81}' . +'\x{7D83}\x{7D84}\x{7D85}\x{7D86}\x{7D87}\x{7D88}\x{7D89}\x{7D8A}\x{7D8B}' . +'\x{7D8C}\x{7D8D}\x{7D8E}\x{7D8F}\x{7D90}\x{7D91}\x{7D92}\x{7D93}\x{7D94}' . +'\x{7D96}\x{7D97}\x{7D99}\x{7D9B}\x{7D9C}\x{7D9D}\x{7D9E}\x{7D9F}\x{7DA0}' . +'\x{7DA1}\x{7DA2}\x{7DA3}\x{7DA5}\x{7DA6}\x{7DA7}\x{7DA9}\x{7DAA}\x{7DAB}' . +'\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}\x{7DB1}\x{7DB2}\x{7DB3}\x{7DB4}' . +'\x{7DB5}\x{7DB6}\x{7DB7}\x{7DB8}\x{7DB9}\x{7DBA}\x{7DBB}\x{7DBC}\x{7DBD}' . +'\x{7DBE}\x{7DBF}\x{7DC0}\x{7DC1}\x{7DC2}\x{7DC3}\x{7DC4}\x{7DC5}\x{7DC6}' . +'\x{7DC7}\x{7DC8}\x{7DC9}\x{7DCA}\x{7DCB}\x{7DCC}\x{7DCE}\x{7DCF}\x{7DD0}' . +'\x{7DD1}\x{7DD2}\x{7DD4}\x{7DD5}\x{7DD6}\x{7DD7}\x{7DD8}\x{7DD9}\x{7DDA}' . +'\x{7DDB}\x{7DDD}\x{7DDE}\x{7DDF}\x{7DE0}\x{7DE1}\x{7DE2}\x{7DE3}\x{7DE6}' . +'\x{7DE7}\x{7DE8}\x{7DE9}\x{7DEA}\x{7DEC}\x{7DED}\x{7DEE}\x{7DEF}\x{7DF0}' . +'\x{7DF1}\x{7DF2}\x{7DF3}\x{7DF4}\x{7DF5}\x{7DF6}\x{7DF7}\x{7DF8}\x{7DF9}' . +'\x{7DFA}\x{7DFB}\x{7DFC}\x{7E00}\x{7E01}\x{7E02}\x{7E03}\x{7E04}\x{7E05}' . +'\x{7E06}\x{7E07}\x{7E08}\x{7E09}\x{7E0A}\x{7E0B}\x{7E0C}\x{7E0D}\x{7E0E}' . +'\x{7E0F}\x{7E10}\x{7E11}\x{7E12}\x{7E13}\x{7E14}\x{7E15}\x{7E16}\x{7E17}' . +'\x{7E19}\x{7E1A}\x{7E1B}\x{7E1C}\x{7E1D}\x{7E1E}\x{7E1F}\x{7E20}\x{7E21}' . +'\x{7E22}\x{7E23}\x{7E24}\x{7E25}\x{7E26}\x{7E27}\x{7E28}\x{7E29}\x{7E2A}' . +'\x{7E2B}\x{7E2C}\x{7E2D}\x{7E2E}\x{7E2F}\x{7E30}\x{7E31}\x{7E32}\x{7E33}' . +'\x{7E34}\x{7E35}\x{7E36}\x{7E37}\x{7E38}\x{7E39}\x{7E3A}\x{7E3B}\x{7E3C}' . +'\x{7E3D}\x{7E3E}\x{7E3F}\x{7E40}\x{7E41}\x{7E42}\x{7E43}\x{7E44}\x{7E45}' . +'\x{7E46}\x{7E47}\x{7E48}\x{7E49}\x{7E4C}\x{7E4D}\x{7E4E}\x{7E4F}\x{7E50}' . +'\x{7E51}\x{7E52}\x{7E53}\x{7E54}\x{7E55}\x{7E56}\x{7E57}\x{7E58}\x{7E59}' . +'\x{7E5A}\x{7E5C}\x{7E5D}\x{7E5E}\x{7E5F}\x{7E60}\x{7E61}\x{7E62}\x{7E63}' . +'\x{7E65}\x{7E66}\x{7E67}\x{7E68}\x{7E69}\x{7E6A}\x{7E6B}\x{7E6C}\x{7E6D}' . +'\x{7E6E}\x{7E6F}\x{7E70}\x{7E71}\x{7E72}\x{7E73}\x{7E74}\x{7E75}\x{7E76}' . +'\x{7E77}\x{7E78}\x{7E79}\x{7E7A}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7E}\x{7E7F}' . +'\x{7E80}\x{7E81}\x{7E82}\x{7E83}\x{7E84}\x{7E85}\x{7E86}\x{7E87}\x{7E88}' . +'\x{7E89}\x{7E8A}\x{7E8B}\x{7E8C}\x{7E8D}\x{7E8E}\x{7E8F}\x{7E90}\x{7E91}' . +'\x{7E92}\x{7E93}\x{7E94}\x{7E95}\x{7E96}\x{7E97}\x{7E98}\x{7E99}\x{7E9A}' . +'\x{7E9B}\x{7E9C}\x{7E9E}\x{7E9F}\x{7EA0}\x{7EA1}\x{7EA2}\x{7EA3}\x{7EA4}' . +'\x{7EA5}\x{7EA6}\x{7EA7}\x{7EA8}\x{7EA9}\x{7EAA}\x{7EAB}\x{7EAC}\x{7EAD}' . +'\x{7EAE}\x{7EAF}\x{7EB0}\x{7EB1}\x{7EB2}\x{7EB3}\x{7EB4}\x{7EB5}\x{7EB6}' . +'\x{7EB7}\x{7EB8}\x{7EB9}\x{7EBA}\x{7EBB}\x{7EBC}\x{7EBD}\x{7EBE}\x{7EBF}' . +'\x{7EC0}\x{7EC1}\x{7EC2}\x{7EC3}\x{7EC4}\x{7EC5}\x{7EC6}\x{7EC7}\x{7EC8}' . +'\x{7EC9}\x{7ECA}\x{7ECB}\x{7ECC}\x{7ECD}\x{7ECE}\x{7ECF}\x{7ED0}\x{7ED1}' . +'\x{7ED2}\x{7ED3}\x{7ED4}\x{7ED5}\x{7ED6}\x{7ED7}\x{7ED8}\x{7ED9}\x{7EDA}' . +'\x{7EDB}\x{7EDC}\x{7EDD}\x{7EDE}\x{7EDF}\x{7EE0}\x{7EE1}\x{7EE2}\x{7EE3}' . +'\x{7EE4}\x{7EE5}\x{7EE6}\x{7EE7}\x{7EE8}\x{7EE9}\x{7EEA}\x{7EEB}\x{7EEC}' . +'\x{7EED}\x{7EEE}\x{7EEF}\x{7EF0}\x{7EF1}\x{7EF2}\x{7EF3}\x{7EF4}\x{7EF5}' . +'\x{7EF6}\x{7EF7}\x{7EF8}\x{7EF9}\x{7EFA}\x{7EFB}\x{7EFC}\x{7EFD}\x{7EFE}' . +'\x{7EFF}\x{7F00}\x{7F01}\x{7F02}\x{7F03}\x{7F04}\x{7F05}\x{7F06}\x{7F07}' . +'\x{7F08}\x{7F09}\x{7F0A}\x{7F0B}\x{7F0C}\x{7F0D}\x{7F0E}\x{7F0F}\x{7F10}' . +'\x{7F11}\x{7F12}\x{7F13}\x{7F14}\x{7F15}\x{7F16}\x{7F17}\x{7F18}\x{7F19}' . +'\x{7F1A}\x{7F1B}\x{7F1C}\x{7F1D}\x{7F1E}\x{7F1F}\x{7F20}\x{7F21}\x{7F22}' . +'\x{7F23}\x{7F24}\x{7F25}\x{7F26}\x{7F27}\x{7F28}\x{7F29}\x{7F2A}\x{7F2B}' . +'\x{7F2C}\x{7F2D}\x{7F2E}\x{7F2F}\x{7F30}\x{7F31}\x{7F32}\x{7F33}\x{7F34}' . +'\x{7F35}\x{7F36}\x{7F37}\x{7F38}\x{7F39}\x{7F3A}\x{7F3D}\x{7F3E}\x{7F3F}' . +'\x{7F40}\x{7F42}\x{7F43}\x{7F44}\x{7F45}\x{7F47}\x{7F48}\x{7F49}\x{7F4A}' . +'\x{7F4B}\x{7F4C}\x{7F4D}\x{7F4E}\x{7F4F}\x{7F50}\x{7F51}\x{7F52}\x{7F53}' . +'\x{7F54}\x{7F55}\x{7F56}\x{7F57}\x{7F58}\x{7F5A}\x{7F5B}\x{7F5C}\x{7F5D}' . +'\x{7F5E}\x{7F5F}\x{7F60}\x{7F61}\x{7F62}\x{7F63}\x{7F64}\x{7F65}\x{7F66}' . +'\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6C}\x{7F6D}\x{7F6E}\x{7F6F}' . +'\x{7F70}\x{7F71}\x{7F72}\x{7F73}\x{7F74}\x{7F75}\x{7F76}\x{7F77}\x{7F78}' . +'\x{7F79}\x{7F7A}\x{7F7B}\x{7F7C}\x{7F7D}\x{7F7E}\x{7F7F}\x{7F80}\x{7F81}' . +'\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}\x{7F88}\x{7F89}\x{7F8A}\x{7F8B}' . +'\x{7F8C}\x{7F8D}\x{7F8E}\x{7F8F}\x{7F91}\x{7F92}\x{7F93}\x{7F94}\x{7F95}' . +'\x{7F96}\x{7F98}\x{7F9A}\x{7F9B}\x{7F9C}\x{7F9D}\x{7F9E}\x{7F9F}\x{7FA0}' . +'\x{7FA1}\x{7FA2}\x{7FA3}\x{7FA4}\x{7FA5}\x{7FA6}\x{7FA7}\x{7FA8}\x{7FA9}' . +'\x{7FAA}\x{7FAB}\x{7FAC}\x{7FAD}\x{7FAE}\x{7FAF}\x{7FB0}\x{7FB1}\x{7FB2}' . +'\x{7FB3}\x{7FB5}\x{7FB6}\x{7FB7}\x{7FB8}\x{7FB9}\x{7FBA}\x{7FBB}\x{7FBC}' . +'\x{7FBD}\x{7FBE}\x{7FBF}\x{7FC0}\x{7FC1}\x{7FC2}\x{7FC3}\x{7FC4}\x{7FC5}' . +'\x{7FC6}\x{7FC7}\x{7FC8}\x{7FC9}\x{7FCA}\x{7FCB}\x{7FCC}\x{7FCD}\x{7FCE}' . +'\x{7FCF}\x{7FD0}\x{7FD1}\x{7FD2}\x{7FD3}\x{7FD4}\x{7FD5}\x{7FD7}\x{7FD8}' . +'\x{7FD9}\x{7FDA}\x{7FDB}\x{7FDC}\x{7FDE}\x{7FDF}\x{7FE0}\x{7FE1}\x{7FE2}' . +'\x{7FE3}\x{7FE5}\x{7FE6}\x{7FE7}\x{7FE8}\x{7FE9}\x{7FEA}\x{7FEB}\x{7FEC}' . +'\x{7FED}\x{7FEE}\x{7FEF}\x{7FF0}\x{7FF1}\x{7FF2}\x{7FF3}\x{7FF4}\x{7FF5}' . +'\x{7FF6}\x{7FF7}\x{7FF8}\x{7FF9}\x{7FFA}\x{7FFB}\x{7FFC}\x{7FFD}\x{7FFE}' . +'\x{7FFF}\x{8000}\x{8001}\x{8002}\x{8003}\x{8004}\x{8005}\x{8006}\x{8007}' . +'\x{8008}\x{8009}\x{800B}\x{800C}\x{800D}\x{800E}\x{800F}\x{8010}\x{8011}' . +'\x{8012}\x{8013}\x{8014}\x{8015}\x{8016}\x{8017}\x{8018}\x{8019}\x{801A}' . +'\x{801B}\x{801C}\x{801D}\x{801E}\x{801F}\x{8020}\x{8021}\x{8022}\x{8023}' . +'\x{8024}\x{8025}\x{8026}\x{8027}\x{8028}\x{8029}\x{802A}\x{802B}\x{802C}' . +'\x{802D}\x{802E}\x{8030}\x{8031}\x{8032}\x{8033}\x{8034}\x{8035}\x{8036}' . +'\x{8037}\x{8038}\x{8039}\x{803A}\x{803B}\x{803D}\x{803E}\x{803F}\x{8041}' . +'\x{8042}\x{8043}\x{8044}\x{8045}\x{8046}\x{8047}\x{8048}\x{8049}\x{804A}' . +'\x{804B}\x{804C}\x{804D}\x{804E}\x{804F}\x{8050}\x{8051}\x{8052}\x{8053}' . +'\x{8054}\x{8055}\x{8056}\x{8057}\x{8058}\x{8059}\x{805A}\x{805B}\x{805C}' . +'\x{805D}\x{805E}\x{805F}\x{8060}\x{8061}\x{8062}\x{8063}\x{8064}\x{8065}' . +'\x{8067}\x{8068}\x{8069}\x{806A}\x{806B}\x{806C}\x{806D}\x{806E}\x{806F}' . +'\x{8070}\x{8071}\x{8072}\x{8073}\x{8074}\x{8075}\x{8076}\x{8077}\x{8078}' . +'\x{8079}\x{807A}\x{807B}\x{807C}\x{807D}\x{807E}\x{807F}\x{8080}\x{8081}' . +'\x{8082}\x{8083}\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808A}\x{808B}' . +'\x{808C}\x{808D}\x{808F}\x{8090}\x{8091}\x{8092}\x{8093}\x{8095}\x{8096}' . +'\x{8097}\x{8098}\x{8099}\x{809A}\x{809B}\x{809C}\x{809D}\x{809E}\x{809F}' . +'\x{80A0}\x{80A1}\x{80A2}\x{80A3}\x{80A4}\x{80A5}\x{80A9}\x{80AA}\x{80AB}' . +'\x{80AD}\x{80AE}\x{80AF}\x{80B0}\x{80B1}\x{80B2}\x{80B4}\x{80B5}\x{80B6}' . +'\x{80B7}\x{80B8}\x{80BA}\x{80BB}\x{80BC}\x{80BD}\x{80BE}\x{80BF}\x{80C0}' . +'\x{80C1}\x{80C2}\x{80C3}\x{80C4}\x{80C5}\x{80C6}\x{80C7}\x{80C8}\x{80C9}' . +'\x{80CA}\x{80CB}\x{80CC}\x{80CD}\x{80CE}\x{80CF}\x{80D0}\x{80D1}\x{80D2}' . +'\x{80D3}\x{80D4}\x{80D5}\x{80D6}\x{80D7}\x{80D8}\x{80D9}\x{80DA}\x{80DB}' . +'\x{80DC}\x{80DD}\x{80DE}\x{80E0}\x{80E1}\x{80E2}\x{80E3}\x{80E4}\x{80E5}' . +'\x{80E6}\x{80E7}\x{80E8}\x{80E9}\x{80EA}\x{80EB}\x{80EC}\x{80ED}\x{80EE}' . +'\x{80EF}\x{80F0}\x{80F1}\x{80F2}\x{80F3}\x{80F4}\x{80F5}\x{80F6}\x{80F7}' . +'\x{80F8}\x{80F9}\x{80FA}\x{80FB}\x{80FC}\x{80FD}\x{80FE}\x{80FF}\x{8100}' . +'\x{8101}\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{810B}' . +'\x{810C}\x{810D}\x{810E}\x{810F}\x{8110}\x{8111}\x{8112}\x{8113}\x{8114}' . +'\x{8115}\x{8116}\x{8118}\x{8119}\x{811A}\x{811B}\x{811C}\x{811D}\x{811E}' . +'\x{811F}\x{8120}\x{8121}\x{8122}\x{8123}\x{8124}\x{8125}\x{8126}\x{8127}' . +'\x{8128}\x{8129}\x{812A}\x{812B}\x{812C}\x{812D}\x{812E}\x{812F}\x{8130}' . +'\x{8131}\x{8132}\x{8136}\x{8137}\x{8138}\x{8139}\x{813A}\x{813B}\x{813C}' . +'\x{813D}\x{813E}\x{813F}\x{8140}\x{8141}\x{8142}\x{8143}\x{8144}\x{8145}' . +'\x{8146}\x{8147}\x{8148}\x{8149}\x{814A}\x{814B}\x{814C}\x{814D}\x{814E}' . +'\x{814F}\x{8150}\x{8151}\x{8152}\x{8153}\x{8154}\x{8155}\x{8156}\x{8157}' . +'\x{8158}\x{8159}\x{815A}\x{815B}\x{815C}\x{815D}\x{815E}\x{8160}\x{8161}' . +'\x{8162}\x{8163}\x{8164}\x{8165}\x{8166}\x{8167}\x{8168}\x{8169}\x{816A}' . +'\x{816B}\x{816C}\x{816D}\x{816E}\x{816F}\x{8170}\x{8171}\x{8172}\x{8173}' . +'\x{8174}\x{8175}\x{8176}\x{8177}\x{8178}\x{8179}\x{817A}\x{817B}\x{817C}' . +'\x{817D}\x{817E}\x{817F}\x{8180}\x{8181}\x{8182}\x{8183}\x{8185}\x{8186}' . +'\x{8187}\x{8188}\x{8189}\x{818A}\x{818B}\x{818C}\x{818D}\x{818E}\x{818F}' . +'\x{8191}\x{8192}\x{8193}\x{8194}\x{8195}\x{8197}\x{8198}\x{8199}\x{819A}' . +'\x{819B}\x{819C}\x{819D}\x{819E}\x{819F}\x{81A0}\x{81A1}\x{81A2}\x{81A3}' . +'\x{81A4}\x{81A5}\x{81A6}\x{81A7}\x{81A8}\x{81A9}\x{81AA}\x{81AB}\x{81AC}' . +'\x{81AD}\x{81AE}\x{81AF}\x{81B0}\x{81B1}\x{81B2}\x{81B3}\x{81B4}\x{81B5}' . +'\x{81B6}\x{81B7}\x{81B8}\x{81B9}\x{81BA}\x{81BB}\x{81BC}\x{81BD}\x{81BE}' . +'\x{81BF}\x{81C0}\x{81C1}\x{81C2}\x{81C3}\x{81C4}\x{81C5}\x{81C6}\x{81C7}' . +'\x{81C8}\x{81C9}\x{81CA}\x{81CC}\x{81CD}\x{81CE}\x{81CF}\x{81D0}\x{81D1}' . +'\x{81D2}\x{81D4}\x{81D5}\x{81D6}\x{81D7}\x{81D8}\x{81D9}\x{81DA}\x{81DB}' . +'\x{81DC}\x{81DD}\x{81DE}\x{81DF}\x{81E0}\x{81E1}\x{81E2}\x{81E3}\x{81E5}' . +'\x{81E6}\x{81E7}\x{81E8}\x{81E9}\x{81EA}\x{81EB}\x{81EC}\x{81ED}\x{81EE}' . +'\x{81F1}\x{81F2}\x{81F3}\x{81F4}\x{81F5}\x{81F6}\x{81F7}\x{81F8}\x{81F9}' . +'\x{81FA}\x{81FB}\x{81FC}\x{81FD}\x{81FE}\x{81FF}\x{8200}\x{8201}\x{8202}' . +'\x{8203}\x{8204}\x{8205}\x{8206}\x{8207}\x{8208}\x{8209}\x{820A}\x{820B}' . +'\x{820C}\x{820D}\x{820E}\x{820F}\x{8210}\x{8211}\x{8212}\x{8214}\x{8215}' . +'\x{8216}\x{8218}\x{8219}\x{821A}\x{821B}\x{821C}\x{821D}\x{821E}\x{821F}' . +'\x{8220}\x{8221}\x{8222}\x{8223}\x{8225}\x{8226}\x{8227}\x{8228}\x{8229}' . +'\x{822A}\x{822B}\x{822C}\x{822D}\x{822F}\x{8230}\x{8231}\x{8232}\x{8233}' . +'\x{8234}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{823A}\x{823B}\x{823C}' . +'\x{823D}\x{823E}\x{823F}\x{8240}\x{8242}\x{8243}\x{8244}\x{8245}\x{8246}' . +'\x{8247}\x{8248}\x{8249}\x{824A}\x{824B}\x{824C}\x{824D}\x{824E}\x{824F}' . +'\x{8250}\x{8251}\x{8252}\x{8253}\x{8254}\x{8255}\x{8256}\x{8257}\x{8258}' . +'\x{8259}\x{825A}\x{825B}\x{825C}\x{825D}\x{825E}\x{825F}\x{8260}\x{8261}' . +'\x{8263}\x{8264}\x{8266}\x{8267}\x{8268}\x{8269}\x{826A}\x{826B}\x{826C}' . +'\x{826D}\x{826E}\x{826F}\x{8270}\x{8271}\x{8272}\x{8273}\x{8274}\x{8275}' . +'\x{8276}\x{8277}\x{8278}\x{8279}\x{827A}\x{827B}\x{827C}\x{827D}\x{827E}' . +'\x{827F}\x{8280}\x{8281}\x{8282}\x{8283}\x{8284}\x{8285}\x{8286}\x{8287}' . +'\x{8288}\x{8289}\x{828A}\x{828B}\x{828D}\x{828E}\x{828F}\x{8290}\x{8291}' . +'\x{8292}\x{8293}\x{8294}\x{8295}\x{8296}\x{8297}\x{8298}\x{8299}\x{829A}' . +'\x{829B}\x{829C}\x{829D}\x{829E}\x{829F}\x{82A0}\x{82A1}\x{82A2}\x{82A3}' . +'\x{82A4}\x{82A5}\x{82A6}\x{82A7}\x{82A8}\x{82A9}\x{82AA}\x{82AB}\x{82AC}' . +'\x{82AD}\x{82AE}\x{82AF}\x{82B0}\x{82B1}\x{82B3}\x{82B4}\x{82B5}\x{82B6}' . +'\x{82B7}\x{82B8}\x{82B9}\x{82BA}\x{82BB}\x{82BC}\x{82BD}\x{82BE}\x{82BF}' . +'\x{82C0}\x{82C1}\x{82C2}\x{82C3}\x{82C4}\x{82C5}\x{82C6}\x{82C7}\x{82C8}' . +'\x{82C9}\x{82CA}\x{82CB}\x{82CC}\x{82CD}\x{82CE}\x{82CF}\x{82D0}\x{82D1}' . +'\x{82D2}\x{82D3}\x{82D4}\x{82D5}\x{82D6}\x{82D7}\x{82D8}\x{82D9}\x{82DA}' . +'\x{82DB}\x{82DC}\x{82DD}\x{82DE}\x{82DF}\x{82E0}\x{82E1}\x{82E3}\x{82E4}' . +'\x{82E5}\x{82E6}\x{82E7}\x{82E8}\x{82E9}\x{82EA}\x{82EB}\x{82EC}\x{82ED}' . +'\x{82EE}\x{82EF}\x{82F0}\x{82F1}\x{82F2}\x{82F3}\x{82F4}\x{82F5}\x{82F6}' . +'\x{82F7}\x{82F8}\x{82F9}\x{82FA}\x{82FB}\x{82FD}\x{82FE}\x{82FF}\x{8300}' . +'\x{8301}\x{8302}\x{8303}\x{8304}\x{8305}\x{8306}\x{8307}\x{8308}\x{8309}' . +'\x{830B}\x{830C}\x{830D}\x{830E}\x{830F}\x{8311}\x{8312}\x{8313}\x{8314}' . +'\x{8315}\x{8316}\x{8317}\x{8318}\x{8319}\x{831A}\x{831B}\x{831C}\x{831D}' . +'\x{831E}\x{831F}\x{8320}\x{8321}\x{8322}\x{8323}\x{8324}\x{8325}\x{8326}' . +'\x{8327}\x{8328}\x{8329}\x{832A}\x{832B}\x{832C}\x{832D}\x{832E}\x{832F}' . +'\x{8331}\x{8332}\x{8333}\x{8334}\x{8335}\x{8336}\x{8337}\x{8338}\x{8339}' . +'\x{833A}\x{833B}\x{833C}\x{833D}\x{833E}\x{833F}\x{8340}\x{8341}\x{8342}' . +'\x{8343}\x{8344}\x{8345}\x{8346}\x{8347}\x{8348}\x{8349}\x{834A}\x{834B}' . +'\x{834C}\x{834D}\x{834E}\x{834F}\x{8350}\x{8351}\x{8352}\x{8353}\x{8354}' . +'\x{8356}\x{8357}\x{8358}\x{8359}\x{835A}\x{835B}\x{835C}\x{835D}\x{835E}' . +'\x{835F}\x{8360}\x{8361}\x{8362}\x{8363}\x{8364}\x{8365}\x{8366}\x{8367}' . +'\x{8368}\x{8369}\x{836A}\x{836B}\x{836C}\x{836D}\x{836E}\x{836F}\x{8370}' . +'\x{8371}\x{8372}\x{8373}\x{8374}\x{8375}\x{8376}\x{8377}\x{8378}\x{8379}' . +'\x{837A}\x{837B}\x{837C}\x{837D}\x{837E}\x{837F}\x{8380}\x{8381}\x{8382}' . +'\x{8383}\x{8384}\x{8385}\x{8386}\x{8387}\x{8388}\x{8389}\x{838A}\x{838B}' . +'\x{838C}\x{838D}\x{838E}\x{838F}\x{8390}\x{8391}\x{8392}\x{8393}\x{8394}' . +'\x{8395}\x{8396}\x{8397}\x{8398}\x{8399}\x{839A}\x{839B}\x{839C}\x{839D}' . +'\x{839E}\x{83A0}\x{83A1}\x{83A2}\x{83A3}\x{83A4}\x{83A5}\x{83A6}\x{83A7}' . +'\x{83A8}\x{83A9}\x{83AA}\x{83AB}\x{83AC}\x{83AD}\x{83AE}\x{83AF}\x{83B0}' . +'\x{83B1}\x{83B2}\x{83B3}\x{83B4}\x{83B6}\x{83B7}\x{83B8}\x{83B9}\x{83BA}' . +'\x{83BB}\x{83BC}\x{83BD}\x{83BF}\x{83C0}\x{83C1}\x{83C2}\x{83C3}\x{83C4}' . +'\x{83C5}\x{83C6}\x{83C7}\x{83C8}\x{83C9}\x{83CA}\x{83CB}\x{83CC}\x{83CD}' . +'\x{83CE}\x{83CF}\x{83D0}\x{83D1}\x{83D2}\x{83D3}\x{83D4}\x{83D5}\x{83D6}' . +'\x{83D7}\x{83D8}\x{83D9}\x{83DA}\x{83DB}\x{83DC}\x{83DD}\x{83DE}\x{83DF}' . +'\x{83E0}\x{83E1}\x{83E2}\x{83E3}\x{83E4}\x{83E5}\x{83E7}\x{83E8}\x{83E9}' . +'\x{83EA}\x{83EB}\x{83EC}\x{83EE}\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F3}' . +'\x{83F4}\x{83F5}\x{83F6}\x{83F7}\x{83F8}\x{83F9}\x{83FA}\x{83FB}\x{83FC}' . +'\x{83FD}\x{83FE}\x{83FF}\x{8400}\x{8401}\x{8402}\x{8403}\x{8404}\x{8405}' . +'\x{8406}\x{8407}\x{8408}\x{8409}\x{840A}\x{840B}\x{840C}\x{840D}\x{840E}' . +'\x{840F}\x{8410}\x{8411}\x{8412}\x{8413}\x{8415}\x{8418}\x{8419}\x{841A}' . +'\x{841B}\x{841C}\x{841D}\x{841E}\x{8421}\x{8422}\x{8423}\x{8424}\x{8425}' . +'\x{8426}\x{8427}\x{8428}\x{8429}\x{842A}\x{842B}\x{842C}\x{842D}\x{842E}' . +'\x{842F}\x{8430}\x{8431}\x{8432}\x{8433}\x{8434}\x{8435}\x{8436}\x{8437}' . +'\x{8438}\x{8439}\x{843A}\x{843B}\x{843C}\x{843D}\x{843E}\x{843F}\x{8440}' . +'\x{8441}\x{8442}\x{8443}\x{8444}\x{8445}\x{8446}\x{8447}\x{8448}\x{8449}' . +'\x{844A}\x{844B}\x{844C}\x{844D}\x{844E}\x{844F}\x{8450}\x{8451}\x{8452}' . +'\x{8453}\x{8454}\x{8455}\x{8456}\x{8457}\x{8459}\x{845A}\x{845B}\x{845C}' . +'\x{845D}\x{845E}\x{845F}\x{8460}\x{8461}\x{8462}\x{8463}\x{8464}\x{8465}' . +'\x{8466}\x{8467}\x{8468}\x{8469}\x{846A}\x{846B}\x{846C}\x{846D}\x{846E}' . +'\x{846F}\x{8470}\x{8471}\x{8472}\x{8473}\x{8474}\x{8475}\x{8476}\x{8477}' . +'\x{8478}\x{8479}\x{847A}\x{847B}\x{847C}\x{847D}\x{847E}\x{847F}\x{8480}' . +'\x{8481}\x{8482}\x{8484}\x{8485}\x{8486}\x{8487}\x{8488}\x{8489}\x{848A}' . +'\x{848B}\x{848C}\x{848D}\x{848E}\x{848F}\x{8490}\x{8491}\x{8492}\x{8493}' . +'\x{8494}\x{8496}\x{8497}\x{8498}\x{8499}\x{849A}\x{849B}\x{849C}\x{849D}' . +'\x{849E}\x{849F}\x{84A0}\x{84A1}\x{84A2}\x{84A3}\x{84A4}\x{84A5}\x{84A6}' . +'\x{84A7}\x{84A8}\x{84A9}\x{84AA}\x{84AB}\x{84AC}\x{84AE}\x{84AF}\x{84B0}' . +'\x{84B1}\x{84B2}\x{84B3}\x{84B4}\x{84B5}\x{84B6}\x{84B8}\x{84B9}\x{84BA}' . +'\x{84BB}\x{84BC}\x{84BD}\x{84BE}\x{84BF}\x{84C0}\x{84C1}\x{84C2}\x{84C4}' . +'\x{84C5}\x{84C6}\x{84C7}\x{84C8}\x{84C9}\x{84CA}\x{84CB}\x{84CC}\x{84CD}' . +'\x{84CE}\x{84CF}\x{84D0}\x{84D1}\x{84D2}\x{84D3}\x{84D4}\x{84D5}\x{84D6}' . +'\x{84D7}\x{84D8}\x{84D9}\x{84DB}\x{84DC}\x{84DD}\x{84DE}\x{84DF}\x{84E0}' . +'\x{84E1}\x{84E2}\x{84E3}\x{84E4}\x{84E5}\x{84E6}\x{84E7}\x{84E8}\x{84E9}' . +'\x{84EA}\x{84EB}\x{84EC}\x{84EE}\x{84EF}\x{84F0}\x{84F1}\x{84F2}\x{84F3}' . +'\x{84F4}\x{84F5}\x{84F6}\x{84F7}\x{84F8}\x{84F9}\x{84FA}\x{84FB}\x{84FC}' . +'\x{84FD}\x{84FE}\x{84FF}\x{8500}\x{8501}\x{8502}\x{8503}\x{8504}\x{8506}' . +'\x{8507}\x{8508}\x{8509}\x{850A}\x{850B}\x{850C}\x{850D}\x{850E}\x{850F}' . +'\x{8511}\x{8512}\x{8513}\x{8514}\x{8515}\x{8516}\x{8517}\x{8518}\x{8519}' . +'\x{851A}\x{851B}\x{851C}\x{851D}\x{851E}\x{851F}\x{8520}\x{8521}\x{8522}' . +'\x{8523}\x{8524}\x{8525}\x{8526}\x{8527}\x{8528}\x{8529}\x{852A}\x{852B}' . +'\x{852C}\x{852D}\x{852E}\x{852F}\x{8530}\x{8531}\x{8534}\x{8535}\x{8536}' . +'\x{8537}\x{8538}\x{8539}\x{853A}\x{853B}\x{853C}\x{853D}\x{853E}\x{853F}' . +'\x{8540}\x{8541}\x{8542}\x{8543}\x{8544}\x{8545}\x{8546}\x{8547}\x{8548}' . +'\x{8549}\x{854A}\x{854B}\x{854D}\x{854E}\x{854F}\x{8551}\x{8552}\x{8553}' . +'\x{8554}\x{8555}\x{8556}\x{8557}\x{8558}\x{8559}\x{855A}\x{855B}\x{855C}' . +'\x{855D}\x{855E}\x{855F}\x{8560}\x{8561}\x{8562}\x{8563}\x{8564}\x{8565}' . +'\x{8566}\x{8567}\x{8568}\x{8569}\x{856A}\x{856B}\x{856C}\x{856D}\x{856E}' . +'\x{856F}\x{8570}\x{8571}\x{8572}\x{8573}\x{8574}\x{8575}\x{8576}\x{8577}' . +'\x{8578}\x{8579}\x{857A}\x{857B}\x{857C}\x{857D}\x{857E}\x{8580}\x{8581}' . +'\x{8582}\x{8583}\x{8584}\x{8585}\x{8586}\x{8587}\x{8588}\x{8589}\x{858A}' . +'\x{858B}\x{858C}\x{858D}\x{858E}\x{858F}\x{8590}\x{8591}\x{8592}\x{8594}' . +'\x{8595}\x{8596}\x{8598}\x{8599}\x{859A}\x{859B}\x{859C}\x{859D}\x{859E}' . +'\x{859F}\x{85A0}\x{85A1}\x{85A2}\x{85A3}\x{85A4}\x{85A5}\x{85A6}\x{85A7}' . +'\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AD}\x{85AE}\x{85AF}\x{85B0}' . +'\x{85B1}\x{85B3}\x{85B4}\x{85B5}\x{85B6}\x{85B7}\x{85B8}\x{85B9}\x{85BA}' . +'\x{85BC}\x{85BD}\x{85BE}\x{85BF}\x{85C0}\x{85C1}\x{85C2}\x{85C3}\x{85C4}' . +'\x{85C5}\x{85C6}\x{85C7}\x{85C8}\x{85C9}\x{85CA}\x{85CB}\x{85CD}\x{85CE}' . +'\x{85CF}\x{85D0}\x{85D1}\x{85D2}\x{85D3}\x{85D4}\x{85D5}\x{85D6}\x{85D7}' . +'\x{85D8}\x{85D9}\x{85DA}\x{85DB}\x{85DC}\x{85DD}\x{85DE}\x{85DF}\x{85E0}' . +'\x{85E1}\x{85E2}\x{85E3}\x{85E4}\x{85E5}\x{85E6}\x{85E7}\x{85E8}\x{85E9}' . +'\x{85EA}\x{85EB}\x{85EC}\x{85ED}\x{85EF}\x{85F0}\x{85F1}\x{85F2}\x{85F4}' . +'\x{85F5}\x{85F6}\x{85F7}\x{85F8}\x{85F9}\x{85FA}\x{85FB}\x{85FD}\x{85FE}' . +'\x{85FF}\x{8600}\x{8601}\x{8602}\x{8604}\x{8605}\x{8606}\x{8607}\x{8608}' . +'\x{8609}\x{860A}\x{860B}\x{860C}\x{860F}\x{8611}\x{8612}\x{8613}\x{8614}' . +'\x{8616}\x{8617}\x{8618}\x{8619}\x{861A}\x{861B}\x{861C}\x{861E}\x{861F}' . +'\x{8620}\x{8621}\x{8622}\x{8623}\x{8624}\x{8625}\x{8626}\x{8627}\x{8628}' . +'\x{8629}\x{862A}\x{862B}\x{862C}\x{862D}\x{862E}\x{862F}\x{8630}\x{8631}' . +'\x{8632}\x{8633}\x{8634}\x{8635}\x{8636}\x{8638}\x{8639}\x{863A}\x{863B}' . +'\x{863C}\x{863D}\x{863E}\x{863F}\x{8640}\x{8641}\x{8642}\x{8643}\x{8644}' . +'\x{8645}\x{8646}\x{8647}\x{8648}\x{8649}\x{864A}\x{864B}\x{864C}\x{864D}' . +'\x{864E}\x{864F}\x{8650}\x{8651}\x{8652}\x{8653}\x{8654}\x{8655}\x{8656}' . +'\x{8658}\x{8659}\x{865A}\x{865B}\x{865C}\x{865D}\x{865E}\x{865F}\x{8660}' . +'\x{8661}\x{8662}\x{8663}\x{8664}\x{8665}\x{8666}\x{8667}\x{8668}\x{8669}' . +'\x{866A}\x{866B}\x{866C}\x{866D}\x{866E}\x{866F}\x{8670}\x{8671}\x{8672}' . +'\x{8673}\x{8674}\x{8676}\x{8677}\x{8678}\x{8679}\x{867A}\x{867B}\x{867C}' . +'\x{867D}\x{867E}\x{867F}\x{8680}\x{8681}\x{8682}\x{8683}\x{8684}\x{8685}' . +'\x{8686}\x{8687}\x{8688}\x{868A}\x{868B}\x{868C}\x{868D}\x{868E}\x{868F}' . +'\x{8690}\x{8691}\x{8693}\x{8694}\x{8695}\x{8696}\x{8697}\x{8698}\x{8699}' . +'\x{869A}\x{869B}\x{869C}\x{869D}\x{869E}\x{869F}\x{86A1}\x{86A2}\x{86A3}' . +'\x{86A4}\x{86A5}\x{86A7}\x{86A8}\x{86A9}\x{86AA}\x{86AB}\x{86AC}\x{86AD}' . +'\x{86AE}\x{86AF}\x{86B0}\x{86B1}\x{86B2}\x{86B3}\x{86B4}\x{86B5}\x{86B6}' . +'\x{86B7}\x{86B8}\x{86B9}\x{86BA}\x{86BB}\x{86BC}\x{86BD}\x{86BE}\x{86BF}' . +'\x{86C0}\x{86C1}\x{86C2}\x{86C3}\x{86C4}\x{86C5}\x{86C6}\x{86C7}\x{86C8}' . +'\x{86C9}\x{86CA}\x{86CB}\x{86CC}\x{86CE}\x{86CF}\x{86D0}\x{86D1}\x{86D2}' . +'\x{86D3}\x{86D4}\x{86D6}\x{86D7}\x{86D8}\x{86D9}\x{86DA}\x{86DB}\x{86DC}' . +'\x{86DD}\x{86DE}\x{86DF}\x{86E1}\x{86E2}\x{86E3}\x{86E4}\x{86E5}\x{86E6}' . +'\x{86E8}\x{86E9}\x{86EA}\x{86EB}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F0}' . +'\x{86F1}\x{86F2}\x{86F3}\x{86F4}\x{86F5}\x{86F6}\x{86F7}\x{86F8}\x{86F9}' . +'\x{86FA}\x{86FB}\x{86FC}\x{86FE}\x{86FF}\x{8700}\x{8701}\x{8702}\x{8703}' . +'\x{8704}\x{8705}\x{8706}\x{8707}\x{8708}\x{8709}\x{870A}\x{870B}\x{870C}' . +'\x{870D}\x{870E}\x{870F}\x{8710}\x{8711}\x{8712}\x{8713}\x{8714}\x{8715}' . +'\x{8716}\x{8717}\x{8718}\x{8719}\x{871A}\x{871B}\x{871C}\x{871E}\x{871F}' . +'\x{8720}\x{8721}\x{8722}\x{8723}\x{8724}\x{8725}\x{8726}\x{8727}\x{8728}' . +'\x{8729}\x{872A}\x{872B}\x{872C}\x{872D}\x{872E}\x{8730}\x{8731}\x{8732}' . +'\x{8733}\x{8734}\x{8735}\x{8736}\x{8737}\x{8738}\x{8739}\x{873A}\x{873B}' . +'\x{873C}\x{873E}\x{873F}\x{8740}\x{8741}\x{8742}\x{8743}\x{8744}\x{8746}' . +'\x{8747}\x{8748}\x{8749}\x{874A}\x{874C}\x{874D}\x{874E}\x{874F}\x{8750}' . +'\x{8751}\x{8752}\x{8753}\x{8754}\x{8755}\x{8756}\x{8757}\x{8758}\x{8759}' . +'\x{875A}\x{875B}\x{875C}\x{875D}\x{875E}\x{875F}\x{8760}\x{8761}\x{8762}' . +'\x{8763}\x{8764}\x{8765}\x{8766}\x{8767}\x{8768}\x{8769}\x{876A}\x{876B}' . +'\x{876C}\x{876D}\x{876E}\x{876F}\x{8770}\x{8772}\x{8773}\x{8774}\x{8775}' . +'\x{8776}\x{8777}\x{8778}\x{8779}\x{877A}\x{877B}\x{877C}\x{877D}\x{877E}' . +'\x{8780}\x{8781}\x{8782}\x{8783}\x{8784}\x{8785}\x{8786}\x{8787}\x{8788}' . +'\x{8789}\x{878A}\x{878B}\x{878C}\x{878D}\x{878F}\x{8790}\x{8791}\x{8792}' . +'\x{8793}\x{8794}\x{8795}\x{8796}\x{8797}\x{8798}\x{879A}\x{879B}\x{879C}' . +'\x{879D}\x{879E}\x{879F}\x{87A0}\x{87A1}\x{87A2}\x{87A3}\x{87A4}\x{87A5}' . +'\x{87A6}\x{87A7}\x{87A8}\x{87A9}\x{87AA}\x{87AB}\x{87AC}\x{87AD}\x{87AE}' . +'\x{87AF}\x{87B0}\x{87B1}\x{87B2}\x{87B3}\x{87B4}\x{87B5}\x{87B6}\x{87B7}' . +'\x{87B8}\x{87B9}\x{87BA}\x{87BB}\x{87BC}\x{87BD}\x{87BE}\x{87BF}\x{87C0}' . +'\x{87C1}\x{87C2}\x{87C3}\x{87C4}\x{87C5}\x{87C6}\x{87C7}\x{87C8}\x{87C9}' . +'\x{87CA}\x{87CB}\x{87CC}\x{87CD}\x{87CE}\x{87CF}\x{87D0}\x{87D1}\x{87D2}' . +'\x{87D3}\x{87D4}\x{87D5}\x{87D6}\x{87D7}\x{87D8}\x{87D9}\x{87DB}\x{87DC}' . +'\x{87DD}\x{87DE}\x{87DF}\x{87E0}\x{87E1}\x{87E2}\x{87E3}\x{87E4}\x{87E5}' . +'\x{87E6}\x{87E7}\x{87E8}\x{87E9}\x{87EA}\x{87EB}\x{87EC}\x{87ED}\x{87EE}' . +'\x{87EF}\x{87F1}\x{87F2}\x{87F3}\x{87F4}\x{87F5}\x{87F6}\x{87F7}\x{87F8}' . +'\x{87F9}\x{87FA}\x{87FB}\x{87FC}\x{87FD}\x{87FE}\x{87FF}\x{8800}\x{8801}' . +'\x{8802}\x{8803}\x{8804}\x{8805}\x{8806}\x{8808}\x{8809}\x{880A}\x{880B}' . +'\x{880C}\x{880D}\x{880E}\x{880F}\x{8810}\x{8811}\x{8813}\x{8814}\x{8815}' . +'\x{8816}\x{8817}\x{8818}\x{8819}\x{881A}\x{881B}\x{881C}\x{881D}\x{881E}' . +'\x{881F}\x{8820}\x{8821}\x{8822}\x{8823}\x{8824}\x{8825}\x{8826}\x{8827}' . +'\x{8828}\x{8829}\x{882A}\x{882B}\x{882C}\x{882E}\x{882F}\x{8830}\x{8831}' . +'\x{8832}\x{8833}\x{8834}\x{8835}\x{8836}\x{8837}\x{8838}\x{8839}\x{883B}' . +'\x{883C}\x{883D}\x{883E}\x{883F}\x{8840}\x{8841}\x{8842}\x{8843}\x{8844}' . +'\x{8845}\x{8846}\x{8848}\x{8849}\x{884A}\x{884B}\x{884C}\x{884D}\x{884E}' . +'\x{884F}\x{8850}\x{8851}\x{8852}\x{8853}\x{8854}\x{8855}\x{8856}\x{8857}' . +'\x{8859}\x{885A}\x{885B}\x{885D}\x{885E}\x{8860}\x{8861}\x{8862}\x{8863}' . +'\x{8864}\x{8865}\x{8866}\x{8867}\x{8868}\x{8869}\x{886A}\x{886B}\x{886C}' . +'\x{886D}\x{886E}\x{886F}\x{8870}\x{8871}\x{8872}\x{8873}\x{8874}\x{8875}' . +'\x{8876}\x{8877}\x{8878}\x{8879}\x{887B}\x{887C}\x{887D}\x{887E}\x{887F}' . +'\x{8880}\x{8881}\x{8882}\x{8883}\x{8884}\x{8885}\x{8886}\x{8887}\x{8888}' . +'\x{8889}\x{888A}\x{888B}\x{888C}\x{888D}\x{888E}\x{888F}\x{8890}\x{8891}' . +'\x{8892}\x{8893}\x{8894}\x{8895}\x{8896}\x{8897}\x{8898}\x{8899}\x{889A}' . +'\x{889B}\x{889C}\x{889D}\x{889E}\x{889F}\x{88A0}\x{88A1}\x{88A2}\x{88A3}' . +'\x{88A4}\x{88A5}\x{88A6}\x{88A7}\x{88A8}\x{88A9}\x{88AA}\x{88AB}\x{88AC}' . +'\x{88AD}\x{88AE}\x{88AF}\x{88B0}\x{88B1}\x{88B2}\x{88B3}\x{88B4}\x{88B6}' . +'\x{88B7}\x{88B8}\x{88B9}\x{88BA}\x{88BB}\x{88BC}\x{88BD}\x{88BE}\x{88BF}' . +'\x{88C0}\x{88C1}\x{88C2}\x{88C3}\x{88C4}\x{88C5}\x{88C6}\x{88C7}\x{88C8}' . +'\x{88C9}\x{88CA}\x{88CB}\x{88CC}\x{88CD}\x{88CE}\x{88CF}\x{88D0}\x{88D1}' . +'\x{88D2}\x{88D3}\x{88D4}\x{88D5}\x{88D6}\x{88D7}\x{88D8}\x{88D9}\x{88DA}' . +'\x{88DB}\x{88DC}\x{88DD}\x{88DE}\x{88DF}\x{88E0}\x{88E1}\x{88E2}\x{88E3}' . +'\x{88E4}\x{88E5}\x{88E7}\x{88E8}\x{88EA}\x{88EB}\x{88EC}\x{88EE}\x{88EF}' . +'\x{88F0}\x{88F1}\x{88F2}\x{88F3}\x{88F4}\x{88F5}\x{88F6}\x{88F7}\x{88F8}' . +'\x{88F9}\x{88FA}\x{88FB}\x{88FC}\x{88FD}\x{88FE}\x{88FF}\x{8900}\x{8901}' . +'\x{8902}\x{8904}\x{8905}\x{8906}\x{8907}\x{8908}\x{8909}\x{890A}\x{890B}' . +'\x{890C}\x{890D}\x{890E}\x{8910}\x{8911}\x{8912}\x{8913}\x{8914}\x{8915}' . +'\x{8916}\x{8917}\x{8918}\x{8919}\x{891A}\x{891B}\x{891C}\x{891D}\x{891E}' . +'\x{891F}\x{8920}\x{8921}\x{8922}\x{8923}\x{8925}\x{8926}\x{8927}\x{8928}' . +'\x{8929}\x{892A}\x{892B}\x{892C}\x{892D}\x{892E}\x{892F}\x{8930}\x{8931}' . +'\x{8932}\x{8933}\x{8934}\x{8935}\x{8936}\x{8937}\x{8938}\x{8939}\x{893A}' . +'\x{893B}\x{893C}\x{893D}\x{893E}\x{893F}\x{8940}\x{8941}\x{8942}\x{8943}' . +'\x{8944}\x{8945}\x{8946}\x{8947}\x{8948}\x{8949}\x{894A}\x{894B}\x{894C}' . +'\x{894E}\x{894F}\x{8950}\x{8951}\x{8952}\x{8953}\x{8954}\x{8955}\x{8956}' . +'\x{8957}\x{8958}\x{8959}\x{895A}\x{895B}\x{895C}\x{895D}\x{895E}\x{895F}' . +'\x{8960}\x{8961}\x{8962}\x{8963}\x{8964}\x{8966}\x{8967}\x{8968}\x{8969}' . +'\x{896A}\x{896B}\x{896C}\x{896D}\x{896E}\x{896F}\x{8970}\x{8971}\x{8972}' . +'\x{8973}\x{8974}\x{8976}\x{8977}\x{8978}\x{8979}\x{897A}\x{897B}\x{897C}' . +'\x{897E}\x{897F}\x{8980}\x{8981}\x{8982}\x{8983}\x{8984}\x{8985}\x{8986}' . +'\x{8987}\x{8988}\x{8989}\x{898A}\x{898B}\x{898C}\x{898E}\x{898F}\x{8991}' . +'\x{8992}\x{8993}\x{8995}\x{8996}\x{8997}\x{8998}\x{899A}\x{899B}\x{899C}' . +'\x{899D}\x{899E}\x{899F}\x{89A0}\x{89A1}\x{89A2}\x{89A3}\x{89A4}\x{89A5}' . +'\x{89A6}\x{89A7}\x{89A8}\x{89AA}\x{89AB}\x{89AC}\x{89AD}\x{89AE}\x{89AF}' . +'\x{89B1}\x{89B2}\x{89B3}\x{89B5}\x{89B6}\x{89B7}\x{89B8}\x{89B9}\x{89BA}' . +'\x{89BD}\x{89BE}\x{89BF}\x{89C0}\x{89C1}\x{89C2}\x{89C3}\x{89C4}\x{89C5}' . +'\x{89C6}\x{89C7}\x{89C8}\x{89C9}\x{89CA}\x{89CB}\x{89CC}\x{89CD}\x{89CE}' . +'\x{89CF}\x{89D0}\x{89D1}\x{89D2}\x{89D3}\x{89D4}\x{89D5}\x{89D6}\x{89D7}' . +'\x{89D8}\x{89D9}\x{89DA}\x{89DB}\x{89DC}\x{89DD}\x{89DE}\x{89DF}\x{89E0}' . +'\x{89E1}\x{89E2}\x{89E3}\x{89E4}\x{89E5}\x{89E6}\x{89E7}\x{89E8}\x{89E9}' . +'\x{89EA}\x{89EB}\x{89EC}\x{89ED}\x{89EF}\x{89F0}\x{89F1}\x{89F2}\x{89F3}' . +'\x{89F4}\x{89F6}\x{89F7}\x{89F8}\x{89FA}\x{89FB}\x{89FC}\x{89FE}\x{89FF}' . +'\x{8A00}\x{8A01}\x{8A02}\x{8A03}\x{8A04}\x{8A07}\x{8A08}\x{8A09}\x{8A0A}' . +'\x{8A0B}\x{8A0C}\x{8A0D}\x{8A0E}\x{8A0F}\x{8A10}\x{8A11}\x{8A12}\x{8A13}' . +'\x{8A15}\x{8A16}\x{8A17}\x{8A18}\x{8A1A}\x{8A1B}\x{8A1C}\x{8A1D}\x{8A1E}' . +'\x{8A1F}\x{8A22}\x{8A23}\x{8A24}\x{8A25}\x{8A26}\x{8A27}\x{8A28}\x{8A29}' . +'\x{8A2A}\x{8A2C}\x{8A2D}\x{8A2E}\x{8A2F}\x{8A30}\x{8A31}\x{8A32}\x{8A34}' . +'\x{8A35}\x{8A36}\x{8A37}\x{8A38}\x{8A39}\x{8A3A}\x{8A3B}\x{8A3C}\x{8A3E}' . +'\x{8A3F}\x{8A40}\x{8A41}\x{8A42}\x{8A43}\x{8A44}\x{8A45}\x{8A46}\x{8A47}' . +'\x{8A48}\x{8A49}\x{8A4A}\x{8A4C}\x{8A4D}\x{8A4E}\x{8A4F}\x{8A50}\x{8A51}' . +'\x{8A52}\x{8A53}\x{8A54}\x{8A55}\x{8A56}\x{8A57}\x{8A58}\x{8A59}\x{8A5A}' . +'\x{8A5B}\x{8A5C}\x{8A5D}\x{8A5E}\x{8A5F}\x{8A60}\x{8A61}\x{8A62}\x{8A63}' . +'\x{8A65}\x{8A66}\x{8A67}\x{8A68}\x{8A69}\x{8A6A}\x{8A6B}\x{8A6C}\x{8A6D}' . +'\x{8A6E}\x{8A6F}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A74}\x{8A75}\x{8A76}' . +'\x{8A77}\x{8A79}\x{8A7A}\x{8A7B}\x{8A7C}\x{8A7E}\x{8A7F}\x{8A80}\x{8A81}' . +'\x{8A82}\x{8A83}\x{8A84}\x{8A85}\x{8A86}\x{8A87}\x{8A89}\x{8A8A}\x{8A8B}' . +'\x{8A8C}\x{8A8D}\x{8A8E}\x{8A8F}\x{8A90}\x{8A91}\x{8A92}\x{8A93}\x{8A94}' . +'\x{8A95}\x{8A96}\x{8A97}\x{8A98}\x{8A99}\x{8A9A}\x{8A9B}\x{8A9C}\x{8A9D}' . +'\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA2}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA7}' . +'\x{8AA8}\x{8AA9}\x{8AAA}\x{8AAB}\x{8AAC}\x{8AAE}\x{8AB0}\x{8AB1}\x{8AB2}' . +'\x{8AB3}\x{8AB4}\x{8AB5}\x{8AB6}\x{8AB8}\x{8AB9}\x{8ABA}\x{8ABB}\x{8ABC}' . +'\x{8ABD}\x{8ABE}\x{8ABF}\x{8AC0}\x{8AC1}\x{8AC2}\x{8AC3}\x{8AC4}\x{8AC5}' . +'\x{8AC6}\x{8AC7}\x{8AC8}\x{8AC9}\x{8ACA}\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACE}' . +'\x{8ACF}\x{8AD1}\x{8AD2}\x{8AD3}\x{8AD4}\x{8AD5}\x{8AD6}\x{8AD7}\x{8AD8}' . +'\x{8AD9}\x{8ADA}\x{8ADB}\x{8ADC}\x{8ADD}\x{8ADE}\x{8ADF}\x{8AE0}\x{8AE1}' . +'\x{8AE2}\x{8AE3}\x{8AE4}\x{8AE5}\x{8AE6}\x{8AE7}\x{8AE8}\x{8AE9}\x{8AEA}' . +'\x{8AEB}\x{8AED}\x{8AEE}\x{8AEF}\x{8AF0}\x{8AF1}\x{8AF2}\x{8AF3}\x{8AF4}' . +'\x{8AF5}\x{8AF6}\x{8AF7}\x{8AF8}\x{8AF9}\x{8AFA}\x{8AFB}\x{8AFC}\x{8AFD}' . +'\x{8AFE}\x{8AFF}\x{8B00}\x{8B01}\x{8B02}\x{8B03}\x{8B04}\x{8B05}\x{8B06}' . +'\x{8B07}\x{8B08}\x{8B09}\x{8B0A}\x{8B0B}\x{8B0D}\x{8B0E}\x{8B0F}\x{8B10}' . +'\x{8B11}\x{8B12}\x{8B13}\x{8B14}\x{8B15}\x{8B16}\x{8B17}\x{8B18}\x{8B19}' . +'\x{8B1A}\x{8B1B}\x{8B1C}\x{8B1D}\x{8B1E}\x{8B1F}\x{8B20}\x{8B21}\x{8B22}' . +'\x{8B23}\x{8B24}\x{8B25}\x{8B26}\x{8B27}\x{8B28}\x{8B2A}\x{8B2B}\x{8B2C}' . +'\x{8B2D}\x{8B2E}\x{8B2F}\x{8B30}\x{8B31}\x{8B33}\x{8B34}\x{8B35}\x{8B36}' . +'\x{8B37}\x{8B39}\x{8B3A}\x{8B3B}\x{8B3C}\x{8B3D}\x{8B3E}\x{8B40}\x{8B41}' . +'\x{8B42}\x{8B43}\x{8B44}\x{8B45}\x{8B46}\x{8B47}\x{8B48}\x{8B49}\x{8B4A}' . +'\x{8B4B}\x{8B4C}\x{8B4D}\x{8B4E}\x{8B4F}\x{8B50}\x{8B51}\x{8B52}\x{8B53}' . +'\x{8B54}\x{8B55}\x{8B56}\x{8B57}\x{8B58}\x{8B59}\x{8B5A}\x{8B5B}\x{8B5C}' . +'\x{8B5D}\x{8B5E}\x{8B5F}\x{8B60}\x{8B63}\x{8B64}\x{8B65}\x{8B66}\x{8B67}' . +'\x{8B68}\x{8B6A}\x{8B6B}\x{8B6C}\x{8B6D}\x{8B6E}\x{8B6F}\x{8B70}\x{8B71}' . +'\x{8B73}\x{8B74}\x{8B76}\x{8B77}\x{8B78}\x{8B79}\x{8B7A}\x{8B7B}\x{8B7D}' . +'\x{8B7E}\x{8B7F}\x{8B80}\x{8B82}\x{8B83}\x{8B84}\x{8B85}\x{8B86}\x{8B88}' . +'\x{8B89}\x{8B8A}\x{8B8B}\x{8B8C}\x{8B8E}\x{8B90}\x{8B91}\x{8B92}\x{8B93}' . +'\x{8B94}\x{8B95}\x{8B96}\x{8B97}\x{8B98}\x{8B99}\x{8B9A}\x{8B9C}\x{8B9D}' . +'\x{8B9E}\x{8B9F}\x{8BA0}\x{8BA1}\x{8BA2}\x{8BA3}\x{8BA4}\x{8BA5}\x{8BA6}' . +'\x{8BA7}\x{8BA8}\x{8BA9}\x{8BAA}\x{8BAB}\x{8BAC}\x{8BAD}\x{8BAE}\x{8BAF}' . +'\x{8BB0}\x{8BB1}\x{8BB2}\x{8BB3}\x{8BB4}\x{8BB5}\x{8BB6}\x{8BB7}\x{8BB8}' . +'\x{8BB9}\x{8BBA}\x{8BBB}\x{8BBC}\x{8BBD}\x{8BBE}\x{8BBF}\x{8BC0}\x{8BC1}' . +'\x{8BC2}\x{8BC3}\x{8BC4}\x{8BC5}\x{8BC6}\x{8BC7}\x{8BC8}\x{8BC9}\x{8BCA}' . +'\x{8BCB}\x{8BCC}\x{8BCD}\x{8BCE}\x{8BCF}\x{8BD0}\x{8BD1}\x{8BD2}\x{8BD3}' . +'\x{8BD4}\x{8BD5}\x{8BD6}\x{8BD7}\x{8BD8}\x{8BD9}\x{8BDA}\x{8BDB}\x{8BDC}' . +'\x{8BDD}\x{8BDE}\x{8BDF}\x{8BE0}\x{8BE1}\x{8BE2}\x{8BE3}\x{8BE4}\x{8BE5}' . +'\x{8BE6}\x{8BE7}\x{8BE8}\x{8BE9}\x{8BEA}\x{8BEB}\x{8BEC}\x{8BED}\x{8BEE}' . +'\x{8BEF}\x{8BF0}\x{8BF1}\x{8BF2}\x{8BF3}\x{8BF4}\x{8BF5}\x{8BF6}\x{8BF7}' . +'\x{8BF8}\x{8BF9}\x{8BFA}\x{8BFB}\x{8BFC}\x{8BFD}\x{8BFE}\x{8BFF}\x{8C00}' . +'\x{8C01}\x{8C02}\x{8C03}\x{8C04}\x{8C05}\x{8C06}\x{8C07}\x{8C08}\x{8C09}' . +'\x{8C0A}\x{8C0B}\x{8C0C}\x{8C0D}\x{8C0E}\x{8C0F}\x{8C10}\x{8C11}\x{8C12}' . +'\x{8C13}\x{8C14}\x{8C15}\x{8C16}\x{8C17}\x{8C18}\x{8C19}\x{8C1A}\x{8C1B}' . +'\x{8C1C}\x{8C1D}\x{8C1E}\x{8C1F}\x{8C20}\x{8C21}\x{8C22}\x{8C23}\x{8C24}' . +'\x{8C25}\x{8C26}\x{8C27}\x{8C28}\x{8C29}\x{8C2A}\x{8C2B}\x{8C2C}\x{8C2D}' . +'\x{8C2E}\x{8C2F}\x{8C30}\x{8C31}\x{8C32}\x{8C33}\x{8C34}\x{8C35}\x{8C36}' . +'\x{8C37}\x{8C39}\x{8C3A}\x{8C3B}\x{8C3C}\x{8C3D}\x{8C3E}\x{8C3F}\x{8C41}' . +'\x{8C42}\x{8C43}\x{8C45}\x{8C46}\x{8C47}\x{8C48}\x{8C49}\x{8C4A}\x{8C4B}' . +'\x{8C4C}\x{8C4D}\x{8C4E}\x{8C4F}\x{8C50}\x{8C54}\x{8C55}\x{8C56}\x{8C57}' . +'\x{8C59}\x{8C5A}\x{8C5B}\x{8C5C}\x{8C5D}\x{8C5E}\x{8C5F}\x{8C60}\x{8C61}' . +'\x{8C62}\x{8C63}\x{8C64}\x{8C65}\x{8C66}\x{8C67}\x{8C68}\x{8C69}\x{8C6A}' . +'\x{8C6B}\x{8C6C}\x{8C6D}\x{8C6E}\x{8C6F}\x{8C70}\x{8C71}\x{8C72}\x{8C73}' . +'\x{8C75}\x{8C76}\x{8C77}\x{8C78}\x{8C79}\x{8C7A}\x{8C7B}\x{8C7D}\x{8C7E}' . +'\x{8C80}\x{8C81}\x{8C82}\x{8C84}\x{8C85}\x{8C86}\x{8C88}\x{8C89}\x{8C8A}' . +'\x{8C8C}\x{8C8D}\x{8C8F}\x{8C90}\x{8C91}\x{8C92}\x{8C93}\x{8C94}\x{8C95}' . +'\x{8C96}\x{8C97}\x{8C98}\x{8C99}\x{8C9A}\x{8C9C}\x{8C9D}\x{8C9E}\x{8C9F}' . +'\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA3}\x{8CA4}\x{8CA5}\x{8CA7}\x{8CA8}\x{8CA9}' . +'\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}\x{8CB1}\x{8CB2}' . +'\x{8CB3}\x{8CB4}\x{8CB5}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CB9}\x{8CBA}\x{8CBB}' . +'\x{8CBC}\x{8CBD}\x{8CBE}\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}' . +'\x{8CC5}\x{8CC6}\x{8CC7}\x{8CC8}\x{8CC9}\x{8CCA}\x{8CCC}\x{8CCE}\x{8CCF}' . +'\x{8CD0}\x{8CD1}\x{8CD2}\x{8CD3}\x{8CD4}\x{8CD5}\x{8CD7}\x{8CD9}\x{8CDA}' . +'\x{8CDB}\x{8CDC}\x{8CDD}\x{8CDE}\x{8CDF}\x{8CE0}\x{8CE1}\x{8CE2}\x{8CE3}' . +'\x{8CE4}\x{8CE5}\x{8CE6}\x{8CE7}\x{8CE8}\x{8CEA}\x{8CEB}\x{8CEC}\x{8CED}' . +'\x{8CEE}\x{8CEF}\x{8CF0}\x{8CF1}\x{8CF2}\x{8CF3}\x{8CF4}\x{8CF5}\x{8CF6}' . +'\x{8CF8}\x{8CF9}\x{8CFA}\x{8CFB}\x{8CFC}\x{8CFD}\x{8CFE}\x{8CFF}\x{8D00}' . +'\x{8D02}\x{8D03}\x{8D04}\x{8D05}\x{8D06}\x{8D07}\x{8D08}\x{8D09}\x{8D0A}' . +'\x{8D0B}\x{8D0C}\x{8D0D}\x{8D0E}\x{8D0F}\x{8D10}\x{8D13}\x{8D14}\x{8D15}' . +'\x{8D16}\x{8D17}\x{8D18}\x{8D19}\x{8D1A}\x{8D1B}\x{8D1C}\x{8D1D}\x{8D1E}' . +'\x{8D1F}\x{8D20}\x{8D21}\x{8D22}\x{8D23}\x{8D24}\x{8D25}\x{8D26}\x{8D27}' . +'\x{8D28}\x{8D29}\x{8D2A}\x{8D2B}\x{8D2C}\x{8D2D}\x{8D2E}\x{8D2F}\x{8D30}' . +'\x{8D31}\x{8D32}\x{8D33}\x{8D34}\x{8D35}\x{8D36}\x{8D37}\x{8D38}\x{8D39}' . +'\x{8D3A}\x{8D3B}\x{8D3C}\x{8D3D}\x{8D3E}\x{8D3F}\x{8D40}\x{8D41}\x{8D42}' . +'\x{8D43}\x{8D44}\x{8D45}\x{8D46}\x{8D47}\x{8D48}\x{8D49}\x{8D4A}\x{8D4B}' . +'\x{8D4C}\x{8D4D}\x{8D4E}\x{8D4F}\x{8D50}\x{8D51}\x{8D52}\x{8D53}\x{8D54}' . +'\x{8D55}\x{8D56}\x{8D57}\x{8D58}\x{8D59}\x{8D5A}\x{8D5B}\x{8D5C}\x{8D5D}' . +'\x{8D5E}\x{8D5F}\x{8D60}\x{8D61}\x{8D62}\x{8D63}\x{8D64}\x{8D65}\x{8D66}' . +'\x{8D67}\x{8D68}\x{8D69}\x{8D6A}\x{8D6B}\x{8D6C}\x{8D6D}\x{8D6E}\x{8D6F}' . +'\x{8D70}\x{8D71}\x{8D72}\x{8D73}\x{8D74}\x{8D75}\x{8D76}\x{8D77}\x{8D78}' . +'\x{8D79}\x{8D7A}\x{8D7B}\x{8D7D}\x{8D7E}\x{8D7F}\x{8D80}\x{8D81}\x{8D82}' . +'\x{8D83}\x{8D84}\x{8D85}\x{8D86}\x{8D87}\x{8D88}\x{8D89}\x{8D8A}\x{8D8B}' . +'\x{8D8C}\x{8D8D}\x{8D8E}\x{8D8F}\x{8D90}\x{8D91}\x{8D92}\x{8D93}\x{8D94}' . +'\x{8D95}\x{8D96}\x{8D97}\x{8D98}\x{8D99}\x{8D9A}\x{8D9B}\x{8D9C}\x{8D9D}' . +'\x{8D9E}\x{8D9F}\x{8DA0}\x{8DA1}\x{8DA2}\x{8DA3}\x{8DA4}\x{8DA5}\x{8DA7}' . +'\x{8DA8}\x{8DA9}\x{8DAA}\x{8DAB}\x{8DAC}\x{8DAD}\x{8DAE}\x{8DAF}\x{8DB0}' . +'\x{8DB1}\x{8DB2}\x{8DB3}\x{8DB4}\x{8DB5}\x{8DB6}\x{8DB7}\x{8DB8}\x{8DB9}' . +'\x{8DBA}\x{8DBB}\x{8DBC}\x{8DBD}\x{8DBE}\x{8DBF}\x{8DC1}\x{8DC2}\x{8DC3}' . +'\x{8DC4}\x{8DC5}\x{8DC6}\x{8DC7}\x{8DC8}\x{8DC9}\x{8DCA}\x{8DCB}\x{8DCC}' . +'\x{8DCD}\x{8DCE}\x{8DCF}\x{8DD0}\x{8DD1}\x{8DD2}\x{8DD3}\x{8DD4}\x{8DD5}' . +'\x{8DD6}\x{8DD7}\x{8DD8}\x{8DD9}\x{8DDA}\x{8DDB}\x{8DDC}\x{8DDD}\x{8DDE}' . +'\x{8DDF}\x{8DE0}\x{8DE1}\x{8DE2}\x{8DE3}\x{8DE4}\x{8DE6}\x{8DE7}\x{8DE8}' . +'\x{8DE9}\x{8DEA}\x{8DEB}\x{8DEC}\x{8DED}\x{8DEE}\x{8DEF}\x{8DF0}\x{8DF1}' . +'\x{8DF2}\x{8DF3}\x{8DF4}\x{8DF5}\x{8DF6}\x{8DF7}\x{8DF8}\x{8DF9}\x{8DFA}' . +'\x{8DFB}\x{8DFC}\x{8DFD}\x{8DFE}\x{8DFF}\x{8E00}\x{8E02}\x{8E03}\x{8E04}' . +'\x{8E05}\x{8E06}\x{8E07}\x{8E08}\x{8E09}\x{8E0A}\x{8E0C}\x{8E0D}\x{8E0E}' . +'\x{8E0F}\x{8E10}\x{8E11}\x{8E12}\x{8E13}\x{8E14}\x{8E15}\x{8E16}\x{8E17}' . +'\x{8E18}\x{8E19}\x{8E1A}\x{8E1B}\x{8E1C}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E20}' . +'\x{8E21}\x{8E22}\x{8E23}\x{8E24}\x{8E25}\x{8E26}\x{8E27}\x{8E28}\x{8E29}' . +'\x{8E2A}\x{8E2B}\x{8E2C}\x{8E2D}\x{8E2E}\x{8E2F}\x{8E30}\x{8E31}\x{8E33}' . +'\x{8E34}\x{8E35}\x{8E36}\x{8E37}\x{8E38}\x{8E39}\x{8E3A}\x{8E3B}\x{8E3C}' . +'\x{8E3D}\x{8E3E}\x{8E3F}\x{8E40}\x{8E41}\x{8E42}\x{8E43}\x{8E44}\x{8E45}' . +'\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4B}\x{8E4C}\x{8E4D}\x{8E4E}\x{8E50}' . +'\x{8E51}\x{8E52}\x{8E53}\x{8E54}\x{8E55}\x{8E56}\x{8E57}\x{8E58}\x{8E59}' . +'\x{8E5A}\x{8E5B}\x{8E5C}\x{8E5D}\x{8E5E}\x{8E5F}\x{8E60}\x{8E61}\x{8E62}' . +'\x{8E63}\x{8E64}\x{8E65}\x{8E66}\x{8E67}\x{8E68}\x{8E69}\x{8E6A}\x{8E6B}' . +'\x{8E6C}\x{8E6D}\x{8E6F}\x{8E70}\x{8E71}\x{8E72}\x{8E73}\x{8E74}\x{8E76}' . +'\x{8E78}\x{8E7A}\x{8E7B}\x{8E7C}\x{8E7D}\x{8E7E}\x{8E7F}\x{8E80}\x{8E81}' . +'\x{8E82}\x{8E83}\x{8E84}\x{8E85}\x{8E86}\x{8E87}\x{8E88}\x{8E89}\x{8E8A}' . +'\x{8E8B}\x{8E8C}\x{8E8D}\x{8E8E}\x{8E8F}\x{8E90}\x{8E91}\x{8E92}\x{8E93}' . +'\x{8E94}\x{8E95}\x{8E96}\x{8E97}\x{8E98}\x{8E9A}\x{8E9C}\x{8E9D}\x{8E9E}' . +'\x{8E9F}\x{8EA0}\x{8EA1}\x{8EA3}\x{8EA4}\x{8EA5}\x{8EA6}\x{8EA7}\x{8EA8}' . +'\x{8EA9}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAD}\x{8EAE}\x{8EAF}\x{8EB0}\x{8EB1}' . +'\x{8EB2}\x{8EB4}\x{8EB5}\x{8EB8}\x{8EB9}\x{8EBA}\x{8EBB}\x{8EBC}\x{8EBD}' . +'\x{8EBE}\x{8EBF}\x{8EC0}\x{8EC2}\x{8EC3}\x{8EC5}\x{8EC6}\x{8EC7}\x{8EC8}' . +'\x{8EC9}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ECE}\x{8ECF}\x{8ED0}\x{8ED1}' . +'\x{8ED2}\x{8ED3}\x{8ED4}\x{8ED5}\x{8ED6}\x{8ED7}\x{8ED8}\x{8EDA}\x{8EDB}' . +'\x{8EDC}\x{8EDD}\x{8EDE}\x{8EDF}\x{8EE0}\x{8EE1}\x{8EE4}\x{8EE5}\x{8EE6}' . +'\x{8EE7}\x{8EE8}\x{8EE9}\x{8EEA}\x{8EEB}\x{8EEC}\x{8EED}\x{8EEE}\x{8EEF}' . +'\x{8EF1}\x{8EF2}\x{8EF3}\x{8EF4}\x{8EF5}\x{8EF6}\x{8EF7}\x{8EF8}\x{8EF9}' . +'\x{8EFA}\x{8EFB}\x{8EFC}\x{8EFD}\x{8EFE}\x{8EFF}\x{8F00}\x{8F01}\x{8F02}' . +'\x{8F03}\x{8F04}\x{8F05}\x{8F06}\x{8F07}\x{8F08}\x{8F09}\x{8F0A}\x{8F0B}' . +'\x{8F0D}\x{8F0E}\x{8F10}\x{8F11}\x{8F12}\x{8F13}\x{8F14}\x{8F15}\x{8F16}' . +'\x{8F17}\x{8F18}\x{8F1A}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1E}\x{8F1F}\x{8F20}' . +'\x{8F21}\x{8F22}\x{8F23}\x{8F24}\x{8F25}\x{8F26}\x{8F27}\x{8F28}\x{8F29}' . +'\x{8F2A}\x{8F2B}\x{8F2C}\x{8F2E}\x{8F2F}\x{8F30}\x{8F31}\x{8F32}\x{8F33}' . +'\x{8F34}\x{8F35}\x{8F36}\x{8F37}\x{8F38}\x{8F39}\x{8F3B}\x{8F3C}\x{8F3D}' . +'\x{8F3E}\x{8F3F}\x{8F40}\x{8F42}\x{8F43}\x{8F44}\x{8F45}\x{8F46}\x{8F47}' . +'\x{8F48}\x{8F49}\x{8F4A}\x{8F4B}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F4F}\x{8F50}' . +'\x{8F51}\x{8F52}\x{8F53}\x{8F54}\x{8F55}\x{8F56}\x{8F57}\x{8F58}\x{8F59}' . +'\x{8F5A}\x{8F5B}\x{8F5D}\x{8F5E}\x{8F5F}\x{8F60}\x{8F61}\x{8F62}\x{8F63}' . +'\x{8F64}\x{8F65}\x{8F66}\x{8F67}\x{8F68}\x{8F69}\x{8F6A}\x{8F6B}\x{8F6C}' . +'\x{8F6D}\x{8F6E}\x{8F6F}\x{8F70}\x{8F71}\x{8F72}\x{8F73}\x{8F74}\x{8F75}' . +'\x{8F76}\x{8F77}\x{8F78}\x{8F79}\x{8F7A}\x{8F7B}\x{8F7C}\x{8F7D}\x{8F7E}' . +'\x{8F7F}\x{8F80}\x{8F81}\x{8F82}\x{8F83}\x{8F84}\x{8F85}\x{8F86}\x{8F87}' . +'\x{8F88}\x{8F89}\x{8F8A}\x{8F8B}\x{8F8C}\x{8F8D}\x{8F8E}\x{8F8F}\x{8F90}' . +'\x{8F91}\x{8F92}\x{8F93}\x{8F94}\x{8F95}\x{8F96}\x{8F97}\x{8F98}\x{8F99}' . +'\x{8F9A}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA0}\x{8FA1}\x{8FA2}\x{8FA3}' . +'\x{8FA5}\x{8FA6}\x{8FA7}\x{8FA8}\x{8FA9}\x{8FAA}\x{8FAB}\x{8FAC}\x{8FAD}' . +'\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB4}\x{8FB5}\x{8FB6}\x{8FB7}' . +'\x{8FB8}\x{8FB9}\x{8FBB}\x{8FBC}\x{8FBD}\x{8FBE}\x{8FBF}\x{8FC0}\x{8FC1}' . +'\x{8FC2}\x{8FC4}\x{8FC5}\x{8FC6}\x{8FC7}\x{8FC8}\x{8FC9}\x{8FCB}\x{8FCC}' . +'\x{8FCD}\x{8FCE}\x{8FCF}\x{8FD0}\x{8FD1}\x{8FD2}\x{8FD3}\x{8FD4}\x{8FD5}' . +'\x{8FD6}\x{8FD7}\x{8FD8}\x{8FD9}\x{8FDA}\x{8FDB}\x{8FDC}\x{8FDD}\x{8FDE}' . +'\x{8FDF}\x{8FE0}\x{8FE1}\x{8FE2}\x{8FE3}\x{8FE4}\x{8FE5}\x{8FE6}\x{8FE8}' . +'\x{8FE9}\x{8FEA}\x{8FEB}\x{8FEC}\x{8FED}\x{8FEE}\x{8FEF}\x{8FF0}\x{8FF1}' . +'\x{8FF2}\x{8FF3}\x{8FF4}\x{8FF5}\x{8FF6}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}' . +'\x{8FFB}\x{8FFC}\x{8FFD}\x{8FFE}\x{8FFF}\x{9000}\x{9001}\x{9002}\x{9003}' . +'\x{9004}\x{9005}\x{9006}\x{9007}\x{9008}\x{9009}\x{900A}\x{900B}\x{900C}' . +'\x{900D}\x{900F}\x{9010}\x{9011}\x{9012}\x{9013}\x{9014}\x{9015}\x{9016}' . +'\x{9017}\x{9018}\x{9019}\x{901A}\x{901B}\x{901C}\x{901D}\x{901E}\x{901F}' . +'\x{9020}\x{9021}\x{9022}\x{9023}\x{9024}\x{9025}\x{9026}\x{9027}\x{9028}' . +'\x{9029}\x{902B}\x{902D}\x{902E}\x{902F}\x{9030}\x{9031}\x{9032}\x{9033}' . +'\x{9034}\x{9035}\x{9036}\x{9038}\x{903A}\x{903B}\x{903C}\x{903D}\x{903E}' . +'\x{903F}\x{9041}\x{9042}\x{9043}\x{9044}\x{9045}\x{9047}\x{9048}\x{9049}' . +'\x{904A}\x{904B}\x{904C}\x{904D}\x{904E}\x{904F}\x{9050}\x{9051}\x{9052}' . +'\x{9053}\x{9054}\x{9055}\x{9056}\x{9057}\x{9058}\x{9059}\x{905A}\x{905B}' . +'\x{905C}\x{905D}\x{905E}\x{905F}\x{9060}\x{9061}\x{9062}\x{9063}\x{9064}' . +'\x{9065}\x{9066}\x{9067}\x{9068}\x{9069}\x{906A}\x{906B}\x{906C}\x{906D}' . +'\x{906E}\x{906F}\x{9070}\x{9071}\x{9072}\x{9073}\x{9074}\x{9075}\x{9076}' . +'\x{9077}\x{9078}\x{9079}\x{907A}\x{907B}\x{907C}\x{907D}\x{907E}\x{907F}' . +'\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9085}\x{9086}\x{9087}\x{9088}' . +'\x{9089}\x{908A}\x{908B}\x{908C}\x{908D}\x{908E}\x{908F}\x{9090}\x{9091}' . +'\x{9092}\x{9093}\x{9094}\x{9095}\x{9096}\x{9097}\x{9098}\x{9099}\x{909A}' . +'\x{909B}\x{909C}\x{909D}\x{909E}\x{909F}\x{90A0}\x{90A1}\x{90A2}\x{90A3}' . +'\x{90A4}\x{90A5}\x{90A6}\x{90A7}\x{90A8}\x{90A9}\x{90AA}\x{90AC}\x{90AD}' . +'\x{90AE}\x{90AF}\x{90B0}\x{90B1}\x{90B2}\x{90B3}\x{90B4}\x{90B5}\x{90B6}' . +'\x{90B7}\x{90B8}\x{90B9}\x{90BA}\x{90BB}\x{90BC}\x{90BD}\x{90BE}\x{90BF}' . +'\x{90C0}\x{90C1}\x{90C2}\x{90C3}\x{90C4}\x{90C5}\x{90C6}\x{90C7}\x{90C8}' . +'\x{90C9}\x{90CA}\x{90CB}\x{90CE}\x{90CF}\x{90D0}\x{90D1}\x{90D3}\x{90D4}' . +'\x{90D5}\x{90D6}\x{90D7}\x{90D8}\x{90D9}\x{90DA}\x{90DB}\x{90DC}\x{90DD}' . +'\x{90DE}\x{90DF}\x{90E0}\x{90E1}\x{90E2}\x{90E3}\x{90E4}\x{90E5}\x{90E6}' . +'\x{90E7}\x{90E8}\x{90E9}\x{90EA}\x{90EB}\x{90EC}\x{90ED}\x{90EE}\x{90EF}' . +'\x{90F0}\x{90F1}\x{90F2}\x{90F3}\x{90F4}\x{90F5}\x{90F7}\x{90F8}\x{90F9}' . +'\x{90FA}\x{90FB}\x{90FC}\x{90FD}\x{90FE}\x{90FF}\x{9100}\x{9101}\x{9102}' . +'\x{9103}\x{9104}\x{9105}\x{9106}\x{9107}\x{9108}\x{9109}\x{910B}\x{910C}' . +'\x{910D}\x{910E}\x{910F}\x{9110}\x{9111}\x{9112}\x{9113}\x{9114}\x{9115}' . +'\x{9116}\x{9117}\x{9118}\x{9119}\x{911A}\x{911B}\x{911C}\x{911D}\x{911E}' . +'\x{911F}\x{9120}\x{9121}\x{9122}\x{9123}\x{9124}\x{9125}\x{9126}\x{9127}' . +'\x{9128}\x{9129}\x{912A}\x{912B}\x{912C}\x{912D}\x{912E}\x{912F}\x{9130}' . +'\x{9131}\x{9132}\x{9133}\x{9134}\x{9135}\x{9136}\x{9137}\x{9138}\x{9139}' . +'\x{913A}\x{913B}\x{913E}\x{913F}\x{9140}\x{9141}\x{9142}\x{9143}\x{9144}' . +'\x{9145}\x{9146}\x{9147}\x{9148}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}' . +'\x{914E}\x{914F}\x{9150}\x{9151}\x{9152}\x{9153}\x{9154}\x{9155}\x{9156}' . +'\x{9157}\x{9158}\x{915A}\x{915B}\x{915C}\x{915D}\x{915E}\x{915F}\x{9160}' . +'\x{9161}\x{9162}\x{9163}\x{9164}\x{9165}\x{9166}\x{9167}\x{9168}\x{9169}' . +'\x{916A}\x{916B}\x{916C}\x{916D}\x{916E}\x{916F}\x{9170}\x{9171}\x{9172}' . +'\x{9173}\x{9174}\x{9175}\x{9176}\x{9177}\x{9178}\x{9179}\x{917A}\x{917C}' . +'\x{917D}\x{917E}\x{917F}\x{9180}\x{9181}\x{9182}\x{9183}\x{9184}\x{9185}' . +'\x{9186}\x{9187}\x{9188}\x{9189}\x{918A}\x{918B}\x{918C}\x{918D}\x{918E}' . +'\x{918F}\x{9190}\x{9191}\x{9192}\x{9193}\x{9194}\x{9196}\x{9199}\x{919A}' . +'\x{919B}\x{919C}\x{919D}\x{919E}\x{919F}\x{91A0}\x{91A1}\x{91A2}\x{91A3}' . +'\x{91A5}\x{91A6}\x{91A7}\x{91A8}\x{91AA}\x{91AB}\x{91AC}\x{91AD}\x{91AE}' . +'\x{91AF}\x{91B0}\x{91B1}\x{91B2}\x{91B3}\x{91B4}\x{91B5}\x{91B6}\x{91B7}' . +'\x{91B9}\x{91BA}\x{91BB}\x{91BC}\x{91BD}\x{91BE}\x{91C0}\x{91C1}\x{91C2}' . +'\x{91C3}\x{91C5}\x{91C6}\x{91C7}\x{91C9}\x{91CA}\x{91CB}\x{91CC}\x{91CD}' . +'\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D2}\x{91D3}\x{91D4}\x{91D5}\x{91D7}' . +'\x{91D8}\x{91D9}\x{91DA}\x{91DB}\x{91DC}\x{91DD}\x{91DE}\x{91DF}\x{91E2}' . +'\x{91E3}\x{91E4}\x{91E5}\x{91E6}\x{91E7}\x{91E8}\x{91E9}\x{91EA}\x{91EB}' . +'\x{91EC}\x{91ED}\x{91EE}\x{91F0}\x{91F1}\x{91F2}\x{91F3}\x{91F4}\x{91F5}' . +'\x{91F7}\x{91F8}\x{91F9}\x{91FA}\x{91FB}\x{91FD}\x{91FE}\x{91FF}\x{9200}' . +'\x{9201}\x{9202}\x{9203}\x{9204}\x{9205}\x{9206}\x{9207}\x{9208}\x{9209}' . +'\x{920A}\x{920B}\x{920C}\x{920D}\x{920E}\x{920F}\x{9210}\x{9211}\x{9212}' . +'\x{9214}\x{9215}\x{9216}\x{9217}\x{9218}\x{9219}\x{921A}\x{921B}\x{921C}' . +'\x{921D}\x{921E}\x{9220}\x{9221}\x{9223}\x{9224}\x{9225}\x{9226}\x{9227}' . +'\x{9228}\x{9229}\x{922A}\x{922B}\x{922D}\x{922E}\x{922F}\x{9230}\x{9231}' . +'\x{9232}\x{9233}\x{9234}\x{9235}\x{9236}\x{9237}\x{9238}\x{9239}\x{923A}' . +'\x{923B}\x{923C}\x{923D}\x{923E}\x{923F}\x{9240}\x{9241}\x{9242}\x{9245}' . +'\x{9246}\x{9247}\x{9248}\x{9249}\x{924A}\x{924B}\x{924C}\x{924D}\x{924E}' . +'\x{924F}\x{9250}\x{9251}\x{9252}\x{9253}\x{9254}\x{9255}\x{9256}\x{9257}' . +'\x{9258}\x{9259}\x{925A}\x{925B}\x{925C}\x{925D}\x{925E}\x{925F}\x{9260}' . +'\x{9261}\x{9262}\x{9263}\x{9264}\x{9265}\x{9266}\x{9267}\x{9268}\x{926B}' . +'\x{926C}\x{926D}\x{926E}\x{926F}\x{9270}\x{9272}\x{9273}\x{9274}\x{9275}' . +'\x{9276}\x{9277}\x{9278}\x{9279}\x{927A}\x{927B}\x{927C}\x{927D}\x{927E}' . +'\x{927F}\x{9280}\x{9282}\x{9283}\x{9285}\x{9286}\x{9287}\x{9288}\x{9289}' . +'\x{928A}\x{928B}\x{928C}\x{928D}\x{928E}\x{928F}\x{9290}\x{9291}\x{9292}' . +'\x{9293}\x{9294}\x{9295}\x{9296}\x{9297}\x{9298}\x{9299}\x{929A}\x{929B}' . +'\x{929C}\x{929D}\x{929F}\x{92A0}\x{92A1}\x{92A2}\x{92A3}\x{92A4}\x{92A5}' . +'\x{92A6}\x{92A7}\x{92A8}\x{92A9}\x{92AA}\x{92AB}\x{92AC}\x{92AD}\x{92AE}' . +'\x{92AF}\x{92B0}\x{92B1}\x{92B2}\x{92B3}\x{92B4}\x{92B5}\x{92B6}\x{92B7}' . +'\x{92B8}\x{92B9}\x{92BA}\x{92BB}\x{92BC}\x{92BE}\x{92BF}\x{92C0}\x{92C1}' . +'\x{92C2}\x{92C3}\x{92C4}\x{92C5}\x{92C6}\x{92C7}\x{92C8}\x{92C9}\x{92CA}' . +'\x{92CB}\x{92CC}\x{92CD}\x{92CE}\x{92CF}\x{92D0}\x{92D1}\x{92D2}\x{92D3}' . +'\x{92D5}\x{92D6}\x{92D7}\x{92D8}\x{92D9}\x{92DA}\x{92DC}\x{92DD}\x{92DE}' . +'\x{92DF}\x{92E0}\x{92E1}\x{92E3}\x{92E4}\x{92E5}\x{92E6}\x{92E7}\x{92E8}' . +'\x{92E9}\x{92EA}\x{92EB}\x{92EC}\x{92ED}\x{92EE}\x{92EF}\x{92F0}\x{92F1}' . +'\x{92F2}\x{92F3}\x{92F4}\x{92F5}\x{92F6}\x{92F7}\x{92F8}\x{92F9}\x{92FA}' . +'\x{92FB}\x{92FC}\x{92FD}\x{92FE}\x{92FF}\x{9300}\x{9301}\x{9302}\x{9303}' . +'\x{9304}\x{9305}\x{9306}\x{9307}\x{9308}\x{9309}\x{930A}\x{930B}\x{930C}' . +'\x{930D}\x{930E}\x{930F}\x{9310}\x{9311}\x{9312}\x{9313}\x{9314}\x{9315}' . +'\x{9316}\x{9317}\x{9318}\x{9319}\x{931A}\x{931B}\x{931D}\x{931E}\x{931F}' . +'\x{9320}\x{9321}\x{9322}\x{9323}\x{9324}\x{9325}\x{9326}\x{9327}\x{9328}' . +'\x{9329}\x{932A}\x{932B}\x{932D}\x{932E}\x{932F}\x{9332}\x{9333}\x{9334}' . +'\x{9335}\x{9336}\x{9337}\x{9338}\x{9339}\x{933A}\x{933B}\x{933C}\x{933D}' . +'\x{933E}\x{933F}\x{9340}\x{9341}\x{9342}\x{9343}\x{9344}\x{9345}\x{9346}' . +'\x{9347}\x{9348}\x{9349}\x{934A}\x{934B}\x{934C}\x{934D}\x{934E}\x{934F}' . +'\x{9350}\x{9351}\x{9352}\x{9353}\x{9354}\x{9355}\x{9356}\x{9357}\x{9358}' . +'\x{9359}\x{935A}\x{935B}\x{935C}\x{935D}\x{935E}\x{935F}\x{9360}\x{9361}' . +'\x{9363}\x{9364}\x{9365}\x{9366}\x{9367}\x{9369}\x{936A}\x{936C}\x{936D}' . +'\x{936E}\x{9370}\x{9371}\x{9372}\x{9374}\x{9375}\x{9376}\x{9377}\x{9379}' . +'\x{937A}\x{937B}\x{937C}\x{937D}\x{937E}\x{9380}\x{9382}\x{9383}\x{9384}' . +'\x{9385}\x{9386}\x{9387}\x{9388}\x{9389}\x{938A}\x{938C}\x{938D}\x{938E}' . +'\x{938F}\x{9390}\x{9391}\x{9392}\x{9393}\x{9394}\x{9395}\x{9396}\x{9397}' . +'\x{9398}\x{9399}\x{939A}\x{939B}\x{939D}\x{939E}\x{939F}\x{93A1}\x{93A2}' . +'\x{93A3}\x{93A4}\x{93A5}\x{93A6}\x{93A7}\x{93A8}\x{93A9}\x{93AA}\x{93AC}' . +'\x{93AD}\x{93AE}\x{93AF}\x{93B0}\x{93B1}\x{93B2}\x{93B3}\x{93B4}\x{93B5}' . +'\x{93B6}\x{93B7}\x{93B8}\x{93B9}\x{93BA}\x{93BC}\x{93BD}\x{93BE}\x{93BF}' . +'\x{93C0}\x{93C1}\x{93C2}\x{93C3}\x{93C4}\x{93C5}\x{93C6}\x{93C7}\x{93C8}' . +'\x{93C9}\x{93CA}\x{93CB}\x{93CC}\x{93CD}\x{93CE}\x{93CF}\x{93D0}\x{93D1}' . +'\x{93D2}\x{93D3}\x{93D4}\x{93D5}\x{93D6}\x{93D7}\x{93D8}\x{93D9}\x{93DA}' . +'\x{93DB}\x{93DC}\x{93DD}\x{93DE}\x{93DF}\x{93E1}\x{93E2}\x{93E3}\x{93E4}' . +'\x{93E6}\x{93E7}\x{93E8}\x{93E9}\x{93EA}\x{93EB}\x{93EC}\x{93ED}\x{93EE}' . +'\x{93EF}\x{93F0}\x{93F1}\x{93F2}\x{93F4}\x{93F5}\x{93F6}\x{93F7}\x{93F8}' . +'\x{93F9}\x{93FA}\x{93FB}\x{93FC}\x{93FD}\x{93FE}\x{93FF}\x{9400}\x{9401}' . +'\x{9403}\x{9404}\x{9405}\x{9406}\x{9407}\x{9408}\x{9409}\x{940A}\x{940B}' . +'\x{940C}\x{940D}\x{940E}\x{940F}\x{9410}\x{9411}\x{9412}\x{9413}\x{9414}' . +'\x{9415}\x{9416}\x{9418}\x{9419}\x{941B}\x{941D}\x{9420}\x{9422}\x{9423}' . +'\x{9425}\x{9426}\x{9427}\x{9428}\x{9429}\x{942A}\x{942B}\x{942C}\x{942D}' . +'\x{942E}\x{942F}\x{9430}\x{9431}\x{9432}\x{9433}\x{9434}\x{9435}\x{9436}' . +'\x{9437}\x{9438}\x{9439}\x{943A}\x{943B}\x{943C}\x{943D}\x{943E}\x{943F}' . +'\x{9440}\x{9441}\x{9442}\x{9444}\x{9445}\x{9446}\x{9447}\x{9448}\x{9449}' . +'\x{944A}\x{944B}\x{944C}\x{944D}\x{944F}\x{9450}\x{9451}\x{9452}\x{9453}' . +'\x{9454}\x{9455}\x{9456}\x{9457}\x{9458}\x{9459}\x{945B}\x{945C}\x{945D}' . +'\x{945E}\x{945F}\x{9460}\x{9461}\x{9462}\x{9463}\x{9464}\x{9465}\x{9466}' . +'\x{9467}\x{9468}\x{9469}\x{946A}\x{946B}\x{946D}\x{946E}\x{946F}\x{9470}' . +'\x{9471}\x{9472}\x{9473}\x{9474}\x{9475}\x{9476}\x{9477}\x{9478}\x{9479}' . +'\x{947A}\x{947C}\x{947D}\x{947E}\x{947F}\x{9480}\x{9481}\x{9482}\x{9483}' . +'\x{9484}\x{9485}\x{9486}\x{9487}\x{9488}\x{9489}\x{948A}\x{948B}\x{948C}' . +'\x{948D}\x{948E}\x{948F}\x{9490}\x{9491}\x{9492}\x{9493}\x{9494}\x{9495}' . +'\x{9496}\x{9497}\x{9498}\x{9499}\x{949A}\x{949B}\x{949C}\x{949D}\x{949E}' . +'\x{949F}\x{94A0}\x{94A1}\x{94A2}\x{94A3}\x{94A4}\x{94A5}\x{94A6}\x{94A7}' . +'\x{94A8}\x{94A9}\x{94AA}\x{94AB}\x{94AC}\x{94AD}\x{94AE}\x{94AF}\x{94B0}' . +'\x{94B1}\x{94B2}\x{94B3}\x{94B4}\x{94B5}\x{94B6}\x{94B7}\x{94B8}\x{94B9}' . +'\x{94BA}\x{94BB}\x{94BC}\x{94BD}\x{94BE}\x{94BF}\x{94C0}\x{94C1}\x{94C2}' . +'\x{94C3}\x{94C4}\x{94C5}\x{94C6}\x{94C7}\x{94C8}\x{94C9}\x{94CA}\x{94CB}' . +'\x{94CC}\x{94CD}\x{94CE}\x{94CF}\x{94D0}\x{94D1}\x{94D2}\x{94D3}\x{94D4}' . +'\x{94D5}\x{94D6}\x{94D7}\x{94D8}\x{94D9}\x{94DA}\x{94DB}\x{94DC}\x{94DD}' . +'\x{94DE}\x{94DF}\x{94E0}\x{94E1}\x{94E2}\x{94E3}\x{94E4}\x{94E5}\x{94E6}' . +'\x{94E7}\x{94E8}\x{94E9}\x{94EA}\x{94EB}\x{94EC}\x{94ED}\x{94EE}\x{94EF}' . +'\x{94F0}\x{94F1}\x{94F2}\x{94F3}\x{94F4}\x{94F5}\x{94F6}\x{94F7}\x{94F8}' . +'\x{94F9}\x{94FA}\x{94FB}\x{94FC}\x{94FD}\x{94FE}\x{94FF}\x{9500}\x{9501}' . +'\x{9502}\x{9503}\x{9504}\x{9505}\x{9506}\x{9507}\x{9508}\x{9509}\x{950A}' . +'\x{950B}\x{950C}\x{950D}\x{950E}\x{950F}\x{9510}\x{9511}\x{9512}\x{9513}' . +'\x{9514}\x{9515}\x{9516}\x{9517}\x{9518}\x{9519}\x{951A}\x{951B}\x{951C}' . +'\x{951D}\x{951E}\x{951F}\x{9520}\x{9521}\x{9522}\x{9523}\x{9524}\x{9525}' . +'\x{9526}\x{9527}\x{9528}\x{9529}\x{952A}\x{952B}\x{952C}\x{952D}\x{952E}' . +'\x{952F}\x{9530}\x{9531}\x{9532}\x{9533}\x{9534}\x{9535}\x{9536}\x{9537}' . +'\x{9538}\x{9539}\x{953A}\x{953B}\x{953C}\x{953D}\x{953E}\x{953F}\x{9540}' . +'\x{9541}\x{9542}\x{9543}\x{9544}\x{9545}\x{9546}\x{9547}\x{9548}\x{9549}' . +'\x{954A}\x{954B}\x{954C}\x{954D}\x{954E}\x{954F}\x{9550}\x{9551}\x{9552}' . +'\x{9553}\x{9554}\x{9555}\x{9556}\x{9557}\x{9558}\x{9559}\x{955A}\x{955B}' . +'\x{955C}\x{955D}\x{955E}\x{955F}\x{9560}\x{9561}\x{9562}\x{9563}\x{9564}' . +'\x{9565}\x{9566}\x{9567}\x{9568}\x{9569}\x{956A}\x{956B}\x{956C}\x{956D}' . +'\x{956E}\x{956F}\x{9570}\x{9571}\x{9572}\x{9573}\x{9574}\x{9575}\x{9576}' . +'\x{9577}\x{957A}\x{957B}\x{957C}\x{957D}\x{957F}\x{9580}\x{9581}\x{9582}' . +'\x{9583}\x{9584}\x{9586}\x{9587}\x{9588}\x{9589}\x{958A}\x{958B}\x{958C}' . +'\x{958D}\x{958E}\x{958F}\x{9590}\x{9591}\x{9592}\x{9593}\x{9594}\x{9595}' . +'\x{9596}\x{9598}\x{9599}\x{959A}\x{959B}\x{959C}\x{959D}\x{959E}\x{959F}' . +'\x{95A1}\x{95A2}\x{95A3}\x{95A4}\x{95A5}\x{95A6}\x{95A7}\x{95A8}\x{95A9}' . +'\x{95AA}\x{95AB}\x{95AC}\x{95AD}\x{95AE}\x{95AF}\x{95B0}\x{95B1}\x{95B2}' . +'\x{95B5}\x{95B6}\x{95B7}\x{95B9}\x{95BA}\x{95BB}\x{95BC}\x{95BD}\x{95BE}' . +'\x{95BF}\x{95C0}\x{95C2}\x{95C3}\x{95C4}\x{95C5}\x{95C6}\x{95C7}\x{95C8}' . +'\x{95C9}\x{95CA}\x{95CB}\x{95CC}\x{95CD}\x{95CE}\x{95CF}\x{95D0}\x{95D1}' . +'\x{95D2}\x{95D3}\x{95D4}\x{95D5}\x{95D6}\x{95D7}\x{95D8}\x{95DA}\x{95DB}' . +'\x{95DC}\x{95DE}\x{95DF}\x{95E0}\x{95E1}\x{95E2}\x{95E3}\x{95E4}\x{95E5}' . +'\x{95E6}\x{95E7}\x{95E8}\x{95E9}\x{95EA}\x{95EB}\x{95EC}\x{95ED}\x{95EE}' . +'\x{95EF}\x{95F0}\x{95F1}\x{95F2}\x{95F3}\x{95F4}\x{95F5}\x{95F6}\x{95F7}' . +'\x{95F8}\x{95F9}\x{95FA}\x{95FB}\x{95FC}\x{95FD}\x{95FE}\x{95FF}\x{9600}' . +'\x{9601}\x{9602}\x{9603}\x{9604}\x{9605}\x{9606}\x{9607}\x{9608}\x{9609}' . +'\x{960A}\x{960B}\x{960C}\x{960D}\x{960E}\x{960F}\x{9610}\x{9611}\x{9612}' . +'\x{9613}\x{9614}\x{9615}\x{9616}\x{9617}\x{9618}\x{9619}\x{961A}\x{961B}' . +'\x{961C}\x{961D}\x{961E}\x{961F}\x{9620}\x{9621}\x{9622}\x{9623}\x{9624}' . +'\x{9627}\x{9628}\x{962A}\x{962B}\x{962C}\x{962D}\x{962E}\x{962F}\x{9630}' . +'\x{9631}\x{9632}\x{9633}\x{9634}\x{9635}\x{9636}\x{9637}\x{9638}\x{9639}' . +'\x{963A}\x{963B}\x{963C}\x{963D}\x{963F}\x{9640}\x{9641}\x{9642}\x{9643}' . +'\x{9644}\x{9645}\x{9646}\x{9647}\x{9648}\x{9649}\x{964A}\x{964B}\x{964C}' . +'\x{964D}\x{964E}\x{964F}\x{9650}\x{9651}\x{9652}\x{9653}\x{9654}\x{9655}' . +'\x{9658}\x{9659}\x{965A}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9660}' . +'\x{9661}\x{9662}\x{9663}\x{9664}\x{9666}\x{9667}\x{9668}\x{9669}\x{966A}' . +'\x{966B}\x{966C}\x{966D}\x{966E}\x{966F}\x{9670}\x{9671}\x{9672}\x{9673}' . +'\x{9674}\x{9675}\x{9676}\x{9677}\x{9678}\x{967C}\x{967D}\x{967E}\x{9680}' . +'\x{9683}\x{9684}\x{9685}\x{9686}\x{9687}\x{9688}\x{9689}\x{968A}\x{968B}' . +'\x{968D}\x{968E}\x{968F}\x{9690}\x{9691}\x{9692}\x{9693}\x{9694}\x{9695}' . +'\x{9697}\x{9698}\x{9699}\x{969B}\x{969C}\x{969E}\x{96A0}\x{96A1}\x{96A2}' . +'\x{96A3}\x{96A4}\x{96A5}\x{96A6}\x{96A7}\x{96A8}\x{96A9}\x{96AA}\x{96AC}' . +'\x{96AD}\x{96AE}\x{96B0}\x{96B1}\x{96B3}\x{96B4}\x{96B6}\x{96B7}\x{96B8}' . +'\x{96B9}\x{96BA}\x{96BB}\x{96BC}\x{96BD}\x{96BE}\x{96BF}\x{96C0}\x{96C1}' . +'\x{96C2}\x{96C3}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C8}\x{96C9}\x{96CA}' . +'\x{96CB}\x{96CC}\x{96CD}\x{96CE}\x{96CF}\x{96D0}\x{96D1}\x{96D2}\x{96D3}' . +'\x{96D4}\x{96D5}\x{96D6}\x{96D7}\x{96D8}\x{96D9}\x{96DA}\x{96DB}\x{96DC}' . +'\x{96DD}\x{96DE}\x{96DF}\x{96E0}\x{96E1}\x{96E2}\x{96E3}\x{96E5}\x{96E8}' . +'\x{96E9}\x{96EA}\x{96EB}\x{96EC}\x{96ED}\x{96EE}\x{96EF}\x{96F0}\x{96F1}' . +'\x{96F2}\x{96F3}\x{96F4}\x{96F5}\x{96F6}\x{96F7}\x{96F8}\x{96F9}\x{96FA}' . +'\x{96FB}\x{96FD}\x{96FE}\x{96FF}\x{9700}\x{9701}\x{9702}\x{9703}\x{9704}' . +'\x{9705}\x{9706}\x{9707}\x{9708}\x{9709}\x{970A}\x{970B}\x{970C}\x{970D}' . +'\x{970E}\x{970F}\x{9710}\x{9711}\x{9712}\x{9713}\x{9715}\x{9716}\x{9718}' . +'\x{9719}\x{971C}\x{971D}\x{971E}\x{971F}\x{9720}\x{9721}\x{9722}\x{9723}' . +'\x{9724}\x{9725}\x{9726}\x{9727}\x{9728}\x{9729}\x{972A}\x{972B}\x{972C}' . +'\x{972D}\x{972E}\x{972F}\x{9730}\x{9731}\x{9732}\x{9735}\x{9736}\x{9738}' . +'\x{9739}\x{973A}\x{973B}\x{973C}\x{973D}\x{973E}\x{973F}\x{9742}\x{9743}' . +'\x{9744}\x{9745}\x{9746}\x{9747}\x{9748}\x{9749}\x{974A}\x{974B}\x{974C}' . +'\x{974E}\x{974F}\x{9750}\x{9751}\x{9752}\x{9753}\x{9754}\x{9755}\x{9756}' . +'\x{9758}\x{9759}\x{975A}\x{975B}\x{975C}\x{975D}\x{975E}\x{975F}\x{9760}' . +'\x{9761}\x{9762}\x{9765}\x{9766}\x{9767}\x{9768}\x{9769}\x{976A}\x{976B}' . +'\x{976C}\x{976D}\x{976E}\x{976F}\x{9770}\x{9772}\x{9773}\x{9774}\x{9776}' . +'\x{9777}\x{9778}\x{9779}\x{977A}\x{977B}\x{977C}\x{977D}\x{977E}\x{977F}' . +'\x{9780}\x{9781}\x{9782}\x{9783}\x{9784}\x{9785}\x{9786}\x{9788}\x{978A}' . +'\x{978B}\x{978C}\x{978D}\x{978E}\x{978F}\x{9790}\x{9791}\x{9792}\x{9793}' . +'\x{9794}\x{9795}\x{9796}\x{9797}\x{9798}\x{9799}\x{979A}\x{979C}\x{979D}' . +'\x{979E}\x{979F}\x{97A0}\x{97A1}\x{97A2}\x{97A3}\x{97A4}\x{97A5}\x{97A6}' . +'\x{97A7}\x{97A8}\x{97AA}\x{97AB}\x{97AC}\x{97AD}\x{97AE}\x{97AF}\x{97B2}' . +'\x{97B3}\x{97B4}\x{97B6}\x{97B7}\x{97B8}\x{97B9}\x{97BA}\x{97BB}\x{97BC}' . +'\x{97BD}\x{97BF}\x{97C1}\x{97C2}\x{97C3}\x{97C4}\x{97C5}\x{97C6}\x{97C7}' . +'\x{97C8}\x{97C9}\x{97CA}\x{97CB}\x{97CC}\x{97CD}\x{97CE}\x{97CF}\x{97D0}' . +'\x{97D1}\x{97D3}\x{97D4}\x{97D5}\x{97D6}\x{97D7}\x{97D8}\x{97D9}\x{97DA}' . +'\x{97DB}\x{97DC}\x{97DD}\x{97DE}\x{97DF}\x{97E0}\x{97E1}\x{97E2}\x{97E3}' . +'\x{97E4}\x{97E5}\x{97E6}\x{97E7}\x{97E8}\x{97E9}\x{97EA}\x{97EB}\x{97EC}' . +'\x{97ED}\x{97EE}\x{97EF}\x{97F0}\x{97F1}\x{97F2}\x{97F3}\x{97F4}\x{97F5}' . +'\x{97F6}\x{97F7}\x{97F8}\x{97F9}\x{97FA}\x{97FB}\x{97FD}\x{97FE}\x{97FF}' . +'\x{9800}\x{9801}\x{9802}\x{9803}\x{9804}\x{9805}\x{9806}\x{9807}\x{9808}' . +'\x{9809}\x{980A}\x{980B}\x{980C}\x{980D}\x{980E}\x{980F}\x{9810}\x{9811}' . +'\x{9812}\x{9813}\x{9814}\x{9815}\x{9816}\x{9817}\x{9818}\x{9819}\x{981A}' . +'\x{981B}\x{981C}\x{981D}\x{981E}\x{9820}\x{9821}\x{9822}\x{9823}\x{9824}' . +'\x{9826}\x{9827}\x{9828}\x{9829}\x{982B}\x{982D}\x{982E}\x{982F}\x{9830}' . +'\x{9831}\x{9832}\x{9834}\x{9835}\x{9836}\x{9837}\x{9838}\x{9839}\x{983B}' . +'\x{983C}\x{983D}\x{983F}\x{9840}\x{9841}\x{9843}\x{9844}\x{9845}\x{9846}' . +'\x{9848}\x{9849}\x{984A}\x{984C}\x{984D}\x{984E}\x{984F}\x{9850}\x{9851}' . +'\x{9852}\x{9853}\x{9854}\x{9855}\x{9857}\x{9858}\x{9859}\x{985A}\x{985B}' . +'\x{985C}\x{985D}\x{985E}\x{985F}\x{9860}\x{9861}\x{9862}\x{9863}\x{9864}' . +'\x{9865}\x{9867}\x{9869}\x{986A}\x{986B}\x{986C}\x{986D}\x{986E}\x{986F}' . +'\x{9870}\x{9871}\x{9872}\x{9873}\x{9874}\x{9875}\x{9876}\x{9877}\x{9878}' . +'\x{9879}\x{987A}\x{987B}\x{987C}\x{987D}\x{987E}\x{987F}\x{9880}\x{9881}' . +'\x{9882}\x{9883}\x{9884}\x{9885}\x{9886}\x{9887}\x{9888}\x{9889}\x{988A}' . +'\x{988B}\x{988C}\x{988D}\x{988E}\x{988F}\x{9890}\x{9891}\x{9892}\x{9893}' . +'\x{9894}\x{9895}\x{9896}\x{9897}\x{9898}\x{9899}\x{989A}\x{989B}\x{989C}' . +'\x{989D}\x{989E}\x{989F}\x{98A0}\x{98A1}\x{98A2}\x{98A3}\x{98A4}\x{98A5}' . +'\x{98A6}\x{98A7}\x{98A8}\x{98A9}\x{98AA}\x{98AB}\x{98AC}\x{98AD}\x{98AE}' . +'\x{98AF}\x{98B0}\x{98B1}\x{98B2}\x{98B3}\x{98B4}\x{98B5}\x{98B6}\x{98B8}' . +'\x{98B9}\x{98BA}\x{98BB}\x{98BC}\x{98BD}\x{98BE}\x{98BF}\x{98C0}\x{98C1}' . +'\x{98C2}\x{98C3}\x{98C4}\x{98C5}\x{98C6}\x{98C8}\x{98C9}\x{98CB}\x{98CC}' . +'\x{98CD}\x{98CE}\x{98CF}\x{98D0}\x{98D1}\x{98D2}\x{98D3}\x{98D4}\x{98D5}' . +'\x{98D6}\x{98D7}\x{98D8}\x{98D9}\x{98DA}\x{98DB}\x{98DC}\x{98DD}\x{98DE}' . +'\x{98DF}\x{98E0}\x{98E2}\x{98E3}\x{98E5}\x{98E6}\x{98E7}\x{98E8}\x{98E9}' . +'\x{98EA}\x{98EB}\x{98ED}\x{98EF}\x{98F0}\x{98F2}\x{98F3}\x{98F4}\x{98F5}' . +'\x{98F6}\x{98F7}\x{98F9}\x{98FA}\x{98FC}\x{98FD}\x{98FE}\x{98FF}\x{9900}' . +'\x{9901}\x{9902}\x{9903}\x{9904}\x{9905}\x{9906}\x{9907}\x{9908}\x{9909}' . +'\x{990A}\x{990B}\x{990C}\x{990D}\x{990E}\x{990F}\x{9910}\x{9911}\x{9912}' . +'\x{9913}\x{9914}\x{9915}\x{9916}\x{9917}\x{9918}\x{991A}\x{991B}\x{991C}' . +'\x{991D}\x{991E}\x{991F}\x{9920}\x{9921}\x{9922}\x{9923}\x{9924}\x{9925}' . +'\x{9926}\x{9927}\x{9928}\x{9929}\x{992A}\x{992B}\x{992C}\x{992D}\x{992E}' . +'\x{992F}\x{9930}\x{9931}\x{9932}\x{9933}\x{9934}\x{9935}\x{9936}\x{9937}' . +'\x{9938}\x{9939}\x{993A}\x{993C}\x{993D}\x{993E}\x{993F}\x{9940}\x{9941}' . +'\x{9942}\x{9943}\x{9945}\x{9946}\x{9947}\x{9948}\x{9949}\x{994A}\x{994B}' . +'\x{994C}\x{994E}\x{994F}\x{9950}\x{9951}\x{9952}\x{9953}\x{9954}\x{9955}' . +'\x{9956}\x{9957}\x{9958}\x{9959}\x{995B}\x{995C}\x{995E}\x{995F}\x{9960}' . +'\x{9961}\x{9962}\x{9963}\x{9964}\x{9965}\x{9966}\x{9967}\x{9968}\x{9969}' . +'\x{996A}\x{996B}\x{996C}\x{996D}\x{996E}\x{996F}\x{9970}\x{9971}\x{9972}' . +'\x{9973}\x{9974}\x{9975}\x{9976}\x{9977}\x{9978}\x{9979}\x{997A}\x{997B}' . +'\x{997C}\x{997D}\x{997E}\x{997F}\x{9980}\x{9981}\x{9982}\x{9983}\x{9984}' . +'\x{9985}\x{9986}\x{9987}\x{9988}\x{9989}\x{998A}\x{998B}\x{998C}\x{998D}' . +'\x{998E}\x{998F}\x{9990}\x{9991}\x{9992}\x{9993}\x{9994}\x{9995}\x{9996}' . +'\x{9997}\x{9998}\x{9999}\x{999A}\x{999B}\x{999C}\x{999D}\x{999E}\x{999F}' . +'\x{99A0}\x{99A1}\x{99A2}\x{99A3}\x{99A4}\x{99A5}\x{99A6}\x{99A7}\x{99A8}' . +'\x{99A9}\x{99AA}\x{99AB}\x{99AC}\x{99AD}\x{99AE}\x{99AF}\x{99B0}\x{99B1}' . +'\x{99B2}\x{99B3}\x{99B4}\x{99B5}\x{99B6}\x{99B7}\x{99B8}\x{99B9}\x{99BA}' . +'\x{99BB}\x{99BC}\x{99BD}\x{99BE}\x{99C0}\x{99C1}\x{99C2}\x{99C3}\x{99C4}' . +'\x{99C6}\x{99C7}\x{99C8}\x{99C9}\x{99CA}\x{99CB}\x{99CC}\x{99CD}\x{99CE}' . +'\x{99CF}\x{99D0}\x{99D1}\x{99D2}\x{99D3}\x{99D4}\x{99D5}\x{99D6}\x{99D7}' . +'\x{99D8}\x{99D9}\x{99DA}\x{99DB}\x{99DC}\x{99DD}\x{99DE}\x{99DF}\x{99E1}' . +'\x{99E2}\x{99E3}\x{99E4}\x{99E5}\x{99E7}\x{99E8}\x{99E9}\x{99EA}\x{99EC}' . +'\x{99ED}\x{99EE}\x{99EF}\x{99F0}\x{99F1}\x{99F2}\x{99F3}\x{99F4}\x{99F6}' . +'\x{99F7}\x{99F8}\x{99F9}\x{99FA}\x{99FB}\x{99FC}\x{99FD}\x{99FE}\x{99FF}' . +'\x{9A00}\x{9A01}\x{9A02}\x{9A03}\x{9A04}\x{9A05}\x{9A06}\x{9A07}\x{9A08}' . +'\x{9A09}\x{9A0A}\x{9A0B}\x{9A0C}\x{9A0D}\x{9A0E}\x{9A0F}\x{9A11}\x{9A14}' . +'\x{9A15}\x{9A16}\x{9A19}\x{9A1A}\x{9A1B}\x{9A1C}\x{9A1D}\x{9A1E}\x{9A1F}' . +'\x{9A20}\x{9A21}\x{9A22}\x{9A23}\x{9A24}\x{9A25}\x{9A26}\x{9A27}\x{9A29}' . +'\x{9A2A}\x{9A2B}\x{9A2C}\x{9A2D}\x{9A2E}\x{9A2F}\x{9A30}\x{9A31}\x{9A32}' . +'\x{9A33}\x{9A34}\x{9A35}\x{9A36}\x{9A37}\x{9A38}\x{9A39}\x{9A3A}\x{9A3C}' . +'\x{9A3D}\x{9A3E}\x{9A3F}\x{9A40}\x{9A41}\x{9A42}\x{9A43}\x{9A44}\x{9A45}' . +'\x{9A46}\x{9A47}\x{9A48}\x{9A49}\x{9A4A}\x{9A4B}\x{9A4C}\x{9A4D}\x{9A4E}' . +'\x{9A4F}\x{9A50}\x{9A52}\x{9A53}\x{9A54}\x{9A55}\x{9A56}\x{9A57}\x{9A59}' . +'\x{9A5A}\x{9A5B}\x{9A5C}\x{9A5E}\x{9A5F}\x{9A60}\x{9A61}\x{9A62}\x{9A64}' . +'\x{9A65}\x{9A66}\x{9A67}\x{9A68}\x{9A69}\x{9A6A}\x{9A6B}\x{9A6C}\x{9A6D}' . +'\x{9A6E}\x{9A6F}\x{9A70}\x{9A71}\x{9A72}\x{9A73}\x{9A74}\x{9A75}\x{9A76}' . +'\x{9A77}\x{9A78}\x{9A79}\x{9A7A}\x{9A7B}\x{9A7C}\x{9A7D}\x{9A7E}\x{9A7F}' . +'\x{9A80}\x{9A81}\x{9A82}\x{9A83}\x{9A84}\x{9A85}\x{9A86}\x{9A87}\x{9A88}' . +'\x{9A89}\x{9A8A}\x{9A8B}\x{9A8C}\x{9A8D}\x{9A8E}\x{9A8F}\x{9A90}\x{9A91}' . +'\x{9A92}\x{9A93}\x{9A94}\x{9A95}\x{9A96}\x{9A97}\x{9A98}\x{9A99}\x{9A9A}' . +'\x{9A9B}\x{9A9C}\x{9A9D}\x{9A9E}\x{9A9F}\x{9AA0}\x{9AA1}\x{9AA2}\x{9AA3}' . +'\x{9AA4}\x{9AA5}\x{9AA6}\x{9AA7}\x{9AA8}\x{9AAA}\x{9AAB}\x{9AAC}\x{9AAD}' . +'\x{9AAE}\x{9AAF}\x{9AB0}\x{9AB1}\x{9AB2}\x{9AB3}\x{9AB4}\x{9AB5}\x{9AB6}' . +'\x{9AB7}\x{9AB8}\x{9AB9}\x{9ABA}\x{9ABB}\x{9ABC}\x{9ABE}\x{9ABF}\x{9AC0}' . +'\x{9AC1}\x{9AC2}\x{9AC3}\x{9AC4}\x{9AC5}\x{9AC6}\x{9AC7}\x{9AC9}\x{9ACA}' . +'\x{9ACB}\x{9ACC}\x{9ACD}\x{9ACE}\x{9ACF}\x{9AD0}\x{9AD1}\x{9AD2}\x{9AD3}' . +'\x{9AD4}\x{9AD5}\x{9AD6}\x{9AD8}\x{9AD9}\x{9ADA}\x{9ADB}\x{9ADC}\x{9ADD}' . +'\x{9ADE}\x{9ADF}\x{9AE1}\x{9AE2}\x{9AE3}\x{9AE5}\x{9AE6}\x{9AE7}\x{9AEA}' . +'\x{9AEB}\x{9AEC}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF2}\x{9AF3}\x{9AF4}' . +'\x{9AF5}\x{9AF6}\x{9AF7}\x{9AF8}\x{9AF9}\x{9AFA}\x{9AFB}\x{9AFC}\x{9AFD}' . +'\x{9AFE}\x{9AFF}\x{9B01}\x{9B03}\x{9B04}\x{9B05}\x{9B06}\x{9B07}\x{9B08}' . +'\x{9B0A}\x{9B0B}\x{9B0C}\x{9B0D}\x{9B0E}\x{9B0F}\x{9B10}\x{9B11}\x{9B12}' . +'\x{9B13}\x{9B15}\x{9B16}\x{9B17}\x{9B18}\x{9B19}\x{9B1A}\x{9B1C}\x{9B1D}' . +'\x{9B1E}\x{9B1F}\x{9B20}\x{9B21}\x{9B22}\x{9B23}\x{9B24}\x{9B25}\x{9B26}' . +'\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2B}\x{9B2C}\x{9B2D}\x{9B2E}\x{9B2F}' . +'\x{9B30}\x{9B31}\x{9B32}\x{9B33}\x{9B35}\x{9B36}\x{9B37}\x{9B38}\x{9B39}' . +'\x{9B3A}\x{9B3B}\x{9B3C}\x{9B3E}\x{9B3F}\x{9B41}\x{9B42}\x{9B43}\x{9B44}' . +'\x{9B45}\x{9B46}\x{9B47}\x{9B48}\x{9B49}\x{9B4A}\x{9B4B}\x{9B4C}\x{9B4D}' . +'\x{9B4E}\x{9B4F}\x{9B51}\x{9B52}\x{9B53}\x{9B54}\x{9B55}\x{9B56}\x{9B58}' . +'\x{9B59}\x{9B5A}\x{9B5B}\x{9B5C}\x{9B5D}\x{9B5E}\x{9B5F}\x{9B60}\x{9B61}' . +'\x{9B63}\x{9B64}\x{9B65}\x{9B66}\x{9B67}\x{9B68}\x{9B69}\x{9B6A}\x{9B6B}' . +'\x{9B6C}\x{9B6D}\x{9B6E}\x{9B6F}\x{9B70}\x{9B71}\x{9B73}\x{9B74}\x{9B75}' . +'\x{9B76}\x{9B77}\x{9B78}\x{9B79}\x{9B7A}\x{9B7B}\x{9B7C}\x{9B7D}\x{9B7E}' . +'\x{9B7F}\x{9B80}\x{9B81}\x{9B82}\x{9B83}\x{9B84}\x{9B85}\x{9B86}\x{9B87}' . +'\x{9B88}\x{9B8A}\x{9B8B}\x{9B8D}\x{9B8E}\x{9B8F}\x{9B90}\x{9B91}\x{9B92}' . +'\x{9B93}\x{9B94}\x{9B95}\x{9B96}\x{9B97}\x{9B98}\x{9B9A}\x{9B9B}\x{9B9C}' . +'\x{9B9D}\x{9B9E}\x{9B9F}\x{9BA0}\x{9BA1}\x{9BA2}\x{9BA3}\x{9BA4}\x{9BA5}' . +'\x{9BA6}\x{9BA7}\x{9BA8}\x{9BA9}\x{9BAA}\x{9BAB}\x{9BAC}\x{9BAD}\x{9BAE}' . +'\x{9BAF}\x{9BB0}\x{9BB1}\x{9BB2}\x{9BB3}\x{9BB4}\x{9BB5}\x{9BB6}\x{9BB7}' . +'\x{9BB8}\x{9BB9}\x{9BBA}\x{9BBB}\x{9BBC}\x{9BBD}\x{9BBE}\x{9BBF}\x{9BC0}' . +'\x{9BC1}\x{9BC3}\x{9BC4}\x{9BC5}\x{9BC6}\x{9BC7}\x{9BC8}\x{9BC9}\x{9BCA}' . +'\x{9BCB}\x{9BCC}\x{9BCD}\x{9BCE}\x{9BCF}\x{9BD0}\x{9BD1}\x{9BD2}\x{9BD3}' . +'\x{9BD4}\x{9BD5}\x{9BD6}\x{9BD7}\x{9BD8}\x{9BD9}\x{9BDA}\x{9BDB}\x{9BDC}' . +'\x{9BDD}\x{9BDE}\x{9BDF}\x{9BE0}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}\x{9BE5}' . +'\x{9BE6}\x{9BE7}\x{9BE8}\x{9BE9}\x{9BEA}\x{9BEB}\x{9BEC}\x{9BED}\x{9BEE}' . +'\x{9BEF}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF3}\x{9BF4}\x{9BF5}\x{9BF7}\x{9BF8}' . +'\x{9BF9}\x{9BFA}\x{9BFB}\x{9BFC}\x{9BFD}\x{9BFE}\x{9BFF}\x{9C02}\x{9C05}' . +'\x{9C06}\x{9C07}\x{9C08}\x{9C09}\x{9C0A}\x{9C0B}\x{9C0C}\x{9C0D}\x{9C0E}' . +'\x{9C0F}\x{9C10}\x{9C11}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C16}\x{9C17}' . +'\x{9C18}\x{9C19}\x{9C1A}\x{9C1B}\x{9C1C}\x{9C1D}\x{9C1E}\x{9C1F}\x{9C20}' . +'\x{9C21}\x{9C22}\x{9C23}\x{9C24}\x{9C25}\x{9C26}\x{9C27}\x{9C28}\x{9C29}' . +'\x{9C2A}\x{9C2B}\x{9C2C}\x{9C2D}\x{9C2F}\x{9C30}\x{9C31}\x{9C32}\x{9C33}' . +'\x{9C34}\x{9C35}\x{9C36}\x{9C37}\x{9C38}\x{9C39}\x{9C3A}\x{9C3B}\x{9C3C}' . +'\x{9C3D}\x{9C3E}\x{9C3F}\x{9C40}\x{9C41}\x{9C43}\x{9C44}\x{9C45}\x{9C46}' . +'\x{9C47}\x{9C48}\x{9C49}\x{9C4A}\x{9C4B}\x{9C4C}\x{9C4D}\x{9C4E}\x{9C50}' . +'\x{9C52}\x{9C53}\x{9C54}\x{9C55}\x{9C56}\x{9C57}\x{9C58}\x{9C59}\x{9C5A}' . +'\x{9C5B}\x{9C5C}\x{9C5D}\x{9C5E}\x{9C5F}\x{9C60}\x{9C62}\x{9C63}\x{9C65}' . +'\x{9C66}\x{9C67}\x{9C68}\x{9C69}\x{9C6A}\x{9C6B}\x{9C6C}\x{9C6D}\x{9C6E}' . +'\x{9C6F}\x{9C70}\x{9C71}\x{9C72}\x{9C73}\x{9C74}\x{9C75}\x{9C77}\x{9C78}' . +'\x{9C79}\x{9C7A}\x{9C7C}\x{9C7D}\x{9C7E}\x{9C7F}\x{9C80}\x{9C81}\x{9C82}' . +'\x{9C83}\x{9C84}\x{9C85}\x{9C86}\x{9C87}\x{9C88}\x{9C89}\x{9C8A}\x{9C8B}' . +'\x{9C8C}\x{9C8D}\x{9C8E}\x{9C8F}\x{9C90}\x{9C91}\x{9C92}\x{9C93}\x{9C94}' . +'\x{9C95}\x{9C96}\x{9C97}\x{9C98}\x{9C99}\x{9C9A}\x{9C9B}\x{9C9C}\x{9C9D}' . +'\x{9C9E}\x{9C9F}\x{9CA0}\x{9CA1}\x{9CA2}\x{9CA3}\x{9CA4}\x{9CA5}\x{9CA6}' . +'\x{9CA7}\x{9CA8}\x{9CA9}\x{9CAA}\x{9CAB}\x{9CAC}\x{9CAD}\x{9CAE}\x{9CAF}' . +'\x{9CB0}\x{9CB1}\x{9CB2}\x{9CB3}\x{9CB4}\x{9CB5}\x{9CB6}\x{9CB7}\x{9CB8}' . +'\x{9CB9}\x{9CBA}\x{9CBB}\x{9CBC}\x{9CBD}\x{9CBE}\x{9CBF}\x{9CC0}\x{9CC1}' . +'\x{9CC2}\x{9CC3}\x{9CC4}\x{9CC5}\x{9CC6}\x{9CC7}\x{9CC8}\x{9CC9}\x{9CCA}' . +'\x{9CCB}\x{9CCC}\x{9CCD}\x{9CCE}\x{9CCF}\x{9CD0}\x{9CD1}\x{9CD2}\x{9CD3}' . +'\x{9CD4}\x{9CD5}\x{9CD6}\x{9CD7}\x{9CD8}\x{9CD9}\x{9CDA}\x{9CDB}\x{9CDC}' . +'\x{9CDD}\x{9CDE}\x{9CDF}\x{9CE0}\x{9CE1}\x{9CE2}\x{9CE3}\x{9CE4}\x{9CE5}' . +'\x{9CE6}\x{9CE7}\x{9CE8}\x{9CE9}\x{9CEA}\x{9CEB}\x{9CEC}\x{9CED}\x{9CEE}' . +'\x{9CEF}\x{9CF0}\x{9CF1}\x{9CF2}\x{9CF3}\x{9CF4}\x{9CF5}\x{9CF6}\x{9CF7}' . +'\x{9CF8}\x{9CF9}\x{9CFA}\x{9CFB}\x{9CFC}\x{9CFD}\x{9CFE}\x{9CFF}\x{9D00}' . +'\x{9D01}\x{9D02}\x{9D03}\x{9D04}\x{9D05}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' . +'\x{9D0A}\x{9D0B}\x{9D0F}\x{9D10}\x{9D12}\x{9D13}\x{9D14}\x{9D15}\x{9D16}' . +'\x{9D17}\x{9D18}\x{9D19}\x{9D1A}\x{9D1B}\x{9D1C}\x{9D1D}\x{9D1E}\x{9D1F}' . +'\x{9D20}\x{9D21}\x{9D22}\x{9D23}\x{9D24}\x{9D25}\x{9D26}\x{9D28}\x{9D29}' . +'\x{9D2B}\x{9D2D}\x{9D2E}\x{9D2F}\x{9D30}\x{9D31}\x{9D32}\x{9D33}\x{9D34}' . +'\x{9D36}\x{9D37}\x{9D38}\x{9D39}\x{9D3A}\x{9D3B}\x{9D3D}\x{9D3E}\x{9D3F}' . +'\x{9D40}\x{9D41}\x{9D42}\x{9D43}\x{9D45}\x{9D46}\x{9D47}\x{9D48}\x{9D49}' . +'\x{9D4A}\x{9D4B}\x{9D4C}\x{9D4D}\x{9D4E}\x{9D4F}\x{9D50}\x{9D51}\x{9D52}' . +'\x{9D53}\x{9D54}\x{9D55}\x{9D56}\x{9D57}\x{9D58}\x{9D59}\x{9D5A}\x{9D5B}' . +'\x{9D5C}\x{9D5D}\x{9D5E}\x{9D5F}\x{9D60}\x{9D61}\x{9D62}\x{9D63}\x{9D64}' . +'\x{9D65}\x{9D66}\x{9D67}\x{9D68}\x{9D69}\x{9D6A}\x{9D6B}\x{9D6C}\x{9D6E}' . +'\x{9D6F}\x{9D70}\x{9D71}\x{9D72}\x{9D73}\x{9D74}\x{9D75}\x{9D76}\x{9D77}' . +'\x{9D78}\x{9D79}\x{9D7A}\x{9D7B}\x{9D7C}\x{9D7D}\x{9D7E}\x{9D7F}\x{9D80}' . +'\x{9D81}\x{9D82}\x{9D83}\x{9D84}\x{9D85}\x{9D86}\x{9D87}\x{9D88}\x{9D89}' . +'\x{9D8A}\x{9D8B}\x{9D8C}\x{9D8D}\x{9D8E}\x{9D90}\x{9D91}\x{9D92}\x{9D93}' . +'\x{9D94}\x{9D96}\x{9D97}\x{9D98}\x{9D99}\x{9D9A}\x{9D9B}\x{9D9C}\x{9D9D}' . +'\x{9D9E}\x{9D9F}\x{9DA0}\x{9DA1}\x{9DA2}\x{9DA3}\x{9DA4}\x{9DA5}\x{9DA6}' . +'\x{9DA7}\x{9DA8}\x{9DA9}\x{9DAA}\x{9DAB}\x{9DAC}\x{9DAD}\x{9DAF}\x{9DB0}' . +'\x{9DB1}\x{9DB2}\x{9DB3}\x{9DB4}\x{9DB5}\x{9DB6}\x{9DB7}\x{9DB8}\x{9DB9}' . +'\x{9DBA}\x{9DBB}\x{9DBC}\x{9DBE}\x{9DBF}\x{9DC1}\x{9DC2}\x{9DC3}\x{9DC4}' . +'\x{9DC5}\x{9DC7}\x{9DC8}\x{9DC9}\x{9DCA}\x{9DCB}\x{9DCC}\x{9DCD}\x{9DCE}' . +'\x{9DCF}\x{9DD0}\x{9DD1}\x{9DD2}\x{9DD3}\x{9DD4}\x{9DD5}\x{9DD6}\x{9DD7}' . +'\x{9DD8}\x{9DD9}\x{9DDA}\x{9DDB}\x{9DDC}\x{9DDD}\x{9DDE}\x{9DDF}\x{9DE0}' . +'\x{9DE1}\x{9DE2}\x{9DE3}\x{9DE4}\x{9DE5}\x{9DE6}\x{9DE7}\x{9DE8}\x{9DE9}' . +'\x{9DEB}\x{9DEC}\x{9DED}\x{9DEE}\x{9DEF}\x{9DF0}\x{9DF1}\x{9DF2}\x{9DF3}' . +'\x{9DF4}\x{9DF5}\x{9DF6}\x{9DF7}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFB}\x{9DFD}' . +'\x{9DFE}\x{9DFF}\x{9E00}\x{9E01}\x{9E02}\x{9E03}\x{9E04}\x{9E05}\x{9E06}' . +'\x{9E07}\x{9E08}\x{9E09}\x{9E0A}\x{9E0B}\x{9E0C}\x{9E0D}\x{9E0F}\x{9E10}' . +'\x{9E11}\x{9E12}\x{9E13}\x{9E14}\x{9E15}\x{9E17}\x{9E18}\x{9E19}\x{9E1A}' . +'\x{9E1B}\x{9E1D}\x{9E1E}\x{9E1F}\x{9E20}\x{9E21}\x{9E22}\x{9E23}\x{9E24}' . +'\x{9E25}\x{9E26}\x{9E27}\x{9E28}\x{9E29}\x{9E2A}\x{9E2B}\x{9E2C}\x{9E2D}' . +'\x{9E2E}\x{9E2F}\x{9E30}\x{9E31}\x{9E32}\x{9E33}\x{9E34}\x{9E35}\x{9E36}' . +'\x{9E37}\x{9E38}\x{9E39}\x{9E3A}\x{9E3B}\x{9E3C}\x{9E3D}\x{9E3E}\x{9E3F}' . +'\x{9E40}\x{9E41}\x{9E42}\x{9E43}\x{9E44}\x{9E45}\x{9E46}\x{9E47}\x{9E48}' . +'\x{9E49}\x{9E4A}\x{9E4B}\x{9E4C}\x{9E4D}\x{9E4E}\x{9E4F}\x{9E50}\x{9E51}' . +'\x{9E52}\x{9E53}\x{9E54}\x{9E55}\x{9E56}\x{9E57}\x{9E58}\x{9E59}\x{9E5A}' . +'\x{9E5B}\x{9E5C}\x{9E5D}\x{9E5E}\x{9E5F}\x{9E60}\x{9E61}\x{9E62}\x{9E63}' . +'\x{9E64}\x{9E65}\x{9E66}\x{9E67}\x{9E68}\x{9E69}\x{9E6A}\x{9E6B}\x{9E6C}' . +'\x{9E6D}\x{9E6E}\x{9E6F}\x{9E70}\x{9E71}\x{9E72}\x{9E73}\x{9E74}\x{9E75}' . +'\x{9E76}\x{9E77}\x{9E79}\x{9E7A}\x{9E7C}\x{9E7D}\x{9E7E}\x{9E7F}\x{9E80}' . +'\x{9E81}\x{9E82}\x{9E83}\x{9E84}\x{9E85}\x{9E86}\x{9E87}\x{9E88}\x{9E89}' . +'\x{9E8A}\x{9E8B}\x{9E8C}\x{9E8D}\x{9E8E}\x{9E91}\x{9E92}\x{9E93}\x{9E94}' . +'\x{9E96}\x{9E97}\x{9E99}\x{9E9A}\x{9E9B}\x{9E9C}\x{9E9D}\x{9E9F}\x{9EA0}' . +'\x{9EA1}\x{9EA3}\x{9EA4}\x{9EA5}\x{9EA6}\x{9EA7}\x{9EA8}\x{9EA9}\x{9EAA}' . +'\x{9EAD}\x{9EAE}\x{9EAF}\x{9EB0}\x{9EB2}\x{9EB3}\x{9EB4}\x{9EB5}\x{9EB6}' . +'\x{9EB7}\x{9EB8}\x{9EBB}\x{9EBC}\x{9EBD}\x{9EBE}\x{9EBF}\x{9EC0}\x{9EC1}' . +'\x{9EC2}\x{9EC3}\x{9EC4}\x{9EC5}\x{9EC6}\x{9EC7}\x{9EC8}\x{9EC9}\x{9ECA}' . +'\x{9ECB}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED1}\x{9ED2}\x{9ED3}' . +'\x{9ED4}\x{9ED5}\x{9ED6}\x{9ED7}\x{9ED8}\x{9ED9}\x{9EDA}\x{9EDB}\x{9EDC}' . +'\x{9EDD}\x{9EDE}\x{9EDF}\x{9EE0}\x{9EE1}\x{9EE2}\x{9EE3}\x{9EE4}\x{9EE5}' . +'\x{9EE6}\x{9EE7}\x{9EE8}\x{9EE9}\x{9EEA}\x{9EEB}\x{9EED}\x{9EEE}\x{9EEF}' . +'\x{9EF0}\x{9EF2}\x{9EF3}\x{9EF4}\x{9EF5}\x{9EF6}\x{9EF7}\x{9EF8}\x{9EF9}' . +'\x{9EFA}\x{9EFB}\x{9EFC}\x{9EFD}\x{9EFE}\x{9EFF}\x{9F00}\x{9F01}\x{9F02}' . +'\x{9F04}\x{9F05}\x{9F06}\x{9F07}\x{9F08}\x{9F09}\x{9F0A}\x{9F0B}\x{9F0C}' . +'\x{9F0D}\x{9F0E}\x{9F0F}\x{9F10}\x{9F12}\x{9F13}\x{9F15}\x{9F16}\x{9F17}' . +'\x{9F18}\x{9F19}\x{9F1A}\x{9F1B}\x{9F1C}\x{9F1D}\x{9F1E}\x{9F1F}\x{9F20}' . +'\x{9F22}\x{9F23}\x{9F24}\x{9F25}\x{9F27}\x{9F28}\x{9F29}\x{9F2A}\x{9F2B}' . +'\x{9F2C}\x{9F2D}\x{9F2E}\x{9F2F}\x{9F30}\x{9F31}\x{9F32}\x{9F33}\x{9F34}' . +'\x{9F35}\x{9F36}\x{9F37}\x{9F38}\x{9F39}\x{9F3A}\x{9F3B}\x{9F3C}\x{9F3D}' . +'\x{9F3E}\x{9F3F}\x{9F40}\x{9F41}\x{9F42}\x{9F43}\x{9F44}\x{9F46}\x{9F47}' . +'\x{9F48}\x{9F49}\x{9F4A}\x{9F4B}\x{9F4C}\x{9F4D}\x{9F4E}\x{9F4F}\x{9F50}' . +'\x{9F51}\x{9F52}\x{9F54}\x{9F55}\x{9F56}\x{9F57}\x{9F58}\x{9F59}\x{9F5A}' . +'\x{9F5B}\x{9F5C}\x{9F5D}\x{9F5E}\x{9F5F}\x{9F60}\x{9F61}\x{9F63}\x{9F64}' . +'\x{9F65}\x{9F66}\x{9F67}\x{9F68}\x{9F69}\x{9F6A}\x{9F6B}\x{9F6C}\x{9F6E}' . +'\x{9F6F}\x{9F70}\x{9F71}\x{9F72}\x{9F73}\x{9F74}\x{9F75}\x{9F76}\x{9F77}' . +'\x{9F78}\x{9F79}\x{9F7A}\x{9F7B}\x{9F7C}\x{9F7D}\x{9F7E}\x{9F7F}\x{9F80}' . +'\x{9F81}\x{9F82}\x{9F83}\x{9F84}\x{9F85}\x{9F86}\x{9F87}\x{9F88}\x{9F89}' . +'\x{9F8A}\x{9F8B}\x{9F8C}\x{9F8D}\x{9F8E}\x{9F8F}\x{9F90}\x{9F91}\x{9F92}' . +'\x{9F93}\x{9F94}\x{9F95}\x{9F96}\x{9F97}\x{9F98}\x{9F99}\x{9F9A}\x{9F9B}' . +'\x{9F9C}\x{9F9D}\x{9F9E}\x{9F9F}\x{9FA0}\x{9FA2}\x{9FA4}\x{9FA5}]{1,20}$/iu'); diff --git a/lib/zend/Zend/Validate/Hostname/Com.php b/lib/zend/Zend/Validate/Hostname/Com.php new file mode 100644 index 0000000000..b3e1e1a2e1 --- /dev/null +++ b/lib/zend/Zend/Validate/Hostname/Com.php @@ -0,0 +1,198 @@ + '/^[\x{002d}0-9\x{0400}-\x{052f}]{1,63}$/iu', + 2 => '/^[\x{002d}0-9\x{0370}-\x{03ff}]{1,63}$/iu', + 3 => '/^[\x{002d}0-9a-z\x{ac00}-\x{d7a3}]{1,17}$/iu', + 4 => '/^[\x{002d}0-9a-z·à-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżž]{1,63}$/iu', + 5 => '/^[\x{002d}0-9A-Za-z\x{3400}-\x{3401}\x{3404}-\x{3406}\x{340C}\x{3416}\x{341C}' . +'\x{3421}\x{3424}\x{3428}-\x{3429}\x{342B}-\x{342E}\x{3430}-\x{3434}\x{3436}' . +'\x{3438}-\x{343C}\x{343E}\x{3441}-\x{3445}\x{3447}\x{3449}-\x{3451}\x{3453}' . +'\x{3457}-\x{345F}\x{3463}-\x{3467}\x{346E}-\x{3471}\x{3473}-\x{3477}\x{3479}-\x{348E}\x{3491}-\x{3497}' . +'\x{3499}-\x{34A1}\x{34A4}-\x{34AD}\x{34AF}-\x{34B0}\x{34B2}-\x{34BF}\x{34C2}-\x{34C5}\x{34C7}-\x{34CC}' . +'\x{34CE}-\x{34D1}\x{34D3}-\x{34D8}\x{34DA}-\x{34E4}\x{34E7}-\x{34E9}\x{34EC}-\x{34EF}\x{34F1}-\x{34FE}' . +'\x{3500}-\x{3507}\x{350A}-\x{3513}\x{3515}\x{3517}-\x{351A}\x{351C}-\x{351E}\x{3520}-\x{352A}' . +'\x{352C}-\x{3552}\x{3554}-\x{355C}\x{355E}-\x{3567}\x{3569}-\x{3573}\x{3575}-\x{357C}\x{3580}-\x{3588}' . +'\x{358F}-\x{3598}\x{359E}-\x{35AB}\x{35B4}-\x{35CD}\x{35D0}\x{35D3}-\x{35DC}\x{35E2}-\x{35ED}' . +'\x{35F0}-\x{35F6}\x{35FB}-\x{3602}\x{3605}-\x{360E}\x{3610}-\x{3611}\x{3613}-\x{3616}\x{3619}-\x{362D}' . +'\x{362F}-\x{3634}\x{3636}-\x{363B}\x{363F}-\x{3645}\x{3647}-\x{364B}\x{364D}-\x{3653}\x{3655}' . +'\x{3659}-\x{365E}\x{3660}-\x{3665}\x{3667}-\x{367C}\x{367E}\x{3680}-\x{3685}\x{3687}' . +'\x{3689}-\x{3690}\x{3692}-\x{3698}\x{369A}\x{369C}-\x{36AE}\x{36B0}-\x{36BF}\x{36C1}-\x{36C5}' . +'\x{36C9}-\x{36CA}\x{36CD}-\x{36DE}\x{36E1}-\x{36E2}\x{36E5}-\x{36FE}\x{3701}-\x{3713}\x{3715}-\x{371E}' . +'\x{3720}-\x{372C}\x{372E}-\x{3745}\x{3747}-\x{3748}\x{374A}\x{374C}-\x{3759}\x{375B}-\x{3760}' . +'\x{3762}-\x{3767}\x{3769}-\x{3772}\x{3774}-\x{378C}\x{378F}-\x{379C}\x{379F}\x{37A1}-\x{37AD}' . +'\x{37AF}-\x{37B7}\x{37B9}-\x{37C1}\x{37C3}-\x{37C5}\x{37C7}-\x{37D4}\x{37D6}-\x{37E0}\x{37E2}' . +'\x{37E5}-\x{37ED}\x{37EF}-\x{37F6}\x{37F8}-\x{3802}\x{3804}-\x{381D}\x{3820}-\x{3822}\x{3825}-\x{382A}' . +'\x{382D}-\x{382F}\x{3831}-\x{3832}\x{3834}-\x{384C}\x{384E}-\x{3860}\x{3862}-\x{3863}\x{3865}-\x{386B}' . +'\x{386D}-\x{3886}\x{3888}-\x{38A1}\x{38A3}\x{38A5}-\x{38AA}\x{38AC}\x{38AE}-\x{38B0}' . +'\x{38B2}-\x{38B6}\x{38B8}\x{38BA}-\x{38BE}\x{38C0}-\x{38C9}\x{38CB}-\x{38D4}\x{38D8}-\x{38E0}' . +'\x{38E2}-\x{38E6}\x{38EB}-\x{38ED}\x{38EF}-\x{38F2}\x{38F5}-\x{38F7}\x{38FA}-\x{38FF}\x{3901}-\x{392A}' . +'\x{392C}\x{392E}-\x{393B}\x{393E}-\x{3956}\x{395A}-\x{3969}\x{396B}-\x{397A}\x{397C}-\x{3987}' . +'\x{3989}-\x{3998}\x{399A}-\x{39B0}\x{39B2}\x{39B4}-\x{39D0}\x{39D2}-\x{39DA}\x{39DE}-\x{39DF}' . +'\x{39E1}-\x{39EF}\x{39F1}-\x{3A17}\x{3A19}-\x{3A2A}\x{3A2D}-\x{3A40}\x{3A43}-\x{3A4E}\x{3A50}' . +'\x{3A52}-\x{3A5E}\x{3A60}-\x{3A6D}\x{3A6F}-\x{3A77}\x{3A79}-\x{3A82}\x{3A84}-\x{3A85}\x{3A87}-\x{3A89}' . +'\x{3A8B}-\x{3A8F}\x{3A91}-\x{3A93}\x{3A95}-\x{3A96}\x{3A9A}\x{3A9C}-\x{3AA6}\x{3AA8}-\x{3AA9}' . +'\x{3AAB}-\x{3AB1}\x{3AB4}-\x{3ABC}\x{3ABE}-\x{3AC5}\x{3ACA}-\x{3ACB}\x{3ACD}-\x{3AD5}\x{3AD7}-\x{3AE1}' . +'\x{3AE4}-\x{3AE7}\x{3AE9}-\x{3AEC}\x{3AEE}-\x{3AFD}\x{3B01}-\x{3B10}\x{3B12}-\x{3B15}\x{3B17}-\x{3B1E}' . +'\x{3B20}-\x{3B23}\x{3B25}-\x{3B27}\x{3B29}-\x{3B36}\x{3B38}-\x{3B39}\x{3B3B}-\x{3B3C}\x{3B3F}' . +'\x{3B41}-\x{3B44}\x{3B47}-\x{3B4C}\x{3B4E}\x{3B51}-\x{3B55}\x{3B58}-\x{3B62}\x{3B68}-\x{3B72}' . +'\x{3B78}-\x{3B88}\x{3B8B}-\x{3B9F}\x{3BA1}\x{3BA3}-\x{3BBA}\x{3BBC}\x{3BBF}-\x{3BD0}' . +'\x{3BD3}-\x{3BE6}\x{3BEA}-\x{3BFB}\x{3BFE}-\x{3C12}\x{3C14}-\x{3C1B}\x{3C1D}-\x{3C37}\x{3C39}-\x{3C4F}' . +'\x{3C52}\x{3C54}-\x{3C5C}\x{3C5E}-\x{3C68}\x{3C6A}-\x{3C76}\x{3C78}-\x{3C8F}\x{3C91}-\x{3CA8}' . +'\x{3CAA}-\x{3CAD}\x{3CAF}-\x{3CBE}\x{3CC0}-\x{3CC8}\x{3CCA}-\x{3CD3}\x{3CD6}-\x{3CE0}\x{3CE4}-\x{3CEE}' . +'\x{3CF3}-\x{3D0A}\x{3D0E}-\x{3D1E}\x{3D20}-\x{3D21}\x{3D25}-\x{3D38}\x{3D3B}-\x{3D46}\x{3D4A}-\x{3D59}' . +'\x{3D5D}-\x{3D7B}\x{3D7D}-\x{3D81}\x{3D84}-\x{3D88}\x{3D8C}-\x{3D8F}\x{3D91}-\x{3D98}\x{3D9A}-\x{3D9C}' . +'\x{3D9E}-\x{3DA1}\x{3DA3}-\x{3DB0}\x{3DB2}-\x{3DB5}\x{3DB9}-\x{3DBC}\x{3DBE}-\x{3DCB}\x{3DCD}-\x{3DDB}' . +'\x{3DDF}-\x{3DE8}\x{3DEB}-\x{3DF0}\x{3DF3}-\x{3DF9}\x{3DFB}-\x{3DFC}\x{3DFE}-\x{3E05}\x{3E08}-\x{3E33}' . +'\x{3E35}-\x{3E3E}\x{3E40}-\x{3E47}\x{3E49}-\x{3E67}\x{3E6B}-\x{3E6F}\x{3E71}-\x{3E85}\x{3E87}-\x{3E8C}' . +'\x{3E8E}-\x{3E98}\x{3E9A}-\x{3EA1}\x{3EA3}-\x{3EAE}\x{3EB0}-\x{3EB5}\x{3EB7}-\x{3EBA}\x{3EBD}' . +'\x{3EBF}-\x{3EC4}\x{3EC7}-\x{3ECE}\x{3ED1}-\x{3ED7}\x{3ED9}-\x{3EDA}\x{3EDD}-\x{3EE3}\x{3EE7}-\x{3EE8}' . +'\x{3EEB}-\x{3EF2}\x{3EF5}-\x{3EFF}\x{3F01}-\x{3F02}\x{3F04}-\x{3F07}\x{3F09}-\x{3F44}\x{3F46}-\x{3F4E}' . +'\x{3F50}-\x{3F53}\x{3F55}-\x{3F72}\x{3F74}-\x{3F75}\x{3F77}-\x{3F7B}\x{3F7D}-\x{3FB0}\x{3FB6}-\x{3FBF}' . +'\x{3FC1}-\x{3FCF}\x{3FD1}-\x{3FD3}\x{3FD5}-\x{3FDF}\x{3FE1}-\x{400B}\x{400D}-\x{401C}\x{401E}-\x{4024}' . +'\x{4027}-\x{403F}\x{4041}-\x{4060}\x{4062}-\x{4069}\x{406B}-\x{408A}\x{408C}-\x{40A7}\x{40A9}-\x{40B4}' . +'\x{40B6}-\x{40C2}\x{40C7}-\x{40CF}\x{40D1}-\x{40DE}\x{40E0}-\x{40E7}\x{40E9}-\x{40EE}\x{40F0}-\x{40FB}' . +'\x{40FD}-\x{4109}\x{410B}-\x{4115}\x{4118}-\x{411D}\x{411F}-\x{4122}\x{4124}-\x{4133}\x{4136}-\x{4138}' . +'\x{413A}-\x{4148}\x{414A}-\x{4169}\x{416C}-\x{4185}\x{4188}-\x{418B}\x{418D}-\x{41AD}\x{41AF}-\x{41B3}' . +'\x{41B5}-\x{41C3}\x{41C5}-\x{41C9}\x{41CB}-\x{41F2}\x{41F5}-\x{41FE}\x{4200}-\x{4227}\x{422A}-\x{4246}' . +'\x{4248}-\x{4263}\x{4265}-\x{428B}\x{428D}-\x{42A1}\x{42A3}-\x{42C4}\x{42C8}-\x{42DC}\x{42DE}-\x{430A}' . +'\x{430C}-\x{4335}\x{4337}\x{4342}-\x{435F}\x{4361}-\x{439A}\x{439C}-\x{439D}\x{439F}-\x{43A4}' . +'\x{43A6}-\x{43EC}\x{43EF}-\x{4405}\x{4407}-\x{4429}\x{442B}-\x{4455}\x{4457}-\x{4468}\x{446A}-\x{446D}' . +'\x{446F}-\x{4476}\x{4479}-\x{447D}\x{447F}-\x{4486}\x{4488}-\x{4490}\x{4492}-\x{4498}\x{449A}-\x{44AD}' . +'\x{44B0}-\x{44BD}\x{44C1}-\x{44D3}\x{44D6}-\x{44E7}\x{44EA}\x{44EC}-\x{44FA}\x{44FC}-\x{4541}' . +'\x{4543}-\x{454F}\x{4551}-\x{4562}\x{4564}-\x{4575}\x{4577}-\x{45AB}\x{45AD}-\x{45BD}\x{45BF}-\x{45D5}' . +'\x{45D7}-\x{45EC}\x{45EE}-\x{45F2}\x{45F4}-\x{45FA}\x{45FC}-\x{461A}\x{461C}-\x{461D}\x{461F}-\x{4631}' . +'\x{4633}-\x{4649}\x{464C}\x{464E}-\x{4652}\x{4654}-\x{466A}\x{466C}-\x{4675}\x{4677}-\x{467A}' . +'\x{467C}-\x{4694}\x{4696}-\x{46A3}\x{46A5}-\x{46AB}\x{46AD}-\x{46D2}\x{46D4}-\x{4723}\x{4729}-\x{4732}' . +'\x{4734}-\x{4758}\x{475A}\x{475C}-\x{478B}\x{478D}\x{4791}-\x{47B1}\x{47B3}-\x{47F1}' . +'\x{47F3}-\x{480B}\x{480D}-\x{4815}\x{4817}-\x{4839}\x{483B}-\x{4870}\x{4872}-\x{487A}\x{487C}-\x{487F}' . +'\x{4883}-\x{488E}\x{4890}-\x{4896}\x{4899}-\x{48A2}\x{48A4}-\x{48B9}\x{48BB}-\x{48C8}\x{48CA}-\x{48D1}' . +'\x{48D3}-\x{48E5}\x{48E7}-\x{48F2}\x{48F4}-\x{48FF}\x{4901}-\x{4922}\x{4924}-\x{4928}\x{492A}-\x{4931}' . +'\x{4933}-\x{495B}\x{495D}-\x{4978}\x{497A}\x{497D}\x{4982}-\x{4983}\x{4985}-\x{49A8}' . +'\x{49AA}-\x{49AF}\x{49B1}-\x{49B7}\x{49B9}-\x{49BD}\x{49C1}-\x{49C7}\x{49C9}-\x{49CE}\x{49D0}-\x{49E8}' . +'\x{49EA}\x{49EC}\x{49EE}-\x{4A19}\x{4A1B}-\x{4A43}\x{4A45}-\x{4A4D}\x{4A4F}-\x{4A9E}' . +'\x{4AA0}-\x{4AA9}\x{4AAB}-\x{4B4E}\x{4B50}-\x{4B5B}\x{4B5D}-\x{4B69}\x{4B6B}-\x{4BC2}\x{4BC6}-\x{4BE8}' . +'\x{4BEA}-\x{4BFA}\x{4BFC}-\x{4C06}\x{4C08}-\x{4C2D}\x{4C2F}-\x{4C32}\x{4C34}-\x{4C35}\x{4C37}-\x{4C69}' . +'\x{4C6B}-\x{4C73}\x{4C75}-\x{4C86}\x{4C88}-\x{4C97}\x{4C99}-\x{4C9C}\x{4C9F}-\x{4CA3}\x{4CA5}-\x{4CB5}' . +'\x{4CB7}-\x{4CF8}\x{4CFA}-\x{4D27}\x{4D29}-\x{4DAC}\x{4DAE}-\x{4DB1}\x{4DB3}-\x{4DB5}\x{4E00}-\x{4E54}' . +'\x{4E56}-\x{4E89}\x{4E8B}-\x{4EEC}\x{4EEE}-\x{4FAC}\x{4FAE}-\x{503C}\x{503E}-\x{51E5}\x{51E7}-\x{5270}' . +'\x{5272}-\x{56A1}\x{56A3}-\x{5840}\x{5842}-\x{58B5}\x{58B7}-\x{58CB}\x{58CD}-\x{5BC8}\x{5BCA}-\x{5C01}' . +'\x{5C03}-\x{5C25}\x{5C27}-\x{5D5B}\x{5D5D}-\x{5F08}\x{5F0A}-\x{61F3}\x{61F5}-\x{63BA}\x{63BC}-\x{6441}' . +'\x{6443}-\x{657C}\x{657E}-\x{663E}\x{6640}-\x{66FC}\x{66FE}-\x{6728}\x{672A}-\x{6766}\x{6768}-\x{67A8}' . +'\x{67AA}-\x{685B}\x{685D}-\x{685E}\x{6860}-\x{68B9}\x{68BB}-\x{6AC8}\x{6ACA}-\x{6BB0}\x{6BB2}-\x{6C16}' . +'\x{6C18}-\x{6D9B}\x{6D9D}-\x{6E12}\x{6E14}-\x{6E8B}\x{6E8D}-\x{704D}\x{704F}-\x{7113}\x{7115}-\x{713B}' . +'\x{713D}-\x{7154}\x{7156}-\x{729F}\x{72A1}-\x{731E}\x{7320}-\x{7362}\x{7364}-\x{7533}\x{7535}-\x{7551}' . +'\x{7553}-\x{7572}\x{7574}-\x{75E8}\x{75EA}-\x{7679}\x{767B}-\x{783E}\x{7840}-\x{7A62}\x{7A64}-\x{7AC2}' . +'\x{7AC4}-\x{7B06}\x{7B08}-\x{7B79}\x{7B7B}-\x{7BCE}\x{7BD0}-\x{7D99}\x{7D9B}-\x{7E49}\x{7E4C}-\x{8132}' . +'\x{8134}\x{8136}-\x{81D2}\x{81D4}-\x{8216}\x{8218}-\x{822D}\x{822F}-\x{83B4}\x{83B6}-\x{841F}' . +'\x{8421}-\x{86CC}\x{86CE}-\x{874A}\x{874C}-\x{877E}\x{8780}-\x{8A32}\x{8A34}-\x{8B71}\x{8B73}-\x{8B8E}' . +'\x{8B90}-\x{8DE4}\x{8DE6}-\x{8E9A}\x{8E9C}-\x{8EE1}\x{8EE4}-\x{8F0B}\x{8F0D}-\x{8FB9}\x{8FBB}-\x{9038}' . +'\x{903A}-\x{9196}\x{9198}-\x{91A3}\x{91A5}-\x{91B7}\x{91B9}-\x{91C7}\x{91C9}-\x{91E0}\x{91E2}-\x{91FB}' . +'\x{91FD}-\x{922B}\x{922D}-\x{9270}\x{9272}-\x{9420}\x{9422}-\x{9664}\x{9666}-\x{9679}\x{967B}-\x{9770}' . +'\x{9772}-\x{982B}\x{982D}-\x{98ED}\x{98EF}-\x{99C4}\x{99C6}-\x{9A11}\x{9A14}-\x{9A27}\x{9A29}-\x{9D0D}' . +'\x{9D0F}-\x{9D2B}\x{9D2D}-\x{9D8E}\x{9D90}-\x{9DC5}\x{9DC7}-\x{9E77}\x{9E79}-\x{9EB8}\x{9EBB}-\x{9F20}' . +'\x{9F22}-\x{9F61}\x{9F63}-\x{9FA5}\x{FA28}]{1,20}$/iu', + 6 => '/^[\x{002d}0-9A-Za-z]{1,63}$/iu', + 7 => '/^[\x{00A1}-\x{00FF}]{1,63}$/iu', + 8 => '/^[\x{0100}-\x{017f}]{1,63}$/iu', + 9 => '/^[\x{0180}-\x{024f}]{1,63}$/iu', + 10 => '/^[\x{0250}-\x{02af}]{1,63}$/iu', + 11 => '/^[\x{02b0}-\x{02ff}]{1,63}$/iu', + 12 => '/^[\x{0300}-\x{036f}]{1,63}$/iu', + 13 => '/^[\x{0370}-\x{03ff}]{1,63}$/iu', + 14 => '/^[\x{0400}-\x{04ff}]{1,63}$/iu', + 15 => '/^[\x{0500}-\x{052f}]{1,63}$/iu', + 16 => '/^[\x{0530}-\x{058F}]{1,63}$/iu', + 17 => '/^[\x{0590}-\x{05FF}]{1,63}$/iu', + 18 => '/^[\x{0600}-\x{06FF}]{1,63}$/iu', + 19 => '/^[\x{0700}-\x{074F}]{1,63}$/iu', + 20 => '/^[\x{0780}-\x{07BF}]{1,63}$/iu', + 21 => '/^[\x{0900}-\x{097F}]{1,63}$/iu', + 22 => '/^[\x{0980}-\x{09FF}]{1,63}$/iu', + 23 => '/^[\x{0A00}-\x{0A7F}]{1,63}$/iu', + 24 => '/^[\x{0A80}-\x{0AFF}]{1,63}$/iu', + 25 => '/^[\x{0B00}-\x{0B7F}]{1,63}$/iu', + 26 => '/^[\x{0B80}-\x{0BFF}]{1,63}$/iu', + 27 => '/^[\x{0C00}-\x{0C7F}]{1,63}$/iu', + 28 => '/^[\x{0C80}-\x{0CFF}]{1,63}$/iu', + 29 => '/^[\x{0D00}-\x{0D7F}]{1,63}$/iu', + 30 => '/^[\x{0D80}-\x{0DFF}]{1,63}$/iu', + 31 => '/^[\x{0E00}-\x{0E7F}]{1,63}$/iu', + 32 => '/^[\x{0E80}-\x{0EFF}]{1,63}$/iu', + 33 => '/^[\x{0F00}-\x{0FFF}]{1,63}$/iu', + 34 => '/^[\x{1000}-\x{109F}]{1,63}$/iu', + 35 => '/^[\x{10A0}-\x{10FF}]{1,63}$/iu', + 36 => '/^[\x{1100}-\x{11FF}]{1,63}$/iu', + 37 => '/^[\x{1200}-\x{137F}]{1,63}$/iu', + 38 => '/^[\x{13A0}-\x{13FF}]{1,63}$/iu', + 39 => '/^[\x{1400}-\x{167F}]{1,63}$/iu', + 40 => '/^[\x{1680}-\x{169F}]{1,63}$/iu', + 41 => '/^[\x{16A0}-\x{16FF}]{1,63}$/iu', + 42 => '/^[\x{1700}-\x{171F}]{1,63}$/iu', + 43 => '/^[\x{1720}-\x{173F}]{1,63}$/iu', + 44 => '/^[\x{1740}-\x{175F}]{1,63}$/iu', + 45 => '/^[\x{1760}-\x{177F}]{1,63}$/iu', + 46 => '/^[\x{1780}-\x{17FF}]{1,63}$/iu', + 47 => '/^[\x{1800}-\x{18AF}]{1,63}$/iu', + 48 => '/^[\x{1E00}-\x{1EFF}]{1,63}$/iu', + 49 => '/^[\x{1F00}-\x{1FFF}]{1,63}$/iu', + 50 => '/^[\x{2070}-\x{209F}]{1,63}$/iu', + 51 => '/^[\x{2100}-\x{214F}]{1,63}$/iu', + 52 => '/^[\x{2150}-\x{218F}]{1,63}$/iu', + 53 => '/^[\x{2460}-\x{24FF}]{1,63}$/iu', + 54 => '/^[\x{2E80}-\x{2EFF}]{1,63}$/iu', + 55 => '/^[\x{2F00}-\x{2FDF}]{1,63}$/iu', + 56 => '/^[\x{2FF0}-\x{2FFF}]{1,63}$/iu', + 57 => '/^[\x{3040}-\x{309F}]{1,63}$/iu', + 58 => '/^[\x{30A0}-\x{30FF}]{1,63}$/iu', + 59 => '/^[\x{3100}-\x{312F}]{1,63}$/iu', + 60 => '/^[\x{3130}-\x{318F}]{1,63}$/iu', + 61 => '/^[\x{3190}-\x{319F}]{1,63}$/iu', + 62 => '/^[\x{31A0}-\x{31BF}]{1,63}$/iu', + 63 => '/^[\x{31F0}-\x{31FF}]{1,63}$/iu', + 64 => '/^[\x{3200}-\x{32FF}]{1,63}$/iu', + 65 => '/^[\x{3300}-\x{33FF}]{1,63}$/iu', + 66 => '/^[\x{3400}-\x{4DBF}]{1,63}$/iu', + 67 => '/^[\x{4E00}-\x{9FFF}]{1,63}$/iu', + 68 => '/^[\x{A000}-\x{A48F}]{1,63}$/iu', + 69 => '/^[\x{A490}-\x{A4CF}]{1,63}$/iu', + 70 => '/^[\x{AC00}-\x{D7AF}]{1,63}$/iu', + 71 => '/^[\x{D800}-\x{DB7F}]{1,63}$/iu', + 72 => '/^[\x{DC00}-\x{DFFF}]{1,63}$/iu', + 73 => '/^[\x{F900}-\x{FAFF}]{1,63}$/iu', + 74 => '/^[\x{FB00}-\x{FB4F}]{1,63}$/iu', + 75 => '/^[\x{FB50}-\x{FDFF}]{1,63}$/iu', + 76 => '/^[\x{FE20}-\x{FE2F}]{1,63}$/iu', + 77 => '/^[\x{FE70}-\x{FEFF}]{1,63}$/iu', + 78 => '/^[\x{FF00}-\x{FFEF}]{1,63}$/iu', + 79 => '/^[\x{20000}-\x{2A6DF}]{1,63}$/iu', + 80 => '/^[\x{2F800}-\x{2FA1F}]{1,63}$/iu' + +); \ No newline at end of file diff --git a/lib/zend/Zend/Validate/Hostname/Jp.php b/lib/zend/Zend/Validate/Hostname/Jp.php new file mode 100644 index 0000000000..440a346996 --- /dev/null +++ b/lib/zend/Zend/Validate/Hostname/Jp.php @@ -0,0 +1,739 @@ + '/^[\x{002d}0-9a-z\x{3005}-\x{3007}\x{3041}-\x{3093}\x{309D}\x{309E}' . +'\x{30A1}-\x{30F6}\x{30FC}' . +'\x{30FD}\x{30FE}\x{4E00}\x{4E01}\x{4E03}\x{4E07}\x{4E08}\x{4E09}\x{4E0A}' . +'\x{4E0B}\x{4E0D}\x{4E0E}\x{4E10}\x{4E11}\x{4E14}\x{4E15}\x{4E16}\x{4E17}' . +'\x{4E18}\x{4E19}\x{4E1E}\x{4E21}\x{4E26}\x{4E2A}\x{4E2D}\x{4E31}\x{4E32}' . +'\x{4E36}\x{4E38}\x{4E39}\x{4E3B}\x{4E3C}\x{4E3F}\x{4E42}\x{4E43}\x{4E45}' . +'\x{4E4B}\x{4E4D}\x{4E4E}\x{4E4F}\x{4E55}\x{4E56}\x{4E57}\x{4E58}\x{4E59}' . +'\x{4E5D}\x{4E5E}\x{4E5F}\x{4E62}\x{4E71}\x{4E73}\x{4E7E}\x{4E80}\x{4E82}' . +'\x{4E85}\x{4E86}\x{4E88}\x{4E89}\x{4E8A}\x{4E8B}\x{4E8C}\x{4E8E}\x{4E91}' . +'\x{4E92}\x{4E94}\x{4E95}\x{4E98}\x{4E99}\x{4E9B}\x{4E9C}\x{4E9E}\x{4E9F}' . +'\x{4EA0}\x{4EA1}\x{4EA2}\x{4EA4}\x{4EA5}\x{4EA6}\x{4EA8}\x{4EAB}\x{4EAC}' . +'\x{4EAD}\x{4EAE}\x{4EB0}\x{4EB3}\x{4EB6}\x{4EBA}\x{4EC0}\x{4EC1}\x{4EC2}' . +'\x{4EC4}\x{4EC6}\x{4EC7}\x{4ECA}\x{4ECB}\x{4ECD}\x{4ECE}\x{4ECF}\x{4ED4}' . +'\x{4ED5}\x{4ED6}\x{4ED7}\x{4ED8}\x{4ED9}\x{4EDD}\x{4EDE}\x{4EDF}\x{4EE3}' . +'\x{4EE4}\x{4EE5}\x{4EED}\x{4EEE}\x{4EF0}\x{4EF2}\x{4EF6}\x{4EF7}\x{4EFB}' . +'\x{4F01}\x{4F09}\x{4F0A}\x{4F0D}\x{4F0E}\x{4F0F}\x{4F10}\x{4F11}\x{4F1A}' . +'\x{4F1C}\x{4F1D}\x{4F2F}\x{4F30}\x{4F34}\x{4F36}\x{4F38}\x{4F3A}\x{4F3C}' . +'\x{4F3D}\x{4F43}\x{4F46}\x{4F47}\x{4F4D}\x{4F4E}\x{4F4F}\x{4F50}\x{4F51}' . +'\x{4F53}\x{4F55}\x{4F57}\x{4F59}\x{4F5A}\x{4F5B}\x{4F5C}\x{4F5D}\x{4F5E}' . +'\x{4F69}\x{4F6F}\x{4F70}\x{4F73}\x{4F75}\x{4F76}\x{4F7B}\x{4F7C}\x{4F7F}' . +'\x{4F83}\x{4F86}\x{4F88}\x{4F8B}\x{4F8D}\x{4F8F}\x{4F91}\x{4F96}\x{4F98}' . +'\x{4F9B}\x{4F9D}\x{4FA0}\x{4FA1}\x{4FAB}\x{4FAD}\x{4FAE}\x{4FAF}\x{4FB5}' . +'\x{4FB6}\x{4FBF}\x{4FC2}\x{4FC3}\x{4FC4}\x{4FCA}\x{4FCE}\x{4FD0}\x{4FD1}' . +'\x{4FD4}\x{4FD7}\x{4FD8}\x{4FDA}\x{4FDB}\x{4FDD}\x{4FDF}\x{4FE1}\x{4FE3}' . +'\x{4FE4}\x{4FE5}\x{4FEE}\x{4FEF}\x{4FF3}\x{4FF5}\x{4FF6}\x{4FF8}\x{4FFA}' . +'\x{4FFE}\x{5005}\x{5006}\x{5009}\x{500B}\x{500D}\x{500F}\x{5011}\x{5012}' . +'\x{5014}\x{5016}\x{5019}\x{501A}\x{501F}\x{5021}\x{5023}\x{5024}\x{5025}' . +'\x{5026}\x{5028}\x{5029}\x{502A}\x{502B}\x{502C}\x{502D}\x{5036}\x{5039}' . +'\x{5043}\x{5047}\x{5048}\x{5049}\x{504F}\x{5050}\x{5055}\x{5056}\x{505A}' . +'\x{505C}\x{5065}\x{506C}\x{5072}\x{5074}\x{5075}\x{5076}\x{5078}\x{507D}' . +'\x{5080}\x{5085}\x{508D}\x{5091}\x{5098}\x{5099}\x{509A}\x{50AC}\x{50AD}' . +'\x{50B2}\x{50B3}\x{50B4}\x{50B5}\x{50B7}\x{50BE}\x{50C2}\x{50C5}\x{50C9}' . +'\x{50CA}\x{50CD}\x{50CF}\x{50D1}\x{50D5}\x{50D6}\x{50DA}\x{50DE}\x{50E3}' . +'\x{50E5}\x{50E7}\x{50ED}\x{50EE}\x{50F5}\x{50F9}\x{50FB}\x{5100}\x{5101}' . +'\x{5102}\x{5104}\x{5109}\x{5112}\x{5114}\x{5115}\x{5116}\x{5118}\x{511A}' . +'\x{511F}\x{5121}\x{512A}\x{5132}\x{5137}\x{513A}\x{513B}\x{513C}\x{513F}' . +'\x{5140}\x{5141}\x{5143}\x{5144}\x{5145}\x{5146}\x{5147}\x{5148}\x{5149}' . +'\x{514B}\x{514C}\x{514D}\x{514E}\x{5150}\x{5152}\x{5154}\x{515A}\x{515C}' . +'\x{5162}\x{5165}\x{5168}\x{5169}\x{516A}\x{516B}\x{516C}\x{516D}\x{516E}' . +'\x{5171}\x{5175}\x{5176}\x{5177}\x{5178}\x{517C}\x{5180}\x{5182}\x{5185}' . +'\x{5186}\x{5189}\x{518A}\x{518C}\x{518D}\x{518F}\x{5190}\x{5191}\x{5192}' . +'\x{5193}\x{5195}\x{5196}\x{5197}\x{5199}\x{51A0}\x{51A2}\x{51A4}\x{51A5}' . +'\x{51A6}\x{51A8}\x{51A9}\x{51AA}\x{51AB}\x{51AC}\x{51B0}\x{51B1}\x{51B2}' . +'\x{51B3}\x{51B4}\x{51B5}\x{51B6}\x{51B7}\x{51BD}\x{51C4}\x{51C5}\x{51C6}' . +'\x{51C9}\x{51CB}\x{51CC}\x{51CD}\x{51D6}\x{51DB}\x{51DC}\x{51DD}\x{51E0}' . +'\x{51E1}\x{51E6}\x{51E7}\x{51E9}\x{51EA}\x{51ED}\x{51F0}\x{51F1}\x{51F5}' . +'\x{51F6}\x{51F8}\x{51F9}\x{51FA}\x{51FD}\x{51FE}\x{5200}\x{5203}\x{5204}' . +'\x{5206}\x{5207}\x{5208}\x{520A}\x{520B}\x{520E}\x{5211}\x{5214}\x{5217}' . +'\x{521D}\x{5224}\x{5225}\x{5227}\x{5229}\x{522A}\x{522E}\x{5230}\x{5233}' . +'\x{5236}\x{5237}\x{5238}\x{5239}\x{523A}\x{523B}\x{5243}\x{5244}\x{5247}' . +'\x{524A}\x{524B}\x{524C}\x{524D}\x{524F}\x{5254}\x{5256}\x{525B}\x{525E}' . +'\x{5263}\x{5264}\x{5265}\x{5269}\x{526A}\x{526F}\x{5270}\x{5271}\x{5272}' . +'\x{5273}\x{5274}\x{5275}\x{527D}\x{527F}\x{5283}\x{5287}\x{5288}\x{5289}' . +'\x{528D}\x{5291}\x{5292}\x{5294}\x{529B}\x{529F}\x{52A0}\x{52A3}\x{52A9}' . +'\x{52AA}\x{52AB}\x{52AC}\x{52AD}\x{52B1}\x{52B4}\x{52B5}\x{52B9}\x{52BC}' . +'\x{52BE}\x{52C1}\x{52C3}\x{52C5}\x{52C7}\x{52C9}\x{52CD}\x{52D2}\x{52D5}' . +'\x{52D7}\x{52D8}\x{52D9}\x{52DD}\x{52DE}\x{52DF}\x{52E0}\x{52E2}\x{52E3}' . +'\x{52E4}\x{52E6}\x{52E7}\x{52F2}\x{52F3}\x{52F5}\x{52F8}\x{52F9}\x{52FA}' . +'\x{52FE}\x{52FF}\x{5301}\x{5302}\x{5305}\x{5306}\x{5308}\x{530D}\x{530F}' . +'\x{5310}\x{5315}\x{5316}\x{5317}\x{5319}\x{531A}\x{531D}\x{5320}\x{5321}' . +'\x{5323}\x{532A}\x{532F}\x{5331}\x{5333}\x{5338}\x{5339}\x{533A}\x{533B}' . +'\x{533F}\x{5340}\x{5341}\x{5343}\x{5345}\x{5346}\x{5347}\x{5348}\x{5349}' . +'\x{534A}\x{534D}\x{5351}\x{5352}\x{5353}\x{5354}\x{5357}\x{5358}\x{535A}' . +'\x{535C}\x{535E}\x{5360}\x{5366}\x{5369}\x{536E}\x{536F}\x{5370}\x{5371}' . +'\x{5373}\x{5374}\x{5375}\x{5377}\x{5378}\x{537B}\x{537F}\x{5382}\x{5384}' . +'\x{5396}\x{5398}\x{539A}\x{539F}\x{53A0}\x{53A5}\x{53A6}\x{53A8}\x{53A9}' . +'\x{53AD}\x{53AE}\x{53B0}\x{53B3}\x{53B6}\x{53BB}\x{53C2}\x{53C3}\x{53C8}' . +'\x{53C9}\x{53CA}\x{53CB}\x{53CC}\x{53CD}\x{53CE}\x{53D4}\x{53D6}\x{53D7}' . +'\x{53D9}\x{53DB}\x{53DF}\x{53E1}\x{53E2}\x{53E3}\x{53E4}\x{53E5}\x{53E8}' . +'\x{53E9}\x{53EA}\x{53EB}\x{53EC}\x{53ED}\x{53EE}\x{53EF}\x{53F0}\x{53F1}' . +'\x{53F2}\x{53F3}\x{53F6}\x{53F7}\x{53F8}\x{53FA}\x{5401}\x{5403}\x{5404}' . +'\x{5408}\x{5409}\x{540A}\x{540B}\x{540C}\x{540D}\x{540E}\x{540F}\x{5410}' . +'\x{5411}\x{541B}\x{541D}\x{541F}\x{5420}\x{5426}\x{5429}\x{542B}\x{542C}' . +'\x{542D}\x{542E}\x{5436}\x{5438}\x{5439}\x{543B}\x{543C}\x{543D}\x{543E}' . +'\x{5440}\x{5442}\x{5446}\x{5448}\x{5449}\x{544A}\x{544E}\x{5451}\x{545F}' . +'\x{5468}\x{546A}\x{5470}\x{5471}\x{5473}\x{5475}\x{5476}\x{5477}\x{547B}' . +'\x{547C}\x{547D}\x{5480}\x{5484}\x{5486}\x{548B}\x{548C}\x{548E}\x{548F}' . +'\x{5490}\x{5492}\x{54A2}\x{54A4}\x{54A5}\x{54A8}\x{54AB}\x{54AC}\x{54AF}' . +'\x{54B2}\x{54B3}\x{54B8}\x{54BC}\x{54BD}\x{54BE}\x{54C0}\x{54C1}\x{54C2}' . +'\x{54C4}\x{54C7}\x{54C8}\x{54C9}\x{54D8}\x{54E1}\x{54E2}\x{54E5}\x{54E6}' . +'\x{54E8}\x{54E9}\x{54ED}\x{54EE}\x{54F2}\x{54FA}\x{54FD}\x{5504}\x{5506}' . +'\x{5507}\x{550F}\x{5510}\x{5514}\x{5516}\x{552E}\x{552F}\x{5531}\x{5533}' . +'\x{5538}\x{5539}\x{553E}\x{5540}\x{5544}\x{5545}\x{5546}\x{554C}\x{554F}' . +'\x{5553}\x{5556}\x{5557}\x{555C}\x{555D}\x{5563}\x{557B}\x{557C}\x{557E}' . +'\x{5580}\x{5583}\x{5584}\x{5587}\x{5589}\x{558A}\x{558B}\x{5598}\x{5599}' . +'\x{559A}\x{559C}\x{559D}\x{559E}\x{559F}\x{55A7}\x{55A8}\x{55A9}\x{55AA}' . +'\x{55AB}\x{55AC}\x{55AE}\x{55B0}\x{55B6}\x{55C4}\x{55C5}\x{55C7}\x{55D4}' . +'\x{55DA}\x{55DC}\x{55DF}\x{55E3}\x{55E4}\x{55F7}\x{55F9}\x{55FD}\x{55FE}' . +'\x{5606}\x{5609}\x{5614}\x{5616}\x{5617}\x{5618}\x{561B}\x{5629}\x{562F}' . +'\x{5631}\x{5632}\x{5634}\x{5636}\x{5638}\x{5642}\x{564C}\x{564E}\x{5650}' . +'\x{565B}\x{5664}\x{5668}\x{566A}\x{566B}\x{566C}\x{5674}\x{5678}\x{567A}' . +'\x{5680}\x{5686}\x{5687}\x{568A}\x{568F}\x{5694}\x{56A0}\x{56A2}\x{56A5}' . +'\x{56AE}\x{56B4}\x{56B6}\x{56BC}\x{56C0}\x{56C1}\x{56C2}\x{56C3}\x{56C8}' . +'\x{56CE}\x{56D1}\x{56D3}\x{56D7}\x{56D8}\x{56DA}\x{56DB}\x{56DE}\x{56E0}' . +'\x{56E3}\x{56EE}\x{56F0}\x{56F2}\x{56F3}\x{56F9}\x{56FA}\x{56FD}\x{56FF}' . +'\x{5700}\x{5703}\x{5704}\x{5708}\x{5709}\x{570B}\x{570D}\x{570F}\x{5712}' . +'\x{5713}\x{5716}\x{5718}\x{571C}\x{571F}\x{5726}\x{5727}\x{5728}\x{572D}' . +'\x{5730}\x{5737}\x{5738}\x{573B}\x{5740}\x{5742}\x{5747}\x{574A}\x{574E}' . +'\x{574F}\x{5750}\x{5751}\x{5761}\x{5764}\x{5766}\x{5769}\x{576A}\x{577F}' . +'\x{5782}\x{5788}\x{5789}\x{578B}\x{5793}\x{57A0}\x{57A2}\x{57A3}\x{57A4}' . +'\x{57AA}\x{57B0}\x{57B3}\x{57C0}\x{57C3}\x{57C6}\x{57CB}\x{57CE}\x{57D2}' . +'\x{57D3}\x{57D4}\x{57D6}\x{57DC}\x{57DF}\x{57E0}\x{57E3}\x{57F4}\x{57F7}' . +'\x{57F9}\x{57FA}\x{57FC}\x{5800}\x{5802}\x{5805}\x{5806}\x{580A}\x{580B}' . +'\x{5815}\x{5819}\x{581D}\x{5821}\x{5824}\x{582A}\x{582F}\x{5830}\x{5831}' . +'\x{5834}\x{5835}\x{583A}\x{583D}\x{5840}\x{5841}\x{584A}\x{584B}\x{5851}' . +'\x{5852}\x{5854}\x{5857}\x{5858}\x{5859}\x{585A}\x{585E}\x{5862}\x{5869}' . +'\x{586B}\x{5870}\x{5872}\x{5875}\x{5879}\x{587E}\x{5883}\x{5885}\x{5893}' . +'\x{5897}\x{589C}\x{589F}\x{58A8}\x{58AB}\x{58AE}\x{58B3}\x{58B8}\x{58B9}' . +'\x{58BA}\x{58BB}\x{58BE}\x{58C1}\x{58C5}\x{58C7}\x{58CA}\x{58CC}\x{58D1}' . +'\x{58D3}\x{58D5}\x{58D7}\x{58D8}\x{58D9}\x{58DC}\x{58DE}\x{58DF}\x{58E4}' . +'\x{58E5}\x{58EB}\x{58EC}\x{58EE}\x{58EF}\x{58F0}\x{58F1}\x{58F2}\x{58F7}' . +'\x{58F9}\x{58FA}\x{58FB}\x{58FC}\x{58FD}\x{5902}\x{5909}\x{590A}\x{590F}' . +'\x{5910}\x{5915}\x{5916}\x{5918}\x{5919}\x{591A}\x{591B}\x{591C}\x{5922}' . +'\x{5925}\x{5927}\x{5929}\x{592A}\x{592B}\x{592C}\x{592D}\x{592E}\x{5931}' . +'\x{5932}\x{5937}\x{5938}\x{593E}\x{5944}\x{5947}\x{5948}\x{5949}\x{594E}' . +'\x{594F}\x{5950}\x{5951}\x{5954}\x{5955}\x{5957}\x{5958}\x{595A}\x{5960}' . +'\x{5962}\x{5965}\x{5967}\x{5968}\x{5969}\x{596A}\x{596C}\x{596E}\x{5973}' . +'\x{5974}\x{5978}\x{597D}\x{5981}\x{5982}\x{5983}\x{5984}\x{598A}\x{598D}' . +'\x{5993}\x{5996}\x{5999}\x{599B}\x{599D}\x{59A3}\x{59A5}\x{59A8}\x{59AC}' . +'\x{59B2}\x{59B9}\x{59BB}\x{59BE}\x{59C6}\x{59C9}\x{59CB}\x{59D0}\x{59D1}' . +'\x{59D3}\x{59D4}\x{59D9}\x{59DA}\x{59DC}\x{59E5}\x{59E6}\x{59E8}\x{59EA}' . +'\x{59EB}\x{59F6}\x{59FB}\x{59FF}\x{5A01}\x{5A03}\x{5A09}\x{5A11}\x{5A18}' . +'\x{5A1A}\x{5A1C}\x{5A1F}\x{5A20}\x{5A25}\x{5A29}\x{5A2F}\x{5A35}\x{5A36}' . +'\x{5A3C}\x{5A40}\x{5A41}\x{5A46}\x{5A49}\x{5A5A}\x{5A62}\x{5A66}\x{5A6A}' . +'\x{5A6C}\x{5A7F}\x{5A92}\x{5A9A}\x{5A9B}\x{5ABC}\x{5ABD}\x{5ABE}\x{5AC1}' . +'\x{5AC2}\x{5AC9}\x{5ACB}\x{5ACC}\x{5AD0}\x{5AD6}\x{5AD7}\x{5AE1}\x{5AE3}' . +'\x{5AE6}\x{5AE9}\x{5AFA}\x{5AFB}\x{5B09}\x{5B0B}\x{5B0C}\x{5B16}\x{5B22}' . +'\x{5B2A}\x{5B2C}\x{5B30}\x{5B32}\x{5B36}\x{5B3E}\x{5B40}\x{5B43}\x{5B45}' . +'\x{5B50}\x{5B51}\x{5B54}\x{5B55}\x{5B57}\x{5B58}\x{5B5A}\x{5B5B}\x{5B5C}' . +'\x{5B5D}\x{5B5F}\x{5B63}\x{5B64}\x{5B65}\x{5B66}\x{5B69}\x{5B6B}\x{5B70}' . +'\x{5B71}\x{5B73}\x{5B75}\x{5B78}\x{5B7A}\x{5B80}\x{5B83}\x{5B85}\x{5B87}' . +'\x{5B88}\x{5B89}\x{5B8B}\x{5B8C}\x{5B8D}\x{5B8F}\x{5B95}\x{5B97}\x{5B98}' . +'\x{5B99}\x{5B9A}\x{5B9B}\x{5B9C}\x{5B9D}\x{5B9F}\x{5BA2}\x{5BA3}\x{5BA4}' . +'\x{5BA5}\x{5BA6}\x{5BAE}\x{5BB0}\x{5BB3}\x{5BB4}\x{5BB5}\x{5BB6}\x{5BB8}' . +'\x{5BB9}\x{5BBF}\x{5BC2}\x{5BC3}\x{5BC4}\x{5BC5}\x{5BC6}\x{5BC7}\x{5BC9}' . +'\x{5BCC}\x{5BD0}\x{5BD2}\x{5BD3}\x{5BD4}\x{5BDB}\x{5BDD}\x{5BDE}\x{5BDF}' . +'\x{5BE1}\x{5BE2}\x{5BE4}\x{5BE5}\x{5BE6}\x{5BE7}\x{5BE8}\x{5BE9}\x{5BEB}' . +'\x{5BEE}\x{5BF0}\x{5BF3}\x{5BF5}\x{5BF6}\x{5BF8}\x{5BFA}\x{5BFE}\x{5BFF}' . +'\x{5C01}\x{5C02}\x{5C04}\x{5C05}\x{5C06}\x{5C07}\x{5C08}\x{5C09}\x{5C0A}' . +'\x{5C0B}\x{5C0D}\x{5C0E}\x{5C0F}\x{5C11}\x{5C13}\x{5C16}\x{5C1A}\x{5C20}' . +'\x{5C22}\x{5C24}\x{5C28}\x{5C2D}\x{5C31}\x{5C38}\x{5C39}\x{5C3A}\x{5C3B}' . +'\x{5C3C}\x{5C3D}\x{5C3E}\x{5C3F}\x{5C40}\x{5C41}\x{5C45}\x{5C46}\x{5C48}' . +'\x{5C4A}\x{5C4B}\x{5C4D}\x{5C4E}\x{5C4F}\x{5C50}\x{5C51}\x{5C53}\x{5C55}' . +'\x{5C5E}\x{5C60}\x{5C61}\x{5C64}\x{5C65}\x{5C6C}\x{5C6E}\x{5C6F}\x{5C71}' . +'\x{5C76}\x{5C79}\x{5C8C}\x{5C90}\x{5C91}\x{5C94}\x{5CA1}\x{5CA8}\x{5CA9}' . +'\x{5CAB}\x{5CAC}\x{5CB1}\x{5CB3}\x{5CB6}\x{5CB7}\x{5CB8}\x{5CBB}\x{5CBC}' . +'\x{5CBE}\x{5CC5}\x{5CC7}\x{5CD9}\x{5CE0}\x{5CE1}\x{5CE8}\x{5CE9}\x{5CEA}' . +'\x{5CED}\x{5CEF}\x{5CF0}\x{5CF6}\x{5CFA}\x{5CFB}\x{5CFD}\x{5D07}\x{5D0B}' . +'\x{5D0E}\x{5D11}\x{5D14}\x{5D15}\x{5D16}\x{5D17}\x{5D18}\x{5D19}\x{5D1A}' . +'\x{5D1B}\x{5D1F}\x{5D22}\x{5D29}\x{5D4B}\x{5D4C}\x{5D4E}\x{5D50}\x{5D52}' . +'\x{5D5C}\x{5D69}\x{5D6C}\x{5D6F}\x{5D73}\x{5D76}\x{5D82}\x{5D84}\x{5D87}' . +'\x{5D8B}\x{5D8C}\x{5D90}\x{5D9D}\x{5DA2}\x{5DAC}\x{5DAE}\x{5DB7}\x{5DBA}' . +'\x{5DBC}\x{5DBD}\x{5DC9}\x{5DCC}\x{5DCD}\x{5DD2}\x{5DD3}\x{5DD6}\x{5DDB}' . +'\x{5DDD}\x{5DDE}\x{5DE1}\x{5DE3}\x{5DE5}\x{5DE6}\x{5DE7}\x{5DE8}\x{5DEB}' . +'\x{5DEE}\x{5DF1}\x{5DF2}\x{5DF3}\x{5DF4}\x{5DF5}\x{5DF7}\x{5DFB}\x{5DFD}' . +'\x{5DFE}\x{5E02}\x{5E03}\x{5E06}\x{5E0B}\x{5E0C}\x{5E11}\x{5E16}\x{5E19}' . +'\x{5E1A}\x{5E1B}\x{5E1D}\x{5E25}\x{5E2B}\x{5E2D}\x{5E2F}\x{5E30}\x{5E33}' . +'\x{5E36}\x{5E37}\x{5E38}\x{5E3D}\x{5E40}\x{5E43}\x{5E44}\x{5E45}\x{5E47}' . +'\x{5E4C}\x{5E4E}\x{5E54}\x{5E55}\x{5E57}\x{5E5F}\x{5E61}\x{5E62}\x{5E63}' . +'\x{5E64}\x{5E72}\x{5E73}\x{5E74}\x{5E75}\x{5E76}\x{5E78}\x{5E79}\x{5E7A}' . +'\x{5E7B}\x{5E7C}\x{5E7D}\x{5E7E}\x{5E7F}\x{5E81}\x{5E83}\x{5E84}\x{5E87}' . +'\x{5E8A}\x{5E8F}\x{5E95}\x{5E96}\x{5E97}\x{5E9A}\x{5E9C}\x{5EA0}\x{5EA6}' . +'\x{5EA7}\x{5EAB}\x{5EAD}\x{5EB5}\x{5EB6}\x{5EB7}\x{5EB8}\x{5EC1}\x{5EC2}' . +'\x{5EC3}\x{5EC8}\x{5EC9}\x{5ECA}\x{5ECF}\x{5ED0}\x{5ED3}\x{5ED6}\x{5EDA}' . +'\x{5EDB}\x{5EDD}\x{5EDF}\x{5EE0}\x{5EE1}\x{5EE2}\x{5EE3}\x{5EE8}\x{5EE9}' . +'\x{5EEC}\x{5EF0}\x{5EF1}\x{5EF3}\x{5EF4}\x{5EF6}\x{5EF7}\x{5EF8}\x{5EFA}' . +'\x{5EFB}\x{5EFC}\x{5EFE}\x{5EFF}\x{5F01}\x{5F03}\x{5F04}\x{5F09}\x{5F0A}' . +'\x{5F0B}\x{5F0C}\x{5F0D}\x{5F0F}\x{5F10}\x{5F11}\x{5F13}\x{5F14}\x{5F15}' . +'\x{5F16}\x{5F17}\x{5F18}\x{5F1B}\x{5F1F}\x{5F25}\x{5F26}\x{5F27}\x{5F29}' . +'\x{5F2D}\x{5F2F}\x{5F31}\x{5F35}\x{5F37}\x{5F38}\x{5F3C}\x{5F3E}\x{5F41}' . +'\x{5F48}\x{5F4A}\x{5F4C}\x{5F4E}\x{5F51}\x{5F53}\x{5F56}\x{5F57}\x{5F59}' . +'\x{5F5C}\x{5F5D}\x{5F61}\x{5F62}\x{5F66}\x{5F69}\x{5F6A}\x{5F6B}\x{5F6C}' . +'\x{5F6D}\x{5F70}\x{5F71}\x{5F73}\x{5F77}\x{5F79}\x{5F7C}\x{5F7F}\x{5F80}' . +'\x{5F81}\x{5F82}\x{5F83}\x{5F84}\x{5F85}\x{5F87}\x{5F88}\x{5F8A}\x{5F8B}' . +'\x{5F8C}\x{5F90}\x{5F91}\x{5F92}\x{5F93}\x{5F97}\x{5F98}\x{5F99}\x{5F9E}' . +'\x{5FA0}\x{5FA1}\x{5FA8}\x{5FA9}\x{5FAA}\x{5FAD}\x{5FAE}\x{5FB3}\x{5FB4}' . +'\x{5FB9}\x{5FBC}\x{5FBD}\x{5FC3}\x{5FC5}\x{5FCC}\x{5FCD}\x{5FD6}\x{5FD7}' . +'\x{5FD8}\x{5FD9}\x{5FDC}\x{5FDD}\x{5FE0}\x{5FE4}\x{5FEB}\x{5FF0}\x{5FF1}' . +'\x{5FF5}\x{5FF8}\x{5FFB}\x{5FFD}\x{5FFF}\x{600E}\x{600F}\x{6010}\x{6012}' . +'\x{6015}\x{6016}\x{6019}\x{601B}\x{601C}\x{601D}\x{6020}\x{6021}\x{6025}' . +'\x{6026}\x{6027}\x{6028}\x{6029}\x{602A}\x{602B}\x{602F}\x{6031}\x{603A}' . +'\x{6041}\x{6042}\x{6043}\x{6046}\x{604A}\x{604B}\x{604D}\x{6050}\x{6052}' . +'\x{6055}\x{6059}\x{605A}\x{605F}\x{6060}\x{6062}\x{6063}\x{6064}\x{6065}' . +'\x{6068}\x{6069}\x{606A}\x{606B}\x{606C}\x{606D}\x{606F}\x{6070}\x{6075}' . +'\x{6077}\x{6081}\x{6083}\x{6084}\x{6089}\x{608B}\x{608C}\x{608D}\x{6092}' . +'\x{6094}\x{6096}\x{6097}\x{609A}\x{609B}\x{609F}\x{60A0}\x{60A3}\x{60A6}' . +'\x{60A7}\x{60A9}\x{60AA}\x{60B2}\x{60B3}\x{60B4}\x{60B5}\x{60B6}\x{60B8}' . +'\x{60BC}\x{60BD}\x{60C5}\x{60C6}\x{60C7}\x{60D1}\x{60D3}\x{60D8}\x{60DA}' . +'\x{60DC}\x{60DF}\x{60E0}\x{60E1}\x{60E3}\x{60E7}\x{60E8}\x{60F0}\x{60F1}' . +'\x{60F3}\x{60F4}\x{60F6}\x{60F7}\x{60F9}\x{60FA}\x{60FB}\x{6100}\x{6101}' . +'\x{6103}\x{6106}\x{6108}\x{6109}\x{610D}\x{610E}\x{610F}\x{6115}\x{611A}' . +'\x{611B}\x{611F}\x{6121}\x{6127}\x{6128}\x{612C}\x{6134}\x{613C}\x{613D}' . +'\x{613E}\x{613F}\x{6142}\x{6144}\x{6147}\x{6148}\x{614A}\x{614B}\x{614C}' . +'\x{614D}\x{614E}\x{6153}\x{6155}\x{6158}\x{6159}\x{615A}\x{615D}\x{615F}' . +'\x{6162}\x{6163}\x{6165}\x{6167}\x{6168}\x{616B}\x{616E}\x{616F}\x{6170}' . +'\x{6171}\x{6173}\x{6174}\x{6175}\x{6176}\x{6177}\x{617E}\x{6182}\x{6187}' . +'\x{618A}\x{618E}\x{6190}\x{6191}\x{6194}\x{6196}\x{6199}\x{619A}\x{61A4}' . +'\x{61A7}\x{61A9}\x{61AB}\x{61AC}\x{61AE}\x{61B2}\x{61B6}\x{61BA}\x{61BE}' . +'\x{61C3}\x{61C6}\x{61C7}\x{61C8}\x{61C9}\x{61CA}\x{61CB}\x{61CC}\x{61CD}' . +'\x{61D0}\x{61E3}\x{61E6}\x{61F2}\x{61F4}\x{61F6}\x{61F7}\x{61F8}\x{61FA}' . +'\x{61FC}\x{61FD}\x{61FE}\x{61FF}\x{6200}\x{6208}\x{6209}\x{620A}\x{620C}' . +'\x{620D}\x{620E}\x{6210}\x{6211}\x{6212}\x{6214}\x{6216}\x{621A}\x{621B}' . +'\x{621D}\x{621E}\x{621F}\x{6221}\x{6226}\x{622A}\x{622E}\x{622F}\x{6230}' . +'\x{6232}\x{6233}\x{6234}\x{6238}\x{623B}\x{623F}\x{6240}\x{6241}\x{6247}' . +'\x{6248}\x{6249}\x{624B}\x{624D}\x{624E}\x{6253}\x{6255}\x{6258}\x{625B}' . +'\x{625E}\x{6260}\x{6263}\x{6268}\x{626E}\x{6271}\x{6276}\x{6279}\x{627C}' . +'\x{627E}\x{627F}\x{6280}\x{6282}\x{6283}\x{6284}\x{6289}\x{628A}\x{6291}' . +'\x{6292}\x{6293}\x{6294}\x{6295}\x{6296}\x{6297}\x{6298}\x{629B}\x{629C}' . +'\x{629E}\x{62AB}\x{62AC}\x{62B1}\x{62B5}\x{62B9}\x{62BB}\x{62BC}\x{62BD}' . +'\x{62C2}\x{62C5}\x{62C6}\x{62C7}\x{62C8}\x{62C9}\x{62CA}\x{62CC}\x{62CD}' . +'\x{62CF}\x{62D0}\x{62D1}\x{62D2}\x{62D3}\x{62D4}\x{62D7}\x{62D8}\x{62D9}' . +'\x{62DB}\x{62DC}\x{62DD}\x{62E0}\x{62E1}\x{62EC}\x{62ED}\x{62EE}\x{62EF}' . +'\x{62F1}\x{62F3}\x{62F5}\x{62F6}\x{62F7}\x{62FE}\x{62FF}\x{6301}\x{6302}' . +'\x{6307}\x{6308}\x{6309}\x{630C}\x{6311}\x{6319}\x{631F}\x{6327}\x{6328}' . +'\x{632B}\x{632F}\x{633A}\x{633D}\x{633E}\x{633F}\x{6349}\x{634C}\x{634D}' . +'\x{634F}\x{6350}\x{6355}\x{6357}\x{635C}\x{6367}\x{6368}\x{6369}\x{636B}' . +'\x{636E}\x{6372}\x{6376}\x{6377}\x{637A}\x{637B}\x{6380}\x{6383}\x{6388}' . +'\x{6389}\x{638C}\x{638E}\x{638F}\x{6392}\x{6396}\x{6398}\x{639B}\x{639F}' . +'\x{63A0}\x{63A1}\x{63A2}\x{63A3}\x{63A5}\x{63A7}\x{63A8}\x{63A9}\x{63AA}' . +'\x{63AB}\x{63AC}\x{63B2}\x{63B4}\x{63B5}\x{63BB}\x{63BE}\x{63C0}\x{63C3}' . +'\x{63C4}\x{63C6}\x{63C9}\x{63CF}\x{63D0}\x{63D2}\x{63D6}\x{63DA}\x{63DB}' . +'\x{63E1}\x{63E3}\x{63E9}\x{63EE}\x{63F4}\x{63F6}\x{63FA}\x{6406}\x{640D}' . +'\x{640F}\x{6413}\x{6416}\x{6417}\x{641C}\x{6426}\x{6428}\x{642C}\x{642D}' . +'\x{6434}\x{6436}\x{643A}\x{643E}\x{6442}\x{644E}\x{6458}\x{6467}\x{6469}' . +'\x{646F}\x{6476}\x{6478}\x{647A}\x{6483}\x{6488}\x{6492}\x{6493}\x{6495}' . +'\x{649A}\x{649E}\x{64A4}\x{64A5}\x{64A9}\x{64AB}\x{64AD}\x{64AE}\x{64B0}' . +'\x{64B2}\x{64B9}\x{64BB}\x{64BC}\x{64C1}\x{64C2}\x{64C5}\x{64C7}\x{64CD}' . +'\x{64D2}\x{64D4}\x{64D8}\x{64DA}\x{64E0}\x{64E1}\x{64E2}\x{64E3}\x{64E6}' . +'\x{64E7}\x{64EC}\x{64EF}\x{64F1}\x{64F2}\x{64F4}\x{64F6}\x{64FA}\x{64FD}' . +'\x{64FE}\x{6500}\x{6505}\x{6518}\x{651C}\x{651D}\x{6523}\x{6524}\x{652A}' . +'\x{652B}\x{652C}\x{652F}\x{6534}\x{6535}\x{6536}\x{6537}\x{6538}\x{6539}' . +'\x{653B}\x{653E}\x{653F}\x{6545}\x{6548}\x{654D}\x{654F}\x{6551}\x{6555}' . +'\x{6556}\x{6557}\x{6558}\x{6559}\x{655D}\x{655E}\x{6562}\x{6563}\x{6566}' . +'\x{656C}\x{6570}\x{6572}\x{6574}\x{6575}\x{6577}\x{6578}\x{6582}\x{6583}' . +'\x{6587}\x{6588}\x{6589}\x{658C}\x{658E}\x{6590}\x{6591}\x{6597}\x{6599}' . +'\x{659B}\x{659C}\x{659F}\x{65A1}\x{65A4}\x{65A5}\x{65A7}\x{65AB}\x{65AC}' . +'\x{65AD}\x{65AF}\x{65B0}\x{65B7}\x{65B9}\x{65BC}\x{65BD}\x{65C1}\x{65C3}' . +'\x{65C4}\x{65C5}\x{65C6}\x{65CB}\x{65CC}\x{65CF}\x{65D2}\x{65D7}\x{65D9}' . +'\x{65DB}\x{65E0}\x{65E1}\x{65E2}\x{65E5}\x{65E6}\x{65E7}\x{65E8}\x{65E9}' . +'\x{65EC}\x{65ED}\x{65F1}\x{65FA}\x{65FB}\x{6602}\x{6603}\x{6606}\x{6607}' . +'\x{660A}\x{660C}\x{660E}\x{660F}\x{6613}\x{6614}\x{661C}\x{661F}\x{6620}' . +'\x{6625}\x{6627}\x{6628}\x{662D}\x{662F}\x{6634}\x{6635}\x{6636}\x{663C}' . +'\x{663F}\x{6641}\x{6642}\x{6643}\x{6644}\x{6649}\x{664B}\x{664F}\x{6652}' . +'\x{665D}\x{665E}\x{665F}\x{6662}\x{6664}\x{6666}\x{6667}\x{6668}\x{6669}' . +'\x{666E}\x{666F}\x{6670}\x{6674}\x{6676}\x{667A}\x{6681}\x{6683}\x{6684}' . +'\x{6687}\x{6688}\x{6689}\x{668E}\x{6691}\x{6696}\x{6697}\x{6698}\x{669D}' . +'\x{66A2}\x{66A6}\x{66AB}\x{66AE}\x{66B4}\x{66B8}\x{66B9}\x{66BC}\x{66BE}' . +'\x{66C1}\x{66C4}\x{66C7}\x{66C9}\x{66D6}\x{66D9}\x{66DA}\x{66DC}\x{66DD}' . +'\x{66E0}\x{66E6}\x{66E9}\x{66F0}\x{66F2}\x{66F3}\x{66F4}\x{66F5}\x{66F7}' . +'\x{66F8}\x{66F9}\x{66FC}\x{66FD}\x{66FE}\x{66FF}\x{6700}\x{6703}\x{6708}' . +'\x{6709}\x{670B}\x{670D}\x{670F}\x{6714}\x{6715}\x{6716}\x{6717}\x{671B}' . +'\x{671D}\x{671E}\x{671F}\x{6726}\x{6727}\x{6728}\x{672A}\x{672B}\x{672C}' . +'\x{672D}\x{672E}\x{6731}\x{6734}\x{6736}\x{6737}\x{6738}\x{673A}\x{673D}' . +'\x{673F}\x{6741}\x{6746}\x{6749}\x{674E}\x{674F}\x{6750}\x{6751}\x{6753}' . +'\x{6756}\x{6759}\x{675C}\x{675E}\x{675F}\x{6760}\x{6761}\x{6762}\x{6763}' . +'\x{6764}\x{6765}\x{676A}\x{676D}\x{676F}\x{6770}\x{6771}\x{6772}\x{6773}' . +'\x{6775}\x{6777}\x{677C}\x{677E}\x{677F}\x{6785}\x{6787}\x{6789}\x{678B}' . +'\x{678C}\x{6790}\x{6795}\x{6797}\x{679A}\x{679C}\x{679D}\x{67A0}\x{67A1}' . +'\x{67A2}\x{67A6}\x{67A9}\x{67AF}\x{67B3}\x{67B4}\x{67B6}\x{67B7}\x{67B8}' . +'\x{67B9}\x{67C1}\x{67C4}\x{67C6}\x{67CA}\x{67CE}\x{67CF}\x{67D0}\x{67D1}' . +'\x{67D3}\x{67D4}\x{67D8}\x{67DA}\x{67DD}\x{67DE}\x{67E2}\x{67E4}\x{67E7}' . +'\x{67E9}\x{67EC}\x{67EE}\x{67EF}\x{67F1}\x{67F3}\x{67F4}\x{67F5}\x{67FB}' . +'\x{67FE}\x{67FF}\x{6802}\x{6803}\x{6804}\x{6813}\x{6816}\x{6817}\x{681E}' . +'\x{6821}\x{6822}\x{6829}\x{682A}\x{682B}\x{6832}\x{6834}\x{6838}\x{6839}' . +'\x{683C}\x{683D}\x{6840}\x{6841}\x{6842}\x{6843}\x{6846}\x{6848}\x{684D}' . +'\x{684E}\x{6850}\x{6851}\x{6853}\x{6854}\x{6859}\x{685C}\x{685D}\x{685F}' . +'\x{6863}\x{6867}\x{6874}\x{6876}\x{6877}\x{687E}\x{687F}\x{6881}\x{6883}' . +'\x{6885}\x{688D}\x{688F}\x{6893}\x{6894}\x{6897}\x{689B}\x{689D}\x{689F}' . +'\x{68A0}\x{68A2}\x{68A6}\x{68A7}\x{68A8}\x{68AD}\x{68AF}\x{68B0}\x{68B1}' . +'\x{68B3}\x{68B5}\x{68B6}\x{68B9}\x{68BA}\x{68BC}\x{68C4}\x{68C6}\x{68C9}' . +'\x{68CA}\x{68CB}\x{68CD}\x{68D2}\x{68D4}\x{68D5}\x{68D7}\x{68D8}\x{68DA}' . +'\x{68DF}\x{68E0}\x{68E1}\x{68E3}\x{68E7}\x{68EE}\x{68EF}\x{68F2}\x{68F9}' . +'\x{68FA}\x{6900}\x{6901}\x{6904}\x{6905}\x{6908}\x{690B}\x{690C}\x{690D}' . +'\x{690E}\x{690F}\x{6912}\x{6919}\x{691A}\x{691B}\x{691C}\x{6921}\x{6922}' . +'\x{6923}\x{6925}\x{6926}\x{6928}\x{692A}\x{6930}\x{6934}\x{6936}\x{6939}' . +'\x{693D}\x{693F}\x{694A}\x{6953}\x{6954}\x{6955}\x{6959}\x{695A}\x{695C}' . +'\x{695D}\x{695E}\x{6960}\x{6961}\x{6962}\x{696A}\x{696B}\x{696D}\x{696E}' . +'\x{696F}\x{6973}\x{6974}\x{6975}\x{6977}\x{6978}\x{6979}\x{697C}\x{697D}' . +'\x{697E}\x{6981}\x{6982}\x{698A}\x{698E}\x{6991}\x{6994}\x{6995}\x{699B}' . +'\x{699C}\x{69A0}\x{69A7}\x{69AE}\x{69B1}\x{69B2}\x{69B4}\x{69BB}\x{69BE}' . +'\x{69BF}\x{69C1}\x{69C3}\x{69C7}\x{69CA}\x{69CB}\x{69CC}\x{69CD}\x{69CE}' . +'\x{69D0}\x{69D3}\x{69D8}\x{69D9}\x{69DD}\x{69DE}\x{69E7}\x{69E8}\x{69EB}' . +'\x{69ED}\x{69F2}\x{69F9}\x{69FB}\x{69FD}\x{69FF}\x{6A02}\x{6A05}\x{6A0A}' . +'\x{6A0B}\x{6A0C}\x{6A12}\x{6A13}\x{6A14}\x{6A17}\x{6A19}\x{6A1B}\x{6A1E}' . +'\x{6A1F}\x{6A21}\x{6A22}\x{6A23}\x{6A29}\x{6A2A}\x{6A2B}\x{6A2E}\x{6A35}' . +'\x{6A36}\x{6A38}\x{6A39}\x{6A3A}\x{6A3D}\x{6A44}\x{6A47}\x{6A48}\x{6A4B}' . +'\x{6A58}\x{6A59}\x{6A5F}\x{6A61}\x{6A62}\x{6A66}\x{6A72}\x{6A78}\x{6A7F}' . +'\x{6A80}\x{6A84}\x{6A8D}\x{6A8E}\x{6A90}\x{6A97}\x{6A9C}\x{6AA0}\x{6AA2}' . +'\x{6AA3}\x{6AAA}\x{6AAC}\x{6AAE}\x{6AB3}\x{6AB8}\x{6ABB}\x{6AC1}\x{6AC2}' . +'\x{6AC3}\x{6AD1}\x{6AD3}\x{6ADA}\x{6ADB}\x{6ADE}\x{6ADF}\x{6AE8}\x{6AEA}' . +'\x{6AFA}\x{6AFB}\x{6B04}\x{6B05}\x{6B0A}\x{6B12}\x{6B16}\x{6B1D}\x{6B1F}' . +'\x{6B20}\x{6B21}\x{6B23}\x{6B27}\x{6B32}\x{6B37}\x{6B38}\x{6B39}\x{6B3A}' . +'\x{6B3D}\x{6B3E}\x{6B43}\x{6B47}\x{6B49}\x{6B4C}\x{6B4E}\x{6B50}\x{6B53}' . +'\x{6B54}\x{6B59}\x{6B5B}\x{6B5F}\x{6B61}\x{6B62}\x{6B63}\x{6B64}\x{6B66}' . +'\x{6B69}\x{6B6A}\x{6B6F}\x{6B73}\x{6B74}\x{6B78}\x{6B79}\x{6B7B}\x{6B7F}' . +'\x{6B80}\x{6B83}\x{6B84}\x{6B86}\x{6B89}\x{6B8A}\x{6B8B}\x{6B8D}\x{6B95}' . +'\x{6B96}\x{6B98}\x{6B9E}\x{6BA4}\x{6BAA}\x{6BAB}\x{6BAF}\x{6BB1}\x{6BB2}' . +'\x{6BB3}\x{6BB4}\x{6BB5}\x{6BB7}\x{6BBA}\x{6BBB}\x{6BBC}\x{6BBF}\x{6BC0}' . +'\x{6BC5}\x{6BC6}\x{6BCB}\x{6BCD}\x{6BCE}\x{6BD2}\x{6BD3}\x{6BD4}\x{6BD8}' . +'\x{6BDB}\x{6BDF}\x{6BEB}\x{6BEC}\x{6BEF}\x{6BF3}\x{6C08}\x{6C0F}\x{6C11}' . +'\x{6C13}\x{6C14}\x{6C17}\x{6C1B}\x{6C23}\x{6C24}\x{6C34}\x{6C37}\x{6C38}' . +'\x{6C3E}\x{6C40}\x{6C41}\x{6C42}\x{6C4E}\x{6C50}\x{6C55}\x{6C57}\x{6C5A}' . +'\x{6C5D}\x{6C5E}\x{6C5F}\x{6C60}\x{6C62}\x{6C68}\x{6C6A}\x{6C70}\x{6C72}' . +'\x{6C73}\x{6C7A}\x{6C7D}\x{6C7E}\x{6C81}\x{6C82}\x{6C83}\x{6C88}\x{6C8C}' . +'\x{6C8D}\x{6C90}\x{6C92}\x{6C93}\x{6C96}\x{6C99}\x{6C9A}\x{6C9B}\x{6CA1}' . +'\x{6CA2}\x{6CAB}\x{6CAE}\x{6CB1}\x{6CB3}\x{6CB8}\x{6CB9}\x{6CBA}\x{6CBB}' . +'\x{6CBC}\x{6CBD}\x{6CBE}\x{6CBF}\x{6CC1}\x{6CC4}\x{6CC5}\x{6CC9}\x{6CCA}' . +'\x{6CCC}\x{6CD3}\x{6CD5}\x{6CD7}\x{6CD9}\x{6CDB}\x{6CDD}\x{6CE1}\x{6CE2}' . +'\x{6CE3}\x{6CE5}\x{6CE8}\x{6CEA}\x{6CEF}\x{6CF0}\x{6CF1}\x{6CF3}\x{6D0B}' . +'\x{6D0C}\x{6D12}\x{6D17}\x{6D19}\x{6D1B}\x{6D1E}\x{6D1F}\x{6D25}\x{6D29}' . +'\x{6D2A}\x{6D2B}\x{6D32}\x{6D33}\x{6D35}\x{6D36}\x{6D38}\x{6D3B}\x{6D3D}' . +'\x{6D3E}\x{6D41}\x{6D44}\x{6D45}\x{6D59}\x{6D5A}\x{6D5C}\x{6D63}\x{6D64}' . +'\x{6D66}\x{6D69}\x{6D6A}\x{6D6C}\x{6D6E}\x{6D74}\x{6D77}\x{6D78}\x{6D79}' . +'\x{6D85}\x{6D88}\x{6D8C}\x{6D8E}\x{6D93}\x{6D95}\x{6D99}\x{6D9B}\x{6D9C}' . +'\x{6DAF}\x{6DB2}\x{6DB5}\x{6DB8}\x{6DBC}\x{6DC0}\x{6DC5}\x{6DC6}\x{6DC7}' . +'\x{6DCB}\x{6DCC}\x{6DD1}\x{6DD2}\x{6DD5}\x{6DD8}\x{6DD9}\x{6DDE}\x{6DE1}' . +'\x{6DE4}\x{6DE6}\x{6DE8}\x{6DEA}\x{6DEB}\x{6DEC}\x{6DEE}\x{6DF1}\x{6DF3}' . +'\x{6DF5}\x{6DF7}\x{6DF9}\x{6DFA}\x{6DFB}\x{6E05}\x{6E07}\x{6E08}\x{6E09}' . +'\x{6E0A}\x{6E0B}\x{6E13}\x{6E15}\x{6E19}\x{6E1A}\x{6E1B}\x{6E1D}\x{6E1F}' . +'\x{6E20}\x{6E21}\x{6E23}\x{6E24}\x{6E25}\x{6E26}\x{6E29}\x{6E2B}\x{6E2C}' . +'\x{6E2D}\x{6E2E}\x{6E2F}\x{6E38}\x{6E3A}\x{6E3E}\x{6E43}\x{6E4A}\x{6E4D}' . +'\x{6E4E}\x{6E56}\x{6E58}\x{6E5B}\x{6E5F}\x{6E67}\x{6E6B}\x{6E6E}\x{6E6F}' . +'\x{6E72}\x{6E76}\x{6E7E}\x{6E7F}\x{6E80}\x{6E82}\x{6E8C}\x{6E8F}\x{6E90}' . +'\x{6E96}\x{6E98}\x{6E9C}\x{6E9D}\x{6E9F}\x{6EA2}\x{6EA5}\x{6EAA}\x{6EAF}' . +'\x{6EB2}\x{6EB6}\x{6EB7}\x{6EBA}\x{6EBD}\x{6EC2}\x{6EC4}\x{6EC5}\x{6EC9}' . +'\x{6ECB}\x{6ECC}\x{6ED1}\x{6ED3}\x{6ED4}\x{6ED5}\x{6EDD}\x{6EDE}\x{6EEC}' . +'\x{6EEF}\x{6EF2}\x{6EF4}\x{6EF7}\x{6EF8}\x{6EFE}\x{6EFF}\x{6F01}\x{6F02}' . +'\x{6F06}\x{6F09}\x{6F0F}\x{6F11}\x{6F13}\x{6F14}\x{6F15}\x{6F20}\x{6F22}' . +'\x{6F23}\x{6F2B}\x{6F2C}\x{6F31}\x{6F32}\x{6F38}\x{6F3E}\x{6F3F}\x{6F41}' . +'\x{6F45}\x{6F54}\x{6F58}\x{6F5B}\x{6F5C}\x{6F5F}\x{6F64}\x{6F66}\x{6F6D}' . +'\x{6F6E}\x{6F6F}\x{6F70}\x{6F74}\x{6F78}\x{6F7A}\x{6F7C}\x{6F80}\x{6F81}' . +'\x{6F82}\x{6F84}\x{6F86}\x{6F8E}\x{6F91}\x{6F97}\x{6FA1}\x{6FA3}\x{6FA4}' . +'\x{6FAA}\x{6FB1}\x{6FB3}\x{6FB9}\x{6FC0}\x{6FC1}\x{6FC2}\x{6FC3}\x{6FC6}' . +'\x{6FD4}\x{6FD5}\x{6FD8}\x{6FDB}\x{6FDF}\x{6FE0}\x{6FE1}\x{6FE4}\x{6FEB}' . +'\x{6FEC}\x{6FEE}\x{6FEF}\x{6FF1}\x{6FF3}\x{6FF6}\x{6FFA}\x{6FFE}\x{7001}' . +'\x{7009}\x{700B}\x{700F}\x{7011}\x{7015}\x{7018}\x{701A}\x{701B}\x{701D}' . +'\x{701E}\x{701F}\x{7026}\x{7027}\x{702C}\x{7030}\x{7032}\x{703E}\x{704C}' . +'\x{7051}\x{7058}\x{7063}\x{706B}\x{706F}\x{7070}\x{7078}\x{707C}\x{707D}' . +'\x{7089}\x{708A}\x{708E}\x{7092}\x{7099}\x{70AC}\x{70AD}\x{70AE}\x{70AF}' . +'\x{70B3}\x{70B8}\x{70B9}\x{70BA}\x{70C8}\x{70CB}\x{70CF}\x{70D9}\x{70DD}' . +'\x{70DF}\x{70F1}\x{70F9}\x{70FD}\x{7109}\x{7114}\x{7119}\x{711A}\x{711C}' . +'\x{7121}\x{7126}\x{7136}\x{713C}\x{7149}\x{714C}\x{714E}\x{7155}\x{7156}' . +'\x{7159}\x{7162}\x{7164}\x{7165}\x{7166}\x{7167}\x{7169}\x{716C}\x{716E}' . +'\x{717D}\x{7184}\x{7188}\x{718A}\x{718F}\x{7194}\x{7195}\x{7199}\x{719F}' . +'\x{71A8}\x{71AC}\x{71B1}\x{71B9}\x{71BE}\x{71C3}\x{71C8}\x{71C9}\x{71CE}' . +'\x{71D0}\x{71D2}\x{71D4}\x{71D5}\x{71D7}\x{71DF}\x{71E0}\x{71E5}\x{71E6}' . +'\x{71E7}\x{71EC}\x{71ED}\x{71EE}\x{71F5}\x{71F9}\x{71FB}\x{71FC}\x{71FF}' . +'\x{7206}\x{720D}\x{7210}\x{721B}\x{7228}\x{722A}\x{722C}\x{722D}\x{7230}' . +'\x{7232}\x{7235}\x{7236}\x{723A}\x{723B}\x{723C}\x{723D}\x{723E}\x{723F}' . +'\x{7240}\x{7246}\x{7247}\x{7248}\x{724B}\x{724C}\x{7252}\x{7258}\x{7259}' . +'\x{725B}\x{725D}\x{725F}\x{7261}\x{7262}\x{7267}\x{7269}\x{7272}\x{7274}' . +'\x{7279}\x{727D}\x{727E}\x{7280}\x{7281}\x{7282}\x{7287}\x{7292}\x{7296}' . +'\x{72A0}\x{72A2}\x{72A7}\x{72AC}\x{72AF}\x{72B2}\x{72B6}\x{72B9}\x{72C2}' . +'\x{72C3}\x{72C4}\x{72C6}\x{72CE}\x{72D0}\x{72D2}\x{72D7}\x{72D9}\x{72DB}' . +'\x{72E0}\x{72E1}\x{72E2}\x{72E9}\x{72EC}\x{72ED}\x{72F7}\x{72F8}\x{72F9}' . +'\x{72FC}\x{72FD}\x{730A}\x{7316}\x{7317}\x{731B}\x{731C}\x{731D}\x{731F}' . +'\x{7325}\x{7329}\x{732A}\x{732B}\x{732E}\x{732F}\x{7334}\x{7336}\x{7337}' . +'\x{733E}\x{733F}\x{7344}\x{7345}\x{734E}\x{734F}\x{7357}\x{7363}\x{7368}' . +'\x{736A}\x{7370}\x{7372}\x{7375}\x{7378}\x{737A}\x{737B}\x{7384}\x{7387}' . +'\x{7389}\x{738B}\x{7396}\x{73A9}\x{73B2}\x{73B3}\x{73BB}\x{73C0}\x{73C2}' . +'\x{73C8}\x{73CA}\x{73CD}\x{73CE}\x{73DE}\x{73E0}\x{73E5}\x{73EA}\x{73ED}' . +'\x{73EE}\x{73F1}\x{73F8}\x{73FE}\x{7403}\x{7405}\x{7406}\x{7409}\x{7422}' . +'\x{7425}\x{7432}\x{7433}\x{7434}\x{7435}\x{7436}\x{743A}\x{743F}\x{7441}' . +'\x{7455}\x{7459}\x{745A}\x{745B}\x{745C}\x{745E}\x{745F}\x{7460}\x{7463}' . +'\x{7464}\x{7469}\x{746A}\x{746F}\x{7470}\x{7473}\x{7476}\x{747E}\x{7483}' . +'\x{748B}\x{749E}\x{74A2}\x{74A7}\x{74B0}\x{74BD}\x{74CA}\x{74CF}\x{74D4}' . +'\x{74DC}\x{74E0}\x{74E2}\x{74E3}\x{74E6}\x{74E7}\x{74E9}\x{74EE}\x{74F0}' . +'\x{74F1}\x{74F2}\x{74F6}\x{74F7}\x{74F8}\x{7503}\x{7504}\x{7505}\x{750C}' . +'\x{750D}\x{750E}\x{7511}\x{7513}\x{7515}\x{7518}\x{751A}\x{751C}\x{751E}' . +'\x{751F}\x{7523}\x{7525}\x{7526}\x{7528}\x{752B}\x{752C}\x{7530}\x{7531}' . +'\x{7532}\x{7533}\x{7537}\x{7538}\x{753A}\x{753B}\x{753C}\x{7544}\x{7546}' . +'\x{7549}\x{754A}\x{754B}\x{754C}\x{754D}\x{754F}\x{7551}\x{7554}\x{7559}' . +'\x{755A}\x{755B}\x{755C}\x{755D}\x{7560}\x{7562}\x{7564}\x{7565}\x{7566}' . +'\x{7567}\x{7569}\x{756A}\x{756B}\x{756D}\x{7570}\x{7573}\x{7574}\x{7576}' . +'\x{7577}\x{7578}\x{757F}\x{7582}\x{7586}\x{7587}\x{7589}\x{758A}\x{758B}' . +'\x{758E}\x{758F}\x{7591}\x{7594}\x{759A}\x{759D}\x{75A3}\x{75A5}\x{75AB}' . +'\x{75B1}\x{75B2}\x{75B3}\x{75B5}\x{75B8}\x{75B9}\x{75BC}\x{75BD}\x{75BE}' . +'\x{75C2}\x{75C3}\x{75C5}\x{75C7}\x{75CA}\x{75CD}\x{75D2}\x{75D4}\x{75D5}' . +'\x{75D8}\x{75D9}\x{75DB}\x{75DE}\x{75E2}\x{75E3}\x{75E9}\x{75F0}\x{75F2}' . +'\x{75F3}\x{75F4}\x{75FA}\x{75FC}\x{75FE}\x{75FF}\x{7601}\x{7609}\x{760B}' . +'\x{760D}\x{761F}\x{7620}\x{7621}\x{7622}\x{7624}\x{7627}\x{7630}\x{7634}' . +'\x{763B}\x{7642}\x{7646}\x{7647}\x{7648}\x{764C}\x{7652}\x{7656}\x{7658}' . +'\x{765C}\x{7661}\x{7662}\x{7667}\x{7668}\x{7669}\x{766A}\x{766C}\x{7670}' . +'\x{7672}\x{7676}\x{7678}\x{767A}\x{767B}\x{767C}\x{767D}\x{767E}\x{7680}' . +'\x{7683}\x{7684}\x{7686}\x{7687}\x{7688}\x{768B}\x{768E}\x{7690}\x{7693}' . +'\x{7696}\x{7699}\x{769A}\x{76AE}\x{76B0}\x{76B4}\x{76B7}\x{76B8}\x{76B9}' . +'\x{76BA}\x{76BF}\x{76C2}\x{76C3}\x{76C6}\x{76C8}\x{76CA}\x{76CD}\x{76D2}' . +'\x{76D6}\x{76D7}\x{76DB}\x{76DC}\x{76DE}\x{76DF}\x{76E1}\x{76E3}\x{76E4}' . +'\x{76E5}\x{76E7}\x{76EA}\x{76EE}\x{76F2}\x{76F4}\x{76F8}\x{76FB}\x{76FE}' . +'\x{7701}\x{7704}\x{7707}\x{7708}\x{7709}\x{770B}\x{770C}\x{771B}\x{771E}' . +'\x{771F}\x{7720}\x{7724}\x{7725}\x{7726}\x{7729}\x{7737}\x{7738}\x{773A}' . +'\x{773C}\x{7740}\x{7747}\x{775A}\x{775B}\x{7761}\x{7763}\x{7765}\x{7766}' . +'\x{7768}\x{776B}\x{7779}\x{777E}\x{777F}\x{778B}\x{778E}\x{7791}\x{779E}' . +'\x{77A0}\x{77A5}\x{77AC}\x{77AD}\x{77B0}\x{77B3}\x{77B6}\x{77B9}\x{77BB}' . +'\x{77BC}\x{77BD}\x{77BF}\x{77C7}\x{77CD}\x{77D7}\x{77DA}\x{77DB}\x{77DC}' . +'\x{77E2}\x{77E3}\x{77E5}\x{77E7}\x{77E9}\x{77ED}\x{77EE}\x{77EF}\x{77F3}' . +'\x{77FC}\x{7802}\x{780C}\x{7812}\x{7814}\x{7815}\x{7820}\x{7825}\x{7826}' . +'\x{7827}\x{7832}\x{7834}\x{783A}\x{783F}\x{7845}\x{785D}\x{786B}\x{786C}' . +'\x{786F}\x{7872}\x{7874}\x{787C}\x{7881}\x{7886}\x{7887}\x{788C}\x{788D}' . +'\x{788E}\x{7891}\x{7893}\x{7895}\x{7897}\x{789A}\x{78A3}\x{78A7}\x{78A9}' . +'\x{78AA}\x{78AF}\x{78B5}\x{78BA}\x{78BC}\x{78BE}\x{78C1}\x{78C5}\x{78C6}' . +'\x{78CA}\x{78CB}\x{78D0}\x{78D1}\x{78D4}\x{78DA}\x{78E7}\x{78E8}\x{78EC}' . +'\x{78EF}\x{78F4}\x{78FD}\x{7901}\x{7907}\x{790E}\x{7911}\x{7912}\x{7919}' . +'\x{7926}\x{792A}\x{792B}\x{792C}\x{793A}\x{793C}\x{793E}\x{7940}\x{7941}' . +'\x{7947}\x{7948}\x{7949}\x{7950}\x{7953}\x{7955}\x{7956}\x{7957}\x{795A}' . +'\x{795D}\x{795E}\x{795F}\x{7960}\x{7962}\x{7965}\x{7968}\x{796D}\x{7977}' . +'\x{797A}\x{797F}\x{7980}\x{7981}\x{7984}\x{7985}\x{798A}\x{798D}\x{798E}' . +'\x{798F}\x{799D}\x{79A6}\x{79A7}\x{79AA}\x{79AE}\x{79B0}\x{79B3}\x{79B9}' . +'\x{79BA}\x{79BD}\x{79BE}\x{79BF}\x{79C0}\x{79C1}\x{79C9}\x{79CB}\x{79D1}' . +'\x{79D2}\x{79D5}\x{79D8}\x{79DF}\x{79E1}\x{79E3}\x{79E4}\x{79E6}\x{79E7}' . +'\x{79E9}\x{79EC}\x{79F0}\x{79FB}\x{7A00}\x{7A08}\x{7A0B}\x{7A0D}\x{7A0E}' . +'\x{7A14}\x{7A17}\x{7A18}\x{7A19}\x{7A1A}\x{7A1C}\x{7A1F}\x{7A20}\x{7A2E}' . +'\x{7A31}\x{7A32}\x{7A37}\x{7A3B}\x{7A3C}\x{7A3D}\x{7A3E}\x{7A3F}\x{7A40}' . +'\x{7A42}\x{7A43}\x{7A46}\x{7A49}\x{7A4D}\x{7A4E}\x{7A4F}\x{7A50}\x{7A57}' . +'\x{7A61}\x{7A62}\x{7A63}\x{7A69}\x{7A6B}\x{7A70}\x{7A74}\x{7A76}\x{7A79}' . +'\x{7A7A}\x{7A7D}\x{7A7F}\x{7A81}\x{7A83}\x{7A84}\x{7A88}\x{7A92}\x{7A93}' . +'\x{7A95}\x{7A96}\x{7A97}\x{7A98}\x{7A9F}\x{7AA9}\x{7AAA}\x{7AAE}\x{7AAF}' . +'\x{7AB0}\x{7AB6}\x{7ABA}\x{7ABF}\x{7AC3}\x{7AC4}\x{7AC5}\x{7AC7}\x{7AC8}' . +'\x{7ACA}\x{7ACB}\x{7ACD}\x{7ACF}\x{7AD2}\x{7AD3}\x{7AD5}\x{7AD9}\x{7ADA}' . +'\x{7ADC}\x{7ADD}\x{7ADF}\x{7AE0}\x{7AE1}\x{7AE2}\x{7AE3}\x{7AE5}\x{7AE6}' . +'\x{7AEA}\x{7AED}\x{7AEF}\x{7AF0}\x{7AF6}\x{7AF8}\x{7AF9}\x{7AFA}\x{7AFF}' . +'\x{7B02}\x{7B04}\x{7B06}\x{7B08}\x{7B0A}\x{7B0B}\x{7B0F}\x{7B11}\x{7B18}' . +'\x{7B19}\x{7B1B}\x{7B1E}\x{7B20}\x{7B25}\x{7B26}\x{7B28}\x{7B2C}\x{7B33}' . +'\x{7B35}\x{7B36}\x{7B39}\x{7B45}\x{7B46}\x{7B48}\x{7B49}\x{7B4B}\x{7B4C}' . +'\x{7B4D}\x{7B4F}\x{7B50}\x{7B51}\x{7B52}\x{7B54}\x{7B56}\x{7B5D}\x{7B65}' . +'\x{7B67}\x{7B6C}\x{7B6E}\x{7B70}\x{7B71}\x{7B74}\x{7B75}\x{7B7A}\x{7B86}' . +'\x{7B87}\x{7B8B}\x{7B8D}\x{7B8F}\x{7B92}\x{7B94}\x{7B95}\x{7B97}\x{7B98}' . +'\x{7B99}\x{7B9A}\x{7B9C}\x{7B9D}\x{7B9F}\x{7BA1}\x{7BAA}\x{7BAD}\x{7BB1}' . +'\x{7BB4}\x{7BB8}\x{7BC0}\x{7BC1}\x{7BC4}\x{7BC6}\x{7BC7}\x{7BC9}\x{7BCB}' . +'\x{7BCC}\x{7BCF}\x{7BDD}\x{7BE0}\x{7BE4}\x{7BE5}\x{7BE6}\x{7BE9}\x{7BED}' . +'\x{7BF3}\x{7BF6}\x{7BF7}\x{7C00}\x{7C07}\x{7C0D}\x{7C11}\x{7C12}\x{7C13}' . +'\x{7C14}\x{7C17}\x{7C1F}\x{7C21}\x{7C23}\x{7C27}\x{7C2A}\x{7C2B}\x{7C37}' . +'\x{7C38}\x{7C3D}\x{7C3E}\x{7C3F}\x{7C40}\x{7C43}\x{7C4C}\x{7C4D}\x{7C4F}' . +'\x{7C50}\x{7C54}\x{7C56}\x{7C58}\x{7C5F}\x{7C60}\x{7C64}\x{7C65}\x{7C6C}' . +'\x{7C73}\x{7C75}\x{7C7E}\x{7C81}\x{7C82}\x{7C83}\x{7C89}\x{7C8B}\x{7C8D}' . +'\x{7C90}\x{7C92}\x{7C95}\x{7C97}\x{7C98}\x{7C9B}\x{7C9F}\x{7CA1}\x{7CA2}' . +'\x{7CA4}\x{7CA5}\x{7CA7}\x{7CA8}\x{7CAB}\x{7CAD}\x{7CAE}\x{7CB1}\x{7CB2}' . +'\x{7CB3}\x{7CB9}\x{7CBD}\x{7CBE}\x{7CC0}\x{7CC2}\x{7CC5}\x{7CCA}\x{7CCE}' . +'\x{7CD2}\x{7CD6}\x{7CD8}\x{7CDC}\x{7CDE}\x{7CDF}\x{7CE0}\x{7CE2}\x{7CE7}' . +'\x{7CEF}\x{7CF2}\x{7CF4}\x{7CF6}\x{7CF8}\x{7CFA}\x{7CFB}\x{7CFE}\x{7D00}' . +'\x{7D02}\x{7D04}\x{7D05}\x{7D06}\x{7D0A}\x{7D0B}\x{7D0D}\x{7D10}\x{7D14}' . +'\x{7D15}\x{7D17}\x{7D18}\x{7D19}\x{7D1A}\x{7D1B}\x{7D1C}\x{7D20}\x{7D21}' . +'\x{7D22}\x{7D2B}\x{7D2C}\x{7D2E}\x{7D2F}\x{7D30}\x{7D32}\x{7D33}\x{7D35}' . +'\x{7D39}\x{7D3A}\x{7D3F}\x{7D42}\x{7D43}\x{7D44}\x{7D45}\x{7D46}\x{7D4B}' . +'\x{7D4C}\x{7D4E}\x{7D4F}\x{7D50}\x{7D56}\x{7D5B}\x{7D5E}\x{7D61}\x{7D62}' . +'\x{7D63}\x{7D66}\x{7D68}\x{7D6E}\x{7D71}\x{7D72}\x{7D73}\x{7D75}\x{7D76}' . +'\x{7D79}\x{7D7D}\x{7D89}\x{7D8F}\x{7D93}\x{7D99}\x{7D9A}\x{7D9B}\x{7D9C}' . +'\x{7D9F}\x{7DA2}\x{7DA3}\x{7DAB}\x{7DAC}\x{7DAD}\x{7DAE}\x{7DAF}\x{7DB0}' . +'\x{7DB1}\x{7DB2}\x{7DB4}\x{7DB5}\x{7DB8}\x{7DBA}\x{7DBB}\x{7DBD}\x{7DBE}' . +'\x{7DBF}\x{7DC7}\x{7DCA}\x{7DCB}\x{7DCF}\x{7DD1}\x{7DD2}\x{7DD5}\x{7DD8}' . +'\x{7DDA}\x{7DDC}\x{7DDD}\x{7DDE}\x{7DE0}\x{7DE1}\x{7DE4}\x{7DE8}\x{7DE9}' . +'\x{7DEC}\x{7DEF}\x{7DF2}\x{7DF4}\x{7DFB}\x{7E01}\x{7E04}\x{7E05}\x{7E09}' . +'\x{7E0A}\x{7E0B}\x{7E12}\x{7E1B}\x{7E1E}\x{7E1F}\x{7E21}\x{7E22}\x{7E23}' . +'\x{7E26}\x{7E2B}\x{7E2E}\x{7E31}\x{7E32}\x{7E35}\x{7E37}\x{7E39}\x{7E3A}' . +'\x{7E3B}\x{7E3D}\x{7E3E}\x{7E41}\x{7E43}\x{7E46}\x{7E4A}\x{7E4B}\x{7E4D}' . +'\x{7E54}\x{7E55}\x{7E56}\x{7E59}\x{7E5A}\x{7E5D}\x{7E5E}\x{7E66}\x{7E67}' . +'\x{7E69}\x{7E6A}\x{7E6D}\x{7E70}\x{7E79}\x{7E7B}\x{7E7C}\x{7E7D}\x{7E7F}' . +'\x{7E82}\x{7E83}\x{7E88}\x{7E89}\x{7E8C}\x{7E8E}\x{7E8F}\x{7E90}\x{7E92}' . +'\x{7E93}\x{7E94}\x{7E96}\x{7E9B}\x{7E9C}\x{7F36}\x{7F38}\x{7F3A}\x{7F45}' . +'\x{7F4C}\x{7F4D}\x{7F4E}\x{7F50}\x{7F51}\x{7F54}\x{7F55}\x{7F58}\x{7F5F}' . +'\x{7F60}\x{7F67}\x{7F68}\x{7F69}\x{7F6A}\x{7F6B}\x{7F6E}\x{7F70}\x{7F72}' . +'\x{7F75}\x{7F77}\x{7F78}\x{7F79}\x{7F82}\x{7F83}\x{7F85}\x{7F86}\x{7F87}' . +'\x{7F88}\x{7F8A}\x{7F8C}\x{7F8E}\x{7F94}\x{7F9A}\x{7F9D}\x{7F9E}\x{7FA3}' . +'\x{7FA4}\x{7FA8}\x{7FA9}\x{7FAE}\x{7FAF}\x{7FB2}\x{7FB6}\x{7FB8}\x{7FB9}' . +'\x{7FBD}\x{7FC1}\x{7FC5}\x{7FC6}\x{7FCA}\x{7FCC}\x{7FD2}\x{7FD4}\x{7FD5}' . +'\x{7FE0}\x{7FE1}\x{7FE6}\x{7FE9}\x{7FEB}\x{7FF0}\x{7FF3}\x{7FF9}\x{7FFB}' . +'\x{7FFC}\x{8000}\x{8001}\x{8003}\x{8004}\x{8005}\x{8006}\x{800B}\x{800C}' . +'\x{8010}\x{8012}\x{8015}\x{8017}\x{8018}\x{8019}\x{801C}\x{8021}\x{8028}' . +'\x{8033}\x{8036}\x{803B}\x{803D}\x{803F}\x{8046}\x{804A}\x{8052}\x{8056}' . +'\x{8058}\x{805A}\x{805E}\x{805F}\x{8061}\x{8062}\x{8068}\x{806F}\x{8070}' . +'\x{8072}\x{8073}\x{8074}\x{8076}\x{8077}\x{8079}\x{807D}\x{807E}\x{807F}' . +'\x{8084}\x{8085}\x{8086}\x{8087}\x{8089}\x{808B}\x{808C}\x{8093}\x{8096}' . +'\x{8098}\x{809A}\x{809B}\x{809D}\x{80A1}\x{80A2}\x{80A5}\x{80A9}\x{80AA}' . +'\x{80AC}\x{80AD}\x{80AF}\x{80B1}\x{80B2}\x{80B4}\x{80BA}\x{80C3}\x{80C4}' . +'\x{80C6}\x{80CC}\x{80CE}\x{80D6}\x{80D9}\x{80DA}\x{80DB}\x{80DD}\x{80DE}' . +'\x{80E1}\x{80E4}\x{80E5}\x{80EF}\x{80F1}\x{80F4}\x{80F8}\x{80FC}\x{80FD}' . +'\x{8102}\x{8105}\x{8106}\x{8107}\x{8108}\x{8109}\x{810A}\x{811A}\x{811B}' . +'\x{8123}\x{8129}\x{812F}\x{8131}\x{8133}\x{8139}\x{813E}\x{8146}\x{814B}' . +'\x{814E}\x{8150}\x{8151}\x{8153}\x{8154}\x{8155}\x{815F}\x{8165}\x{8166}' . +'\x{816B}\x{816E}\x{8170}\x{8171}\x{8174}\x{8178}\x{8179}\x{817A}\x{817F}' . +'\x{8180}\x{8182}\x{8183}\x{8188}\x{818A}\x{818F}\x{8193}\x{8195}\x{819A}' . +'\x{819C}\x{819D}\x{81A0}\x{81A3}\x{81A4}\x{81A8}\x{81A9}\x{81B0}\x{81B3}' . +'\x{81B5}\x{81B8}\x{81BA}\x{81BD}\x{81BE}\x{81BF}\x{81C0}\x{81C2}\x{81C6}' . +'\x{81C8}\x{81C9}\x{81CD}\x{81D1}\x{81D3}\x{81D8}\x{81D9}\x{81DA}\x{81DF}' . +'\x{81E0}\x{81E3}\x{81E5}\x{81E7}\x{81E8}\x{81EA}\x{81ED}\x{81F3}\x{81F4}' . +'\x{81FA}\x{81FB}\x{81FC}\x{81FE}\x{8201}\x{8202}\x{8205}\x{8207}\x{8208}' . +'\x{8209}\x{820A}\x{820C}\x{820D}\x{820E}\x{8210}\x{8212}\x{8216}\x{8217}' . +'\x{8218}\x{821B}\x{821C}\x{821E}\x{821F}\x{8229}\x{822A}\x{822B}\x{822C}' . +'\x{822E}\x{8233}\x{8235}\x{8236}\x{8237}\x{8238}\x{8239}\x{8240}\x{8247}' . +'\x{8258}\x{8259}\x{825A}\x{825D}\x{825F}\x{8262}\x{8264}\x{8266}\x{8268}' . +'\x{826A}\x{826B}\x{826E}\x{826F}\x{8271}\x{8272}\x{8276}\x{8277}\x{8278}' . +'\x{827E}\x{828B}\x{828D}\x{8292}\x{8299}\x{829D}\x{829F}\x{82A5}\x{82A6}' . +'\x{82AB}\x{82AC}\x{82AD}\x{82AF}\x{82B1}\x{82B3}\x{82B8}\x{82B9}\x{82BB}' . +'\x{82BD}\x{82C5}\x{82D1}\x{82D2}\x{82D3}\x{82D4}\x{82D7}\x{82D9}\x{82DB}' . +'\x{82DC}\x{82DE}\x{82DF}\x{82E1}\x{82E3}\x{82E5}\x{82E6}\x{82E7}\x{82EB}' . +'\x{82F1}\x{82F3}\x{82F4}\x{82F9}\x{82FA}\x{82FB}\x{8302}\x{8303}\x{8304}' . +'\x{8305}\x{8306}\x{8309}\x{830E}\x{8316}\x{8317}\x{8318}\x{831C}\x{8323}' . +'\x{8328}\x{832B}\x{832F}\x{8331}\x{8332}\x{8334}\x{8335}\x{8336}\x{8338}' . +'\x{8339}\x{8340}\x{8345}\x{8349}\x{834A}\x{834F}\x{8350}\x{8352}\x{8358}' . +'\x{8373}\x{8375}\x{8377}\x{837B}\x{837C}\x{8385}\x{8387}\x{8389}\x{838A}' . +'\x{838E}\x{8393}\x{8396}\x{839A}\x{839E}\x{839F}\x{83A0}\x{83A2}\x{83A8}' . +'\x{83AA}\x{83AB}\x{83B1}\x{83B5}\x{83BD}\x{83C1}\x{83C5}\x{83CA}\x{83CC}' . +'\x{83CE}\x{83D3}\x{83D6}\x{83D8}\x{83DC}\x{83DF}\x{83E0}\x{83E9}\x{83EB}' . +'\x{83EF}\x{83F0}\x{83F1}\x{83F2}\x{83F4}\x{83F7}\x{83FB}\x{83FD}\x{8403}' . +'\x{8404}\x{8407}\x{840B}\x{840C}\x{840D}\x{840E}\x{8413}\x{8420}\x{8422}' . +'\x{8429}\x{842A}\x{842C}\x{8431}\x{8435}\x{8438}\x{843C}\x{843D}\x{8446}' . +'\x{8449}\x{844E}\x{8457}\x{845B}\x{8461}\x{8462}\x{8463}\x{8466}\x{8469}' . +'\x{846B}\x{846C}\x{846D}\x{846E}\x{846F}\x{8471}\x{8475}\x{8477}\x{8479}' . +'\x{847A}\x{8482}\x{8484}\x{848B}\x{8490}\x{8494}\x{8499}\x{849C}\x{849F}' . +'\x{84A1}\x{84AD}\x{84B2}\x{84B8}\x{84B9}\x{84BB}\x{84BC}\x{84BF}\x{84C1}' . +'\x{84C4}\x{84C6}\x{84C9}\x{84CA}\x{84CB}\x{84CD}\x{84D0}\x{84D1}\x{84D6}' . +'\x{84D9}\x{84DA}\x{84EC}\x{84EE}\x{84F4}\x{84FC}\x{84FF}\x{8500}\x{8506}' . +'\x{8511}\x{8513}\x{8514}\x{8515}\x{8517}\x{8518}\x{851A}\x{851F}\x{8521}' . +'\x{8526}\x{852C}\x{852D}\x{8535}\x{853D}\x{8540}\x{8541}\x{8543}\x{8548}' . +'\x{8549}\x{854A}\x{854B}\x{854E}\x{8555}\x{8557}\x{8558}\x{855A}\x{8563}' . +'\x{8568}\x{8569}\x{856A}\x{856D}\x{8577}\x{857E}\x{8580}\x{8584}\x{8587}' . +'\x{8588}\x{858A}\x{8590}\x{8591}\x{8594}\x{8597}\x{8599}\x{859B}\x{859C}' . +'\x{85A4}\x{85A6}\x{85A8}\x{85A9}\x{85AA}\x{85AB}\x{85AC}\x{85AE}\x{85AF}' . +'\x{85B9}\x{85BA}\x{85C1}\x{85C9}\x{85CD}\x{85CF}\x{85D0}\x{85D5}\x{85DC}' . +'\x{85DD}\x{85E4}\x{85E5}\x{85E9}\x{85EA}\x{85F7}\x{85F9}\x{85FA}\x{85FB}' . +'\x{85FE}\x{8602}\x{8606}\x{8607}\x{860A}\x{860B}\x{8613}\x{8616}\x{8617}' . +'\x{861A}\x{8622}\x{862D}\x{862F}\x{8630}\x{863F}\x{864D}\x{864E}\x{8650}' . +'\x{8654}\x{8655}\x{865A}\x{865C}\x{865E}\x{865F}\x{8667}\x{866B}\x{8671}' . +'\x{8679}\x{867B}\x{868A}\x{868B}\x{868C}\x{8693}\x{8695}\x{86A3}\x{86A4}' . +'\x{86A9}\x{86AA}\x{86AB}\x{86AF}\x{86B0}\x{86B6}\x{86C4}\x{86C6}\x{86C7}' . +'\x{86C9}\x{86CB}\x{86CD}\x{86CE}\x{86D4}\x{86D9}\x{86DB}\x{86DE}\x{86DF}' . +'\x{86E4}\x{86E9}\x{86EC}\x{86ED}\x{86EE}\x{86EF}\x{86F8}\x{86F9}\x{86FB}' . +'\x{86FE}\x{8700}\x{8702}\x{8703}\x{8706}\x{8708}\x{8709}\x{870A}\x{870D}' . +'\x{8711}\x{8712}\x{8718}\x{871A}\x{871C}\x{8725}\x{8729}\x{8734}\x{8737}' . +'\x{873B}\x{873F}\x{8749}\x{874B}\x{874C}\x{874E}\x{8753}\x{8755}\x{8757}' . +'\x{8759}\x{875F}\x{8760}\x{8763}\x{8766}\x{8768}\x{876A}\x{876E}\x{8774}' . +'\x{8776}\x{8778}\x{877F}\x{8782}\x{878D}\x{879F}\x{87A2}\x{87AB}\x{87AF}' . +'\x{87B3}\x{87BA}\x{87BB}\x{87BD}\x{87C0}\x{87C4}\x{87C6}\x{87C7}\x{87CB}' . +'\x{87D0}\x{87D2}\x{87E0}\x{87EF}\x{87F2}\x{87F6}\x{87F7}\x{87F9}\x{87FB}' . +'\x{87FE}\x{8805}\x{880D}\x{880E}\x{880F}\x{8811}\x{8815}\x{8816}\x{8821}' . +'\x{8822}\x{8823}\x{8827}\x{8831}\x{8836}\x{8839}\x{883B}\x{8840}\x{8842}' . +'\x{8844}\x{8846}\x{884C}\x{884D}\x{8852}\x{8853}\x{8857}\x{8859}\x{885B}' . +'\x{885D}\x{885E}\x{8861}\x{8862}\x{8863}\x{8868}\x{886B}\x{8870}\x{8872}' . +'\x{8875}\x{8877}\x{887D}\x{887E}\x{887F}\x{8881}\x{8882}\x{8888}\x{888B}' . +'\x{888D}\x{8892}\x{8896}\x{8897}\x{8899}\x{889E}\x{88A2}\x{88A4}\x{88AB}' . +'\x{88AE}\x{88B0}\x{88B1}\x{88B4}\x{88B5}\x{88B7}\x{88BF}\x{88C1}\x{88C2}' . +'\x{88C3}\x{88C4}\x{88C5}\x{88CF}\x{88D4}\x{88D5}\x{88D8}\x{88D9}\x{88DC}' . +'\x{88DD}\x{88DF}\x{88E1}\x{88E8}\x{88F2}\x{88F3}\x{88F4}\x{88F8}\x{88F9}' . +'\x{88FC}\x{88FD}\x{88FE}\x{8902}\x{8904}\x{8907}\x{890A}\x{890C}\x{8910}' . +'\x{8912}\x{8913}\x{891D}\x{891E}\x{8925}\x{892A}\x{892B}\x{8936}\x{8938}' . +'\x{893B}\x{8941}\x{8943}\x{8944}\x{894C}\x{894D}\x{8956}\x{895E}\x{895F}' . +'\x{8960}\x{8964}\x{8966}\x{896A}\x{896D}\x{896F}\x{8972}\x{8974}\x{8977}' . +'\x{897E}\x{897F}\x{8981}\x{8983}\x{8986}\x{8987}\x{8988}\x{898A}\x{898B}' . +'\x{898F}\x{8993}\x{8996}\x{8997}\x{8998}\x{899A}\x{89A1}\x{89A6}\x{89A7}' . +'\x{89A9}\x{89AA}\x{89AC}\x{89AF}\x{89B2}\x{89B3}\x{89BA}\x{89BD}\x{89BF}' . +'\x{89C0}\x{89D2}\x{89DA}\x{89DC}\x{89DD}\x{89E3}\x{89E6}\x{89E7}\x{89F4}' . +'\x{89F8}\x{8A00}\x{8A02}\x{8A03}\x{8A08}\x{8A0A}\x{8A0C}\x{8A0E}\x{8A10}' . +'\x{8A13}\x{8A16}\x{8A17}\x{8A18}\x{8A1B}\x{8A1D}\x{8A1F}\x{8A23}\x{8A25}' . +'\x{8A2A}\x{8A2D}\x{8A31}\x{8A33}\x{8A34}\x{8A36}\x{8A3A}\x{8A3B}\x{8A3C}' . +'\x{8A41}\x{8A46}\x{8A48}\x{8A50}\x{8A51}\x{8A52}\x{8A54}\x{8A55}\x{8A5B}' . +'\x{8A5E}\x{8A60}\x{8A62}\x{8A63}\x{8A66}\x{8A69}\x{8A6B}\x{8A6C}\x{8A6D}' . +'\x{8A6E}\x{8A70}\x{8A71}\x{8A72}\x{8A73}\x{8A7C}\x{8A82}\x{8A84}\x{8A85}' . +'\x{8A87}\x{8A89}\x{8A8C}\x{8A8D}\x{8A91}\x{8A93}\x{8A95}\x{8A98}\x{8A9A}' . +'\x{8A9E}\x{8AA0}\x{8AA1}\x{8AA3}\x{8AA4}\x{8AA5}\x{8AA6}\x{8AA8}\x{8AAC}' . +'\x{8AAD}\x{8AB0}\x{8AB2}\x{8AB9}\x{8ABC}\x{8ABF}\x{8AC2}\x{8AC4}\x{8AC7}' . +'\x{8ACB}\x{8ACC}\x{8ACD}\x{8ACF}\x{8AD2}\x{8AD6}\x{8ADA}\x{8ADB}\x{8ADC}' . +'\x{8ADE}\x{8AE0}\x{8AE1}\x{8AE2}\x{8AE4}\x{8AE6}\x{8AE7}\x{8AEB}\x{8AED}' . +'\x{8AEE}\x{8AF1}\x{8AF3}\x{8AF7}\x{8AF8}\x{8AFA}\x{8AFE}\x{8B00}\x{8B01}' . +'\x{8B02}\x{8B04}\x{8B07}\x{8B0C}\x{8B0E}\x{8B10}\x{8B14}\x{8B16}\x{8B17}' . +'\x{8B19}\x{8B1A}\x{8B1B}\x{8B1D}\x{8B20}\x{8B21}\x{8B26}\x{8B28}\x{8B2B}' . +'\x{8B2C}\x{8B33}\x{8B39}\x{8B3E}\x{8B41}\x{8B49}\x{8B4C}\x{8B4E}\x{8B4F}' . +'\x{8B56}\x{8B58}\x{8B5A}\x{8B5B}\x{8B5C}\x{8B5F}\x{8B66}\x{8B6B}\x{8B6C}' . +'\x{8B6F}\x{8B70}\x{8B71}\x{8B72}\x{8B74}\x{8B77}\x{8B7D}\x{8B80}\x{8B83}' . +'\x{8B8A}\x{8B8C}\x{8B8E}\x{8B90}\x{8B92}\x{8B93}\x{8B96}\x{8B99}\x{8B9A}' . +'\x{8C37}\x{8C3A}\x{8C3F}\x{8C41}\x{8C46}\x{8C48}\x{8C4A}\x{8C4C}\x{8C4E}' . +'\x{8C50}\x{8C55}\x{8C5A}\x{8C61}\x{8C62}\x{8C6A}\x{8C6B}\x{8C6C}\x{8C78}' . +'\x{8C79}\x{8C7A}\x{8C7C}\x{8C82}\x{8C85}\x{8C89}\x{8C8A}\x{8C8C}\x{8C8D}' . +'\x{8C8E}\x{8C94}\x{8C98}\x{8C9D}\x{8C9E}\x{8CA0}\x{8CA1}\x{8CA2}\x{8CA7}' . +'\x{8CA8}\x{8CA9}\x{8CAA}\x{8CAB}\x{8CAC}\x{8CAD}\x{8CAE}\x{8CAF}\x{8CB0}' . +'\x{8CB2}\x{8CB3}\x{8CB4}\x{8CB6}\x{8CB7}\x{8CB8}\x{8CBB}\x{8CBC}\x{8CBD}' . +'\x{8CBF}\x{8CC0}\x{8CC1}\x{8CC2}\x{8CC3}\x{8CC4}\x{8CC7}\x{8CC8}\x{8CCA}' . +'\x{8CCD}\x{8CCE}\x{8CD1}\x{8CD3}\x{8CDA}\x{8CDB}\x{8CDC}\x{8CDE}\x{8CE0}' . +'\x{8CE2}\x{8CE3}\x{8CE4}\x{8CE6}\x{8CEA}\x{8CED}\x{8CFA}\x{8CFB}\x{8CFC}' . +'\x{8CFD}\x{8D04}\x{8D05}\x{8D07}\x{8D08}\x{8D0A}\x{8D0B}\x{8D0D}\x{8D0F}' . +'\x{8D10}\x{8D13}\x{8D14}\x{8D16}\x{8D64}\x{8D66}\x{8D67}\x{8D6B}\x{8D6D}' . +'\x{8D70}\x{8D71}\x{8D73}\x{8D74}\x{8D77}\x{8D81}\x{8D85}\x{8D8A}\x{8D99}' . +'\x{8DA3}\x{8DA8}\x{8DB3}\x{8DBA}\x{8DBE}\x{8DC2}\x{8DCB}\x{8DCC}\x{8DCF}' . +'\x{8DD6}\x{8DDA}\x{8DDB}\x{8DDD}\x{8DDF}\x{8DE1}\x{8DE3}\x{8DE8}\x{8DEA}' . +'\x{8DEB}\x{8DEF}\x{8DF3}\x{8DF5}\x{8DFC}\x{8DFF}\x{8E08}\x{8E09}\x{8E0A}' . +'\x{8E0F}\x{8E10}\x{8E1D}\x{8E1E}\x{8E1F}\x{8E2A}\x{8E30}\x{8E34}\x{8E35}' . +'\x{8E42}\x{8E44}\x{8E47}\x{8E48}\x{8E49}\x{8E4A}\x{8E4C}\x{8E50}\x{8E55}' . +'\x{8E59}\x{8E5F}\x{8E60}\x{8E63}\x{8E64}\x{8E72}\x{8E74}\x{8E76}\x{8E7C}' . +'\x{8E81}\x{8E84}\x{8E85}\x{8E87}\x{8E8A}\x{8E8B}\x{8E8D}\x{8E91}\x{8E93}' . +'\x{8E94}\x{8E99}\x{8EA1}\x{8EAA}\x{8EAB}\x{8EAC}\x{8EAF}\x{8EB0}\x{8EB1}' . +'\x{8EBE}\x{8EC5}\x{8EC6}\x{8EC8}\x{8ECA}\x{8ECB}\x{8ECC}\x{8ECD}\x{8ED2}' . +'\x{8EDB}\x{8EDF}\x{8EE2}\x{8EE3}\x{8EEB}\x{8EF8}\x{8EFB}\x{8EFC}\x{8EFD}' . +'\x{8EFE}\x{8F03}\x{8F05}\x{8F09}\x{8F0A}\x{8F0C}\x{8F12}\x{8F13}\x{8F14}' . +'\x{8F15}\x{8F19}\x{8F1B}\x{8F1C}\x{8F1D}\x{8F1F}\x{8F26}\x{8F29}\x{8F2A}' . +'\x{8F2F}\x{8F33}\x{8F38}\x{8F39}\x{8F3B}\x{8F3E}\x{8F3F}\x{8F42}\x{8F44}' . +'\x{8F45}\x{8F46}\x{8F49}\x{8F4C}\x{8F4D}\x{8F4E}\x{8F57}\x{8F5C}\x{8F5F}' . +'\x{8F61}\x{8F62}\x{8F63}\x{8F64}\x{8F9B}\x{8F9C}\x{8F9E}\x{8F9F}\x{8FA3}' . +'\x{8FA7}\x{8FA8}\x{8FAD}\x{8FAE}\x{8FAF}\x{8FB0}\x{8FB1}\x{8FB2}\x{8FB7}' . +'\x{8FBA}\x{8FBB}\x{8FBC}\x{8FBF}\x{8FC2}\x{8FC4}\x{8FC5}\x{8FCE}\x{8FD1}' . +'\x{8FD4}\x{8FDA}\x{8FE2}\x{8FE5}\x{8FE6}\x{8FE9}\x{8FEA}\x{8FEB}\x{8FED}' . +'\x{8FEF}\x{8FF0}\x{8FF4}\x{8FF7}\x{8FF8}\x{8FF9}\x{8FFA}\x{8FFD}\x{9000}' . +'\x{9001}\x{9003}\x{9005}\x{9006}\x{900B}\x{900D}\x{900E}\x{900F}\x{9010}' . +'\x{9011}\x{9013}\x{9014}\x{9015}\x{9016}\x{9017}\x{9019}\x{901A}\x{901D}' . +'\x{901E}\x{901F}\x{9020}\x{9021}\x{9022}\x{9023}\x{9027}\x{902E}\x{9031}' . +'\x{9032}\x{9035}\x{9036}\x{9038}\x{9039}\x{903C}\x{903E}\x{9041}\x{9042}' . +'\x{9045}\x{9047}\x{9049}\x{904A}\x{904B}\x{904D}\x{904E}\x{904F}\x{9050}' . +'\x{9051}\x{9052}\x{9053}\x{9054}\x{9055}\x{9056}\x{9058}\x{9059}\x{905C}' . +'\x{905E}\x{9060}\x{9061}\x{9063}\x{9065}\x{9068}\x{9069}\x{906D}\x{906E}' . +'\x{906F}\x{9072}\x{9075}\x{9076}\x{9077}\x{9078}\x{907A}\x{907C}\x{907D}' . +'\x{907F}\x{9080}\x{9081}\x{9082}\x{9083}\x{9084}\x{9087}\x{9089}\x{908A}' . +'\x{908F}\x{9091}\x{90A3}\x{90A6}\x{90A8}\x{90AA}\x{90AF}\x{90B1}\x{90B5}' . +'\x{90B8}\x{90C1}\x{90CA}\x{90CE}\x{90DB}\x{90E1}\x{90E2}\x{90E4}\x{90E8}' . +'\x{90ED}\x{90F5}\x{90F7}\x{90FD}\x{9102}\x{9112}\x{9119}\x{912D}\x{9130}' . +'\x{9132}\x{9149}\x{914A}\x{914B}\x{914C}\x{914D}\x{914E}\x{9152}\x{9154}' . +'\x{9156}\x{9158}\x{9162}\x{9163}\x{9165}\x{9169}\x{916A}\x{916C}\x{9172}' . +'\x{9173}\x{9175}\x{9177}\x{9178}\x{9182}\x{9187}\x{9189}\x{918B}\x{918D}' . +'\x{9190}\x{9192}\x{9197}\x{919C}\x{91A2}\x{91A4}\x{91AA}\x{91AB}\x{91AF}' . +'\x{91B4}\x{91B5}\x{91B8}\x{91BA}\x{91C0}\x{91C1}\x{91C6}\x{91C7}\x{91C8}' . +'\x{91C9}\x{91CB}\x{91CC}\x{91CD}\x{91CE}\x{91CF}\x{91D0}\x{91D1}\x{91D6}' . +'\x{91D8}\x{91DB}\x{91DC}\x{91DD}\x{91DF}\x{91E1}\x{91E3}\x{91E6}\x{91E7}' . +'\x{91F5}\x{91F6}\x{91FC}\x{91FF}\x{920D}\x{920E}\x{9211}\x{9214}\x{9215}' . +'\x{921E}\x{9229}\x{922C}\x{9234}\x{9237}\x{923F}\x{9244}\x{9245}\x{9248}' . +'\x{9249}\x{924B}\x{9250}\x{9257}\x{925A}\x{925B}\x{925E}\x{9262}\x{9264}' . +'\x{9266}\x{9271}\x{927E}\x{9280}\x{9283}\x{9285}\x{9291}\x{9293}\x{9295}' . +'\x{9296}\x{9298}\x{929A}\x{929B}\x{929C}\x{92AD}\x{92B7}\x{92B9}\x{92CF}' . +'\x{92D2}\x{92E4}\x{92E9}\x{92EA}\x{92ED}\x{92F2}\x{92F3}\x{92F8}\x{92FA}' . +'\x{92FC}\x{9306}\x{930F}\x{9310}\x{9318}\x{9319}\x{931A}\x{9320}\x{9322}' . +'\x{9323}\x{9326}\x{9328}\x{932B}\x{932C}\x{932E}\x{932F}\x{9332}\x{9335}' . +'\x{933A}\x{933B}\x{9344}\x{934B}\x{934D}\x{9354}\x{9356}\x{935B}\x{935C}' . +'\x{9360}\x{936C}\x{936E}\x{9375}\x{937C}\x{937E}\x{938C}\x{9394}\x{9396}' . +'\x{9397}\x{939A}\x{93A7}\x{93AC}\x{93AD}\x{93AE}\x{93B0}\x{93B9}\x{93C3}' . +'\x{93C8}\x{93D0}\x{93D1}\x{93D6}\x{93D7}\x{93D8}\x{93DD}\x{93E1}\x{93E4}' . +'\x{93E5}\x{93E8}\x{9403}\x{9407}\x{9410}\x{9413}\x{9414}\x{9418}\x{9419}' . +'\x{941A}\x{9421}\x{942B}\x{9435}\x{9436}\x{9438}\x{943A}\x{9441}\x{9444}' . +'\x{9451}\x{9452}\x{9453}\x{945A}\x{945B}\x{945E}\x{9460}\x{9462}\x{946A}' . +'\x{9470}\x{9475}\x{9477}\x{947C}\x{947D}\x{947E}\x{947F}\x{9481}\x{9577}' . +'\x{9580}\x{9582}\x{9583}\x{9587}\x{9589}\x{958A}\x{958B}\x{958F}\x{9591}' . +'\x{9593}\x{9594}\x{9596}\x{9598}\x{9599}\x{95A0}\x{95A2}\x{95A3}\x{95A4}' . +'\x{95A5}\x{95A7}\x{95A8}\x{95AD}\x{95B2}\x{95B9}\x{95BB}\x{95BC}\x{95BE}' . +'\x{95C3}\x{95C7}\x{95CA}\x{95CC}\x{95CD}\x{95D4}\x{95D5}\x{95D6}\x{95D8}' . +'\x{95DC}\x{95E1}\x{95E2}\x{95E5}\x{961C}\x{9621}\x{9628}\x{962A}\x{962E}' . +'\x{962F}\x{9632}\x{963B}\x{963F}\x{9640}\x{9642}\x{9644}\x{964B}\x{964C}' . +'\x{964D}\x{964F}\x{9650}\x{965B}\x{965C}\x{965D}\x{965E}\x{965F}\x{9662}' . +'\x{9663}\x{9664}\x{9665}\x{9666}\x{966A}\x{966C}\x{9670}\x{9672}\x{9673}' . +'\x{9675}\x{9676}\x{9677}\x{9678}\x{967A}\x{967D}\x{9685}\x{9686}\x{9688}' . +'\x{968A}\x{968B}\x{968D}\x{968E}\x{968F}\x{9694}\x{9695}\x{9697}\x{9698}' . +'\x{9699}\x{969B}\x{969C}\x{96A0}\x{96A3}\x{96A7}\x{96A8}\x{96AA}\x{96B0}' . +'\x{96B1}\x{96B2}\x{96B4}\x{96B6}\x{96B7}\x{96B8}\x{96B9}\x{96BB}\x{96BC}' . +'\x{96C0}\x{96C1}\x{96C4}\x{96C5}\x{96C6}\x{96C7}\x{96C9}\x{96CB}\x{96CC}' . +'\x{96CD}\x{96CE}\x{96D1}\x{96D5}\x{96D6}\x{96D9}\x{96DB}\x{96DC}\x{96E2}' . +'\x{96E3}\x{96E8}\x{96EA}\x{96EB}\x{96F0}\x{96F2}\x{96F6}\x{96F7}\x{96F9}' . +'\x{96FB}\x{9700}\x{9704}\x{9706}\x{9707}\x{9708}\x{970A}\x{970D}\x{970E}' . +'\x{970F}\x{9711}\x{9713}\x{9716}\x{9719}\x{971C}\x{971E}\x{9724}\x{9727}' . +'\x{972A}\x{9730}\x{9732}\x{9738}\x{9739}\x{973D}\x{973E}\x{9742}\x{9744}' . +'\x{9746}\x{9748}\x{9749}\x{9752}\x{9756}\x{9759}\x{975C}\x{975E}\x{9760}' . +'\x{9761}\x{9762}\x{9764}\x{9766}\x{9768}\x{9769}\x{976B}\x{976D}\x{9771}' . +'\x{9774}\x{9779}\x{977A}\x{977C}\x{9781}\x{9784}\x{9785}\x{9786}\x{978B}' . +'\x{978D}\x{978F}\x{9790}\x{9798}\x{979C}\x{97A0}\x{97A3}\x{97A6}\x{97A8}' . +'\x{97AB}\x{97AD}\x{97B3}\x{97B4}\x{97C3}\x{97C6}\x{97C8}\x{97CB}\x{97D3}' . +'\x{97DC}\x{97ED}\x{97EE}\x{97F2}\x{97F3}\x{97F5}\x{97F6}\x{97FB}\x{97FF}' . +'\x{9801}\x{9802}\x{9803}\x{9805}\x{9806}\x{9808}\x{980C}\x{980F}\x{9810}' . +'\x{9811}\x{9812}\x{9813}\x{9817}\x{9818}\x{981A}\x{9821}\x{9824}\x{982C}' . +'\x{982D}\x{9834}\x{9837}\x{9838}\x{983B}\x{983C}\x{983D}\x{9846}\x{984B}' . +'\x{984C}\x{984D}\x{984E}\x{984F}\x{9854}\x{9855}\x{9858}\x{985B}\x{985E}' . +'\x{9867}\x{986B}\x{986F}\x{9870}\x{9871}\x{9873}\x{9874}\x{98A8}\x{98AA}' . +'\x{98AF}\x{98B1}\x{98B6}\x{98C3}\x{98C4}\x{98C6}\x{98DB}\x{98DC}\x{98DF}' . +'\x{98E2}\x{98E9}\x{98EB}\x{98ED}\x{98EE}\x{98EF}\x{98F2}\x{98F4}\x{98FC}' . +'\x{98FD}\x{98FE}\x{9903}\x{9905}\x{9909}\x{990A}\x{990C}\x{9910}\x{9912}' . +'\x{9913}\x{9914}\x{9918}\x{991D}\x{991E}\x{9920}\x{9921}\x{9924}\x{9928}' . +'\x{992C}\x{992E}\x{993D}\x{993E}\x{9942}\x{9945}\x{9949}\x{994B}\x{994C}' . +'\x{9950}\x{9951}\x{9952}\x{9955}\x{9957}\x{9996}\x{9997}\x{9998}\x{9999}' . +'\x{99A5}\x{99A8}\x{99AC}\x{99AD}\x{99AE}\x{99B3}\x{99B4}\x{99BC}\x{99C1}' . +'\x{99C4}\x{99C5}\x{99C6}\x{99C8}\x{99D0}\x{99D1}\x{99D2}\x{99D5}\x{99D8}' . +'\x{99DB}\x{99DD}\x{99DF}\x{99E2}\x{99ED}\x{99EE}\x{99F1}\x{99F2}\x{99F8}' . +'\x{99FB}\x{99FF}\x{9A01}\x{9A05}\x{9A0E}\x{9A0F}\x{9A12}\x{9A13}\x{9A19}' . +'\x{9A28}\x{9A2B}\x{9A30}\x{9A37}\x{9A3E}\x{9A40}\x{9A42}\x{9A43}\x{9A45}' . +'\x{9A4D}\x{9A55}\x{9A57}\x{9A5A}\x{9A5B}\x{9A5F}\x{9A62}\x{9A64}\x{9A65}' . +'\x{9A69}\x{9A6A}\x{9A6B}\x{9AA8}\x{9AAD}\x{9AB0}\x{9AB8}\x{9ABC}\x{9AC0}' . +'\x{9AC4}\x{9ACF}\x{9AD1}\x{9AD3}\x{9AD4}\x{9AD8}\x{9ADE}\x{9ADF}\x{9AE2}' . +'\x{9AE3}\x{9AE6}\x{9AEA}\x{9AEB}\x{9AED}\x{9AEE}\x{9AEF}\x{9AF1}\x{9AF4}' . +'\x{9AF7}\x{9AFB}\x{9B06}\x{9B18}\x{9B1A}\x{9B1F}\x{9B22}\x{9B23}\x{9B25}' . +'\x{9B27}\x{9B28}\x{9B29}\x{9B2A}\x{9B2E}\x{9B2F}\x{9B31}\x{9B32}\x{9B3B}' . +'\x{9B3C}\x{9B41}\x{9B42}\x{9B43}\x{9B44}\x{9B45}\x{9B4D}\x{9B4E}\x{9B4F}' . +'\x{9B51}\x{9B54}\x{9B58}\x{9B5A}\x{9B6F}\x{9B74}\x{9B83}\x{9B8E}\x{9B91}' . +'\x{9B92}\x{9B93}\x{9B96}\x{9B97}\x{9B9F}\x{9BA0}\x{9BA8}\x{9BAA}\x{9BAB}' . +'\x{9BAD}\x{9BAE}\x{9BB4}\x{9BB9}\x{9BC0}\x{9BC6}\x{9BC9}\x{9BCA}\x{9BCF}' . +'\x{9BD1}\x{9BD2}\x{9BD4}\x{9BD6}\x{9BDB}\x{9BE1}\x{9BE2}\x{9BE3}\x{9BE4}' . +'\x{9BE8}\x{9BF0}\x{9BF1}\x{9BF2}\x{9BF5}\x{9C04}\x{9C06}\x{9C08}\x{9C09}' . +'\x{9C0A}\x{9C0C}\x{9C0D}\x{9C10}\x{9C12}\x{9C13}\x{9C14}\x{9C15}\x{9C1B}' . +'\x{9C21}\x{9C24}\x{9C25}\x{9C2D}\x{9C2E}\x{9C2F}\x{9C30}\x{9C32}\x{9C39}' . +'\x{9C3A}\x{9C3B}\x{9C3E}\x{9C46}\x{9C47}\x{9C48}\x{9C52}\x{9C57}\x{9C5A}' . +'\x{9C60}\x{9C67}\x{9C76}\x{9C78}\x{9CE5}\x{9CE7}\x{9CE9}\x{9CEB}\x{9CEC}' . +'\x{9CF0}\x{9CF3}\x{9CF4}\x{9CF6}\x{9D03}\x{9D06}\x{9D07}\x{9D08}\x{9D09}' . +'\x{9D0E}\x{9D12}\x{9D15}\x{9D1B}\x{9D1F}\x{9D23}\x{9D26}\x{9D28}\x{9D2A}' . +'\x{9D2B}\x{9D2C}\x{9D3B}\x{9D3E}\x{9D3F}\x{9D41}\x{9D44}\x{9D46}\x{9D48}' . +'\x{9D50}\x{9D51}\x{9D59}\x{9D5C}\x{9D5D}\x{9D5E}\x{9D60}\x{9D61}\x{9D64}' . +'\x{9D6C}\x{9D6F}\x{9D72}\x{9D7A}\x{9D87}\x{9D89}\x{9D8F}\x{9D9A}\x{9DA4}' . +'\x{9DA9}\x{9DAB}\x{9DAF}\x{9DB2}\x{9DB4}\x{9DB8}\x{9DBA}\x{9DBB}\x{9DC1}' . +'\x{9DC2}\x{9DC4}\x{9DC6}\x{9DCF}\x{9DD3}\x{9DD9}\x{9DE6}\x{9DED}\x{9DEF}' . +'\x{9DF2}\x{9DF8}\x{9DF9}\x{9DFA}\x{9DFD}\x{9E1A}\x{9E1B}\x{9E1E}\x{9E75}' . +'\x{9E78}\x{9E79}\x{9E7D}\x{9E7F}\x{9E81}\x{9E88}\x{9E8B}\x{9E8C}\x{9E91}' . +'\x{9E92}\x{9E93}\x{9E95}\x{9E97}\x{9E9D}\x{9E9F}\x{9EA5}\x{9EA6}\x{9EA9}' . +'\x{9EAA}\x{9EAD}\x{9EB8}\x{9EB9}\x{9EBA}\x{9EBB}\x{9EBC}\x{9EBE}\x{9EBF}' . +'\x{9EC4}\x{9ECC}\x{9ECD}\x{9ECE}\x{9ECF}\x{9ED0}\x{9ED2}\x{9ED4}\x{9ED8}' . +'\x{9ED9}\x{9EDB}\x{9EDC}\x{9EDD}\x{9EDE}\x{9EE0}\x{9EE5}\x{9EE8}\x{9EEF}' . +'\x{9EF4}\x{9EF6}\x{9EF7}\x{9EF9}\x{9EFB}\x{9EFC}\x{9EFD}\x{9F07}\x{9F08}' . +'\x{9F0E}\x{9F13}\x{9F15}\x{9F20}\x{9F21}\x{9F2C}\x{9F3B}\x{9F3E}\x{9F4A}' . +'\x{9F4B}\x{9F4E}\x{9F4F}\x{9F52}\x{9F54}\x{9F5F}\x{9F60}\x{9F61}\x{9F62}' . +'\x{9F63}\x{9F66}\x{9F67}\x{9F6A}\x{9F6C}\x{9F72}\x{9F76}\x{9F77}\x{9F8D}' . +'\x{9F95}\x{9F9C}\x{9F9D}\x{9FA0}]{1,15}$/iu'); diff --git a/lib/zend/Zend/Validate/Iban.php b/lib/zend/Zend/Validate/Iban.php new file mode 100644 index 0000000000..d6ad12b5c1 --- /dev/null +++ b/lib/zend/Zend/Validate/Iban.php @@ -0,0 +1,202 @@ + "'%value%' does not have IBAN", + self::FALSEFORMAT => "'%value%' has a false format", + self::CHECKFAILED => "'%value%' has failed the IBAN check" + ); + + /** + * Optional locale + * + * @var string|Zend_Locale|null + */ + protected $_locale; + + /** + * IBAN regexes by region + * + * @var array + */ + protected $_ibanregex = array( + 'AD' => '/^AD[0-9]{2}[0-9]{8}[A-Z0-9]{12}$/', + 'AT' => '/^AT[0-9]{2}[0-9]{5}[0-9]{11}$/', + 'BA' => '/^BA[0-9]{2}[0-9]{6}[0-9]{10}$/', + 'BE' => '/^BE[0-9]{2}[0-9]{3}[0-9]{9}$/', + 'BG' => '/^BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}$/', + 'CH' => '/^CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}$/', + 'CS' => '/^CS[0-9]{2}[0-9]{3}[0-9]{15}$/', + 'CY' => '/^CY[0-9]{2}[0-9]{8}[A-Z0-9]{16}$/', + 'CZ' => '/^CZ[0-9]{2}[0-9]{4}[0-9]{16}$/', + 'DE' => '/^DE[0-9]{2}[0-9]{8}[0-9]{10}$/', + 'DK' => '/^DK[0-9]{2}[0-9]{4}[0-9]{10}$/', + 'EE' => '/^EE[0-9]{2}[0-9]{4}[0-9]{12}$/', + 'ES' => '/^ES[0-9]{2}[0-9]{8}[0-9]{12}$/', + 'FR' => '/^FR[0-9]{2}[0-9]{10}[A-Z0-9]{13}$/', + 'FI' => '/^FI[0-9]{2}[0-9]{6}[0-9]{8}$/', + 'GB' => '/^GB[0-9]{2}[A-Z]{4}[0-9]{14}$/', + 'GI' => '/^GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}$/', + 'GR' => '/^GR[0-9]{2}[0-9]{7}[A-Z0-9]{16}$/', + 'HR' => '/^HR[0-9]{2}[0-9]{7}[0-9]{10}$/', + 'HU' => '/^HU[0-9]{2}[0-9]{7}[0-9]{1}[0-9]{15}[0-9]{1}$/', + 'IE' => '/^IE[0-9]{2}[A-Z0-9]{4}[0-9]{6}[0-9]{8}$/', + 'IS' => '/^IS[0-9]{2}[0-9]{4}[0-9]{18}$/', + 'IT' => '/^IT[0-9]{2}[A-Z]{1}[0-9]{10}[A-Z0-9]{12}$/', + 'LI' => '/^LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}$/', + 'LU' => '/^LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}$/', + 'LT' => '/^LT[0-9]{2}[0-9]{5}[0-9]{11}$/', + 'LV' => '/^LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}$/', + 'MK' => '/^MK[0-9]{2}[A-Z]{3}[A-Z0-9]{10}[0-9]{2}$/', + 'MT' => '/^MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}$/', + 'NL' => '/^NL[0-9]{2}[A-Z]{4}[0-9]{10}$/', + 'NO' => '/^NO[0-9]{2}[0-9]{4}[0-9]{7}$/', + 'PL' => '/^PL[0-9]{2}[0-9]{8}[0-9]{16}$/', + 'PT' => '/^PT[0-9]{2}[0-9]{8}[0-9]{13}$/', + 'RO' => '/^RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}$/', + 'SE' => '/^SE[0-9]{2}[0-9]{3}[0-9]{17}$/', + 'SI' => '/^SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}$/', + 'SK' => '/^SK[0-9]{2}[0-9]{4}[0-9]{16}$/', + 'TN' => '/^TN[0-9]{2}[0-9]{5}[0-9]{15}$/', + 'TR' => '/^TR[0-9]{2}[0-9]{5}[A-Z0-9]{17}$/' + ); + + /** + * Sets validator options + * + * @param string|Zend_Locale $locale OPTIONAL + * @return void + */ + public function __construct($locale = null) + { + if ($locale !== null) { + $this->setLocale($locale); + } + } + + /** + * Returns the locale option + * + * @return string|Zend_Locale|null + */ + public function getLocale() + { + return $this->_locale; + } + + /** + * Sets the locale option + * + * @param string|Zend_Locale $locale + * @return Zend_Validate_Date provides a fluent interface + */ + public function setLocale($locale = null) + { + require_once 'Zend/Locale.php'; + $locale = Zend_Locale::findLocale($locale); + if (strlen($locale) < 4) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('Region must be given for IBAN validation'); + } + + $this->_locale = $locale; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if $value is a valid IBAN + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + $value = strtoupper($value); + $this->_setValue($value); + + if (empty($this->_locale)) { + $region = substr($value, 0, 2); + } else { + $region = new Zend_Locale($this->_locale); + $region = $region->getRegion(); + } + + if (!array_key_exists($region, $this->_ibanregex)) { + $this->_setValue($region); + $this->_error(self::NOTSUPPORTED); + return false; + } + + if (!preg_match($this->_ibanregex[$region], $value)) { + $this->_error(self::FALSEFORMAT); + return false; + } + + $format = substr($value, 4) . substr($value, 0, 4); + $format = str_replace( + 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'), + array('10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', + '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35'), + $format); + + $temp = intval(substr($format, 0, 1)); + $len = strlen($format); + for ($x = 1; $x < $len; ++$x) { + $temp *= 10; + $temp += intval(substr($format, $x, 1)); + $temp %= 97; + } + + if ($temp != 1) { + $this->_error(self::CHECKFAILED); + return false; + } + + return true; + } +} diff --git a/lib/zend/Zend/Validate/Identical.php b/lib/zend/Zend/Validate/Identical.php new file mode 100644 index 0000000000..4ccbb866e3 --- /dev/null +++ b/lib/zend/Zend/Validate/Identical.php @@ -0,0 +1,125 @@ + "The token '%token%' does not match the given token '%value%'", + self::MISSING_TOKEN => 'No token was provided to match against', + ); + + /** + * @var array + */ + protected $_messageVariables = array( + 'token' => '_tokenString' + ); + + /** + * Original token against which to validate + * @var string + */ + protected $_tokenString; + protected $_token; + + /** + * Sets validator options + * + * @param mixed $token + * @return void + */ + public function __construct($token = null) + { + if (null !== $token) { + $this->setToken($token); + } + } + + /** + * Set token against which to compare + * + * @param mixed $token + * @return Zend_Validate_Identical + */ + public function setToken($token) + { + $this->_tokenString = (string) $token; + $this->_token = $token; + return $this; + } + + /** + * Retrieve token + * + * @return string + */ + public function getToken() + { + return $this->_token; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if a token has been set and the provided value + * matches that token. + * + * @param mixed $value + * @return boolean + */ + public function isValid($value) + { + $this->_setValue((string) $value); + $token = $this->getToken(); + + if ($token === null) { + $this->_error(self::MISSING_TOKEN); + return false; + } + + if ($value !== $token) { + $this->_error(self::NOT_SAME); + return false; + } + + return true; + } +} diff --git a/lib/zend/Zend/Validate/InArray.php b/lib/zend/Zend/Validate/InArray.php new file mode 100644 index 0000000000..3bcfbb4f9f --- /dev/null +++ b/lib/zend/Zend/Validate/InArray.php @@ -0,0 +1,138 @@ + "'%value%' was not found in the haystack" + ); + + /** + * Haystack of possible values + * + * @var array + */ + protected $_haystack; + + /** + * Whether a strict in_array() invocation is used + * + * @var boolean + */ + protected $_strict; + + /** + * Sets validator options + * + * @param array $haystack + * @param boolean $strict + * @return void + */ + public function __construct(array $haystack, $strict = false) + { + $this->setHaystack($haystack) + ->setStrict($strict); + } + + /** + * Returns the haystack option + * + * @return mixed + */ + public function getHaystack() + { + return $this->_haystack; + } + + /** + * Sets the haystack option + * + * @param mixed $haystack + * @return Zend_Validate_InArray Provides a fluent interface + */ + public function setHaystack(array $haystack) + { + $this->_haystack = $haystack; + return $this; + } + + /** + * Returns the strict option + * + * @return boolean + */ + public function getStrict() + { + return $this->_strict; + } + + /** + * Sets the strict option + * + * @param boolean $strict + * @return Zend_Validate_InArray Provides a fluent interface + */ + public function setStrict($strict) + { + $this->_strict = $strict; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value is contained in the haystack option. If the strict + * option is true, then the type of $value is also checked. + * + * @param mixed $value + * @return boolean + */ + public function isValid($value) + { + $this->_setValue($value); + if (!in_array($value, $this->_haystack, $this->_strict)) { + $this->_error(self::NOT_IN_ARRAY); + return false; + } + return true; + } + +} diff --git a/lib/zend/Zend/Validate/Int.php b/lib/zend/Zend/Validate/Int.php new file mode 100644 index 0000000000..9de41b4eb5 --- /dev/null +++ b/lib/zend/Zend/Validate/Int.php @@ -0,0 +1,126 @@ + "Invalid type given, value should be a string or a integer", + self::NOT_INT => "'%value%' does not appear to be an integer" + ); + + protected $_locale; + + /** + * Constructor for the integer validator + * + * @param string|Zend_Locale $locale + */ + public function __construct($locale = null) + { + if ($locale !== null) { + $this->setLocale($locale); + } + } + + /** + * Returns the set locale + */ + public function getLocale() + { + return $this->_locale; + } + + /** + * Sets the locale to use + * + * @param string|Zend_Locale $locale + */ + public function setLocale($locale = null) + { + require_once 'Zend/Locale.php'; + $this->_locale = Zend_Locale::findLocale($locale); + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value is a valid integer + * + * @param string|integer $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value) && !is_float($value)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue($value); + if ($this->_locale === null) { + $locale = localeconv(); + $valueFiltered = str_replace($locale['decimal_point'], '.', $value); + $valueFiltered = str_replace($locale['thousands_sep'], '', $valueFiltered); + + if (strval(intval($valueFiltered)) != $valueFiltered) { + $this->_error(self::NOT_INT); + return false; + } + + } else { + try { + if (!Zend_Locale_Format::isInteger($value, array('locale' => 'en')) && + !Zend_Locale_Format::isInteger($value, array('locale' => $this->_locale))) { + $this->_error(self::NOT_INT); + return false; + } + } catch (Zend_Locale_Exception $e) { + $this->_error(self::NOT_INT); + return false; + } + } + + return true; + } +} diff --git a/lib/zend/Zend/Validate/Interface.php b/lib/zend/Zend/Validate/Interface.php index 40db3402f7..fda473832a 100644 --- a/lib/zend/Zend/Validate/Interface.php +++ b/lib/zend/Zend/Validate/Interface.php @@ -15,7 +15,7 @@ * * @category Zend * @package Zend_Validate - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -24,7 +24,7 @@ /** * @category Zend * @package Zend_Validate - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ interface Zend_Validate_Interface diff --git a/lib/zend/Zend/Validate/Ip.php b/lib/zend/Zend/Validate/Ip.php index 926934bdc9..038ed12c01 100644 --- a/lib/zend/Zend/Validate/Ip.php +++ b/lib/zend/Zend/Validate/Ip.php @@ -1,5 +1,4 @@ "Invalid type given, value should be a string", self::NOT_IP_ADDRESS => "'%value%' does not appear to be a valid IP address" ); @@ -55,13 +53,21 @@ class Zend_Validate_Ip extends Zend_Validate_Abstract */ public function isValid($value) { - $valueString = (string) $value; + if (!is_string($value)) { + $this->_error(self::INVALID); + return false; + } - $this->_setValue($valueString); + $this->_setValue($value); - if (ip2long($valueString) === false) { - $this->_error(); - return false; + if ((ip2long($value) === false) || (long2ip(ip2long($value)) !== $value)) { + if (!function_exists('inet_pton')) { + $this->_error(self::NOT_IP_ADDRESS); + return false; + } else if ((@inet_pton($value) === false) ||(inet_ntop(@inet_pton($value)) !== $value)) { + $this->_error(self::NOT_IP_ADDRESS); + return false; + } } return true; diff --git a/lib/zend/Zend/Validate/LessThan.php b/lib/zend/Zend/Validate/LessThan.php new file mode 100644 index 0000000000..ecbd70879b --- /dev/null +++ b/lib/zend/Zend/Validate/LessThan.php @@ -0,0 +1,113 @@ + "'%value%' is not less than '%max%'" + ); + + /** + * @var array + */ + protected $_messageVariables = array( + 'max' => '_max' + ); + + /** + * Maximum value + * + * @var mixed + */ + protected $_max; + + /** + * Sets validator options + * + * @param mixed $max + * @return void + */ + public function __construct($max) + { + $this->setMax($max); + } + + /** + * Returns the max option + * + * @return mixed + */ + public function getMax() + { + return $this->_max; + } + + /** + * Sets the max option + * + * @param mixed $max + * @return Zend_Validate_LessThan Provides a fluent interface + */ + public function setMax($max) + { + $this->_max = $max; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value is less than max option + * + * @param mixed $value + * @return boolean + */ + public function isValid($value) + { + $this->_setValue($value); + if ($this->_max <= $value) { + $this->_error(self::NOT_LESS); + return false; + } + return true; + } + +} diff --git a/lib/zend/Zend/Validate/NotEmpty.php b/lib/zend/Zend/Validate/NotEmpty.php new file mode 100644 index 0000000000..2680b5ae9c --- /dev/null +++ b/lib/zend/Zend/Validate/NotEmpty.php @@ -0,0 +1,79 @@ + "Value is required and can't be empty", + self::INVALID => "Invalid type given, value should be float, string, array, boolean or integer", + ); + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value is not an empty value. + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + if (!is_null($value) && !is_string($value) && !is_int($value) && !is_float($value) && + !is_bool($value) && !is_array($value)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue($value); + if (is_string($value) + && (('' === $value) + || preg_match('/^\s+$/s', $value)) + ) { + $this->_error(self::IS_EMPTY); + return false; + } elseif (is_int($value) && (0 === $value)) { + return true; + } elseif (!is_string($value) && empty($value)) { + $this->_error(self::IS_EMPTY); + return false; + } + + return true; + } + +} diff --git a/lib/zend/Zend/Validate/Regex.php b/lib/zend/Zend/Validate/Regex.php new file mode 100644 index 0000000000..7697ccf1f6 --- /dev/null +++ b/lib/zend/Zend/Validate/Regex.php @@ -0,0 +1,126 @@ + "Invalid type given, value should be string, integer or float", + self::NOT_MATCH => "'%value%' does not match against pattern '%pattern%'" + ); + + /** + * @var array + */ + protected $_messageVariables = array( + 'pattern' => '_pattern' + ); + + /** + * Regular expression pattern + * + * @var string + */ + protected $_pattern; + + /** + * Sets validator options + * + * @param string $pattern + * @return void + */ + public function __construct($pattern) + { + $this->setPattern($pattern); + } + + /** + * Returns the pattern option + * + * @return string + */ + public function getPattern() + { + return $this->_pattern; + } + + /** + * Sets the pattern option + * + * @param string $pattern + * @return Zend_Validate_Regex Provides a fluent interface + */ + public function setPattern($pattern) + { + $this->_pattern = (string) $pattern; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if $value matches against the pattern option + * + * @param string $value + * @throws Zend_Validate_Exception if there is a fatal error in pattern matching + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value) && !is_int($value) && !is_float($value)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue($value); + + $status = @preg_match($this->_pattern, $value); + if (false === $status) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("Internal error matching pattern '$this->_pattern' against value '$value'"); + } + if (!$status) { + $this->_error(self::NOT_MATCH); + return false; + } + return true; + } + +} diff --git a/lib/zend/Zend/Validate/Sitemap/Changefreq.php b/lib/zend/Zend/Validate/Sitemap/Changefreq.php new file mode 100644 index 0000000000..33d07a06c4 --- /dev/null +++ b/lib/zend/Zend/Validate/Sitemap/Changefreq.php @@ -0,0 +1,89 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + * + * @category Zend + * @package Zend_Validate + * @subpackage Sitemap + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Validate_Sitemap_Changefreq extends Zend_Validate_Abstract +{ + /** + * Validation key for not valid + * + */ + const NOT_VALID = 'invalidSitemapChangefreq'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $_messageTemplates = array( + self::NOT_VALID => "'%value%' is not a valid sitemap changefreq", + ); + + /** + * Valid change frequencies + * + * @var array + */ + protected $_changeFreqs = array( + 'always', 'hourly', 'daily', 'weekly', + 'monthly', 'yearly', 'never' + ); + + /** + * Validates if a string is valid as a sitemap changefreq + * + * @link http://www.sitemaps.org/protocol.php#changefreqdef + * + * @param string $value value to validate + * @return boolean + */ + public function isValid($value) + { + $this->_setValue($value); + + if (!is_string($value)) { + return false; + } + + if (!in_array($value, $this->_changeFreqs, true)) { + $this->_error(self::NOT_VALID); + return false; + } + + return true; + } +} diff --git a/lib/zend/Zend/Validate/Sitemap/Lastmod.php b/lib/zend/Zend/Validate/Sitemap/Lastmod.php new file mode 100644 index 0000000000..cc9adfa2f6 --- /dev/null +++ b/lib/zend/Zend/Validate/Sitemap/Lastmod.php @@ -0,0 +1,81 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + * + * @category Zend + * @package Zend_Validate + * @subpackage Sitemap + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Validate_Sitemap_Lastmod extends Zend_Validate_Abstract +{ + /** + * Regular expression to use when validating + * + */ + const LASTMOD_REGEX = '/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])(T([0-1][0-9]|2[0-3])(:[0-5][0-9]){2}(\\+|-)([0-1][0-9]|2[0-3]):[0-5][0-9])?$/m'; + + /** + * Validation key for not valid + * + */ + const NOT_VALID = 'invalidSitemapLastmod'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $_messageTemplates = array( + self::NOT_VALID => "'%value%' is not a valid sitemap lastmod", + ); + + /** + * Validates if a string is valid as a sitemap lastmod + * + * @link http://www.sitemaps.org/protocol.php#lastmoddef + * + * @param string $value value to validate + * @return boolean + */ + public function isValid($value) + { + $this->_setValue($value); + + if (!is_string($value)) { + return false; + } + + return @preg_match(self::LASTMOD_REGEX, $value) == 1; + } + +} diff --git a/lib/zend/Zend/Validate/Sitemap/Loc.php b/lib/zend/Zend/Validate/Sitemap/Loc.php new file mode 100644 index 0000000000..70cbe391ab --- /dev/null +++ b/lib/zend/Zend/Validate/Sitemap/Loc.php @@ -0,0 +1,79 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + * + * @category Zend + * @package Zend_Validate + * @subpackage Sitemap + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Validate_Sitemap_Loc extends Zend_Validate_Abstract +{ + /** + * Validation key for not valid + * + */ + const NOT_VALID = 'invalidSitemapLoc'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $_messageTemplates = array( + self::NOT_VALID => "'%value%' is not a valid sitemap location", + ); + + /** + * Validates if a string is valid as a sitemap location + * + * @link http://www.sitemaps.org/protocol.php#locdef + * + * @param string $value value to validate + * @return boolean + */ + public function isValid($value) + { + $this->_setValue($value); + + if (!is_string($value)) { + return false; + } + + return Zend_Uri::check($value); + } +} diff --git a/lib/zend/Zend/Validate/Sitemap/Priority.php b/lib/zend/Zend/Validate/Sitemap/Priority.php new file mode 100644 index 0000000000..e5b4db86b6 --- /dev/null +++ b/lib/zend/Zend/Validate/Sitemap/Priority.php @@ -0,0 +1,75 @@ + value + * + * @link http://www.sitemaps.org/protocol.php Sitemaps XML format + * + * @category Zend + * @package Zend_Validate + * @subpackage Sitemap + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Validate_Sitemap_Priority extends Zend_Validate_Abstract +{ + /** + * Validation key for not valid + * + */ + const NOT_VALID = 'invalidSitemapPriority'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $_messageTemplates = array( + self::NOT_VALID => "'%value%' is not a valid sitemap priority", + ); + + /** + * Validates if a string is valid as a sitemap priority + * + * @link http://www.sitemaps.org/protocol.php#prioritydef + * + * @param string $value value to validate + * @return boolean + */ + public function isValid($value) + { + $this->_setValue($value); + + if (!is_numeric($value)) { + return false; + } + + $value = (float)$value; + return $value >= 0 && $value <= 1; + } +} diff --git a/lib/zend/Zend/Validate/StringLength.php b/lib/zend/Zend/Validate/StringLength.php new file mode 100644 index 0000000000..b67d5292b2 --- /dev/null +++ b/lib/zend/Zend/Validate/StringLength.php @@ -0,0 +1,229 @@ + "Invalid type given, value should be a string", + self::TOO_SHORT => "'%value%' is less than %min% characters long", + self::TOO_LONG => "'%value%' is greater than %max% characters long" + ); + + /** + * @var array + */ + protected $_messageVariables = array( + 'min' => '_min', + 'max' => '_max' + ); + + /** + * Minimum length + * + * @var integer + */ + protected $_min; + + /** + * Maximum length + * + * If null, there is no maximum length + * + * @var integer|null + */ + protected $_max; + + /** + * Encoding to use + * + * @var string|null + */ + protected $_encoding; + + /** + * Sets validator options + * + * @param integer $min + * @param integer $max + * @return void + */ + public function __construct($min = 0, $max = null, $encoding = null) + { + $this->setMin($min); + $this->setMax($max); + $this->setEncoding($encoding); + } + + /** + * Returns the min option + * + * @return integer + */ + public function getMin() + { + return $this->_min; + } + + /** + * Sets the min option + * + * @param integer $min + * @throws Zend_Validate_Exception + * @return Zend_Validate_StringLength Provides a fluent interface + */ + public function setMin($min) + { + if (null !== $this->_max && $min > $this->_max) { + /** + * @see Zend_Validate_Exception + */ + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The minimum must be less than or equal to the maximum length, but $min >" + . " $this->_max"); + } + $this->_min = max(0, (integer) $min); + return $this; + } + + /** + * Returns the max option + * + * @return integer|null + */ + public function getMax() + { + return $this->_max; + } + + /** + * Sets the max option + * + * @param integer|null $max + * @throws Zend_Validate_Exception + * @return Zend_Validate_StringLength Provides a fluent interface + */ + public function setMax($max) + { + if (null === $max) { + $this->_max = null; + } else if ($max < $this->_min) { + /** + * @see Zend_Validate_Exception + */ + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception("The maximum must be greater than or equal to the minimum length, but " + . "$max < $this->_min"); + } else { + $this->_max = (integer) $max; + } + + return $this; + } + + /** + * Returns the actual encoding + * + * @return string + */ + public function getEncoding() + { + return $this->_encoding; + } + + /** + * Sets a new encoding to use + * + * @param string $encoding + * @return Zend_Validate_StringLength + */ + public function setEncoding($encoding = null) + { + if ($encoding !== null) { + $orig = iconv_get_encoding('internal_encoding'); + $result = iconv_set_encoding('internal_encoding', $encoding); + if (!$result) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('Given encoding not supported on this OS!'); + } + + iconv_set_encoding('internal_encoding', $orig); + } + + $this->_encoding = $encoding; + return $this; + } + + /** + * Defined by Zend_Validate_Interface + * + * Returns true if and only if the string length of $value is at least the min option and + * no greater than the max option (when the max option is not null). + * + * @param string $value + * @return boolean + */ + public function isValid($value) + { + if (!is_string($value)) { + $this->_error(self::INVALID); + return false; + } + + $this->_setValue($value); + if ($this->_encoding !== null) { + $length = iconv_strlen($value, $this->_encoding); + } else { + $length = iconv_strlen($value); + } + + if ($length < $this->_min) { + $this->_error(self::TOO_SHORT); + } + + if (null !== $this->_max && $this->_max < $length) { + $this->_error(self::TOO_LONG); + } + + if (count($this->_messages)) { + return false; + } else { + return true; + } + } +} diff --git a/lib/zend/Zend/View/Abstract.php b/lib/zend/Zend/View/Abstract.php new file mode 100644 index 0000000000..30a1ff9870 --- /dev/null +++ b/lib/zend/Zend/View/Abstract.php @@ -0,0 +1,1136 @@ + array(), + 'helper' => array(), + 'filter' => array(), + ); + + /** + * Script file name to execute + * + * @var string + */ + private $_file = null; + + /** + * Instances of helper objects. + * + * @var array + */ + private $_helper = array(); + + /** + * Map of helper => class pairs to help in determining helper class from + * name + * @var array + */ + private $_helperLoaded = array(); + + /** + * Map of helper => classfile pairs to aid in determining helper classfile + * @var array + */ + private $_helperLoadedDir = array(); + + /** + * Stack of Zend_View_Filter names to apply as filters. + * @var array + */ + private $_filter = array(); + + /** + * Stack of Zend_View_Filter objects that have been loaded + * @var array + */ + private $_filterClass = array(); + + /** + * Map of filter => class pairs to help in determining filter class from + * name + * @var array + */ + private $_filterLoaded = array(); + + /** + * Map of filter => classfile pairs to aid in determining filter classfile + * @var array + */ + private $_filterLoadedDir = array(); + + /** + * Callback for escaping. + * + * @var string + */ + private $_escape = 'htmlspecialchars'; + + /** + * Encoding to use in escaping mechanisms; defaults to latin1 (ISO-8859-1) + * @var string + */ + private $_encoding = 'ISO-8859-1'; + + /** + * Flag indicating whether or not LFI protection for rendering view scripts is enabled + * @var bool + */ + private $_lfiProtectionOn = true; + + /** + * Plugin loaders + * @var array + */ + private $_loaders = array(); + + /** + * Plugin types + * @var array + */ + private $_loaderTypes = array('filter', 'helper'); + + /** + * Strict variables flag; when on, undefined variables accessed in the view + * scripts will trigger notices + * @var boolean + */ + private $_strictVars = false; + + private $_log; + + /** + * Constructor. + * + * @param array $config Configuration key-value pairs. + */ + public function __construct($config = array()) + { + // set inital paths and properties + $this->setScriptPath(null); + + // $this->setHelperPath(null); + $this->setFilterPath(null); + + // user-defined escaping callback + if (array_key_exists('escape', $config)) { + $this->setEscape($config['escape']); + } + + // encoding + if (array_key_exists('encoding', $config)) { + $this->setEncoding($config['encoding']); + } + + // base path + if (array_key_exists('basePath', $config)) { + $prefix = 'Zend_View'; + if (array_key_exists('basePathPrefix', $config)) { + $prefix = $config['basePathPrefix']; + } + $this->setBasePath($config['basePath'], $prefix); + } + + // user-defined view script path + if (array_key_exists('scriptPath', $config)) { + $this->addScriptPath($config['scriptPath']); + } + + // user-defined helper path + if (array_key_exists('helperPath', $config)) { + if (is_array($config['helperPath'])) { + foreach ($config['helperPath'] as $prefix => $path) { + $this->addHelperPath($path, $prefix); + } + } else { + $prefix = 'Zend_View_Helper'; + if (array_key_exists('helperPathPrefix', $config)) { + $prefix = $config['helperPathPrefix']; + } + $this->addHelperPath($config['helperPath'], $prefix); + } + } + + // user-defined filter path + if (array_key_exists('filterPath', $config)) { + if (is_array($config['filterPath'])) { + foreach ($config['filterPath'] as $prefix => $path) { + $this->addFilterPath($path, $prefix); + } + } else { + $prefix = 'Zend_View_Filter'; + if (array_key_exists('filterPathPrefix', $config)) { + $prefix = $config['filterPathPrefix']; + } + $this->addFilterPath($config['filterPath'], $prefix); + } + } + + // user-defined filters + if (array_key_exists('filter', $config)) { + $this->addFilter($config['filter']); + } + + // strict vars + if (array_key_exists('strictVars', $config)) { + $this->strictVars($config['strictVars']); + } + + // LFI protection flag + if (array_key_exists('lfiProtectionOn', $config)) { + $this->setLfiProtection($config['lfiProtectionOn']); + } + + $this->init(); + } + + /** + * Return the template engine object + * + * Returns the object instance, as it is its own template engine + * + * @return Zend_View_Abstract + */ + public function getEngine() + { + return $this; + } + + /** + * Allow custom object initialization when extending Zend_View_Abstract or + * Zend_View + * + * Triggered by {@link __construct() the constructor} as its final action. + * + * @return void + */ + public function init() + { + } + + /** + * Prevent E_NOTICE for nonexistent values + * + * If {@link strictVars()} is on, raises a notice. + * + * @param string $key + * @return null + */ + public function __get($key) + { + if ($this->_strictVars) { + trigger_error('Key "' . $key . '" does not exist', E_USER_NOTICE); + } + + return null; + } + + /** + * Allows testing with empty() and isset() to work inside + * templates. + * + * @param string $key + * @return boolean + */ + public function __isset($key) + { + if ('_' != substr($key, 0, 1)) { + return isset($this->$key); + } + + return false; + } + + /** + * Directly assigns a variable to the view script. + * + * Checks first to ensure that the caller is not attempting to set a + * protected or private member (by checking for a prefixed underscore); if + * not, the public member is set; otherwise, an exception is raised. + * + * @param string $key The variable name. + * @param mixed $val The variable value. + * @return void + * @throws Zend_View_Exception if an attempt to set a private or protected + * member is detected + */ + public function __set($key, $val) + { + if ('_' != substr($key, 0, 1)) { + $this->$key = $val; + return; + } + + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Setting private or protected class members is not allowed', $this); + } + + /** + * Allows unset() on object properties to work + * + * @param string $key + * @return void + */ + public function __unset($key) + { + if ('_' != substr($key, 0, 1) && isset($this->$key)) { + unset($this->$key); + } + } + + /** + * Accesses a helper object from within a script. + * + * If the helper class has a 'view' property, sets it with the current view + * object. + * + * @param string $name The helper name. + * @param array $args The parameters for the helper. + * @return string The result of the helper output. + */ + public function __call($name, $args) + { + // is the helper already loaded? + $helper = $this->getHelper($name); + + // call the helper method + return call_user_func_array( + array($helper, $name), + $args + ); + } + + /** + * Given a base path, sets the script, helper, and filter paths relative to it + * + * Assumes a directory structure of: + * + * basePath/ + * scripts/ + * helpers/ + * filters/ + * + * + * @param string $path + * @param string $prefix Prefix to use for helper and filter paths + * @return Zend_View_Abstract + */ + public function setBasePath($path, $classPrefix = 'Zend_View') + { + $path = rtrim($path, '/'); + $path = rtrim($path, '\\'); + $path .= DIRECTORY_SEPARATOR; + $classPrefix = rtrim($classPrefix, '_') . '_'; + $this->setScriptPath($path . 'scripts'); + $this->setHelperPath($path . 'helpers', $classPrefix . 'Helper'); + $this->setFilterPath($path . 'filters', $classPrefix . 'Filter'); + return $this; + } + + /** + * Given a base path, add script, helper, and filter paths relative to it + * + * Assumes a directory structure of: + * + * basePath/ + * scripts/ + * helpers/ + * filters/ + * + * + * @param string $path + * @param string $prefix Prefix to use for helper and filter paths + * @return Zend_View_Abstract + */ + public function addBasePath($path, $classPrefix = 'Zend_View') + { + $path = rtrim($path, '/'); + $path = rtrim($path, '\\'); + $path .= DIRECTORY_SEPARATOR; + $classPrefix = rtrim($classPrefix, '_') . '_'; + $this->addScriptPath($path . 'scripts'); + $this->addHelperPath($path . 'helpers', $classPrefix . 'Helper'); + $this->addFilterPath($path . 'filters', $classPrefix . 'Filter'); + return $this; + } + + /** + * Adds to the stack of view script paths in LIFO order. + * + * @param string|array The directory (-ies) to add. + * @return Zend_View_Abstract + */ + public function addScriptPath($path) + { + $this->_addPath('script', $path); + return $this; + } + + /** + * Resets the stack of view script paths. + * + * To clear all paths, use Zend_View::setScriptPath(null). + * + * @param string|array The directory (-ies) to set as the path. + * @return Zend_View_Abstract + */ + public function setScriptPath($path) + { + $this->_path['script'] = array(); + $this->_addPath('script', $path); + return $this; + } + + /** + * Return full path to a view script specified by $name + * + * @param string $name + * @return false|string False if script not found + * @throws Zend_View_Exception if no script directory set + */ + public function getScriptPath($name) + { + try { + $path = $this->_script($name); + return $path; + } catch (Zend_View_Exception $e) { + if (strstr($e->getMessage(), 'no view script directory set')) { + throw $e; + } + + return false; + } + } + + /** + * Returns an array of all currently set script paths + * + * @return array + */ + public function getScriptPaths() + { + return $this->_getPaths('script'); + } + + /** + * Set plugin loader for a particular plugin type + * + * @param Zend_Loader_PluginLoader $loader + * @param string $type + * @return Zend_View_Abstract + */ + public function setPluginLoader(Zend_Loader_PluginLoader $loader, $type) + { + $type = strtolower($type); + if (!in_array($type, $this->_loaderTypes)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Invalid plugin loader type "%s"', $type)); + } + + $this->_loaders[$type] = $loader; + return $this; + } + + /** + * Retrieve plugin loader for a specific plugin type + * + * @param string $type + * @return Zend_Loader_PluginLoader + */ + public function getPluginLoader($type) + { + $type = strtolower($type); + if (!in_array($type, $this->_loaderTypes)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Invalid plugin loader type "%s"; cannot retrieve', $type)); + } + + if (!array_key_exists($type, $this->_loaders)) { + $prefix = 'Zend_View_'; + $pathPrefix = 'Zend/View/'; + + $pType = ucfirst($type); + switch ($type) { + case 'filter': + case 'helper': + default: + $prefix .= $pType; + $pathPrefix .= $pType; + $loader = new Zend_Loader_PluginLoader(array( + $prefix => $pathPrefix + )); + $this->_loaders[$type] = $loader; + break; + } + } + return $this->_loaders[$type]; + } + + /** + * Adds to the stack of helper paths in LIFO order. + * + * @param string|array The directory (-ies) to add. + * @param string $classPrefix Class prefix to use with classes in this + * directory; defaults to Zend_View_Helper + * @return Zend_View_Abstract + */ + public function addHelperPath($path, $classPrefix = 'Zend_View_Helper_') + { + return $this->_addPluginPath('helper', $classPrefix, (array) $path); + } + + /** + * Resets the stack of helper paths. + * + * To clear all paths, use Zend_View::setHelperPath(null). + * + * @param string|array $path The directory (-ies) to set as the path. + * @param string $classPrefix The class prefix to apply to all elements in + * $path; defaults to Zend_View_Helper + * @return Zend_View_Abstract + */ + public function setHelperPath($path, $classPrefix = 'Zend_View_Helper_') + { + unset($this->_loaders['helper']); + return $this->addHelperPath($path, $classPrefix); + } + + /** + * Get full path to a helper class file specified by $name + * + * @param string $name + * @return string|false False on failure, path on success + */ + public function getHelperPath($name) + { + return $this->_getPluginPath('helper', $name); + } + + /** + * Returns an array of all currently set helper paths + * + * @return array + */ + public function getHelperPaths() + { + return $this->getPluginLoader('helper')->getPaths(); + } + + /** + * Get a helper by name + * + * @param string $name + * @return object + */ + public function getHelper($name) + { + return $this->_getPlugin('helper', $name); + } + + /** + * Get array of all active helpers + * + * Only returns those that have already been instantiated. + * + * @return array + */ + public function getHelpers() + { + return $this->_helper; + } + + /** + * Adds to the stack of filter paths in LIFO order. + * + * @param string|array The directory (-ies) to add. + * @param string $classPrefix Class prefix to use with classes in this + * directory; defaults to Zend_View_Filter + * @return Zend_View_Abstract + */ + public function addFilterPath($path, $classPrefix = 'Zend_View_Filter_') + { + return $this->_addPluginPath('filter', $classPrefix, (array) $path); + } + + /** + * Resets the stack of filter paths. + * + * To clear all paths, use Zend_View::setFilterPath(null). + * + * @param string|array The directory (-ies) to set as the path. + * @param string $classPrefix The class prefix to apply to all elements in + * $path; defaults to Zend_View_Filter + * @return Zend_View_Abstract + */ + public function setFilterPath($path, $classPrefix = 'Zend_View_Filter_') + { + unset($this->_loaders['filter']); + return $this->addFilterPath($path, $classPrefix); + } + + /** + * Get full path to a filter class file specified by $name + * + * @param string $name + * @return string|false False on failure, path on success + */ + public function getFilterPath($name) + { + return $this->_getPluginPath('filter', $name); + } + + /** + * Get a filter object by name + * + * @param string $name + * @return object + */ + public function getFilter($name) + { + return $this->_getPlugin('filter', $name); + } + + /** + * Return array of all currently active filters + * + * Only returns those that have already been instantiated. + * + * @return array + */ + public function getFilters() + { + return $this->_filter; + } + + /** + * Returns an array of all currently set filter paths + * + * @return array + */ + public function getFilterPaths() + { + return $this->getPluginLoader('filter')->getPaths(); + } + + /** + * Return associative array of path types => paths + * + * @return array + */ + public function getAllPaths() + { + $paths = $this->_path; + $paths['helper'] = $this->getHelperPaths(); + $paths['filter'] = $this->getFilterPaths(); + return $paths; + } + + /** + * Add one or more filters to the stack in FIFO order. + * + * @param string|array One or more filters to add. + * @return Zend_View_Abstract + */ + public function addFilter($name) + { + foreach ((array) $name as $val) { + $this->_filter[] = $val; + } + return $this; + } + + /** + * Resets the filter stack. + * + * To clear all filters, use Zend_View::setFilter(null). + * + * @param string|array One or more filters to set. + * @return Zend_View_Abstract + */ + public function setFilter($name) + { + $this->_filter = array(); + $this->addFilter($name); + return $this; + } + + /** + * Sets the _escape() callback. + * + * @param mixed $spec The callback for _escape() to use. + * @return Zend_View_Abstract + */ + public function setEscape($spec) + { + $this->_escape = $spec; + return $this; + } + + /** + * Set LFI protection flag + * + * @param bool $flag + * @return Zend_View_Abstract + */ + public function setLfiProtection($flag) + { + $this->_lfiProtectionOn = (bool) $flag; + return $this; + } + + /** + * Return status of LFI protection flag + * + * @return bool + */ + public function isLfiProtectionOn() + { + return $this->_lfiProtectionOn; + } + + /** + * Assigns variables to the view script via differing strategies. + * + * Zend_View::assign('name', $value) assigns a variable called 'name' + * with the corresponding $value. + * + * Zend_View::assign($array) assigns the array keys as variable + * names (with the corresponding array values). + * + * @see __set() + * @param string|array The assignment strategy to use. + * @param mixed (Optional) If assigning a named variable, use this + * as the value. + * @return Zend_View_Abstract Fluent interface + * @throws Zend_View_Exception if $spec is neither a string nor an array, + * or if an attempt to set a private or protected member is detected + */ + public function assign($spec, $value = null) + { + // which strategy to use? + if (is_string($spec)) { + // assign by name and value + if ('_' == substr($spec, 0, 1)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Setting private or protected class members is not allowed', $this); + } + $this->$spec = $value; + } elseif (is_array($spec)) { + // assign from associative array + $error = false; + foreach ($spec as $key => $val) { + if ('_' == substr($key, 0, 1)) { + $error = true; + break; + } + $this->$key = $val; + } + if ($error) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Setting private or protected class members is not allowed', $this); + } + } else { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('assign() expects a string or array, received ' . gettype($spec), $this); + } + + return $this; + } + + /** + * Return list of all assigned variables + * + * Returns all public properties of the object. Reflection is not used + * here as testing reflection properties for visibility is buggy. + * + * @return array + */ + public function getVars() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ('_' == substr($key, 0, 1)) { + unset($vars[$key]); + } + } + + return $vars; + } + + /** + * Clear all assigned variables + * + * Clears all variables assigned to Zend_View either via {@link assign()} or + * property overloading ({@link __set()}). + * + * @return void + */ + public function clearVars() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ('_' != substr($key, 0, 1)) { + unset($this->$key); + } + } + } + + /** + * Processes a view script and returns the output. + * + * @param string $name The script script name to process. + * @return string The script output. + */ + public function render($name) + { + // find the script file name using the parent private method + $this->_file = $this->_script($name); + unset($name); // remove $name from local scope + + ob_start(); + $this->_run($this->_file); + + return $this->_filter(ob_get_clean()); // filter output + } + + /** + * Escapes a value for output in a view script. + * + * If escaping mechanism is one of htmlspecialchars or htmlentities, uses + * {@link $_encoding} setting. + * + * @param mixed $var The output to escape. + * @return mixed The escaped value. + */ + public function escape($var) + { + if (in_array($this->_escape, array('htmlspecialchars', 'htmlentities'))) { + return call_user_func($this->_escape, $var, ENT_COMPAT, $this->_encoding); + } + + return call_user_func($this->_escape, $var); + } + + /** + * Set encoding to use with htmlentities() and htmlspecialchars() + * + * @param string $encoding + * @return Zend_View_Abstract + */ + public function setEncoding($encoding) + { + $this->_encoding = $encoding; + return $this; + } + + /** + * Return current escape encoding + * + * @return string + */ + public function getEncoding() + { + return $this->_encoding; + } + + /** + * Enable or disable strict vars + * + * If strict variables are enabled, {@link __get()} will raise a notice + * when a variable is not defined. + * + * Use in conjunction with {@link Zend_View_Helper_DeclareVars the declareVars() helper} + * to enforce strict variable handling in your view scripts. + * + * @param boolean $flag + * @return Zend_View_Abstract + */ + public function strictVars($flag = true) + { + $this->_strictVars = ($flag) ? true : false; + + return $this; + } + + /** + * Finds a view script from the available directories. + * + * @param $name string The base name of the script. + * @return void + */ + protected function _script($name) + { + if ($this->isLfiProtectionOn() && preg_match('#\.\.[\\\/]#', $name)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Requested scripts may not include parent directory traversal ("../", "..\\" notation)'); + } + + if (0 == count($this->_path['script'])) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('no view script directory set; unable to determine location for view script', + $this); + } + + foreach ($this->_path['script'] as $dir) { + if (is_readable($dir . $name)) { + return $dir . $name; + } + } + + require_once 'Zend/View/Exception.php'; + $message = "script '$name' not found in path (" + . implode(PATH_SEPARATOR, $this->_path['script']) + . ")"; + throw new Zend_View_Exception($message, $this); + } + + /** + * Applies the filter callback to a buffer. + * + * @param string $buffer The buffer contents. + * @return string The filtered buffer. + */ + private function _filter($buffer) + { + // loop through each filter class + foreach ($this->_filter as $name) { + // load and apply the filter class + $filter = $this->getFilter($name); + $buffer = call_user_func(array($filter, 'filter'), $buffer); + } + + // done! + return $buffer; + } + + /** + * Adds paths to the path stack in LIFO order. + * + * Zend_View::_addPath($type, 'dirname') adds one directory + * to the path stack. + * + * Zend_View::_addPath($type, $array) adds one directory for + * each array element value. + * + * In the case of filter and helper paths, $prefix should be used to + * specify what class prefix to use with the given path. + * + * @param string $type The path type ('script', 'helper', or 'filter'). + * @param string|array $path The path specification. + * @param string $prefix Class prefix to use with path (helpers and filters + * only) + * @return void + */ + private function _addPath($type, $path, $prefix = null) + { + foreach ((array) $path as $dir) { + // attempt to strip any possible separator and + // append the system directory separator + $dir = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $dir); + $dir = rtrim($dir, DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR) + . DIRECTORY_SEPARATOR; + + switch ($type) { + case 'script': + // add to the top of the stack. + array_unshift($this->_path[$type], $dir); + break; + case 'filter': + case 'helper': + default: + // add as array with prefix and dir keys + array_unshift($this->_path[$type], array('prefix' => $prefix, 'dir' => $dir)); + break; + } + } + } + + /** + * Resets the path stack for helpers and filters. + * + * @param string $type The path type ('helper' or 'filter'). + * @param string|array $path The directory (-ies) to set as the path. + * @param string $classPrefix Class prefix to apply to elements of $path + */ + private function _setPath($type, $path, $classPrefix = null) + { + $dir = DIRECTORY_SEPARATOR . ucfirst($type) . DIRECTORY_SEPARATOR; + + switch ($type) { + case 'script': + $this->_path[$type] = array(dirname(__FILE__) . $dir); + $this->_addPath($type, $path); + break; + case 'filter': + case 'helper': + default: + $this->_path[$type] = array(array( + 'prefix' => 'Zend_View_' . ucfirst($type) . '_', + 'dir' => dirname(__FILE__) . $dir + )); + $this->_addPath($type, $path, $classPrefix); + break; + } + } + + /** + * Return all paths for a given path type + * + * @param string $type The path type ('helper', 'filter', 'script') + * @return array + */ + private function _getPaths($type) + { + return $this->_path[$type]; + } + + /** + * Register helper class as loaded + * + * @param string $name + * @param string $class + * @param string $file path to class file + * @return void + */ + private function _setHelperClass($name, $class, $file) + { + $this->_helperLoadedDir[$name] = $file; + $this->_helperLoaded[$name] = $class; + } + + /** + * Register filter class as loaded + * + * @param string $name + * @param string $class + * @param string $file path to class file + * @return void + */ + private function _setFilterClass($name, $class, $file) + { + $this->_filterLoadedDir[$name] = $file; + $this->_filterLoaded[$name] = $class; + } + + /** + * Add a prefixPath for a plugin type + * + * @param string $type + * @param string $classPrefix + * @param array $paths + * @return Zend_View_Abstract + */ + private function _addPluginPath($type, $classPrefix, array $paths) + { + $loader = $this->getPluginLoader($type); + foreach ($paths as $path) { + $loader->addPrefixPath($classPrefix, $path); + } + return $this; + } + + /** + * Get a path to a given plugin class of a given type + * + * @param string $type + * @param string $name + * @return string|false + */ + private function _getPluginPath($type, $name) + { + $loader = $this->getPluginLoader($type); + if ($loader->isLoaded($name)) { + return $loader->getClassPath($name); + } + + try { + $loader->load($name); + return $loader->getClassPath($name); + } catch (Zend_Loader_Exception $e) { + return false; + } + } + + /** + * Retrieve a plugin object + * + * @param string $type + * @param string $name + * @return object + */ + private function _getPlugin($type, $name) + { + $name = ucfirst($name); + switch ($type) { + case 'filter': + $storeVar = '_filterClass'; + $store = $this->_filterClass; + break; + case 'helper': + $storeVar = '_helper'; + $store = $this->_helper; + break; + } + + if (!isset($store[$name])) { + $class = $this->getPluginLoader($type)->load($name); + $store[$name] = new $class(); + if (method_exists($store[$name], 'setView')) { + $store[$name]->setView($this); + } + } + + $this->$storeVar = $store; + return $store[$name]; + } + + /** + * Use to include the view script in a scope that only allows public + * members. + * + * @return mixed + */ + abstract protected function _run(); +} diff --git a/lib/zend/Zend/View/Exception.php b/lib/zend/Zend/View/Exception.php new file mode 100644 index 0000000000..bc879cd98f --- /dev/null +++ b/lib/zend/Zend/View/Exception.php @@ -0,0 +1,51 @@ +view = $view; + parent::__construct($message); + } + + public function getView() + { + return $this->view; + } +} diff --git a/lib/zend/Zend/View/Helper/Abstract.php b/lib/zend/Zend/View/Helper/Abstract.php new file mode 100644 index 0000000000..c928075b78 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Abstract.php @@ -0,0 +1,64 @@ +view = $view; + return $this; + } + + /** + * Strategy pattern: currently unutilized + * + * @return void + */ + public function direct() + { + } +} diff --git a/lib/zend/Zend/View/Helper/Action.php b/lib/zend/Zend/View/Helper/Action.php new file mode 100644 index 0000000000..326de4fcd1 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Action.php @@ -0,0 +1,160 @@ +getControllerDirectory(); + if (empty($modules)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Action helper depends on valid front controller instance'); + } + + $request = $front->getRequest(); + $response = $front->getResponse(); + + if (empty($request) || empty($response)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Action view helper requires both a registered request and response object in the front controller instance'); + } + + $this->request = clone $request; + $this->response = clone $response; + $this->dispatcher = clone $front->getDispatcher(); + $this->defaultModule = $front->getDefaultModule(); + } + + /** + * Reset object states + * + * @return void + */ + public function resetObjects() + { + $params = $this->request->getUserParams(); + foreach (array_keys($params) as $key) { + $this->request->setParam($key, null); + } + + $this->response->clearBody(); + $this->response->clearHeaders() + ->clearRawHeaders(); + } + + /** + * Retrieve rendered contents of a controller action + * + * If the action results in a forward or redirect, returns empty string. + * + * @param string $action + * @param string $controller + * @param string $module Defaults to default module + * @param array $params + * @return string + */ + public function action($action, $controller, $module = null, array $params = array()) + { + $this->resetObjects(); + if (null === $module) { + $module = $this->defaultModule; + } + + // clone the view object to prevent over-writing of view variables + $viewRendererObj = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); + Zend_Controller_Action_HelperBroker::addHelper(clone $viewRendererObj); + + $this->request->setParams($params) + ->setModuleName($module) + ->setControllerName($controller) + ->setActionName($action) + ->setDispatched(true); + + $this->dispatcher->dispatch($this->request, $this->response); + + // reset the viewRenderer object to it's original state + Zend_Controller_Action_HelperBroker::addHelper($viewRendererObj); + + + if (!$this->request->isDispatched() + || $this->response->isRedirect()) + { + // forwards and redirects render nothing + return ''; + } + + $return = $this->response->getBody(); + $this->resetObjects(); + return $return; + } + + /** + * Clone the current View + * + * @return Zend_View_Interface + */ + public function cloneView() + { + $view = clone $this->view; + $view->clearVars(); + return $view; + } +} diff --git a/lib/zend/Zend/View/Helper/BaseUrl.php b/lib/zend/Zend/View/Helper/BaseUrl.php new file mode 100644 index 0000000000..9a0f3f4645 --- /dev/null +++ b/lib/zend/Zend/View/Helper/BaseUrl.php @@ -0,0 +1,116 @@ +getBaseUrl(); + + // Remove trailing slashes + if (null !== $file) { + $file = '/' . ltrim($file, '/\\'); + } + + return $baseUrl . $file; + } + + /** + * Set BaseUrl + * + * @param string $base + * @return Zend_View_Helper_BaseUrl + */ + public function setBaseUrl($base) + { + $this->_baseUrl = rtrim($base, '/\\'); + return $this; + } + + /** + * Get BaseUrl + * + * @return string + */ + public function getBaseUrl() + { + if ($this->_baseUrl === null) { + /** @see Zend_Controller_Front */ + require_once 'Zend/Controller/Front.php'; + $baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl(); + + // Remove scriptname, eg. index.php from baseUrl + $baseUrl = $this->_removeScriptName($baseUrl); + + $this->setBaseUrl($baseUrl); + } + + return $this->_baseUrl; + } + + /** + * Remove Script filename from baseurl + * + * @param string $url + * @return string + */ + protected function _removeScriptName($url) + { + if (!isset($_SERVER['SCRIPT_NAME'])) { + // We can't do much now can we? (Well, we could parse out by ".") + return $url; + } + + if (($pos = strripos($url, basename($_SERVER['SCRIPT_NAME']))) !== false) { + $url = substr($url, 0, $pos); + } + + return $url; + } +} diff --git a/lib/zend/Zend/View/Helper/Cycle.php b/lib/zend/Zend/View/Helper/Cycle.php new file mode 100644 index 0000000000..f6633b11b2 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Cycle.php @@ -0,0 +1,226 @@ +-1) ; + + /** + * Array of values + * + * @var array + */ + protected $_data = array(self::DEFAULT_NAME=>array()); + + /** + * Actual name of cycle + * + * @var string + */ + protected $_name = self::DEFAULT_NAME; + + /** + * Add elements to alternate + * + * @param array $data + * @param string $name + * @return Zend_View_Helper_Cycle + */ + public function cycle(array $data = array(), $name = self::DEFAULT_NAME) + { + if(!empty($data)) + $this->_data[$name] = $data; + + $this->setName($name); + return $this; + } + + /** + * Add elements to alternate + * + * @param array $data + * @param string $name + * @return Zend_View_Helper_Cycle + */ + public function assign(Array $data , $name = self::DEFAULT_NAME) + { + $this->setName($name); + $this->_data[$name] = $data; + $this->rewind(); + return $this; + } + + /** + * Sets actual name of cycle + * + * @param $name + * @return Zend_View_Helper_Cycle + */ + public function setName($name = self::DEFAULT_NAME) + { + $this->_name = $name; + + if(!isset($this->_data[$this->_name])) + $this->_data[$this->_name] = array(); + + if(!isset($this->_pointers[$this->_name])) + $this->rewind(); + + return $this; + } + + /** + * Gets actual name of cycle + * + * @param $name + * @return string + */ + public function getName() + { + return $this->_name; + } + + + /** + * Return all elements + * + * @return array + */ + public function getAll() + { + return $this->_data[$this->_name]; + } + + /** + * Turn helper into string + * + * @return string + */ + public function toString() + { + return (string) $this->_data[$this->_name][$this->key()]; + } + + /** + * Cast to string + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Move to next value + * + * @return Zend_View_Helper_Cycle + */ + public function next() + { + $count = count($this->_data[$this->_name]); + if ($this->_pointers[$this->_name] == ($count - 1)) + $this->_pointers[$this->_name] = 0; + else + $this->_pointers[$this->_name] = ++$this->_pointers[$this->_name]; + return $this; + } + + /** + * Move to previous value + * + * @return Zend_View_Helper_Cycle + */ + public function prev() + { + $count = count($this->_data[$this->_name]); + if ($this->_pointers[$this->_name] <= 0) + $this->_pointers[$this->_name] = $count - 1; + else + $this->_pointers[$this->_name] = --$this->_pointers[$this->_name]; + return $this; + } + + /** + * Return iteration number + * + * @return int + */ + public function key() + { + if ($this->_pointers[$this->_name] < 0) + return 0; + else + return $this->_pointers[$this->_name]; + } + + /** + * Rewind pointer + * + * @return Zend_View_Helper_Cycle + */ + public function rewind() + { + $this->_pointers[$this->_name] = -1; + return $this; + } + + /** + * Check if element is valid + * + * @return bool + */ + public function valid() + { + return isset($this->_data[$this->_name][$this->key()]); + } + + /** + * Return current element + * + * @return mixed + */ + public function current() + { + return $this->_data[$this->_name][$this->key()]; + } +} diff --git a/lib/zend/Zend/View/Helper/DeclareVars.php b/lib/zend/Zend/View/Helper/DeclareVars.php new file mode 100644 index 0000000000..adb2a08b98 --- /dev/null +++ b/lib/zend/Zend/View/Helper/DeclareVars.php @@ -0,0 +1,95 @@ + + * $this->declareVars( + * 'varName1', + * 'varName2', + * array('varName3' => 'defaultValue', + * 'varName4' => array() + * ) + * ); + * + * + * @param string|array variable number of arguments, all string names of variables to test + * @return void + */ + public function declareVars() + { + $args = func_get_args(); + foreach($args as $key) { + if (is_array($key)) { + foreach ($key as $name => $value) { + $this->_declareVar($name, $value); + } + } else if (!isset($view->$key)) { + $this->_declareVar($key); + } + } + } + + /** + * Set a view variable + * + * Checks to see if a $key is set in the view object; if not, sets it to $value. + * + * @param string $key + * @param string $value Defaults to an empty string + * @return void + */ + protected function _declareVar($key, $value = '') + { + if (!isset($this->view->$key)) { + $this->view->$key = $value; + } + } +} diff --git a/lib/zend/Zend/View/Helper/Doctype.php b/lib/zend/Zend/View/Helper/Doctype.php new file mode 100644 index 0000000000..16ca0cc70a --- /dev/null +++ b/lib/zend/Zend/View/Helper/Doctype.php @@ -0,0 +1,195 @@ +_regKey)) { + $this->_registry = new ArrayObject(array( + 'doctypes' => array( + self::XHTML11 => '', + self::XHTML1_STRICT => '', + self::XHTML1_TRANSITIONAL => '', + self::XHTML1_FRAMESET => '', + self::XHTML_BASIC1 => '', + self::HTML4_STRICT => '', + self::HTML4_LOOSE => '', + self::HTML4_FRAMESET => '', + self::HTML5 => '', + ) + )); + Zend_Registry::set($this->_regKey, $this->_registry); + $this->setDoctype($this->_defaultDoctype); + } else { + $this->_registry = Zend_Registry::get($this->_regKey); + } + } + + /** + * Set or retrieve doctype + * + * @param string $doctype + * @return Zend_View_Helper_Doctype + */ + public function doctype($doctype = null) + { + if (null !== $doctype) { + switch ($doctype) { + case self::XHTML11: + case self::XHTML1_STRICT: + case self::XHTML1_TRANSITIONAL: + case self::XHTML1_FRAMESET: + case self::XHTML_BASIC1: + case self::HTML4_STRICT: + case self::HTML4_LOOSE: + case self::HTML4_FRAMESET: + case self::HTML5: + $this->setDoctype($doctype); + break; + default: + if (substr($doctype, 0, 9) != 'setDoctype($type); + $this->_registry['doctypes'][$type] = $doctype; + break; + } + } + + return $this; + } + + /** + * Set doctype + * + * @param string $doctype + * @return Zend_View_Helper_Doctype + */ + public function setDoctype($doctype) + { + $this->_registry['doctype'] = $doctype; + return $this; + } + + /** + * Retrieve doctype + * + * @return string + */ + public function getDoctype() + { + return $this->_registry['doctype']; + } + + /** + * Get doctype => string mappings + * + * @return array + */ + public function getDoctypes() + { + return $this->_registry['doctypes']; + } + + /** + * Is doctype XHTML? + * + * @return boolean + */ + public function isXhtml() + { + return (stristr($this->getDoctype(), 'xhtml') ? true : false); + } + + /** + * String representation of doctype + * + * @return string + */ + public function __toString() + { + $doctypes = $this->getDoctypes(); + return $doctypes[$this->getDoctype()]; + } +} diff --git a/lib/zend/Zend/View/Helper/Fieldset.php b/lib/zend/Zend/View/Helper/Fieldset.php new file mode 100644 index 0000000000..adbaa69008 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Fieldset.php @@ -0,0 +1,79 @@ +_getInfo($name, $content, $attribs); + extract($info); + + // get legend + $legend = ''; + if (isset($attribs['legend'])) { + $legendString = trim($attribs['legend']); + if (!empty($legendString)) { + $legend = '' + . (($escape) ? $this->view->escape($legendString) : $legendString) + . '' . PHP_EOL; + } + unset($attribs['legend']); + } + + // get id + if (!empty($id)) { + $id = ' id="' . $this->view->escape($id) . '"'; + } else { + $id = ''; + } + + // render fieldset + $xhtml = '_htmlAttribs($attribs) + . '>' + . $legend + . $content + . ''; + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/Form.php b/lib/zend/Zend/View/Helper/Form.php new file mode 100644 index 0000000000..296fdbd6db --- /dev/null +++ b/lib/zend/Zend/View/Helper/Form.php @@ -0,0 +1,71 @@ +_getInfo($name, $content, $attribs); + extract($info); + + if (!empty($id)) { + $id = ' id="' . $this->view->escape($id) . '"'; + } else { + $id = ''; + } + + if (array_key_exists('id', $attribs) && empty($attribs['id'])) { + unset($attribs['id']); + } + + $xhtml = '_htmlAttribs($attribs) + . '>'; + + if (false !== $content) { + $xhtml .= $content + . ''; + } + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/FormButton.php b/lib/zend/Zend/View/Helper/FormButton.php new file mode 100644 index 0000000000..415d3b6217 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormButton.php @@ -0,0 +1,105 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, id, value, attribs, options, listsep, disable + + // Get content + $content = ''; + if (isset($attribs['content'])) { + $content = $attribs['content']; + unset($attribs['content']); + } else { + $content = $value; + } + + // Ensure type is sane + $type = 'button'; + if (isset($attribs['type'])) { + $attribs['type'] = strtolower($attribs['type']); + if (in_array($attribs['type'], array('submit', 'reset', 'button'))) { + $type = $attribs['type']; + } + unset($attribs['type']); + } + + // build the element + if ($disable) { + $attribs['disabled'] = 'disabled'; + } + + $content = ($escape) ? $this->view->escape($content) : $content; + + $xhtml = 'view->escape($value) . '"'; + } + + // add attributes and close start tag + $xhtml .= $this->_htmlAttribs($attribs) . '>'; + + // add content and end tag + $xhtml .= $content . ''; + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/FormCheckbox.php b/lib/zend/Zend/View/Helper/FormCheckbox.php new file mode 100644 index 0000000000..08a5cdd8b9 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormCheckbox.php @@ -0,0 +1,163 @@ + '1', + 'uncheckedValue' => '0' + ); + + /** + * Generates a 'checkbox' element. + * + * @access public + * + * @param string|array $name If a string, the element name. If an + * array, all other parameters are ignored, and the array elements + * are extracted in place of added parameters. + * @param mixed $value The element value. + * @param array $attribs Attributes for the element tag. + * @return string The element XHTML. + */ + public function formCheckbox($name, $value = null, $attribs = null, array $checkedOptions = null) + { + $info = $this->_getInfo($name, $value, $attribs); + extract($info); // name, id, value, attribs, options, listsep, disable + + $checked = false; + if (isset($attribs['checked']) && $attribs['checked']) { + $checked = true; + unset($attribs['checked']); + } elseif (isset($attribs['checked'])) { + $checked = false; + unset($attribs['checked']); + } + + $checkedOptions = self::determineCheckboxInfo($value, $checked, $checkedOptions); + + // is the element disabled? + $disabled = ''; + if ($disable) { + $disabled = ' disabled="disabled"'; + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // build the element + $xhtml = ''; + if (!strstr($name, '[]')) { + $xhtml = $this->_hidden($name, $checkedOptions['uncheckedValue']); + } + $xhtml .= '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } + + /** + * Determine checkbox information + * + * @param string $value + * @param bool $checked + * @param array|null $checkedOptions + * @return array + */ + public static function determineCheckboxInfo($value, $checked, array $checkedOptions = null) + { + // Checked/unchecked values + $checkedValue = null; + $uncheckedValue = null; + if (is_array($checkedOptions)) { + if (array_key_exists('checkedValue', $checkedOptions)) { + $checkedValue = (string) $checkedOptions['checkedValue']; + unset($checkedOptions['checkedValue']); + } + if (array_key_exists('uncheckedValue', $checkedOptions)) { + $uncheckedValue = (string) $checkedOptions['uncheckedValue']; + unset($checkedOptions['uncheckedValue']); + } + if (null === $checkedValue) { + $checkedValue = array_shift($checkedOptions); + } + if (null === $uncheckedValue) { + $uncheckedValue = array_shift($checkedOptions); + } + } elseif ($value !== null) { + $uncheckedValue = self::$_defaultCheckedOptions['uncheckedValue']; + } else { + $checkedValue = self::$_defaultCheckedOptions['checkedValue']; + $uncheckedValue = self::$_defaultCheckedOptions['uncheckedValue']; + } + + // is the element checked? + $checkedString = ''; + if ($checked || ($value === $checkedValue)) { + $checkedString = ' checked="checked"'; + $checked = true; + } else { + $checked = false; + } + + // Checked value should be value if no checked options provided + if ($checkedValue == null) { + $checkedValue = $value; + } + + return array( + 'checked' => $checked, + 'checkedString' => $checkedString, + 'checkedValue' => $checkedValue, + 'uncheckedValue' => $uncheckedValue, + ); + } +} diff --git a/lib/zend/Zend/View/Helper/FormElement.php b/lib/zend/Zend/View/Helper/FormElement.php new file mode 100644 index 0000000000..32a6b8c79f --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormElement.php @@ -0,0 +1,202 @@ +_translator; + } + + /** + * Set translator + * + * @param $translator|null Zend_Translate + * @return Zend_View_Helper_FormElement + */ + public function setTranslator($translator = null) + { + if (null === $translator) { + $this->_translator = null; + } elseif ($translator instanceof Zend_Translate_Adapter) { + $this->_translator = $translator; + } elseif ($translator instanceof Zend_Translate) { + $this->_translator = $translator->getAdapter(); + } else { + require_once 'Zend/Form/Exception.php'; + throw new Zend_Form_Exception('Invalid translator specified'); + } + return $this; + } + + /** + * Converts parameter arguments to an element info array. + * + * E.g, formExample($name, $value, $attribs, $options, $listsep) is + * the same thing as formExample(array('name' => ...)). + * + * Note that you cannot pass a 'disable' param; you need to pass + * it as an 'attribs' key. + * + * @access protected + * + * @return array An element info array with keys for name, value, + * attribs, options, listsep, disable, and escape. + */ + protected function _getInfo($name, $value = null, $attribs = null, + $options = null, $listsep = null + ) { + // the baseline info. note that $name serves a dual purpose; + // if an array, it's an element info array that will override + // these baseline values. as such, ignore it for the 'name' + // if it's an array. + $info = array( + 'name' => is_array($name) ? '' : $name, + 'id' => is_array($name) ? '' : $name, + 'value' => $value, + 'attribs' => $attribs, + 'options' => $options, + 'listsep' => $listsep, + 'disable' => false, + 'escape' => true, + ); + + // override with named args + if (is_array($name)) { + // only set keys that are already in info + foreach ($info as $key => $val) { + if (isset($name[$key])) { + $info[$key] = $name[$key]; + } + } + } + + // force attribs to an array, per note from Orjan Persson. + settype($info['attribs'], 'array'); + + // Normalize readonly tag + if (isset($info['attribs']['readonly']) + && $info['attribs']['readonly'] != 'readonly') + { + $info['attribs']['readonly'] = 'readonly'; + } + + // Disable attribute + if (isset($info['attribs']['disable']) + && is_scalar($info['attribs']['disable'])) + { + // disable the element + $info['disable'] = (bool)$info['attribs']['disable']; + unset($info['attribs']['disable']); + } elseif (isset($info['attribs']['disable']) + && is_array($info['attribs']['disable'])) + { + $info['disable'] = $info['attribs']['disable']; + unset($info['attribs']['disable']); + } + + // Set ID for element + if (isset($info['attribs']['id'])) { + $info['id'] = (string) $info['attribs']['id']; + } elseif (!isset($info['attribs']['id']) && !empty($info['name'])) { + $id = $info['name']; + if (substr($id, -2) == '[]') { + $id = substr($id, 0, strlen($id) - 2); + } + if (strstr($id, ']')) { + $id = trim($id, ']'); + $id = str_replace('][', '-', $id); + $id = str_replace('[', '-', $id); + } + $info['id'] = $id; + } + + // Determine escaping from attributes + if (isset($info['attribs']['escape'])) { + $info['escape'] = (bool) $info['attribs']['escape']; + } + + // Determine listsetp from attributes + if (isset($info['attribs']['listsep'])) { + $info['listsep'] = (string) $info['attribs']['listsep']; + } + + // Remove attribs that might overwrite the other keys. We do this LAST + // because we needed the other attribs values earlier. + foreach ($info as $key => $val) { + if (isset($info['attribs'][$key])) { + unset($info['attribs'][$key]); + } + } + + // done! + return $info; + } + + /** + * Creates a hidden element. + * + * We have this as a common method because other elements often + * need hidden elements for their operation. + * + * @access protected + * + * @param $name The element name. + * + * @param $value The element value. + * + * @param $attribs Attributes for the element. + * + * @return string A hidden element. + */ + protected function _hidden($name, $value = null, $attribs = null) + { + return '_htmlAttribs($attribs) . $this->getClosingBracket(); + } +} diff --git a/lib/zend/Zend/View/Helper/FormErrors.php b/lib/zend/Zend/View/Helper/FormErrors.php new file mode 100644 index 0000000000..134fb47ce6 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormErrors.php @@ -0,0 +1,157 @@ +
    '; + protected $_htmlElementStart = '
  • '; + protected $_htmlElementSeparator = '
  • '; + /**#@-*/ + + /** + * Render form errors + * + * @param string|array $errors Error(s) to render + * @param array $options + * @return string + */ + public function formErrors($errors, array $options = null) + { + $escape = true; + if (isset($options['escape'])) { + $escape = (bool) $options['escape']; + unset($options['escape']); + } + + if (empty($options['class'])) { + $options['class'] = 'errors'; + } + + $start = $this->getElementStart(); + if (strstr($start, '%s')) { + $attribs = $this->_htmlAttribs($options); + $start = sprintf($start, $attribs); + } + + if ($escape) { + foreach ($errors as $key => $error) { + $errors[$key] = $this->view->escape($error); + } + } + + $html = $start + . implode($this->getElementSeparator(), (array) $errors) + . $this->getElementEnd(); + + return $html; + } + + /** + * Set end string for displaying errors + * + * @param string $string + * @return Zend_View_Helper_FormErrors + */ + public function setElementEnd($string) + { + $this->_htmlElementEnd = (string) $string; + return $this; + } + + /** + * Retrieve end string for displaying errors + * + * @return string + */ + public function getElementEnd() + { + return $this->_htmlElementEnd; + } + + /** + * Set separator string for displaying errors + * + * @param string $string + * @return Zend_View_Helper_FormErrors + */ + public function setElementSeparator($string) + { + $this->_htmlElementSeparator = (string) $string; + return $this; + } + + /** + * Retrieve separator string for displaying errors + * + * @return string + */ + public function getElementSeparator() + { + return $this->_htmlElementSeparator; + } + + /** + * Set start string for displaying errors + * + * @param string $string + * @return Zend_View_Helper_FormErrors + */ + public function setElementStart($string) + { + $this->_htmlElementStart = (string) $string; + return $this; + } + + /** + * Retrieve start string for displaying errors + * + * @return string + */ + public function getElementStart() + { + return $this->_htmlElementStart; + } + +} diff --git a/lib/zend/Zend/View/Helper/FormFile.php b/lib/zend/Zend/View/Helper/FormFile.php new file mode 100644 index 0000000000..30a5a65007 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormFile.php @@ -0,0 +1,81 @@ +_getInfo($name, null, $attribs); + extract($info); // name, id, value, attribs, options, listsep, disable + + // is it disabled? + $disabled = ''; + if ($disable) { + $disabled = ' disabled="disabled"'; + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // build the element + $xhtml = '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/FormHidden.php b/lib/zend/Zend/View/Helper/FormHidden.php new file mode 100644 index 0000000000..8a8a4ab4c2 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormHidden.php @@ -0,0 +1,66 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + if (isset($id)) { + if (isset($attribs) && is_array($attribs)) { + $attribs['id'] = $id; + } else { + $attribs = array('id' => $id); + } + } + return $this->_hidden($name, $value, $attribs); + } +} diff --git a/lib/zend/Zend/View/Helper/FormImage.php b/lib/zend/Zend/View/Helper/FormImage.php new file mode 100644 index 0000000000..1217b8cc35 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormImage.php @@ -0,0 +1,101 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // Determine if we should use the value or the src attribute + if (isset($attribs['src'])) { + $src = ' src="' . $this->view->escape($attribs['src']) . '"'; + unset($attribs['src']); + } else { + $src = ' src="' . $this->view->escape($value) . '"'; + unset($value); + } + + // Do we have a value? + if (isset($value) && !empty($value)) { + $value = ' value="' . $this->view->escape($value) . '"'; + } else { + $value = ''; + } + + // Disabled? + $disabled = ''; + if ($disable) { + $disabled = ' disabled="disabled"'; + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // build the element + $xhtml = '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/FormLabel.php b/lib/zend/Zend/View/Helper/FormLabel.php new file mode 100644 index 0000000000..41403bdeb2 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormLabel.php @@ -0,0 +1,66 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable, escape + + // build the element + if ($disable) { + // disabled; display nothing + $xhtml = ''; + } else { + $value = ($escape) ? $this->view->escape($value) : $value; + + // enabled; display label + $xhtml = '_htmlAttribs($attribs) + . '>' . $value . ''; + } + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/FormMultiCheckbox.php b/lib/zend/Zend/View/Helper/FormMultiCheckbox.php new file mode 100644 index 0000000000..0f00ca9fbf --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormMultiCheckbox.php @@ -0,0 +1,74 @@ +\n") + { + return $this->formRadio($name, $value, $attribs, $options, $listsep); + } +} diff --git a/lib/zend/Zend/View/Helper/FormNote.php b/lib/zend/Zend/View/Helper/FormNote.php new file mode 100644 index 0000000000..ce30e714c2 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormNote.php @@ -0,0 +1,61 @@ +_getInfo($name, $value); + extract($info); // name, value, attribs, options, listsep, disable + return $value; + } +} diff --git a/lib/zend/Zend/View/Helper/FormPassword.php b/lib/zend/Zend/View/Helper/FormPassword.php new file mode 100644 index 0000000000..937b508773 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormPassword.php @@ -0,0 +1,95 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // is it disabled? + $disabled = ''; + if ($disable) { + // disabled + $disabled = ' disabled="disabled"'; + } + + // determine the XHTML value + $valueString = ' value=""'; + if (array_key_exists('renderPassword', $attribs)) { + if ($attribs['renderPassword']) { + $valueString = ' value="' . $this->view->escape($value) . '"'; + } + unset($attribs['renderPassword']); + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // render the element + $xhtml = '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } + +} diff --git a/lib/zend/Zend/View/Helper/FormRadio.php b/lib/zend/Zend/View/Helper/FormRadio.php new file mode 100644 index 0000000000..198f44b40a --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormRadio.php @@ -0,0 +1,183 @@ +\n") + { + + $info = $this->_getInfo($name, $value, $attribs, $options, $listsep); + extract($info); // name, value, attribs, options, listsep, disable + + // retrieve attributes for labels (prefixed with 'label_' or 'label') + $label_attribs = array(); + foreach ($attribs as $key => $val) { + $tmp = false; + $keyLen = strlen($key); + if ((6 < $keyLen) && (substr($key, 0, 6) == 'label_')) { + $tmp = substr($key, 6); + } elseif ((5 < $keyLen) && (substr($key, 0, 5) == 'label')) { + $tmp = substr($key, 5); + } + + if ($tmp) { + // make sure first char is lowercase + $tmp[0] = strtolower($tmp[0]); + $label_attribs[$tmp] = $val; + unset($attribs[$key]); + } + } + + $labelPlacement = 'append'; + foreach ($label_attribs as $key => $val) { + switch (strtolower($key)) { + case 'placement': + unset($label_attribs[$key]); + $val = strtolower($val); + if (in_array($val, array('prepend', 'append'))) { + $labelPlacement = $val; + } + break; + } + } + + // the radio button values and labels + $options = (array) $options; + + // build the element + $xhtml = ''; + $list = array(); + + // should the name affect an array collection? + $name = $this->view->escape($name); + if ($this->_isArray && ('[]' != substr($name, -2))) { + $name .= '[]'; + } + + // ensure value is an array to allow matching multiple times + $value = (array) $value; + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // add radio buttons to the list. + require_once 'Zend/Filter/Alnum.php'; + $filter = new Zend_Filter_Alnum(); + foreach ($options as $opt_value => $opt_label) { + + // Should the label be escaped? + if ($escape) { + $opt_label = $this->view->escape($opt_label); + } + + // is it disabled? + $disabled = ''; + if (true === $disable) { + $disabled = ' disabled="disabled"'; + } elseif (is_array($disable) && in_array($opt_value, $disable)) { + $disabled = ' disabled="disabled"'; + } + + // is it checked? + $checked = ''; + if (in_array($opt_value, $value)) { + $checked = ' checked="checked"'; + } + + // generate ID + $optId = $id . '-' . $filter->filter($opt_value); + + // Wrap the radios in labels + $radio = '_htmlAttribs($label_attribs) . ' for="' . $optId . '">' + . (('prepend' == $labelPlacement) ? $opt_label : '') + . '_htmlAttribs($attribs) + . $endTag + . (('append' == $labelPlacement) ? $opt_label : '') + . ''; + + // add to the array of radio buttons + $list[] = $radio; + } + + // done! + $xhtml .= implode($listsep, $list); + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/FormReset.php b/lib/zend/Zend/View/Helper/FormReset.php new file mode 100644 index 0000000000..f321cfaae4 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormReset.php @@ -0,0 +1,88 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // check if disabled + $disabled = ''; + if ($disable) { + $disabled = ' disabled="disabled"'; + } + + // get closing tag + $endTag = '>'; + if ($this->view->doctype()->isXhtml()) { + $endTag = ' />'; + } + + // Render button + $xhtml = 'view->escape($value) . '"'; + } + + // add attributes, close, and return + $xhtml .= $this->_htmlAttribs($attribs) . $endTag; + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/FormSelect.php b/lib/zend/Zend/View/Helper/FormSelect.php new file mode 100644 index 0000000000..b61d16e761 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormSelect.php @@ -0,0 +1,178 @@ +\n") + { + $info = $this->_getInfo($name, $value, $attribs, $options, $listsep); + extract($info); // name, id, value, attribs, options, listsep, disable + + // force $value to array so we can compare multiple values to multiple + // options; also ensure it's a string for comparison purposes. + $value = array_map('strval', (array) $value); + + // check if element may have multiple values + $multiple = ''; + + if (substr($name, -2) == '[]') { + // multiple implied by the name + $multiple = ' multiple="multiple"'; + } + + if (isset($attribs['multiple'])) { + // Attribute set + if ($attribs['multiple']) { + // True attribute; set multiple attribute + $multiple = ' multiple="multiple"'; + + // Make sure name indicates multiple values are allowed + if (!empty($multiple) && (substr($name, -2) != '[]')) { + $name .= '[]'; + } + } else { + // False attribute; ensure attribute not set + $multiple = ''; + } + unset($attribs['multiple']); + } + + // now start building the XHTML. + $disabled = ''; + if (true === $disable) { + $disabled = ' disabled="disabled"'; + } + + // Build the surrounding select element first. + $xhtml = '_htmlAttribs($attribs) + . ">\n "; + + // build the list of options + $list = array(); + $translator = $this->getTranslator(); + foreach ((array) $options as $opt_value => $opt_label) { + if (is_array($opt_label)) { + $opt_disable = ''; + if (is_array($disable) && in_array($opt_value, $disable)) { + $opt_disable = ' disabled="disabled"'; + } + if (null !== $translator) { + $opt_value = $translator->translate($opt_value); + } + $list[] = ''; + foreach ($opt_label as $val => $lab) { + $list[] = $this->_build($val, $lab, $value, $disable); + } + $list[] = ''; + } else { + $list[] = $this->_build($opt_value, $opt_label, $value, $disable); + } + } + + // add the options to the xhtml and close the select + $xhtml .= implode("\n ", $list) . "\n"; + + return $xhtml; + } + + /** + * Builds the actual "; + + return $opt; + } + +} diff --git a/lib/zend/Zend/View/Helper/FormSubmit.php b/lib/zend/Zend/View/Helper/FormSubmit.php new file mode 100644 index 0000000000..189daa72b3 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormSubmit.php @@ -0,0 +1,84 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // check if disabled + $disabled = ''; + if ($disable) { + $disabled = ' disabled="disabled"'; + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + // Render the button. + $xhtml = '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/FormText.php b/lib/zend/Zend/View/Helper/FormText.php new file mode 100644 index 0000000000..8574acd7c9 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormText.php @@ -0,0 +1,84 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // build the element + $disabled = ''; + if ($disable) { + // disabled + $disabled = ' disabled="disabled"'; + } + + // XHTML or HTML end tag? + $endTag = ' />'; + if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { + $endTag= '>'; + } + + $xhtml = '_htmlAttribs($attribs) + . $endTag; + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/FormTextarea.php b/lib/zend/Zend/View/Helper/FormTextarea.php new file mode 100644 index 0000000000..7664016222 --- /dev/null +++ b/lib/zend/Zend/View/Helper/FormTextarea.php @@ -0,0 +1,104 @@ +_getInfo($name, $value, $attribs); + extract($info); // name, value, attribs, options, listsep, disable + + // is it disabled? + $disabled = ''; + if ($disable) { + // disabled. + $disabled = ' disabled="disabled"'; + } + + // Make sure that there are 'rows' and 'cols' values + // as required by the spec. noted by Orjan Persson. + if (empty($attribs['rows'])) { + $attribs['rows'] = (int) $this->rows; + } + if (empty($attribs['cols'])) { + $attribs['cols'] = (int) $this->cols; + } + + // build the element + $xhtml = ''; + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/HeadLink.php b/lib/zend/Zend/View/Helper/HeadLink.php new file mode 100644 index 0000000000..b4114f15d5 --- /dev/null +++ b/lib/zend/Zend/View/Helper/HeadLink.php @@ -0,0 +1,425 @@ +setSeparator(PHP_EOL); + } + + /** + * headLink() - View Helper Method + * + * Returns current object instance. Optionally, allows passing array of + * values to build link. + * + * @return Zend_View_Helper_HeadLink + */ + public function headLink(array $attributes = null, $placement = Zend_View_Helper_Placeholder_Container_Abstract::APPEND) + { + if (null !== $attributes) { + $item = $this->createData($attributes); + switch ($placement) { + case Zend_View_Helper_Placeholder_Container_Abstract::SET: + $this->set($item); + break; + case Zend_View_Helper_Placeholder_Container_Abstract::PREPEND: + $this->prepend($item); + break; + case Zend_View_Helper_Placeholder_Container_Abstract::APPEND: + default: + $this->append($item); + break; + } + } + return $this; + } + + /** + * Overload method access + * + * Creates the following virtual methods: + * - appendStylesheet($href, $media, $conditionalStylesheet, $extras) + * - offsetSetStylesheet($index, $href, $media, $conditionalStylesheet, $extras) + * - prependStylesheet($href, $media, $conditionalStylesheet, $extras) + * - setStylesheet($href, $media, $conditionalStylesheet, $extras) + * - appendAlternate($href, $type, $title, $extras) + * - offsetSetAlternate($index, $href, $type, $title, $extras) + * - prependAlternate($href, $type, $title, $extras) + * - setAlternate($href, $type, $title, $extras) + * + * Items that may be added in the future: + * - Navigation? need to find docs on this + * - public function appendStart() + * - public function appendContents() + * - public function appendPrev() + * - public function appendNext() + * - public function appendIndex() + * - public function appendEnd() + * - public function appendGlossary() + * - public function appendAppendix() + * - public function appendHelp() + * - public function appendBookmark() + * - Other? + * - public function appendCopyright() + * - public function appendChapter() + * - public function appendSection() + * - public function appendSubsection() + * + * @param mixed $method + * @param mixed $args + * @return void + */ + public function __call($method, $args) + { + if (preg_match('/^(?Pset|(ap|pre)pend|offsetSet)(?PStylesheet|Alternate)$/', $method, $matches)) { + $argc = count($args); + $action = $matches['action']; + $type = $matches['type']; + $index = null; + + if ('offsetSet' == $action) { + if (0 < $argc) { + $index = array_shift($args); + --$argc; + } + } + + if (1 > $argc) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('%s requires at least one argument', $method)); + } + + if (is_array($args[0])) { + $item = $this->createData($args[0]); + } else { + $dataMethod = 'createData' . $type; + $item = $this->$dataMethod($args); + } + + if ($item) { + if ('offsetSet' == $action) { + $this->offsetSet($index, $item); + } else { + $this->$action($item); + } + } + + return $this; + } + + return parent::__call($method, $args); + } + + /** + * Check if value is valid + * + * @param mixed $value + * @return boolean + */ + protected function _isValid($value) + { + if (!$value instanceof stdClass) { + return false; + } + + $vars = get_object_vars($value); + $keys = array_keys($vars); + $intersection = array_intersect($this->_itemKeys, $keys); + if (empty($intersection)) { + return false; + } + + return true; + } + + /** + * append() + * + * @param array $value + * @return void + */ + public function append($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('append() expects a data token; please use one of the custom append*() methods'); + } + + return $this->getContainer()->append($value); + } + + /** + * offsetSet() + * + * @param string|int $index + * @param array $value + * @return void + */ + public function offsetSet($index, $value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('offsetSet() expects a data token; please use one of the custom offsetSet*() methods'); + } + + return $this->getContainer()->offsetSet($index, $value); + } + + /** + * prepend() + * + * @param array $value + * @return Zend_Layout_ViewHelper_HeadLink + */ + public function prepend($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('prepend() expects a data token; please use one of the custom prepend*() methods'); + } + + return $this->getContainer()->prepend($value); + } + + /** + * set() + * + * @param array $value + * @return Zend_Layout_ViewHelper_HeadLink + */ + public function set($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('set() expects a data token; please use one of the custom set*() methods'); + } + + return $this->getContainer()->set($value); + } + + + /** + * Create HTML link element from data item + * + * @param stdClass $item + * @return string + */ + public function itemToString(stdClass $item) + { + $attributes = (array) $item; + $link = '_itemKeys as $itemKey) { + if (isset($attributes[$itemKey])) { + if(is_array($attributes[$itemKey])) { + foreach($attributes[$itemKey] as $key => $value) { + $link .= sprintf('%s="%s" ', $key, ($this->_autoEscape) ? $this->_escape($value) : $value); + } + } else { + $link .= sprintf('%s="%s" ', $itemKey, ($this->_autoEscape) ? $this->_escape($attributes[$itemKey]) : $attributes[$itemKey]); + } + } + } + + if ($this->view instanceof Zend_View_Abstract) { + $link .= ($this->view->doctype()->isXhtml()) ? '/>' : '>'; + } else { + $link .= '/>'; + } + + if (($link == '') || ($link == '')) { + return ''; + } + + if (isset($attributes['conditionalStylesheet']) + && !empty($attributes['conditionalStylesheet']) + && is_string($attributes['conditionalStylesheet'])) + { + $link = ''; + } + + return $link; + } + + /** + * Render link elements as string + * + * @param string|int $indent + * @return string + */ + public function toString($indent = null) + { + $indent = (null !== $indent) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + $items = array(); + $this->getContainer()->ksort(); + foreach ($this as $item) { + $items[] = $this->itemToString($item); + } + + return $indent . implode($this->_escape($this->getSeparator()) . $indent, $items); + } + + /** + * Create data item for stack + * + * @param array $attributes + * @return stdClass + */ + public function createData(array $attributes) + { + $data = (object) $attributes; + return $data; + } + + /** + * Create item for stylesheet link item + * + * @param array $args + * @return stdClass|false Returns fals if stylesheet is a duplicate + */ + public function createDataStylesheet(array $args) + { + $rel = 'stylesheet'; + $type = 'text/css'; + $media = 'screen'; + $conditionalStylesheet = false; + $href = array_shift($args); + + if ($this->_isDuplicateStylesheet($href)) { + return false; + } + + if (0 < count($args)) { + $media = array_shift($args); + if(is_array($media)) { + $media = implode(',', $media); + } else { + $media = (string) $media; + } + } + if (0 < count($args)) { + $conditionalStylesheet = array_shift($args); + if(!empty($conditionalStylesheet) && is_string($conditionalStylesheet)) { + $conditionalStylesheet = (string) $conditionalStylesheet; + } else { + $conditionalStylesheet = null; + } + } + + if(0 < count($args) && is_array($args[0])) { + $extras = array_shift($args); + $extras = (array) $extras; + } + + $attributes = compact('rel', 'type', 'href', 'media', 'conditionalStylesheet', 'extras'); + return $this->createData($attributes); + } + + /** + * Is the linked stylesheet a duplicate? + * + * @param string $uri + * @return bool + */ + protected function _isDuplicateStylesheet($uri) + { + foreach ($this->getContainer() as $item) { + if (($item->rel == 'stylesheet') && ($item->href == $uri)) { + return true; + } + } + return false; + } + + /** + * Create item for alternate link item + * + * @param array $args + * @return stdClass + */ + public function createDataAlternate(array $args) + { + if (3 > count($args)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Alternate tags require 3 arguments; %s provided', count($args))); + } + + $rel = 'alternate'; + $href = array_shift($args); + $type = array_shift($args); + $title = array_shift($args); + + if(0 < count($args) && is_array($args[0])) { + $extras = array_shift($args); + $extras = (array) $extras; + + if(isset($extras['media']) && is_array($extras['media'])) { + $extras['media'] = implode(',', $extras['media']); + } + } + + $href = (string) $href; + $type = (string) $type; + $title = (string) $title; + + $attributes = compact('rel', 'href', 'type', 'title', 'extras'); + return $this->createData($attributes); + } +} diff --git a/lib/zend/Zend/View/Helper/HeadMeta.php b/lib/zend/Zend/View/Helper/HeadMeta.php new file mode 100644 index 0000000000..e7a3e7f0ee --- /dev/null +++ b/lib/zend/Zend/View/Helper/HeadMeta.php @@ -0,0 +1,363 @@ +setSeparator(PHP_EOL); + } + + /** + * Retrieve object instance; optionally add meta tag + * + * @param string $content + * @param string $keyValue + * @param string $keyType + * @param array $modifiers + * @param string $placement + * @return Zend_View_Helper_HeadMeta + */ + public function headMeta($content = null, $keyValue = null, $keyType = 'name', $modifiers = array(), $placement = Zend_View_Helper_Placeholder_Container_Abstract::APPEND) + { + if ((null !== $content) && (null !== $keyValue)) { + $item = $this->createData($keyType, $keyValue, $content, $modifiers); + $action = strtolower($placement); + switch ($action) { + case 'append': + case 'prepend': + case 'set': + $this->$action($item); + break; + default: + $this->append($item); + break; + } + } + + return $this; + } + + protected function _normalizeType($type) + { + switch ($type) { + case 'Name': + return 'name'; + case 'HttpEquiv': + return 'http-equiv'; + default: + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Invalid type "%s" passed to _normalizeType', $type)); + } + } + + /** + * Overload method access + * + * Allows the following 'virtual' methods: + * - appendName($keyValue, $content, $modifiers = array()) + * - offsetGetName($index, $keyValue, $content, $modifers = array()) + * - prependName($keyValue, $content, $modifiers = array()) + * - setName($keyValue, $content, $modifiers = array()) + * - appendHttpEquiv($keyValue, $content, $modifiers = array()) + * - offsetGetHttpEquiv($index, $keyValue, $content, $modifers = array()) + * - prependHttpEquiv($keyValue, $content, $modifiers = array()) + * - setHttpEquiv($keyValue, $content, $modifiers = array()) + * + * @param string $method + * @param array $args + * @return Zend_View_Helper_HeadMeta + */ + public function __call($method, $args) + { + if (preg_match('/^(?Pset|(pre|ap)pend|offsetSet)(?PName|HttpEquiv)$/', $method, $matches)) { + $action = $matches['action']; + $type = $this->_normalizeType($matches['type']); + $argc = count($args); + $index = null; + + if ('offsetSet' == $action) { + if (0 < $argc) { + $index = array_shift($args); + --$argc; + } + } + + if (2 > $argc) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Too few arguments provided; requires key value, and content'); + } + + if (3 > $argc) { + $args[] = array(); + } + + $item = $this->createData($type, $args[0], $args[1], $args[2]); + + if ('offsetSet' == $action) { + return $this->offsetSet($index, $item); + } + + if ($action == 'set') { + //var_dump($this->getContainer()); + } + + $this->$action($item); + return $this; + } + + return parent::__call($method, $args); + } + + /** + * Determine if item is valid + * + * @param mixed $item + * @return boolean + */ + protected function _isValid($item) + { + if ((!$item instanceof stdClass) + || !isset($item->type) + || !isset($item->content) + || !isset($item->modifiers)) + { + return false; + } + + return true; + } + + /** + * Append + * + * @param string $value + * @return void + * @throws Zend_View_Exception + */ + public function append($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to append; please use appendMeta()'); + } + + return $this->getContainer()->append($value); + } + + /** + * OffsetSet + * + * @param string|int $index + * @param string $value + * @return void + * @throws Zend_View_Exception + */ + public function offsetSet($index, $value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to offsetSet; please use offsetSetMeta()'); + } + + return $this->getContainer()->offsetSet($index, $value); + } + + /** + * OffsetUnset + * + * @param string|int $index + * @return void + * @throws Zend_View_Exception + */ + public function offsetUnset($index) + { + if (!in_array($index, $this->getContainer()->getKeys())) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid index passed to offsetUnset.'); + } + + return $this->getContainer()->offsetUnset($index); + } + + /** + * Prepend + * + * @param string $value + * @return void + * @throws Zend_View_Exception + */ + public function prepend($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to prepend; please use prependMeta()'); + } + + return $this->getContainer()->prepend($value); + } + + /** + * Set + * + * @param string $value + * @return void + * @throws Zend_View_Exception + */ + public function set($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to set; please use setMeta()'); + } + + $container = $this->getContainer(); + foreach ($container->getArrayCopy() as $index => $item) { + if ($item->type == $value->type && $item->{$item->type} == $value->{$value->type}) { + $this->offsetUnset($index); + } + } + + return $this->append($value); + } + + /** + * Build meta HTML string + * + * @param string $type + * @param string $typeValue + * @param string $content + * @param array $modifiers + * @return string + */ + public function itemToString(stdClass $item) + { + if (!in_array($item->type, $this->_typeKeys)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Invalid type "%s" provided for meta', $item->type)); + } + $type = $item->type; + + $modifiersString = ''; + foreach ($item->modifiers as $key => $value) { + if (!in_array($key, $this->_modifierKeys)) { + continue; + } + $modifiersString .= $key . '="' . $this->_escape($value) . '" '; + } + + if ($this->view instanceof Zend_View_Abstract) { + $tpl = ($this->view->doctype()->isXhtml()) + ? '' + : ''; + } else { + $tpl = ''; + } + + $meta = sprintf( + $tpl, + $type, + $this->_escape($item->$type), + $this->_escape($item->content), + $modifiersString + ); + return $meta; + } + + /** + * Render placeholder as string + * + * @param string|int $indent + * @return string + */ + public function toString($indent = null) + { + $indent = (null !== $indent) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + $items = array(); + $this->getContainer()->ksort(); + try { + foreach ($this as $item) { + $items[] = $this->itemToString($item); + } + } catch (Zend_View_Exception $e) { + trigger_error($e->getMessage(), E_USER_WARNING); + return ''; + } + return $indent . implode($this->_escape($this->getSeparator()) . $indent, $items); + } + + /** + * Create data item for inserting into stack + * + * @param string $type + * @param string $typeValue + * @param string $content + * @param array $modifiers + * @return stdClass + */ + public function createData($type, $typeValue, $content, array $modifiers) + { + $data = new stdClass; + $data->type = $type; + $data->$type = $typeValue; + $data->content = $content; + $data->modifiers = $modifiers; + return $data; + } +} diff --git a/lib/zend/Zend/View/Helper/HeadScript.php b/lib/zend/Zend/View/Helper/HeadScript.php new file mode 100644 index 0000000000..032063f1b5 --- /dev/null +++ b/lib/zend/Zend/View/Helper/HeadScript.php @@ -0,0 +1,479 @@ +setSeparator(PHP_EOL); + } + + /** + * Return headScript object + * + * Returns headScript helper object; optionally, allows specifying a script + * or script file to include. + * + * @param string $mode Script or file + * @param string $spec Script/url + * @param string $placement Append, prepend, or set + * @param array $attrs Array of script attributes + * @param string $type Script type and/or array of script attributes + * @return Zend_View_Helper_HeadScript + */ + public function headScript($mode = Zend_View_Helper_HeadScript::FILE, $spec = null, $placement = 'APPEND', array $attrs = array(), $type = 'text/javascript') + { + if ((null !== $spec) && is_string($spec)) { + $action = ucfirst(strtolower($mode)); + $placement = strtolower($placement); + switch ($placement) { + case 'set': + case 'prepend': + case 'append': + $action = $placement . $action; + break; + default: + $action = 'append' . $action; + break; + } + $this->$action($spec, $type, $attrs); + } + + return $this; + } + + /** + * Start capture action + * + * @param mixed $captureType + * @param string $typeOrAttrs + * @return void + */ + public function captureStart($captureType = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $type = 'text/javascript', $attrs = array()) + { + if ($this->_captureLock) { + require_once 'Zend/View/Helper/Placeholder/Container/Exception.php'; + throw new Zend_View_Helper_Placeholder_Container_Exception('Cannot nest headScript captures'); + } + + $this->_captureLock = true; + $this->_captureType = $captureType; + $this->_captureScriptType = $type; + $this->_captureScriptAttrs = $attrs; + ob_start(); + } + + /** + * End capture action and store + * + * @return void + */ + public function captureEnd() + { + $content = ob_get_clean(); + $type = $this->_captureScriptType; + $attrs = $this->_captureScriptAttrs; + $this->_captureScriptType = null; + $this->_captureScriptAttrs = null; + $this->_captureLock = false; + + switch ($this->_captureType) { + case Zend_View_Helper_Placeholder_Container_Abstract::SET: + case Zend_View_Helper_Placeholder_Container_Abstract::PREPEND: + case Zend_View_Helper_Placeholder_Container_Abstract::APPEND: + $action = strtolower($this->_captureType) . 'Script'; + break; + default: + $action = 'appendScript'; + break; + } + $this->$action($content, $type, $attrs); + } + + /** + * Overload method access + * + * Allows the following method calls: + * - appendFile($src, $type = 'text/javascript', $attrs = array()) + * - offsetSetFile($index, $src, $type = 'text/javascript', $attrs = array()) + * - prependFile($src, $type = 'text/javascript', $attrs = array()) + * - setFile($src, $type = 'text/javascript', $attrs = array()) + * - appendScript($script, $type = 'text/javascript', $attrs = array()) + * - offsetSetScript($index, $src, $type = 'text/javascript', $attrs = array()) + * - prependScript($script, $type = 'text/javascript', $attrs = array()) + * - setScript($script, $type = 'text/javascript', $attrs = array()) + * + * @param string $method + * @param array $args + * @return Zend_View_Helper_HeadScript + * @throws Zend_View_Exception if too few arguments or invalid method + */ + public function __call($method, $args) + { + if (preg_match('/^(?Pset|(ap|pre)pend|offsetSet)(?PFile|Script)$/', $method, $matches)) { + if (1 > count($args)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Method "%s" requires at least one argument', $method)); + } + + $action = $matches['action']; + $mode = strtolower($matches['mode']); + $type = 'text/javascript'; + $attrs = array(); + + if ('offsetSet' == $action) { + $index = array_shift($args); + if (1 > count($args)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Method "%s" requires at least two arguments, an index and source', $method)); + } + } + + $content = $args[0]; + + if (isset($args[1])) { + $type = (string) $args[1]; + } + if (isset($args[2])) { + $attrs = (array) $args[2]; + } + + switch ($mode) { + case 'script': + $item = $this->createData($type, $attrs, $content); + if ('offsetSet' == $action) { + $this->offsetSet($index, $item); + } else { + $this->$action($item); + } + break; + case 'file': + default: + if (!$this->_isDuplicate($content)) { + $attrs['src'] = $content; + $item = $this->createData($type, $attrs); + if ('offsetSet' == $action) { + $this->offsetSet($index, $item); + } else { + $this->$action($item); + } + } + break; + } + + return $this; + } + + return parent::__call($method, $args); + } + + /** + * Is the file specified a duplicate? + * + * @param string $file + * @return bool + */ + protected function _isDuplicate($file) + { + foreach ($this->getContainer() as $item) { + if (($item->source === null) + && array_key_exists('src', $item->attributes) + && ($file == $item->attributes['src'])) + { + return true; + } + } + return false; + } + + /** + * Is the script provided valid? + * + * @param mixed $value + * @param string $method + * @return bool + */ + protected function _isValid($value) + { + if ((!$value instanceof stdClass) + || !isset($value->type) + || (!isset($value->source) && !isset($value->attributes))) + { + return false; + } + + return true; + } + + /** + * Override append + * + * @param string $value + * @return void + */ + public function append($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid argument passed to append(); please use one of the helper methods, appendScript() or appendFile()'); + } + + return $this->getContainer()->append($value); + } + + /** + * Override prepend + * + * @param string $value + * @return void + */ + public function prepend($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid argument passed to prepend(); please use one of the helper methods, prependScript() or prependFile()'); + } + + return $this->getContainer()->prepend($value); + } + + /** + * Override set + * + * @param string $value + * @return void + */ + public function set($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid argument passed to set(); please use one of the helper methods, setScript() or setFile()'); + } + + return $this->getContainer()->set($value); + } + + /** + * Override offsetSet + * + * @param string|int $index + * @param mixed $value + * @return void + */ + public function offsetSet($index, $value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid argument passed to offsetSet(); please use one of the helper methods, offsetSetScript() or offsetSetFile()'); + } + + $this->_isValid($value); + return $this->getContainer()->offsetSet($index, $value); + } + + /** + * Set flag indicating if arbitrary attributes are allowed + * + * @param bool $flag + * @return Zend_View_Helper_HeadScript + */ + public function setAllowArbitraryAttributes($flag) + { + $this->_arbitraryAttributes = (bool) $flag; + return $this; + } + + /** + * Are arbitrary attributes allowed? + * + * @return bool + */ + public function arbitraryAttributesAllowed() + { + return $this->_arbitraryAttributes; + } + + /** + * Create script HTML + * + * @param string $type + * @param array $attributes + * @param string $content + * @param string|int $indent + * @return string + */ + public function itemToString($item, $indent, $escapeStart, $escapeEnd) + { + $attrString = ''; + if (!empty($item->attributes)) { + foreach ($item->attributes as $key => $value) { + if (!$this->arbitraryAttributesAllowed() + && !in_array($key, $this->_optionalAttributes)) + { + continue; + } + if ('defer' == $key) { + $value = 'defer'; + } + $attrString .= sprintf(' %s="%s"', $key, ($this->_autoEscape) ? $this->_escape($value) : $value); + } + } + + $type = ($this->_autoEscape) ? $this->_escape($item->type) : $item->type; + $html = $indent . ''; + + if (isset($item->attributes['conditional']) + && !empty($item->attributes['conditional']) + && is_string($item->attributes['conditional'])) + { + $html = ''; + } + + return $html; + } + + /** + * Retrieve string representation + * + * @param string|int $indent + * @return string + */ + public function toString($indent = null) + { + $indent = (null !== $indent) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + if ($this->view) { + $useCdata = $this->view->doctype()->isXhtml() ? true : false; + } else { + $useCdata = $this->useCdata ? true : false; + } + $escapeStart = ($useCdata) ? '//' : '//-->'; + + $items = array(); + $this->getContainer()->ksort(); + foreach ($this as $item) { + if (!$this->_isValid($item)) { + continue; + } + + $items[] = $this->itemToString($item, $indent, $escapeStart, $escapeEnd); + } + + $return = implode($this->getSeparator(), $items); + return $return; + } + + /** + * Create data item containing all necessary components of script + * + * @param string $type + * @param array $attributes + * @param string $content + * @return stdClass + */ + public function createData($type, array $attributes, $content = null) + { + $data = new stdClass(); + $data->type = $type; + $data->attributes = $attributes; + $data->source = $content; + return $data; + } +} diff --git a/lib/zend/Zend/View/Helper/HeadStyle.php b/lib/zend/Zend/View/Helper/HeadStyle.php new file mode 100644 index 0000000000..77d5d5061a --- /dev/null +++ b/lib/zend/Zend/View/Helper/HeadStyle.php @@ -0,0 +1,400 @@ +setSeparator(PHP_EOL); + } + + /** + * Return headStyle object + * + * Returns headStyle helper object; optionally, allows specifying + * + * @param string $content Stylesheet contents + * @param string $placement Append, prepend, or set + * @param string|array $attributes Optional attributes to utilize + * @return Zend_View_Helper_HeadStyle + */ + public function headStyle($content = null, $placement = 'APPEND', $attributes = array()) + { + if ((null !== $content) && is_string($content)) { + switch (strtoupper($placement)) { + case 'SET': + $action = 'setStyle'; + break; + case 'PREPEND': + $action = 'prependStyle'; + break; + case 'APPEND': + default: + $action = 'appendStyle'; + break; + } + $this->$action($content, $attributes); + } + + return $this; + } + + /** + * Overload method calls + * + * Allows the following method calls: + * - appendStyle($content, $attributes = array()) + * - offsetSetStyle($index, $content, $attributes = array()) + * - prependStyle($content, $attributes = array()) + * - setStyle($content, $attributes = array()) + * + * @param string $method + * @param array $args + * @return void + * @throws Zend_View_Exception When no $content provided or invalid method + */ + public function __call($method, $args) + { + if (preg_match('/^(?Pset|(ap|pre)pend|offsetSet)(Style)$/', $method, $matches)) { + $index = null; + $argc = count($args); + $action = $matches['action']; + + if ('offsetSet' == $action) { + if (0 < $argc) { + $index = array_shift($args); + --$argc; + } + } + + if (1 > $argc) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf('Method "%s" requires minimally content for the stylesheet', $method)); + } + + $content = $args[0]; + $attrs = array(); + if (isset($args[1])) { + $attrs = (array) $args[1]; + } + + $item = $this->createData($content, $attrs); + + if ('offsetSet' == $action) { + $this->offsetSet($index, $item); + } else { + $this->$action($item); + } + + return $this; + } + + return parent::__call($method, $args); + } + + /** + * Determine if a value is a valid style tag + * + * @param mixed $value + * @param string $method + * @return boolean + */ + protected function _isValid($value) + { + if ((!$value instanceof stdClass) + || !isset($value->content) + || !isset($value->attributes)) + { + return false; + } + + return true; + } + + /** + * Override append to enforce style creation + * + * @param mixed $value + * @return void + */ + public function append($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to append; please use appendStyle()'); + } + + return $this->getContainer()->append($value); + } + + /** + * Override offsetSet to enforce style creation + * + * @param string|int $index + * @param mixed $value + * @return void + */ + public function offsetSet($index, $value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to offsetSet; please use offsetSetStyle()'); + } + + return $this->getContainer()->offsetSet($index, $value); + } + + /** + * Override prepend to enforce style creation + * + * @param mixed $value + * @return void + */ + public function prepend($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to prepend; please use prependStyle()'); + } + + return $this->getContainer()->prepend($value); + } + + /** + * Override set to enforce style creation + * + * @param mixed $value + * @return void + */ + public function set($value) + { + if (!$this->_isValid($value)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Invalid value passed to set; please use setStyle()'); + } + + return $this->getContainer()->set($value); + } + + /** + * Start capture action + * + * @param mixed $captureType + * @param string $typeOrAttrs + * @return void + */ + public function captureStart($type = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $attrs = null) + { + if ($this->_captureLock) { + require_once 'Zend/View/Helper/Placeholder/Container/Exception.php'; + throw new Zend_View_Helper_Placeholder_Container_Exception('Cannot nest headStyle captures'); + } + + $this->_captureLock = true; + $this->_captureAttrs = $attrs; + $this->_captureType = $type; + ob_start(); + } + + /** + * End capture action and store + * + * @return void + */ + public function captureEnd() + { + $content = ob_get_clean(); + $attrs = $this->_captureAttrs; + $this->_captureAttrs = null; + $this->_captureLock = false; + + switch ($this->_captureType) { + case Zend_View_Helper_Placeholder_Container_Abstract::SET: + $this->setStyle($content, $attrs); + break; + case Zend_View_Helper_Placeholder_Container_Abstract::PREPEND: + $this->prependStyle($content, $attrs); + break; + case Zend_View_Helper_Placeholder_Container_Abstract::APPEND: + default: + $this->appendStyle($content, $attrs); + break; + } + } + + /** + * Convert content and attributes into valid style tag + * + * @param stdClass $item Item to render + * @param string $indent Indentation to use + * @return string + */ + public function itemToString(stdClass $item, $indent) + { + $attrString = ''; + if (!empty($item->attributes)) { + foreach ($item->attributes as $key => $value) { + if (!in_array($key, $this->_optionalAttributes)) { + continue; + } + if ('media' == $key) { + if(false === strpos($value, ',')) { + if (!in_array($value, $this->_mediaTypes)) { + continue; + } + } else { + $media_types = explode(',', $value); + $value = ''; + foreach($media_types as $type) { + if (!in_array($type, $this->_mediaTypes)) { + continue; + } + $value .= $type .','; + } + $value = substr($value, 0, -1); + } + } + $attrString .= sprintf(' %s="%s"', $key, htmlspecialchars($value)); + } + } + + $html = ''; + + if (isset($item->attributes['conditional']) + && !empty($item->attributes['conditional']) + && is_string($item->attributes['conditional'])) + { + $html = ''; + } + + return $html; + } + + /** + * Create string representation of placeholder + * + * @param string|int $indent + * @return string + */ + public function toString($indent = null) + { + $indent = (null !== $indent) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + $items = array(); + $this->getContainer()->ksort(); + foreach ($this as $item) { + if (!$this->_isValid($item)) { + continue; + } + $items[] = $this->itemToString($item, $indent); + } + + $return = $indent . implode($this->getSeparator() . $indent, $items); + $return = preg_replace("/(\r\n?|\n)/", '$1' . $indent, $return); + return $return; + } + + /** + * Create data item for use in stack + * + * @param string $content + * @param array $attributes + * @return stdClass + */ + public function createData($content, array $attributes) + { + if (!isset($attributes['media'])) { + $attributes['media'] = 'screen'; + } else if(is_array($attributes['media'])) { + $attributes['media'] = implode(',', $attributes['media']); + } + + $data = new stdClass(); + $data->content = $content; + $data->attributes = $attributes; + + return $data; + } +} diff --git a/lib/zend/Zend/View/Helper/HeadTitle.php b/lib/zend/Zend/View/Helper/HeadTitle.php new file mode 100644 index 0000000000..58679bf82a --- /dev/null +++ b/lib/zend/Zend/View/Helper/HeadTitle.php @@ -0,0 +1,178 @@ +set($title); + } elseif ($setType == Zend_View_Helper_Placeholder_Container_Abstract::PREPEND) { + $this->prepend($title); + } else { + $this->append($title); + } + } + + return $this; + } + + /** + * Sets a translation Adapter for translation + * + * @param Zend_Translate|Zend_Translate_Adapter $translate + * @return Zend_View_Helper_HeadTitle + */ + public function setTranslator($translate) + { + if ($translate instanceof Zend_Translate_Adapter) { + $this->_translator = $translate; + } elseif ($translate instanceof Zend_Translate) { + $this->_translator = $translate->getAdapter(); + } else { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception("You must set an instance of Zend_Translate or Zend_Translate_Adapter"); + } + return $this; + } + + /* + * Retrieve translation object + * + * If none is currently registered, attempts to pull it from the registry + * using the key 'Zend_Translate'. + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if (null === $this->_translator) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Translate')) { + $this->setTranslator(Zend_Registry::get('Zend_Translate')); + } + } + return $this->_translator; + } + + /** + * Enables translation + * + * @return Zend_View_Helper_HeadTitle + */ + public function enableTranslation() + { + $this->_translate = true; + return $this; + } + + /** + * Disables translation + * + * @return Zend_View_Helper_HeadTitle + */ + public function disableTranslation() + { + $this->_translate = false; + return $this; + } + + /** + * Turn helper into string + * + * @param string|null $indent + * @param string|null $locale + * @return string + */ + public function toString($indent = null, $locale = null) + { + $indent = (null !== $indent) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + $items = array(); + + if($this->_translate && $translator = $this->getTranslator()) { + foreach ($this as $item) { + $items[] = $translator->translate($item, $locale); + } + } else { + foreach ($this as $item) { + $items[] = $item; + } + } + + $separator = $this->getSeparator(); + $output = ''; + if(($prefix = $this->getPrefix())) { + $output .= $prefix; + } + $output .= implode($separator, $items); + if(($postfix = $this->getPostfix())) { + $output .= $postfix; + } + + $output = ($this->_autoEscape) ? $this->_escape($output) : $output; + + return $indent . '' . $output . ''; + } +} diff --git a/lib/zend/Zend/View/Helper/HtmlElement.php b/lib/zend/Zend/View/Helper/HtmlElement.php new file mode 100644 index 0000000000..bfac219ef3 --- /dev/null +++ b/lib/zend/Zend/View/Helper/HtmlElement.php @@ -0,0 +1,141 @@ +_closingBracket) { + if ($this->_isXhtml()) { + $this->_closingBracket = ' />'; + } else { + $this->_closingBracket = '>'; + } + } + + return $this->_closingBracket; + } + + /** + * Is doctype XHTML? + * + * @return boolean + */ + protected function _isXhtml() + { + $doctype = $this->view->doctype(); + return $doctype->isXhtml(); + } + + /** + * Converts an associative array to a string of tag attributes. + * + * @access public + * + * @param array $attribs From this array, each key-value pair is + * converted to an attribute name and value. + * + * @return string The XHTML for the attributes. + */ + protected function _htmlAttribs($attribs) + { + $xhtml = ''; + foreach ((array) $attribs as $key => $val) { + $key = $this->view->escape($key); + + if (('on' == substr($key, 0, 2)) || ('constraints' == $key)) { + // Don't escape event attributes; _do_ substitute double quotes with singles + if (!is_scalar($val)) { + // non-scalar data should be cast to JSON first + require_once 'Zend/Json.php'; + $val = Zend_Json::encode($val); + } + $val = preg_replace('/"([^"]*)":/', '$1:', $val); + } else { + if (is_array($val)) { + $val = implode(' ', $val); + } + $val = $this->view->escape($val); + } + + if ('id' == $key) { + $val = $this->_normalizeId($val); + } + + if (strpos($val, '"') !== false) { + $xhtml .= " $key='$val'"; + } else { + $xhtml .= " $key=\"$val\""; + } + + } + return $xhtml; + } + + /** + * Normalize an ID + * + * @param string $value + * @return string + */ + protected function _normalizeId($value) + { + if (strstr($value, '[')) { + if ('[]' == substr($value, -2)) { + $value = substr($value, 0, strlen($value) - 2); + } + $value = trim($value, ']'); + $value = str_replace('][', '-', $value); + $value = str_replace('[', '-', $value); + } + return $value; + } +} diff --git a/lib/zend/Zend/View/Helper/HtmlFlash.php b/lib/zend/Zend/View/Helper/HtmlFlash.php new file mode 100644 index 0000000000..f54339adc2 --- /dev/null +++ b/lib/zend/Zend/View/Helper/HtmlFlash.php @@ -0,0 +1,60 @@ + $data, + 'quality' => 'high'), $params); + + return $this->htmlObject($data, self::TYPE, $attribs, $params, $content); + } +} diff --git a/lib/zend/Zend/View/Helper/HtmlList.php b/lib/zend/Zend/View/Helper/HtmlList.php new file mode 100644 index 0000000000..71736334ac --- /dev/null +++ b/lib/zend/Zend/View/Helper/HtmlList.php @@ -0,0 +1,88 @@ +view->escape($item); + } + $list .= '
  • ' . $item . '
  • ' . self::EOL; + } else { + if (6 < strlen($list)) { + $list = substr($list, 0, strlen($list) - 6) + . $this->htmlList($item, $ordered, $attribs, $escape) . '' . self::EOL; + } else { + $list .= '
  • ' . $this->htmlList($item, $ordered, $attribs, $escape) . '
  • ' . self::EOL; + } + } + } + + if ($attribs) { + $attribs = $this->_htmlAttribs($attribs); + } else { + $attribs = ''; + } + + $tag = 'ul'; + if ($ordered) { + $tag = 'ol'; + } + + return '<' . $tag . $attribs . '>' . self::EOL . $list . '' . self::EOL; + } +} diff --git a/lib/zend/Zend/View/Helper/HtmlObject.php b/lib/zend/Zend/View/Helper/HtmlObject.php new file mode 100644 index 0000000000..7f93d4dd98 --- /dev/null +++ b/lib/zend/Zend/View/Helper/HtmlObject.php @@ -0,0 +1,80 @@ + $data, + 'type' => $type), $attribs); + + // Params + $paramHtml = array(); + $closingBracket = $this->getClosingBracket(); + + foreach ($params as $param => $options) { + if (is_string($options)) { + $options = array('value' => $options); + } + + $options = array_merge(array('name' => $param), $options); + + $paramHtml[] = '_htmlAttribs($options) . $closingBracket; + } + + // Content + if (is_array($content)) { + $content = implode(self::EOL, $content); + } + + // Object header + $xhtml = '_htmlAttribs($attribs) . '>' . self::EOL + . implode(self::EOL, $paramHtml) . self::EOL + . ($content ? $content . self::EOL : '') + . ''; + + return $xhtml; + } +} diff --git a/lib/zend/Zend/View/Helper/HtmlPage.php b/lib/zend/Zend/View/Helper/HtmlPage.php new file mode 100644 index 0000000000..2256662066 --- /dev/null +++ b/lib/zend/Zend/View/Helper/HtmlPage.php @@ -0,0 +1,75 @@ + self::ATTRIB_CLASSID); + + /** + * Output a html object tag + * + * @param string $data The html url + * @param array $attribs Attribs for the object tag + * @param array $params Params for in the object tag + * @param string $content Alternative content + * @return string + */ + public function htmlPage($data, array $attribs = array(), array $params = array(), $content = null) + { + // Attrs + $attribs = array_merge($this->_attribs, $attribs); + + // Params + $params = array_merge(array('data' => $data), $params); + + return $this->htmlObject($data, self::TYPE, $attribs, $params, $content); + } +} diff --git a/lib/zend/Zend/View/Helper/HtmlQuicktime.php b/lib/zend/Zend/View/Helper/HtmlQuicktime.php new file mode 100644 index 0000000000..52e4fdd72e --- /dev/null +++ b/lib/zend/Zend/View/Helper/HtmlQuicktime.php @@ -0,0 +1,82 @@ + self::ATTRIB_CLASSID, + 'codebase' => self::ATTRIB_CODEBASE); + + /** + * Output a quicktime movie object tag + * + * @param string $data The quicktime file + * @param array $attribs Attribs for the object tag + * @param array $params Params for in the object tag + * @param string $content Alternative content + * @return string + */ + public function htmlQuicktime($data, array $attribs = array(), array $params = array(), $content = null) + { + // Attrs + $attribs = array_merge($this->_attribs, $attribs); + + // Params + $params = array_merge(array('src' => $data), $params); + + return $this->htmlObject($data, self::TYPE, $attribs, $params, $content); + } +} diff --git a/lib/zend/Zend/View/Helper/InlineScript.php b/lib/zend/Zend/View/Helper/InlineScript.php new file mode 100644 index 0000000000..feb56ab20e --- /dev/null +++ b/lib/zend/Zend/View/Helper/InlineScript.php @@ -0,0 +1,61 @@ +headScript($mode, $spec, $placement, $attrs, $type); + } +} diff --git a/lib/zend/Zend/View/Helper/Interface.php b/lib/zend/Zend/View/Helper/Interface.php new file mode 100644 index 0000000000..f59433e4e0 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Interface.php @@ -0,0 +1,46 @@ +true|false + * this array can contains a 'keepLayout'=>true|false + * that will not be passed to Zend_Json::encode method but will be used here + * @return string|void + */ + public function json($data, $keepLayouts = false) + { + $options = array(); + if (is_array($keepLayouts)) + { + $options = $keepLayouts; + $keepLayouts = (array_key_exists('keepLayouts', $keepLayouts)) + ? $keepLayouts['keepLayouts'] + : false; + unset($options['keepLayouts']); + } + + $data = Zend_Json::encode($data, null, $options); + if (!$keepLayouts) { + require_once 'Zend/Layout.php'; + $layout = Zend_Layout::getMvcInstance(); + if ($layout instanceof Zend_Layout) { + $layout->disableLayout(); + } + } + + $response = Zend_Controller_Front::getInstance()->getResponse(); + $response->setHeader('Content-Type', 'application/json'); + return $data; + } +} diff --git a/lib/zend/Zend/View/Helper/Layout.php b/lib/zend/Zend/View/Helper/Layout.php new file mode 100644 index 0000000000..6023cacdfd --- /dev/null +++ b/lib/zend/Zend/View/Helper/Layout.php @@ -0,0 +1,81 @@ +_layout) { + require_once 'Zend/Layout.php'; + $this->_layout = Zend_Layout::getMvcInstance(); + if (null === $this->_layout) { + // Implicitly creates layout object + $this->_layout = new Zend_Layout(); + } + } + + return $this->_layout; + } + + /** + * Set layout object + * + * @param Zend_Layout $layout + * @return Zend_Layout_Controller_Action_Helper_Layout + */ + public function setLayout(Zend_Layout $layout) + { + $this->_layout = $layout; + return $this; + } + + /** + * Return layout object + * + * Usage: $this->layout()->setLayout('alternate'); + * + * @return Zend_Layout + */ + public function layout() + { + return $this->getLayout(); + } +} diff --git a/lib/zend/Zend/View/Helper/Navigation.php b/lib/zend/Zend/View/Helper/Navigation.php new file mode 100644 index 0000000000..6e21900bd2 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Navigation.php @@ -0,0 +1,336 @@ +setContainer($container); + } + + return $this; + } + + /** + * Magic overload: Proxy to other navigation helpers or the container + * + * Examples of usage from a view script or layout: + * + * // proxy to Menu helper and render container: + * echo $this->navigation()->menu(); + * + * // proxy to Breadcrumbs helper and set indentation: + * $this->navigation()->breadcrumbs()->setIndent(8); + * + * // proxy to container and find all pages with 'blog' route: + * $blogPages = $this->navigation()->findAllByRoute('blog'); + * + * + * @param string $method helper name or method name in + * container + * @param array $arguments [optional] arguments to pass + * @return mixed returns what the proxied call returns + * @throws Zend_View_Exception if proxying to a helper, and the + * helper is not an instance of the + * interface specified in + * {@link findHelper()} + * @throws Zend_Navigation_Exception if method does not exist in container + */ + public function __call($method, array $arguments = array()) + { + // check if call should proxy to another helper + if ($helper = $this->findHelper($method, false)) { + return call_user_func_array(array($helper, $method), $arguments); + } + + // default behaviour: proxy call to container + return parent::__call($method, $arguments); + } + + /** + * Returns the helper matching $proxy + * + * The helper must implement the interface + * {@link Zend_View_Helper_Navigation_Helper}. + * + * @param string $proxy helper name + * @param bool $strict [optional] whether + * exceptions should be + * thrown if something goes + * wrong. Default is true. + * @return Zend_View_Helper_Navigation_Helper helper instance + * @throws Zend_Loader_PluginLoader_Exception if $strict is true and + * helper cannot be found + * @throws Zend_View_Exception if $strict is true and + * helper does not implement + * the specified interface + */ + public function findHelper($proxy, $strict = true) + { + if (isset($this->_helpers[$proxy])) { + return $this->_helpers[$proxy]; + } + + if (!$this->view->getPluginLoader('helper')->getPaths(self::NS)) { + $this->view->addHelperPath( + str_replace('_', '/', self::NS), + self::NS); + } + + if ($strict) { + $helper = $this->view->getHelper($proxy); + } else { + try { + $helper = $this->view->getHelper($proxy); + } catch (Zend_Loader_PluginLoader_Exception $e) { + return null; + } + } + + if (!$helper instanceof Zend_View_Helper_Navigation_Helper) { + if ($strict) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + 'Proxy helper "%s" is not an instance of ' . + 'Zend_View_Helper_Navigation_Helper', + get_class($helper))); + } + + return null; + } + + $this->_inject($helper); + $this->_helpers[$proxy] = $helper; + + return $helper; + } + + /** + * Injects container, ACL, and translator to the given $helper if this + * helper is configured to do so + * + * @param Zend_View_Helper_Navigation_Helper $helper helper instance + * @return void + */ + protected function _inject(Zend_View_Helper_Navigation_Helper $helper) + { + if ($this->getInjectContainer() && !$helper->hasContainer()) { + $helper->setContainer($this->getContainer()); + } + + if ($this->getInjectAcl()) { + if (!$helper->hasAcl()) { + $helper->setAcl($this->getAcl()); + } + if (!$helper->hasRole()) { + $helper->setRole($this->getRole()); + } + } + + if ($this->getInjectTranslator() && !$helper->hasTranslator()) { + $helper->setTranslator($this->getTranslator()); + } + } + + // Accessors: + + /** + * Sets the default proxy to use in {@link render()} + * + * @param string $proxy default proxy + * @return Zend_View_Helper_Navigation fluent interface, returns self + */ + public function setDefaultProxy($proxy) + { + $this->_defaultProxy = (string) $proxy; + return $this; + } + + /** + * Returns the default proxy to use in {@link render()} + * + * @return string the default proxy to use in {@link render()} + */ + public function getDefaultProxy() + { + return $this->_defaultProxy; + } + + /** + * Sets whether container should be injected when proxying + * + * @param bool $injectContainer [optional] whether container should + * be injected when proxying. Default + * is true. + * @return Zend_View_Helper_Navigation fluent interface, returns self + */ + public function setInjectContainer($injectContainer = true) + { + $this->_injectContainer = (bool) $injectContainer; + return $this; + } + + /** + * Returns whether container should be injected when proxying + * + * @return bool whether container should be injected when proxying + */ + public function getInjectContainer() + { + return $this->_injectContainer; + } + + /** + * Sets whether ACL should be injected when proxying + * + * @param bool $injectAcl [optional] whether ACL should be + * injected when proxying. Default is + * true. + * @return Zend_View_Helper_Navigation fluent interface, returns self + */ + public function setInjectAcl($injectAcl = true) + { + $this->_injectAcl = (bool) $injectAcl; + return $this; + } + + /** + * Returns whether ACL should be injected when proxying + * + * @return bool whether ACL should be injected when proxying + */ + public function getInjectAcl() + { + return $this->_injectAcl; + } + + /** + * Sets whether translator should be injected when proxying + * + * @param bool $injectTranslator [optional] whether translator should + * be injected when proxying. Default + * is true. + * @return Zend_View_Helper_Navigation fluent interface, returns self + */ + public function setInjectTranslator($injectTranslator = true) + { + $this->_injectTranslator = (bool) $injectTranslator; + return $this; + } + + /** + * Returns whether translator should be injected when proxying + * + * @return bool whether translator should be injected when proxying + */ + public function getInjectTranslator() + { + return $this->_injectTranslator; + } + + // Zend_View_Helper_Navigation_Helper: + + /** + * Renders helper + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + * @throws Zend_Loader_PluginLoader_Exception if helper cannot be found + * @throws Zend_View_Exception if helper doesn't implement + * the interface specified in + * {@link findHelper()} + */ + public function render(Zend_Navigation_Container $container = null) + { + $helper = $this->findHelper($this->getDefaultProxy()); + return $helper->render($container); + } +} diff --git a/lib/zend/Zend/View/Helper/Navigation/Breadcrumbs.php b/lib/zend/Zend/View/Helper/Navigation/Breadcrumbs.php new file mode 100644 index 0000000000..a4ef71f527 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Navigation/Breadcrumbs.php @@ -0,0 +1,325 @@ +setContainer($container); + } + + return $this; + } + + // Accessors: + + /** + * Sets breadcrumb separator + * + * @param string $separator separator string + * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, + * returns self + */ + public function setSeparator($separator) + { + if (is_string($separator)) { + $this->_separator = $separator; + } + + return $this; + } + + /** + * Returns breadcrumb separator + * + * @return string breadcrumb separator + */ + public function getSeparator() + { + return $this->_separator; + } + + /** + * Sets whether last page in breadcrumbs should be hyperlinked + * + * @param bool $linkLast whether last page should + * be hyperlinked + * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, + * returns self + */ + public function setLinkLast($linkLast) + { + $this->_linkLast = (bool) $linkLast; + return $this; + } + + /** + * Returns whether last page in breadcrumbs should be hyperlinked + * + * @return bool whether last page in breadcrumbs should be hyperlinked + */ + public function getLinkLast() + { + return $this->_linkLast; + } + + /** + * Sets which partial view script to use for rendering menu + * + * @param string|array $partial partial view script or + * null. If an array is + * given, it is expected to + * contain two values; + * the partial view script + * to use, and the module + * where the script can be + * found. + * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, + * returns self + */ + public function setPartial($partial) + { + if (null === $partial || is_string($partial) || is_array($partial)) { + $this->_partial = $partial; + } + + return $this; + } + + /** + * Returns partial view script to use for rendering menu + * + * @return string|array|null + */ + public function getPartial() + { + return $this->_partial; + } + + // Render methods: + + /** + * Renders breadcrumbs by chaining 'a' elements with the separator + * registered in the helper + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + */ + public function renderStraight(Zend_Navigation_Container $container = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + // find deepest active + if (!$active = $this->findActive($container)) { + return ''; + } + + $active = $active['page']; + + // put the deepest active page last in breadcrumbs + if ($this->getLinkLast()) { + $html = $this->htmlify($active); + } else { + $html = $active->getLabel(); + if ($this->getUseTranslator() && $t = $this->getTranslator()) { + $html = $t->translate($html); + } + $html = $this->view->escape($html); + } + + // walk back to root + while ($parent = $active->getParent()) { + if ($parent instanceof Zend_Navigation_Page) { + // prepend crumb to html + $html = $this->htmlify($parent) + . $this->getSeparator() + . $html; + } + + if ($parent === $container) { + // at the root of the given container + break; + } + + $active = $parent; + } + + return strlen($html) ? $this->getIndent() . $html : ''; + } + + /** + * Renders the given $container by invoking the partial view helper + * + * The container will simply be passed on as a model to the view script, + * so in the script it will be available in $this->container. + * + * @param Zend_Navigation_Container $container [optional] container to + * pass to view script. + * Default is to use the + * container registered in the + * helper. + * @param string|array $partial [optional] partial view + * script to use. Default is + * to use the partial + * registered in the helper. + * If an array is given, it is + * expected to contain two + * values; the partial view + * script to use, and the + * module where the script can + * be found. + * @return string helper output + */ + public function renderPartial(Zend_Navigation_Container $container = null, + $partial = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + if (null === $partial) { + $partial = $this->getPartial(); + } + + if (empty($partial)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception( + 'Unable to render menu: No partial view script provided'); + } + + // put breadcrumb pages in model + $model = array('pages' => array()); + if ($active = $this->findActive($container)) { + $active = $active['page']; + $model['pages'][] = $active; + while ($parent = $active->getParent()) { + if ($parent instanceof Zend_Navigation_Page) { + $model['pages'][] = $parent; + } else { + break; + } + + if ($parent === $container) { + // break if at the root of the given container + break; + } + + $active = $parent; + } + $model['pages'] = array_reverse($model['pages']); + } + + if (is_array($partial)) { + if (count($partial) != 2) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception( + 'Unable to render menu: A view partial supplied as ' . + 'an array must contain two values: partial view ' . + 'script and module where script can be found'); + } + + return $this->view->partial($partial[0], $partial[1], $model); + } + + return $this->view->partial($partial, null, $model); + } + + // Zend_View_Helper_Navigation_Helper: + + /** + * Renders helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + */ + public function render(Zend_Navigation_Container $container = null) + { + if ($partial = $this->getPartial()) { + return $this->renderPartial($container, $partial); + } else { + return $this->renderStraight($container); + } + } +} diff --git a/lib/zend/Zend/View/Helper/Navigation/Helper.php b/lib/zend/Zend/View/Helper/Navigation/Helper.php new file mode 100644 index 0000000000..a9b675090a --- /dev/null +++ b/lib/zend/Zend/View/Helper/Navigation/Helper.php @@ -0,0 +1,212 @@ +_container = $container; + return $this; + } + + /** + * Returns the navigation container helper operates on by default + * + * Implements {@link Zend_View_Helper_Navigation_Interface::getContainer()}. + * + * If a helper is not explicitly set in this helper instance by calling + * {@link setContainer()} or by passing it through the helper entry point, + * this method will look in {@link Zend_Registry} for a container by using + * the key 'Zend_Navigation'. + * + * If no container is set, and nothing is found in Zend_Registry, a new + * container will be instantiated and stored in the helper. + * + * @return Zend_Navigation_Container navigation container + */ + public function getContainer() + { + if (null === $this->_container) { + // try to fetch from registry first + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Navigation')) { + $nav = Zend_Registry::get('Zend_Navigation'); + if ($nav instanceof Zend_Navigation_Container) { + return $this->_container = $nav; + } + } + + // nothing found in registry, create new container + require_once 'Zend/Navigation.php'; + $this->_container = new Zend_Navigation(); + } + + return $this->_container; + } + + /** + * Sets the minimum depth a page must have to be included when rendering + * + * @param int $minDepth [optional] minimum + * depth. Default is + * null, which sets + * no minimum depth. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setMinDepth($minDepth = null) + { + if (null === $minDepth || is_int($minDepth)) { + $this->_minDepth = $minDepth; + } else { + $this->_minDepth = (int) $minDepth; + } + return $this; + } + + /** + * Returns minimum depth a page must have to be included when rendering + * + * @return int|null minimum depth or null + */ + public function getMinDepth() + { + if (!is_int($this->_minDepth) || $this->_minDepth < 0) { + return 0; + } + return $this->_minDepth; + } + + /** + * Sets the maximum depth a page can have to be included when rendering + * + * @param int $maxDepth [optional] maximum + * depth. Default is + * null, which sets no + * maximum depth. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setMaxDepth($maxDepth = null) + { + if (null === $maxDepth || is_int($maxDepth)) { + $this->_maxDepth = $maxDepth; + } else { + $this->_maxDepth = (int) $maxDepth; + } + return $this; + } + + /** + * Returns maximum depth a page can have to be included when rendering + * + * @return int|null maximum depth or null + */ + public function getMaxDepth() + { + return $this->_maxDepth; + } + + /** + * Set the indentation string for using in {@link render()}, optionally a + * number of spaces to indent with + * + * @param string|int $indent indentation string or + * number of spaces + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setIndent($indent) + { + $this->_indent = $this->_getWhitespace($indent); + return $this; + } + + /** + * Returns indentation + * + * @return string + */ + public function getIndent() + { + return $this->_indent; + } + + /** + * Sets translator to use in helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::setTranslator()}. + * + * @param mixed $translator [optional] translator. + * Expects an object of + * type + * {@link Zend_Translate_Adapter} + * or {@link Zend_Translate}, + * or null. Default is + * null, which sets no + * translator. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setTranslator($translator = null) + { + if (null == $translator || + $translator instanceof Zend_Translate_Adapter) { + $this->_translator = $translator; + } elseif ($translator instanceof Zend_Translate) { + $this->_translator = $translator->getAdapter(); + } + + return $this; + } + + /** + * Returns translator used in helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::getTranslator()}. + * + * @return Zend_Translate_Adapter|null translator or null + */ + public function getTranslator() + { + if (null === $this->_translator) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Translate')) { + $this->setTranslator(Zend_Registry::get('Zend_Translate')); + } + } + + return $this->_translator; + } + + /** + * Sets ACL to use when iterating pages + * + * Implements {@link Zend_View_Helper_Navigation_Helper::setAcl()}. + * + * @param Zend_Acl $acl [optional] ACL object. + * Default is null. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setAcl(Zend_Acl $acl = null) + { + $this->_acl = $acl; + return $this; + } + + /** + * Returns ACL or null if it isn't set using {@link setAcl()} or + * {@link setDefaultAcl()} + * + * Implements {@link Zend_View_Helper_Navigation_Helper::getAcl()}. + * + * @return Zend_Acl|null ACL object or null + */ + public function getAcl() + { + if ($this->_acl === null && self::$_defaultAcl !== null) { + return self::$_defaultAcl; + } + + return $this->_acl; + } + + /** + * Sets ACL role(s) to use when iterating pages + * + * Implements {@link Zend_View_Helper_Navigation_Helper::setRole()}. + * + * @param mixed $role [optional] role to + * set. Expects a string, + * an instance of type + * {@link Zend_Acl_Role_Interface}, + * or null. Default is + * null, which will set + * no role. + * @throws Zend_View_Exception if $role is invalid + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setRole($role = null) + { + if (null === $role || is_string($role) || + $role instanceof Zend_Acl_Role_Interface) { + $this->_role = $role; + } else { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + '$role must be a string, null, or an instance of ' . + 'Zend_Acl_Role_Interface; %s given', + gettype($role))); + } + + return $this; + } + + /** + * Returns ACL role to use when iterating pages, or null if it isn't set + * using {@link setRole()} or {@link setDefaultRole()} + * + * Implements {@link Zend_View_Helper_Navigation_Helper::getRole()}. + * + * @return string|Zend_Acl_Role_Interface|null role or null + */ + public function getRole() + { + if ($this->_role === null && self::$_defaultRole !== null) { + return self::$_defaultRole; + } + + return $this->_role; + } + + /** + * Sets whether ACL should be used + * + * Implements {@link Zend_View_Helper_Navigation_Helper::setUseAcl()}. + * + * @param bool $useAcl [optional] whether ACL + * should be used. + * Default is true. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setUseAcl($useAcl = true) + { + $this->_useAcl = (bool) $useAcl; + return $this; + } + + /** + * Returns whether ACL should be used + * + * Implements {@link Zend_View_Helper_Navigation_Helper::getUseAcl()}. + * + * @return bool whether ACL should be used + */ + public function getUseAcl() + { + return $this->_useAcl; + } + + /** + * Return renderInvisible flag + * + * @return bool + */ + public function getRenderInvisible() + { + return $this->_renderInvisible; + } + + /** + * Render invisible items? + * + * @param bool $renderInvisible [optional] boolean flag + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface + * returns self + */ + public function setRenderInvisible($renderInvisible = true) + { + $this->_renderInvisible = (bool) $renderInvisible; + return $this; + } + + /** + * Sets whether translator should be used + * + * Implements {@link Zend_View_Helper_Navigation_Helper::setUseTranslator()}. + * + * @param bool $useTranslator [optional] whether + * translator should be + * used. Default is true. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setUseTranslator($useTranslator = true) + { + $this->_useTranslator = (bool) $useTranslator; + return $this; + } + + /** + * Returns whether translator should be used + * + * Implements {@link Zend_View_Helper_Navigation_Helper::getUseTranslator()}. + * + * @return bool whether translator should be used + */ + public function getUseTranslator() + { + return $this->_useTranslator; + } + + // Magic overloads: + + /** + * Magic overload: Proxy calls to the navigation container + * + * @param string $method method name in container + * @param array $arguments [optional] arguments to pass + * @return mixed returns what the container returns + * @throws Zend_Navigation_Exception if method does not exist in container + */ + public function __call($method, array $arguments = array()) + { + return call_user_func_array( + array($this->getContainer(), $method), + $arguments); + } + + /** + * Magic overload: Proxy to {@link render()}. + * + * This method will trigger an E_USER_ERROR if rendering the helper causes + * an exception to be thrown. + * + * Implements {@link Zend_View_Helper_Navigation_Helper::__toString()}. + * + * @return string + */ + public function __toString() + { + try { + return $this->render(); + } catch (Exception $e) { + $msg = get_class($e) . ': ' . $e->getMessage(); + trigger_error($msg, E_USER_ERROR); + return ''; + } + } + + // Public methods: + + /** + * Finds the deepest active page in the given container + * + * @param Zend_Navigation_Container $container container to search + * @param int|null $minDepth [optional] minimum depth + * required for page to be + * valid. Default is to use + * {@link getMinDepth()}. A + * null value means no minimum + * depth required. + * @param int|null $minDepth [optional] maximum depth + * a page can have to be + * valid. Default is to use + * {@link getMaxDepth()}. A + * null value means no maximum + * depth required. + * @return array an associative array with + * the values 'depth' and + * 'page', or an empty array + * if not found + */ + public function findActive(Zend_Navigation_Container $container, + $minDepth = null, + $maxDepth = -1) + { + if (!is_int($minDepth)) { + $minDepth = $this->getMinDepth(); + } + if ((!is_int($maxDepth) || $maxDepth < 0) && null !== $maxDepth) { + $maxDepth = $this->getMaxDepth(); + } + + $found = null; + $foundDepth = -1; + $iterator = new RecursiveIteratorIterator($container, + RecursiveIteratorIterator::CHILD_FIRST); + + foreach ($iterator as $page) { + $currDepth = $iterator->getDepth(); + if ($currDepth < $minDepth || !$this->accept($page)) { + // page is not accepted + continue; + } + + if ($page->isActive(false) && $currDepth > $foundDepth) { + // found an active page at a deeper level than before + $found = $page; + $foundDepth = $currDepth; + } + } + + if (is_int($maxDepth) && $foundDepth > $maxDepth) { + while ($foundDepth > $maxDepth) { + if (--$foundDepth < $minDepth) { + $found = null; + break; + } + + $found = $found->getParent(); + if (!$found instanceof Zend_Navigation_Page) { + $found = null; + break; + } + } + } + + if ($found) { + return array('page' => $found, 'depth' => $foundDepth); + } else { + return array(); + } + } + + /** + * Checks if the helper has a container + * + * Implements {@link Zend_View_Helper_Navigation_Helper::hasContainer()}. + * + * @return bool whether the helper has a container or not + */ + public function hasContainer() + { + return null !== $this->_container; + } + + /** + * Checks if the helper has an ACL instance + * + * Implements {@link Zend_View_Helper_Navigation_Helper::hasAcl()}. + * + * @return bool whether the helper has a an ACL instance or not + */ + public function hasAcl() + { + return null !== $this->_acl; + } + + /** + * Checks if the helper has an ACL role + * + * Implements {@link Zend_View_Helper_Navigation_Helper::hasRole()}. + * + * @return bool whether the helper has a an ACL role or not + */ + public function hasRole() + { + return null !== $this->_role; + } + + /** + * Checks if the helper has a translator + * + * Implements {@link Zend_View_Helper_Navigation_Helper::hasTranslator()}. + * + * @return bool whether the helper has a translator or not + */ + public function hasTranslator() + { + return null !== $this->_translator; + } + + /** + * Returns an HTML string containing an 'a' element for the given page + * + * @param Zend_Navigation_Page $page page to generate HTML for + * @return string HTML string for the given page + */ + public function htmlify(Zend_Navigation_Page $page) + { + // get label and title for translating + $label = $page->getLabel(); + $title = $page->getTitle(); + + if ($this->getUseTranslator() && $t = $this->getTranslator()) { + if (is_string($label) && !empty($label)) { + $label = $t->translate($label); + } + if (is_string($title) && !empty($title)) { + $title = $t->translate($title); + } + } + + // get attribs for anchor element + $attribs = array( + 'id' => $page->getId(), + 'title' => $title, + 'class' => $page->getClass(), + 'href' => $page->getHref(), + 'target' => $page->getTarget() + ); + + return '_htmlAttribs($attribs) . '>' + . $this->view->escape($label) + . ''; + } + + // Iterator filter methods: + + /** + * Determines whether a page should be accepted when iterating + * + * Rules: + * - If a page is not visible it is not accepted, unless RenderInvisible has + * been set to true. + * - If helper has no ACL, page is accepted + * - If helper has ACL, but no role, page is not accepted + * - If helper has ACL and role: + * - Page is accepted if it has no resource or privilege + * - Page is accepted if ACL allows page's resource or privilege + * - If page is accepted by the rules above and $recursive is true, the page + * will not be accepted if it is the descendant of a non-accepted page. + * + * @param Zend_Navigation_Page $page page to check + * @param bool $recursive [optional] if true, page will not + * be accepted if it is the + * descendant of a page that is not + * accepted. Default is true. + * @return bool whether page should be accepted + */ + public function accept(Zend_Navigation_Page $page, $recursive = true) + { + // accept by default + $accept = true; + + if (!$page->isVisible(false) && !$this->getRenderInvisible()) { + // don't accept invisible pages + $accept = false; + } elseif ($this->getUseAcl() && !$this->_acceptAcl($page)) { + // acl is not amused + $accept = false; + } + + if ($accept && $recursive) { + $parent = $page->getParent(); + if ($parent instanceof Zend_Navigation_Page) { + $accept = $this->accept($parent, true); + } + } + + return $accept; + } + + /** + * Determines whether a page should be accepted by ACL when iterating + * + * Rules: + * - If helper has no ACL, page is accepted + * - If page has a resource or privilege defined, page is accepted + * if the ACL allows access to it using the helper's role + * - If page has no resource or privilege, page is accepted + * + * @param Zend_Navigation_Page $page page to check + * @return bool whether page is accepted by ACL + */ + protected function _acceptAcl(Zend_Navigation_Page $page) + { + if (!$acl = $this->getAcl()) { + // no acl registered means don't use acl + return true; + } + + $role = $this->getRole(); + $resource = $page->getResource(); + $privilege = $page->getPrivilege(); + + if ($resource || $privilege) { + // determine using helper role and page resource/privilege + return $acl->isAllowed($role, $resource, $privilege); + } + + return true; + } + + // Util methods: + + /** + * Retrieve whitespace representation of $indent + * + * @param int|string $indent + * @return string + */ + protected function _getWhitespace($indent) + { + if (is_int($indent)) { + $indent = str_repeat(' ', $indent); + } + + return (string) $indent; + } + + /** + * Converts an associative array to a string of tag attributes. + * + * Overloads {@link Zend_View_Helper_HtmlElement::_htmlAttribs()}. + * + * @param array $attribs an array where each key-value pair is converted + * to an attribute name and value + * @return string an attribute string + */ + protected function _htmlAttribs($attribs) + { + // filter out null values and empty string values + foreach ($attribs as $key => $value) { + if ($value === null || (is_string($value) && !strlen($value))) { + unset($attribs[$key]); + } + } + + return parent::_htmlAttribs($attribs); + } + + /** + * Normalize an ID + * + * Overrides {@link Zend_View_Helper_HtmlElement::_normalizeId()}. + * + * @param string $value + * @return string + */ + protected function _normalizeId($value) + { + $prefix = get_class($this); + $prefix = strtolower(trim(substr($prefix, strrpos($prefix, '_')), '_')); + + return $prefix . '-' . $value; + } + + // Static methods: + + /** + * Sets default ACL to use if another ACL is not explicitly set + * + * @param Zend_Acl $acl [optional] ACL object. Default is null, which + * sets no ACL object. + * @return void + */ + public static function setDefaultAcl(Zend_Acl $acl = null) + { + self::$_defaultAcl = $acl; + } + + /** + * Sets default ACL role(s) to use when iterating pages if not explicitly + * set later with {@link setRole()} + * + * @param midex $role [optional] role to set. Expects null, + * string, or an instance of + * {@link Zend_Acl_Role_Interface}. + * Default is null, which sets no default + * role. + * @throws Zend_View_Exception if role is invalid + * @return void + */ + public static function setDefaultRole($role = null) + { + if (null === $role || + is_string($role) || + $role instanceof Zend_Acl_Role_Interface) { + self::$_defaultRole = $role; + } else { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception( + '$role must be null|string|Zend_Acl_Role_Interface'); + } + } +} diff --git a/lib/zend/Zend/View/Helper/Navigation/Links.php b/lib/zend/Zend/View/Helper/Navigation/Links.php new file mode 100644 index 0000000000..f4302b8404 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Navigation/Links.php @@ -0,0 +1,779 @@ + elements + * + * @category Zend + * @package Zend_View + * @subpackage Helper + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_View_Helper_Navigation_Links + extends Zend_View_Helper_Navigation_HelperAbstract +{ + /**#@+ + * Constants used for specifying which link types to find and render + * + * @var int + */ + const RENDER_ALTERNATE = 0x0001; + const RENDER_STYLESHEET = 0x0002; + const RENDER_START = 0x0004; + const RENDER_NEXT = 0x0008; + const RENDER_PREV = 0x0010; + const RENDER_CONTENTS = 0x0020; + const RENDER_INDEX = 0x0040; + const RENDER_GLOSSARY = 0x0080; + const RENDER_COPYRIGHT = 0x0100; + const RENDER_CHAPTER = 0x0200; + const RENDER_SECTION = 0x0400; + const RENDER_SUBSECTION = 0x0800; + const RENDER_APPENDIX = 0x1000; + const RENDER_HELP = 0x2000; + const RENDER_BOOKMARK = 0x4000; + const RENDER_CUSTOM = 0x8000; + const RENDER_ALL = 0xffff; + /**#@+**/ + + /** + * Maps render constants to W3C link types + * + * @var array + */ + protected static $_RELATIONS = array( + self::RENDER_ALTERNATE => 'alternate', + self::RENDER_STYLESHEET => 'stylesheet', + self::RENDER_START => 'start', + self::RENDER_NEXT => 'next', + self::RENDER_PREV => 'prev', + self::RENDER_CONTENTS => 'contents', + self::RENDER_INDEX => 'index', + self::RENDER_GLOSSARY => 'glossary', + self::RENDER_COPYRIGHT => 'copyright', + self::RENDER_CHAPTER => 'chapter', + self::RENDER_SECTION => 'section', + self::RENDER_SUBSECTION => 'subsection', + self::RENDER_APPENDIX => 'appendix', + self::RENDER_HELP => 'help', + self::RENDER_BOOKMARK => 'bookmark' + ); + + /** + * The helper's render flag + * + * @see render() + * @see setRenderFlag() + * @var int + */ + protected $_renderFlag = self::RENDER_ALL; + + /** + * Root container + * + * Used for preventing methods to traverse above the container given to + * the {@link render()} method. + * + * @see _findRoot() + * + * @var Zend_Navigation_Container + */ + protected $_root; + + /** + * View helper entry point: + * Retrieves helper and optionally sets container to operate on + * + * @param Zend_Navigation_Container $container [optional] container to + * operate on + * @return Zend_View_Helper_Navigation_Links fluent interface, returns + * self + */ + public function links(Zend_Navigation_Container $container = null) + { + if (null !== $container) { + $this->setContainer($container); + } + + return $this; + } + + /** + * Magic overload: Proxy calls to {@link findRelation()} or container + * + * Examples of finder calls: + * + * // METHOD // SAME AS + * $h->findRelNext($page); // $h->findRelation($page, 'rel', 'next') + * $h->findRevSection($page); // $h->findRelation($page, 'rev', 'section'); + * $h->findRelFoo($page); // $h->findRelation($page, 'rel', 'foo'); + * + * + * @param string $method method name + * @param array $arguments method arguments + * @throws Zend_Navigation_Exception if method does not exist in container + */ + public function __call($method, array $arguments = array()) + { + if (@preg_match('/find(Rel|Rev)(.+)/', $method, $match)) { + return $this->findRelation($arguments[0], + strtolower($match[1]), + strtolower($match[2])); + } + + return parent::__call($method, $arguments); + } + + // Accessors: + + /** + * Sets the helper's render flag + * + * The helper uses the bitwise '&' operator against the hex values of the + * render constants. This means that the flag can is "bitwised" value of + * the render constants. Examples: + * + * // render all links except glossary + * $flag = Zend_View_Helper_Navigation_Links:RENDER_ALL ^ + * Zend_View_Helper_Navigation_Links:RENDER_GLOSSARY; + * $helper->setRenderFlag($flag); + * + * // render only chapters and sections + * $flag = Zend_View_Helper_Navigation_Links:RENDER_CHAPTER | + * Zend_View_Helper_Navigation_Links:RENDER_SECTION; + * $helper->setRenderFlag($flag); + * + * // render only relations that are not native W3C relations + * $helper->setRenderFlag(Zend_View_Helper_Navigation_Links:RENDER_CUSTOM); + * + * // render all relations (default) + * $helper->setRenderFlag(Zend_View_Helper_Navigation_Links:RENDER_ALL); + * + * + * Note that custom relations can also be rendered directly using the + * {@link renderLink()} method. + * + * @param int $renderFlag render flag + * @return Zend_View_Helper_Navigation_Links fluent interface, returns self + */ + public function setRenderFlag($renderFlag) + { + $this->_renderFlag = (int) $renderFlag; + return $this; + } + + /** + * Returns the helper's render flag + * + * @return int render flag + */ + public function getRenderFlag() + { + return $this->_renderFlag; + } + + // Finder methods: + + /** + * Finds all relations (forward and reverse) for the given $page + * + * The form of the returned array: + * + * // $page denotes an instance of Zend_Navigation_Page + * $returned = array( + * 'rel' => array( + * 'alternate' => array($page, $page, $page), + * 'start' => array($page), + * 'next' => array($page), + * 'prev' => array($page), + * 'canonical' => array($page) + * ), + * 'rev' => array( + * 'section' => array($page) + * ) + * ); + * + * + * @param Zend_Navigation_Page $page page to find links for + * @return array related pages + */ + public function findAllRelations(Zend_Navigation_Page $page, + $flag = null) + { + if (!is_int($flag)) { + $flag = self::RENDER_ALL; + } + + $result = array('rel' => array(), 'rev' => array()); + $native = array_values(self::$_RELATIONS); + + foreach (array_keys($result) as $rel) { + $meth = 'getDefined' . ucfirst($rel); + $types = array_merge($native, array_diff($page->$meth(), $native)); + + foreach ($types as $type) { + if (!$relFlag = array_search($type, self::$_RELATIONS)) { + $relFlag = self::RENDER_CUSTOM; + } + if (!($flag & $relFlag)) { + continue; + } + if ($found = $this->findRelation($page, $rel, $type)) { + if (!is_array($found)) { + $found = array($found); + } + $result[$rel][$type] = $found; + } + } + } + + return $result; + } + + /** + * Finds relations of the given $rel=$type from $page + * + * This method will first look for relations in the page instance, then + * by searching the root container if nothing was found in the page. + * + * @param Zend_Navigation_Page $page page to find relations for + * @param string $rel relation, "rel" or "rev" + * @param string $type link type, e.g. 'start', 'next' + * @return Zend_Navigaiton_Page|array|null page(s), or null if not found + * @throws Zend_View_Exception if $rel is not "rel" or "rev" + */ + public function findRelation(Zend_Navigation_Page $page, $rel, $type) + { + if (!in_array($rel, array('rel', 'rev'))) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + 'Invalid argument: $rel must be "rel" or "rev"; "%s" given', + $rel)); + } + + if (!$result = $this->_findFromProperty($page, $rel, $type)) { + $result = $this->_findFromSearch($page, $rel, $type); + } + + return $result; + } + + /** + * Finds relations of given $type for $page by checking if the + * relation is specified as a property of $page + * + * @param Zend_Navigation_Page $page page to find relations for + * @param string $rel relation, 'rel' or 'rev' + * @param string $type link type, e.g. 'start', 'next' + * @return Zend_Navigation_Page|array|null page(s), or null if not found + */ + protected function _findFromProperty(Zend_Navigation_Page $page, $rel, $type) + { + $method = 'get' . ucfirst($rel); + if ($result = $page->$method($type)) { + if ($result = $this->_convertToPages($result)) { + if (!is_array($result)) { + $result = array($result); + } + + foreach ($result as $key => $page) { + if (!$this->accept($page)) { + unset($result[$key]); + } + } + + return count($result) == 1 ? $result[0] : $result; + } + } + + return null; + } + + /** + * Finds relations of given $rel=$type for $page by using the helper to + * search for the relation in the root container + * + * @param Zend_Navigation_Page $page page to find relations for + * @param string $rel relation, 'rel' or 'rev' + * @param string $type link type, e.g. 'start', 'next', etc + * @return array|null array of pages, or null if not found + */ + protected function _findFromSearch(Zend_Navigation_Page $page, $rel, $type) + { + $found = null; + + $method = 'search' . ucfirst($rel) . ucfirst($type); + if (method_exists($this, $method)) { + $found = $this->$method($page); + } + + return $found; + } + + // Search methods: + + /** + * Searches the root container for the forward 'start' relation of the given + * $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to the first document in a collection of documents. This link type + * tells search engines which document is considered by the author to be the + * starting point of the collection. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|null page or null + */ + public function searchRelStart(Zend_Navigation_Page $page) + { + $found = $this->_findRoot($page); + if (!$found instanceof Zend_Navigation_Page) { + $found->rewind(); + $found = $found->current(); + } + + if ($found === $page || !$this->accept($found)) { + $found = null; + } + + return $found; + } + + /** + * Searches the root container for the forward 'next' relation of the given + * $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to the next document in a linear sequence of documents. User + * agents may choose to preload the "next" document, to reduce the perceived + * load time. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|null page(s) or null + */ + public function searchRelNext(Zend_Navigation_Page $page) + { + $found = null; + $break = false; + $iterator = new RecursiveIteratorIterator($this->_findRoot($page), + RecursiveIteratorIterator::SELF_FIRST); + foreach ($iterator as $intermediate) { + if ($intermediate === $page) { + // current page; break at next accepted page + $break = true; + continue; + } + + if ($break && $this->accept($intermediate)) { + $found = $intermediate; + break; + } + } + + return $found; + } + + /** + * Searches the root container for the forward 'prev' relation of the given + * $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to the previous document in an ordered series of documents. Some + * user agents also support the synonym "Previous". + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|null page or null + */ + public function searchRelPrev(Zend_Navigation_Page $page) + { + $found = null; + $prev = null; + $iterator = new RecursiveIteratorIterator( + $this->_findRoot($page), + RecursiveIteratorIterator::SELF_FIRST); + foreach ($iterator as $intermediate) { + if (!$this->accept($intermediate)) { + continue; + } + if ($intermediate === $page) { + $found = $prev; + break; + } + + $prev = $intermediate; + } + + return $found; + } + + /** + * Searches the root container for forward 'chapter' relations of the given + * $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to a document serving as a chapter in a collection of documents. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|array|null page(s) or null + */ + public function searchRelChapter(Zend_Navigation_Page $page) + { + $found = array(); + + // find first level of pages + $root = $this->_findRoot($page); + + // find start page(s) + $start = $this->findRelation($page, 'rel', 'start'); + if (!is_array($start)) { + $start = array($start); + } + + foreach ($root as $chapter) { + // exclude self and start page from chapters + if ($chapter !== $page && + !in_array($chapter, $start) && + $this->accept($chapter)) { + $found[] = $chapter; + } + } + + switch (count($found)) { + case 0: + return null; + case 1: + return $found[0]; + default: + return $found; + } + } + + /** + * Searches the root container for forward 'section' relations of the given + * $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to a document serving as a section in a collection of documents. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|array|null page(s) or null + */ + public function searchRelSection(Zend_Navigation_Page $page) + { + $found = array(); + + // check if given page has pages and is a chapter page + if ($page->hasPages() && $this->_findRoot($page)->hasPage($page)) { + foreach ($page as $section) { + if ($this->accept($section)) { + $found[] = $section; + } + } + } + + switch (count($found)) { + case 0: + return null; + case 1: + return $found[0]; + default: + return $found; + } + } + + /** + * Searches the root container for forward 'subsection' relations of the + * given $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to a document serving as a subsection in a collection of + * documents. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|array|null page(s) or null + */ + public function searchRelSubsection(Zend_Navigation_Page $page) + { + $found = array(); + + if ($page->hasPages()) { + // given page has child pages, loop chapters + foreach ($this->_findRoot($page) as $chapter) { + // is page a section? + if ($chapter->hasPage($page)) { + foreach ($page as $subsection) { + if ($this->accept($subsection)) { + $found[] = $subsection; + } + } + } + } + } + + switch (count($found)) { + case 0: + return null; + case 1: + return $found[0]; + default: + return $found; + } + } + + /** + * Searches the root container for the reverse 'section' relation of the + * given $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to a document serving as a section in a collection of documents. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|null page(s) or null + */ + public function searchRevSection(Zend_Navigation_Page $page) + { + $found = null; + + if ($parent = $page->getParent()) { + if ($parent instanceof Zend_Navigation_Page && + $this->_findRoot($page)->hasPage($parent)) { + $found = $parent; + } + } + + return $found; + } + + /** + * Searches the root container for the reverse 'section' relation of the + * given $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to a document serving as a subsection in a collection of + * documents. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|null page(s) or null + */ + public function searchRevSubsection(Zend_Navigation_Page $page) + { + $found = null; + + if ($parent = $page->getParent()) { + if ($parent instanceof Zend_Navigation_Page) { + $root = $this->_findRoot($page); + foreach ($root as $chapter) { + if ($chapter->hasPage($parent)) { + $found = $parent; + break; + } + } + } + } + + return $found; + } + + // Util methods: + + /** + * Returns the root container of the given page + * + * When rendering a container, the render method still store the given + * container as the root container, and unset it when done rendering. This + * makes sure finder methods will not traverse above the container given + * to the render method. + * + * @param Zend_Navigaiton_Page $page page to find root for + * @return Zend_Navigation_Container the root container of the given page + */ + protected function _findRoot(Zend_Navigation_Page $page) + { + if ($this->_root) { + return $this->_root; + } + + $root = $page; + + while ($parent = $page->getParent()) { + $root = $parent; + if ($parent instanceof Zend_Navigation_Page) { + $page = $parent; + } else { + break; + } + } + + return $root; + } + + /** + * Converts a $mixed value to an array of pages + * + * @param mixed $mixed mixed value to get page(s) from + * @param bool $recursive whether $value should be looped + * if it is an array or a config + * @return Zend_Navigation_Page|array|null empty if unable to convert + */ + protected function _convertToPages($mixed, $recursive = true) + { + if (is_object($mixed)) { + if ($mixed instanceof Zend_Navigation_Page) { + // value is a page instance; return directly + return $mixed; + } elseif ($mixed instanceof Zend_Navigation_Container) { + // value is a container; return pages in it + $pages = array(); + foreach ($mixed as $page) { + $pages[] = $page; + } + return $pages; + } elseif ($mixed instanceof Zend_Config) { + // convert config object to array and extract + return $this->_convertToPages($mixed->toArray(), $recursive); + } + } elseif (is_string($mixed)) { + // value is a string; make an URI page + return Zend_Navigation_Page::factory(array( + 'type' => 'uri', + 'uri' => $mixed + )); + } elseif (is_array($mixed) && !empty($mixed)) { + if ($recursive && is_numeric(key($mixed))) { + // first key is numeric; assume several pages + $pages = array(); + foreach ($mixed as $value) { + if ($value = $this->_convertToPages($value, false)) { + $pages[] = $value; + } + } + return $pages; + } else { + // pass array to factory directly + try { + $page = Zend_Navigation_Page::factory($mixed); + return $page; + } catch (Exception $e) { + } + } + } + + // nothing found + return null; + } + + // Render methods: + + /** + * Renders the given $page as a link element, with $attrib = $relation + * + * @param Zend_Navigation_Page $page the page to render the link for + * @param string $attrib the attribute to use for $type, + * either 'rel' or 'rev' + * @param string $relation relation type, muse be one of; + * alternate, appendix, bookmark, + * chapter, contents, copyright, + * glossary, help, home, index, next, + * prev, section, start, stylesheet, + * subsection + * @return string rendered link element + * @throws Zend_View_Exception if $attrib is invalid + */ + public function renderLink(Zend_Navigation_Page $page, $attrib, $relation) + { + if (!in_array($attrib, array('rel', 'rev'))) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + 'Invalid relation attribute "%s", must be "rel" or "rev"', + $attrib)); + } + + if (!$href = $page->getHref()) { + return ''; + } + + // TODO: add more attribs + // http://www.w3.org/TR/html401/struct/links.html#h-12.2 + $attribs = array( + $attrib => $relation, + 'href' => $href, + 'title' => $page->getLabel() + ); + + return '_htmlAttribs($attribs) . + $this->getClosingBracket(); + } + + // Zend_View_Helper_Navigation_Helper: + + /** + * Renders helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + */ + public function render(Zend_Navigation_Container $container = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + if ($active = $this->findActive($container)) { + $active = $active['page']; + } else { + // no active page + return ''; + } + + $output = ''; + $indent = $this->getIndent(); + $this->_root = $container; + + $result = $this->findAllRelations($active, $this->getRenderFlag()); + foreach ($result as $attrib => $types) { + foreach ($types as $relation => $pages) { + foreach ($pages as $page) { + if ($r = $this->renderLink($page, $attrib, $relation)) { + $output .= $indent . $r . self::EOL; + } + } + } + } + + $this->_root = null; + + // return output (trim last newline by spec) + return strlen($output) ? rtrim($output, self::EOL) : ''; + } +} diff --git a/lib/zend/Zend/View/Helper/Navigation/Menu.php b/lib/zend/Zend/View/Helper/Navigation/Menu.php new file mode 100644 index 0000000000..be14ba914e --- /dev/null +++ b/lib/zend/Zend/View/Helper/Navigation/Menu.php @@ -0,0 +1,641 @@ +setContainer($container); + } + + return $this; + } + + // Accessors: + + /** + * Sets CSS class to use for the first 'ul' element when rendering + * + * @param string $ulClass CSS class to set + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setUlClass($ulClass) + { + if (is_string($ulClass)) { + $this->_ulClass = $ulClass; + } + + return $this; + } + + /** + * Returns CSS class to use for the first 'ul' element when rendering + * + * @return string CSS class + */ + public function getUlClass() + { + return $this->_ulClass; + } + + /** + * Sets a flag indicating whether only active branch should be rendered + * + * @param bool $flag [optional] render only active + * branch. Default is true. + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setOnlyActiveBranch($flag = true) + { + $this->_onlyActiveBranch = (bool) $flag; + return $this; + } + + /** + * Returns a flag indicating whether only active branch should be rendered + * + * By default, this value is false, meaning the entire menu will be + * be rendered. + * + * @return bool whether only active branch should be rendered + */ + public function getOnlyActiveBranch() + { + return $this->_onlyActiveBranch; + } + + /** + * Enables/disables rendering of parents when only rendering active branch + * + * See {@link setOnlyActiveBranch()} for more information. + * + * @param bool $flag [optional] render parents when + * rendering active branch. + * Default is true. + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setRenderParents($flag = true) + { + $this->_renderParents = (bool) $flag; + return $this; + } + + /** + * Returns flag indicating whether parents should be rendered when rendering + * only the active branch + * + * By default, this value is true. + * + * @return bool whether parents should be rendered + */ + public function getRenderParents() + { + return $this->_renderParents; + } + + /** + * Sets which partial view script to use for rendering menu + * + * @param string|array $partial partial view script or null. If + * an array is given, it is + * expected to contain two values; + * the partial view script to use, + * and the module where the script + * can be found. + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setPartial($partial) + { + if (null === $partial || is_string($partial) || is_array($partial)) { + $this->_partial = $partial; + } + + return $this; + } + + /** + * Returns partial view script to use for rendering menu + * + * @return string|array|null + */ + public function getPartial() + { + return $this->_partial; + } + + // Public methods: + + /** + * Returns an HTML string containing an 'a' element for the given page if + * the page's href is not empty, and a 'span' element if it is empty + * + * Overrides {@link Zend_View_Helper_Navigation_Abstract::htmlify()}. + * + * @param Zend_Navigation_Page $page page to generate HTML for + * @return string HTML string for the given page + */ + public function htmlify(Zend_Navigation_Page $page) + { + // get label and title for translating + $label = $page->getLabel(); + $title = $page->getTitle(); + + // translate label and title? + if ($this->getUseTranslator() && $t = $this->getTranslator()) { + if (is_string($label) && !empty($label)) { + $label = $t->translate($label); + } + if (is_string($title) && !empty($title)) { + $title = $t->translate($title); + } + } + + // get attribs for element + $attribs = array( + 'id' => $page->getId(), + 'title' => $title, + 'class' => $page->getClass() + ); + + // does page have a href? + if ($href = $page->getHref()) { + $element = 'a'; + $attribs['href'] = $href; + $attribs['target'] = $page->getTarget(); + } else { + $element = 'span'; + } + + return '<' . $element . $this->_htmlAttribs($attribs) . '>' + . $this->view->escape($label) + . ''; + } + + /** + * Normalizes given render options + * + * @param array $options [optional] options to normalize + * @return array normalized options + */ + protected function _normalizeOptions(array $options = array()) + { + if (isset($options['indent'])) { + $options['indent'] = $this->_getWhitespace($options['indent']); + } else { + $options['indent'] = $this->getIndent(); + } + + if (isset($options['ulClass']) && $options['ulClass'] !== null) { + $options['ulClass'] = (string) $options['ulClass']; + } else { + $options['ulClass'] = $this->getUlClass(); + } + + if (array_key_exists('minDepth', $options)) { + if (null !== $options['minDepth']) { + $options['minDepth'] = (int) $options['minDepth']; + } + } else { + $options['minDepth'] = $this->getMinDepth(); + } + + if ($options['minDepth'] < 0 || $options['minDepth'] === null) { + $options['minDepth'] = 0; + } + + if (array_key_exists('maxDepth', $options)) { + if (null !== $options['maxDepth']) { + $options['maxDepth'] = (int) $options['maxDepth']; + } + } else { + $options['maxDepth'] = $this->getMaxDepth(); + } + + if (!isset($options['onlyActiveBranch'])) { + $options['onlyActiveBranch'] = $this->getOnlyActiveBranch(); + } + + if (!isset($options['renderParents'])) { + $options['renderParents'] = $this->getRenderParents(); + } + + return $options; + } + + // Render methods: + + /** + * Renders the deepest active menu within [$minDepth, $maxDeth], (called + * from {@link renderMenu()}) + * + * @param Zend_Navigation_Container $container container to render + * @param array $active active page and depth + * @param string $ulClass CSS class for first UL + * @param string $indent initial indentation + * @param int|null $minDepth minimum depth + * @param int|null $maxDepth maximum depth + * @return string rendered menu + */ + protected function _renderDeepestMenu(Zend_Navigation_Container $container, + $ulClass, + $indent, + $minDepth, + $maxDepth) + { + if (!$active = $this->findActive($container, $minDepth - 1, $maxDepth)) { + return ''; + } + + // special case if active page is one below minDepth + if ($active['depth'] < $minDepth) { + if (!$active['page']->hasPages()) { + return ''; + } + } else if (!$active['page']->hasPages()) { + // found pages has no children; render siblings + $active['page'] = $active['page']->getParent(); + } else if (is_int($maxDepth) && $active['depth'] +1 > $maxDepth) { + // children are below max depth; render siblings + $active['page'] = $active['page']->getParent(); + } + + $ulClass = $ulClass ? ' class="' . $ulClass . '"' : ''; + $html = $indent . '' . self::EOL; + + foreach ($active['page'] as $subPage) { + if (!$this->accept($subPage)) { + continue; + } + $liClass = $subPage->isActive(true) ? ' class="active"' : ''; + $html .= $indent . ' ' . self::EOL; + $html .= $indent . ' ' . $this->htmlify($subPage) . self::EOL; + $html .= $indent . ' ' . self::EOL; + } + + $html .= $indent . ''; + + return $html; + } + + /** + * Renders a normal menu (called from {@link renderMenu()}) + * + * @param Zend_Navigation_Container $container container to render + * @param string $ulClass CSS class for first UL + * @param string $indent initial indentation + * @param int|null $minDepth minimum depth + * @param int|null $maxDepth maximum depth + * @param bool $onlyActive render only active branch? + * @return string + */ + protected function _renderMenu(Zend_Navigation_Container $container, + $ulClass, + $indent, + $minDepth, + $maxDepth, + $onlyActive) + { + $html = ''; + + // find deepest active + if ($found = $this->findActive($container, $minDepth, $maxDepth)) { + $foundPage = $found['page']; + $foundDepth = $found['depth']; + } else { + $foundPage = null; + } + + // create iterator + $iterator = new RecursiveIteratorIterator($container, + RecursiveIteratorIterator::SELF_FIRST); + if (is_int($maxDepth)) { + $iterator->setMaxDepth($maxDepth); + } + + // iterate container + $prevDepth = -1; + foreach ($iterator as $page) { + $depth = $iterator->getDepth(); + $isActive = $page->isActive(true); + if ($depth < $minDepth || !$this->accept($page)) { + // page is below minDepth or not accepted by acl/visibilty + continue; + } else if ($onlyActive && !$isActive) { + // page is not active itself, but might be in the active branch + $accept = false; + if ($foundPage) { + if ($foundPage->hasPage($page)) { + // accept if page is a direct child of the active page + $accept = true; + } else if ($foundPage->getParent()->hasPage($page)) { + // page is a sibling of the active page... + if (!$foundPage->hasPages() || + is_int($maxDepth) && $foundDepth + 1 > $maxDepth) { + // accept if active page has no children, or the + // children are too deep to be rendered + $accept = true; + } + } + } + + if (!$accept) { + continue; + } + } + + // make sure indentation is correct + $depth -= $minDepth; + $myIndent = $indent . str_repeat(' ', $depth); + + if ($depth > $prevDepth) { + // start new ul tag + if ($ulClass && $depth == 0) { + $ulClass = ' class="' . $ulClass . '"'; + } else { + $ulClass = ''; + } + $html .= $myIndent . '' . self::EOL; + } else if ($prevDepth > $depth) { + // close li/ul tags until we're at current depth + for ($i = $prevDepth; $i > $depth; $i--) { + $ind = $indent . str_repeat(' ', $i); + $html .= $ind . ' ' . self::EOL; + $html .= $ind . '' . self::EOL; + } + // close previous li tag + $html .= $myIndent . ' ' . self::EOL; + } else { + // close previous li tag + $html .= $myIndent . ' ' . self::EOL; + } + + // render li tag and page + $liClass = $isActive ? ' class="active"' : ''; + $html .= $myIndent . ' ' . self::EOL + . $myIndent . ' ' . $this->htmlify($page) . self::EOL; + + // store as previous depth for next iteration + $prevDepth = $depth; + } + + if ($html) { + // done iterating container; close open ul/li tags + for ($i = $prevDepth+1; $i > 0; $i--) { + $myIndent = $indent . str_repeat(' ', $i-1); + $html .= $myIndent . ' ' . self::EOL + . $myIndent . '' . self::EOL; + } + $html = rtrim($html, self::EOL); + } + + return $html; + } + + /** + * Renders helper + * + * Renders a HTML 'ul' for the given $container. If $container is not given, + * the container registered in the helper will be used. + * + * Available $options: + * + * + * @param Zend_Navigation_Container $container [optional] container to + * create menu from. Default + * is to use the container + * retrieved from + * {@link getContainer()}. + * @param array $options [optional] options for + * controlling rendering + * @return string rendered menu + */ + public function renderMenu(Zend_Navigation_Container $container = null, + array $options = array()) + { + if (null === $container) { + $container = $this->getContainer(); + } + + $options = $this->_normalizeOptions($options); + + if ($options['onlyActiveBranch'] && !$options['renderParents']) { + $html = $this->_renderDeepestMenu($container, + $options['ulClass'], + $options['indent'], + $options['minDepth'], + $options['maxDepth']); + } else { + $html = $this->_renderMenu($container, + $options['ulClass'], + $options['indent'], + $options['minDepth'], + $options['maxDepth'], + $options['onlyActiveBranch']); + } + + return $html; + } + + /** + * Renders the inner-most sub menu for the active page in the $container + * + * This is a convenience method which is equivalent to the following call: + * + * renderMenu($container, array( + * 'indent' => $indent, + * 'ulClass' => $ulClass, + * 'minDepth' => null, + * 'maxDepth' => null, + * 'onlyActiveBranch' => true, + * 'renderParents' => false + * )); + * + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to render + * the container registered in + * the helper. + * @param string $ulClass [optional] CSS class to + * use for UL element. Default + * is to use the value from + * {@link getUlClass()}. + * @param string|int $indent [optional] indentation as + * a string or number of + * spaces. Default is to use + * the value retrieved from + * {@link getIndent()}. + * @return string rendered content + */ + public function renderSubMenu(Zend_Navigation_Container $container = null, + $ulClass = null, + $indent = null) + { + return $this->renderMenu($container, array( + 'indent' => $indent, + 'ulClass' => $ulClass, + 'minDepth' => null, + 'maxDepth' => null, + 'onlyActiveBranch' => true, + 'renderParents' => false + )); + } + + /** + * Renders the given $container by invoking the partial view helper + * + * The container will simply be passed on as a model to the view script + * as-is, and will be available in the partial script as 'container', e.g. + * echo 'Number of pages: ', count($this->container);. + * + * @param Zend_Navigation_Container $container [optional] container to + * pass to view script. Default + * is to use the container + * registered in the helper. + * @param string|array $partial [optional] partial view + * script to use. Default is to + * use the partial registered + * in the helper. If an array + * is given, it is expected to + * contain two values; the + * partial view script to use, + * and the module where the + * script can be found. + * @return string helper output + */ + public function renderPartial(Zend_Navigation_Container $container = null, + $partial = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + if (null === $partial) { + $partial = $this->getPartial(); + } + + if (empty($partial)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception( + 'Unable to render menu: No partial view script provided'); + } + + $model = array( + 'container' => $container + ); + + if (is_array($partial)) { + if (count($partial) != 2) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception( + 'Unable to render menu: A view partial supplied as ' . + 'an array must contain two values: partial view ' . + 'script and module where script can be found'); + } + + return $this->view->partial($partial[0], $partial[1], $model); + } + + return $this->view->partial($partial, null, $model); + } + + // Zend_View_Helper_Navigation_Helper: + + /** + * Renders menu + * + * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. + * + * If a partial view is registered in the helper, the menu will be rendered + * using the given partial script. If no partial is registered, the menu + * will be rendered as an 'ul' element by the helper's internal method. + * + * @see renderPartial() + * @see renderMenu() + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + */ + public function render(Zend_Navigation_Container $container = null) + { + if ($partial = $this->getPartial()) { + return $this->renderPartial($container, $partial); + } else { + return $this->renderMenu($container); + } + } +} diff --git a/lib/zend/Zend/View/Helper/Navigation/Sitemap.php b/lib/zend/Zend/View/Helper/Navigation/Sitemap.php new file mode 100644 index 0000000000..25c25e4fa6 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Navigation/Sitemap.php @@ -0,0 +1,470 @@ + tag + * + * @var string + */ + const SITEMAP_NS = 'http://www.sitemaps.org/schemas/sitemap/0.9'; + + /** + * Schema URL + * + * @var string + */ + const SITEMAP_XSD = 'http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'; + + /** + * Whether XML output should be formatted + * + * @var bool + */ + protected $_formatOutput = false; + + /** + * Whether the XML declaration should be included in XML output + * + * @var bool + */ + protected $_useXmlDeclaration = true; + + /** + * Whether sitemap should be validated using Zend_Validate_Sitemap_* + * + * @var bool + */ + protected $_useSitemapValidators = true; + + /** + * Whether sitemap should be schema validated when generated + * + * @var bool + */ + protected $_useSchemaValidation = false; + + /** + * Server url + * + * @var string + */ + protected $_serverUrl; + + /** + * View helper entry point: + * Retrieves helper and optionally sets container to operate on + * + * @param Zend_Navigation_Container $container [optional] container to + * operate on + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function sitemap(Zend_Navigation_Container $container = null) + { + if (null !== $container) { + $this->setContainer($container); + } + + return $this; + } + + // Accessors: + + /** + * Sets whether XML output should be formatted + * + * @param bool $formatOutput [optional] whether output + * should be formatted. Default + * is true. + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function setFormatOutput($formatOutput = true) + { + $this->_formatOutput = (bool) $formatOutput; + return $this; + } + + /** + * Returns whether XML output should be formatted + * + * @return bool whether XML output should be formatted + */ + public function getFormatOutput() + { + return $this->_formatOutput; + } + + /** + * Sets whether the XML declaration should be used in output + * + * @param bool $useXmlDecl whether XML delcaration + * should be rendered + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function setUseXmlDeclaration($useXmlDecl) + { + $this->_useXmlDeclaration = (bool) $useXmlDecl; + return $this; + } + + /** + * Returns whether the XML declaration should be used in output + * + * @return bool whether the XML declaration should be used in output + */ + public function getUseXmlDeclaration() + { + return $this->_useXmlDeclaration; + } + + /** + * Sets whether sitemap should be validated using Zend_Validate_Sitemap_* + * + * @param bool $useSitemapValidators whether sitemap validators + * should be used + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function setUseSitemapValidators($useSitemapValidators) + { + $this->_useSitemapValidators = (bool) $useSitemapValidators; + return $this; + } + + /** + * Returns whether sitemap should be validated using Zend_Validate_Sitemap_* + * + * @return bool whether sitemap should be validated using validators + */ + public function getUseSitemapValidators() + { + return $this->_useSitemapValidators; + } + + /** + * Sets whether sitemap should be schema validated when generated + * + * @param bool $schemaValidation whether sitemap should + * validated using XSD Schema + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function setUseSchemaValidation($schemaValidation) + { + $this->_useSchemaValidation = (bool) $schemaValidation; + return $this; + } + + /** + * Returns true if sitemap should be schema validated when generated + * + * @return bool + */ + public function getUseSchemaValidation() + { + return $this->_useSchemaValidation; + } + + /** + * Sets server url (scheme and host-related stuff without request URI) + * + * E.g. http://www.example.com + * + * @param string $serverUrl server URL to set (only + * scheme and host) + * @throws Zend_Uri_Exception if invalid server URL + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function setServerUrl($serverUrl) + { + require_once 'Zend/Uri.php'; + $uri = Zend_Uri::factory($serverUrl); + $uri->setFragment(''); + $uri->setPath(''); + $uri->setQuery(''); + + if ($uri->valid()) { + $this->_serverUrl = $uri->getUri(); + } else { + require_once 'Zend/Uri/Exception.php'; + throw new Zend_Uri_Exception(sprintf( + 'Invalid server URL: "%s"', + $serverUrl)); + } + + return $this; + } + + /** + * Returns server URL + * + * @return string server URL + */ + public function getServerUrl() + { + if (!isset($this->_serverUrl)) { + $this->_serverUrl = $this->view->serverUrl(); + } + + return $this->_serverUrl; + } + + // Helper methods: + + /** + * Escapes string for XML usage + * + * @param string $string string to escape + * @return string escaped string + */ + protected function _xmlEscape($string) + { + // TODO: remove check when minimum PHP version is >= 5.2.3 + if (version_compare(PHP_VERSION, '5.2.3', '>=')) { + // do not encode existing HTML entities + return htmlspecialchars($string, ENT_QUOTES, 'UTF-8', false); + } else { + $string = preg_replace('/&(?!(?:#\d++|[a-z]++);)/ui', '&', $string); + $string = str_replace(array('<', '>', '\'', '"'), array('<', '>', ''', '"'), $string); + return $string; + } + } + + // Public methods: + + /** + * Returns an escaped absolute URL for the given page + * + * @param Zend_Navigation_Page $page page to get URL from + * @return string + */ + public function url(Zend_Navigation_Page $page) + { + $href = $page->getHref(); + + if (!isset($href{0})) { + // no href + return ''; + } elseif ($href{0} == '/') { + // href is relative to root; use serverUrl helper + $url = $this->getServerUrl() . $href; + } elseif (preg_match('/^[a-z]+:/im', (string) $href)) { + // scheme is given in href; assume absolute URL already + $url = (string) $href; + } else { + // href is relative to current document; use url helpers + $url = $this->getServerUrl() + . rtrim($this->view->url(), '/') . '/' + . $href; + } + + return $this->_xmlEscape($url); + } + + /** + * Returns a DOMDocument containing the Sitemap XML for the given container + * + * @param Zend_Navigation_Container $container [optional] container to get + * breadcrumbs from, defaults + * to what is registered in the + * helper + * @return DOMDocument DOM representation of the + * container + * @throws Zend_View_Exception if schema validation is on + * and the sitemap is invalid + * according to the sitemap + * schema, or if sitemap + * validators are used and the + * loc element fails validation + */ + public function getDomSitemap(Zend_Navigation_Container $container = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + // check if we should validate using our own validators + if ($this->getUseSitemapValidators()) { + require_once 'Zend/Validate/Sitemap/Changefreq.php'; + require_once 'Zend/Validate/Sitemap/Lastmod.php'; + require_once 'Zend/Validate/Sitemap/Loc.php'; + require_once 'Zend/Validate/Sitemap/Priority.php'; + + // create validators + $locValidator = new Zend_Validate_Sitemap_Loc(); + $lastmodValidator = new Zend_Validate_Sitemap_Lastmod(); + $changefreqValidator = new Zend_Validate_Sitemap_Changefreq(); + $priorityValidator = new Zend_Validate_Sitemap_Priority(); + } + + // create document + $dom = new DOMDocument('1.0', 'UTF-8'); + $dom->formatOutput = $this->getFormatOutput(); + + // ...and urlset (root) element + $urlSet = $dom->createElementNS(self::SITEMAP_NS, 'urlset'); + $dom->appendChild($urlSet); + + // create iterator + $iterator = new RecursiveIteratorIterator($container, + RecursiveIteratorIterator::SELF_FIRST); + + $maxDepth = $this->getMaxDepth(); + if (is_int($maxDepth)) { + $iterator->setMaxDepth($maxDepth); + } + $minDepth = $this->getMinDepth(); + if (!is_int($minDepth) || $minDepth < 0) { + $minDepth = 0; + } + + // iterate container + foreach ($iterator as $page) { + if ($iterator->getDepth() < $minDepth || !$this->accept($page)) { + // page should not be included + continue; + } + + // get absolute url from page + if (!$url = $this->url($page)) { + // skip page if it has no url (rare case) + continue; + } + + // create url node for this page + $urlNode = $dom->createElementNS(self::SITEMAP_NS, 'url'); + $urlSet->appendChild($urlNode); + + if ($this->getUseSitemapValidators() && + !$locValidator->isValid($url)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + 'Encountered an invalid URL for Sitemap XML: "%s"', + $url)); + } + + // put url in 'loc' element + $urlNode->appendChild($dom->createElementNS(self::SITEMAP_NS, + 'loc', $url)); + + // add 'lastmod' element if a valid lastmod is set in page + if (isset($page->lastmod)) { + $lastmod = strtotime((string) $page->lastmod); + + // prevent 1970-01-01... + if ($lastmod !== false) { + $lastmod = date('c', $lastmod); + } + + if (!$this->getUseSitemapValidators() || + $lastmodValidator->isValid($lastmod)) { + $urlNode->appendChild( + $dom->createElementNS(self::SITEMAP_NS, 'lastmod', + $lastmod) + ); + } + } + + // add 'changefreq' element if a valid changefreq is set in page + if (isset($page->changefreq)) { + $changefreq = $page->changefreq; + if (!$this->getUseSitemapValidators() || + $changefreqValidator->isValid($changefreq)) { + $urlNode->appendChild( + $dom->createElementNS(self::SITEMAP_NS, 'changefreq', + $changefreq) + ); + } + } + + // add 'priority' element if a valid priority is set in page + if (isset($page->priority)) { + $priority = $page->priority; + if (!$this->getUseSitemapValidators() || + $priorityValidator->isValid($priority)) { + $urlNode->appendChild( + $dom->createElementNS(self::SITEMAP_NS, 'priority', + $priority) + ); + } + } + } + + // validate using schema if specified + if ($this->getUseSchemaValidation()) { + if (!@$dom->schemaValidate(self::SITEMAP_XSD)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + 'Sitemap is invalid according to XML Schema at "%s"', + self::SITEMAP_XSD)); + } + } + + return $dom; + } + + // Zend_View_Helper_Navigation_Helper: + + /** + * Renders helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + */ + public function render(Zend_Navigation_Container $container = null) + { + $dom = $this->getDomSitemap($container); + + $xml = $this->getUseXmlDeclaration() ? + $dom->saveXML() : + $dom->saveXML($dom->documentElement); + + return rtrim($xml, PHP_EOL); + } +} diff --git a/lib/zend/Zend/View/Helper/PaginationControl.php b/lib/zend/Zend/View/Helper/PaginationControl.php new file mode 100644 index 0000000000..959e38f68c --- /dev/null +++ b/lib/zend/Zend/View/Helper/PaginationControl.php @@ -0,0 +1,141 @@ +view = $view; + return $this; + } + + /** + * Sets the default view partial. + * + * @param string $partial View partial + */ + public static function setDefaultViewPartial($partial) + { + self::$_defaultViewPartial = $partial; + } + + /** + * Gets the default view partial + * + * @return string + */ + public static function getDefaultViewPartial() + { + return self::$_defaultViewPartial; + } + + /** + * Render the provided pages. This checks if $view->paginator is set and, + * if so, uses that. Also, if no scrolling style or partial are specified, + * the defaults will be used (if set). + * + * @param Zend_Paginator (Optional) $paginator + * @param string $scrollingStyle (Optional) Scrolling style + * @param string $partial (Optional) View partial + * @param array|string $params (Optional) params to pass to the partial + * @return string + * @throws Zend_View_Exception + */ + public function paginationControl(Zend_Paginator $paginator = null, $scrollingStyle = null, $partial = null, $params = null) + { + if ($paginator === null) { + if (isset($this->view->paginator) and $this->view->paginator !== null and $this->view->paginator instanceof Zend_Paginator) { + $paginator = $this->view->paginator; + } else { + /** + * @see Zend_View_Exception + */ + require_once 'Zend/View/Exception.php'; + + throw new Zend_View_Exception('No paginator instance provided or incorrect type'); + } + } + + if ($partial === null) { + if (self::$_defaultViewPartial === null) { + /** + * @see Zend_View_Exception + */ + require_once 'Zend/View/Exception.php'; + + throw new Zend_View_Exception('No view partial provided and no default set'); + } + + $partial = self::$_defaultViewPartial; + } + + $pages = get_object_vars($paginator->getPages($scrollingStyle)); + + if ($params !== null) { + $pages = array_merge($pages, (array) $params); + } + + if (is_array($partial)) { + if (count($partial) != 2) { + /** + * @see Zend_View_Exception + */ + require_once 'Zend/View/Exception.php'; + + throw new Zend_View_Exception('A view partial supplied as an array must contain two values: the filename and its module'); + } + + if ($partial[1] !== null) { + return $this->view->partial($partial[0], $partial[1], $pages); + } + + $partial = $partial[0]; + } + + return $this->view->partial($partial, $pages); + } +} \ No newline at end of file diff --git a/lib/zend/Zend/View/Helper/Partial.php b/lib/zend/Zend/View/Helper/Partial.php new file mode 100644 index 0000000000..ab6c16f716 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Partial.php @@ -0,0 +1,147 @@ +cloneView(); + if (isset($this->partialCounter)) { + $view->partialCounter = $this->partialCounter; + } + if ((null !== $module) && is_string($module)) { + require_once 'Zend/Controller/Front.php'; + $moduleDir = Zend_Controller_Front::getInstance()->getControllerDirectory($module); + if (null === $moduleDir) { + require_once 'Zend/View/Helper/Partial/Exception.php'; + throw new Zend_View_Helper_Partial_Exception('Cannot render partial; module does not exist'); + } + $viewsDir = dirname($moduleDir) . '/views'; + $view->addBasePath($viewsDir); + } elseif ((null == $model) && (null !== $module) + && (is_array($module) || is_object($module))) + { + $model = $module; + } + + if (!empty($model)) { + if (is_array($model)) { + $view->assign($model); + } elseif (is_object($model)) { + if (null !== ($objectKey = $this->getObjectKey())) { + $view->assign($objectKey, $model); + } elseif (method_exists($model, 'toArray')) { + $view->assign($model->toArray()); + } else { + $view->assign(get_object_vars($model)); + } + } + } + + return $view->render($name); + } + + /** + * Clone the current View + * + * @return Zend_View_Interface + */ + public function cloneView() + { + $view = clone $this->view; + $view->clearVars(); + return $view; + } + + /** + * Set object key + * + * @param string $key + * @return Zend_View_Helper_Partial + */ + public function setObjectKey($key) + { + if (null === $key) { + $this->_objectKey = null; + } else { + $this->_objectKey = (string) $key; + } + + return $this; + } + + /** + * Retrieve object key + * + * The objectKey is the variable to which an object in the iterator will be + * assigned. + * + * @return null|string + */ + public function getObjectKey() + { + return $this->_objectKey; + } +} diff --git a/lib/zend/Zend/View/Helper/Partial/Exception.php b/lib/zend/Zend/View/Helper/Partial/Exception.php new file mode 100644 index 0000000000..8e3bbd90c6 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Partial/Exception.php @@ -0,0 +1,39 @@ +toArray(); + } + + $content = ''; + // reset the counter if it's call again + $this->partialCounter = 0; + foreach ($model as $item) { + // increment the counter variable + $this->partialCounter++; + + $content .= $this->partial($name, $module, $item); + } + + return $content; + } +} diff --git a/lib/zend/Zend/View/Helper/Placeholder.php b/lib/zend/Zend/View/Helper/Placeholder.php new file mode 100644 index 0000000000..2dada150c9 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Placeholder.php @@ -0,0 +1,87 @@ +_registry = Zend_View_Helper_Placeholder_Registry::getRegistry(); + } + + + /** + * Placeholder helper + * + * @param string $name + * @return Zend_View_Helper_Placeholder_Container_Abstract + */ + public function placeholder($name) + { + $name = (string) $name; + return $this->_registry->getContainer($name); + } + + /** + * Retrieve the registry + * + * @return Zend_View_Helper_Placeholder_Registry + */ + public function getRegistry() + { + return $this->_registry; + } +} diff --git a/lib/zend/Zend/View/Helper/Placeholder/Container.php b/lib/zend/Zend/View/Helper/Placeholder/Container.php new file mode 100644 index 0000000000..de23a3c65e --- /dev/null +++ b/lib/zend/Zend/View/Helper/Placeholder/Container.php @@ -0,0 +1,36 @@ +exchangeArray(array($value)); + } + + /** + * Prepend a value to the top of the container + * + * @param mixed $value + * @return void + */ + public function prepend($value) + { + $values = $this->getArrayCopy(); + array_unshift($values, $value); + $this->exchangeArray($values); + } + + /** + * Retrieve container value + * + * If single element registered, returns that element; otherwise, + * serializes to array. + * + * @return mixed + */ + public function getValue() + { + if (1 == count($this)) { + $keys = $this->getKeys(); + $key = array_shift($keys); + return $this[$key]; + } + + return $this->getArrayCopy(); + } + + /** + * Set prefix for __toString() serialization + * + * @param string $prefix + * @return Zend_View_Helper_Placeholder_Container + */ + public function setPrefix($prefix) + { + $this->_prefix = (string) $prefix; + return $this; + } + + /** + * Retrieve prefix + * + * @return string + */ + public function getPrefix() + { + return $this->_prefix; + } + + /** + * Set postfix for __toString() serialization + * + * @param string $postfix + * @return Zend_View_Helper_Placeholder_Container + */ + public function setPostfix($postfix) + { + $this->_postfix = (string) $postfix; + return $this; + } + + /** + * Retrieve postfix + * + * @return string + */ + public function getPostfix() + { + return $this->_postfix; + } + + /** + * Set separator for __toString() serialization + * + * Used to implode elements in container + * + * @param string $separator + * @return Zend_View_Helper_Placeholder_Container + */ + public function setSeparator($separator) + { + $this->_separator = (string) $separator; + return $this; + } + + /** + * Retrieve separator + * + * @return string + */ + public function getSeparator() + { + return $this->_separator; + } + + /** + * Set the indentation string for __toString() serialization, + * optionally, if a number is passed, it will be the number of spaces + * + * @param string|int $indent + * @return Zend_View_Helper_Placeholder_Container_Abstract + */ + public function setIndent($indent) + { + $this->_indent = $this->getWhitespace($indent); + return $this; + } + + /** + * Retrieve indentation + * + * @return string + */ + public function getIndent() + { + return $this->_indent; + } + + /** + * Retrieve whitespace representation of $indent + * + * @param int|string $indent + * @return string + */ + public function getWhitespace($indent) + { + if (is_int($indent)) { + $indent = str_repeat(' ', $indent); + } + + return (string) $indent; + } + + /** + * Start capturing content to push into placeholder + * + * @param int $type How to capture content into placeholder; append, prepend, or set + * @return void + * @throws Zend_View_Helper_Placeholder_Exception if nested captures detected + */ + public function captureStart($type = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $key = null) + { + if ($this->_captureLock) { + require_once 'Zend/View/Helper/Placeholder/Container/Exception.php'; + throw new Zend_View_Helper_Placeholder_Container_Exception('Cannot nest placeholder captures for the same placeholder'); + } + + $this->_captureLock = true; + $this->_captureType = $type; + if ((null !== $key) && is_scalar($key)) { + $this->_captureKey = (string) $key; + } + ob_start(); + } + + /** + * End content capture + * + * @return void + */ + public function captureEnd() + { + $data = ob_get_clean(); + $key = null; + $this->_captureLock = false; + if (null !== $this->_captureKey) { + $key = $this->_captureKey; + } + switch ($this->_captureType) { + case self::SET: + if (null !== $key) { + $this[$key] = $data; + } else { + $this->exchangeArray(array($data)); + } + break; + case self::PREPEND: + if (null !== $key) { + $array = array($key => $data); + $values = $this->getArrayCopy(); + $final = $array + $values; + $this->exchangeArray($final); + } else { + $this->prepend($data); + } + break; + case self::APPEND: + default: + if (null !== $key) { + if (empty($this[$key])) { + $this[$key] = $data; + } else { + $this[$key] .= $data; + } + } else { + $this[$this->nextIndex()] = $data; + } + break; + } + } + + /** + * Get keys + * + * @return array + */ + public function getKeys() + { + $array = $this->getArrayCopy(); + return array_keys($array); + } + + /** + * Next Index + * + * as defined by the PHP manual + * @return int + */ + public function nextIndex() + { + $keys = $this->getKeys(); + if (0 == count($keys)) { + return 0; + } + + return $nextIndex = max($keys) + 1; + } + + /** + * Render the placeholder + * + * @return string + */ + public function toString($indent = null) + { + $indent = ($indent !== null) + ? $this->getWhitespace($indent) + : $this->getIndent(); + + $items = $this->getArrayCopy(); + $return = $indent + . $this->getPrefix() + . implode($this->getSeparator(), $items) + . $this->getPostfix(); + $return = preg_replace("/(\r\n?|\n)/", '$1' . $indent, $return); + return $return; + } + + /** + * Serialize object to string + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } +} diff --git a/lib/zend/Zend/View/Helper/Placeholder/Container/Exception.php b/lib/zend/Zend/View/Helper/Placeholder/Container/Exception.php new file mode 100644 index 0000000000..115651982b --- /dev/null +++ b/lib/zend/Zend/View/Helper/Placeholder/Container/Exception.php @@ -0,0 +1,39 @@ +setRegistry(Zend_View_Helper_Placeholder_Registry::getRegistry()); + $this->setContainer($this->getRegistry()->getContainer($this->_regKey)); + } + + /** + * Retrieve registry + * + * @return Zend_View_Helper_Placeholder_Registry + */ + public function getRegistry() + { + return $this->_registry; + } + + /** + * Set registry object + * + * @param Zend_View_Helper_Placeholder_Registry $registry + * @return Zend_View_Helper_Placeholder_Container_Standalone + */ + public function setRegistry(Zend_View_Helper_Placeholder_Registry $registry) + { + $this->_registry = $registry; + return $this; + } + + /** + * Set whether or not auto escaping should be used + * + * @param bool $autoEscape whether or not to auto escape output + * @return Zend_View_Helper_Placeholder_Container_Standalone + */ + public function setAutoEscape($autoEscape = true) + { + $this->_autoEscape = ($autoEscape) ? true : false; + return $this; + } + + /** + * Return whether autoEscaping is enabled or disabled + * + * return bool + */ + public function getAutoEscape() + { + return $this->_autoEscape; + } + + /** + * Escape a string + * + * @param string $string + * @return string + */ + protected function _escape($string) + { + if ($this->view instanceof Zend_View_Interface) { + return $this->view->escape($string); + } + + return htmlentities((string) $string, null, 'UTF-8'); + } + + /** + * Set container on which to operate + * + * @param Zend_View_Helper_Placeholder_Container_Abstract $container + * @return Zend_View_Helper_Placeholder_Container_Standalone + */ + public function setContainer(Zend_View_Helper_Placeholder_Container_Abstract $container) + { + $this->_container = $container; + return $this; + } + + /** + * Retrieve placeholder container + * + * @return Zend_View_Helper_Placeholder_Container_Abstract + */ + public function getContainer() + { + return $this->_container; + } + + /** + * Overloading: set property value + * + * @param string $key + * @param mixed $value + * @return void + */ + public function __set($key, $value) + { + $container = $this->getContainer(); + $container[$key] = $value; + } + + /** + * Overloading: retrieve property + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + $container = $this->getContainer(); + if (isset($container[$key])) { + return $container[$key]; + } + + return null; + } + + /** + * Overloading: check if property is set + * + * @param string $key + * @return bool + */ + public function __isset($key) + { + $container = $this->getContainer(); + return isset($container[$key]); + } + + /** + * Overloading: unset property + * + * @param string $key + * @return void + */ + public function __unset($key) + { + $container = $this->getContainer(); + if (isset($container[$key])) { + unset($container[$key]); + } + } + + /** + * Overload + * + * Proxy to container methods + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $container = $this->getContainer(); + if (method_exists($container, $method)) { + $return = call_user_func_array(array($container, $method), $args); + if ($return === $container) { + // If the container is returned, we really want the current object + return $this; + } + return $return; + } + + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('Method "' . $method . '" does not exist'); + } + + /** + * String representation + * + * @return string + */ + public function toString() + { + return $this->getContainer()->toString(); + } + + /** + * Cast to string representation + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Countable + * + * @return int + */ + public function count() + { + $container = $this->getContainer(); + return count($container); + } + + /** + * ArrayAccess: offsetExists + * + * @param string|int $offset + * @return bool + */ + public function offsetExists($offset) + { + return $this->getContainer()->offsetExists($offset); + } + + /** + * ArrayAccess: offsetGet + * + * @param string|int $offset + * @return mixed + */ + public function offsetGet($offset) + { + return $this->getContainer()->offsetGet($offset); + } + + /** + * ArrayAccess: offsetSet + * + * @param string|int $offset + * @param mixed $value + * @return void + */ + public function offsetSet($offset, $value) + { + return $this->getContainer()->offsetSet($offset, $value); + } + + /** + * ArrayAccess: offsetUnset + * + * @param string|int $offset + * @return void + */ + public function offsetUnset($offset) + { + return $this->getContainer()->offsetUnset($offset); + } + + /** + * IteratorAggregate: get Iterator + * + * @return Iterator + */ + public function getIterator() + { + return $this->getContainer()->getIterator(); + } +} diff --git a/lib/zend/Zend/View/Helper/Placeholder/Registry.php b/lib/zend/Zend/View/Helper/Placeholder/Registry.php new file mode 100644 index 0000000000..05dbe05c06 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Placeholder/Registry.php @@ -0,0 +1,186 @@ +_items[$key] = new $this->_containerClass(array()); + return $this->_items[$key]; + } + + /** + * Retrieve a placeholder container + * + * @param string $key + * @return Zend_View_Helper_Placeholder_Container_Abstract + */ + public function getContainer($key) + { + $key = (string) $key; + if (isset($this->_items[$key])) { + return $this->_items[$key]; + } + + $container = $this->createContainer($key); + + return $container; + } + + /** + * Does a particular container exist? + * + * @param string $key + * @return bool + */ + public function containerExists($key) + { + $key = (string) $key; + $return = array_key_exists($key, $this->_items); + return $return; + } + + /** + * Set the container for an item in the registry + * + * @param string $key + * @param Zend_View_Placeholder_Container_Abstract $container + * @return Zend_View_Placeholder_Registry + */ + public function setContainer($key, Zend_View_Helper_Placeholder_Container_Abstract $container) + { + $key = (string) $key; + $this->_items[$key] = $container; + return $this; + } + + /** + * Delete a container + * + * @param string $key + * @return bool + */ + public function deleteContainer($key) + { + $key = (string) $key; + if (isset($this->_items[$key])) { + unset($this->_items[$key]); + return true; + } + + return false; + } + + /** + * Set the container class to use + * + * @param string $name + * @return Zend_View_Helper_Placeholder_Registry + */ + public function setContainerClass($name) + { + if (!class_exists($name)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($name); + } + + $reflection = new ReflectionClass($name); + if (!$reflection->isSubclassOf(new ReflectionClass('Zend_View_Helper_Placeholder_Container_Abstract'))) { + require_once 'Zend/View/Helper/Placeholder/Registry/Exception.php'; + throw new Zend_View_Helper_Placeholder_Registry_Exception('Invalid Container class specified'); + } + + $this->_containerClass = $name; + return $this; + } + + /** + * Retrieve the container class + * + * @return string + */ + public function getContainerClass() + { + return $this->_containerClass; + } +} diff --git a/lib/zend/Zend/View/Helper/Placeholder/Registry/Exception.php b/lib/zend/Zend/View/Helper/Placeholder/Registry/Exception.php new file mode 100644 index 0000000000..aa0d594c43 --- /dev/null +++ b/lib/zend/Zend/View/Helper/Placeholder/Registry/Exception.php @@ -0,0 +1,39 @@ +view->placeholder($placeholder)->captureStart(); + echo $this->view->render($script); + $this->view->placeholder($placeholder)->captureEnd(); + } +} diff --git a/lib/zend/Zend/View/Helper/ServerUrl.php b/lib/zend/Zend/View/Helper/ServerUrl.php new file mode 100644 index 0000000000..9dc3dccd9b --- /dev/null +++ b/lib/zend/Zend/View/Helper/ServerUrl.php @@ -0,0 +1,144 @@ +setScheme($scheme); + + if (isset($_SERVER['HTTP_HOST']) && !empty($_SERVER['HTTP_HOST'])) { + $this->setHost($_SERVER['HTTP_HOST']); + } else if (isset($_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'])) { + $name = $_SERVER['SERVER_NAME']; + $port = $_SERVER['SERVER_PORT']; + + if (($scheme == 'http' && $port == 80) || + ($scheme == 'https' && $port == 443)) { + $this->setHost($name); + } else { + $this->setHost($name . ':' . $port); + } + } + } + + /** + * View helper entry point: + * Returns the current host's URL like http://site.com + * + * @param string|boolean $requestUri [optional] if true, the request URI + * found in $_SERVER will be appended + * as a path. If a string is given, it + * will be appended as a path. Default + * is to not append any path. + * @return string server url + */ + public function serverUrl($requestUri = null) + { + if ($requestUri === true) { + $path = $_SERVER['REQUEST_URI']; + } else if (is_string($requestUri)) { + $path = $requestUri; + } else { + $path = ''; + } + + return $this->getScheme() . '://' . $this->getHost() . $path; + } + + /** + * Returns host + * + * @return string host + */ + public function getHost() + { + return $this->_host; + } + + /** + * Sets host + * + * @param string $host new host + * @return Zend_View_Helper_ServerUrl fluent interface, returns self + */ + public function setHost($host) + { + $this->_host = $host; + return $this; + } + + /** + * Returns scheme (typically http or https) + * + * @return string scheme (typically http or https) + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * Sets scheme (typically http or https) + * + * @param string $scheme new scheme (typically http or https) + * @return Zend_View_Helper_ServerUrl fluent interface, returns self + */ + public function setScheme($scheme) + { + $this->_scheme = $scheme; + return $this; + } +} diff --git a/lib/zend/Zend/View/Helper/Translate.php b/lib/zend/Zend/View/Helper/Translate.php new file mode 100644 index 0000000000..28ff1f7b2a --- /dev/null +++ b/lib/zend/Zend/View/Helper/Translate.php @@ -0,0 +1,178 @@ +setTranslator($translate); + } + } + + /** + * Translate a message + * You can give multiple params or an array of params. + * If you want to output another locale just set it as last single parameter + * Example 1: translate('%1\$s + %2\$s', $value1, $value2, $locale); + * Example 2: translate('%1\$s + %2\$s', array($value1, $value2), $locale); + * + * @param string $messageid Id of the message to be translated + * @return string Translated message + */ + public function translate($messageid = null) + { + if ($messageid === null) { + return $this; + } + + $translate = $this->getTranslator(); + if ($translate === null) { + return $messageid; + } + + $options = func_get_args(); + array_shift($options); + + $count = count($options); + $locale = null; + if ($count > 0) { + if (Zend_Locale::isLocale($options[($count - 1)], null, false) !== false) { + $locale = array_pop($options); + } + } + + if ((count($options) === 1) and (is_array($options[0]) === true)) { + $options = $options[0]; + } + + $message = $translate->translate($messageid, $locale); + if (count($options) === 0) { + return $message; + } + + return vsprintf($message, $options); + } + + /** + * Sets a translation Adapter for translation + * + * @param Zend_Translate|Zend_Translate_Adapter $translate Instance of Zend_Translate + * @throws Zend_View_Exception When no or a false instance was set + * @return Zend_View_Helper_Translate + */ + public function setTranslator($translate) + { + if ($translate instanceof Zend_Translate_Adapter) { + $this->_translator = $translate; + } else if ($translate instanceof Zend_Translate) { + $this->_translator = $translate->getAdapter(); + } else { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter'); + } + + return $this; + } + + /** + * Retrieve translation object + * + * If none is currently registered, attempts to pull it from the registry + * using the key 'Zend_Translate'. + * + * @return Zend_Translate_Adapter|null + */ + public function getTranslator() + { + if ($this->_translator === null) { + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Translate') === true) { + $this->setTranslator(Zend_Registry::get('Zend_Translate')); + } + } + + return $this->_translator; + } + + /** + * Set's an new locale for all further translations + * + * @param string|Zend_Locale $locale New locale to set + * @throws Zend_View_Exception When no Zend_Translate instance was set + * @return Zend_View_Helper_Translate + */ + public function setLocale($locale = null) + { + $translate = $this->getTranslator(); + if ($translate === null) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter'); + } + + $translate->setLocale($locale); + return $this; + } + + /** + * Returns the set locale for translations + * + * @throws Zend_View_Exception When no Zend_Translate instance was set + * @return string|Zend_Locale + */ + public function getLocale() + { + $translate = $this->getTranslator(); + if ($translate === null) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception('You must set an instance of Zend_Translate or Zend_Translate_Adapter'); + } + + return $translate->getLocale(); + } +} diff --git a/lib/zend/Zend/View/Helper/Url.php b/lib/zend/Zend/View/Helper/Url.php new file mode 100644 index 0000000000..63a6db214f --- /dev/null +++ b/lib/zend/Zend/View/Helper/Url.php @@ -0,0 +1,51 @@ +getRouter(); + return $router->assemble($urlOptions, $name, $reset, $encode); + } +} diff --git a/lib/zend/Zend/View/Interface.php b/lib/zend/Zend/View/Interface.php new file mode 100644 index 0000000000..141e2a9061 --- /dev/null +++ b/lib/zend/Zend/View/Interface.php @@ -0,0 +1,137 @@ + value pairs to set en + * masse. + * + * @see __set() + * @param string|array $spec The assignment strategy to use (key or array of key + * => value pairs) + * @param mixed $value (Optional) If assigning a named variable, use this + * as the value. + * @return void + */ + public function assign($spec, $value = null); + + /** + * Clear all assigned variables + * + * Clears all variables assigned to Zend_View either via {@link assign()} or + * property overloading ({@link __get()}/{@link __set()}). + * + * @return void + */ + public function clearVars(); + + /** + * Processes a view script and returns the output. + * + * @param string $name The script script name to process. + * @return string The script output. + */ + public function render($name); +} diff --git a/lib/zend/Zend/View/Stream.php b/lib/zend/Zend/View/Stream.php new file mode 100644 index 0000000000..759eae71a9 --- /dev/null +++ b/lib/zend/Zend/View/Stream.php @@ -0,0 +1,183 @@ +_data = file_get_contents($path); + + /** + * If reading the file failed, update our local stat store + * to reflect the real stat of the file, then return on failure + */ + if ($this->_data === false) { + $this->_stat = stat($path); + return false; + } + + /** + * Convert to long-form and to + * + */ + $this->_data = preg_replace('/\<\?\=/', "_data); + $this->_data = preg_replace('/<\?(?!xml|php)/s', '_data); + + /** + * file_get_contents() won't update PHP's stat cache, so we grab a stat + * of the file to prevent additional reads should the script be + * requested again, which will make include() happy. + */ + $this->_stat = stat($path); + + return true; + } + + /** + * Included so that __FILE__ returns the appropriate info + * + * @return array + */ + public function url_stat() + { + return $this->_stat; + } + + /** + * Reads from the stream. + */ + public function stream_read($count) + { + $ret = substr($this->_data, $this->_pos, $count); + $this->_pos += strlen($ret); + return $ret; + } + + + /** + * Tells the current position in the stream. + */ + public function stream_tell() + { + return $this->_pos; + } + + + /** + * Tells if we are at the end of the stream. + */ + public function stream_eof() + { + return $this->_pos >= strlen($this->_data); + } + + + /** + * Stream statistics. + */ + public function stream_stat() + { + return $this->_stat; + } + + + /** + * Seek to a specific point in the stream. + */ + public function stream_seek($offset, $whence) + { + switch ($whence) { + case SEEK_SET: + if ($offset < strlen($this->_data) && $offset >= 0) { + $this->_pos = $offset; + return true; + } else { + return false; + } + break; + + case SEEK_CUR: + if ($offset >= 0) { + $this->_pos += $offset; + return true; + } else { + return false; + } + break; + + case SEEK_END: + if (strlen($this->_data) + $offset >= 0) { + $this->_pos = strlen($this->_data) + $offset; + return true; + } else { + return false; + } + break; + + default: + return false; + } + } +} diff --git a/lib/zend/Zend/Wildfire/Channel/HttpHeaders.php b/lib/zend/Zend/Wildfire/Channel/HttpHeaders.php new file mode 100644 index 0000000000..13165ea2e5 --- /dev/null +++ b/lib/zend/Zend/Wildfire/Channel/HttpHeaders.php @@ -0,0 +1,336 @@ +_protocols[$uri])) { + $this->_protocols[$uri] = $this->_initProtocol($uri); + } + + $this->_registerControllerPlugin(); + + return $this->_protocols[$uri]; + } + + /** + * Initialize a new protocol + * + * @param string $uri The URI for the protocol to be initialized + * @return object Returns the new initialized protocol instance + * @throws Zend_Wildfire_Exception + */ + protected function _initProtocol($uri) + { + switch ($uri) { + case Zend_Wildfire_Protocol_JsonStream::PROTOCOL_URI; + return new Zend_Wildfire_Protocol_JsonStream(); + } + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Tyring to initialize unknown protocol for URI "'.$uri.'".'); + } + + + /** + * Flush all data from all protocols and send all data to response headers. + * + * @return boolean Returns TRUE if data was flushed + */ + public function flush() + { + if (!$this->_protocols || !$this->isReady()) { + return false; + } + + foreach ( $this->_protocols as $protocol ) { + + $payload = $protocol->getPayload($this); + + if ($payload) { + foreach( $payload as $message ) { + + $this->getResponse()->setHeader(self::$_headerPrefix.$message[0], + $message[1], true); + } + } + } + return true; + } + + /** + * Set the index of the plugin in the controller dispatch loop plugin stack + * + * @param integer $index The index of the plugin in the stack + * @return integer The previous index. + */ + public static function setControllerPluginStackIndex($index) + { + $previous = self::$_controllerPluginStackIndex; + self::$_controllerPluginStackIndex = $index; + return $previous; + } + + /** + * Register this object as a controller plugin. + * + * @return void + */ + protected function _registerControllerPlugin() + { + $controller = Zend_Controller_Front::getInstance(); + if (!$controller->hasPlugin(get_class($this))) { + $controller->registerPlugin($this, self::$_controllerPluginStackIndex); + } + } + + + /* + * Zend_Wildfire_Channel_Interface + */ + + /** + * Determine if channel is ready. + * + * The channel is ready as long as the request and response objects are initialized, + * can send headers and the FirePHP header exists in the User-Agent. + * + * If the header does not exist in the User-Agent, no appropriate client + * is making this request and the messages should not be sent. + * + * A timing issue arises when messages are logged before the request/response + * objects are initialized. In this case we do not yet know if the client + * will be able to accept the messages. If we consequently indicate that + * the channel is not ready, these messages will be dropped which is in + * most cases not the intended behaviour. The intent is to send them at the + * end of the request when the request/response objects will be available + * for sure. + * + * If the request/response objects are not yet initialized we assume if messages are + * logged, the client will be able to receive them. As soon as the request/response + * objects are availoable and a message is logged this assumption is challenged. + * If the client cannot accept the messages any further messages are dropped + * and messages sent prior are kept but discarded when the channel is finally + * flushed at the end of the request. + * + * When the channel is flushed the $forceCheckRequest option is used to force + * a check of the request/response objects. This is the last verification to ensure + * messages are only sent when the client can accept them. + * + * @param boolean $forceCheckRequest OPTIONAL Set to TRUE if the request must be checked + * @return boolean Returns TRUE if channel is ready. + */ + public function isReady($forceCheckRequest=false) + { + if (!$forceCheckRequest + && !$this->_request + && !$this->_response + ) { + return true; + } + + return ($this->getResponse()->canSendHeaders() + && preg_match_all( + '/\s?FirePHP\/([\.|\d]*)\s?/si', + $this->getRequest()->getHeader('User-Agent'), + $m + ) + ); + } + + + /* + * Zend_Controller_Plugin_Abstract + */ + + /** + * Flush messages to headers as late as possible but before headers have been sent. + * + * @return void + */ + public function dispatchLoopShutdown() + { + $this->flush(); + } + + /** + * Get the request object + * + * @return Zend_Controller_Request_Abstract + * @throws Zend_Wildfire_Exception + */ + public function getRequest() + { + if (!$this->_request) { + $controller = Zend_Controller_Front::getInstance(); + $this->setRequest($controller->getRequest()); + } + if (!$this->_request) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Request objects not initialized.'); + } + return $this->_request; + } + + /** + * Get the response object + * + * @return Zend_Controller_Response_Abstract + * @throws Zend_Wildfire_Exception + */ + public function getResponse() + { + if (!$this->_response) { + $response = Zend_Controller_Front::getInstance()->getResponse(); + if ($response) { + $this->setResponse($response); + } + } + if (!$this->_response) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Response objects not initialized.'); + } + return $this->_response; + } +} diff --git a/lib/zend/Zend/Wildfire/Channel/Interface.php b/lib/zend/Zend/Wildfire/Channel/Interface.php new file mode 100644 index 0000000000..5ec7173f3f --- /dev/null +++ b/lib/zend/Zend/Wildfire/Channel/Interface.php @@ -0,0 +1,38 @@ + 1, /* The offset in the trace which identifies the source of the message */ + 'maxTraceDepth' => 99, /* Maximum depth for stack traces */ + 'maxObjectDepth' => 10, /* The maximum depth to traverse objects when encoding */ + 'maxArrayDepth' => 20, /* The maximum depth to traverse nested arrays when encoding */ + 'includeLineNumbers' => true /* Whether to include line and file info for each message */ + ); + + /** + * Filters used to exclude object members when encoding + * @var array + */ + protected $_objectFilters = array(); + + /** + * A stack of objects used during encoding to detect recursion + * @var array + */ + protected $_objectStack = array(); + + /** + * Create singleton instance. + * + * @param string $class OPTIONAL Subclass of Zend_Wildfire_Plugin_FirePhp + * @return Zend_Wildfire_Plugin_FirePhp Returns the singleton Zend_Wildfire_Plugin_FirePhp instance + * @throws Zend_Wildfire_Exception + */ + public static function init($class = null) + { + if (self::$_instance !== null) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Singleton instance of Zend_Wildfire_Plugin_FirePhp already exists!'); + } + if ($class !== null) { + if (!is_string($class)) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Third argument is not a class string'); + } + + if (!class_exists($class)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($class); + } + self::$_instance = new $class(); + if (!self::$_instance instanceof Zend_Wildfire_Plugin_FirePhp) { + self::$_instance = null; + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Invalid class to third argument. Must be subclass of Zend_Wildfire_Plugin_FirePhp.'); + } + } else { + self::$_instance = new self(); + } + + return self::$_instance; + } + + /** + * Constructor + * @return void + */ + protected function __construct() + { + $this->_channel = Zend_Wildfire_Channel_HttpHeaders::getInstance(); + $this->_channel->getProtocol(self::PROTOCOL_URI)->registerPlugin($this); + } + + /** + * Get or create singleton instance + * + * @param $skipCreate boolean True if an instance should not be created + * @return Zend_Wildfire_Plugin_FirePhp + */ + public static function getInstance($skipCreate=false) + { + if (self::$_instance===null && $skipCreate!==true) { + return self::init(); + } + return self::$_instance; + } + + /** + * Destroys the singleton instance + * + * Primarily used for testing. + * + * @return void + */ + public static function destroyInstance() + { + self::$_instance = null; + } + + /** + * Enable or disable sending of messages to user-agent. + * If disabled all headers to be sent will be removed. + * + * @param boolean $enabled Set to TRUE to enable sending of messages. + * @return boolean The previous value. + */ + public function setEnabled($enabled) + { + $previous = $this->_enabled; + $this->_enabled = $enabled; + if (!$this->_enabled) { + $this->_messages = array(); + $this->_channel->getProtocol(self::PROTOCOL_URI)->clearMessages($this); + } + return $previous; + } + + /** + * Determine if logging to user-agent is enabled. + * + * @return boolean Returns TRUE if logging is enabled. + */ + public function getEnabled() + { + return $this->_enabled; + } + + /** + * Set a single option + * + * @param string $key The name of the option + * @param mixed $value The value of the option + * @return mixed The previous value of the option + */ + public function setOption($key, $value) + { + if (!array_key_exists($key,$this->_options)) { + throw new Zend_Wildfire_Exception('Option with name "'.$key.'" does not exist!'); + } + $previous = $this->_options[$key]; + $this->_options[$key] = $value; + return $previous; + } + + /** + * Retrieve a single option + * + * @param string $key The name of the option + * @return mixed The value of the option + */ + public function getOption($key) + { + if (!array_key_exists($key,$this->_options)) { + throw new Zend_Wildfire_Exception('Option with name "'.$key.'" does not exist!'); + } + return $this->_options[$key]; + } + + /** + * Retrieve all options + * + * @return array All options + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Specify a filter to be used when encoding an object + * + * Filters are used to exclude object members. + * + * @param string $Class The class name of the object + * @param array $Filter An array of members to exclude + * @return void + */ + public function setObjectFilter($class, $filter) { + $this->_objectFilters[$class] = $filter; + } + + /** + * Starts a group in the Firebug Console + * + * @param string $title The title of the group + * @return TRUE if the group instruction was added to the response headers or buffered. + */ + public static function group($title) + { + return self::send(null, $title, self::GROUP_START); + } + + /** + * Ends a group in the Firebug Console + * + * @return TRUE if the group instruction was added to the response headers or buffered. + */ + public static function groupEnd() + { + return self::send(null, null, self::GROUP_END); + } + + /** + * Logs variables to the Firebug Console + * via HTTP response headers and the FirePHP Firefox Extension. + * + * @param mixed $var The variable to log. + * @param string $label OPTIONAL Label to prepend to the log event. + * @param string $style OPTIONAL Style of the log event. + * @param array $options OPTIONAL Options to change how messages are processed and sent + * @return boolean Returns TRUE if the variable was added to the response headers or buffered. + * @throws Zend_Wildfire_Exception + */ + public static function send($var, $label=null, $style=null, $options=array()) + { + $firephp = self::getInstance(); + + if (!$firephp->getEnabled()) { + return false; + } + + if ($var instanceof Zend_Wildfire_Plugin_FirePhp_Message) { + + if ($var->getBuffered()) { + if (!in_array($var, self::$_instance->_messages)) { + self::$_instance->_messages[] = $var; + } + return true; + } + + if ($var->getDestroy()) { + return false; + } + + $style = $var->getStyle(); + $label = $var->getLabel(); + $options = $var->getOptions(); + $var = $var->getMessage(); + } + + if (!self::$_instance->_channel->isReady()) { + return false; + } + + foreach ($options as $name => $value) { + if ($value===null) { + unset($options[$name]); + } + } + $options = array_merge($firephp->getOptions(), $options); + + $trace = null; + + $skipFinalEncode = false; + + $meta = array(); + $meta['Type'] = $style; + + if ($var instanceof Exception) { + + $eTrace = $var->getTrace(); + $eTrace = array_splice($eTrace, 0, $options['maxTraceDepth']); + + $var = array('Class'=>get_class($var), + 'Message'=>$var->getMessage(), + 'File'=>$var->getFile(), + 'Line'=>$var->getLine(), + 'Type'=>'throw', + 'Trace'=>$firephp->_encodeTrace($eTrace)); + + $meta['Type'] = self::EXCEPTION; + + $skipFinalEncode = true; + + } else + if ($meta['Type']==self::TRACE) { + + if (!$label && $var) { + $label = $var; + $var = null; + } + + if (!$trace) { + $trace = $firephp->_getStackTrace(array_merge($options, + array('maxTraceDepth'=>$options['maxTraceDepth']+1))); + } + + $var = array('Class'=>$trace[0]['class'], + 'Type'=>$trace[0]['type'], + 'Function'=>$trace[0]['function'], + 'Message'=>$label, + 'File'=>isset($trace[0]['file'])?$trace[0]['file']:'', + 'Line'=>isset($trace[0]['line'])?$trace[0]['line']:'', + 'Args'=>isset($trace[0]['args'])?$firephp->_encodeObject($trace[0]['args']):'', + 'Trace'=>$firephp->_encodeTrace(array_splice($trace,1))); + + $skipFinalEncode = true; + + } else + if ($meta['Type']==self::TABLE) { + + $var = $firephp->_encodeTable($var); + + $skipFinalEncode = true; + + } else { + if ($meta['Type']===null) { + $meta['Type'] = self::LOG; + } + } + + if ($label!=null) { + $meta['Label'] = $label; + } + + switch ($meta['Type']) { + case self::LOG: + case self::INFO: + case self::WARN: + case self::ERROR: + case self::EXCEPTION: + case self::TRACE: + case self::TABLE: + case self::DUMP: + case self::GROUP_START: + case self::GROUP_END: + break; + default: + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Log style "'.$meta['Type'].'" not recognized!'); + break; + } + + if ($meta['Type'] != self::DUMP && $options['includeLineNumbers']) { + if (!isset($meta['File']) || !isset($meta['Line'])) { + + if (!$trace) { + $trace = $firephp->_getStackTrace($options); + } + + $meta['File'] = isset($trace[0]['file'])?$trace[0]['file']:''; + $meta['Line'] = isset($trace[0]['line'])?$trace[0]['line']:''; + + } + } else { + unset($meta['File']); + unset($meta['Line']); + } + + if ($meta['Type'] == self::DUMP) { + + return $firephp->_recordMessage(self::STRUCTURE_URI_DUMP, + array('key'=>$meta['Label'], + 'data'=>$var), + $skipFinalEncode); + + } else { + + return $firephp->_recordMessage(self::STRUCTURE_URI_FIREBUGCONSOLE, + array('data'=>$var, + 'meta'=>$meta), + $skipFinalEncode); + } + } + + /** + * Gets a stack trace + * + * @param array $options Options to change how the stack trace is returned + * @return array The stack trace + */ + protected function _getStackTrace($options) + { + $trace = debug_backtrace(); + + return array_splice($trace, $options['traceOffset'], $options['maxTraceDepth']); + } + + /** + * Record a message with the given data in the given structure + * + * @param string $structure The structure to be used for the data + * @param array $data The data to be recorded + * @param boolean $skipEncode TRUE if variable encoding should be skipped + * @return boolean Returns TRUE if message was recorded + * @throws Zend_Wildfire_Exception + */ + protected function _recordMessage($structure, $data, $skipEncode=false) + { + switch($structure) { + + case self::STRUCTURE_URI_DUMP: + + if (!isset($data['key'])) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('You must supply a key.'); + } + if (!array_key_exists('data',$data)) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('You must supply data.'); + } + + $value = $data['data']; + if (!$skipEncode) { + $value = $this->_encodeObject($data['data']); + } + + return $this->_channel->getProtocol(self::PROTOCOL_URI)-> + recordMessage($this, + $structure, + array($data['key']=>$value)); + + case self::STRUCTURE_URI_FIREBUGCONSOLE: + + if (!isset($data['meta']) || + !is_array($data['meta']) || + !array_key_exists('Type',$data['meta'])) { + + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('You must supply a "Type" in the meta information.'); + } + if (!array_key_exists('data',$data)) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('You must supply data.'); + } + + $value = $data['data']; + if (!$skipEncode) { + $value = $this->_encodeObject($data['data']); + } + + return $this->_channel->getProtocol(self::PROTOCOL_URI)-> + recordMessage($this, + $structure, + array($data['meta'], + $value)); + + default: + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Structure of name "'.$structure.'" is not recognized.'); + break; + } + return false; + } + + /** + * Encodes a table by encoding each row and column with _encodeObject() + * + * @param array $Table The table to be encoded + * @return array + */ + protected function _encodeTable($table) + { + if (!$table) { + return $table; + } + for ($i=0 ; $i_encodeObject($table[$i][$j]); + } + } + } + return $table; + } + + /** + * Encodes a trace by encoding all "args" with _encodeObject() + * + * @param array $Trace The trace to be encoded + * @return array The encoded trace + */ + protected function _encodeTrace($trace) + { + if (!$trace) { + return $trace; + } + for ($i=0 ; $i_encodeObject($trace[$i]['args']); + } + } + return $trace; + } + + /** + * Encode an object by generating an array containing all object members. + * + * All private and protected members are included. Some meta info about + * the object class is added. + * + * @param mixed $object The object/array/value to be encoded + * @return array The encoded object + */ + protected function _encodeObject($object, $objectDepth = 1, $arrayDepth = 1) + { + $return = array(); + + if (is_resource($object)) { + + return '** '.(string)$object.' **'; + + } else + if (is_object($object)) { + + if ($objectDepth > $this->_options['maxObjectDepth']) { + return '** Max Object Depth ('.$this->_options['maxObjectDepth'].') **'; + } + + foreach ($this->_objectStack as $refVal) { + if ($refVal === $object) { + return '** Recursion ('.get_class($object).') **'; + } + } + array_push($this->_objectStack, $object); + + $return['__className'] = $class = get_class($object); + + $reflectionClass = new ReflectionClass($class); + $properties = array(); + foreach ( $reflectionClass->getProperties() as $property) { + $properties[$property->getName()] = $property; + } + + $members = (array)$object; + + foreach ($properties as $just_name => $property) { + + $name = $raw_name = $just_name; + + if ($property->isStatic()) { + $name = 'static:'.$name; + } + if ($property->isPublic()) { + $name = 'public:'.$name; + } else + if ($property->isPrivate()) { + $name = 'private:'.$name; + $raw_name = "\0".$class."\0".$raw_name; + } else + if ($property->isProtected()) { + $name = 'protected:'.$name; + $raw_name = "\0".'*'."\0".$raw_name; + } + + if (!(isset($this->_objectFilters[$class]) + && is_array($this->_objectFilters[$class]) + && in_array($just_name,$this->_objectFilters[$class]))) { + + if (array_key_exists($raw_name,$members) + && !$property->isStatic()) { + + $return[$name] = $this->_encodeObject($members[$raw_name], $objectDepth + 1, 1); + + } else { + if (method_exists($property,'setAccessible')) { + $property->setAccessible(true); + $return[$name] = $this->_encodeObject($property->getValue($object), $objectDepth + 1, 1); + } else + if ($property->isPublic()) { + $return[$name] = $this->_encodeObject($property->getValue($object), $objectDepth + 1, 1); + } else { + $return[$name] = '** Need PHP 5.3 to get value **'; + } + } + } else { + $return[$name] = '** Excluded by Filter **'; + } + } + + // Include all members that are not defined in the class + // but exist in the object + foreach($members as $just_name => $value) { + + $name = $raw_name = $just_name; + + if ($name{0} == "\0") { + $parts = explode("\0", $name); + $name = $parts[2]; + } + if (!isset($properties[$name])) { + $name = 'undeclared:'.$name; + + if (!(isset($this->objectFilters[$class]) + && is_array($this->objectFilters[$class]) + && in_array($just_name,$this->objectFilters[$class]))) { + + $return[$name] = $this->_encodeObject($value, $objectDepth + 1, 1); + } else { + $return[$name] = '** Excluded by Filter **'; + } + } + } + + array_pop($this->_objectStack); + + } elseif (is_array($object)) { + + if ($arrayDepth > $this->_options['maxArrayDepth']) { + return '** Max Array Depth ('.$this->_options['maxArrayDepth'].') **'; + } + + foreach ($object as $key => $val) { + + // Encoding the $GLOBALS PHP array causes an infinite loop + // if the recursion is not reset here as it contains + // a reference to itself. This is the only way I have come up + // with to stop infinite recursion in this case. + if ($key=='GLOBALS' + && is_array($val) + && array_key_exists('GLOBALS',$val)) { + + $val['GLOBALS'] = '** Recursion (GLOBALS) **'; + } + $return[$key] = $this->_encodeObject($val, 1, $arrayDepth + 1); + } + } else { + return $object; + } + return $return; + } + + /* + * Zend_Wildfire_Plugin_Interface + */ + + /** + * Get the unique indentifier for this plugin. + * + * @return string Returns the URI of the plugin. + */ + public function getUri() + { + return self::PLUGIN_URI; + } + + /** + * Flush any buffered data. + * + * @param string $protocolUri The URI of the protocol that should be flushed to + * @return void + */ + public function flushMessages($protocolUri) + { + if (!$this->_messages || $protocolUri!=self::PROTOCOL_URI) { + return; + } + + foreach( $this->_messages as $message ) { + if (!$message->getDestroy()) { + $this->send($message->getMessage(), + $message->getLabel(), + $message->getStyle(), + $message->getOptions()); + } + } + + $this->_messages = array(); + } +} diff --git a/lib/zend/Zend/Wildfire/Plugin/FirePhp/Message.php b/lib/zend/Zend/Wildfire/Plugin/FirePhp/Message.php new file mode 100644 index 0000000000..3ad11dc41f --- /dev/null +++ b/lib/zend/Zend/Wildfire/Plugin/FirePhp/Message.php @@ -0,0 +1,246 @@ + null, /* The offset in the trace which identifies the source of the message */ + 'includeLineNumbers' => null /* Whether to include line and file info for this message */ + ); + + /** + * Creates a new message with the given style and message + * + * @param string $style Style of the message. + * @param mixed $message The message + * @return void + */ + function __construct($style, $message) + { + $this->_style = $style; + $this->_message = $message; + $this->_ruid = md5(microtime().mt_rand()); + } + + /** + * Set the label of the message + * + * @param string $label The label to be set + * @return void + */ + public function setLabel($label) + { + $this->_label = $label; + } + + /** + * Get the label of the message + * + * @return string The label of the message + */ + public function getLabel() + { + return $this->_label; + } + + /** + * Enable or disable message buffering + * + * If a message is buffered it can be updated for the duration of the + * request and is only flushed at the end of the request. + * + * @param boolean $buffered TRUE to enable buffering FALSE otherwise + * @return boolean Returns previous buffering value + */ + public function setBuffered($buffered) + { + $previous = $this->_buffered; + $this->_buffered = $buffered; + return $previous; + } + + /** + * Determine if buffering is enabled or disabled + * + * @return boolean Returns TRUE if buffering is enabled, FALSE otherwise. + */ + public function getBuffered() + { + return $this->_buffered; + } + + /** + * Destroy the message to prevent delivery + * + * @param boolean $destroy TRUE to destroy FALSE otherwise + * @return boolean Returns previous destroy value + */ + public function setDestroy($destroy) + { + $previous = $this->_destroy; + $this->_destroy = $destroy; + return $previous; + } + + /** + * Determine if message should be destroyed + * + * @return boolean Returns TRUE if message should be destroyed, FALSE otherwise. + */ + public function getDestroy() + { + return $this->_destroy; + } + + /** + * Set the style of the message + * + * @return void + */ + public function setStyle($style) + { + $this->_style = $style; + } + + /** + * Get the style of the message + * + * @return string The style of the message + */ + public function getStyle() + { + return $this->_style; + } + + /** + * Set the actual message to be sent in its final format. + * + * @return void + */ + public function setMessage($message) + { + $this->_message = $message; + } + + /** + * Get the actual message to be sent in its final format. + * + * @return mixed Returns the message to be sent. + */ + public function getMessage() + { + return $this->_message; + } + + /** + * Set a single option + * + * @param string $key The name of the option + * @param mixed $value The value of the option + * @return mixed The previous value of the option + */ + public function setOption($key, $value) + { + if(!array_key_exists($key,$this->_options)) { + throw new Zend_Wildfire_Exception('Option with name "'.$key.'" does not exist!'); + } + $previous = $this->_options[$key]; + $this->_options[$key] = $value; + return $previous; + } + + /** + * Retrieve a single option + * + * @param string $key The name of the option + * @return mixed The value of the option + */ + public function getOption($key) + { + if(!array_key_exists($key,$this->_options)) { + throw new Zend_Wildfire_Exception('Option with name "'.$key.'" does not exist!'); + } + return $this->_options[$key]; + } + + /** + * Retrieve all options + * + * @return array All options + */ + public function getOptions() + { + return $this->_options; + } +} + diff --git a/lib/zend/Zend/Wildfire/Plugin/FirePhp/TableMessage.php b/lib/zend/Zend/Wildfire/Plugin/FirePhp/TableMessage.php new file mode 100644 index 0000000000..efbf3ec71b --- /dev/null +++ b/lib/zend/Zend/Wildfire/Plugin/FirePhp/TableMessage.php @@ -0,0 +1,165 @@ +setLabel($label); + } + + /** + * Set the table header + * + * @param array $header The header columns + * @return void + */ + public function setHeader($header) + { + $this->_header = $header; + } + + /** + * Append a row to the end of the table. + * + * @param array $row An array of column values representing a row. + * @return void + */ + public function addRow($row) + { + $this->_rows[] = $row; + } + + /** + * Get the actual message to be sent in its final format. + * + * @return mixed Returns the message to be sent. + */ + public function getMessage() + { + $table = $this->_rows; + if($this->_header) { + array_unshift($table,$this->_header); + } + return $table; + } + + /** + * Returns the row at the given index + * + * @param integer $index The index of the row + * @return array Returns the row + * @throws Zend_Wildfire_Exception + */ + public function getRowAt($index) + { + $count = $this->getRowCount(); + + if($index < 0 || $index > $count-1) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Row index('.$index.') out of bounds('.$count.')!'); + } + + return $this->_rows[$index]; + } + + /** + * Sets the row on the given index to a new row + * + * @param integer $index The index of the row + * @param array $row The new data for the row + * @throws Zend_Wildfire_Exception + */ + public function setRowAt($index, $row) + { + $count = $this->getRowCount(); + + if($index < 0 || $index > $count-1) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Row index('.$index.') out of bounds('.$count.')!'); + } + + $this->_rows[$index] = $row; + } + + /** + * Returns the number of rows + * + * @return integer + */ + public function getRowCount() + { + return count($this->_rows); + } + + /** + * Returns the last row of the table + * + * @return array Returns the last row + * @throws Zend_Wildfire_Exception + */ + public function getLastRow() + { + $count = $this->getRowCount(); + + if($count==0) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Cannot get last row as no rows exist!'); + } + + return $this->_rows[$count-1]; + } +} diff --git a/lib/zend/Zend/Wildfire/Plugin/Interface.php b/lib/zend/Zend/Wildfire/Plugin/Interface.php new file mode 100644 index 0000000000..8e3caf361b --- /dev/null +++ b/lib/zend/Zend/Wildfire/Plugin/Interface.php @@ -0,0 +1,48 @@ +_plugins)) { + return false; + } + $this->_plugins[] = $plugin; + return true; + } + + /** + * Record a message with the given data in the given structure + * + * @param Zend_Wildfire_Plugin_Interface $plugin The plugin recording the message + * @param string $structure The structure to be used for the data + * @param array $data The data to be recorded + * @return boolean Returns TRUE if message was recorded + */ + public function recordMessage(Zend_Wildfire_Plugin_Interface $plugin, $structure, $data) + { + if(!isset($this->_messages[$structure])) { + $this->_messages[$structure] = array(); + } + + $uri = $plugin->getUri(); + + if(!isset($this->_messages[$structure][$uri])) { + $this->_messages[$structure][$uri] = array(); + } + + $this->_messages[$structure][$uri][] = $this->_encode($data); + return true; + } + + /** + * Remove all qued messages + * + * @param Zend_Wildfire_Plugin_Interface $plugin The plugin for which to clear messages + * @return boolean Returns TRUE if messages were present + */ + public function clearMessages(Zend_Wildfire_Plugin_Interface $plugin) + { + $uri = $plugin->getUri(); + + $present = false; + foreach ($this->_messages as $structure => $messages) { + + if(!isset($this->_messages[$structure][$uri])) { + continue; + } + + $present = true; + + unset($this->_messages[$structure][$uri]); + + if (!$this->_messages[$structure]) { + unset($this->_messages[$structure]); + } + } + return $present; + } + + /** + * Get all qued messages + * + * @return mixed Returns qued messages or FALSE if no messages are qued + */ + public function getMessages() + { + if (!$this->_messages) { + return false; + } + return $this->_messages; + } + + /** + * Use the JSON encoding scheme for the value specified + * + * @param mixed $value The value to be encoded + * @return string The encoded value + */ + protected function _encode($value) + { + return Zend_Json::encode($value, true, array('silenceCyclicalExceptions'=>true)); + } + + /** + * Retrieves all formatted data ready to be sent by the channel. + * + * @param Zend_Wildfire_Channel_Interface $channel The instance of the channel that will be transmitting the data + * @return mixed Returns the data to be sent by the channel. + * @throws Zend_Wildfire_Exception + */ + public function getPayload(Zend_Wildfire_Channel_Interface $channel) + { + if (!$channel instanceof Zend_Wildfire_Channel_HttpHeaders) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('The '.get_class($channel).' channel is not supported by the '.get_class($this).' protocol.'); + } + + if ($this->_plugins) { + foreach ($this->_plugins as $plugin) { + $plugin->flushMessages(self::PROTOCOL_URI); + } + } + + if (!$this->_messages) { + return false; + } + + $protocol_index = 1; + $structure_index = 1; + $plugin_index = 1; + $message_index = 1; + + $payload = array(); + + $payload[] = array('Protocol-'.$protocol_index, self::PROTOCOL_URI); + + foreach ($this->_messages as $structure_uri => $plugin_messages ) { + + $payload[] = array($protocol_index.'-Structure-'.$structure_index, $structure_uri); + + foreach ($plugin_messages as $plugin_uri => $messages ) { + + $payload[] = array($protocol_index.'-Plugin-'.$plugin_index, $plugin_uri); + + foreach ($messages as $message) { + + $parts = explode("\n",chunk_split($message, 5000, "\n")); + + for ($i=0 ; $i2) { + $msg = (($i==0)?strlen($message):'') + . '|' . $part . '|' + . (($i 99999) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Maximum number (99,999) of messages reached!'); + } + } + } + } + $plugin_index++; + } + $structure_index++; + } + + return $payload; + } + +} + diff --git a/lib/zend/Zend/XmlRpc/Client.php b/lib/zend/Zend/XmlRpc/Client.php index 97b4bd2c9f..34c272d956 100644 --- a/lib/zend/Zend/XmlRpc/Client.php +++ b/lib/zend/Zend/XmlRpc/Client.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ @@ -70,7 +71,7 @@ require_once 'Zend/XmlRpc/Fault.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Client @@ -267,10 +268,13 @@ class Zend_XmlRpc_Client $http->setHeaders(array( 'Content-Type: text/xml; charset=utf-8', - 'User-Agent: Zend_XmlRpc_Client', 'Accept: text/xml', )); + if ($http->getHeader('user-agent') === null) { + $http->setHeaders(array('User-Agent: Zend_XmlRpc_Client')); + } + $xml = $this->_lastRequest->__toString(); $http->setRawData($xml); $httpResponse = $http->request(Zend_Http_Client::POST); @@ -296,8 +300,9 @@ class Zend_XmlRpc_Client /** * Send an XML-RPC request to the service (for a specific method) * - * @param string $method Name of the method we want to call - * @param array $params Array of parameters for the method + * @param string $method Name of the method we want to call + * @param array $params Array of parameters for the method + * @return mixed * @throws Zend_XmlRpc_Client_FaultException */ public function call($method, $params=array()) @@ -312,29 +317,36 @@ class Zend_XmlRpc_Client $success = false; } if ($success) { + $validTypes = array( + Zend_XmlRpc_Value::XMLRPC_TYPE_ARRAY, + Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64, + Zend_XmlRpc_Value::XMLRPC_TYPE_BOOLEAN, + Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME, + Zend_XmlRpc_Value::XMLRPC_TYPE_DOUBLE, + Zend_XmlRpc_Value::XMLRPC_TYPE_I4, + Zend_XmlRpc_Value::XMLRPC_TYPE_INTEGER, + Zend_XmlRpc_Value::XMLRPC_TYPE_NIL, + Zend_XmlRpc_Value::XMLRPC_TYPE_STRING, + Zend_XmlRpc_Value::XMLRPC_TYPE_STRUCT, + ); + $params = (array)$params; foreach ($params as $key => $param) { - if (is_array($param) && empty($param)) { - $type = 'array'; - foreach ($signatures as $signature) { - if (!is_array($signature)) { - continue; - } - if (array_key_exists($key + 1, $signature)) { - $type = $signature[$key + 1]; - $type = (in_array($type, array('array', 'struct'))) ? $type : 'array'; - break; - } + $type = Zend_XmlRpc_Value::AUTO_DETECT_TYPE; + foreach ($signatures as $signature) { + if (!is_array($signature)) { + continue; + } + if (isset($signature['parameters'][$key])) { + $type = $signature['parameters'][$key]; + $type = in_array($type, $validTypes) ? $type : Zend_XmlRpc_Value::AUTO_DETECT_TYPE; } - $params[$key] = array( - 'type' => $type, - 'value' => $param - ); } + $params[$key] = Zend_XmlRpc_Value::getXmlRpcValue($param, $type); } } } - $request = new Zend_XmlRpc_Request($method, $params); + $request = $this->_createRequest($method, $params); $this->doRequest($request); @@ -351,4 +363,14 @@ class Zend_XmlRpc_Client return $this->_lastResponse->getReturnValue(); } + + /** + * Create request object + * + * @return Zend_XmlRpc_Request + */ + protected function _createRequest($method, $params) + { + return new Zend_XmlRpc_Request($method, $params); + } } diff --git a/lib/zend/Zend/XmlRpc/Client/Exception.php b/lib/zend/Zend/XmlRpc/Client/Exception.php index 266fe4da5d..d03d1f3b75 100644 --- a/lib/zend/Zend/XmlRpc/Client/Exception.php +++ b/lib/zend/Zend/XmlRpc/Client/Exception.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ @@ -32,7 +33,7 @@ require_once 'Zend/XmlRpc/Exception.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Client_Exception extends Zend_XmlRpc_Exception diff --git a/lib/zend/Zend/XmlRpc/Client/FaultException.php b/lib/zend/Zend/XmlRpc/Client/FaultException.php index a83dbaafb2..77ad3a1628 100644 --- a/lib/zend/Zend/XmlRpc/Client/FaultException.php +++ b/lib/zend/Zend/XmlRpc/Client/FaultException.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ @@ -30,7 +31,7 @@ require_once 'Zend/XmlRpc/Client/Exception.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Client_FaultException extends Zend_XmlRpc_Client_Exception diff --git a/lib/zend/Zend/XmlRpc/Client/HttpException.php b/lib/zend/Zend/XmlRpc/Client/HttpException.php index 2f8bb9d295..35a018dd30 100644 --- a/lib/zend/Zend/XmlRpc/Client/HttpException.php +++ b/lib/zend/Zend/XmlRpc/Client/HttpException.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ @@ -33,7 +34,7 @@ require_once 'Zend/XmlRpc/Client/Exception.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Client_HttpException extends Zend_XmlRpc_Client_Exception diff --git a/lib/zend/Zend/XmlRpc/Client/IntrospectException.php b/lib/zend/Zend/XmlRpc/Client/IntrospectException.php index 36ddced481..67bc2ace60 100644 --- a/lib/zend/Zend/XmlRpc/Client/IntrospectException.php +++ b/lib/zend/Zend/XmlRpc/Client/IntrospectException.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ @@ -32,7 +33,7 @@ require_once 'Zend/XmlRpc/Client/Exception.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Client_IntrospectException extends Zend_XmlRpc_Client_Exception diff --git a/lib/zend/Zend/XmlRpc/Client/ServerIntrospection.php b/lib/zend/Zend/XmlRpc/Client/ServerIntrospection.php index a382ccf476..5d980dcd07 100644 --- a/lib/zend/Zend/XmlRpc/Client/ServerIntrospection.php +++ b/lib/zend/Zend/XmlRpc/Client/ServerIntrospection.php @@ -15,22 +15,18 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ - -/** Zend_XmlRpc_Client_IntrospectException */ -require_once 'Zend/XmlRpc/Client/IntrospectException.php'; - - /** * Wraps the XML-RPC system.* introspection methods * * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Client_ServerIntrospection @@ -60,6 +56,7 @@ class Zend_XmlRpc_Client_ServerIntrospection { $methods = $this->listMethods(); + require_once 'Zend/XmlRpc/Client/FaultException.php'; try { $signatures = $this->getSignatureForEachMethodByMulticall($methods); } catch (Zend_XmlRpc_Client_FaultException $e) { @@ -98,11 +95,13 @@ class Zend_XmlRpc_Client_ServerIntrospection if (! is_array($serverSignatures)) { $type = gettype($serverSignatures); $error = "Multicall return is malformed. Expected array, got $type"; + require_once 'Zend/XmlRpc/Client/IntrospectException.php'; throw new Zend_XmlRpc_Client_IntrospectException($error); } if (count($serverSignatures) != count($methods)) { $error = 'Bad number of signatures received from multicall'; + require_once 'Zend/XmlRpc/Client/IntrospectException.php'; throw new Zend_XmlRpc_Client_IntrospectException($error); } diff --git a/lib/zend/Zend/XmlRpc/Client/ServerProxy.php b/lib/zend/Zend/XmlRpc/Client/ServerProxy.php index 521c1aa609..ccf9efdcd9 100644 --- a/lib/zend/Zend/XmlRpc/Client/ServerProxy.php +++ b/lib/zend/Zend/XmlRpc/Client/ServerProxy.php @@ -15,8 +15,9 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ @@ -28,7 +29,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Client - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Client_ServerProxy diff --git a/lib/zend/Zend/XmlRpc/Exception.php b/lib/zend/Zend/XmlRpc/Exception.php index 48031f51a7..3eb1b75c7c 100644 --- a/lib/zend/Zend/XmlRpc/Exception.php +++ b/lib/zend/Zend/XmlRpc/Exception.php @@ -14,8 +14,9 @@ * * @category Zend * @package Zend_XmlRpc - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ @@ -28,7 +29,7 @@ require_once 'Zend/Exception.php'; /** * @category Zend * @package Zend_XmlRpc - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Exception extends Zend_Exception diff --git a/lib/zend/Zend/XmlRpc/Fault.php b/lib/zend/Zend/XmlRpc/Fault.php index 336e97055e..0aa5a79fdd 100644 --- a/lib/zend/Zend/XmlRpc/Fault.php +++ b/lib/zend/Zend/XmlRpc/Fault.php @@ -14,8 +14,9 @@ * * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ */ /** @@ -23,11 +24,6 @@ */ require_once 'Zend/XmlRpc/Value.php'; -/** - * Zend_XmlRpc_Exception - */ -require_once 'Zend/XmlRpc/Exception.php'; - /** * XMLRPC Faults * @@ -40,7 +36,7 @@ require_once 'Zend/XmlRpc/Exception.php'; * * @category Zend * @package Zend_XmlRpc - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Fault @@ -197,6 +193,7 @@ class Zend_XmlRpc_Fault public function loadXml($fault) { if (!is_string($fault)) { + require_once 'Zend/XmlRpc/Exception.php'; throw new Zend_XmlRpc_Exception('Invalid XML provided to fault'); } @@ -204,6 +201,7 @@ class Zend_XmlRpc_Fault $xml = @new SimpleXMLElement($fault); } catch (Exception $e) { // Not valid XML + require_once 'Zend/XmlRpc/Exception.php'; throw new Zend_XmlRpc_Exception('Failed to parse XML fault: ' . $e->getMessage(), 500); } @@ -215,6 +213,7 @@ class Zend_XmlRpc_Fault if (!$xml->fault->value->struct) { // not a proper fault + require_once 'Zend/XmlRpc/Exception.php'; throw new Zend_XmlRpc_Exception('Invalid fault structure', 500); } @@ -231,6 +230,7 @@ class Zend_XmlRpc_Fault } if (empty($code) && empty($message)) { + require_once 'Zend/XmlRpc/Exception.php'; throw new Zend_XmlRpc_Exception('Fault code and string required'); } @@ -261,6 +261,7 @@ class Zend_XmlRpc_Fault public static function isFault($xml) { $fault = new self(); + require_once 'Zend/XmlRpc/Exception.php'; try { $isFault = $fault->loadXml($xml); } catch (Zend_XmlRpc_Exception $e) { diff --git a/lib/zend/Zend/XmlRpc/Request.php b/lib/zend/Zend/XmlRpc/Request.php index dbb62f5a6b..0f810f3847 100644 --- a/lib/zend/Zend/XmlRpc/Request.php +++ b/lib/zend/Zend/XmlRpc/Request.php @@ -14,15 +14,10 @@ * * @category Zend * @package Zend_Controller - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -/** - * Zend_XmlRpc_Exception - */ -require_once 'Zend/XmlRpc/Exception.php'; - /** * Zend_XmlRpc_Value */ @@ -46,7 +41,7 @@ require_once 'Zend/XmlRpc/Fault.php'; * * @category Zend * @package Zend_XmlRpc - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -285,7 +280,7 @@ class Zend_XmlRpc_Request /** * Return parameter types - * + * * @return array */ public function getTypes() @@ -331,7 +326,7 @@ class Zend_XmlRpc_Request $types = array(); $argv = array(); foreach ($xml->params->children() as $param) { - if (! $param->value instanceof SimpleXMLElement) { + if (!isset($param->value)) { $this->_fault = new Zend_XmlRpc_Fault(633); $this->_fault->setEncoding($this->getEncoding()); return false; diff --git a/lib/zend/Zend/XmlRpc/Request/Http.php b/lib/zend/Zend/XmlRpc/Request/Http.php index d77fe5503b..5ace7b85a0 100644 --- a/lib/zend/Zend/XmlRpc/Request/Http.php +++ b/lib/zend/Zend/XmlRpc/Request/Http.php @@ -14,7 +14,7 @@ * * @category Zend * @package Zend_Controller - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -32,7 +32,7 @@ require_once 'Zend/XmlRpc/Request.php'; * * @category Zend * @package Zend_XmlRpc - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -61,18 +61,13 @@ class Zend_XmlRpc_Request_Http extends Zend_XmlRpc_Request */ public function __construct() { - $fh = fopen('php://input', 'r'); - if (!$fh) { - $this->_fault = new Zend_XmlRpc_Server_Exception(630); + $xml = @file_get_contents('php://input'); + if (!$xml) { + require_once 'Zend/XmlRpc/Fault.php'; + $this->_fault = new Zend_XmlRpc_Fault(630); return; } - $xml = ''; - while (!feof($fh)) { - $xml .= fgets($fh); - } - fclose($fh); - $this->_xml = $xml; $this->loadXml($xml); diff --git a/lib/zend/Zend/XmlRpc/Request/Stdin.php b/lib/zend/Zend/XmlRpc/Request/Stdin.php index e152b3b965..c3757bb05c 100644 --- a/lib/zend/Zend/XmlRpc/Request/Stdin.php +++ b/lib/zend/Zend/XmlRpc/Request/Stdin.php @@ -14,7 +14,7 @@ * * @category Zend * @package Zend_Controller - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -32,7 +32,7 @@ require_once 'Zend/XmlRpc/Request.php'; * * @category Zend * @package Zend_XmlRpc - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ diff --git a/lib/zend/Zend/XmlRpc/Response.php b/lib/zend/Zend/XmlRpc/Response.php index c6b59a3e8c..6b99dc0bf7 100644 --- a/lib/zend/Zend/XmlRpc/Response.php +++ b/lib/zend/Zend/XmlRpc/Response.php @@ -14,7 +14,7 @@ * * @category Zend * @package Zend_Controller - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -35,7 +35,7 @@ require_once 'Zend/XmlRpc/Fault.php'; * * @category Zend * @package Zend_XmlRpc - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ diff --git a/lib/zend/Zend/XmlRpc/Response/Http.php b/lib/zend/Zend/XmlRpc/Response/Http.php index 76938320c6..b0575c2890 100644 --- a/lib/zend/Zend/XmlRpc/Response/Http.php +++ b/lib/zend/Zend/XmlRpc/Response/Http.php @@ -14,7 +14,7 @@ * * @category Zend * @package Zend_Controller - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -29,7 +29,7 @@ require_once 'Zend/XmlRpc/Response.php'; * @uses Zend_XmlRpc_Response * @category Zend * @package Zend_XmlRpc - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ diff --git a/lib/zend/Zend/XmlRpc/Server.php b/lib/zend/Zend/XmlRpc/Server.php index 4c4dae8b08..69c198e029 100644 --- a/lib/zend/Zend/XmlRpc/Server.php +++ b/lib/zend/Zend/XmlRpc/Server.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -25,11 +25,6 @@ */ require_once 'Zend/Server/Abstract.php'; -/** - * Exception this class throws - */ -require_once 'Zend/XmlRpc/Server/Exception.php'; - /** * XMLRPC Request */ @@ -116,7 +111,7 @@ require_once 'Zend/Server/Reflection/Method.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Server extends Zend_Server_Abstract @@ -141,7 +136,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Dispatch table of name => method pairs - * @var Zend_XmlRpc_Server_ServerDefinition + * @var Zend_Server_Definition */ protected $_table; @@ -175,6 +170,13 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract 'mixed' => 'struct' ); + /** + * Send arguments to all methods or just constructor? + * + * @var bool + */ + protected $_sendArgumentsToAllMethods = true; + /** * Constructor * @@ -190,9 +192,9 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Proxy calls to system object - * - * @param string $method - * @param array $params + * + * @param string $method + * @param array $params * @return mixed * @throws Zend_XmlRpc_Server_Exception */ @@ -200,6 +202,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract { $system = $this->getSystem(); if (!method_exists($system, $method)) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Unknown instance method called on server: ' . $method); } return call_user_func_array(array($system, $method), $params); @@ -224,6 +227,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract public function addFunction($function, $namespace = '') { if (!is_string($function) && !is_array($function)) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Unable to attach function; invalid', 611); } @@ -236,6 +240,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract $function = (array) $function; foreach ($function as $func) { if (!is_string($func) || !function_exists($func)) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Unable to attach function; invalid', 611); } $reflection = Zend_Server_Reflection::reflectFunction($func, $argv, $namespace); @@ -263,15 +268,14 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract public function setClass($class, $namespace = '', $argv = null) { if (is_string($class) && !class_exists($class)) { - if (!class_exists($class)) { - throw new Zend_XmlRpc_Server_Exception('Invalid method class', 610); - } + require_once 'Zend/XmlRpc/Server/Exception.php'; + throw new Zend_XmlRpc_Server_Exception('Invalid method class', 610); } $argv = null; - if (3 < func_num_args()) { + if (2 < func_num_args()) { $argv = func_get_args(); - $argv = array_slice($argv, 3); + $argv = array_slice($argv, 2); } $dispatchable = Zend_Server_Reflection::reflectClass($class, $argv, $namespace); @@ -292,8 +296,9 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract if (!$fault instanceof Exception) { $fault = (string) $fault; if (empty($fault)) { - $fault = 'Unknown error'; + $fault = 'Unknown Error'; } + require_once 'Zend/XmlRpc/Server/Exception.php'; $fault = new Zend_XmlRpc_Server_Exception($fault, $code); } @@ -353,6 +358,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract } else { $type = gettype($definition); } + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Unable to load server definition; must be an array or Zend_Server_Definition, received ' . $type, 612); } @@ -415,10 +421,12 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract if (is_string($request) && class_exists($request)) { $request = new $request(); if (!$request instanceof Zend_XmlRpc_Request) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Invalid request class'); } $request->setEncoding($this->getEncoding()); } elseif (!$request instanceof Zend_XmlRpc_Request) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Invalid request object'); } @@ -444,20 +452,19 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract */ public function setResponseClass($class) { - if (class_exists($class)) { - $reflection = new ReflectionClass($class); - if ($reflection->isSubclassOf(new ReflectionClass('Zend_XmlRpc_Response'))) { - $this->_responseClass = $class; - return true; - } - } + if (!class_exists($class) or + ($c = new ReflectionClass($class) and !$c->isSubclassOf('Zend_XmlRpc_Response'))) { - return false; + require_once 'Zend/XmlRpc/Server/Exception.php'; + throw new Zend_XmlRpc_Server_Exception('Invalid response class'); + } + $this->_responseClass = $class; + return true; } /** * Retrieve current response class - * + * * @return string */ public function getResponseClass() @@ -467,7 +474,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Retrieve dispatch table - * + * * @return array */ public function getDispatchTable() @@ -490,7 +497,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Retrieve system object - * + * * @return Zend_XmlRpc_Server_System */ public function getSystem() @@ -498,10 +505,28 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract return $this->_system; } + /** + * Send arguments to all methods? + * + * If setClass() is used to add classes to the server, this flag defined + * how to handle arguments. If set to true, all methods including constructor + * will receive the arguments. If set to false, only constructor will receive the + * arguments + */ + public function sendArgumentsToAllMethods($flag = null) + { + if ($flag === null) { + return $this->_sendArgumentsToAllMethods; + } + + $this->_sendArgumentsToAllMethods = (bool)$flag; + return $this; + } + /** * Map PHP type to XML-RPC type - * - * @param string $type + * + * @param string $type * @return string */ protected function _fixType($type) @@ -527,13 +552,14 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract // Check for valid method if (!$this->_table->hasMethod($method)) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Method "' . $method . '" does not exist', 620); } $info = $this->_table->getMethod($method); $params = $request->getParams(); $argv = $info->getInvokeArguments(); - if (0 < count($argv)) { + if (0 < count($argv) and $this->sendArgumentsToAllMethods()) { $params = array_merge($params, $argv); } @@ -559,6 +585,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract } } if (!$matched) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Calling parameters do not match signature', 623); } @@ -569,7 +596,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Register system methods with the server - * + * * @return void */ protected function _registerSystemMethods() diff --git a/lib/zend/Zend/XmlRpc/Server/Cache.php b/lib/zend/Zend/XmlRpc/Server/Cache.php index 59c3e469f5..b95fbbf264 100644 --- a/lib/zend/Zend/XmlRpc/Server/Cache.php +++ b/lib/zend/Zend/XmlRpc/Server/Cache.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -29,7 +29,7 @@ require_once 'Zend/Server/Cache.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Server_Cache extends Zend_Server_Cache diff --git a/lib/zend/Zend/XmlRpc/Server/Exception.php b/lib/zend/Zend/XmlRpc/Server/Exception.php index 4907fcd536..2088411f8f 100644 --- a/lib/zend/Zend/XmlRpc/Server/Exception.php +++ b/lib/zend/Zend/XmlRpc/Server/Exception.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -33,7 +33,7 @@ require_once 'Zend/XmlRpc/Exception.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Server_Exception extends Zend_XmlRpc_Exception diff --git a/lib/zend/Zend/XmlRpc/Server/Fault.php b/lib/zend/Zend/XmlRpc/Server/Fault.php index f85f393ac2..f6bf1863a2 100644 --- a/lib/zend/Zend/XmlRpc/Server/Fault.php +++ b/lib/zend/Zend/XmlRpc/Server/Fault.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -44,7 +44,7 @@ require_once 'Zend/XmlRpc/Fault.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Server_Fault extends Zend_XmlRpc_Fault diff --git a/lib/zend/Zend/XmlRpc/Server/System.php b/lib/zend/Zend/XmlRpc/Server/System.php index b1e7cb91ad..8346ead432 100644 --- a/lib/zend/Zend/XmlRpc/Server/System.php +++ b/lib/zend/Zend/XmlRpc/Server/System.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -26,15 +26,20 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Server - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Server_System { + /** + * @var Zend_XmlRpc_Server + */ + protected $_server; + /** * Constructor - * - * @param Zend_XmlRpc_Server $server + * + * @param Zend_XmlRpc_Server $server * @return void */ public function __construct(Zend_XmlRpc_Server $server) @@ -65,7 +70,8 @@ class Zend_XmlRpc_Server_System { $table = $this->_server->getDispatchTable(); if (!$table->hasMethod($method)) { - throw new Zend_Server_Exception('Method "' . $method . '"does not exist', 640); + require_once 'Zend/XmlRpc/Server/Exception.php'; + throw new Zend_XmlRpc_Server_Exception('Method "' . $method . '" does not exist', 640); } return $table->getMethod($method)->getMethodHelp(); @@ -81,7 +87,8 @@ class Zend_XmlRpc_Server_System { $table = $this->_server->getDispatchTable(); if (!$table->hasMethod($method)) { - throw new Zend_Server_Exception('Method "' . $method . '"does not exist', 640); + require_once 'Zend/XmlRpc/Server/Exception.php'; + throw new Zend_XmlRpc_Server_Exception('Method "' . $method . '" does not exist', 640); } $method = $table->getMethod($method)->toArray(); return $method['prototypes']; @@ -130,7 +137,13 @@ class Zend_XmlRpc_Server_System $request->setMethod($method['methodName']); $request->setParams($method['params']); $response = $this->_server->handle($request); - $responses[] = $response->getReturnValue(); + if ($response instanceof Zend_XmlRpc_Fault + || $response->isFault() + ) { + $fault = $response; + } else { + $responses[] = $response->getReturnValue(); + } } catch (Exception $e) { $fault = $this->_server->fault($e); } diff --git a/lib/zend/Zend/XmlRpc/Value.php b/lib/zend/Zend/XmlRpc/Value.php index 6001d08eb6..7adedbb233 100644 --- a/lib/zend/Zend/XmlRpc/Value.php +++ b/lib/zend/Zend/XmlRpc/Value.php @@ -15,49 +15,11 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ - -/** Zend_XmlRpc_Value_Exception */ -require_once 'Zend/XmlRpc/Value/Exception.php'; - -/** Zend_XmlRpc_Value_Scalar */ -require_once 'Zend/XmlRpc/Value/Scalar.php'; - -/** Zend_XmlRpc_Value_Base64 */ -require_once 'Zend/XmlRpc/Value/Base64.php'; - -/** Zend_XmlRpc_Value_Boolean */ -require_once 'Zend/XmlRpc/Value/Boolean.php'; - -/** Zend_XmlRpc_Value_DateTime */ -require_once 'Zend/XmlRpc/Value/DateTime.php'; - -/** Zend_XmlRpc_Value_Double */ -require_once 'Zend/XmlRpc/Value/Double.php'; - -/** Zend_XmlRpc_Value_Integer */ -require_once 'Zend/XmlRpc/Value/Integer.php'; - -/** Zend_XmlRpc_Value_String */ -require_once 'Zend/XmlRpc/Value/String.php'; - -/** Zend_XmlRpc_Value_Nil */ -require_once 'Zend/XmlRpc/Value/Nil.php'; - -/** Zend_XmlRpc_Value_Collection */ -require_once 'Zend/XmlRpc/Value/Collection.php'; - -/** Zend_XmlRpc_Value_Array */ -require_once 'Zend/XmlRpc/Value/Array.php'; - -/** Zend_XmlRpc_Value_Struct */ -require_once 'Zend/XmlRpc/Value/Struct.php'; - - /** * Represent a native XML-RPC value entity, used as parameters for the methods * called by the Zend_XmlRpc_Client object and as the return value for those calls. @@ -69,7 +31,7 @@ require_once 'Zend/XmlRpc/Value/Struct.php'; * from PHP variables, XML string or by specifing the exact XML-RPC natvie type * * @package Zend_XmlRpc - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_XmlRpc_Value @@ -111,16 +73,19 @@ abstract class Zend_XmlRpc_Value /** * All the XML-RPC native types */ - const XMLRPC_TYPE_I4 = 'i4'; - const XMLRPC_TYPE_INTEGER = 'int'; - const XMLRPC_TYPE_DOUBLE = 'double'; - const XMLRPC_TYPE_BOOLEAN = 'boolean'; - const XMLRPC_TYPE_STRING = 'string'; - const XMLRPC_TYPE_DATETIME = 'dateTime.iso8601'; - const XMLRPC_TYPE_BASE64 = 'base64'; - const XMLRPC_TYPE_ARRAY = 'array'; - const XMLRPC_TYPE_STRUCT = 'struct'; - const XMLRPC_TYPE_NIL = 'nil'; + const XMLRPC_TYPE_I4 = 'i4'; + const XMLRPC_TYPE_INTEGER = 'int'; + const XMLRPC_TYPE_I8 = 'i8'; + const XMLRPC_TYPE_APACHEI8 = 'ex:i8'; + const XMLRPC_TYPE_DOUBLE = 'double'; + const XMLRPC_TYPE_BOOLEAN = 'boolean'; + const XMLRPC_TYPE_STRING = 'string'; + const XMLRPC_TYPE_DATETIME = 'dateTime.iso8601'; + const XMLRPC_TYPE_BASE64 = 'base64'; + const XMLRPC_TYPE_ARRAY = 'array'; + const XMLRPC_TYPE_STRUCT = 'struct'; + const XMLRPC_TYPE_NIL = 'nil'; + const XMLRPC_TYPE_APACHENIL = 'ex:nil'; /** @@ -165,6 +130,10 @@ abstract class Zend_XmlRpc_Value return $this->_as_dom; } + /** + * @param DOMDocument $dom + * @return mixed + */ protected function _stripXmlDeclaration(DOMDocument $dom) { return preg_replace('/<\?xml version="1.0"( encoding="[^\"]*")?\?>\n/u', '', $dom->saveXML()); @@ -200,33 +169,51 @@ abstract class Zend_XmlRpc_Value case self::XMLRPC_TYPE_I4: // fall through to the next case case self::XMLRPC_TYPE_INTEGER: + require_once 'Zend/XmlRpc/Value/Integer.php'; return new Zend_XmlRpc_Value_Integer($value); + case self::XMLRPC_TYPE_I8: + // fall through to the next case + case self::XMLRPC_TYPE_APACHEI8: + require_once 'Zend/XmlRpc/Value/BigInteger.php'; + return new Zend_XmlRpc_Value_BigInteger($value); + case self::XMLRPC_TYPE_DOUBLE: + require_once 'Zend/XmlRpc/Value/Double.php'; return new Zend_XmlRpc_Value_Double($value); case self::XMLRPC_TYPE_BOOLEAN: + require_once 'Zend/XmlRpc/Value/Boolean.php'; return new Zend_XmlRpc_Value_Boolean($value); case self::XMLRPC_TYPE_STRING: + require_once 'Zend/XmlRpc/Value/String.php'; return new Zend_XmlRpc_Value_String($value); case self::XMLRPC_TYPE_BASE64: + require_once 'Zend/XmlRpc/Value/Base64.php'; return new Zend_XmlRpc_Value_Base64($value); case self::XMLRPC_TYPE_NIL: + // fall through to the next case + case self::XMLRPC_TYPE_APACHENIL: + require_once 'Zend/XmlRpc/Value/Nil.php'; return new Zend_XmlRpc_Value_Nil(); case self::XMLRPC_TYPE_DATETIME: + require_once 'Zend/XmlRpc/Value/DateTime.php'; return new Zend_XmlRpc_Value_DateTime($value); case self::XMLRPC_TYPE_ARRAY: + require_once 'Zend/XmlRpc/Value/Array.php'; return new Zend_XmlRpc_Value_Array($value); case self::XMLRPC_TYPE_STRUCT: + require_once 'Zend/XmlRpc/Value/Struct.php'; return new Zend_XmlRpc_Value_Struct($value); default: + require_once 'Zend/XmlRpc/Value/Exception.php'; throw new Zend_XmlRpc_Value_Exception('Given type is not a '. __CLASS__ .' constant'); } } @@ -248,37 +235,48 @@ abstract class Zend_XmlRpc_Value if ($value instanceof Zend_XmlRpc_Value) { return $value; } - + // Otherwise, we convert the object into a struct $value = get_object_vars($value); // Break intentionally omitted case 'array': // Default native type for a PHP array (a simple numeric array) is 'array' + require_once 'Zend/XmlRpc/Value/Array.php'; $obj = 'Zend_XmlRpc_Value_Array'; // Determine if this is an associative array if (!empty($value) && is_array($value) && (array_keys($value) !== range(0, count($value) - 1))) { + require_once 'Zend/XmlRpc/Value/Struct.php'; $obj = 'Zend_XmlRpc_Value_Struct'; } return new $obj($value); case 'integer': + require_once 'Zend/XmlRpc/Value/Integer.php'; return new Zend_XmlRpc_Value_Integer($value); + case 'i8': + require_once 'Zend/XmlRpc/Value/BigInteger.php'; + return new Zend_XmlRpc_Value_BigInteger($value); + case 'double': + require_once 'Zend/XmlRpc/Value/Double.php'; return new Zend_XmlRpc_Value_Double($value); case 'boolean': + require_once 'Zend/XmlRpc/Value/Boolean.php'; return new Zend_XmlRpc_Value_Boolean($value); case 'NULL': case 'null': + require_once 'Zend/XmlRpc/Value/Nil.php'; return new Zend_XmlRpc_Value_Nil(); case 'string': // Fall through to the next case default: // If type isn't identified (or identified as string), it treated as string + require_once 'Zend/XmlRpc/Value/String.php'; return new Zend_XmlRpc_Value_String($value); } } @@ -287,25 +285,40 @@ abstract class Zend_XmlRpc_Value /** * Transform an XML string into a XML-RPC native value * - * @param string|SimpleXMLElement $simple_xml A SimpleXMLElement object represent the XML string + * @param string|SimpleXMLElement $xml A SimpleXMLElement object represent the XML string * It can be also a valid XML string for convertion * * @return Zend_XmlRpc_Value * @static */ - private static function _xmlStringToNativeXmlRpc($simple_xml) + private static function _xmlStringToNativeXmlRpc($xml) { - if (!$simple_xml instanceof SimpleXMLElement) { + if (!$xml instanceof SimpleXMLElement) { try { - $simple_xml = @new SimpleXMLElement($simple_xml); + $xml = new SimpleXMLElement($xml); } catch (Exception $e) { // The given string is not a valid XML + require_once 'Zend/XmlRpc/Value/Exception.php'; throw new Zend_XmlRpc_Value_Exception('Failed to create XML-RPC value from XML string: '.$e->getMessage(),$e->getCode()); } } - // Get the key (tag name) and value from the simple xml object and convert the value to an XML-RPC native value - list($type, $value) = each($simple_xml); + $type = null; + $value = null; + list($type, $value) = each($xml); + + if (!$type and $value === null) { + $namespaces = array('ex' => 'http://ws.apache.org/xmlrpc/namespaces/extensions'); + foreach ($namespaces as $namespaceName => $namespaceUri) { + $namespaceXml = $xml->children($namespaceUri); + list($type, $value) = each($namespaceXml); + if ($type !== null) { + $type = $namespaceName . ':' . $type; + break; + } + } + } + if (!$type) { // If no type was specified, the default is string $type = self::XMLRPC_TYPE_STRING; } @@ -315,33 +328,44 @@ abstract class Zend_XmlRpc_Value case self::XMLRPC_TYPE_I4: // Fall through to the next case case self::XMLRPC_TYPE_INTEGER: - $xmlrpc_val = new Zend_XmlRpc_Value_Integer($value); + require_once 'Zend/XmlRpc/Value/Integer.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_Integer($value); + break; + case self::XMLRPC_TYPE_APACHEI8: + // Fall through to the next case + case self::XMLRPC_TYPE_I8: + require_once 'Zend/XmlRpc/Value/BigInteger.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_BigInteger($value); break; case self::XMLRPC_TYPE_DOUBLE: - $xmlrpc_val = new Zend_XmlRpc_Value_Double($value); + require_once 'Zend/XmlRpc/Value/Double.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_Double($value); break; case self::XMLRPC_TYPE_BOOLEAN: - $xmlrpc_val = new Zend_XmlRpc_Value_Boolean($value); + require_once 'Zend/XmlRpc/Value/Boolean.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_Boolean($value); break; case self::XMLRPC_TYPE_STRING: - $xmlrpc_val = new Zend_XmlRpc_Value_String($value); + require_once 'Zend/XmlRpc/Value/String.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_String($value); break; case self::XMLRPC_TYPE_DATETIME: // The value should already be in a iso8601 format - $xmlrpc_val = new Zend_XmlRpc_Value_DateTime($value); + require_once 'Zend/XmlRpc/Value/DateTime.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_DateTime($value); break; case self::XMLRPC_TYPE_BASE64: // The value should already be base64 encoded - $xmlrpc_val = new Zend_XmlRpc_Value_Base64($value ,true); + require_once 'Zend/XmlRpc/Value/Base64.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_Base64($value, true); break; - case self::XMLRPC_TYPE_NIL: // The value should always be NULL - $xmlrpc_val = new Zend_XmlRpc_Value_Nil(); + case self::XMLRPC_TYPE_NIL: + // Fall through to the next case + case self::XMLRPC_TYPE_APACHENIL: + // The value should always be NULL + require_once 'Zend/XmlRpc/Value/Nil.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_Nil(); break; case self::XMLRPC_TYPE_ARRAY: - // If the XML is valid, $value must be an SimpleXML element and contain the tag - if (!$value instanceof SimpleXMLElement) { - throw new Zend_XmlRpc_Value_Exception('XML string is invalid for XML-RPC native '. self::XMLRPC_TYPE_ARRAY .' type'); - } - - // PHP 5.2.4 introduced a regression in how empty($xml->value) + // PHP 5.2.4 introduced a regression in how empty($xml->value) // returns; need to look for the item specifically $data = null; foreach ($value->children() as $key => $value) { @@ -350,8 +374,9 @@ abstract class Zend_XmlRpc_Value break; } } - + if (null === $data) { + require_once 'Zend/XmlRpc/Value/Exception.php'; throw new Zend_XmlRpc_Value_Exception('Invalid XML for XML-RPC native '. self::XMLRPC_TYPE_ARRAY .' type: ARRAY tag must contain DATA tag'); } $values = array(); @@ -360,42 +385,64 @@ abstract class Zend_XmlRpc_Value foreach ($data->value as $element) { $values[] = self::_xmlStringToNativeXmlRpc($element); } - $xmlrpc_val = new Zend_XmlRpc_Value_Array($values); + require_once 'Zend/XmlRpc/Value/Array.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_Array($values); break; case self::XMLRPC_TYPE_STRUCT: - // If the XML is valid, $value must be an SimpleXML - if ((!$value instanceof SimpleXMLElement)) { - throw new Zend_XmlRpc_Value_Exception('XML string is invalid for XML-RPC native '. self::XMLRPC_TYPE_STRUCT .' type'); - } $values = array(); // Parse all the memebers of the struct from the XML string // (simple xml element) to Zend_XmlRpc_Value objects foreach ($value->member as $member) { // @todo? If a member doesn't have a tag, we don't add it to the struct // Maybe we want to throw an exception here ? - if ((!$member->value instanceof SimpleXMLElement)) { + if (!isset($member->value) or !isset($member->name)) { continue; //throw new Zend_XmlRpc_Value_Exception('Member of the '. self::XMLRPC_TYPE_STRUCT .' XML-RPC native type must contain a VALUE tag'); } $values[(string)$member->name] = self::_xmlStringToNativeXmlRpc($member->value); } - $xmlrpc_val = new Zend_XmlRpc_Value_Struct($values); + require_once 'Zend/XmlRpc/Value/Struct.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_Struct($values); break; default: + require_once 'Zend/XmlRpc/Value/Exception.php'; throw new Zend_XmlRpc_Value_Exception('Value type \''. $type .'\' parsed from the XML string is not a known XML-RPC native type'); break; } - $xmlrpc_val->_setXML($simple_xml->asXML()); + $xmlrpcValue->_setXML($xml->asXML()); - return $xmlrpc_val; + return $xmlrpcValue; } - + /** + * @param $xml + * @return void + */ private function _setXML($xml) { $this->_as_xml = $xml; } -} + /** + * Make sure a string will be safe for XML, convert risky characters to entities + * + * @param string $str + * @return string + */ + protected function _escapeXmlEntities($str) + { + return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); + } + /** + * Convert XML entities into string values + * + * @param string $str + * @return string + */ + protected function _decodeXmlEntities($str) + { + return html_entity_decode($str, ENT_QUOTES, 'UTF-8'); + } +} diff --git a/lib/zend/Zend/XmlRpc/Value/Array.php b/lib/zend/Zend/XmlRpc/Value/Array.php index c6d8bc6e7b..777c41324e 100644 --- a/lib/zend/Zend/XmlRpc/Value/Array.php +++ b/lib/zend/Zend/XmlRpc/Value/Array.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,7 +31,7 @@ require_once 'Zend/XmlRpc/Value/Collection.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Value_Array extends Zend_XmlRpc_Value_Collection diff --git a/lib/zend/Zend/XmlRpc/Value/Base64.php b/lib/zend/Zend/XmlRpc/Value/Base64.php index 88bc6b10f0..fe7274b850 100644 --- a/lib/zend/Zend/XmlRpc/Value/Base64.php +++ b/lib/zend/Zend/XmlRpc/Value/Base64.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,7 +31,7 @@ require_once 'Zend/XmlRpc/Value/Scalar.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Value_Base64 extends Zend_XmlRpc_Value_Scalar @@ -68,7 +68,7 @@ class Zend_XmlRpc_Value_Base64 extends Zend_XmlRpc_Value_Scalar /** * Return the XML code representing the base64-encoded value - * + * * @return string */ public function saveXML() diff --git a/lib/zend/Zend/XmlRpc/Value/BigInteger.php b/lib/zend/Zend/XmlRpc/Value/BigInteger.php new file mode 100644 index 0000000000..bfe37dee4c --- /dev/null +++ b/lib/zend/Zend/XmlRpc/Value/BigInteger.php @@ -0,0 +1,65 @@ +_integer = new Zend_Crypt_Math_BigInteger(); + $this->_value = $this->_integer->init($this->_value); + + $this->_type = self::XMLRPC_TYPE_I8; + } + + /** + * Return bigint value object + * + * @return Zend_Crypt_Math_BigInteger + */ + public function getValue() + { + return $this->_integer; + } +} diff --git a/lib/zend/Zend/XmlRpc/Value/Boolean.php b/lib/zend/Zend/XmlRpc/Value/Boolean.php index 76258c7b54..16bae5592e 100644 --- a/lib/zend/Zend/XmlRpc/Value/Boolean.php +++ b/lib/zend/Zend/XmlRpc/Value/Boolean.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,7 +31,7 @@ require_once 'Zend/XmlRpc/Value/Scalar.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Value_Boolean extends Zend_XmlRpc_Value_Scalar diff --git a/lib/zend/Zend/XmlRpc/Value/Collection.php b/lib/zend/Zend/XmlRpc/Value/Collection.php index 03cce31b0f..810cd2afdd 100644 --- a/lib/zend/Zend/XmlRpc/Value/Collection.php +++ b/lib/zend/Zend/XmlRpc/Value/Collection.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,7 +31,7 @@ require_once 'Zend/XmlRpc/Value.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_XmlRpc_Value_Collection extends Zend_XmlRpc_Value @@ -66,14 +66,8 @@ abstract class Zend_XmlRpc_Value_Collection extends Zend_XmlRpc_Value $values = (array)$this->_value; foreach ($values as $key => $value) { /* @var $value Zend_XmlRpc_Value */ - - if (!$value instanceof parent) { - throw new Zend_XmlRpc_Value_Exception('Values of '. get_class($this) .' type must be Zend_XmlRpc_Value objects'); - } $values[$key] = $value->getValue(); } return $values; } - } - diff --git a/lib/zend/Zend/XmlRpc/Value/DateTime.php b/lib/zend/Zend/XmlRpc/Value/DateTime.php index b94eaf5bb4..509b3f232c 100644 --- a/lib/zend/Zend/XmlRpc/Value/DateTime.php +++ b/lib/zend/Zend/XmlRpc/Value/DateTime.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,12 +31,11 @@ require_once 'Zend/XmlRpc/Value/Scalar.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Value_DateTime extends Zend_XmlRpc_Value_Scalar { - /** * Set the value of a dateTime.iso8601 native type * @@ -51,20 +50,21 @@ class Zend_XmlRpc_Value_DateTime extends Zend_XmlRpc_Value_Scalar // If the value is not numeric, we try to convert it to a timestamp (using the strtotime function) if (is_numeric($value)) { // The value is numeric, we make sure it is an integer - $value = (int)$value; + $timestamp = (int)$value; } else { - $value = strtotime($value); - if ($value === false || $value == -1) { // cannot convert the value to a timestamp + $timestamp = strtotime($value); + if ($timestamp === false || $timestamp == -1) { // cannot convert the value to a timestamp throw new Zend_XmlRpc_Value_Exception('Cannot convert given value \''. $value .'\' to a timestamp'); } } - $value = date('c', $value); // Convert the timestamp to iso8601 format + + $date = date('c', $timestamp); // Convert the timestamp to iso8601 format // Strip out TZ information and dashes - $value = preg_replace('/(\+|-)\d{2}:\d{2}$/', '', $value); - $value = str_replace('-', '', $value); + $date = preg_replace('/(\+|-)\d{2}:\d{2}$/', '', $date); + $date = str_replace('-', '', $date); - $this->_value = $value; + $this->_value = $date; } /** @@ -76,6 +76,4 @@ class Zend_XmlRpc_Value_DateTime extends Zend_XmlRpc_Value_Scalar { return $this->_value; } - } - diff --git a/lib/zend/Zend/XmlRpc/Value/Double.php b/lib/zend/Zend/XmlRpc/Value/Double.php index 48eaf5a0ce..1d13f89bef 100644 --- a/lib/zend/Zend/XmlRpc/Value/Double.php +++ b/lib/zend/Zend/XmlRpc/Value/Double.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,7 +31,7 @@ require_once 'Zend/XmlRpc/Value/Scalar.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Value_Double extends Zend_XmlRpc_Value_Scalar @@ -45,7 +45,9 @@ class Zend_XmlRpc_Value_Double extends Zend_XmlRpc_Value_Scalar public function __construct($value) { $this->_type = self::XMLRPC_TYPE_DOUBLE; - $this->_value = sprintf('%f',(float)$value); // Make sure this value is float (double) and without the scientific notation + $precision = (int)ini_get('precision'); + $formatString = '%1.' . $precision . 'f'; + $this->_value = sprintf($formatString, (float)$value); } /** @@ -57,6 +59,4 @@ class Zend_XmlRpc_Value_Double extends Zend_XmlRpc_Value_Scalar { return (float)$this->_value; } - } - diff --git a/lib/zend/Zend/XmlRpc/Value/Exception.php b/lib/zend/Zend/XmlRpc/Value/Exception.php index 6cc016b49e..5e48c4e3f9 100644 --- a/lib/zend/Zend/XmlRpc/Value/Exception.php +++ b/lib/zend/Zend/XmlRpc/Value/Exception.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,7 +31,7 @@ require_once 'Zend/XmlRpc/Exception.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Value_Exception extends Zend_XmlRpc_Exception diff --git a/lib/zend/Zend/XmlRpc/Value/Integer.php b/lib/zend/Zend/XmlRpc/Value/Integer.php index cd890d5165..3c4e2346f9 100644 --- a/lib/zend/Zend/XmlRpc/Value/Integer.php +++ b/lib/zend/Zend/XmlRpc/Value/Integer.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,7 +31,7 @@ require_once 'Zend/XmlRpc/Value/Scalar.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Value_Integer extends Zend_XmlRpc_Value_Scalar @@ -44,6 +44,11 @@ class Zend_XmlRpc_Value_Integer extends Zend_XmlRpc_Value_Scalar */ public function __construct($value) { + if ($value > PHP_INT_MAX) { + require_once 'Zend/XmlRpc/Value/Exception.php'; + throw new Zend_XmlRpc_Value_Exception('Overlong integer given'); + } + $this->_type = self::XMLRPC_TYPE_INTEGER; $this->_value = (int)$value; // Make sure this value is integer } @@ -57,6 +62,4 @@ class Zend_XmlRpc_Value_Integer extends Zend_XmlRpc_Value_Scalar { return $this->_value; } - } - diff --git a/lib/zend/Zend/XmlRpc/Value/Nil.php b/lib/zend/Zend/XmlRpc/Value/Nil.php index 4edad72f0f..5a721ad709 100644 --- a/lib/zend/Zend/XmlRpc/Value/Nil.php +++ b/lib/zend/Zend/XmlRpc/Value/Nil.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,7 +31,7 @@ require_once 'Zend/XmlRpc/Value/Scalar.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Value_Nil extends Zend_XmlRpc_Value_Scalar @@ -56,24 +56,5 @@ class Zend_XmlRpc_Value_Nil extends Zend_XmlRpc_Value_Scalar { return null; } - - /** - * Return the XML code representing the nil - * - * @return string - */ - public function saveXML() - { - if (! $this->_as_xml) { // The XML was not generated yet - $dom = new DOMDocument('1.0', 'UTF-8'); - $value = $dom->appendChild($dom->createElement('value')); - $type = $value->appendChild($dom->createElement($this->_type)); - - $this->_as_dom = $value; - $this->_as_xml = $this->_stripXmlDeclaration($dom); - } - - return $this->_as_xml; - } } diff --git a/lib/zend/Zend/XmlRpc/Value/Scalar.php b/lib/zend/Zend/XmlRpc/Value/Scalar.php index 95eccdf786..291b842544 100644 --- a/lib/zend/Zend/XmlRpc/Value/Scalar.php +++ b/lib/zend/Zend/XmlRpc/Value/Scalar.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,7 +31,7 @@ require_once 'Zend/XmlRpc/Value.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_XmlRpc_Value_Scalar extends Zend_XmlRpc_Value @@ -57,4 +57,3 @@ abstract class Zend_XmlRpc_Value_Scalar extends Zend_XmlRpc_Value return $this->_as_xml; } } - diff --git a/lib/zend/Zend/XmlRpc/Value/String.php b/lib/zend/Zend/XmlRpc/Value/String.php index 576c127666..3629834493 100644 --- a/lib/zend/Zend/XmlRpc/Value/String.php +++ b/lib/zend/Zend/XmlRpc/Value/String.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -29,7 +29,7 @@ require_once 'Zend/XmlRpc/Value/Scalar.php'; /** * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Value_String extends Zend_XmlRpc_Value_Scalar @@ -45,7 +45,7 @@ class Zend_XmlRpc_Value_String extends Zend_XmlRpc_Value_Scalar $this->_type = self::XMLRPC_TYPE_STRING; // Make sure this value is string and all XML characters are encoded - $this->_value = $this->_xml_entities($value); + $this->_value = $this->_escapeXmlEntities($value); } /** @@ -56,19 +56,7 @@ class Zend_XmlRpc_Value_String extends Zend_XmlRpc_Value_Scalar */ public function getValue() { - return html_entity_decode($this->_value, ENT_QUOTES, 'UTF-8'); + return $this->_decodeXmlEntities($this->_value); } - - /** - * Make sure a string will be safe for XML, convert risky characters to HTML entities - * - * @param string $str - * @return string - */ - private function _xml_entities($str) - { - return htmlentities($str, ENT_QUOTES, 'UTF-8'); - } - } diff --git a/lib/zend/Zend/XmlRpc/Value/Struct.php b/lib/zend/Zend/XmlRpc/Value/Struct.php index 865691a0f7..dccdf49c5e 100644 --- a/lib/zend/Zend/XmlRpc/Value/Struct.php +++ b/lib/zend/Zend/XmlRpc/Value/Struct.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ @@ -31,7 +31,7 @@ require_once 'Zend/XmlRpc/Value/Collection.php'; * @category Zend * @package Zend_XmlRpc * @subpackage Value - * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_XmlRpc_Value_Struct extends Zend_XmlRpc_Value_Collection @@ -64,7 +64,7 @@ class Zend_XmlRpc_Value_Struct extends Zend_XmlRpc_Value_Collection foreach ($this->_value as $name => $val) { /* @var $val Zend_XmlRpc_Value */ $member = $struct->appendChild($dom->createElement('member')); - $member->appendChild($dom->createElement('name', $name)); + $member->appendChild($dom->createElement('name', $this->_escapeXmlEntities($name))); $member->appendChild($dom->importNode($val->getAsDOM(), 1)); } } -- 2.39.5