r1604 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r1603‎ | r1604 | r1605 >
Date:19:36, 29 August 2003
Author:(no author)
Status:old
Tags:
Comment:
This commit was manufactured by cvs2svn to create branch 'stable'.
Modified paths:
  • /branches/stable/phase3/docs/php-memcached (added) (history)
  • /branches/stable/phase3/docs/php-memcached (added) (history)
  • /branches/stable/phase3/includes/MemCachedClient.inc.php (added) (history)
  • /branches/stable/phase3/includes/MemCachedClient.inc.php (added) (history)
  • /branches/stable/phase3/languages/LanguageRo.php (added) (history)
  • /branches/stable/phase3/languages/LanguageRo.php (added) (history)
  • /branches/stable/phase3/maintenance/archives/patch-interwiki.sql (added) (history)
  • /branches/stable/phase3/maintenance/archives/patch-interwiki.sql (added) (history)

Diff [purge]

Index: branches/stable/phase3/maintenance/archives/patch-interwiki.sql
@@ -0,0 +1,11 @@
 2+-- Creates interwiki prefix<->url mapping table
 3+-- used from 2003-08-21 dev version.
 4+-- Import the default mappings from maintenance/interwiki.sql
 5+
 6+CREATE TABLE interwiki (
 7+ iw_prefix char(32) NOT NULL,
 8+ iw_url char(127) NOT NULL,
 9+ iw_local BOOL NOT NULL,
 10+ UNIQUE KEY iw_prefix (iw_prefix)
 11+);
 12+
Property changes on: branches/stable/phase3/maintenance/archives/patch-interwiki.sql
___________________________________________________________________
Name: svn:eol-style
113 + native
Name: svn:keywords
214 + Author Date Id Revision
Index: branches/stable/phase3/docs/php-memcached/ChangeLog
@@ -0,0 +1,45 @@
 2+Release 1.0.10
 3+--------------
 4+* bug fix: changes hashing function to crc32, sprintf %u
 5+* feature: optional compression
 6+
 7+Release 1.0.9
 8+-------------
 9+* protocol parsing bug
 10+
 11+Release 1.0.8
 12+-------------
 13+* whitespace/punctuation/wording cleanups
 14+
 15+Release 1.0.7
 16+-------------
 17+* added 3 functions which handle error reporting
 18+ error() - returns error number of last error generated, else returns 0
 19+ error_string() - returns a string description of error number retuned
 20+ error_clear() - clears the last error number and error string
 21+* removed call to preg_match() in _loaditems()
 22+* only non-scalar values are serialize() before being
 23+ sent to the server
 24+* added the optional timestamp argument for delete()
 25+ read Documentation file for details
 26+* PHPDocs/PEAR style comments added
 27+* abstract debugging (Brion Vibber <brion@pobox.com>)
 28+
 29+Release 1.0.6
 30+-------------
 31+* removed all array_push() calls
 32+* applied patch provided by Stuart Herbert<stuart@gentoo.org>
 33+ corrects possible endless loop. Available at
 34+ http://bugs.gentoo.org/show_bug.cgi?id=25385
 35+* fixed problem with storing large binary files
 36+* added more error checking, specifically on all socket functions
 37+* added support for the INCR and DECR commands
 38+ which increment or decrement a value stored in MemCached
 39+* Documentation removed from source and is now available
 40+ in the file Documentation
 41+
 42+Release 1.0.4
 43+-------------
 44+* initial release, version numbers kept
 45+ in sync with MemCached version
 46+* capable of storing any datatype in MemCached
Property changes on: branches/stable/phase3/docs/php-memcached/ChangeLog
___________________________________________________________________
Name: svn:keywords
147 + Author Date Id Revision
Name: svn:eol-style
248 + native
Index: branches/stable/phase3/docs/php-memcached/Documentation
@@ -0,0 +1,258 @@
 2+Ryan Gilfether <hotrodder@rocketmail.com>
 3+http://www.gilfether.com
 4+This module is Copyright (c) 2003 Ryan Gilfether.
 5+All rights reserved.
 6+
 7+You may distribute under the terms of the GNU General Public License
 8+This is free software. IT COMES WITHOUT WARRANTY OF ANY KIND.
 9+
 10+See the memcached website: http://www.danga.com/memcached/
 11+
 12+
 13+// Takes one parameter, a array of options. The most important key is
 14+// options["servers"], but that can also be set later with the set_servers()
 15+// method. The servers must be an array of hosts, each of which is
 16+// either a scalar of the form <10.0.0.10:11211> or an array of the
 17+// former and an integer weight value. (the default weight if
 18+// unspecified is 1.) It's recommended that weight values be kept as low
 19+// as possible, as this module currently allocates memory for bucket
 20+// distribution proportional to the total host weights.
 21+// $options["debug"] turns the debugging on if set to true
 22+MemCachedClient::MemCachedClient($options);
 23+
 24+// sets up the list of servers and the ports to connect to
 25+// takes an array of servers in the same format as in the constructor
 26+MemCachedClient::set_servers($servers);
 27+
 28+// Retrieves a key from the memcache. Returns the value (automatically
 29+// unserialized, if necessary) or FALSE if it fails.
 30+// The $key can optionally be an array, with the first element being the
 31+// hash value, if you want to avoid making this module calculate a hash
 32+// value. You may prefer, for example, to keep all of a given user's
 33+// objects on the same memcache server, so you could use the user's
 34+// unique id as the hash value.
 35+// Possible errors set are:
 36+// MC_ERR_GET
 37+MemCachedClient::get($key);
 38+
 39+// just like get(), but takes an array of keys, returns FALSE on error
 40+// Possible errors set are:
 41+// MC_ERR_NOT_ACTIVE
 42+MemCachedClient::get_multi($keys)
 43+
 44+// Unconditionally sets a key to a given value in the memcache. Returns true
 45+// if it was stored successfully.
 46+// The $key can optionally be an arrayref, with the first element being the
 47+// hash value, as described above.
 48+// returns TRUE on success else FALSE
 49+// Possible errors set are:
 50+// MC_ERR_NOT_ACTIVE
 51+// MC_ERR_GET_SOCK
 52+// MC_ERR_SOCKET_WRITE
 53+// MC_ERR_SOCKET_READ
 54+// MC_ERR_SET
 55+MemCachedClient::set($key, $value, $exptime);
 56+
 57+// Like set(), but only stores in memcache if the key doesn't already exist.
 58+// returns TRUE on success else FALSE
 59+// Possible errors set are:
 60+// MC_ERR_NOT_ACTIVE
 61+// MC_ERR_GET_SOCK
 62+// MC_ERR_SOCKET_WRITE
 63+// MC_ERR_SOCKET_READ
 64+// MC_ERR_SET
 65+MemCachedClient::add($key, $value, $exptime);
 66+
 67+// Like set(), but only stores in memcache if the key already exists.
 68+// returns TRUE on success else FALSE
 69+// Possible errors set are:
 70+// MC_ERR_NOT_ACTIVE
 71+// MC_ERR_GET_SOCK
 72+// MC_ERR_SOCKET_WRITE
 73+// MC_ERR_SOCKET_READ
 74+// MC_ERR_SET
 75+MemCachedClient::replace($key, $value, $exptime);
 76+
 77+// removes the key from the MemCache
 78+// $time is the amount of time in seconds (or Unix time) until which
 79+// the client wishes the server to refuse "add" and "replace" commands
 80+// with this key. For this amount of item, the item is put into a
 81+// delete queue, which means that it won't possible to retrieve it by
 82+// the "get" command, but "add" and "replace" command with this key
 83+// will also fail (the "set" command will succeed, however). After the
 84+// time passes, the item is finally deleted from server memory.
 85+// The parameter $time is optional, and, if absent, defaults to 0
 86+// (which means that the item will be deleted immediately and further
 87+// storage commands with this key will succeed).
 88+// returns TRUE on success else returns FALSE
 89+// Possible errors set are:
 90+// MC_ERR_NOT_ACTIVE
 91+// MC_ERR_GET_SOCK
 92+// MC_ERR_SOCKET_WRITE
 93+// MC_ERR_SOCKET_READ
 94+// MC_ERR_DELETE
 95+MemCachedClient::delete($key, $time = 0);
 96+
 97+// Sends a command to the server to atomically increment the value for
 98+// $key by $value, or by 1 if $value is undefined. Returns FALSE if $key
 99+// doesn't exist on server, otherwise it returns the new value after
 100+// incrementing. Value should be zero or greater. Overflow on server
 101+// is not checked. Be aware of values approaching 2**32. See decr.
 102+// Possible errors set are:
 103+// MC_ERR_NOT_ACTIVE
 104+// MC_ERR_GET_SOCK
 105+// MC_ERR_SOCKET_WRITE
 106+// MC_ERR_SOCKET_READ
 107+// returns new value on success, else returns FALSE
 108+// ONLY WORKS WITH NUMERIC VALUES
 109+MemCachedClient::incr($key[, $value]);
 110+
 111+// Like incr, but decrements. Unlike incr, underflow is checked and new
 112+// values are capped at 0. If server value is 1, a decrement of 2
 113+// returns 0, not -1.
 114+// Possible errors set are:
 115+// MC_ERR_NOT_ACTIVE
 116+// MC_ERR_GET_SOCK
 117+// MC_ERR_SOCKET_WRITE
 118+// MC_ERR_SOCKET_READ
 119+// returns new value on success, else returns FALSE
 120+// ONLY WORKS WITH NUMERIC VALUES
 121+MemCachedClient::decr($key[, $value]);
 122+
 123+// disconnects from all servers
 124+MemCachedClient::disconnect_all();
 125+
 126+// if $do_debug is set to true, will print out
 127+// debugging info, else debug is turned off
 128+MemCachedClient::set_debug($do_debug);
 129+
 130+// remove all cached hosts that are no longer good
 131+MemCachedClient::forget_dead_hosts();
 132+
 133+// When a function returns FALSE, an error code is set.
 134+// This funtion will return the error code.
 135+// See error_string()
 136+// returns last error code set
 137+MemCachedClient::error()
 138+
 139+// Returns a string describing the error set in error()
 140+// See error()
 141+// returns a string describing the error code given
 142+MemCachedClient::error_string()
 143+
 144+// Resets the error number and error string
 145+MemCachedClient::error_clear()
 146+
 147+Error codes are as follows:
 148+MC_ERR_NOT_ACTIVE // no active servers
 149+MC_ERR_SOCKET_WRITE // socket_write() failed
 150+MC_ERR_SOCKET_READ // socket_read() failed
 151+MC_ERR_SOCKET_CONNECT // failed to connect to host
 152+MC_ERR_DELETE // delete() did not recieve DELETED command
 153+MC_ERR_HOST_FORMAT // sock_to_host() invalid host format
 154+MC_ERR_HOST_DEAD // sock_to_host() host is dead
 155+MC_ERR_GET_SOCK // get_sock() failed to find a valid socket
 156+MC_ERR_SET // _set() failed to receive the STORED response
 157+MC_ERR_LOADITEM_HEADER // _load_items failed to receive valid data header
 158+MC_ERR_LOADITEM_END // _load_items failed to receive END response
 159+MC_ERR_LOADITEM_BYTES // _load_items bytes read larger than bytes available
 160+MC_ERR_GET // failed to get value associated with key
 161+
 162+// Turns compression on or off; 0=off, 1=on
 163+MemCacheClient::set_compression($setting)
 164+
 165+EXAMPLE:
 166+<?php
 167+require("MemCachedClient.inc.php");
 168+
 169+// set the servers, with the last one having an interger weight value of 3
 170+$options["servers"] = array("10.0.0.15:11000","10.0.0.16:11001",array("10.0.0.17:11002", 3));
 171+$options["debug"] = false;
 172+
 173+$memc = new MemCachedClient($options);
 174+
 175+
 176+/***********************
 177+ * STORE AN ARRAY
 178+ ***********************/
 179+$myarr = array("one","two", 3);
 180+$memc->set("key_one", $myarr);
 181+$val = $memc->get("key_one");
 182+print $val[0]."\n"; // prints 'one'
 183+print $val[1]."\n"; // prints 'two'
 184+print $val[2]."\n"; // prints 3
 185+
 186+
 187+print "\n";
 188+
 189+
 190+/***********************
 191+ * STORE A CLASS
 192+ ***********************/
 193+class tester
 194+{
 195+ var $one;
 196+ var $two;
 197+ var $three;
 198+}
 199+
 200+$t = new tester;
 201+$t->one = "one";
 202+$t->two = "two";
 203+$t->three = 3;
 204+$memc->set("key_two", $t);
 205+$val = $memc->get("key_two");
 206+print $val->one."\n";
 207+print $val->two."\n";
 208+print $val->three."\n";
 209+
 210+
 211+print "\n";
 212+
 213+
 214+/***********************
 215+ * STORE A STRING
 216+ ***********************/
 217+$memc->set("key_three", "my string");
 218+$val = $memc->get("key_three");
 219+print $val; // prints 'my string'
 220+
 221+$memc->delete("key_one");
 222+$memc->delete("key_two");
 223+$memc->delete("key_three");
 224+
 225+$memc->disconnect_all();
 226+
 227+
 228+
 229+print "\n";
 230+
 231+
 232+/***********************
 233+ * STORE A BINARY FILE
 234+ ***********************/
 235+
 236+ // first read the file and save it in memcache
 237+$fp = fopen( "./image.jpg", "rb" ) ;
 238+if ( !$fp )
 239+{
 240+ print "Could not open ./file.dat!\n" ;
 241+ exit ;
 242+}
 243+$data = fread( $fp, filesize( "./image.jpg" ) ) ;
 244+fclose( $fp ) ;
 245+print "Data length is " . strlen( $data ) . "\n" ;
 246+$memc->set( "key", $data ) ;
 247+
 248+// now open a file for writing and write the data
 249+// retrieved from memcache
 250+$fp = fopen("./test.jpg","wb");
 251+$data = $memc->get( "key" ) ;
 252+print "Data length is " . strlen( $data ) . "\n" ;
 253+fwrite($fp,$data,strlen( $data ));
 254+fclose($fp);
 255+
 256+
 257+?>
 258+
 259+
Property changes on: branches/stable/phase3/docs/php-memcached/Documentation
___________________________________________________________________
Name: svn:keywords
1260 + Author Date Id Revision
Name: svn:eol-style
2261 + native
Index: branches/stable/phase3/includes/MemCachedClient.inc.php
@@ -0,0 +1,1143 @@
 2+<?php
 3+/*
 4+ * MemCached PHP client
 5+ * Copyright (c) 2003
 6+ * Ryan Gilfether <hotrodder@rocketmail.com>
 7+ * http://www.gilfether.com
 8+ *
 9+ * Originally translated from Brad Fitzpatrick's <brad@danga.com> MemCached Perl client
 10+ * See the memcached website:
 11+ * http://www.danga.com/memcached/
 12+ *
 13+ * This module is Copyright (c) 2003 Ryan Gilfether.
 14+ * All rights reserved.
 15+ * You may distribute under the terms of the GNU General Public License
 16+ * This is free software. IT COMES WITHOUT WARRANTY OF ANY KIND.
 17+ *
 18+ */
 19+
 20+/**
 21+ * version string
 22+ */
 23+define("MC_VERSION", "1.0.10");
 24+/**
 25+ * int, buffer size used for sending and receiving
 26+ * data from sockets
 27+ */
 28+define("MC_BUFFER_SZ", 1024);
 29+/**
 30+ * MemCached error numbers
 31+ */
 32+define("MC_ERR_NOT_ACTIVE", 1001); // no active servers
 33+define("MC_ERR_SOCKET_WRITE", 1002); // socket_write() failed
 34+define("MC_ERR_SOCKET_READ", 1003); // socket_read() failed
 35+define("MC_ERR_SOCKET_CONNECT", 1004); // failed to connect to host
 36+define("MC_ERR_DELETE", 1005); // delete() did not recieve DELETED command
 37+define("MC_ERR_HOST_FORMAT", 1006); // sock_to_host() invalid host format
 38+define("MC_ERR_HOST_DEAD", 1007); // sock_to_host() host is dead
 39+define("MC_ERR_GET_SOCK", 1008); // get_sock() failed to find a valid socket
 40+define("MC_ERR_SET", 1009); // _set() failed to receive the STORED response
 41+define("MC_ERR_GET_KEY", 1010); // _load_items no values returned for key(s)
 42+define("MC_ERR_LOADITEM_END", 1011); // _load_items failed to receive END response
 43+define("MC_ERR_LOADITEM_BYTES", 1012); // _load_items bytes read larger than bytes available
 44+
 45+
 46+/**
 47+ * MemCached PHP client Class.
 48+ *
 49+ * Communicates with the MemCached server, and executes the MemCached protocol
 50+ * MemCached available at http://www.danga.com/memcached
 51+ *
 52+ * @author Ryan Gilfether <ryan@gilfether.com>
 53+ * @package MemCachedClient
 54+ * @access public
 55+ * @version 1.0.10
 56+ */
 57+class MemCachedClient
 58+{
 59+ /**
 60+ * array of servers no long available
 61+ * @var array
 62+ */
 63+ var $host_dead;
 64+ /**
 65+ * array of open sockets
 66+ * @var array
 67+ */
 68+ var $cache_sock;
 69+ /**
 70+ * determine if debugging is either on or off
 71+ * @var bool
 72+ */
 73+ var $debug;
 74+ /**
 75+ * array of servers to attempt to use, "host:port" string format
 76+ * @var array
 77+ */
 78+ var $servers;
 79+ /**
 80+ * count of currently active connections to servers
 81+ * @var int
 82+ */
 83+ var $active;
 84+ /**
 85+ * error code if one is set
 86+ * @var int
 87+ */
 88+ var $errno;
 89+ /**
 90+ * string describing error
 91+ * @var string
 92+ */
 93+ var $errstr;
 94+ /**
 95+ * size of val to force compression; 0 turns off; defaults 1
 96+ * @ var int
 97+ */
 98+ var $compress = 1;
 99+ /**
 100+ * temp flag to turn compression on/off; defaults on
 101+ * @ var int
 102+ */
 103+ var $comp_active = 1;
 104+
 105+ /**
 106+ * array that contains parsed out buckets
 107+ * @ var array
 108+ */
 109+ var $bucket;
 110+
 111+
 112+ /**
 113+ * Constructor
 114+ *
 115+ * Creates a new MemCachedClient object
 116+ * Takes one parameter, a array of options. The most important key is
 117+ * $options["servers"], but that can also be set later with the set_servers()
 118+ * method. The servers must be an array of hosts, each of which is
 119+ * either a scalar of the form <10.0.0.10:11211> or an array of the
 120+ * former and an integer weight value. (the default weight if
 121+ * unspecified is 1.) It's recommended that weight values be kept as low
 122+ * as possible, as this module currently allocates memory for bucket
 123+ * distribution proportional to the total host weights.
 124+ * $options["debug"] turns the debugging on if set to true
 125+ *
 126+ * @access public
 127+ * @param array $option an array of servers and debug status
 128+ * @return object MemCachedClient the new MemCachedClient object
 129+ */
 130+ function MemCachedClient($options = 0)
 131+ {
 132+ if(is_array($options))
 133+ {
 134+ $this->set_servers($options["servers"]);
 135+ $this->debug = $options["debug"];
 136+ $this->compress = $options["compress"];
 137+ $this->cache_sock = array();
 138+ }
 139+
 140+ $this->errno = 0;
 141+ $this->errstr = "";
 142+ }
 143+
 144+
 145+ /**
 146+ * sets up the list of servers and the ports to connect to
 147+ * takes an array of servers in the same format as in the constructor
 148+ *
 149+ * @access public
 150+ * @param array $servers array of servers in the format described in the constructor
 151+ */
 152+ function set_servers($servers)
 153+ {
 154+ $this->servers = $servers;
 155+ $this->active = count($this->servers);
 156+ }
 157+
 158+
 159+ /**
 160+ * if $do_debug is set to true, will print out
 161+ * debugging info, else debug is turned off
 162+ *
 163+ * @access public
 164+ * @param bool $do_debug set to true to turn debugging on, false to turn off
 165+ */
 166+ function set_debug($do_debug)
 167+ {
 168+ $this->debug = $do_debug;
 169+ }
 170+
 171+
 172+ /**
 173+ * remove all cached hosts that are no longer good
 174+ *
 175+ * @access public
 176+ */
 177+ function forget_dead_hosts()
 178+ {
 179+ unset($this->host_dead);
 180+ }
 181+
 182+
 183+ /**
 184+ * disconnects from all servers
 185+ *
 186+ * @access public
 187+ */
 188+ function disconnect_all()
 189+ {
 190+ foreach($this->cache_sock as $sock)
 191+ socket_close($sock);
 192+
 193+ unset($this->cache_sock);
 194+ $this->active = 0;
 195+ }
 196+
 197+
 198+ /**
 199+ * removes the key from the MemCache
 200+ * $time is the amount of time in seconds (or Unix time) until which
 201+ * the client wishes the server to refuse "add" and "replace" commands
 202+ * with this key. For this amount of item, the item is put into a
 203+ * delete queue, which means that it won't possible to retrieve it by
 204+ * the "get" command, but "add" and "replace" command with this key
 205+ * will also fail (the "set" command will succeed, however). After the
 206+ * time passes, the item is finally deleted from server memory.
 207+ * The parameter $time is optional, and, if absent, defaults to 0
 208+ * (which means that the item will be deleted immediately and further
 209+ * storage commands with this key will succeed).
 210+ * Possible errors set are:
 211+ * MC_ERR_NOT_ACTIVE
 212+ * MC_ERR_GET_SOCK
 213+ * MC_ERR_SOCKET_WRITE
 214+ * MC_ERR_SOCKET_READ
 215+ * MC_ERR_DELETE
 216+ *
 217+ * @access public
 218+ * @param string $key the key to delete
 219+ * @param timestamp $time optional, the amount of time server will refuse commands on key
 220+ * @return bool TRUE on success, FALSE if key does not exist
 221+ */
 222+ function delete($key, $time = 0)
 223+ {
 224+ if(!$this->active)
 225+ {
 226+ $this->errno = MC_ERR_NOT_ACTIVE;
 227+ $this->errstr = "No active servers are available";
 228+
 229+ if($this->debug)
 230+ $this->_debug("delete(): There are no active servers available.");
 231+
 232+ return FALSE;
 233+ }
 234+
 235+ $sock = $this->get_sock($key);
 236+
 237+ if(!is_resource($sock))
 238+ {
 239+ $this->errno = MC_ERR_GET_SOCK;
 240+ $this->errstr = "Unable to retrieve a valid socket.";
 241+
 242+ if($this->debug)
 243+ $this->_debug("delete(): get_sock() returned an invalid socket.");
 244+
 245+ return FALSE;
 246+ }
 247+
 248+ if(is_array($key))
 249+ $key = $key[1];
 250+
 251+ $cmd = "delete $key $time\r\n";
 252+ $cmd_len = strlen($cmd);
 253+ $offset = 0;
 254+
 255+ // now send the command
 256+ while($offset < $cmd_len)
 257+ {
 258+ $result = socket_write($sock, substr($cmd, $offset, MC_BUFFER_SZ), MC_BUFFER_SZ);
 259+
 260+ if($result !== FALSE)
 261+ $offset += $result;
 262+ else if($offset < $cmd_len)
 263+ {
 264+ $this->errno = MC_ERR_SOCKET_WRITE;
 265+ $this->errstr = "Failed to write to socket.";
 266+
 267+ if($this->debug)
 268+ {
 269+ $sockerr = socket_last_error($sock);
 270+ $this->_debug("delete(): socket_write() returned FALSE. Socket Error $sockerr: ".socket_strerror($sockerr));
 271+ }
 272+
 273+ return FALSE;
 274+ }
 275+ }
 276+
 277+ // now read the server's response
 278+ if(($retval = socket_read($sock, MC_BUFFER_SZ, PHP_NORMAL_READ)) === FALSE)
 279+ {
 280+ $this->errno = MC_ERR_SOCKET_READ;
 281+ $this->errstr = "Failed to read from socket.";
 282+
 283+ if($this->debug)
 284+ {
 285+ $sockerr = socket_last_error($sock);
 286+ $this->_debug("delete(): socket_read() returned FALSE. Socket Error $sockerr: ".socket_strerror($sockerr));
 287+ }
 288+
 289+ return FALSE;
 290+ }
 291+
 292+ // remove the \r\n from the end
 293+ $retval = rtrim($retval);
 294+
 295+ // now read the server's response
 296+ if($retval == "DELETED")
 297+ return TRUE;
 298+ else
 299+ {
 300+ // something went wrong, create the error
 301+ $this->errno = MC_ERR_DELETE;
 302+ $this->errstr = "Failed to receive DELETED response from server.";
 303+
 304+ if($this->debug)
 305+ $this->_debug("delete(): Failed to receive DELETED response from server. Received $retval instead.");
 306+
 307+ return FALSE;
 308+ }
 309+ }
 310+
 311+
 312+ /**
 313+ * Like set(), but only stores in memcache if the key doesn't already exist.
 314+ * Possible errors set are:
 315+ * MC_ERR_NOT_ACTIVE
 316+ * MC_ERR_GET_SOCK
 317+ * MC_ERR_SOCKET_WRITE
 318+ * MC_ERR_SOCKET_READ
 319+ * MC_ERR_SET
 320+ *
 321+ * @access public
 322+ * @param string $key the key to set
 323+ * @param mixed $val the value of the key
 324+ * @param timestamp $exptime optional, the to to live of the key
 325+ * @return bool TRUE on success, else FALSE
 326+ */
 327+ function add($key, $val, $exptime = 0)
 328+ {
 329+ return $this->_set("add", $key, $val, $exptime);
 330+ }
 331+
 332+
 333+ /**
 334+ * Like set(), but only stores in memcache if the key already exists.
 335+ * returns TRUE on success else FALSE
 336+ * Possible errors set are:
 337+ * MC_ERR_NOT_ACTIVE
 338+ * MC_ERR_GET_SOCK
 339+ * MC_ERR_SOCKET_WRITE
 340+ * MC_ERR_SOCKET_READ
 341+ * MC_ERR_SET
 342+ *
 343+ * @access public
 344+ * @param string $key the key to set
 345+ * @param mixed $val the value of the key
 346+ * @param timestamp $exptime optional, the to to live of the key
 347+ * @return bool TRUE on success, else FALSE
 348+ */
 349+ function replace($key, $val, $exptime = 0)
 350+ {
 351+ return $this->_set("replace", $key, $val, $exptime);
 352+ }
 353+
 354+
 355+ /**
 356+ * Unconditionally sets a key to a given value in the memcache. Returns true
 357+ * if it was stored successfully.
 358+ * The $key can optionally be an arrayref, with the first element being the
 359+ * hash value, as described above.
 360+ * Possible errors set are:
 361+ * MC_ERR_NOT_ACTIVE
 362+ * MC_ERR_GET_SOCK
 363+ * MC_ERR_SOCKET_WRITE
 364+ * MC_ERR_SOCKET_READ
 365+ * MC_ERR_SET
 366+ *
 367+ * @access public
 368+ * @param string $key the key to set
 369+ * @param mixed $val the value of the key
 370+ * @param timestamp $exptime optional, the to to live of the key
 371+ * @return bool TRUE on success, else FALSE
 372+ */
 373+ function set($key, $val, $exptime = 0)
 374+ {
 375+ return $this->_set("set", $key, $val, $exptime);
 376+ }
 377+
 378+
 379+ /**
 380+ * Retrieves a key from the memcache. Returns the value (automatically
 381+ * unserialized, if necessary) or FALSE if it fails.
 382+ * The $key can optionally be an array, with the first element being the
 383+ * hash value, if you want to avoid making this module calculate a hash
 384+ * value. You may prefer, for example, to keep all of a given user's
 385+ * objects on the same memcache server, so you could use the user's
 386+ * unique id as the hash value.
 387+ * Possible errors set are:
 388+ * MC_ERR_GET_KEY
 389+ *
 390+ * @access public
 391+ * @param string $key the key to retrieve
 392+ * @return mixed the value of the key, FALSE on error
 393+ */
 394+ function get($key)
 395+ {
 396+ $val =& $this->get_multi($key);
 397+
 398+ if(!$val)
 399+ {
 400+ $this->errno = MC_ERR_GET_KEY;
 401+ $this->errstr = "No value found for key $key";
 402+
 403+ if($this->debug)
 404+ $this->_debug("get(): No value found for key $key");
 405+
 406+ return FALSE;
 407+ }
 408+
 409+ return $val[$key];
 410+ }
 411+
 412+
 413+ /**
 414+ * just like get(), but takes an array of keys, returns FALSE on error
 415+ * Possible errors set are:
 416+ * MC_ERR_NOT_ACTIVE
 417+ *
 418+ * @access public
 419+ * @param array $keys the keys to retrieve
 420+ * @return array the value of each key, FALSE on error
 421+ */
 422+ function get_multi($keys)
 423+ {
 424+ $sock_keys = array();
 425+ $socks = array();
 426+ $val = 0;
 427+
 428+ if(!$this->active)
 429+ {
 430+ $this->errno = MC_ERR_NOT_ACTIVE;
 431+ $this->errstr = "No active servers are available";
 432+
 433+ if($this->debug)
 434+ $this->_debug("get_multi(): There are no active servers available.");
 435+
 436+ return FALSE;
 437+ }
 438+
 439+ if(!is_array($keys))
 440+ {
 441+ $arr[] = $keys;
 442+ $keys = $arr;
 443+ }
 444+
 445+ foreach($keys as $k)
 446+ {
 447+ $sock = $this->get_sock($k);
 448+
 449+ if($sock)
 450+ {
 451+ $k = is_array($k) ? $k[1] : $k;
 452+
 453+ if(@!is_array($sock_keys[$sock]))
 454+ $sock_keys[$sock] = array();
 455+
 456+ // if $sock_keys[$sock] doesn't exist, create it
 457+ if(!$sock_keys[$sock])
 458+ $socks[] = $sock;
 459+
 460+ $sock_keys[$sock][] = $k;
 461+ }
 462+ }
 463+
 464+ if(!is_array($socks))
 465+ {
 466+ $arr[] = $socks;
 467+ $socks = $arr;
 468+ }
 469+
 470+ foreach($socks as $s)
 471+ {
 472+ $this->_load_items($s, $val, $sock_keys[$sock]);
 473+ }
 474+
 475+ if($this->debug)
 476+ {
 477+ while(list($k, $v) = @each($val))
 478+ $this->_debug("MemCache: got $k = $v\n");
 479+ }
 480+
 481+ return $val;
 482+ }
 483+
 484+
 485+ /**
 486+ * Sends a command to the server to atomically increment the value for
 487+ * $key by $value, or by 1 if $value is undefined. Returns FALSE if $key
 488+ * doesn't exist on server, otherwise it returns the new value after
 489+ * incrementing. Value should be zero or greater. Overflow on server
 490+ * is not checked. Be aware of values approaching 2**32. See decr.
 491+ * ONLY WORKS WITH NUMERIC VALUES
 492+ * Possible errors set are:
 493+ * MC_ERR_NOT_ACTIVE
 494+ * MC_ERR_GET_SOCK
 495+ * MC_ERR_SOCKET_WRITE
 496+ * MC_ERR_SOCKET_READ
 497+ *
 498+ * @access public
 499+ * @param string $key the keys to increment
 500+ * @param int $value the amount to increment the key bye
 501+ * @return int the new value of the key, else FALSE
 502+ */
 503+ function incr($key, $value = 1)
 504+ {
 505+ return $this->_incrdecr("incr", $key, $value);
 506+ }
 507+
 508+
 509+ /**
 510+ * Like incr, but decrements. Unlike incr, underflow is checked and new
 511+ * values are capped at 0. If server value is 1, a decrement of 2
 512+ * returns 0, not -1.
 513+ * ONLY WORKS WITH NUMERIC VALUES
 514+ * Possible errors set are:
 515+ * MC_ERR_NOT_ACTIVE
 516+ * MC_ERR_GET_SOCK
 517+ * MC_ERR_SOCKET_WRITE
 518+ * MC_ERR_SOCKET_READ
 519+ *
 520+ * @access public
 521+ * @param string $key the keys to increment
 522+ * @param int $value the amount to increment the key bye
 523+ * @return int the new value of the key, else FALSE
 524+ */
 525+ function decr($key, $value = 1)
 526+ {
 527+ return $this->_incrdecr("decr", $key, $value);
 528+ }
 529+
 530+
 531+ /**
 532+ * When a function returns FALSE, an error code is set.
 533+ * This funtion will return the error code.
 534+ * See error_string()
 535+ *
 536+ * @access public
 537+ * @return int the value of the last error code
 538+ */
 539+ function error()
 540+ {
 541+ return $this->errno;
 542+ }
 543+
 544+
 545+ /**
 546+ * Returns a string describing the error set in error()
 547+ * See error()
 548+ *
 549+ * @access public
 550+ * @return int a string describing the error code given
 551+ */
 552+ function error_string()
 553+ {
 554+ return $this->errstr;
 555+ }
 556+
 557+
 558+ /**
 559+ * Resets the error number and error string
 560+ *
 561+ * @access public
 562+ */
 563+ function error_clear()
 564+ {
 565+ // reset to no error
 566+ $this->errno = 0;
 567+ $this->errstr = "";
 568+ }
 569+
 570+
 571+ /**
 572+ * temporarily sets compression on or off
 573+ * turning it off, and then back on will result in the compression threshold going
 574+ * back to the original setting from $options
 575+ * @param int $setting setting of compression (0=off|1=on)
 576+ */
 577+
 578+ function set_compression($setting=1) {
 579+ if ($setting != 0) {
 580+ $this->comp_active = 1;
 581+ } else {
 582+ $this->comp_active = 0;
 583+ }
 584+ }
 585+
 586+
 587+
 588+ /*
 589+ * PRIVATE FUNCTIONS
 590+ */
 591+
 592+
 593+ /**
 594+ * connects to a server
 595+ * The $host may either a string int the form of host:port or an array of the
 596+ * former and an integer weight value. (the default weight if
 597+ * unspecified is 1.) See the constructor for details
 598+ * Possible errors set are:
 599+ * MC_ERR_HOST_FORMAT
 600+ * MC_ERR_HOST_DEAD
 601+ * MC_ERR_SOCKET_CONNECT
 602+ *
 603+ * @access private
 604+ * @param mixed $host either an array or a string
 605+ * @return resource the socket of the new connection, else FALSE
 606+ */
 607+ function sock_to_host($host)
 608+ {
 609+ if(is_array($host))
 610+ $host = array_shift($host);
 611+
 612+ $now = time();
 613+
 614+ // seperate the ip from the port, index 0 = ip, index 1 = port
 615+ $conn = explode(":", $host);
 616+ if(count($conn) != 2)
 617+ {
 618+ $this->errno = MC_ERR_HOST_FORMAT;
 619+ $this->errstr = "Host address was not in the format of host:port";
 620+
 621+ if($this->debug)
 622+ $this->_debug("sock_to_host(): Host address was not in the format of host:port");
 623+
 624+ return FALSE;
 625+ }
 626+
 627+ if(@($this->host_dead[$host] && $this->host_dead[$host] > $now) ||
 628+ @($this->host_dead[$conn[0]] && $this->host_dead[$conn[0]] > $now))
 629+ {
 630+ $this->errno = MC_ERR_HOST_DEAD;
 631+ $this->errstr = "Host $host is not available.";
 632+
 633+ if($this->debug)
 634+ $this->_debug("sock_to_host(): Host $host is not available.");
 635+
 636+ return FALSE;
 637+ }
 638+
 639+ // connect to the server, if it fails, add it to the host_dead below
 640+ $sock = socket_create (AF_INET, SOCK_STREAM, getprotobyname("TCP"));
 641+
 642+ // we need surpress the error message if a connection fails
 643+ if(!@socket_connect($sock, $conn[0], $conn[1]))
 644+ {
 645+ $this->host_dead[$host]=$this->host_dead[$conn[0]]=$now+60+intval(rand(0, 10));
 646+
 647+ $this->errno = MC_ERR_SOCKET_CONNECT;
 648+ $this->errstr = "Failed to connect to ".$conn[0].":".$conn[1];
 649+
 650+ if($this->debug)
 651+ $this->_debug("sock_to_host(): Failed to connect to ".$conn[0].":".$conn[1]);
 652+
 653+ return FALSE;
 654+ }
 655+
 656+ // success, add to the list of sockets
 657+ $cache_sock[$host] = $sock;
 658+
 659+ return $sock;
 660+ }
 661+
 662+
 663+ /**
 664+ * retrieves the socket associated with a key
 665+ * Possible errors set are:
 666+ * MC_ERR_NOT_ACTIVE
 667+ * MC_ERR_GET_SOCK
 668+ *
 669+ * @access private
 670+ * @param string $key the key to retrieve the socket from
 671+ * @return resource the socket of the connection, else FALSE
 672+ */
 673+ function get_sock($key)
 674+ {
 675+ if(!$this->active)
 676+ {
 677+ $this->errno = MC_ERR_NOT_ACTIVE;
 678+ $this->errstr = "No active servers are available";
 679+
 680+ if($this->debug)
 681+ $this->_debug("get_sock(): There are no active servers available.");
 682+
 683+ return FALSE;
 684+ }
 685+
 686+ $hv = is_array($key) ? intval($key[0]) : $this->_hashfunc($key);
 687+
 688+ if(!$this->buckets)
 689+ {
 690+ $bu = $this->buckets = array();
 691+
 692+ foreach($this->servers as $v)
 693+ {
 694+ if(is_array($v))
 695+ {
 696+ for($i = 1; $i <= $v[1]; ++$i)
 697+ $bu[] = $v[0];
 698+ }
 699+ else
 700+ $bu[] = $v;
 701+ }
 702+
 703+ $this->buckets = $bu;
 704+ }
 705+
 706+ $real_key = is_array($key) ? $key[1] : $key;
 707+ $tries = 0;
 708+ while($tries < 20)
 709+ {
 710+ $host = @$this->buckets[$hv % count($this->buckets)];
 711+ $sock = $this->sock_to_host($host);
 712+
 713+ if(is_resource($sock))
 714+ return $sock;
 715+
 716+ $hv += $this->_hashfunc($tries.$real_key);
 717+ ++$tries;
 718+ }
 719+
 720+ $this->errno = MC_ERR_GET_SOCK;
 721+ $this->errstr = "Unable to retrieve a valid socket.";
 722+
 723+ if($this->debug)
 724+ $this->_debug("get_sock(): Unable to retrieve a valid socket.");
 725+
 726+ return FALSE;
 727+ }
 728+
 729+
 730+ /**
 731+ * increments or decrements a numerical value in memcached. this function is
 732+ * called from incr() and decr()
 733+ * ONLY WORKS WITH NUMERIC VALUES
 734+ * Possible errors set are:
 735+ * MC_ERR_NOT_ACTIVE
 736+ * MC_ERR_GET_SOCK
 737+ * MC_ERR_SOCKET_WRITE
 738+ * MC_ERR_SOCKET_READ
 739+ *
 740+ * @access private
 741+ * @param string $cmdname the command to send, either incr or decr
 742+ * @param string $key the key to perform the command on
 743+ * @param mixed $value the value to incr or decr the key value by
 744+ * @return int the new value of the key, FALSE if something went wrong
 745+ */
 746+ function _incrdecr($cmdname, $key, $value)
 747+ {
 748+ if(!$this->active)
 749+ {
 750+ $this->errno = MC_ERR_NOT_ACTIVE;
 751+ $this->errstr = "No active servers are available";
 752+
 753+ if($this->debug)
 754+ $this->_debug("_incrdecr(): There are no active servers available.");
 755+
 756+ return FALSE;
 757+ }
 758+
 759+ $sock = $this->get_sock($key);
 760+ if(!is_resource($sock))
 761+ {
 762+ $this->errno = MC_ERR_GET_SOCK;
 763+ $this->errstr = "Unable to retrieve a valid socket.";
 764+
 765+ if($this->debug)
 766+ $this->_debug("_incrdecr(): Invalid socket returned by get_sock().");
 767+
 768+ return FALSE;
 769+ }
 770+
 771+ if($value == "")
 772+ $value = 1;
 773+
 774+ $cmd = "$cmdname $key $value\r\n";
 775+ $cmd_len = strlen($cmd);
 776+ $offset = 0;
 777+
 778+ // write the command to the server
 779+ while($offset < $cmd_len)
 780+ {
 781+ $result = socket_write($sock, substr($cmd, $offset, MC_BUFFER_SZ), MC_BUFFER_SZ);
 782+
 783+ if($result !== FALSE)
 784+ $offset += $result;
 785+ else if($offset < $cmd_len)
 786+ {
 787+ $this->errno = MC_ERR_SOCKET_WRITE;
 788+ $this->errstr = "Failed to write to socket.";
 789+
 790+ if($this->debug)
 791+ {
 792+ $sockerr = socket_last_error($sock);
 793+ $this->_debug("_incrdecr(): socket_write() returned FALSE. Error $errno: ".socket_strerror($sockerr));
 794+ }
 795+
 796+ return FALSE;
 797+ }
 798+ }
 799+
 800+ // now read the server's response
 801+ if(($retval = socket_read($sock, MC_BUFFER_SZ, PHP_NORMAL_READ)) === FALSE)
 802+ {
 803+ $this->errno = MC_ERR_SOCKET_READ;
 804+ $this->errstr = "Failed to read from socket.";
 805+
 806+ if($this->debug)
 807+ {
 808+ $sockerr = socket_last_error($sock);
 809+ $this->_debug("_incrdecr(): socket_read() returned FALSE. Socket Error $errno: ".socket_strerror($sockerr));
 810+ }
 811+
 812+ return FALSE;
 813+ }
 814+
 815+ // strip the /r/n from the end and return value
 816+ return trim($retval);
 817+ }
 818+
 819+ /**
 820+ * sends the command to the server
 821+ * Possible errors set are:
 822+ * MC_ERR_NOT_ACTIVE
 823+ * MC_ERR_GET_SOCK
 824+ * MC_ERR_SOCKET_WRITE
 825+ * MC_ERR_SOCKET_READ
 826+ * MC_ERR_SET
 827+ *
 828+ * @access private
 829+ * @param string $cmdname the command to send, either incr or decr
 830+ * @param string $key the key to perform the command on
 831+ * @param mixed $value the value to set the key to
 832+ * @param timestamp $exptime expiration time of the key
 833+ * @return bool TRUE on success, else FALSE
 834+ */
 835+ function _set($cmdname, $key, $val, $exptime = 0)
 836+ {
 837+ if(!$this->active)
 838+ {
 839+ $this->errno = MC_ERR_NOT_ACTIVE;
 840+ $this->errstr = "No active servers are available";
 841+
 842+ if($this->debug)
 843+ $this->_debug("_set(): No active servers are available.");
 844+
 845+ return FALSE;
 846+ }
 847+
 848+ $sock = $this->get_sock($key);
 849+ if(!is_resource($sock))
 850+ {
 851+ $this->errno = MC_ERR_GET_SOCK;
 852+ $this->errstr = "Unable to retrieve a valid socket.";
 853+
 854+ if($this->debug)
 855+ $this->_debug("_set(): Invalid socket returned by get_sock().");
 856+
 857+ return FALSE;
 858+ }
 859+
 860+ $flags = 0;
 861+ $key = is_array($key) ? $key[1] : $key;
 862+
 863+ $raw_val = $val;
 864+
 865+ // if the value is not scalar, we need to serialize it
 866+ if(!is_scalar($val))
 867+ {
 868+ $val = serialize($val);
 869+ $flags |= 1;
 870+ }
 871+
 872+ if (($this->compress_active) && ($this->compress > 0) && (strlen($val) > $this->compress)) {
 873+ $this->_debug("_set(): compressing data. size in:".strlen($val));
 874+ $cval=gzcompress($val);
 875+ $this->_debug("_set(): done compressing data. size out:".strlen($cval));
 876+ if ((strlen($cval) < strlen($val)) && (strlen($val) - strlen($cval) > 2048)){
 877+ $flags |= 2;
 878+ $val=$cval;
 879+ }
 880+ unset($cval);
 881+ }
 882+
 883+ $len = strlen($val);
 884+ if (!is_int($exptime))
 885+ $exptime = 0;
 886+
 887+ // send off the request
 888+ $cmd = "$cmdname $key $flags $exptime $len\r\n$val\r\n";
 889+ $cmd_len = strlen($cmd);
 890+ $offset = 0;
 891+
 892+ // write the command to the server
 893+ while($offset < $cmd_len)
 894+ {
 895+ $result = socket_write($sock, substr($cmd, $offset, MC_BUFFER_SZ), MC_BUFFER_SZ);
 896+
 897+ if($result !== FALSE)
 898+ $offset += $result;
 899+ else if($offset < $cmd_len)
 900+ {
 901+ $this->errno = MC_ERR_SOCKET_WRITE;
 902+ $this->errstr = "Failed to write to socket.";
 903+
 904+ if($this->debug)
 905+ {
 906+ $errno = socket_last_error($sock);
 907+ $this->_debug("_set(): socket_write() returned FALSE. Error $errno: ".socket_strerror($errno));
 908+ }
 909+
 910+ return FALSE;
 911+ }
 912+ }
 913+
 914+ // now read the server's response
 915+ if(($l_szResponse = socket_read($sock, 6, PHP_NORMAL_READ)) === FALSE)
 916+ {
 917+ $this->errno = MC_ERR_SOCKET_READ;
 918+ $this->errstr = "Failed to read from socket.";
 919+
 920+ if($this->debug)
 921+ {
 922+ $errno = socket_last_error($sock);
 923+ $this->_debug("_set(): socket_read() returned FALSE. Error $errno: ".socket_strerror($errno));
 924+ }
 925+
 926+ return FALSE;
 927+ }
 928+
 929+ if($l_szResponse == "STORED")
 930+ {
 931+ if($this->debug)
 932+ $this->_debug("MemCache: $cmdname $key = $raw_val");
 933+
 934+ return TRUE;
 935+ }
 936+
 937+ $this->errno = MC_ERR_SET;
 938+ $this->errstr = "Failed to receive the STORED response from the server.";
 939+
 940+ if($this->debug)
 941+ $this->_debug("_set(): Did not receive STORED as the server response! Received $l_szResponse instead.");
 942+
 943+ return FALSE;
 944+ }
 945+
 946+
 947+ /**
 948+ * retrieves the value, and returns it unserialized
 949+ * Possible errors set are:
 950+ * MC_ERR_SOCKET_WRITE
 951+ * MC_ERR_SOCKET_READ
 952+ * MC_ERR_GET_KEY
 953+ * MC_ERR_LOADITEM_END
 954+ * MC_ERR_LOADITEM_BYTES
 955+ *
 956+ * @access private
 957+ * @param resource $sock the socket to connection we are retriving from
 958+ * @param array $val reference to the values retrieved
 959+ * @param mixed $sock_keys either a string or an array of keys to retrieve
 960+ * @return array TRUE on success, else FALSE
 961+ */
 962+ function _load_items($sock, &$val, $sock_keys)
 963+ {
 964+ $val = array();
 965+ $cmd = "get ";
 966+
 967+ if(!is_array($sock_keys))
 968+ {
 969+ $arr[] = $sock_keys;
 970+ $sock_keys = $arr;
 971+ }
 972+
 973+ foreach($sock_keys as $sk)
 974+ $cmd .= $sk." ";
 975+
 976+ $cmd .="\r\n";
 977+ $cmd_len = strlen($cmd);
 978+ $offset = 0;
 979+
 980+ // write the command to the server
 981+ while($offset < $cmd_len)
 982+ {
 983+ $result = socket_write($sock, substr($cmd, $offset, MC_BUFFER_SZ), MC_BUFFER_SZ);
 984+
 985+ if($result !== FALSE)
 986+ $offset += $result;
 987+ else if($offset < $cmd_len)
 988+ {
 989+ $this->errno = MC_ERR_SOCKET_WRITE;
 990+ $this->errstr = "Failed to write to socket.";
 991+
 992+ if($this->debug)
 993+ {
 994+ $errno = socket_last_error($sock);
 995+ $this->_debug("_load_items(): socket_write() returned FALSE. Error $errno: ".socket_strerror($errno));
 996+ }
 997+
 998+ return FALSE;
 999+ }
 1000+ }
 1001+
 1002+ $len = 0;
 1003+ $buf = "";
 1004+ $flags_array = array();
 1005+
 1006+ // now read the response from the server
 1007+ while($line = socket_read($sock, MC_BUFFER_SZ, PHP_BINARY_READ))
 1008+ {
 1009+ // check for a socket_read error
 1010+ if($line === FALSE)
 1011+ {
 1012+ $this->errno = MC_ERR_SOCKET_READ;
 1013+ $this->errstr = "Failed to read from socket.";
 1014+
 1015+ if($this->debug)
 1016+ {
 1017+ $errno = socket_last_error($sock);
 1018+ $this->_debug("_load_items(): socket_read() returned FALSE. Error $errno: ".socket_strerror($errno));
 1019+ }
 1020+
 1021+ return FALSE;
 1022+ }
 1023+
 1024+ if($len == 0)
 1025+ {
 1026+ $header = substr($line, 0, strpos($line, "\r\n"));
 1027+ $matches = explode(" ", $header);
 1028+
 1029+ if(is_string($matches[1]) && is_numeric($matches[2]) && is_numeric($matches[3]))
 1030+ {
 1031+ $rk = $matches[1];
 1032+ $flags = $matches[2];
 1033+ $len = $matches[3];
 1034+
 1035+ if($flags)
 1036+ $flags_array[$rk] = $flags;
 1037+
 1038+ $len_array[$rk] = $len;
 1039+ $bytes_read = 0;
 1040+
 1041+ // get the left over data after the header is read
 1042+ $line = substr($line, strpos($line, "\r\n")+2, strlen($line));
 1043+ }
 1044+ else
 1045+ {
 1046+ $this->errno = MC_ERR_GET_KEY;
 1047+ $this->errstr = "Requested key(s) returned no values.";
 1048+
 1049+ // something went wrong, we never recieved the header
 1050+ if($this->debug)
 1051+ $this->_debug("_load_items(): Requested key(s) returned no values.");
 1052+
 1053+ return FALSE;
 1054+ }
 1055+ }
 1056+
 1057+ // skip over the extra return or newline
 1058+ if($line == "\r" || $line == "\n")
 1059+ continue;
 1060+
 1061+ $bytes_read += strlen($line);
 1062+ $buf .= $line;
 1063+
 1064+ // we read the all of the data, take in account
 1065+ // for the /r/nEND/r/n
 1066+ if($bytes_read == ($len + 7))
 1067+ {
 1068+ $end = substr($buf, $len+2, 3);
 1069+ if($end == "END")
 1070+ {
 1071+ $val[$rk] = substr($buf, 0, $len);
 1072+
 1073+ foreach($sock_keys as $sk)
 1074+ {
 1075+ if(!isset($val[$sk]))
 1076+ continue;
 1077+
 1078+ if(strlen($val[$sk]) != $len_array[$sk])
 1079+ continue;
 1080+ if(@$flags_array[$sk] & 2)
 1081+ $val[$sk] = gzuncompress($val[$sk]);
 1082+
 1083+ if(@$flags_array[$sk] & 1)
 1084+ $val[$sk] = unserialize($val[$sk]);
 1085+ }
 1086+
 1087+ return TRUE;
 1088+ }
 1089+ else
 1090+ {
 1091+ $this->errno = MC_ERR_LOADITEM_END;
 1092+ $this->errstr = "Failed to receive END response from server.";
 1093+
 1094+ if($this->debug)
 1095+ $this->_debug("_load_items(): Failed to receive END. Received $end instead.");
 1096+
 1097+ return FALSE;
 1098+ }
 1099+ }
 1100+
 1101+ // take in consideration for the "\r\nEND\r\n"
 1102+ if($bytes_read > ($len + 7))
 1103+ {
 1104+ $this->errno = MC_ERR_LOADITEM_BYTES;
 1105+ $this->errstr = "Bytes read from server greater than size of data.";
 1106+
 1107+ if($this->debug)
 1108+ $this->_debug("_load_items(): Bytes read is greater than requested data size.");
 1109+
 1110+ return FALSE;
 1111+ }
 1112+
 1113+ }
 1114+ }
 1115+
 1116+
 1117+ /**
 1118+ * creates our hash
 1119+ *
 1120+ * @access private
 1121+ * @param int $num
 1122+ * @return hash
 1123+ */
 1124+ function _hashfunc($num)
 1125+ {
 1126+ $hash = sprintf("%u",crc32($num));
 1127+
 1128+ return $hash;
 1129+ }
 1130+
 1131+ /**
 1132+ * function that can be overridden to handle debug output
 1133+ * by default debug info is print to the screen
 1134+ *
 1135+ * @access private
 1136+ * @param $text string to output debug info
 1137+ */
 1138+ function _debug($text)
 1139+ {
 1140+ print $text . "\r\n";
 1141+ }
 1142+}
 1143+
 1144+?>
\ No newline at end of file
Property changes on: branches/stable/phase3/includes/MemCachedClient.inc.php
___________________________________________________________________
Name: svn:eol-style
11145 + native
Name: svn:keywords
21146 + Author Date Id Revision
Index: branches/stable/phase3/languages/LanguageRo.php
@@ -0,0 +1,1026 @@
 2+<?
 3+
 4+include_once("Utf8Case.php");
 5+
 6+# NOTE: To turn off "Current Events" in the sidebar,
 7+# set "currentevents" => "-"
 8+
 9+# The names of the namespaces can be set here, but the numbers
 10+# are magical, so don't change or move them! The Namespace class
 11+# encapsulates some of the magic-ness.
 12+#
 13+/* private */ $wgNamespaceNamesRo = array(
 14+ -1 => "Special",
 15+ 0 => "",
 16+ 1 => "Discuţie",
 17+ 2 => "Utilizator",
 18+ 3 => "Discuţie_Utilizator",
 19+ 4 => "Wikipedia",
 20+ 5 => "Discuţie_Wikipedia",
 21+ 6 => "Imagine",
 22+ 7 => "Discuţie_Imagine"
 23+);
 24+
 25+/* private */ $wgQuickbarSettingsRo = array(
 26+ "Fără", "Fixă, în stânga", "Fixă, în dreapta", "Liberă"
 27+);
 28+
 29+/* private */ $wgSkinNamesRo = array(
 30+ "Normală", "Nostalgie", "Cologne Blue"
 31+);
 32+
 33+/* private */ $wgMathNamesRo = array(
 34+ "Întotdeauna PNG",
 35+ "HTML dacă e foarte simplu sau PNG altfel",
 36+ "HTML dacă e posibil sau PNG altfel",
 37+ "Lasă-l TeX (pentru browsere text)",
 38+ "Recomandat pentru browsere moderne"
 39+);
 40+
 41+/* private */ $wgDateFormatsRo = array(
 42+ "Nici o preferinţă",
 43+ "Ianuarie 15, 2001",
 44+ "15 Ianuarie 2001",
 45+ "2001 Ianuarie 15"
 46+);
 47+
 48+/* private */ $wgUserTogglesRo = array(
 49+ "hover" => "Arată info deasupra legăturilor",
 50+ "underline" => "Subliniază legăturile",
 51+ "highlightbroken" => "Formatează legăturile inexistente <a href=\"\" class=\"new\">în felul acesta</a> (alternativa este aşa<a href=\"\" class=\"internal\">?</a>).",
 52+ "justify" => "Aliniază paragrafele",
 53+ "hideminor" => "Ascunde schimbările minore în pagina de schimbări recente",
 54+ "usenewrc" => "Îmbunătăţeşte structura paginii de schimbări minore<br>(nu merge în toate browserele)",
 55+ "numberheadings" => "Auto-numerotează titlurile",
 56+ "editondblclick" => "Editează paginile cu dublu clic (JavaScript)",
 57+ "editsection" => "Permite editarea secţiunilor folosind legături [editează] pe pagină",
 58+ "editsectiononrightclick"=>"Permite editarea secţiunilor la apăsarea<br>butonului din dreapta al mouse-ului pe titlu<br>(necesită JavaScript)",
 59+ "showtoc" => "Arată cuprinsul paginilor<br>(pentru pagini cu cel puţin trei titluri)",
 60+ "rememberpassword" => "Păstrează parola între sesiuni",
 61+ "editwidth" => "Lăţime maximă pentru caseta de editare",
 62+ "watchdefault" => "Urmăreşte articolele pe care le creezi sau le editezi",
 63+ "minordefault" => "Marchează implicit toate editările ca minore",
 64+ "previewontop" => "Arată pagina după caseta de editare, nu înainte",
 65+ "nocache" => "Nu folosi cache (conexiunea merge mai greu,<br>dar sunt afişate toate modificările paginilor)"
 66+
 67+);
 68+
 69+/* private */ $wgBookstoreListRo = array(
 70+ "AddALL" => "http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN",
 71+ "PriceSCAN" => "http://www.pricescan.com/books/bookDetail.asp?isbn=$1",
 72+ "Barnes & Noble" => "http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1",
 73+ "Amazon.com" => "http://www.amazon.com/exec/obidos/ISBN=$1"
 74+);
 75+
 76+/* private */ $wgWeekdayNamesRo = array(
 77+ "Duminică", "Luni", "Marţi", "Miercuri", "Joi",
 78+ "Vineri", "Sâmbătă"
 79+);
 80+
 81+/* private */ $wgMonthNamesRo = array(
 82+ "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie",
 83+ "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie",
 84+ "Decembrie"
 85+);
 86+
 87+/* private */ $wgMonthAbbreviationsRo = array(
 88+ "Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug",
 89+ "Sep", "Oct", "Noi", "Dec"
 90+);
 91+
 92+# All special pages have to be listed here: a description of ""
 93+# will make them not show up on the "Special Pages" page, which
 94+# is the right thing for some of them (such as the "targeted" ones).
 95+#
 96+/* private */ $wgValidSpecialPagesRo = array(
 97+ "Userlogin" => "",
 98+ "Userlogout" => "",
 99+ "Preferences" => "Preferinţele mele",
 100+ "Watchlist" => "Articole urmărite",
 101+ "Recentchanges" => "Pagini actualizate recent",
 102+ "Upload" => "Trimite imagini",
 103+ "Imagelist" => "Lista imaginilor",
 104+ "Listusers" => "Utilizatori înregistraţi",
 105+ "Statistics" => "Statistici pentru site",
 106+ "Randompage" => "Articol aleator",
 107+
 108+ "Lonelypages" => "Articole orfane",
 109+ "Unusedimages" => "Imagini orfane",
 110+ "Popularpages" => "Articole populare",
 111+ "Wantedpages" => "Cele mai dorite articole",
 112+ "Shortpages" => "Articole scurte",
 113+ "Longpages" => "Articole lungi",
 114+ "Newpages" => "Articole noi",
 115+ "Ancientpages" => "Cele mai vechi articole",
 116+ "Intl" => "Legături între limbi",
 117+ "Allpages" => "Toate paginile după titlu",
 118+
 119+ "Ipblocklist" => "Adrese IP blocate",
 120+ "Maintenance" => "Pagina de întreţinere",
 121+ "Specialpages" => "Pagini speciale",
 122+ "Contributions" => "Contribuţii",
 123+ "Emailuser" => "Trimite e-mail utilizatorului",
 124+ "Whatlinkshere" => "Ce pagini se leagă aici",
 125+ "Recentchangeslinked" => "",
 126+ "Movepage" => "Mută pagina",
 127+ "Booksources" => "Surse externe de cărţi",
 128+ "Categories" => "Categorii de pagini"
 129+);
 130+
 131+/* private */ $wgSysopSpecialPagesRo = array(
 132+ "Blockip" => "Blochează adresa IP",
 133+ "Asksql" => "Efectuează un query în baza de date",
 134+ "Undelete" => "Afişează şi restaurează pagini şterse"
 135+);
 136+
 137+/* private */ $wgDeveloperSpecialPagesRo = array(
 138+ "Lockdb" => "Blochează baza de date la scriere",
 139+ "Unlockdb" => "Deblochează baza de date",
 140+ "Debug" => "Informaţie pentru debugging"
 141+);
 142+
 143+/* private */ $wgAllMessagesRo = array(
 144+
 145+# Bits of text used by many pages:
 146+#
 147+"categories" => "Categorii de pagini",
 148+"category" => "categoria",
 149+"category_header" => "Articole din categoria \"$1\"",
 150+"subcategories" => "Subcategorii",
 151+"linktrail" => "/^([a-z]+)(.*)\$/sD",
 152+"mainpage" => "Pagina principală",
 153+"mainpagetext" => "Programul Wiki a fost instalat cu succes",
 154+"about" => "Despre",
 155+"aboutwikipedia" => "Despre Wikipedia",
 156+"aboutpage" => "Wikipedia:Despre",
 157+"help" => "Ajutor",
 158+"helppage" => "Wikipedia:Ajutor",
 159+"wikititlesuffix" => "Wikipedia",
 160+"bugreports" => "Raportare probleme",
 161+"bugreportspage" => "Wikipedia:Rapoarte_probleme",
 162+"faq" => "Întrebări frecvente",
 163+"faqpage" => "Wikipedia:Întrebări_frecvente",
 164+"edithelp" => "Ajutor pentru editare",
 165+"edithelppage" => "Wikipedia:Cum_să_editezi_o_pagină",
 166+"cancel" => "Renunţă",
 167+"qbfind" => "Găseşte",
 168+"qbbrowse" => "Răsfoieşte",
 169+"qbedit" => "Editează",
 170+"qbpageoptions" => "Opţiuni ale paginii",
 171+"qbpageinfo" => "Informaţii ale paginii",
 172+"qbmyoptions" => "Opţiunile mele",
 173+"mypage" => "Pagina mea",
 174+"mytalk" => "Discuţiile mele",
 175+"currentevents" => "Evenimente curente",
 176+"errorpagetitle" => "Eroare",
 177+"returnto" => "Înapoi la $1.",
 178+"fromwikipedia" => "De la Wikipedia, enciclopedia liberă.",
 179+"whatlinkshere" => "Pagini care se leagă aici",
 180+"help" => "Ajutor",
 181+"search" => "Caută",
 182+"go" => "Du-te",
 183+"history" => "Versiuni mai vechi",
 184+"printableversion" => "Versiune tipărire",
 185+"editthispage" => "Editează această pagină",
 186+"deletethispage" => "Şterge pagina",
 187+"protectthispage" => "Protejează pagina",
 188+"unprotectthispage" => "Deprotejează pagina",
 189+"newpage" => "Pagină nouă",
 190+"talkpage" => "Discută pagina",
 191+"postcomment" => "Agaugă comentariu",
 192+"articlepage" => "Vezi articolul",
 193+"subjectpage" => "Vezi subiectul", # For compatibility
 194+"userpage" => "Vezi pagina utilizatorului",
 195+"wikipediapage" => "Vezi pagina meta",
 196+"imagepage" => "Vezi pagina imaginii",
 197+"viewtalkpage" => "Vezi discuţia",
 198+"otherlanguages" => "În alte limbi",
 199+"redirectedfrom" => "(Redirectat de la $1)",
 200+"lastmodified" => "Ultima modificare $1.",
 201+"viewcount" => "Această pagină a fost vizitată de $1 ori.",
 202+"gnunote" => "Tot textul este disponibil în termenii licenţei <a class=internal href='/wiki/GNU_FDL'>GNU Free Documentation License</a>.",
 203+"printsubtitle" => "(De la http://ro.wikipedia.org)",
 204+"protectedpage" => "Pagină protejată",
 205+"administrators" => "Wikipedia:Administratori",
 206+"sysoptitle" => "Aveţi nevoie de acces ca operator",
 207+"sysoptext" => "Acţiunea pe care aţi încercat-o necesită drepturi de operator.
 208+Vezi $1.",
 209+"developertitle" => "Aveţi nevoie de acces ca dezvoltator",
 210+"developertext" => "Acţiunea pe care aţi încercat-o necesită drepturi de dezvoltator.
 211+Vezi $1.",
 212+"nbytes" => "$1 octeţi",
 213+"go" => "Du-te",
 214+"ok" => "OK",
 215+"sitetitle" => "Wikipedia",
 216+"sitesubtitle" => "Enciclopedia liberă",
 217+"retrievedfrom" => "Adus de la \"$1\"",
 218+"newmessages" => "Aveţi $1.",
 219+"newmessageslink" => "mesaje noi",
 220+"editsection"=>"editează",
 221+"toc" => "Cuprins",
 222+"showtoc" => "arată",
 223+"hidetoc" => "ascunde",
 224+
 225+# Main script and global functions
 226+#
 227+"nosuchaction" => "Această acţiune nu există",
 228+"nosuchactiontext" => "Acţiunea specificată în adresă nu este recunoscută de Wikipedia.",
 229+"nosuchspecialpage" => "Această pagină specială nu există",
 230+"nospecialpagetext" => "Aţi cerut o pagină specială care nu este recunoscută de Wikipedia.",
 231+
 232+# General errors
 233+#
 234+"error" => "Eroare",
 235+"databaseerror" => "Eroare la baza de date",
 236+"dberrortext" => "A apărut o eroare în execuţia query-ului.
 237+Aceasta se poate datora unui query ilegal (vezi $5),
 238+sau poate indica o problemă în program.
 239+Ultimul query încercat a fost:
 240+<blockquote><tt>$1</tt></blockquote>
 241+în cadrul funcţiei \"<tt>$2</tt>\".
 242+MySQL a returnat eroarea \"<tt>$3: $4</tt>\".",
 243+"dberrortextcl" => "A aoărut o eroare de sintaxă în query.
 244+Ultimul query încercat a fost:
 245+\"$1\"
 246+din funcţia \"$2\".
 247+MySQL a returnat eroarea \"$3: $4\".\n",
 248+"noconnect" => "Nu s-a putut conecta baza de date pe $1",
 249+"nodb" => "Nu s-a putut selecta baza de date $1",
 250+"cachederror" => "Aceasta este o versiune din cache a paginii cerute şi este posibil să nu fie ultima variantă a acesteia.",
 251+"readonly" => "Baza de date este blocată la scriere",
 252+"enterlockreason" => "Introduceţi motivul pentru blocare, incluzând o estimare a termenului când veţi debloca baza de date",
 253+"readonlytext" => "Baza de date Wikipedia este momentan blocată la scriere, probabil pentru o operaţiune de rutină, după care va fi deblocată şi se va reveni la starea normală.
 254+Administratorul care a blocat-o a oferit această explicaţie:
 255+<p>$1",
 256+"missingarticle" => "Textul \"$1\" nu a putut fi găsit în baza de date, aşa cum ar fi trebuit. Aceasta nu este o problemă legată de programul care gestionează baza de date, ci probabil o problemă in programul care administrează Wikipedia. Vă rugăm să raportaţi această problemă unui administrator, incluzând şi adresa acestei pagini.",
 257+"internalerror" => "Eroare internă",
 258+"filecopyerror" => "Fisierul \"$1\" nu a putut fi copiat la \"$2\".",
 259+"filerenameerror" => "Fişierul \"$1\" nu a putut fi mutat la \"$2\".",
 260+"filedeleteerror" => "Fişierul \"$1\" nu a putut fi şters.",
 261+"filenotfound" => "Fişierul \"$1\" nu a putut fi găsit.",
 262+"unexpected" => "Valoare neaşteptată: \"$1\"=\"$2\".",
 263+"formerror" => "Eroare: datele nu au putut fi trimise",
 264+"badarticleerror" => "Această acţiune nu poate fi efectuată pe această pagină.",
 265+"cannotdelete" => "Nu s-a putut şterge pagina sau imaginea (poate a şters-o altcineva deja?)",
 266+"badtitle" => "Titlu invalid",
 267+"badtitletext" => "Titlul căutat a fost invalid, gol sau o legătură invalidă inter-linguală sau inter-wiki.",
 268+"perfdisabled" => "Ne pare rău! Această funcţionalitate a fost dezactivată temporar în timpul orelor de vârf din motive de performanţă. Vă rugăm să reveniţi la altă oră şi încercaţi din nou.", // Didn't provide any off-peak hours because they may differ on the Romanian Wikipedia.
 269+"perfdisabledsub" => "Iată o copie salvată de la $1:",
 270+
 271+# Login and logout pages
 272+#
 273+"logouttitle" => "Sesiune închisă",
 274+"logouttext" => "Sesiunea Dvs. în Wikipedia a fost închisă.
 275+Puteţi continua să folosiţi Wikipedia anonim, sau puteţi să vă reautentificaţi ca acelaşi sau ca alt utilizator.\n",
 276+"welcomecreation" => "<h2>Bun venit, $1!</h2><p>A fost creat un cont pentru Dvs.
 277+Nu uitaţi să vă personalizaţi preferinţele în Wikipedia.",
 278+"loginpagetitle" => "Autentificare utilizator",
 279+"yourname" => "Numele de utilizator",
 280+"yourpassword" => "Parola",
 281+"yourpasswordagain" => "Repetaţi parola",
 282+"newusersonly" => " (doar pentru utilizatori noi)",
 283+"remembermypassword" => "Reţine-mi parola între sesiuni.",
 284+"loginproblem" => "<b>A fost o problemă cu autentificarea Dvs.</b><br>Încercaţi din nou!",
 285+"alreadyloggedin" => "<font color=red><b>Sunteţi deja autentificat ca $1!</b></font><br>\n",
 286+"areyounew" => "Dacă sunteţi nou în Wikipedia şi doriţi un cont de utilizator, introduceţi un nume de utilizator, apoi scrieţi-vă parola în căsuţa următoare, şi repetaţi-o în a treia pentru confirmare.
 287+Adresa de mail este opţională; dacă vă pierdeţi parola o puteţi cere la adresa de mail pe care o introduceţi.<br>\n",
 288+"notloggedin" => "Nu sunteţi autentificat",
 289+
 290+"login" => "Autentificare",
 291+"userlogin" => "Autentificare",
 292+"logout" => "Închide sesiunea",
 293+"userlogout" => "Închide sesiunea",
 294+"createaccount" => "Creează cont nou",
 295+"createaccountmail" => "după e-mail",
 296+"badretype" => "Parolele pe care le-aţi introdus diferă.",
 297+"userexists" => "Numele de utilizator pe care l-aţi introdus există deja. Încercaţi cu un alt nume.",
 298+"youremail" => "Adresa de mail",
 299+"yournick" => "Versiune scurtă a numelui, pentru semnături",
 300+"emailforlost" => "Dacă vă pierdeţi parola, puteţi cere să vi se trimită una nouă la adresa de mail.",
 301+"loginerror" => "Eroare de autentificare",
 302+"noname" => "Numele de utilizator pe care l-aţi specificat este invalid.",
 303+"loginsuccesstitle" => "Autentificare reuşită",
 304+"loginsuccess" => "Aţi fost autentificat în Wikipedia ca \"$1\".",
 305+"nosuchuser" => "Nu există nici un utilizator cu numele \"$1\".
 306+Verificaţi dacă aţi scris corect sau folosiţi această pagină pentru a crea un nou utilizator.",
 307+"wrongpassword" => "Parola pe care aţi introdus-o este greşită. Vă rugăm încercaţi din nou.",
 308+"mailmypassword" => "Trimiteţi-mi parola pe mail!",
 309+"passwordremindertitle" => "Amintirea parolei pe Wikipedia",
 310+"passwordremindertext" => "Cineva (probabil Dvs., de la adresa $1)
 311+a cerut să vi se trimită o nouă parolă pentru Wikipedia.
 312+Parola pentru utilizatorul \"$2\" este acum \"$3\".
 313+Este recomandat să intraţi pe Wikipedia şi să vă schimbaţi parola cât mai curând.",
 314+"noemail" => "Nu este nici o adresă de mail înregistrată pentru utilizatorul \"$1\".",
 315+"passwordsent" => "O nouă parolă a fost trimisă la adresa de mail a utilizatorului \"$1\".
 316+Vă rugăm să vă autentificaţi pe Wikipedia după ce o primiţi.",
 317+
 318+# Edit pages
 319+#
 320+"summary" => "Sumar",
 321+"subject" => "Subiect/titlu",
 322+"minoredit" => "Aceasta este o editare minoră",
 323+"watchthis" => "Urmăreşte această pagină",
 324+"savearticle" => "Salvează pagina",
 325+"preview" => "Previzualizare",
 326+"showpreview" => "Arată previzualizare",
 327+"blockedtitle" => "Utilizatorul este blocat",
 328+"blockedtext" => "Utilizatorul sau parola Dvs. au fost blocate de $1.
 329+Motivul oferit pentru blocare a fost:<br>''$2''<p>Puteţi contacta pe $1 sau pe unul dintre ceilalţi
 330+[[Wikipedia:administratori|administratori]] pentru a discuta această blocare.",
 331+"whitelistedittitle" => "Este necesară autentificarea pentru a edita",
 332+"whitelistedittext" => "Trebuie să vă [[Special:Userlogin|autentificaţi]] pentru a edita articole.",
 333+"whitelistreadtitle" => "Este necesară autentificarea pentru a citi",
 334+"whitelistreadtext" => "Trebuie să vă [[Special:Userlogin|autentificaţi]] pentru a citi articole.",
 335+"whitelistacctitle" => "Nu aveţi dreptul de a crea conturi",
 336+"whitelistacctext" => "Trebuie să vă [[Special:Userlogin|autentificaţi]] şi să aveţi permisiunile corecte pentru a crea conturi.",
 337+"accmailtitle" => "Parola a fost trimisă.",
 338+"accmailtext" => "Parola pentru '$1' a fost trimisă la $2.",
 339+"newarticle" => "(Nou)",
 340+"newarticletext" =>
 341+"Aţi ajuns la o pagină care nu există.
 342+Pentru a o crea, începeţi să scrieţi în caseta de mai jos
 343+(vezi [[Wikipedia:Ajutor|pagina de ajutor]] pentru mai multe informaţii).
 344+Dacă aţi ajuns aici din greşeală, întoarceţi-vă folosind controalele browser-ului Dvs.",
 345+"anontalkpagetext" => "---- ''Aceasta este pagina de discuţii pentru un utilizator care nu şi-a creat un cont încă, sau care nu s-a autentificat. De aceea trebuie să folosim [[adresa IP]] pentru a identifica această persoană. O adresă IP poate fi împărţită între mai mulţi utilizatori. Dacă sunteţi un astfel de utilizator şi credeţi că vi se adresează mesaje irelevante, vă rugăm să [[Special:Userlogin|vă creaţi un cont sau să vă autentificaţi]] pentru a evita confuzii cu alţi utilizatori anonimi în viitor.'' ",
 346+"noarticletext" => "(Nu există text în această pagină)",
 347+"updated" => "(Actualizat)",
 348+"note" => "<strong>Notă:</strong> ",
 349+"previewnote" => "Reţineţi că aceasta este doar o previzualizare - articolul încă nu este salvat! Trebuie să apăsaţi butonul \"Salvează pagina\" de sub caseta de editare pentru a salva. Nu uitaţi să introduceţi şi o descriere sumară a modificărilor!",
 350+"previewconflict" => "Această pre-vizualizare reflectă textul din caseta de sus, respectiv felul în care va arăta articolul dacă alegeţi să salvaţi acum.",
 351+"editing" => "Editare $1",
 352+"sectionedit" => " (secţiune)",
 353+"commentedit" => " (comentariu)",
 354+"editconflict" => "Conflict de editare: $1",
 355+"explainconflict" => "Altcineva a modificat această pagină de când aţi început s-o editaţi.
 356+Caseta de text de sus conţine pagina aşa cum este ea acum (după editarea celeilalte persoane).
 357+Pagina cu modificările Dvs. (aşa cum aţi încercat s-o salvaţi) se află în caseta de jos.
 358+Va trebui să editaţi manual caseta de sus pentru a reflecta modificările pe care tocmai le-aţi făcut în cea de jos.
 359+<b>Numai</b> textul din caseta de sus va fi salvat atunci când veţi apăsa pe \"Salvează pagina\".\n<p>",
 360+"yourtext" => "Textul Dvs.",
 361+"storedversion" => "Versiunea curentă",
 362+"editingold" => "<strong>ATENŢIE! Editaţi o variantă mai veche a acestei pagini! Orice modificări care s-au făcut de la această versiune şi până la cea curentă se vor pierde!</strong>\n",
 363+"yourdiff" => "Diferenţe",
 364+"copyrightwarning" => "Reţineţi că toate contribuţiile la Wikipedia sunt considerate ca respectând licenţa GNU Free Documentation License
 365+(vezi $1 pentru detalii).
 366+Dacă nu doriţi ca ceea ce scrieţi să fie editat fără milă şi redistribuit în voie, atunci nu trimiteţi materialele respective aici.<br>
 367+De asemenea, trimiţând aceste materiale aici vă angajaţi că le-aţi scris Dvs. sau că sunt copiate dintr-o sursă care permite includerea materialelor sub această licenţă.
 368+<strong>NU TRIMITEŢI MATERIALE PROTEJATE DE DREPTURI DE AUTOR FĂRĂ PERMISIUNE!</strong>",
 369+"longpagewarning" => "ATENŢIE! Conţinutul acestei pagini are $1 KB; unele browsere au probleme la editarea paginilor în jur de 32 KB sau mai mari.
 370+Vă rugăm să luaţi în considerare posibilitatea de a împărţi pagina în mai multe secţiuni.",
 371+"readonlywarning" => "ATENŢIE! Baza de date a fost blocată pentru întreţinere,
 372+deci vă nu veţi putea salva editările în acest moment. Puteţi copia textul
 373+într-un fişier text local pentru a modifica conţinutul în Wikipedia când va fi posibil.",
 374+"protectedpagewarning" => "ATENŢIE! Această pagină a fost blocată şi numai utilizatorii
 375+cu privilegii de administrator o pot edita. Vă rugăm urmaţi sugestiile
 376+<a href='Wikipedia:Despre_pagini_protejate'>despre pagini protejate</a> când editaţi.",
 377+
 378+# History pages
 379+#
 380+"revhistory" => "Istoria versiunilor",
 381+"nohistory" => "Nu există istorie pentru această pagină.",
 382+"revnotfound" => "Versiunea nu a fost găsită",
 383+"revnotfoundtext" => "Versiunea mai veche a paginii pe care aţi cerut-o nu a fost găsită. Vă rugăm să verificaţi legătura pe care aţi folosit-o pentru a accesa această pagină.\n",
 384+"loadhist" => "Încarc istoria versiunilor",
 385+"currentrev" => "Versiunea curentă",
 386+"revisionasof" => "Versiunea de la data $1",
 387+"cur" => "actuală",
 388+"next" => "următoarea",
 389+"last" => "prec",
 390+"orig" => "orig",
 391+"histlegend" => "Legendă: (actuală) = diferenţe faţă de versiunea curentă,
 392+(prec) = diferenţe faţă de versiunea precedentă, M = editare minoră",
 393+
 394+# Diffs
 395+#
 396+"difference" => "(Diferenţa dintre versiuni)",
 397+"loadingrev" => "se încarcă diferenţa dintre versiuni",
 398+"lineno" => "Linia $1:",
 399+"editcurrent" => "Editarea versiunii curente a acestei pagini",
 400+
 401+# Search results
 402+#
 403+"searchresults" => "Rezultatele căutării",
 404+"searchhelppage" => "Wikipedia:Searching",
 405+"searchingwikipedia" => "Căutare în Wikipedia",
 406+"searchresulttext" => "Pentru mai multe detalii despre căutarea în Wikipedia, vezi $1.",
 407+"searchquery" => "Pentru căutarea \"$1\"",
 408+"badquery" => "Căutare invalidă",
 409+"badquerytext" => "Căutarea Dvs. nu a putut fi procesată.
 410+Asta se întâmplă probabil din cauză că aţi încercat să căutaţi un cuvânt cu mai puţin de trei litere.
 411+E posibil şi să fi scris greşit o expresie sau un nume, cum ar fi \"Mircea cel cel Bătrân\".
 412+Vă rugăm să încercaţi o altă căutare.",
 413+"matchtotals" => "Căutarea \"$1\" a produs $2 rezultate în titluri de articole şi $3 rezultate în texte de articole.",
 414+"nogomatch" => "Nici o pagină cu acest titlu nu a fost găsită, încercaţi să căutaţi textul şi în pagini. ",
 415+"titlematches" => "Rezultate în titluri de articole",
 416+"notitlematches" => "Nici un rezultat în titlurile articolelor",
 417+"textmatches" => "Rezultate în textele articolelor",
 418+"notextmatches" => "Nici un rezultat în textele articolelor",
 419+"prevn" => "anterioarele $1",
 420+"nextn" => "următoarele $1",
 421+"viewprevnext" => "Vezi ($1) ($2) ($3).",
 422+"showingresults" => "Mai jos apar <b>$1</b> rezultate începând cu numărul <b>$2</b>.",
 423+"showingresultsnum" => "Mai jos apar <b>$3</b> rezultate începând cu numărul <b>$2</b>.",
 424+"nonefound" => "<strong>Notă</strong>: căutările nereuşite sunt în general datorate căutării unor cuvinte prea comune care nu sunt indexate, sau cautărilor a mai multe cuvinte (numai articolele care conţin ''toate'' cuvintele specificate apar ca rezultate).",
 425+"powersearch" => "Caută",
 426+"powersearchtext" => "
 427+Caută în secţiunile:<br>
 428+$1<br>
 429+$2 Redirecţionări&nbsp; Căutări după $3 $9",
 430+"blanknamespace" => "(Principală)",
 431+
 432+
 433+# Preferences page
 434+#
 435+"preferences" => "Preferinţe",
 436+"prefsnologin" => "Neautentificat",
 437+"prefsnologintext" => "Trebuie să fiţi <a href=\"" .
 438+ wfLocalUrl( "Special:Userlogin" ) . "\">autentificat</a>
 439+pentru a vă putea salva preferinţele.",
 440+"prefslogintext" => "Sunteţi autentificat ca \"$1\".
 441+Numărul intern de identificare este $2 (nu trebuie să-l reţineţi decât dacă aveţi probleme).",
 442+"prefsreset" => "Preferinţele au fost resetate.",
 443+"qbsettings" => "Setări pentru quickbar",
 444+"changepassword" => "Schimbă parola",
 445+"skin" => "Aparenţă",
 446+
 447+"math" => "Apareţă formule",
 448+"dateformat" => "Formatul datelor",
 449+"math_failure" => "Nu s-a putut interpreta",
 450+"math_unknown_error" => "eroare necunoscută",
 451+"math_unknown_function" => "funcţie necunoscută ",
 452+"math_lexing_error" => "eroare lexicală",
 453+"math_syntax_error" => "eroare de sintaxă",
 454+"saveprefs" => "Salvează preferinţele",
 455+
 456+"resetprefs" => "Resetează preferinţele",
 457+"oldpassword" => "Parola veche",
 458+"newpassword" => "Parola nouă",
 459+"retypenew" => "Repetă parola nouă",
 460+"textboxsize" => "Dimensiunile casetei de text",
 461+"rows" => "Rânduri",
 462+"columns" => "Coloane",
 463+"searchresultshead" => "Setări de căutare",
 464+"resultsperpage" => "Numărul de rezultate per pagină",
 465+"contextlines" => "Numărul de linii per rezultat",
 466+"contextchars" => "Numărul de caractere per linie",
 467+"stubthreshold" => "Limita de caractere pentru un ciot",
 468+"recentchangescount" => "Numărul de articole pentru schimbări recente",
 469+"savedprefs" => "Preferinţele Dvs. au fost salvate.",
 470+"timezonetext" => "Introduceţi numărul de ore diferenţă între ora locală şi ora serverului (UTC, timp universal - pentru România, cifra este 3).",
 471+"localtime" => "Ora locală",
 472+"timezoneoffset" => "Diferenţa",
 473+"servertime" => "Ora serverului (UTC)",
 474+"guesstimezone" => "Încearcă determinarea automată a diferenţei",
 475+"emailflag" => "Dezactivează serviciul de e-mail de la alţi utilizatori",
 476+"defaultns" => "Caută în aceste secţiuni implicit:",
 477+
 478+# Recent changes
 479+#
 480+"changes" => "schimbări",
 481+"recentchanges" => "Schimbări recente",
 482+"recentchangestext" => "Aceată pagină permite vizualizarea ultimelor modificări ale paginilor Wikipedia în română.
 483+
 484+[[Wikipedia:bun venit|Bun venit pe Wikipedia]]! Nu ezitaţi să vizitaţi secţiunile de [[Wikipedia:întrebări frecvente|întrebări frecvente]], [[Wikipedia:politica|politica Wikipedia]] (în special [[Wikipedia:convenţii pentru denumiri|convenţii pentru denumiri]] şi [[Wikipedia:punct de vedere neutru|punct de vedere neutru]]), şi cele mai comune [[Wikipedia:greşeli frecvente|greşeli în Wikipedia]].
 485+
 486+Este foarte important să nu adăugaţi în Wikipedia materiale protejate de [[drepturi de autor]]. Problemele legale rezultate ar putea prejudicia în mod serios proiectul în întregime, aşa că vă rugăm insistent să aveţi grijă să nu faceţi asta.",
 487+"rcloaderr" => "Încarc ultimele modificări",
 488+"rcnote" => "Dedesubt găsiţi ultimele <strong>$1</strong> modificări din ultimele <strong>$2</strong> zile.",
 489+"rcnotefrom" => "Dedesubt sunt modificările de la <b>$2</b> (maxim <b>$1</b> de modificări sunt afişate - schimbaţi numărul maxim de linii alegând altă valoare mai jos).",
 490+"rclistfrom" => "Arată modificările începând de la $1",
 491+# "rclinks" => "Arată ultimele $1 modificări din ultimele $2 ore / ultimele $3 zile",
 492+"rclinks" => "Arată ultimele $1 modificări din ultimele $2 zile.",
 493+
 494+"rchide" => "în in $4 form; $1 minor edits; $2 secondary namespaces; $3 multiple edits.",
 495+"rcliu" => "; $1 editări operate de utilizatori autentificaţi",
 496+"diff" => "diferenţă",
 497+"hist" => "istorie",
 498+"hide" => "ascunde",
 499+"show" => "arată",
 500+"tableform" => "tabel",
 501+"listform" => "listă",
 502+"nchanges" => "$1 modificări",
 503+"minoreditletter" => "M",
 504+"newpageletter" => "N",
 505+
 506+# Upload
 507+#
 508+"upload" => "Trimite fişier",
 509+"uploadbtn" => "Trimite fişier",
 510+"uploadlink" => "Trimite imagine",
 511+"reupload" => "Re-trimite",
 512+"reuploaddesc" => "Întoarcere la formularul de trimitere.",
 513+"uploadnologin" => "Nu sunteţi autentificat",
 514+"uploadnologintext" => "Trebuie să foţi <a href=\"" .
 515+ wfLocalUrl( "Special:Userlogin" ) . "\">autentificat</a>
 516+ca să trimiteţi fişiere.",
 517+"uploadfile" => "Trimite fişier",
 518+"uploaderror" => "Eroare la trimitere fişier",
 519+"uploadtext" => "<strong>STOP!</strong> Înainte de a trimite un fişier aici,
 520+vă rugăm să citiţi şi să respectaţi <a href=\"" .
 521+wfLocalUrlE("Wikipedia:Politica_de_utilizare_a_imaginilor" ) . "\">politica de utilizare a imaginilor</a>.
 522+<p>Pentru a vizualiza sau căuta imagini deja trimise, mergeţi la <a href=\"" . wfLocalUrlE( "Special:Imagelist" ) .
 523+"\">lista de imagini</a>.
 524+Fişierele noi şi cele şterse sunt contorizate pe paginile de <a href=\"" .
 525+wfLocalUrlE( "Wikipedia:Upload_log" ) . "\">raport de trimiteri</a>.
 526+<p>Folosiţi formularul de mai jos pentru a trimite imagini noi
 527+pe care le veţi putea folosi pentru a vă ilustra articolele.
 528+În majoritatea browserelor veţi vedea un buton \"Browse...\"
 529+care vă va deschide fereastra standard dialog a sistemului Dvs. de operare
 530+pentru alegerea de fişiere.
 531+Când alegeţi un fişier în acest fel, caseta de dialog se va completa cu calea locală către acesta.
 532+Este de asemenea necesar să bifaţi căsuţa asociată textului
 533+în care confirmaţi că nu violaţi nici un drept de autor trimiţând această imagine.
 534+În final, apăsaţi pe butonul \"Trimite\" petru a trimite efectiv fişierul.
 535+Această operaţiune poate dura, mai ales dacă aveţi o legătură lentă la Internet.
 536+<p>Formatele preferate sunt JPEG pentru imagini fotografice,
 537+PNG pentru desene şi alte imagini cu contururi clare şi OGG pentru fişiere de sunet.
 538+
 539+Vă rugăm să folosiţi nume explicite pentru fişiere ca să evitaţi confuziile.
 540+Pentru a include o imagine într-un articol, folosiţi o legătură de forma <b>[[image:fişier.jpg]]</b> sau <b>[[image:fişier.png|text alternativ]]</b>
 541+sau <b>[[media:fişier.ogg]]</b> pentru fişiere de sunet.
 542+<p>Vă rugăm să reţineţi că, la fel ca şi în cazul celorlalte secţiuni din Wikipedia, alte persoane pot edita sau şterge fişierele pe care le trimiteţi dacă e în interesul enciclopediei, şi vi se poate chiar bloca accesul la trimiterea de fişiere dacă abuzaţi de sistem.",
 543+"uploadlog" => "raport de trimitere fişiere",
 544+"uploadlogpage" => "Raport de trimitere fişiere",
 545+"uploadlogpagetext" => "Găsiţi mai jos lista ultimelor fişiere trimise.
 546+Toate datele/orele sunt afişate ca timp universal (UTC).
 547+<ul>
 548+</ul>
 549+",
 550+"filename" => "Nume fişier",
 551+"filedesc" => "Sumar",
 552+"affirmation" => "Afirm că persoana care deţine drepturile de autor asupra acestui fişier este de acord cu termenii licenţei $1.",
 553+"copyrightpage" => "Wikipedia:Drepturi_de_autor",
 554+"copyrightpagename" => "Drepturi de autor în Wikipedia",
 555+"uploadedfiles" => "Fişiere trimise",
 556+"noaffirmation" => "Trebuie să afirmaţi că fişierul pe care în trimiteţi nu violează drepturi de autor (trebuie să bifaţi căsuţa aferentă de pe pagina anterioară).",
 557+"ignorewarning" => "Ignoră atenţionarea şi salvează.",
 558+"minlength" => "Numele imaginilor trebuie să aibă cel puţin trei litere.",
 559+"badfilename" => "Numele imaginii a fost schimbat; noul nume este \"$1\".",
 560+"badfiletype" => "\".$1\" nu este un format recomandat pentru imagini.",
 561+"largefile" => "Este recomandat ca imaginile să nu depăşească 100 KB ca mărime.",
 562+"successfulupload" => "Fişierul a fost trimis",
 563+"fileuploaded" => "Fişierul \"$1\" a fost trimis.
 564+Vă rugăm să vizitaţi această legătură: ($2) pentru a descrie fişierul şi pentru a completa informaţii despre acesta, ca de exemplu de unde provine, când a fost creat şi de către cine şi orice alte informaţii doriţi să adăugaţi.",
 565+"uploadwarning" => "Avertizare la trimiterea fişierului",
 566+"savefile" => "Salvează fiţierul",
 567+"uploadedimage" => "trimis \"$1\"",
 568+
 569+# Image list
 570+#
 571+"imagelist" => "Lista imaginilor",
 572+"imagelisttext" => "Dedesubt găsiţi lista a $1 imagini ordonate $2.",
 573+"getimagelist" => "încarc lista de imagini",
 574+"ilshowmatch" => "Arată imaginile ale căror nume includ",
 575+"ilsubmit" => "Caută",
 576+"showlast" => "Arată ultimele $1 imagini ordonate $2.",
 577+"all" => "toate",
 578+"byname" => "după nume",
 579+"bydate" => "după dată",
 580+"bysize" => "după mărime",
 581+"imgdelete" => "şterge",
 582+"imgdesc" => "desc",
 583+"imglegend" => "Legendă: (desc) = arată/editează descrierea imaginii.",
 584+"imghistory" => "Istoria imaginii",
 585+"revertimg" => "rev",
 586+"deleteimg" => "şterg",
 587+"imghistlegend" => "Legend: (actuală) = versiunea curentă a imaginii, (şterg) = şterge această versiune veche, (rev) = revino la această versiune veche.
 588+<br><i>Apăsaţi pe dată pentru a vedea versiunea trimisă la data respectivă</i>.",
 589+"imagelinks" => "Legăturile imaginii",
 590+"linkstoimage" => "Următoarele pagini leagă la această imagine:",
 591+"nolinkstoimage" => "Nici o pagină nu se leagă la această imagine.",
 592+
 593+# Statistics
 594+#
 595+"statistics" => "Statistici",
 596+"sitestats" => "Statisticile sitului",
 597+"userstats" => "Statistici legate de utilizatori",
 598+"sitestatstext" => "Există un număr total de <b>$1</b> pagini în baza de date.
 599+Acest număr include paginile de \"discuţii\", paginile despre Wikipedia, pagini minimale (\"cioturi\"), pagini de redirecţionare şi altele care probabil că nu intră de fapt în categoria articolelor reale.
 600+În afară de acestea, există <b>$2</b> pagini care sunt probabil articole (numărate automat, în funcţie strict de mărime).<p>
 601+În total au fost <b>$3</b> vizite (accesări) şi <b>$4</b> editări
 602+de la ultima actualizare a programului (July 20, 2002).
 603+În medie rezultă <b>$5</b> editări la fiecare vizionare sau <b>$6</b> vizualizări la fiecare editare.",
 604+"userstatstext" => "Există un număr de <b>$1</b> utilizatori înregistraţi.
 605+Dintre aceştia <b>$2</b> sunt administratori (vezi $3).",
 606+
 607+# Maintenance Page
 608+#
 609+"maintenance" => "Pagina administrativă",
 610+"maintnancepagetext" => "Această pagină conţine diverse unelte create pentru administrare cotidiană. Unele dintre acestea solicită în mod deosebit baza de date, aşa că vă rugăm să evitaţi suprasolicitarea lor.",
 611+"maintenancebacklink" => "Înapoi la pagina administrativă",
 612+"disambiguations" => "Pagini de dezambiguizare",
 613+"disambiguationspage" => "Wikipedia:Legături_către_paginile_de_dezambiguizare",
 614+"disambiguationstext" => "Următoarele articole conţin legături către cel puţin o <i>pagină de dezambiguizare</i>. Legăturile respective ar trebui făcute către paginile specifice.<br>O pagină este considerată ca fiind de dezambiguizare dacă există o legătură în ea dinspre $1.<br>Legăturile dinspre alte secţiuni Wikipedia <i>nu sunt</i> luate în considerare aici.",
 615+"doubleredirects" => "Redirectări duble",
 616+"doubleredirectstext" => "<b>Atenţie:</b> Această listă poate conţine articole care nu sunt în fapt duble redirectări. Asta înseamnă de obicei că există text adiţional sub primul #REDIRECT.<br>\nFiecare rând care conţine legături către prima sau a doua redirectare, ca şi prima linie din textul celei de-a doua redirectări, de obicei conţinând numele \"real\" al articolului ţintă, către care ar trebui să arate prima redirectare.",
 617+"brokenredirects" => "Redirectări greşite",
 618+"brokenredirectstext" => "Următoarele redirectări arată către articole inexistente.",
 619+"selflinks" => "Pagini cu legături ciclice",
 620+"selflinkstext" => "Următoarele pagini conţin legături către ele însele, ceea ce n-ar trebui să se întâmple.",
 621+"mispeelings" => "Pagini conţinând greşeli comune",
 622+"mispeelingstext" => "Următoarele pagini conţin unele dintre greşelile obişnuite de scriere care apar la $1. Forma corectă poate fi dată (în acest fel).",
 623+"mispeelingspage" => "Lista de greţeli comune",
 624+"missinglanguagelinks" => "Legături care inexistente către alte limbi",
 625+"missinglanguagelinksbutton" => "Caută limbi inexistente pentru",
 626+"missinglanguagelinkstext" => "Aceste articole nu se leagă către perechile lor din $1. Redirectările şi sub-paginile <i>nu apar</i> aici.",
 627+
 628+
 629+# Miscellaneous special pages
 630+#
 631+"orphans" => "Pagini orfane",
 632+"lonelypages" => "Pagini orfane",
 633+"unusedimages" => "Pagini neutilizate",
 634+"popularpages" => "Pagini populare",
 635+"nviews" => "$1 accesări",
 636+"wantedpages" => "Pagini dorite",
 637+"nlinks" => "$1 legături",
 638+"allpages" => "Toate paginile",
 639+"randompage" => "Pagină aleatoare",
 640+"shortpages" => "Pagini scurte",
 641+"longpages" => "Pagini lungi",
 642+"listusers" => "Lista de utilizatori",
 643+"specialpages" => "Pagini speciale",
 644+"spheading" => "Pagini speciale",
 645+"sysopspheading" => "Pegini speciale pentru operatori",
 646+"developerspheading" => "Pagini speciale pentru dezvoltatori",
 647+"protectpage" => "Protejează pagina",
 648+"recentchangeslinked" => "Modificări corelate",
 649+"rclsub" => "(cu pagini legate de la \"$1\")",
 650+"debug" => "Debug",
 651+"newpages" => "Pagini noi",
 652+"ancientpages" => "Cele mai vechi articole",
 653+"intl" => "Legături între limbi",
 654+"movethispage" => "Mută această pagină",
 655+"unusedimagestext" => "<p>Vă rugăm să ţineţi cont de faptul că alte situri, inclusiv Wikipedii în alte limbi pot să aibă legături aici fără ca aceste pagini să fie listate aici - această listă se referă strict la Wikipedia în română.",
 656+"booksources" => "Surse de cărţi",
 657+"booksourcetext" => "Dedesubt găsiţi o listă de surse de cărţi noi şi vechi, şi e posibil să găsiţi şi informaţii adiţionale legate de titlurile pe care le căutaţi.
 658+Wikipedia nu este afiliată niciuneia dintre aceste afaceri,
 659+iar lista de mai jos nu constituie nici un fel de garanţie sau validare a serviciilor respective din partea Wikipedia.",
 660+"alphaindexline" => "$1 către $2",
 661+
 662+# Email this user
 663+#
 664+"mailnologin" => "Nu există adresă de trimitere",
 665+"mailnologintext" => "Trebuie să fiţi <a href=\"" .
 666+ wfLocalUrl( "Special:Userlogin" ) . "\">autentificat</a>
 667+şi să aveţi o adresă validă de mail în <a href=\"" .
 668+ wfLocalUrl( "Special:Preferences" ) . "\">preferinţe</a>
 669+pentru a trimite mail altor utilizatori.",
 670+"emailuser" => "Trimite e-mail acestui utilizator",
 671+"emailpage" => "E-mail către utilizator",
 672+"emailpagetext" => "Dacă acest utilizator a introdus o adresă de mail validă în pagina de preferinţe atunci formularul de mai jos poate fi folosit pentru a-i trimte un mesaj prin e-mail.
 673+Adresa pe care aţi introdus-o în pagina Dvs. de preferinţe va apărea ca adresa
 674+de origine a mesajului, astfel încât destinatarul să vă poată răspunde direct.",
 675+"noemailtitle" => "Fără adresă de e-mail",
 676+"noemailtext" => "Utilizatorul nu a specificat o adresă validă de e-mail,
 677+sau a ales să nu primească e-mail de la alţi utilizatori.",
 678+"emailfrom" => "De la",
 679+"emailto" => "Către",
 680+"emailsubject" => "Subiect",
 681+"emailmessage" => "Mesaj",
 682+"emailsend" => "Trimite",
 683+"emailsent" => "E-mail trimis",
 684+"emailsenttext" => "E-mailul Dvs. a fost trimis.",
 685+
 686+# Watchlist
 687+#
 688+"watchlist" => "Articole urmărite",
 689+"watchlistsub" => "(pentru utilizatorul \"$1\")",
 690+"nowatchlist" => "Nu aţi ales să urmăriţi nici un articol.",
 691+"watchnologin" => "Nu sunteţi autentificat",
 692+"watchnologintext" => "Trebuie să fiţi <a href=\"" .
 693+ wfLocalUrl( "Special:Userlogin" ) . "\">autentificat</a>
 694+pentru a vă modifica lista de articole urmărite.",
 695+"addedwatch" => "Adăugată la lista de pagini urmărite",
 696+"addedwatchtext" => "Pagina \"$1\" a fost adăugată la lista Dvs. de <a href=\"" . wfLocalUrl( "Special:Watchlist" ) . "\">articole urmărite</a>.
 697+Modificările viitoare ale acestei pagini şi a paginii asociate de discuţii
 698+vor fi listate aici, şi în plus ele vor apărea cu <b>caractere îngroşate</b> în pagina de <a href=\"" .
 699+ wfLocalUrl( "Special:Recentchanges" ) . "\">modificări recente</a> pentru evidenţiere.</p>
 700+
 701+<p>Dacă doriţi să eliminaţi această pagină din lista Dvs. de pagini urmărite
 702+în viitor, apăsaţi pe \"Nu mai urmări\" în bara de comenzi în timp ce această pagină este vizibilă.",
 703+"removedwatch" => "Ştearsă din lista de pagini urmărite",
 704+"removedwatchtext" => "Pagina \"$1\" a fost eliminată din lista de pagini urmărite.",
 705+"watchthispage" => "Urmăreşte pagina",
 706+"unwatchthispage" => "Nu mai urmări",
 707+"notanarticle" => "Nu este un articol",
 708+"watchnochange" => "Nici unul dintre articolele pe care le urmăriţi nu a fost modificat în perioada de timp afişată.",
 709+"watchdetails" => "($1 pagini urmărite în afară de paginile de discuţie;
 710+$2 pagini editate în total;
 711+$3...
 712+<a href='$4'>lista completă</a>.)",
 713+"watchmethod-recent" => "căutarea schimbărilor recente pentru paginile urmărite",
 714+"watchmethod-list" => "căutarea paginilor urmărite pentru schimbări recente",
 715+"removechecked" => "Elimină elementele bifate din lista de pagini urmărite",
 716+"watchlistcontains" => "Lista de articole urmărite conţine $1 pagini",
 717+"watcheditlist" => "Aceasta este lista alfabetică a tuturor paginilor pe care le urmăriţi.
 718+Bifaţi căsuţele corespunzătoare paginilor pe care doriţi să le eliminaţi din lista de
 719+pagini urmărite şi apăsaţi pe butonul corespunzător din partea de jos a paginii.",
 720+"removingchecked" => "Se elimină elementele cerute din lista de articole urmărite...",
 721+"couldntremove" => "Elementul '$1' nu a putut fi şters...",
 722+"iteminvalidname" => "E o problemă cu elementul '$1', numele este invalid...",
 723+"wlnote" => "Dedesubt găsiţi ultimele $1 schimbări din ultimele <b>$2</b> ore.",
 724+
 725+# Delete/protect/revert
 726+#
 727+"deletepage" => "Şterge pagina",
 728+"confirm" => "Confirmă",
 729+"excontent" => "conţinutul era:",
 730+"exbeforeblank" => "conţinutul înainte de golire era:",
 731+"exblank" => "pagina era goală",
 732+"confirmdelete" => "Confirmă ştergere",
 733+"deletesub" => "(Şterg \"$1\")",
 734+"confirmdeletetext" => "Sunteţi pe cale să ştergeţi permanent o pagină
 735+sau imagine din baza de date, împreună cu istoria asociată.
 736+Vă rugăm să vă confirmaţi intenţia de a face asta, faptul că
 737+înţelegeţi consecinţele acestei acţiuni şi faptul că o faceţi
 738+în conformitate cu [[Wikipedia:Politica]].",
 739+"confirmcheck" => "Da, chiar vreau să şterg.",
 740+"actioncomplete" => "Acţiune finalizată",
 741+"deletedtext" => "\"$1\" a fost ştearsă.
 742+Vezi $2 pentru o listă a elementelor şterse recent.",
 743+"deletedarticle" => "\"$1\" a fost şters",
 744+"dellogpage" => "Raport_ştergeri",
 745+"dellogpagetext" => "Găsiţi dedesubt o listă a celor mai recente elemente şterse. Toate datele/orele sunt listate în timp universal (UTC).
 746+<ul>
 747+</ul>
 748+",
 749+"deletionlog" => "raport de ştergeri",
 750+"reverted" => "Revenit la o versiune mai veche",
 751+"deletecomment" => "Motiv pentru ştergere",
 752+"imagereverted" => "S-a revenit la o versiune veche.",
 753+"rollback" => "Editări de revenire",
 754+"rollbacklink" => "revenire",
 755+"rollbackfailed" => "Revenirea nu s-a putut face",
 756+"cantrollback" => "Nu se poate reveni; ultimul contribuitor este autorul acestui articol.",
 757+"alreadyrolled" => "Nu se poate reveni peste ultima editare a [[$1]]
 758+făcută de către [[Utilizator:$2|$2]] ([[Discuţie utilizator:$2|Discuţie]]); altcineva a editat articolul sau a revenit deja.
 759+
 760+Ultima editare a fost făcută de către [[Utilizator:$3|$3]] ([[Discuţie utilizator:$3|Discuţie]]).",
 761+# only shown if there is an edit comment
 762+"editcomment" => "Comentariul de editare a fost: \"<i>$1</i>\".",
 763+"revertpage" => "Revenit la ultima editare de către $1",
 764+"historywarning" => "Atenţie! Pagina pe care o ştergeţi are istorie: ",
 765+
 766+# Undelete
 767+"undelete" => "Recuperează pagina ştearsă",
 768+"undeletepage" => "Vizualizează şi recuperează pagini şterse",
 769+"undeletepagetext" => "Următoarele pagini au fost şterse dar încă se află în
 770+arhivă şi pot fi recuperate. Reţineţi că arhiva se poate şterge din timp în timp.",
 771+"undeletearticle" => "Recuperează articol şters",
 772+"undeleterevisions" => "$1 versiuni arhivate",
 773+"undeletehistory" => "Dacă recuperaţi pagina, toate versiunile asociate
 774+vor fi adăugate retroactiv în istorie. Dacă o pagină nouă cu acelaşi nume
 775+a fost creată de la momentul ştergerii acesteia, versiunile recuperate
 776+vor apărea în istoria paginii, iar versiunea curentă a paginii nu va
 777+fi înlocuită automat de către versiunea recuperată.",
 778+"undeleterevision" => "Versiunea ştearsă la $1",
 779+"undeletebtn" => "Recuperează!",
 780+"undeletedarticle" => "\"$1\" a fost recuperat",
 781+"undeletedtext" => "Articolul [[$1]] a fost recuperat.
 782+Vezi [[Wikipedia:Raport_ştergeri]] pentru o listă a ştergerilor şi recuperărilor recente.",
 783+
 784+# Contributions
 785+#
 786+"contributions" => "Contribuţii ale utilizatorului",
 787+"mycontris" => "Contribuţiile mele",
 788+"contribsub" => "Pentru $1",
 789+"nocontribs" => "Nu a fost găsită nici o modificare să satisfacă acest criteriu.",
 790+"ucnote" => "Găsiţi dedesubt ultimele <b>$1</b> modificări ale utilizatorului din ultimele <b>$2</b> zile.",
 791+"uclinks" => "Vezi ultimele $1 modificări; vezi ultimele $2 zile.",
 792+"uctop" => " (sus)" ,
 793+
 794+# What links here
 795+#
 796+"whatlinkshere" => "Ce se leagă aici",
 797+"notargettitle" => "Lipsă ţintă",
 798+"notargettext" => "Nu aţi specificat nici un pagină sau utilizator ţintă pentru care să se efectueze această funcţie.",
 799+"linklistsub" => "(Lista de legături)",
 800+"linkshere" => "Următoarele pagini conţin legături către aceasta:",
 801+"nolinkshere" => "Nici o pagină nu se leagă aici.",
 802+"isredirect" => "pagină de redirectare",
 803+
 804+# Block/unblock IP
 805+#
 806+"blockip" => "Blocheză adresa IP",
 807+"blockiptext" => "Folosiţi chestionarul de mai jos pentru a bloca
 808+la scriere o adresă IP. Această funţie trebuie folosită numai pentru
 809+a preveni vandalismul conform [[Wikipedia:Politica|politicii Wikipedia]].
 810+Includeţi un motiv specific mai jos (de exemplu citând paginile care
 811+au fost vandalizate de acest utilizator).",
 812+"ipaddress" => "Adresa IP",
 813+"ipbreason" => "Motiv",
 814+"ipbsubmit" => "Blochează această adresă",
 815+"badipaddress" => "Adresa IP este invalidă.",
 816+"noblockreason" => "Trebuie să includeţi un motiv pentru blocare.",
 817+"blockipsuccesssub" => "Utilizatorul a fost blocat",
 818+"blockipsuccesstext" => "Adresa IP \"$1\" a fost blocată.
 819+<br>Vezi [[Special:Ipblocklist|lista de adrese IP blocate]] pentru a revizui adresele blocate.",
 820+"unblockip" => "Deblochează adresă IP",
 821+"unblockiptext" => "Folosiţi chestionarul de mai jos pentru a restaura
 822+drepturile de scriere pentru o adresă IP blocată anterior..",
 823+"ipusubmit" => "Deblochează adresa",
 824+"ipusuccess" => "Adresa IP \"$1\" a fost deblocată",
 825+"ipblocklist" => "Lista de adrese IP blocate",
 826+"blocklistline" => "$1, $2 a blocat $3",
 827+"blocklink" => "blochează",
 828+"unblocklink" => "deblochează",
 829+"contribslink" => "contribuţii",
 830+
 831+# Developer tools
 832+#
 833+"lockdb" => "Blochează baza de date",
 834+"unlockdb" => "Deblochează baza de date",
 835+"lockdbtext" => "Blocarea bazei de date va împiedica pe toţi utilizatorii
 836+să editeze pagini, să-şi schimbe preferinţele, să-şi editeze listele de
 837+pagini urmărite şi orice alte operaţiuni care ar necesita schimări
 838+în baza de date.
 839+Vă rugăm să confirmaţi că intenţionaţi acest lucru şi faptul că veţi debloca
 840+baza de date atunci când veţi încheia operaţiunile de întreţinere.",
 841+"unlockdbtext" => "Deblocarea bazei de date va permite tuturor utilizatorilor
 842+să editeze pagini, să-şi schimbe preferinţele, să-şi editeze listele de
 843+pagini urmărite şi orice alte operaţiuni care ar necesita schimări
 844+în baza de date.
 845+Vă rugăm să confirmaţi că intenţionaţi acest lucru.",
 846+"lockconfirm" => "Da, chiar vreau să blochez baza de date.",
 847+"unlockconfirm" => "Da, chiar vreau să deblochez baza de date.",
 848+"lockbtn" => "Blochează naza de date",
 849+"unlockbtn" => "Deblochează baza de date",
 850+"locknoconfirm" => "Nu aţi confirmat căsuţa de confirmare.",
 851+"lockdbsuccesssub" => "Baza de date a fost blocată",
 852+"unlockdbsuccesssub" => "Baza de date a fost deblocată",
 853+"lockdbsuccesstext" => "Baza de date Wikipedia a fost blocată la scriere.
 854+<br>Nu uitaţi să o deblocaţi după ce terminaţi operaţiunile administrative pentru care aţi blocat-o.",
 855+"unlockdbsuccesstext" => "Baza de date Wikipedia a fost deblocată.",
 856+
 857+# SQL query
 858+#
 859+"asksql" => "Query SQL",
 860+"asksqltext" => "Folosiţi chestionarul de mai jos pentru a efectua un query direct către baza de date Wikipedia (MySQL).
 861+Folosiţi apostrofuri ('în felul acesta') pentru a delimita şiruri de text.
 862+Această funcţionalitate poate solicita în mod deosebit server-ul,
 863+aşa că vă rugăm să nu o folosiţi în exces.",
 864+"sqlislogged" => "Vă rugăm reţineţi că toate query-urile sunt reţinute în server (logged).",
 865+"sqlquery" => "Introduceţi query",
 866+"querybtn" => "Trimiteţi query",
 867+"selectonly" => "Alte query-uri în afară de \"SELECT\" sunt accesibile numai pentru dezvoltatorii Wikipedia.",
 868+"querysuccessful" => "Query efectuat",
 869+
 870+# Move page
 871+#
 872+"movepage" => "Mută pagina",
 873+"movepagetext" => "Puteţi folosi formularul de mai jos pentru a redenumi
 874+o pagină, mutându-i toată istoria sub noul nume.
 875+Pagina veche va deveni o pagină de redirectare către pagina nouă.
 876+Legăturile către pagina veche nu vor fi redirectate către cea nouă;
 877+aveţi grijă să [[Special:Maintenance|verificaţi]] dacă nu există redirectări duble sau invalide.
 878+
 879+Vă rugăm să reţineţi că Dvs. sunteţi responsabil(ă) pentru a face legăturile vechi să rămână valide.
 880+
 881+Reţineţi că pagina '''nu va fi mutată''' dacă există deja o
 882+pagină cu noul titlu, afară de cazul că este complet goală sau este
 883+o redirectare şi în plus nu are nici o istorie de editare.
 884+Cu alte cuvinte, veţi putea muta înapoi o pagină pe care aţi mutat-o
 885+greşit, dar nu veţi putea suprascrie o pagină validă existentă prin
 886+mutarea alteia.
 887+
 888+<b>ATENŢIE!</b>
 889+Aceasta poate fi o schimbare drastică şi neaşteptată pentru o pagină populară;
 890+vă rugăm să vă asiguraţi că înţelegeţi toate consecinţele înainte de a continua.",
 891+"movepagetalktext" => "Pagina asociată de discuţii, dacă există, va fi mutată
 892+automat odată cu aceasta '''afară de cazul că''':
 893+* Mutaţi pagina în altă secţiune a Wikipedia
 894+* Există deja o pagină de discuţii cu conţinut (care nu este goală), sau
 895+* Deifaţi căsuţa de mai jos.
 896+
 897+În oricare din cazurile de mai sus va trebui să mutaţi sau să unificaţi
 898+manual paginile de discuţii, dacă doriţi acest lucru.",
 899+"movearticle" => "Mută pagina",
 900+"movenologin" => "Nu sunteţi autentificat",
 901+"movenologintext" => "Trebuie să fiţi un utilizator înregistrat şi să vă <a href=\"" .
 902+ wfLocalUrl( "Special:Userlogin" ) . "\">autentificaţi</a>
 903+pentru a muta o pagină.",
 904+"newtitle" => "Titlul nou",
 905+"movepagebtn" => "Mută pagina",
 906+"pagemovedsub" => "Pagina a fost mutată",
 907+"pagemovedtext" => "Pagina \"[[$1]]\" a fost mutată la \"[[$2]]\".",
 908+"articleexists" => "O pagină cu acelaşi nume există deja,
 909+sau numele pe care l-aţi ales este invalid. Vă rugăm să alegeţi un alt nume.",
 910+"talkexists" => "Pagina în sine a fost mutată, dar pagina de discuţii
 911+nu a putut fi mutată deoarece deja există o alta cu acelaşi nume. Vă rugăm
 912+să unificaţi manual cele două pagini de discuţii.",
 913+"movedto" => "mutată la",
 914+"movetalk" => "Mută şi pagina de \"discuţii\" dacă se poate.",
 915+"talkpagemoved" => "Şi pagina de discuţii asociată a fost mutată.",
 916+"talkpagenotmoved" => "Pagina asociată de discuţii <strong>nu</strong> a fost mutată.",
 917+
 918+);
 919+
 920+class LanguageRo extends LanguageUtf8 {
 921+
 922+ function getBookstoreList () {
 923+ global $wgBookstoreListRo ;
 924+ return $wgBookstoreListRo ;
 925+ }
 926+
 927+ function getNamespaces() {
 928+ global $wgNamespaceNamesRo;
 929+ return $wgNamespaceNamesRo;
 930+ }
 931+
 932+ function getNsText( $index ) {
 933+ global $wgNamespaceNamesRo;
 934+ return $wgNamespaceNamesRo[$index];
 935+ }
 936+
 937+ function getNsIndex( $text ) {
 938+ global $wgNamespaceNamesRo;
 939+
 940+ foreach ( $wgNamespaceNamesRo as $i => $n ) {
 941+ if ( 0 == strcasecmp( $n, $text ) ) { return $i; }
 942+ }
 943+ return false;
 944+ }
 945+
 946+ function getQuickbarSettings() {
 947+ global $wgQuickbarSettingsRo;
 948+
 949+ return $wgQuickbarSettingsRo;
 950+ }
 951+
 952+ function getSkinNames() {
 953+ global $wgSkinNamesRo;
 954+ return $wgSkinNamesRo;
 955+ }
 956+
 957+ function getMathNames() {
 958+ global $wgMathNamesRo;
 959+ return $wgMathNamesRo;
 960+ }
 961+
 962+ function getDateFormats() {
 963+ global $wgDateFormatsRo;
 964+ return $wgDateFormatsRo;
 965+ }
 966+
 967+ function getUserToggles() {
 968+ global $wgUserTogglesRo;
 969+ return $wgUserTogglesRo;
 970+ }
 971+
 972+ function getMonthName( $key )
 973+ {
 974+ global $wgMonthNamesRo;
 975+ return $wgMonthNamesRo[$key-1];
 976+ }
 977+
 978+ function getMonthAbbreviation( $key )
 979+ {
 980+ global $wgMonthAbbreviationsRo;
 981+ return $wgMonthAbbreviationsRo[$key-1];
 982+ }
 983+
 984+ function getWeekdayName( $key )
 985+ {
 986+ global $wgWeekdayNamesRo;
 987+ return $wgWeekdayNamesRo[$key-1];
 988+ }
 989+
 990+ function timeanddate( $ts, $adj = false )
 991+ {
 992+ return $this->date( $ts, $adj ) . " " . $this->time( $ts, $adj );
 993+ }
 994+
 995+ function getValidSpecialPages()
 996+ {
 997+ global $wgValidSpecialPagesRo;
 998+ return $wgValidSpecialPagesRo;
 999+ }
 1000+
 1001+ function getSysopSpecialPages()
 1002+ {
 1003+ global $wgSysopSpecialPagesRo;
 1004+ return $wgSysopSpecialPagesRo;
 1005+ }
 1006+
 1007+ function getDeveloperSpecialPages()
 1008+ {
 1009+ global $wgDeveloperSpecialPagesRo;
 1010+ return $wgDeveloperSpecialPagesRo;
 1011+ }
 1012+
 1013+ function getMessage( $key )
 1014+ {
 1015+ global $wgAllMessagesRo;
 1016+ if($wgAllMessagesRo[$key])
 1017+ return $wgAllMessagesRo[$key];
 1018+ else
 1019+ return Language::getMessage( $key );
 1020+ }
 1021+
 1022+ function fallback8bitEncoding() {
 1023+ return "iso8859-2";
 1024+ }
 1025+}
 1026+
 1027+?>
\ No newline at end of file
Property changes on: branches/stable/phase3/languages/LanguageRo.php
___________________________________________________________________
Name: svn:eol-style
11028 + native
Name: svn:keywords
21029 + Author Date Id Revision

Status & tagging log